計算機網(wǎng)絡篇——傳輸層

計算機網(wǎng)絡系列

上一篇文章中講到網(wǎng)絡層是負責把數(shù)據(jù)報準確的傳送到目的主機,但是僅僅傳輸?shù)侥康闹鳈C還不夠,因為一臺主機上會有多個應用,要想在應用間通信,還得加一個應用間的標識(端口號)。這個工作就是由傳輸層完成。傳輸層主要講兩個協(xié)議,即UDP和TCP。

UDP

UDP不提供復雜的控制機制,利用IP提供面向無連接的通信服務。并且它是將應用程序發(fā)來的數(shù)據(jù)在收到的那一刻,立即按照原樣發(fā)送到網(wǎng)絡上的一種機制。

由于UDP面向無連接,它可以隨時發(fā)送數(shù)據(jù)。再加上UDP的處理既簡單又高效。因此經(jīng)常用于以下幾個方面:

  • 包總量較少的通信(DNS、SNMP)
  • 視頻、音頻等多媒體通信(即時通信)
  • 限定于LAN等特定網(wǎng)絡中的應用通信
  • 廣播通信(廣播、多播)

UDP首部

UDP數(shù)據(jù)報格式

校驗和用來判斷數(shù)據(jù)在傳輸過程中是否損壞。計算這個校驗和的時候,不僅考慮源端口號和目標端口號,還要考慮 IP 首部中的源 IP 地址,目標 IP 地址和協(xié)議號(這些又稱為 UDP 偽首部)。這是因為以上五個要素用于識別通信時缺一不可,如果校驗和只考慮端口號,那么另外三個要素收到破壞時,應用就無法得知。這有可能導致不該收到包的應用收到了包,該收到包的應用反而沒有收到。由于UDP比較簡單,這里就不做過多的講解。

TCP

TCP與UDP的區(qū)別相當大。TCP是一種面向連接的協(xié)議,只有在確認通信對方存在時才會發(fā)送數(shù)據(jù)。它充分地實現(xiàn)了數(shù)據(jù)傳輸時各種控制功能,可以進行丟包時的重發(fā)控制,還可以對次序亂掉的分包進行順序控制。

所以根據(jù)TCP的這些機制,它可以提供可靠傳輸。

TCP建立連接的時候需要三次握手,斷開連接的時候需要四次揮手:

TCP的連接與斷開

在建立連接的同時,也可以確定發(fā)送數(shù)據(jù)包的單位,我們稱其為“最大消息長度”(MSS)。建立連接后,按照MSS的大小對數(shù)據(jù)進行分割發(fā)送。

序列號與確認應答提高可靠性

在TCP中,發(fā)送端以段為單位進行發(fā)送數(shù)據(jù),每一個段都有一個序列號,當發(fā)送端的數(shù)據(jù)到達接收主機時,接收端主機會返回一個確認應答(ACK)。

數(shù)據(jù)包丟失的情況
確認應答丟失的情況

數(shù)據(jù)丟失無非就是數(shù)據(jù)包丟失和確認應答丟失兩種情況,上圖都已經(jīng)解釋得很清楚。重傳超時時間(RTO)不是一個固定值,這個時間總是略大于連接往返時間(RTT,Round Trip Time)。這個設定可以這樣理解:“數(shù)據(jù)發(fā)送給對方,再返回到我這里,假設需要 10 秒,那我就等待 12秒,如果超過 12 秒,那估計就是回不來了?!?/p>

窗口控制

由于TCP以段位單位,每次發(fā)一個段進行一次確認應答的處理,這樣的效率太低了。所以就引入了窗口這個概念。

滑動窗口

窗口大小指無需等待確認應答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值。上圖的窗口大小為4個段。使用窗口后,它無需等待確認應答就可以繼續(xù)發(fā)送數(shù)據(jù)包的最大數(shù)量。

窗口控制

