天天看點

TCP/UDP封包的最大負載和封包的最小長度

以太網最大傳輸單元(MTU)

以太網的最大資料幀1518Bytes,以太網的幀頭14Bytes,幀尾校驗4Bytes

以太網最大傳輸單元(MTU):1518B - 14B - 4B = 1500Bytes

以太網最小MTU是576Bytes

Internet上的标準MTU值為576位元組

TCP資料包每次能夠傳輸的最大量(MSS)

MSS就是TCP資料包每次能夠傳輸的最大量。為了達到最佳的傳輸效能,TCP協定在建立連接配接的時候通常要協商雙方的MSS值,這個值TCP協定在實作的,預設是536Bytes。發送大于MTU就會被分片。理論上,單個TCP包能打包的資料量遠遠多于1448位元組,現在為了适應MTU,隻要在以太網上跑TCP,系統就預設最大以1448位元組打包TCP。最小的TCP的MTU是576位元組。

MSS = MTU(1500B) - IP頭(20B)- TCP頭(20B)= 1460Bytes

實際場景下,TCP標頭中會帶有12位元組的選項,時間戳。

是以單個TCP包實際傳輸的最大量就縮減為1448位元組:

實際MSS = MTU(1500B) - IP頭(20B) -TCP頭(20B)- TCP選項時間戳(12B) = 1448Bytes

UDP資料包最大傳輸量

UDP的最大包長度是 2^16-1 = 65535Bytes

UDP資料包每次能夠傳輸的最大理論長度 = UDP的最大包長度(65535B) - UDP頭(8B) - IP頭(20B) = 65507Bytes

然而這個隻是UDP資料包的最大理論長度。

首先,我們知道,TCP/IP通常被認為是一個四層協定系統,包括鍊路層、網絡層、傳輸層、應用層。UDP屬于傳輸層,在傳輸過程中,udp包的整體是作為下層協定的資料字段進行傳輸的,它的長度大小受到下層ip層和資料鍊路層協定的制約。

UDP資料包每次能夠傳輸的最大長度 = MTU(1500B) - IP頭(20B) -UDP頭(8B)= 1472Bytes

當我們發送的UDP資料大于1472的時候會怎樣呢?這也就是說IP資料報大于1500位元組,大于MTU。這個時候發送方IP層就需要分片(fragmentation)。把資料報分成若幹片,使每一片都小于MTU。IP資料報分片後,隻有第一片帶有UDP首部,其餘的分片隻有IP頭部,到了端點後根據IP頭部中的資訊在網絡層進行重組。由于UDP的特性,當某一片資料傳送中丢失時,接收友善無法重組資料報,将導緻丢棄整個UDP資料報。是以,在普通的區域網路環境下,将UDP的資料控制在1472位元組以下為好。

而TCP封包段的每個分段中都有TCP首部,到了端點後根據TCP首部的資訊在傳輸層進行重組。IP資料報分片後,隻有到達目的地後才進行重組,而不是像其他網絡協定,在下一站就要進行重組。

進行Internet程式設計時則不同,因為Internet上的路由器可能會将MTU設為不同的值。如果我們假定MTU為1500來發送資料的,而途經的某個網絡的MTU值小于1500位元組,那麼系統将會使用一系列的機制來調整MTU值,使資料報能夠順利到達目的地。鑒于Internet上的标準MTU值為576位元組,是以在進行Internet的UDP程式設計時,最好将UDP的資料長度控件在548位元組(576-8-20)以内。

繼續閱讀