天天看點

java擷取udp封包的長度_UDP的最大封包長度

對于以太網環境下UDP傳輸中的資料包長度問題

首先要看TCP/IP協定,涉及到四層:鍊路層,網絡層,傳輸層,應用層。

其中以太網(Ethernet)的資料幀在鍊路層

IP包在網絡層

TCP或UDP包在傳輸層

TCP或UDP中的資料(Data)在應用層

它們的關系是 資料幀{IP包{TCP或UDP包{Data}}}

在應用程式中我們用到的Data的長度最大是多少,直接取決于底層的限制。

我們從下到上分析一下:

在鍊路層,由以太網的實體特性決定了資料幀的長度為(46+18)-(1500+18),其中的18是資料幀的頭和尾,也就是說資料幀的内容最大為1500,即MTU(Maximum Transmission Unit)為1500;

在網絡層,因為IP包的首部要占用20位元組,是以這的MTU為1500-20=1480;

在傳輸層,對于UDP包的首部要占用8位元組,是以這的MTU為1480-8=1472;

是以,在應用層,你的Data最大長度為1472。

(當我們的UDP包中的資料多于MTU(1472)時,發送方的IP層需要分片fragmentation進行傳輸,而在接收方IP層則需要進行資料報重組,由于UDP是不可靠的傳輸協定,如果分片丢失導緻重組失敗,将導緻UDP資料包被丢棄)。

從上面的分析來看,在普通的區域網路環境下,UDP的資料最大為1472位元組最好(避免分片重組)。

但在網絡程式設計中,Internet中的路由器可能有設定成不同的值(小于預設值),Internet上的标準MTU值為576,是以Internet的UDP程式設計時資料長度最好在576-20-8=548位元組以内。

MTU對我們的UDP程式設計很重要,那如何檢視路由的MTU值呢?

對于windows OS: ping -f -l  

如:ping -f -l 1472 192.168.0.1

如果提示:Packets needs to be fragmented but DF set.

則表明MTU小于1500,不斷改小data_length值,可以最終測算出gateway的MTU值;

對于linux OS: ping -c  -M do -s  

如: ping -c 1 -M do -s 1472 192.168.0.1

如果提示 Frag needed and DF set……

則表明MTU小于1500,可以再測以推算gateway的MTU。

當然要修改MTU的值,那就是網管的事了(一般人沒這權限呀),我們隻能申請加等待了 ^-^