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 <data_length> <gateway_IP>

  如: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 <number> -M do -s <data_length> <gateway_IP>

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

  如果提示 Frag needed and DF set……

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM