什麼是MTU值,如何設置最快最好?

MTU,即Maximum Transmission Unit(最大傳輸單元),此值設定TCP/IP協議傳輸數據報時的最大傳輸單元。設置合適的MTU值可以解決“部分網站打不開”、“上網速度慢”等問題,並且可以適當提升上網速度。
設置多大的MTU值取決於你的上網方式,不同的上網方式支持不同的MTU,下面列出了一些上網方式的MTU值:
EtherNet(一般上網方式,默認值):1500
PPPoE/ADSL:1492
Dial Up/Modem:576

問題一:知道了我的上網方式,如何設置MTU值?
1. 在 『開始』>『運行』中,鍵入regedit,點確定;
2. 選擇『HKEY_Local_Machine』>『SYSTEM』>『CurrentControlSet』>『Services』>『Tcpip』>『Parameters』>『interface』;
3. 在 interface 底下可能有很多的選項,你一個一個的去看,會有一個選項與你的網卡的 IP 相同,那個就是你要挑選的選項啦!然後同樣的在該選項上選擇『編輯』>『新建』>『DWORD值』之後,建立一個名爲『MTU』的DWORD,然後雙擊修改,選擇十進制,填入合適 MTU 值,確定!大功告成!

問題二:我不知道自己的上網方式,如何確定MTU值呢? ping -f -l 1500 127.0.0.1
C:\WINDOWS>ping -f -l 1500 127.0.0.1
Pinging 127.0.0.1 with 1500 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

上面的式子中,-l 是 L 的小寫(不是 1 喔),1500 是我們要測的 MTU 值,結果出現了:Packet needs to be fragmented but DF set. 這個東西,那表示MTU值太大了,你需要更小的 MTU 值才行!好啦!那假設我們使用 1464 來測試時:

C:\WINDOWS>ping -f -l 1464 127.0.0.1
Pinging 127.0.0.1 with 1464 bytes of data:
Reply from 127.0.0.1: bytes=1464 time=10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 10ms, Average = 2ms
結果出現了迴應了!這表示這一個 MTU 值是可行的!不過,強烈建議找出可行的最大 MTU 值!這樣一來,在設定的時候,纔可以達到最佳的網速!

找出 MTU 值:利用上面這個方法找到的數值還不是 MTU 喔!由於一些封包上面的問題,上面這個值再加上 28 纔是我們所需要的 MTU 值!所以,在上面的例子中,我們所需要的 MTU 值是 1464+28=1492!
一般來講,設計好本機的MTU值,可以解決部分網站打不開的情況,但是如果你的共享主機或路由器的MTU設置有問題,有時問題仍然存或,或者出現網速過慢的情況。合理的設置路由器與本機的MTU值,就可以完全解決上述問題,使上網速度達到最大化.

1. 基礎知識
我們知道, 數據在網絡上傳輸時, 要經過一段一段的鏈路。當數據從某一段鏈路的一端傳到另一端的過程中, 需要考慮的是數據鏈路層協議, 在這一層, 我們觀察到的數據包(PDU: Packet Data Unit)稱爲MAC幀(MAC Frame), 不同的數據鏈路層協議, MAC Frame的格式也不同, 但大致都會有目標MAC地址、源MAC地址、長度/類型、數據(有效載荷: Payload)這幾個字段。 對以太網而言, 採用的是數據鏈路層協議是基於IEEE 802.2/802.3, 但與IEEE 802.2/802.3略有區別.
查一下802.3協議中MAC幀格式部分, 就會發現上面提到的MAC幀中的數據(有效)字段的長度範圍是46-1500個字節. 那麼, 當鏈路層的上一層-IP層所要傳輸的IP數據包(包括IP Header)大小超過這個長度範圍時, IP數據包就必須分成多片傳輸, 這個過程就是分片(Fragmentating), 其中分割出來的每一個片斷就是一個Fragment.


2. MTU與Fragment
上述鏈路層這種對超過其協議定義的最大數據字段長度時就進行分片的特性, 就稱爲MTU(Maximum Transmission Unit). 不同鏈路層協議, MTU值也不同, 我們已經知道, 對以太網, MTU是1500字節, 而對令牌環(Token Ring)網, MTU是4482字節.


