網絡報文的長度

 
    對於以太網環境下UDP傳輸中的數據包長度問題,首先要看TCP/IP協議,涉及到四層:鏈路層,網絡層,傳輸層,應用層。
其中以太網(Ethernet)的數據幀在鏈路層,IP包在網絡層,TCP或UDP包在傳輸層,TCP或UDP中的數據(Data)在應用層,它們的關係是:
             數據幀{IP包{TCP或UDP包{Data}}}
 在應用程序中我們用到的Data的長度最大是多少,直接取決於底層的限制。我們從下到上分析一下:
 在鏈路層,由以太網的物理特性決定了數據幀的長度爲(46+18)-(1500+18),其中的18是數據幀的頭和尾,46+18=64是以太網幀的最短幀長,1500+18=1518是最大幀長。也就是說數據幀的內容最大爲1500,即MTU(Maximum Transmission Unit)爲1500;
  (可是爲什麼我用wireshark抓下的包看到的幀頭部是14字節,木有校驗位4位?!,最短幀長是62?!)
 在網絡層,因爲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值:
 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

  修改方法如下:  

Windows平臺下  

1、運行regedit  2、打開:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces  3、Interfaces下有多個子項,每個子項對應一個網卡。請按如下方法選擇網卡:  A、確定本機用來連接Internet的網卡或撥號連接的IP,如192.168.0.19;  B、用鼠標點擊Interfaces上的子項,查看鍵值列表中的IPAddress項;  C、如果IPAddress的鍵值與A中的IP相同,即192.168.0.19,則該子項就是要找的網卡。  4、進入該子項,在右邊的窗口裏按鼠標右鍵,選擇“新建”->“DWORD 值”,輸入名稱“MTU”,按回車。再用鼠標雙擊“MTU”,彈出修改窗口,填入MTU的值(一般爲十進制的1480)。  填寫前請先把基數設爲十進制。 設置好後,需要重啓機器才能生效。  Windows 7(XP、Vista未實測)  1、使用管理員權限運行cmd  2、使用netsh interface ipv4 show subinterfaces命令看看MTU以及本地連接名稱。  3、使用netsh interface ipv4 set subinterface "連接名" mtu=300 store=persistent  (注:這裏的連接名是你使用上面命令看到的MTU值對應的這個連接名,他在右邊顯示。)  附:1、此方法不用重啓;2、如是ipv6就將上面的ipv4改成ipv6  Linux下可使用如下命令修改 需要root權限  ifconfig 網卡 MTU值  如 ifconfig eth0 mtu 1460  MaxMTU是最大的TCP/IP傳輸單元,在TCP/IP協議中,將要傳輸的數據分成較小的組進行傳輸,每個組的大小爲576字節。Windows默認的字節爲1500,這是以太網的分組標準。ADSL使用的 PPPoE略小於這個數值,一般爲1492。而某些網站採用的MaxMTU大於1492,所以,可能導致某些網頁不能訪問。修改Windows默認的MaxMTU可以解決這個問題。不論是 PC機上安裝的PPPoE軟件或者是內置在Modem的 PPPoE軟件,在使用中都有可能遇到這個問題。 如果使用路由器出現此種情況, 請在 防火牆配置 => 基本設定 裏, 將MTU改爲手工, 設置爲 1492 即可. 那如何確定路由器從ISP獲得的 MTU 爲 1500, 請見附件圈出的位置.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章