接口 MTU 与“ip link show”输出中看到的不同

接口 MTU 与“ip link show”输出中看到的不同

我有两台直接连接的电脑,如下所示:

PC1[eth1] <-> [eth0]PC2

eth1接口上的 MTUPC1为 9000 字节。eth0接口上的 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接口 MTU 为 4210(4182 + 8 ICMP 标头 + 20 IPv4 标头)字节,而不是 2000 字节。eth0in 的内核驱动程序PC2e1000e.

如何解释这种行为?

答案1

这就是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,以确保广播域中的所有其他发言者实际上都可以接收到此数据包,从而在出现以下情况时根本无法建立邻接关系:配置错误,从而让您更容易发现问题。

相关内容