關於MTU (Maximum transmission unit)

* MTU工作在鏈路層,是網卡傳輸(發送/接受)的數據楨最大長度。
* Ethernet(乙太網)最大MTU是1500,通常也是大部分設備默認值
* 網卡收到的數據楨長度超過該網卡的MTU時:如果數據楨里的IP或ICMP數據包header沒有DF標誌(Don’t Fragment flag),將數據分楨(fragmentation),分楨後第二個及以後的楨中只含有一部分IP header,並且沒有tcp和udp header;否則,丟棄這個數據楨,並且給src ip發送一個「ICMP fragmentation required「並附帶自己的MTU值,src可以根據這個MTU值調整自己發送的數據楨長度。(Path MTU Discovery)。
* 向網卡發送數據時,如果IP數據包長度(header + payload)超過了網卡的MTU,也會進行相同處理。
* TCP協議連接時會協商MSS(maximum segment size ), 本機的MSS是MTU減去ip header減去tcp header長度,最大為1460。取連接雙方MSS的較小值。

IPv4 header長度最小為20
IPV6 header長度最小為40
ICMPv4 header長度為20+8
ICMPV6 header長度為40+8
TCP header長度為20
UDP header長度為8
IP(V4 & V6) payload(數據部分)長度最大為65535,因為header中表示長度部分是兩位元組。

測試鏈路MTU

# 1472是ethernet最大值,因為ICMP header長度28
ping -s 1472 -M do 8.8.8.8

#超出長度會從最後通過的路由器(這裡就是本機網卡地址)返回ICMP錯誤(如果該路由器防火牆禁止ICMP則沒有返回,直接超時無響應)
ping -s 1473 -M do 8.8.8.8
From A.B.C.D icmp_seq=1 Frag needed and DF set (mtu = 1500)
...

然後有個在景德鎮非常流行的奇葩:PPPoE,工作在鏈路層,header佔用8位元組。所以它封裝的Ethernet楨最大就不能超過1492。超過的楨在進入pppoe時就要被分楨。因為TCP協議中MSS協商的存在,理論上,如果你使用pppoe上網(即使是用路由器撥號),將所有電腦的網卡MTU設為1492(默認是1500)可以提高性能,不過實際上沒什麼用。

對於有nf_conntrack模塊的iptables,MTU以及fragmentation是透明的,分楨的數據包會在進入INPUT或OUTPUT鏈前defragmentation重新組裝完整。

查看以及修改MTU:

ip link list

ip link set eth0 mtu 1500

0 Responses to “關於MTU (Maximum transmission unit)”


Comments are currently closed.