【網絡篇】TCP vs UDP底層區別+網絡編程概念

在這里插入圖片描述

大家好呀
我是浪前

今天講解的是網絡篇的第三章:網絡編程概念和TCP&UDP的區別

網絡編程概念+TCP和UDP的區別

    • 跨主機通信:
    • 網絡編程
      • 插座:
      • 網絡編程的本質:
    • 網絡編程的重要概念:
      • 客戶端和服務器:
    • 客戶端和服務器的交互模式
    • TCP 和UDP的區別

大家好呀,我們今天繼續來學習網絡篇

網絡篇的前兩篇博客主要是進行了網絡初識,主要介紹了網絡的基本概念和背景流程

接下來的章節會重點介紹網絡編程:

也就是去實際地編寫代碼,通過代碼來完成基于網絡的跨主機通信

跨主機通信:

實現跨主機通信有很多的方式,如下所示:

  1. TCP/IP網絡
  2. 藍牙通信
  3. 近場通信(NFC)
  4. 毫米波通信
  5. 等等

而TCP/IP網絡是我們日常編程中最容易涉及到的最通用的跨主機通信的方式
藍牙通信的方式特點:功耗低,待機時間長,效率也低
近場通信(NFC): 需要在現實中貼的很近才可以
毫米波通信: 功率較高,帶寬也高,抗干擾能力差

所以我們下面就直接來學習TCP/IP的跨主機通信方式吧~

網絡編程

網絡編程的定義就是:通過網絡,讓兩個主機之間能夠進行通信,基于這樣的通信來完成一定的功能

插座:

注意:需要一組插座才可以完成網絡編程:

插座的定義:

進行網絡編程的時候,需要操作系統提供一組API,通過這些API才能完成網絡編程
API就是應用層和傳輸層之間交互的路徑

這一組API就稱作“Socket API”,也就是叫做插座。

通過這一套Socket API 就可以解決不同主機之間,不同系統之間的網絡通信了

在傳輸層這一層里面提供的網絡協議,主要是TCP和UDP協議,
而TCP和UDP這兩個協議的工作原理和特性差別很大,導致使用了這兩個協議進行的網絡編程也存在一定的差別,所以系統就提供了兩套Socket API

TCP有一套Socket API ,UDP也有一套Socket API

網絡編程的本質:

網絡編程的本質就是學習傳輸層給應用層提供的API就可以寫網絡編程的代碼,通過代碼把數據交給傳輸層,進一步通過層層封裝,就可以把數據通過網卡發送出去了

我們要學習的不僅僅是API,也要學習網絡程序的基本工作流程

后端開發:就是服務器上的程序開發
而服務器就會涉及到大量的網絡通信
雖然實際開發中使用的是一些框架,比如Spring
不會直接用到系統原生的API,但是框架的背后,也是封裝了系統API來實現網絡通信的

只要我們掌握了這些基礎API,就可以更好地理解框架的工作流程,也可以擁有自己去實現框架/魔改框架的能力,然后搭配上數據結構和算法能力才是未來的核心競爭力,而不是學會了什么特別高大上的流行框架:

如下圖所示,一圖勝千言~

![[表情包.gif]]

網絡編程的重要概念:

客戶端和服務器:

客戶端 vs 服務器

客戶端的定義:

客戶端就是在網絡中,主動發起通信的一方,就是客戶端

服務器的定義:

服務器就是被動接受的一方

客戶端和服務器的角色不是固定不變的~

同一個程序在不同的場景中,可能是客戶端,也可能是服務器

舉一個大家都喜歡聽的例子:

在少男少女談戀愛的過程中:一般是男生追求女生,
但是如果一直是男生單方面努力,全靠男生主動,這個戀愛大概率不可能談成,男生要么追不上,要么即使最后費盡千辛萬苦才談上,但是這個感情也難以長久

那么戀愛的正確打開方式是什么呢?
在這里插入圖片描述

正常情況一般是男生主動了一段時間之后,女生也能夠主動,也就是女生也有積極的回應男生的追求,這樣后面感情才會長長久久

給大家支一個小妙招~
當你的女朋友給你發消息,說肚子疼,最近不舒服的時候,你千萬不要回復“多喝熱水/巖漿”這樣的廢話,記住這句話

Talk is cheaper, show me the action

你先不要急著回復消息,如果你們是同校,那么你立即去買好熱好紅糖水和布洛芬,然后走到她的宿舍樓下,叫她下來拿…

如果你們是異地,你可以立馬在美團買藥的購物車里面加滿布洛芬+紅糖水的商品,然后配送到她的地點,到了之后直接call她電話,告訴她去拿藥…

切實的行動勝過千言萬語~
好啦,今天的戀愛小課堂就結束啦,我們拉回正題

所以程序在網絡中的角色是可以發生改變的,主動的時候就是客戶端,被動的時候就是服務器

請求(request)

請求的定義:客戶端給服務器發送的數據稱為 “請求”

響應(response)

響應的定義:服務器給客戶端返回的數據稱為“響應”

客戶端和服務器的交互模式

客戶端和服務器一共有四種交互模式:

  1. 一問一答
  2. 一問多答
  3. 多問一答
  4. 多問多答

我們分別來介紹:

1: 一問一答:

一個請求對應一個響應,一對一

在后續的網站開發(web開發)中都是這種一問一答的交互形式
如下圖所示;
在這里插入圖片描述

2: 一問多答:

客戶端的一個請求對應了服務器的多個響應

使用場景: 適用于下載的場景,當你要下載一個大的文件時,此時客戶端發送這個下載任務請求的時候,服務器就分成了多個響應

3: 多問一答:

客戶端的多個請求只對應了一個服務器的響應
使用場景:上傳

4: 多問多答:

一個請求可能對應多個響應
一個響應也可能對應多個請求
這個場景主要涉及到“遠程控制/遠程桌面”
我們進行的鼠標鍵盤操作,都會作為一個個請求發送出去
我們看到的一個個畫面都對應了一個個響應

想要進行網絡編程,需要使用系統的API,這個API本質上是傳輸層提供的
傳輸層涉及到的協議主要有兩種: 一個是TCP 一個是UDP
由于這兩個協議之間的差異還是很大的,所以TCP和UDP的API各不相同
在這里插入圖片描述

TCP 和UDP的區別

TCP和UDP這兩種協議的特性(工作原理) 差異很大,導致使用這兩種協議進行網絡編程,也存在一定的差別,系統就分別提供了兩套API

TCP和UDP的區別:

  1. TCP是有連接的,UDP是無連接的
  2. TCP是可靠傳輸的,UDP是不可靠傳輸的
  3. TCP是面向字節流的,UDP是面向數據報的
  4. TCP和UDP都是全雙工的

TCP是有連接的,UDP是無連接的

這里的連接是抽象的概念:不是物理上的連接,而是彼此保留了對方的關鍵信息
計算機中這種抽象的連接是很常見的

此處的連接本質上就是建立連接的雙方,各自保存對方的信息,連接的特點是雙方都認同
只要通信的雙方都記錄了對方的關鍵信息,此時連接就建立好了

TCP要想通信必須先建立連接,即要先保留對方的關鍵信息,連接建立好了之后,才能進行后續的通信

但是:如果A想和B建立連接,但是B不愿意,那么連接就會失敗

連接的本質就是各自保存對方的相關信息

舉一個例子~

小坤同學給小紀同學打電話,小紀同學接通了,這個連接才成功,如果小紀同學沒有接,那么連接失敗

這個連接是如何實現的?
在客戶端中,有一些數據結構記錄了誰是小坤同學的服務器

在服務器中,有一些數據結構記錄了誰是小坤同學的客戶端

在這個數據結構中,可以保存很多的信息,所以一個客戶端可以保存很多的服務器,一個服務器也可以保存很多的客戶端

TCP是有連接的,UDP是無連接的

UDP不需要進行連接,UDP想要進行通信,就直接發送數據即可,不需要征得對方的同意,UDP自身也不會保存對方的信息
雖然UDP不知道對方的信息,但是寫程序的人得知道,UDP自己不會保存,但是程序員調用UDP的socket api的時候要把對方的位置作為參數給傳過去

TCP會先去保存對方的關鍵信息,然后再進行連接

UDP是不會去保存對方的信息,直接進行的通信

TCP是可靠傳輸,UDP是不可靠傳輸

在網絡上存在的“異常情況“非常多,無論使用什么樣的軟硬件技術手段,都沒有辦法100%保證網絡數據能夠從A一定傳輸到B

網絡上進行通信,A -> B 發送一個消息,這個消息也不可能做到百分之百送達的

再牛逼的技術也比不過挖掘機的一鏟子
無線通信技術的手段,當然很厲害,但是傳輸的效率也比不過有線的
無線受到環境干擾的因素更加多了

TCP的可靠傳輸是退而求其次,可靠傳輸不是100%送達,

而是如果A給B發送消息,消息是否會真的送達到B ,
A是知道的,即A會知道消息是發送失敗還是發送成功,
如果發送失敗,那么A就可以在發送失敗的時候采取一定的措施(嘗試重傳之類的)

所以可靠傳輸指的是: A在發送消息之后,A能夠知道是發送成功還是發送失敗