3. IP數據包中與分片相關的字段(Fragmentation Fields)
IP數據包在封裝時, 在IP頭的第8-9個字節(16bit)中, 存放關於分片的信息. 其中前3個bit表示分片的狀態, 後13個bit表示當前片斷在分片之前的整塊待封裝的數據包中的偏移量(因爲IP數據包的最大可能長度爲16bit, 而這13bit無法表示16bit的範圍, 故實際使用時, 偏移量的計算是用這13bit的值乘8(3bit), 以實現表示16bit的範圍).

3.1 不分片標記(Don't Fragment Flag)
IP頭第8-9字節從左往右的第2bit表示當前IP數據包是(1)否(0)不分片, 缺省值爲0, 就是不不分片, 即允許分片. 因爲默認允許分片, 所以我們平常使用Ping命令時, 加參數-l 65500 Ping一臺機器也不會有問題.

3.2 是否有後續分片標記(More Fragments Flag)
IP頭第8-9字節從左往右的第3bit表示當前數據包裏的數據是否爲某塊數據的最後一個分片, 若爲0, 則說明當前數據包內的數據沒有分片或者是最後一個分片, 若爲1, 則表示後面還有屬於同一塊數據的分片.


4. 實戰
說了半天感覺太抽象, 我們來些看得見摸得着的東西.

4.1 用Ping測試MTU(在以太網環境中)
開個命令行窗口, 輸入命令:
ping 192.168.0.1 -l 2000 -f
出現提示:
Pinging 192.168.0.1 with 2000 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Ping命令的-f參數作用是"Set Don't Fragment flag in packet", 也就是在將IP頭裏的"Don't Fragment Flag"位設置爲1, 也就是不允許分片, 但是我們又用Ping命令的-l參數指定了發送的數據包的大小爲2000字節, 顯然超過了以太網的MTU-1500字節. 所以數據包不能通過, 並且返回了上述錯誤信息: 數據包需要分片但是DF(Don't Fragment)標記被設置了.
再輸入命令:
ping 192.168.0.1 -l 1500 -f
Pinging 192.168.0.1 with 1500 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
奇怪, 已經把發送數據包的大小改爲MTU值1500, 怎麼還不能通?

減小參數值, 重輸命令:
ping 192.168.0.1 -l 1400 -f
Pinging 192.168.0.1 with 1400 bytes of data:
Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128
Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128
Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128
Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128
好, 這次可以通過了.反覆調整參數值, 看看可以通過的最大Ping命令-l 參數值是多少. 經過反覆試驗, 最後發現, 最大可以通過的Ping命令的-l參數的數值是1472. 這個1472是和預期的MTU值1500差了28個字節. 這28個字節是怎麼來的呢?

4.2 協議分層封裝
我們知道, 在MAC幀的數據(Payload)字段, 封裝(存放)的是上層(IP層)的IP數據包, 而IP數據包的格式是IP Header + IP Data(Payload). 在我們用Ping命令的這個例子中, IP數據包內的IP Data字段內封裝的是ICMP協議數據.

我們來回顧一下MTU的含義: MAC幀內的數據(Payload)字段的最大長度, 也就是說它所封裝的IP Header + IP Data兩者長度之和最大爲1500字節, 而IP Header的最小長度爲20字節, 所以IP Data的最大長度就是1500-20=1480字節, 離我們試驗的1472字節已經比較接近了.
再查查ICMP協議數據的具體格式, 發現在Ping命令用到的ICMP Echo Request/Replay報文中, 在ICMP Data之前, 有幾個字段共佔用了8個字節, 分別爲: Type(1byte), Code(1byte), Checksum(2byte), Identifier(2byte), Sequence Number(2byte), 這幾個字段我們可以稱之爲ICMP Header. 好了, 1480-8=1472, 和我們的試驗結果對上了.
可以發現, 我們使用Ping命令時, -l參數所指定的數據包大小, 是指的ICMP報文中的ICMP Data字段的長度, 不包括ICMP Header, 更不包括IP Header.

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