通過窗口控制,使用了大量緩沖區(qū),實現(xiàn)了對多個段同時進行確認應答的功能。這樣就大大提升了性能。引入窗口的概念后,被發(fā)送的數(shù)據(jù)不能立刻丟棄,需要緩存起來以備將來需要重發(fā)。

高速重發(fā)控制

如果發(fā)送的數(shù)據(jù)丟失,發(fā)送端會一直收到相應的數(shù)據(jù)的序號的確認應答。發(fā)送端如果連續(xù)3次收到同一個確認應答,就會將其對應的數(shù)據(jù)進行重發(fā)。

如果是確認應答丟失,可以通過下一個確認應答進行確認。因為每一個確認都表示

沒有確認應答也不受影響

擁塞控制

有了TCP窗口后,收發(fā)主機之間即時不再以一個數(shù)據(jù)段為單位發(fā)送確認應答,也能連續(xù)發(fā)送大量數(shù)據(jù)包。然而,如果在通信剛開始時就發(fā)送大量數(shù)據(jù),有可能引發(fā)網(wǎng)絡擁堵等一些其他問題。因此,TCP采用了慢啟動機制。

慢啟動

慢啟動的過程如下:

  1. 通信開始時,發(fā)送方的擁塞窗口大小為 1。每收到一個 ACK 確認后,擁塞窗口翻倍。
  2. 由于指數(shù)級增長非???,很快地,就會出現(xiàn)確認包超時。
  3. 此時設置一個“慢啟動閾值”,它的值是當前擁塞窗口大小的一半。
  4. 同時將擁塞窗口大小設置為 1,重新進入慢啟動過程。
  5. 由于現(xiàn)在“慢啟動閾值”已經(jīng)存在,當擁塞窗口大小達到閾值時,不再翻倍,6. 而是線性增加。
  6. 隨著窗口大小不斷增加,可能收到三次重復確認應答,進入“快速重發(fā)”階段。
  7. 這時候,TCP 將“慢啟動閾值”設置為當前擁塞窗口大小的一半,再將擁塞窗口大小設置成閾值大?。ㄒ灿姓f加 3)。
  8. 擁塞窗口又會線性增加,直至下一次出現(xiàn)三次重復確認應答或超時。
慢啟動的過程

TCP首部

TCP首部

看完前面的介紹其實這些字段的意義大家可能也理解得差不多了,我就簡單的說一個關(guān)鍵字段吧:

  • 序列號:它表示發(fā)送數(shù)據(jù)的位置,假設當前的序列號為 s,發(fā)送數(shù)據(jù)長度為 l,則下次發(fā)送數(shù)據(jù)時的序列號為 s + l。在建立連接時通常由計算機生成一個隨機數(shù)作為序列號的初始值。
  • 確認應答號:它等于下一次應該接收到的數(shù)據(jù)的序列號。假設發(fā)送端的序列號為 s,發(fā)送數(shù)據(jù)的長度為 l,那么接收端返回的確認應答號也是 s + l。發(fā)送端接收到這個確認應答后,可以認為這個位置以前所有的數(shù)據(jù)都已被正常接收。
  • 數(shù)據(jù)偏移:TCP 首部的長度,單位為 4 字節(jié)。如果沒有可選字段,那么這里的值就是 5。表示 TCP 首部的長度為 20 字節(jié)。
  • 控制位:該字段長度為 8 比特,分別有 8 個控制標志。依次是 CWR,ECE,URG,ACK,PSH,RST,SYN 和 FIN。
  • 窗口大?。河糜诒硎緩膽鹛栭_始能夠接受多少個 8 位字節(jié)。如果窗口大小為 0,可以發(fā)送窗口探測。
  • 緊急指針:盡在 URG 控制位為 1 時有效。表示緊急數(shù)據(jù)的末尾在 TCP 數(shù)據(jù)部分中的位置。通常在暫時中斷通信時使用(比如輸入 Ctrl + C)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容