在TCP中就內置了可靠傳輸機制
在UDP中就沒有內置可靠傳輸機制

為什么UDP不內置這個可靠傳輸機制呢?
因為這個可靠傳輸雖然很好,但是也還是要付出代價的
可靠傳輸是要去付出代價來交換的
做任何事情都是要付出代價的

如果內置了可靠傳輸機制,那么會導致:

  1. 機制更加復雜
  2. 傳輸效率會降低

TCP內置了可靠傳輸機制之后,在發送數據之后可以知道是否發送成功

UDP沒有內置可靠傳輸機制,在發送數據之后不知道是否發送成功

TCP是面向字節流的,UDP是面向數據報的
此處的字節流和文件操作中的字節流是一個意思

TCP也是文件操作一樣,以字節為單位來進行傳輸的

UDP則是按照數據報為單位來進行傳輸的,每次傳輸的基本單位是一個數據報

這個數據報是由一系列的字節構成的特定的結構

UDP數據報是有一個嚴格的格式的,一次只能傳輸一個完整的數據報,不可以只傳輸半個數據報

網絡通信數據的基本單位,涉及到多種說法:

  1. 數據報(Datagram)
  2. 數據包(Packet)
  3. 數據幀(Frame)
  4. 數據段(Segment)

TCP和UDP都是全雙工的

什么是全雙工?

一個信道,允許雙向通信,就是全雙工
一個信道,只能單向通信,就是半雙工

代碼中使用一個Socket對象,就可以發送數據也能夠接收數據,這個就是全雙工

操作系統提供的網絡編程的API 叫做“socket api”,意為插頭,插座

相當于代碼中使用一個Socket對象,就可以發送數據也能夠接受數據:

一個網線里面是有8根線,這個8根線分為兩組,4個一組,每一組都可以完成一個完成的通信過程)
分為兩組就是為了防止萬一其中的一根線壞了,那么另一組也可以正常地工作

這個一組中的4根線,有的負責上傳,有的負責下載,這里的全雙工就是靠著多根線來完成的
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76537.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EMIF詳解

一、EMIF的基本定義 EMIF(External Memory Interface,外部存儲器接口) 是嵌入式處理器(如DSP、FPGA、SoC)用于連接外部存儲器的專用硬件接口模塊,負責管理處理器與存儲器之間的地址/數據總線、控制信號及時…

Keil MDK 編譯問題:function “HAL_IncTick“ declared implicitly

問題與處理策略 問題描述 ..\..\User\stm32f1xx_it.c(141): warning: #223-D: function "HAL_IncTick" declared implicitlyHAL_IncTick(); ..\..\User\stm32f1xx_it.c: 1 warning, 0 errors問題原因 在 stm32f1xx_it.c 文件中調用了 HAL_IncTick(),但…

Java Web項目(一)

框架 java web項目總工分為兩部分:客戶端(前端)和服務端(后端) 客戶端發起請求,服務端接受請求并進行處理 發起請求的方式:from表單、jQuery ajax from表單 造成全局的變化,在發…

Dify部署內網時遇到的代理問題及解決辦法

大家知道,在公網環境下利用docker安裝dify源碼鏡像比較容易,詳見我之前的文章,基于dify開發agent、workflow等非常方便,本次想著在內部網絡環境下也完成部署,以方便更多的人使用,但在部署到內網環境下&…

多節點監控的docker管理面板Portainer安裝指南:家庭云計算專家

背景 Portainer 是一個輕量級且功能強大的容器管理面板,專為 Docker 和 Kubernetes 環境設計。它通過直觀的 Web 界面簡化了容器的部署、管理和監控,即使是非技術用戶也能輕松上手。Portainer 支持多節點管理,允許用戶從一個中央控制臺管理多…

Linux內核哈希表學習筆記

前沿 近期項目中需要給自定義的驅動增加一個功能存儲相關的數據信息。結合實際業務層面,最終決定采用哈希表的結構來存儲。因為其具備快速查找,插入和刪除。其實現原理通過散列函數映射到指定位置。時間復雜度O(1).而且運算速度也快,很適合處理大量的數據場景。但是其也有一…

對于在線教育或知識付費類網站視頻處理方案

一、視頻格式: 1. 推薦格式:HLS(HTTP Live Streaming) 優勢?: ?自適應碼率?:根據用戶網絡狀況自動切換清晰度,避免卡頓。?廣泛兼容性?:iOS/macOS 原生支持,Android…

Deepseek輸出的內容如何直接轉化為word文件?

