通訊術語 傳輸單元最大值(Maximum Transmission Unit,MTU)是指一種通訊協定的某一層上面所能通過的最大資料包大小(以位元組為單位)。傳輸單元最大值這個參數通常與通訊介面有關(網路介面卡、串口等)。詳細解釋網際網路協議允許IP分區,這樣就可以將資料包分成足夠小的片段以通過那些傳輸單元最大值小於該資料包原始大小的鏈路了。這一分區過程發生在網路層(OSI 模型的第三層),第四層為傳輸層,傳輸層是 OSI 模型中最重要的一層,這裡是根據視窗控制傳輸,而非MTU。傳輸協議同時進行流量控制或是基於接收方可接收資料的快慢程度規定適當的發送速率。除此之外,傳輸層按照網路能處理的最大尺寸將較長的資料包進行強制分割。例如,乙太網路無法接收大於1500位元組的資料包。發送方節點的傳輸層將資料分割成較小的資料片,同時對每一資料片安排一序號,以便資料到達接收方節點的傳輸層時,能以正確的順序重組,該過程即被稱為排序。它使用的是將分組發送到鏈路上的網路介面的傳輸單元最大值的值。原始分組的分區都被加上了標記,這樣目的主機的TCP層就能將分組重組成原始的資料包了。在網際網路協議中,一條網際網路傳輸路徑的“路徑傳輸單元最大值”被定義為從源地址到目的地址所經過“路徑”上的所有IP跳的傳輸單元最大值的最小值。或者從另外一個角度來看,就是無需進一步分區就能穿過這條“路徑”的傳輸單元的最大值。RFC 1191描述了“路徑傳輸單元最大值探索方法”,這是一種確定兩個IP主機之間路徑傳輸單元最大值的技術,其目的是為了避免IP分區。在這項技術中,源地址將資料報的DF(Don't Fragment,不要分區)位置位,再逐漸增大發送的資料報的大小——路徑上任何需要將分組進行分區的裝置都會將這種資料報丟棄並返回一個“資料報過大”的ICMP響應到源地址——這樣,源主機就“學習”到了不用進行分區就能通過這條路徑的最大的傳輸單元最大值了。不幸的是,越來越多的網路封殺了ICMP的傳輸(譬如說為了防範DDOS攻擊)——這使得路徑傳輸單元最大值探索方法不能正常工作,其常見表現就是一個串連在低資料流量的情況下可以正常工作,但一旦有大量資料同時發送,就會立即掛起(例如在使用IRC的時候,客戶會發現在發送了一個禁止IP欺騙的ping之後就得不到任何響應了,這是因為該串連被大量的歡迎訊息堵塞了)。而且,在一個使用網際網路協議的網路中,從源地址到目的地址的“路徑”常常會為了響應各種各樣的事件(負載平衡、擁塞、斷電等等)而被動態地修改——這可能導致路徑傳輸單元最大值在傳輸過程中發生改變——有時甚至是反覆的改變。其結果是,在主機尋找新的可以安全工作的傳輸單元最大值的同時,更多的分組被丟失掉了。對於時下大多數使用乙太網路的區域網路來說,傳輸單元最大值的值是1500位元組。但是像PPPoE這樣的系統會減小這個數值,這就使得在使用傳輸單元最大值探索方法時可能會產生這樣的結果:一些處於配置不當的防火牆之後的網站變得不可達了。對於這種情況,還是可能找到變通的方法的,但這取決於你控制的是網路的哪一部分。這些方法包括改變用來在防火牆一端建立TCP串連的第一個分組的MSS(Maximum Segment Size,最大分段大小)。對於一些支援老版本乙太網路協議的IBM系統(例如XSeries),可能只有在把傳輸單元最大值設為1492之後才能在當下常見的區域網路上進行運作。如何檢測網關的MTU在本機開啟dos視窗,執行: ping -f -l 1472 192.168.0.1 其中192.168.0.1是網關IP地址,1472是資料包的長度。請注意,上面的參數是“-l”(小寫L),而不是“-1”。 如果能ping通,表示資料包不需要拆包,可以通過網關發送出去。 如果出現: Packet needs to be fragmented but DF set. 表示資料包需要拆開來發送。此時,減少資料包長度,再執行上面的ping命令。從1400到1472之間多試幾次,就能找到合適的資料包長度了。把資料包長度加上資料包頭28位元組,就得到MTU的值。 如果檢測到網關的MTU值是1500,不需要修改。 如果網關有防火牆ping不通,可以試試直接把MTU設為1400。 如何修改原生MTU修改方法如下:Windows平台下1、運行regedit2、開啟:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces3、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、使用管理員權限運行cmd2、使用netsh interface ipv4 show subinterfaces命令看看MTU以及本地串連名稱。3、使用netsh interface ipv4 set subinterface "本地串連" mtu=1000 store=persistent(註:這裡的串連名是你使用上面命令看到的MTU值對應的這個串連名,他在右邊顯示。)附:1、此方法不用重啟;2、如是ipv6就將上面的ipv4改成ipv6Linux下可使用如下命令修改 需要root許可權ifconfig網卡MTU值如 ifconfig eth0 mtu 1460MaxMTU是最大的TCP/IP傳輸單元,在TCP/IP協議中,將要傳輸的資料分成較小的組進行傳輸,每個組的大小為576位元組。Windows預設的位元組為1500,這是乙太網路的分組標準。ADSL使用的 PPPoE略小於這個數值,一般為1492。而某些網站採用的MaxMTU大於1492,所以,可能導致某些網頁不能訪問。修改Windows預設的MaxMTU可以解決這個問題。不論是 PC機上安裝的PPPoE軟體或者是內建在Modem的 PPPoE軟體,在使用中都有可能遇到這個問題。 如果使用路由器出現此種情況, 請在防火牆配置 => 基本設定 裡, 將MTU改為手工, 設定為 1492 即可. 那如何確定路由器從ISP獲得的 MTU 為 1500, 請見附件圈出的位置.網路中一些常見鏈路層協議MTU的預設數值如下:FDDI協議:4352位元組乙太網路(Ethernet)協議:1500位元組PPPoE(ADSL)協議:1492位元組X.25協議(Dial Up/Modem):576位元組Point-to-Point:4470位元組如果在IP層要傳輸一個資料報比鏈路層的MTU還大,那麼IP層就會對這個資料報進行分區。一個資料報會被分為若干片,每個分區的大小都小於或者等於鏈路層的MTU值。當同一網路上的主機互相進行通訊時,該網路的MTU對通訊雙方非常重要。但當主機間要通過很多網路才能通訊時,對通訊雙方最重要的是通訊路徑中最小的MTU,因為在通訊路徑上不同網路的鏈路層MTU不同。通訊路徑中最小的MTU被稱為路徑MTU。 ------------------------
The ipv6 mtu of interface 0 is 3100:
awang@awangdevpc:/tmp$ sudo tcpdump -ni eth0 -evvv icmp6
09:22:22.394905 f0:de:f1:fb:98:8b > 00:21:27:ac:f1:53, ethertype IPv6 (0x86dd), length 3110: (hlim 64, next-header Fragment (44) payload length: 3056) 1234::60ef:4cde:b1a1:d87e > 1234::2: frag (0xe5fc7cc4:0|3048) ICMP6, echo request, length 3048, seq 1
09:22:22.394934 f0:de:f1:fb:98:8b > 00:21:27:ac:f1:53, ethertype IPv6 (0x86dd), length 2022: (hlim 64, next-header Fragment (44) payload length: 1968) 1234::60ef:4cde:b1a1:d87e > 1234::2: frag (0xe5fc7cc4:3048|1960)
09:22:22.396538 00:21:27:ac:f1:53 > f0:de:f1:fb:98:8b, ethertype IPv6 (0x86dd), length 3110: (hlim 64, next-header Fragment (44) payload length: 3056) 1234::2 > 1234::60ef:4cde:b1a1:d87e: frag (0x249da4f6:0|3048) ICMP6, echo reply, length 3048, seq 1
09:22:22.396544 00:21:27:ac:f1:53 > f0:de:f1:fb:98:8b, ethertype IPv6 (0x86dd), length 2022: (hlim 64, next-header Fragment (44) payload length: 1968) 1234::2 > 1234::60ef:4cde:b1a1:d87e: frag (0x249da4f6:3048|1960)
1. Algorithm:
1> Is the biggest integer which is smaller than 3100.
2> could be devided by 8.
Since "3096" match the rule, so use it in IP layer to fragment.
2. Then use the "3096" to caculate other length:
3> Ethernet layer length : add the ethernet header length "14", the total length which is printed in ethernet layer is "3110".
4> IP layber payload: Since the IP layber of IPV4 is 40, so the printed payload is 3056.
5> ICMP length : And the ICMP tyoe of IPV6 is 8, so the printed ICMP payload is 3048.
------------------------------------------------------
ipv4 mtu:
If set the ipv4 mtu of interface 0 to "1500", then ping an IP address whihc is directlly connected, then use tcpdump:
awang@awangdevpc:/tmp$ sudo tcpdump -ni eth0 -evvv icmp
09:39:53.721760 00:21:9b:58:ca:8f > 00:90:7f:95:70:98, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 8113, offset 0, flags [+], proto ICMP (1), length 1500)
172.26.0.183 > 172.26.0.1: ICMP echo request, id 4321, seq 1, length 1480
09:39:53.721778 00:21:9b:58:ca:8f > 00:90:7f:95:70:98, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 8113, offset 1480, flags [+], proto ICMP (1), length 1500)
172.26.0.183 > 172.26.0.1: icmp
09:39:53.721781 00:21:9b:58:ca:8f > 00:90:7f:95:70:98, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 8113, offset 2960, flags [+], proto ICMP (1), length 1500)
172.26.0.183 > 172.26.0.1: icmp
09:39:53.721784 00:21:9b:58:ca:8f > 00:90:7f:95:70:98, ethertype IPv4 (0x0800), length 602: (tos 0x0, ttl 64, id 8113, offset 4440, flags [none], proto ICMP (1), length 588)
172.26.0.183 > 172.26.0.1: icmp
09:39:53.722909 00:90:7f:95:70:98 > 00:21:9b:58:ca:8f, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 10621, offset 0, flags [+], proto ICMP (1), length 1500)
172.26.0.1 > 172.26.0.183: ICMP echo reply, id 4321, seq 1, length 1480
09:39:53.723153 00:90:7f:95:70:98 > 00:21:9b:58:ca:8f, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 10621, offset 1480, flags [+], proto ICMP (1), length 1500)
172.26.0.1 > 172.26.0.183: icmp
09:39:53.723161 00:90:7f:95:70:98 > 00:21:9b:58:ca:8f, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 10621, offset 2960, flags [+], proto ICMP (1), length 1500)
172.26.0.1 > 172.26.0.183: icmp
09:39:53.723402 00:90:7f:95:70:98 > 00:21:9b:58:ca:8f, ethertype IPv4 (0x0800), length 602: (tos 0x0, ttl 64, id 10621, offset 4440, flags [none], proto ICMP (1), length 588)
172.26.0.1 > 172.26.0.183: icmp
1. Algorithm:
1> Is the biggest integer which is smaller than 1500.
2> could be devided by 4.
Since "1500" match the rule, so use it in IP layer to fragment.
2. Then use the "3096" to caculate other length:
Ethernet layer length : Add the ethernet header length "14", the total length which is printed in ethernet layer is "1514".