MTU(Maximum Transmission Unit,最大傳輸單元)
MTU由TCP/IP協(xié)議棧中的IP協(xié)議定義,網(wǎng)絡(luò)層的IP將MTU設(shè)置為1500字節(jié)。
簡單點(diǎn)理解就是:IP規(guī)定每一個(gè)單獨(dú)的數(shù)據(jù)包大小,在網(wǎng)絡(luò)層時(shí)不能超過1500字節(jié)。
如果要將一個(gè)大于1500字節(jié)的數(shù)據(jù)包從一個(gè)接口傳出去,在網(wǎng)絡(luò)層,就會對這個(gè)數(shù)據(jù)包進(jìn)行分割成若干份,每份都是1500字節(jié)。
比如:一個(gè)5000字節(jié)的數(shù)據(jù)包要傳出去,則會分成四個(gè)數(shù)據(jù)包,前三個(gè)都是1500字節(jié),最后一個(gè)是500字節(jié)。
關(guān)于一個(gè)數(shù)據(jù)包MTU的大小,并不是固定的,需要注意的是:
網(wǎng)絡(luò)層外面還會加上數(shù)據(jù)鏈路層的封裝,經(jīng)過數(shù)據(jù)鏈路層封裝之后,才是一個(gè)數(shù)據(jù)包最終的大小。要注意,MTU只是限制了一個(gè)數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)層的封裝后,不要超過1500字節(jié)。
一個(gè)數(shù)據(jù)包最終是多少,是不能一概而論的,不同的數(shù)據(jù)鏈路層會在“網(wǎng)絡(luò)層1500字節(jié)”的基礎(chǔ)上加上不同的頭部,比如:
以太網(wǎng)會在網(wǎng)絡(luò)層的基礎(chǔ)上加上14字節(jié)頭部和4字節(jié)的FCS尾部,所以,一個(gè)以太網(wǎng)數(shù)據(jù)幀最終的大小是1518字節(jié)
當(dāng)數(shù)據(jù)鏈路層為HDLC時(shí),它會在網(wǎng)絡(luò)層前面加上4字節(jié)的HDLC的頭部和4字節(jié)的FCS校驗(yàn),所以,一個(gè)HDLC鏈路的數(shù)據(jù)包是1508字節(jié)
當(dāng)數(shù)據(jù)鏈路層為PPP時(shí),它會在網(wǎng)絡(luò)層前面加上4字節(jié)的PPP的頭部和4字節(jié)的FCS校驗(yàn),所以,一個(gè)PPP鏈路的數(shù)據(jù)包是1508字節(jié)
當(dāng)鏈路兩端的數(shù)據(jù)包MTU設(shè)置不一致時(shí),影響大嗎?
需要注意的是,MTU只會影響到數(shù)據(jù)發(fā)出方向,對收入的數(shù)據(jù),是沒有MTU限制的。
但是,我們建議將鏈路兩端的MTU設(shè)置為一樣大小的,因?yàn)榫W(wǎng)絡(luò)通訊都是有來有回的,一個(gè)大與接口MTU的數(shù)據(jù)收進(jìn)來,如果又要從這個(gè)接口返回去,則入向收到的是一個(gè)完整的包,而出向會對這個(gè)數(shù)據(jù)分片。
雖然不會影響通信,但這種雙向數(shù)據(jù)結(jié)構(gòu)不匹配的通訊模型并不是很合理。
以太網(wǎng)最小幀長為什么是64字節(jié)
以太網(wǎng)(IEEE 802.3)幀格式:
1、前導(dǎo)碼:7字節(jié)0x55,一串1、0間隔,用于信號同步
2、幀起始定界符:1字節(jié)0xD5(10101011),表示一幀開始
3、DA(目的MAC):6字節(jié)
4、SA(源MAC):6字節(jié)
5、類型/長度:2字節(jié),0~1500保留為長度域值,1536~65535保留為類型域值(0x0600~0xFFFF)
6、數(shù)據(jù):46~1500字節(jié)
7、幀校驗(yàn)序列(FCS):4字節(jié),使用CRC計(jì)算從目的MAC到數(shù)據(jù)域這部分內(nèi)容而得到的校驗(yàn)和。
相關(guān)MTU問題整理
MTU設(shè)置不當(dāng),可能會導(dǎo)致許多網(wǎng)絡(luò)問題,如某些網(wǎng)絡(luò)應(yīng)用無法使用,某些網(wǎng)站無法訪問等。下面是在網(wǎng)上搜索整理的關(guān)于MTU設(shè)置的東西,某些可能未作驗(yàn)證,僅供參考。
1. 如何確定網(wǎng)絡(luò)MTU
某些ISP接入的MTU可能會比常規(guī)使用的MTU小,這時(shí)如果設(shè)置了過大的MTU,就可能會導(dǎo)致很多服務(wù)無法使用的問題??梢酝ㄟ^ping程序確定MTU的值。
Windows可以打開命令提示符,使用 PING -l -f 的方式確定MTU
ping -l 1400 -f www.zhongjima.net
如果能ping通,說明詞MTU是可以的,可適當(dāng)加大MTU值,直到最大;否則就要適當(dāng)調(diào)小MTU值。設(shè)置最大的MTU值可以有效的提高網(wǎng)絡(luò)吞吐量。
2. 常見MTU值
根據(jù)寬帶連接方式的不同,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)【開始】-【運(yùn)行】-【regedit】打開注冊表
2) 選擇【HKEY_Local_Machine】-【SYSTEM】-【CurrentControlSet】-【Services】-【Tcpip】-【Parameters】-【interface】
3) 在 interface 底下可能有很多的選項(xiàng),一個(gè)一個(gè)的去看,會有一個(gè)選項(xiàng)IPaddress與當(dāng)前網(wǎng)卡的 IP 相同,然后在該選項(xiàng)上選擇【編輯】-【新建】-【DWORD值】,建立一個(gè)名為【MTU】的DWORD,然后雙擊修改,選擇十進(jìn)制,填入合適 MTU 值
4. TCP MSS 與大包通信的關(guān)系
用戶在使用路由器訪問Internet時(shí),經(jīng)常會反饋不能訪問網(wǎng)頁(或部分網(wǎng)頁)以及使用Outlook收發(fā)郵件(這些應(yīng)用是基于TCP或UDP的),但進(jìn)行Ping包時(shí)沒有問題,這時(shí)候檢查配置時(shí)也沒有錯(cuò)誤。出現(xiàn)這種情況的時(shí)候,多半是因?yàn)樵谠O(shè)備上進(jìn)行了NAT應(yīng)用,同時(shí)設(shè)備對報(bào)文進(jìn)行了分片操作。
IP報(bào)文里是有五元組的,但報(bào)文要進(jìn)行分片時(shí),只有第一片報(bào)文帶有IP的五元組信息(源目的ip位址,源目的端口號,協(xié)議號),后續(xù)的分片不會保留TCP/UDP報(bào)文所有的標(biāo)識信息,如端口號信息等,這種情況下,如果設(shè)備又實(shí)現(xiàn)了NAT轉(zhuǎn)換操作(NAT轉(zhuǎn)換過程中,會隨機(jī)地做埠轉(zhuǎn)換),并且應(yīng)用又是基于TCP/UDP的,這就導(dǎo)致報(bào)文不能正確組包,會出現(xiàn)上述的問題現(xiàn)象。
TCP/IP連接時(shí)建立的過程中會協(xié)商很多參數(shù)的,其中TCP MSS參數(shù)就是用于協(xié)商TCP報(bào)文大小的,如果協(xié)商出來的TCP MSS的參數(shù)值小于設(shè)備的MTU的值時(shí),TCP報(bào)文在設(shè)備上就不會被分片,否則就會出現(xiàn)報(bào)文分片并導(dǎo)致上述現(xiàn)象的發(fā)生,因此,為了避免上述情況的發(fā)生,一定要保證協(xié)商的TCP MSS參數(shù)小于設(shè)備的MTU的值。為此,Quidway路由器上有一個(gè)設(shè)置TCP MSS值的命令,如果配置了這條命令,路由器設(shè)備在建立TCP/IP連接的過程中就按照這個(gè)配置的值來修改協(xié)商報(bào)文中關(guān)于TCP MSS的值,在同對端協(xié)商的過程中也就能夠協(xié)商出這個(gè)值來,如果不配置這條命令,路由器設(shè)備就不會修改報(bào)文中的這個(gè)值(有時(shí)對端設(shè)備發(fā)送過來的協(xié)商報(bào)文中的這個(gè)值會很大,如8000)。一般來說,默認(rèn)或配置的MTU的值一般在1500左右,將TCP MSS的值設(shè)備為小于1500就可以,如1400或1024等。
如果TCP MSS值設(shè)置的過小,報(bào)文數(shù)量明顯增多又導(dǎo)致效率下降,特別是沒有配置NAT應(yīng)用的情況下,限制TCP報(bào)文大小更沒有必要,由于應(yīng)用情況比較復(fù)雜,設(shè)置默認(rèn)的TCP MSS的值也不是特別合適(設(shè)備會在建立連接時(shí)均要修改TCP MSS的值),因此,還是在應(yīng)用中加以注意比較好,思科設(shè)備也是有這個(gè)配置命令的
MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小
MSS最大傳輸大小的縮寫,是TCP協(xié)議里面的一個(gè)概念。
MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes), 通訊雙方會根據(jù)雙方提供的MSS值得最小值確定為這次連接的最大MSS值。
而一般以太網(wǎng)MTU都為1500, 所以在以太網(wǎng)中, 往往TCP MSS為1460。
協(xié)商TCP MSS大小具體過程如下:
TCP client發(fā)出SYN報(bào)文,其中option選項(xiàng)填充的MSS字段一般為(MTU-IP頭大小-TCP頭大小),同樣TCP server收到SYN報(bào)文后,會發(fā)送SYN+ACK報(bào)文應(yīng)答,option選項(xiàng)填充的mss字段也為(MTU-IP頭大小-TCP頭大小);協(xié)商雙方會比較SYN和SYN+ACK報(bào)文中MSS字段大小,選擇較小的MSS作為發(fā)送TCP分片的大小。
對于涉及PPPOE+NAT、IPsec、L2TP、GRE等組網(wǎng),通常由于報(bào)文太大需要分片,這樣會降低傳輸速率; 所以選擇一個(gè)合適的MSS對傳輸數(shù)據(jù)來說比較重要. linux中一般可以通過netfilter iptables設(shè)置TCP MSS來解決。
iptables -A FORWARD -p tcp- -tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
這條規(guī)則的目的就是改變TCP MSS以適應(yīng)PMTU(Path MTU)
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN- j TCPMSS --set-mss 128
設(shè)置MSS為128
5. 設(shè)置網(wǎng)絡(luò)接口MTU
1)Linux主機(jī)接口MTU可通過如下命令設(shè)置
ifconfig mtu
2)PPPoE MTU設(shè)置,可以通過在配置文件中添加
mtu
mru
3)NAT自動(dòng)設(shè)置MSS值
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu