1. 程式人生 > >談談傳輸層的UDP與TCP

談談傳輸層的UDP與TCP

傳輸層的概述

傳輸層為應用程序之間提供了端到端的邏輯通訊,在該層中主要有兩個協議:無連線的使用者資料報協議(UDP)和麵向連線的傳輸控制協議(TCP)

傳輸層的埠

運輸層用16位埠號來標誌一個埠,允許有65535個不同埠,特別要注意的是這些埠是隻針對本地才有意義的,兩臺不同的主機即使擁有同個埠號,此時這兩個埠是沒什麼關係的。埠號總共分為三類:

  1. 0-1023:熟知埠號或系統埠號,例如:FTP(21)HTTP(80)
  2. 1023-49151:登記埠號。必須到IANA按照規定手續辦理登記。
  3. 49152-65535:客戶端埠號又稱短暫埠號

UDP的概述

UDP只在IP資料包提供的服務上增加了複用,分用,差錯檢錯服務,主要有一下幾個特點:

1 無連線服務;
2.面向報文,UDP直接拿了應用層交付給自己的報文,加上UDP首部後直接交給網路層;
3.UDP是盡最大努力交付,為不可靠的交付 ;
4.UDP沒有擁塞控制,無論網路環境怎麼樣,還是會一直保持恆定速率傳送。可應用於一些對資料沒有多大要求的應用(IP電話,視訊);
5.UDP支援一對一,一對多,多對多的互動通訊;
6.首部只有8個位元組,開銷比較少。

(1)源埠 2 位元組 在對方需要回信時可用,不需要時可以全 0;

(2)目的埠 2 位元組 必須,也是最重要的欄位;

(3)長度 2 位元組 長度值包括報頭和資料部分;

(4)校驗和 2 位元組 用於檢驗 UDP 資料報在傳輸過程中是否有出錯,有錯就丟棄。

UDP的首部格式

UDP資料包有兩個欄位:首部欄位和資料欄位,其中首部欄位只有8個位元組,由四個欄位組成,各佔兩個位元組,分別為源端號(當不需要回信時,可為0),目的埠,長度(最小為8,僅有首部),檢驗和。
這裡寫圖片描述
其中需要注意的是偽首部,並非正真存在的首部,不會向上上交也不會向下傳送,只被用於計算校驗和(注意傳輸層計算校驗和會將首部和資料一起來算,而網路層IP計算檢驗和只用首部)

TCP概述

TCP主要有以下幾個特點:
1.面向連線的傳輸層協議;
2.每次連線只能有兩個端點(IP:埠號),也稱作套接字。不支援廣播和多播;
3.面向位元組流;
4.提供可靠的傳輸服務;
5.提供全雙工的通訊。

TCP的首部格式

TCP報文的首部前20個子節是固定的,後面的4N的位元組是根據需要新增,因為TCP定義了的資料最大偏移量為60個位元組,所以說首部最多為60個子節,最小則為20個位元組。
這裡寫圖片描述
20 位元組的固定部分,各欄位功能說明:

1.源埠和目的埠:各佔 2 個位元組,分別寫入源埠號和目的埠號。

2.序號:佔 4 位元組序,序號範圍[0,2^32-1],序號增加到 2^32-1 後,下個序號又回到 0。 TCP 是面向位元組流的,通過 TCP 傳送的位元組流中的每個位元組都按順序編號,而報頭中的序號欄位值則指的是本報文段資料的第一個位元組的序號。

3.確認序號:佔 4 位元組,期望收到對方下個報文段的第一個資料位元組的序號。

4.資料偏移:佔 4 位,指 TCP 報文段的報頭長度,包括固定的 20 位元組和選項欄位。

5.保留:佔 6 位,保留為今後使用,目前為 0。

6.控制位:共有 6 個控制位,說明本報文的性質,意義如下:

*URG 緊急:當 URG=1 時,它告訴系統此報文中有緊急資料,應優先傳送(比如緊急關閉),這要與緊急指標欄位配合使用。
ACK 確認:僅當 ACK=1 時確認號欄位才有效。建立 TCP 連線後,所有報文段都必須把 ACK 欄位置為 1。
PSH 推送:若 TCP 連線的一端希望另一端立即響應,PSH 欄位便可以“催促”對方,不再等到快取區填滿才傳送。
RET 復位:若 TCP 連接出現嚴重差錯,RST 置為 1,斷開 TCP 連線,再重新建立連線。
SYN 同步:用於建立和釋放連線,稍後會詳細介紹。
FIN 終止:用於釋放連線,當 FIN=1,表明傳送方已經發送完畢,要求釋放 TCP 連線。*
7.視窗:佔 2 個位元組。視窗值是指傳送者自己的接收視窗大小,因為接收快取的空間有限。

8.檢驗和:2 個位元組。和 UDP 報文一樣,有一個檢驗和,用於檢查報文是否在傳輸過程中出差錯。

9.緊急指標:2 位元組。當 URG=1 時才有效,指出本報文段緊急資料的位元組數。

10.選項:長度可變,最長可達 40 位元組。常見的有SACK選擇確認項,視窗擴大選項,時間戳。

TCP的流量控制

主要是來讓傳送方不要傳送太快,要讓傳送方來得及接收。每次傳送方會維持一個傳送視窗,而接收方會有一個接收視窗。當接收方來不及接收時,會發送一個rwnd給傳送方,告訴此時接收視窗的大小,這時傳送方會將自己的傳送視窗變小,傳輸的資料就會少點,從而達到了流量控制的目的。不過有時會出現一個成為糊塗視窗綜合症,就是接收方的接收快取已滿,而應用程式每次只用一個位元組,那麼傳送方就只能一次發一個位元組,網路效率極差。

TCP的擁塞控制

主要是根據網路的情況,控制傳送方的傳送速度。這裡主要實現演算法有:
1.慢開始(需要注意的是慢開始並非指增長速度慢,是指最開始將傳送視窗定為1位元組):這個階段cwnd增長是翻倍
2.擁塞避免:每次cwnd只增加1
3.快重傳
4.快恢復

TCP運輸連線管理

運輸連線有三個階段:連線建立,資料傳送,連線釋放。這裡主要講連線建立和連線的釋放。

1. 連線建立

個人理解的文字描述:
首先由客戶機建立主動連線,而伺服器屬於被動連線。最開始服務建立傳輸控制塊TCB,進入了LISTEN(收聽)狀態,接著客戶機也建立了TCB,傳送了一個SYN=1;seq=x的報文段給伺服器,客戶機進入SYN-SENT(同步已傳送)狀態T。當伺服器正常收到了該報文後,會發送一個SYN=1;ACK=1;seq=y;ack=x+1給客戶機,伺服器進入SYN-RCVD(同步已接收)狀態。當客戶機正常收到伺服器發回的報文後,客戶機會再發一個確認報文段ACK=1;seq=x+1;ack=y+1,客戶機進入了ESTABLISHED(建立連線)狀態。這個過程也被稱為TCP建立連線的三次握手。

TCP規定在ACK報文段可以傳送資料,如果不傳送資料則不消耗序列號,即上面建立連線後資料的序列號可以為x+1
這裡寫圖片描述

2.連線釋放

個人理解的文字描述:
先有客戶機發送一個FIN=1;seq=u(其中u為前面傳送最後的一個位元組序列號加1),客戶機進入FIN-WAIT-1(終止等待1),伺服器接收到這個報文段後,會發送一個ACK=1;seq=z;ack=u+1(其中z為最後接收到的位元組序列號加1),伺服器進入CLOSE-WAITD(等待關閉)狀態,客戶機收到這個確認後進入FIN-WAIT-2((終止等待2)此時就證明客戶機到伺服器端這個方向的連線已經斷開,而伺服器端到客戶端這個方向的連線還沒釋放,伺服器還可以向客戶機發送資料,一直到伺服器沒有資料要傳送給該客戶機時,會發送FIN=1,ACK=1;seq=w;ack=u+1給客戶機,伺服器進入LAST-ACK(最後確認)狀態·,客戶機接正確收到這個報文段,傳送一個ACK=1;seq=u+1;ack=w+1給伺服器,客戶機進入TIME-WAIT(一般等待時間為2msl)。伺服器收到這個報文段後就進入CLOSED(關閉連線狀態),客戶機等待了2msl後進CLOSED(關閉連線狀態)。這個過程稱作TCP連線釋放的四次揮手。

這裡寫圖片描述

希望以上闡述能幫助到在學習的小夥伴們!有什麼問題,也歡迎大家多多指教!