1. 程式人生 > >網路-UDP,TCP資料包的最大傳輸長度分析

網路-UDP,TCP資料包的最大傳輸長度分析

一、UDP

UDP允許傳輸的最大長度理論上2^16 - udp head - iphead( 65507 位元組 = 65535 - 20 - 8)

但是實際上UDP資料報的資料區最大長度為1472位元組。分析如下:

首先,我們知道,TCP/IP通常被認為是一個四層協議系統,包括鏈路層,網路層,運輸層,應用層. 

UDP屬於運輸層,下面我們由下至上一步一步來看:    
乙太網(Ethernet)資料幀的長度必須在46-1500位元組之間,這是由乙太網的物理特性決定的。這個1500位元組被稱為鏈路層的MTU(最大傳輸單元)。
但這並不是指鏈路層的長度被限制在1500位元組,其實這這個MTU指的是鏈路層的資料區。 

並不包括鏈路層的首部和尾部的18個位元組。 所以,事實上,這個1500位元組就是網路層IP資料報的長度限制。 因為IP資料報的首部為20位元組,所以IP資料報的資料區長度最大為1480位元組.    
而這個1480位元組就是用來放TCP傳來的TCP報文段或UDP傳來的UDP資料報的。 又因為UDP資料報的首部8位元組,所以UDP資料報的資料區最大長度為1472位元組。這個1472位元組就是我們可以使用的位元組數。

超過1500位元組怎麼辦?

這也就是說IP資料報大於1500位元組,大於MTU.這個時候傳送方IP層就需要分片(fragmentation).    
把資料報分成若干片,使每一片都小於MTU.而接收方IP層則需要進行資料報的重組.    


這樣就會多做許多事情,而更嚴重的是,由於UDP的特性,當某一片資料傳送中丟失時,接收方便    
無法重組資料報.將導致丟棄整個UDP資料報。    

因此,在普通的區域網環境下,我建議將UDP的資料控制在1472位元組以下為好.    

進行Internet程式設計時則不同,因為Internet上的路由器可能會將MTU設為不同的值.    
如果我們假定MTU為1500來發送資料的,而途經的某個網路的MTU值小於1500位元組,那麼系統將會使用一系列的機    
制來調整MTU值,使資料報能夠順利到達目的地,這樣就會做許多不必要的操作。鑑於Internet上的標準MTU值為576位元組,

所以我建議在進行Internet的UDP程式設計時. 

最好將UDP的資料長度控制元件在548位元組(576-8-20)以內.

二、TCP

TCP 包的大小就應該是 1500 - IP頭(20) - TCP頭(20) = 1460 (Bytes)

我們在用Socket程式設計時,UDP協議要求包小於64K。TCP沒有限定,TCP包頭中就沒有“包長度”欄位,而完全依靠IP層去處理分幀。這就是為什麼TCP常常被稱作一種“流協議”的原因,開發者在使用TCP服務的時候,不必去關心資料包的大小,只需講SOCKET看作一條資料流的入口,往裡面放資料就是了,TCP協議本身會進行擁塞/流量控制。