1. 程式人生 > >關於MTU最大傳輸單元的百科

關於MTU最大傳輸單元的百科

通訊術語 最大傳輸單元(Maximum Transmission Unit,MTU)是指一種通訊協議的某一層上面所能通過的最大資料包大小(以位元組為單位)。最大傳輸單元這個引數通常與通訊介面有關(網路介面卡、串列埠等)。

因為協議資料單元的包頭和包尾的長度是固定的,MTU越大,則一個協議資料單元的承載的有效資料就越長,通訊效率也越高。MTU越大,傳送相同的使用者資料所需的資料包個數也越低。MTU也不是越大越好,因為MTU越大, 傳送一個數據包的延遲也越大;並且MTU越大,資料包中 bit位發生錯誤的概率也越大。MTU越大,通訊效率越高而傳輸延遲增大,所以要權衡通訊效率和傳輸延遲選擇合適的MTU。以乙太網傳送IPv4報文為例。MTU表示的長度包含IP包頭的長度,如果IP層以上的協議層傳送的資料報文的長度超過了MTU,則在傳送者的IP層將對資料報文進行分片,在接收者的IP層對接收到的分片進行重組。這裡舉一個具體的例子說明IP包分片的原理。乙太網的MTU值是1500 bytes,假設傳送者的協議高層向IP層傳送了長度為3008 bytes的資料報文,則該報文在新增20 bytes的IP包頭後IP包的總長度是 3028 bytes,因為3028 > 1500,所以該資料報文將被分片,分片過程如下:1. 首先計算最大的IP包中IP淨荷的長度 =MTU-IP包頭長度=1500-20= 1480 bytes。2. 然後把3028 bytes按照1480 bytes的長度分片,將要分為3片,3028= 1480+1480+68。3. 最後傳送者將為3個分片分別新增IP包頭,組成3個IP包後再發送,3個IP包的長度分別為1500 bytes、1500 bytes和 88 bytes。從以上分片例子可以看出第一、二個分片包組成的IP包的長度都等於MTU即1500 bytes。在網路通訊中,需要儘量避免發生分片和重組,因為分片重組對網路效能影響較大。資料包傳送時選擇合適的MTU大小對提高通訊效能很有必要。MTU大小的選擇有協議協商方式,通過全路徑的MTU發現機制,找到整條路徑的最小MTU(也就是路徑MTU),然後報文傳送式小於等於路徑MTU,這就避免了資料傳輸過程中產生分片,從而提高資料轉發效能。MTU的協議發現機制由於安全等方面的原因,並不能總是生效,這時候就需要根據網路的特性選擇合理的MTU。如果在報文傳送過程中分片是不可避免的,那麼要想辦法讓重組儘量在終端進行,避免在轉發路徑中進行。

路徑最大傳輸單元

因特網協議中,一條因特網傳輸路徑的“路徑最大傳輸單元”被定義為從源地址到目的地址所經過“路徑”上的所有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。