Ethernet

介面 MTU 與“ip link show”輸出中看到的不同

  • February 5, 2017

我有兩台 PC 直接連接,如下所示:

PC1[eth1] <-> [eth0]PC2

eth1介面 in上的 MTUPC1為 9000 字節。eth0介面 in上的 MTUPC2為 2000 字節:

root@PC2:~# ip -s link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
   link/ether 80:97:41:ae:f7:c9 brd ff:ff:ff:ff:ff:ff
   RX: bytes  packets  errors  dropped overrun mcast
   170432     696      0       0       0       0
   TX: bytes  packets  errors  dropped carrier collsns
   118126     274      0       0       0       0
root@PC2:~# ip addr show dev eth0                                                                                                                                                                                          
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP group default qlen 1000
   link/ether 80:97:41:ae:f7:c9 brd ff:ff:ff:ff:ff:ff
   inet 192.168.11.30/24 scope global eth0
      valid_lft forever preferred_lft forever
   inet 10.11.12.2/24 scope global eth0:temporary
      valid_lft forever preferred_lft forever
root@PC2:~#

奇怪的是,如果我執行ping -M do -s 4182 -c 1 10.11.12.2in PC1,那麼這個包會被接收PC2並發送碎片回复:

root@PC1:~# ping -M do -s 4182 -c 1 10.11.12.2
PING 10.11.12.2 (10.11.12.2) 4182(4210) bytes of data.
4190 bytes from 10.11.12.2: icmp_seq=1 ttl=64 time=0.397 ms

--- 10.11.12.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.397/0.397/0.397/0.000 ms
root@PC1:~#

我希望 PC2 在超過其 MTU 時靜默丟棄該幀。但是,ping -M do -s 4183 -c 1 10.11.12.2沒有收到回复。這看起來PC2具有 4210(4182 + 8 ICMP 標頭 + 20 IPv4 標頭)字節而不是 2000 字節的介面 MTU。eth0in的核心驅動程序PC2e1000e.

如何解釋這種行為?

這就是 MTU(最大傳輸單元)和 MRU(最大接收單元)之間的區別。

通常人們希望 MTU(和 MRU)在單個廣播域的所有成員中設置相同,因此差異並不重要,但在您錯誤配置的設置下,它確實很重要。

我希望 PC2 在超過其 MTU 時靜默丟棄此幀。

您已經告訴 PC2 在傳輸時不要超過 2000 字節的數據包,但這並不禁止它接收更大的數據包。Postel 原則可能在這裡起作用(這取決於驅動程序的設計方式)。

但是,ping -M do -s 4183 -c 1 10.11.12.2沒有收到回复。

聽起來這個額外的字節將其置於其 MRU 之上。由於您沒有明確配置任何 MRU,因此此大小可能是硬體限製或當 MTU 設置為 2000 時如何配置網路介面硬體的內部緩衝區的結果。

跨單個廣播域正確配置您的 MTU,您將不會遇到此問題。一些路由協議,如 IS-IS,有意將其 Hello 消息填充到 MTU,以確保廣播域中的所有其他發言者都可以實際接收到此數據包,從而在配置錯誤,從而使您更容易發現問題。

引用自:https://unix.stackexchange.com/questions/342290