毫无疑问,ifconfig配置的MTU会影响Tx ip碎片,我没有更多的cmets。
但是对于 Rx 方向,我发现参数是否影响传入的 IP 数据包,这取决于。不同的制造商表现不同。
我测试了手头的所有设备,发现以下3个案例。
测试用例:
Device0 eth0 (192.168.225.1, mtu 2000)Device1 eth0
(192.168.225.34, mtu MTU_SIZE)
在 Device0 上 ping 192.168.225.34 -s ICMP_SIZE,
检查 MTU_SIZE 如何影响 Device1 的 Rx。
案例1:
Device1 = 带有 Intel I218-LM 的 Linux 4.4.0:
当 MTU_SIZE=1500 时,ping 在 ICMP_SIZE=1476 时成功,在 ICMP_SIZE=1477 及以上时失败。好像有个PRACTICAL MTU=1504 (20B(IP header)+8B(ICMP header)+1476B(ICMP data))。
当 MTU_SIZE=1490 时,在 ICMP_SIZE=1476 时 ping 成功,在 ICMP_SIZE=1477 及以上时失败,行为与 MTU_SIZE=1500 相同。
当 MTU_SIZE=1501 时,在 ICMP_SIZE=1476、1478、1600、1900 时 ping 成功。似乎将 MTU_SIZE 设置为 >1500 后开启巨型帧,不再有 1504 限制。
案例2:
Device1 = Linux 3.18.31 和 Qualcomm Atheros AR8151 v2.0 千兆以太网:
当 MTU_SIZE=1500 时,ping 在 ICMP_SIZE=1476 时成功,在 ICMP_SIZE=1477 及以上时失败。
当 MTU_SIZE=1490 时,ping 在 ICMP_SIZE=1466 时成功,在 ICMP_SIZE=1467 及以上时失败。
当 MTU_SIZE=1501 时,ping 在 ICMP_SIZE=1477 时成功,在 ICMP_SIZE=1478 及以上时失败。
当 MTU_SIZE=500 时,ping 在 ICMP_SIZE=476 时成功,在 ICMP_SIZE=477 及以上时失败。
当 MTU_SIZE=1900 时,ping 在 ICMP_SIZE=1876 时成功,在 ICMP_SIZE=1877 及以上时失败。
这个案例的行为与 Edward Thomson 所说的完全一样,只是在我的测试中 PRACTICAL MTU=MTU_SIZE+4。
案例 3:
Device1 = Linux 4.4.50 with Raspberry Pi 2 Module B ETH:
当 MTU_SIZE=1500 时,ping 在 ICMP_SIZE=1472 时成功,在 ICMP_SIZE=1473 及以上时失败。所以有一个 PRACTICAL MTU=1500 (20B(IP header)+8B(ICMP header)+1472B(ICMP data)) 在那里工作。
当 MTU_SIZE=1490 时,行为与 MTU_SIZE=1500 相同。
当 MTU_SIZE=1501 时,行为与 MTU_SIZE=1500 相同。
当 MTU_SIZE=2000 时,行为与 MTU_SIZE=1500 相同。
当 MTU_SIZE=500 时,行为与 MTU_SIZE=1500 相同。
这个案例的行为与 Ron Maupin 在Why MTU configuration doesn't take effect on receiving direction? 中所说的完全一样。
总而言之,在现实世界中,设置 ifconfig mtu 后,
Rx IP 包有时会在超过 1504 时被丢弃,无论您设置什么 MTU 值(启用巨型帧除外)。
有时,当超过您在接收设备上设置的 MTU+4 时,Rx IP 包会被丢弃。
Rx IP 包有时会在超过 1500 时被丢弃,无论您设置什么 MTU 值。
... ...