網路協議中的最大傳輸單元MTU

2021-08-21 04:27:06 字數 3362 閱讀 9297

mtu是最大傳輸單元,它指的是某一層上面所能通過的最大資料報大小,下面是mtu和fragment詳解

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資料報中與分片相關的字段

ip資料報在封裝時, 在ip頭的第8-9個位元組(16bit)中, 存放關於分片的資訊. 其中前3個bit表示分片的狀態, 後13個bit表示當前片斷在分片之前的整塊待封裝的資料報中的偏移量(因為ip資料報的最大可能長度為16bit, 而這13bit無法表示16bit的範圍, 故實際使用時, 偏移量的計算是用這13bit的值乘8(3bit), 以實現表示16bit的範圍).

3.1 不分片標記(df:don't fragment flag)

ip頭第8-9位元組從左往右的第2bit表示當前ip資料報是(1)否(0)不分片, 預設值為0, 就是不不分片, 即允許分片. 因為預設允許分片, 所以我們平常使用ping命令時, 加引數-l 65500 ping一台機器也不會有問題.

3.2 是否有後續分片標記(mf:more fragments flag)

ip頭第8-9位元組從左往右的第3bit表示當前資料報裡的資料是否為某塊資料的最後乙個分片, 若為0, 則說明當前資料報內的資料沒有分片或者是最後乙個分片, 若為1, 則表示後面還有屬於同一塊資料的分片.

4. 用ping命令來驗證

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.

也就是在將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

lpacket 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.

MTU 最大傳輸單元

maximum transmission unit mtu 最大傳輸單元 pppoe的最大接收單元為1492,乙太網最大載荷為1500 octets,pppoe頭為6 octets,ppp協議id為2 octets,所以ppp的mtu最大不能超過1492 ppoe協議要求所有客戶機上的mtu值不超過...

最大傳輸單元MTU

維基百科,自由的百科全書 本條目沒有列出任何參考或 2015年2月25日 維基百科所有的內容都應該可供查證。請協助新增來自可靠 的引用以改善這篇條目。無法查證的內容可能被提出異議而移除。最大傳輸單元 英語 maximum transmission unit 縮寫mtu 是指一種通訊協議的某一層上面所...

關於最大傳輸單元(MTU)的整理

mtu設定不當,可能會導致許多網路問題,如某些網路應用無法使用,某些 無法訪問等。下面是在網上搜尋整理的關於mtu設定的東西,某些可能未作驗證,僅供參考。1.如何確定網路mtu 某些isp接入的mtu可能會比常規使用的mtu小,這時如果設定了過大的mtu,就可能會導致很多服務無法使用的問題。可以通過...