1. 程式人生 > >關於最大傳輸單元(MTU)的整理

關於最大傳輸單元(MTU)的整理

MTU設定不當,可能會導致許多網路問題,如某些網路應用無法使用,某些網站無法訪問等。下面是在網上搜索整理的關於MTU設定的東西,某些可能未作驗證,僅供參考。

1. 如何確定網路MTU

某些ISP接入的MTU可能會比常規使用的MTU小,這時如果設定了過大的MTU,就可能會導致很多服務無法使用的問題。可以通過ping程式確定MTU的值。

Windows可以開啟命令提示符,使用 PING -l <MTU> -f <HOST>的方式確定MTU

ping -l 1400 -f www.baidu.com

如果能ping通,說明詞MTU是可以的,可適當加大MTU值,直到最大;否則就要適當調小MTU值。設定最大的MTU值可以有效的提高網路吞吐量。

相關實驗可見下圖:

2. 常見MTU值

根據寬頻連線方式的不同,MTU可能不盡相同,如下所示:

1)PPPoE/ADSL: 1360-1492

2) PPTP VPN: 1400-1460

3) L2TP VPN: 1400-1460

4) Fixed IP: 1400-1500

5) DHCP: 1400-1492

3. Windows 修改MTU

Windows直接連線的,可在登錄檔中修改MTU,具體方法為:

1)【開始】-【執行】-【regedit】開啟登錄檔

2) 選擇【HKEY_Local_Machine】-【SYSTEM】-【CurrentControlSet】-【Services】-【Tcpip】-【Parameters】-【interface】

3) 在 interface 底下可能有很多的選項,一個一個的去看,會有一個選項IPaddress與當前網絡卡的 IP 相同,然後在該選項上選擇【編輯】-【新建】-【DWORD值】,建立一個名為【MTU】的DWORD,然後雙擊修改,選擇十進位制,填入合適 MTU 值

4. 路由器中設定MTU

如果是通過路由器共享上網,可以檢視路由器是否支援MTU設定,如果支援,那麼恭喜你,直接修改MTU為合適的數值即可。

1)TP-LINK 路由器設定

2)JCG路由器設定

4. TCP MSS 與大包通訊的關係 

使用者在使用路由器訪問Internet時,經常會反饋不能訪問網頁(或部分網頁)以及使用Outlook收發郵件(這些應用是基於TCP或UDP的),但進行Ping包時沒有問題,這時候檢查配置時也沒有錯誤。出現這種情況的時候,多半是因為在裝置上進行了NAT應用,同時裝置對報文進行了分片操作。
IP報文裡是有五元組的,但報文要進行分片時,只有第一片報文帶有IP的五元組資訊(源目的ip位址,源目的埠號,協議號),後續的分片不會保留TCP/UDP報文所有的標識資訊,如埠號資訊等,這種情況下,如果裝置又實現了NAT轉換操作(NAT轉換過程中,會隨機地做埠轉換),並且應用又是基於TCP/UDP的,這就導致報文不能正確組包,會出現上述的問題現象。
TCP/IP連線時建立的過程中會協商很多引數的,其中TCP MSS引數就是用於協商TCP報文大小的,如果協商出來的TCP MSS的引數值小於裝置的MTU的值時,TCP報文在裝置上就不會被分片,否則就會出現報文分片並導致上述現象的發生,因此,為了避免上述情況的發生,一定要保證協商的TCP MSS引數小於裝置的MTU的值。為此,Quidway路由器上有一個設定TCP MSS值的命令,如果配置了這條命令,路由器裝置在建立TCP/IP連線的過程中就按照這個配置的值來修改協商報文中關於TCP MSS的值,在同對端協商的過程中也就能夠協商出這個值來,如果不配置這條命令,路由器裝置就不會修改報文中的這個值(有時對端裝置傳送過來的協商報文中的這個值會很大,如8000)。一般來說,預設或配置的MTU的值一般在1500左右,將TCP MSS的值裝置為小於1500就可以,如1400或1024等。 
如果TCP MSS值設定的過小,報文數量明顯增多又導致效率下降,特別是沒有配置NAT應用的情況下,限制TCP報文大小更沒有必要,由於應用情況比較複雜,設定預設的TCP MSS的值也不是特別合適(裝置會在建立連線時均要修改TCP MSS的值),因此,還是在應用中加以注意比較好,思科裝置也是有這個配置命令的

MTU: Maxitum Transmission Unit 最大傳輸單元

MSS: Maxitum Segment Size 最大分段大小

MSS最大傳輸大小的縮寫,是TCP協議裡面的一個概念。
MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP協議在建立連線的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP資料包包頭的大小20Bytes和TCP資料段的包頭20Bytes), 通訊雙方會根據雙方提供的MSS值得最小值確定為這次連線的最大MSS值。

而一般乙太網MTU都為1500, 所以在乙太網中, 往往TCP MSS為1460。

協商TCP MSS大小具體過程如下:
TCP client發出SYN報文,其中option選項填充的MSS欄位一般為(MTU-IP頭大小-TCP頭大小),同樣TCP server收到SYN報文後,會發送SYN+ACK報文應答,option選項填充的mss欄位也為(MTU-IP頭大小-TCP頭大小);協商雙方會比較SYN和SYN+ACK報文中MSS欄位大小,選擇較小的MSS作為傳送TCP分片的大小。

對於涉及PPPOE+NAT、IPsec、L2TP、GRE等組網,通常由於報文太大需要分片,這樣會降低傳輸速率; 所以選擇一個合適的MSS對傳輸資料來說比較重要. linux中一般可以通過netfilter iptables設定TCP MSS來解決。

iptables -A FORWARD -p tcp- -tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

這條規則的目的就是改變TCP MSS以適應PMTU(Path MTU)

iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN- j TCPMSS --set-mss 128

設定MSS為128

5. 設定網路介面MTU

1)Linux主機介面MTU可通過如下命令設定

ifconfig <interface> mtu <MTU>

2)PPPoE MTU設定,可以通過在配置檔案中新增

mtu <MTU>

mru <MTU>

3)NAT自動設定MSS值

iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

參考

http://hi.baidu.com/wel_bd/blog/item/88c96401ca25cb0c1d9583ed.html

http://hi.baidu.com/ybbmdf/blog/item/287d878b498e04d6fc1f1079.html

轉自:http://blog.csdn.net/wangxg_7520/article/details/7301205