最大傳輸單元MTU詳解

2021年10月8日17:50:33 發表評論 4,414 ℃

MTU(Maximum Transmission Unit,最大傳輸單元)

MTU由TCP/IP協議棧中的IP協議定義,網絡層的IP將MTU設置為1500字節。

簡單點理解就是:IP規定每一個單獨的數據包大小,在網絡層時不能超過1500字節。

如果要將一個大于1500字節的數據包從一個接口傳出去,在網絡層,就會對這個數據包進行分割成若干份,每份都是1500字節。

比如:一個5000字節的數據包要傳出去,則會分成四個數據包,前三個都是1500字節,最后一個是500字節。

關于一個數據包MTU的大小,并不是固定的,需要注意的是:

網絡層外面還會加上數據鏈路層的封裝,經過數據鏈路層封裝之后,才是一個數據包最終的大小。要注意,MTU只是限制了一個數據包經過網絡層的封裝后,不要超過1500字節。

一個數據包最終是多少,是不能一概而論的,不同的數據鏈路層會在“網絡層1500字節”的基礎上加上不同的頭部,比如:

以太網會在網絡層的基礎上加上14字節頭部和4字節的FCS尾部,所以,一個以太網數據幀最終的大小是1518字節

當數據鏈路層為HDLC時,它會在網絡層前面加上4字節的HDLC的頭部和4字節的FCS校驗,所以,一個HDLC鏈路的數據包是1508字節

當數據鏈路層為PPP時,它會在網絡層前面加上4字節的PPP的頭部和4字節的FCS校驗,所以,一個PPP鏈路的數據包是1508字節

當鏈路兩端的數據包MTU設置不一致時,影響大嗎?

需要注意的是,MTU只會影響到數據發出方向,對收入的數據,是沒有MTU限制的。

但是,我們建議將鏈路兩端的MTU設置為一樣大小的,因為網絡通訊都是有來有回的,一個大與接口MTU的數據收進來,如果又要從這個接口返回去,則入向收到的是一個完整的包,而出向會對這個數據分片。

雖然不會影響通信,但這種雙向數據結構不匹配的通訊模型并不是很合理。

以太網最小幀長為什么是64字節

以太網(IEEE 802.3)幀格式:

1、前導碼:7字節0x55,一串1、0間隔,用于信號同步

2、幀起始定界符:1字節0xD5(10101011),表示一幀開始

3、DA(目的MAC):6字節

4、SA(源MAC):6字節

5、類型/長度:2字節,0~1500保留為長度域值,1536~65535保留為類型域值(0x0600~0xFFFF)

6、數據:46~1500字節

7、幀校驗序列(FCS):4字節,使用CRC計算從目的MAC到數據域這部分內容而得到的校驗和。

相關MTU問題整理

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

1. 如何確定網絡MTU

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

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

ping -l 1400 -f m.maowutv.com

如果能ping通,說明詞MTU是可以的,可適當加大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. 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 mtu

2)PPPoE MTU設置,可以通過在配置文件中添加

mtu

mru

3)NAT自動設置MSS值

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

【騰訊云】云服務器、云數據庫、COS、CDN、短信等云產品特惠熱賣中

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: