我正在试验涉及第 6 个(6-over-4)路由器的 IPv6 路由,我注意到当我使用足够小的数据包大小以适合在以太网上运行本机 IPv6 的路由段时,但如果数据包足够大,无法容纳 IPv6 封装在 IPv4 中的路由段(即,介于 1481 和 1500 字节之间),则数据包(可以理解)不会通过路由,除非它被分段。一旦响应主机从路由一侧的第 6 个路由器接收到数据包太大错误,它就会开始对其答复进行分段,然后继续这样做一段时间。
不过,由于 ICMPv6 是无状态的,这对我来说意味着 Linux 在某处有一个表,用于保存目标主机的数据包太大消息中的 MTU 值一段时间。它是否正确?如果是的话,我可以以某种方式查看这张表吗?我一直在查看该ip
命令的各个子命令,但找不到类似的东西。该表是用于 UDP 等协议的,还是专用于 ICMPv6 的?
答案1
当发现的 MTU 低于可到达目标的接口上的 MTU 时,Linux 会缓存通过路径 MTU 发现 (RFC 1191) 了解的远程目标的 MTU。
要查看缓存,可以使用“ip route show cache”,例如:
me@server:~$ ip -6 route show cache
1234:8108:1111:111:1111:1111:ff38:57be via fe80::8243:abcd:4216:a4c0 dev eno12399np0 metric 1024 expires 35sec mtu 1280 hoplimit 64 pref medium
me@server:~$ ip route show cache
1.2.3.4 via 192.0.2.1 dev eno12399np0
cache expires 154sec mtu 1420
答案2
在 Linux 中(我相信在其他地方),MTU 是为每个接口配置的,而不是为每个远程主机配置的。请通过运行来检查
ip a
这将显示每个接口的 MTU 编号:
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp6s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
inet 10.0.42.23/24 brd 10.0.42.255 scope global enp8s0
valid_lft forever preferred_lft forever
在我的例子中,lo
MTU 为 65536 字节,enp6s1
有 1500 字节。