我們有時候會直接利用deepseek翻譯別人的文章或者想將deepseek輸出的內容直接復制到word文檔里。但是文本格式和word是不對應的。這時候需要輸入如下命令: 以上翻譯內容的格式和排版要求如下: 1、一級標題 字體為黑體(三號)&…

【Vue】組件通信(Props/Emit、EventBus、Provide/Inject)

個人主頁:Guiat 歸屬專欄:Vue 文章目錄 1. Props/Emit 父子組件通信1.1 Props 向下傳遞數據1.2 Emit 向上傳遞事件 2. EventBus 跨組件通信2.1 創建事件總線2.2 使用事件總線2.3 EventBus 優缺點 3. Provide/Inject 深層組件通信3.1 基本使用3.2 響應式處…

vulnhub sunset系列靶機合集(部分)

描述:該合集包含sunset系列適合新手的四個靶機(sunset:1、dusk、sunrise、noontide)的滲透全過程。 靶機下載地址:Vulnerable By Design - Search: sunset ~ VulnHubhttps://www.vulnhub.com/?qsunset sunset:1 滲透過程 信息…

【MySQL】MySQL的基礎語法及其語句的介紹

1、基礎語法 mysql -h【主機名】 -u【用戶名】 -p //登錄MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有數據庫 use 【數據庫名】; //進入數據庫 show tables; //查看數據庫下的所有表名 *MySQL的啟動和關閉 &am…

2025-4-20-C++ 學習 數組(1)

數組 2025-4-20-C++ 學習 數組(1)P1428 小魚比可愛題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1說明/提示題解代碼P1427 小魚的數字游戲題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1說明/提示數據規模與約定題解代碼P5727 【深基5.例3】冰雹猜想題目描…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之LCD)

目錄 ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之LCD)簡介模塊概述功能定義架構位置核心特性 LCD外設分析LCD外設概述LCD外設層次架構圖 LCD外設API和數據結構外設層API公共API內部數據結構 LCD外設配置選…

面試題:循環引用兩個節點相互引用,如何判斷哪個用 shared_ptr?哪個用 weak_ptr?

目錄 1.引言 2.原理 3.所有權模型與指針選擇 4.復雜場景的決策策略 5.注意事項 6.總結 1.引言 當兩個對象通過 shared_ptr 相互引用時,會產生循環引用問題,導致內存泄漏。因為這兩個對象的引用計數永遠不會變為 0,即使它們在程序的其他…

QT聊天項目DAY06

1.從git上同步項目 編譯測試,編譯通過 Post請求測試 測試成功 2. email is 打印有問題,檢查 解析結果是存儲在jsonResult中的,修改 3. 客戶端實現Post驗證碼請求 3.1 同步Qt客戶端項目 檢查QT版本,由于我在公司用的還是QT5.12.9…

PHP騰訊云人臉核身獲取FaceId

參考騰訊云官方文檔: 人臉核身 合作方后臺上傳身份信息_騰訊云 前提:已經獲取了SIGN Ticket。獲取參考文檔: PHP騰訊云人臉核身獲取SIGN Ticket-CSDN博客 public function getTxFaceId($uid,$name,$idNo){$appId ;$userId $uid;$nonce …

用 Deepseek 寫的uniapp油耗計算器

下面是一個基于 Uniapp 的油耗計算器實現&#xff0c;包含 Vue 組件和頁面代碼。 1. 創建頁面文件 在 pages 目錄下創建 fuel-calculator 頁面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…

Redis ④-通用命令

Redis 是一個 客戶端-服務器 結構的程序&#xff0c;這與 MySQL 是類似的&#xff0c;這點需要牢記&#xff01;&#xff01;&#xff01; Redis 固然好&#xff0c;但也不是任何場景都適合使用 Redis&#xff0c;一定要根據當前的業務需求來選擇是否使用 Redis Redis 通用命令…

HarmonyOs學習 環境配置后 實驗1:創建項目Hello World

HarmonyOS開發入門&#xff1a;環境配置與Hello World實驗 實驗目標 掌握HarmonyOS開發環境配置&#xff0c;創建首個HarmonyOS應用并實現"Hello World"界面展示 實驗準備 已安裝DevEco Studio開發環境已配置HarmonyOS開發依賴項熟悉基本TypeScript/ArkTS語法&am…

HTTP:十.cookie機制

Cookie概念及類型 HTTP cookie,簡稱cookie,又稱數碼存根、“網站/瀏覽+魔餅/魔片”等,是瀏覽網站時由網絡服務器創建并由網頁瀏覽器存放在用戶計算機或其他設備的小文本文件。Cookie使Web服務器能在用戶的設備存儲狀態信息(如添加到在線商店購物車中的商品)或跟蹤用戶…