![IPV4 路由缓存已从 3.6 版及以上 Linux 内核中删除](https://linux22.com/image/1337966/IPV4%20%E8%B7%AF%E7%94%B1%E7%BC%93%E5%AD%98%E5%B7%B2%E4%BB%8E%203.6%20%E7%89%88%E5%8F%8A%E4%BB%A5%E4%B8%8A%20Linux%20%E5%86%85%E6%A0%B8%E4%B8%AD%E5%88%A0%E9%99%A4.png)
在浏览 3.6 Linux 内核更改日志时,我偶然发现了一封邮件(http://article.gmane.org/gmane.linux.network/238256) 来自 David S Miller 关于在内核中删除 IPV4 路由缓存的问题。我想知道现在 ICMP 重定向、PMTU 功能将如何工作?邮件还提到路由将被预先缓存,但取决于子网掩码的多个路由可以有多个可能的条目,这将如何工作?有人对此有任何想法吗?
谢谢。
答案1
只需阅读实际的补丁。
PMTU 和 ICMP 重定向不是存储在路由缓存中,而是存储在“路由例外”结构中,该结构是路由条目的一部分。对于任何(源、输入接口、tos、目的地、标记),只有一个路由条目被选中。因此,只要路由条目没有更改,路由例外就会一直被使用。
答案2
您可以按如下方式获取有关主机路径 MTU 的详细信息。请注意,必须先填充缓存信息。此测试使用 3.13 Ubuntu 内核执行。我首先验证主机的当前缓存,我尚未与其通信,也没有任何信息:
johnf@mtutest:~$ ip ro get 192.168.3.48
192.168.3.48 dev eth0 src 192.168.1.22
cache
然后我尝试使用大于 MTU 的数据包对其进行 ping(但不要太大,以免数据包必须由操作系统进行分段)。测试时,您可能会错过前几次 ping,但您应该会看到 Frag required 消息。
johnf@mtutest:~$ ping -s 1460 192.168.3.48 -c 10
PING 192.168.3.48 (192.168.3.48) 1460(1488) bytes of data.
From 192.168.2.0 icmp_seq=1 Frag needed and DF set (mtu = 1220)
1468 bytes from 192.168.2.0: icmp_seq=2 ttl=252 time=1973 ms
[...]
--- 192.168.3.48 ping statistics ---
10 packets transmitted, 9 received, +1 errors, 10% packet loss, time 9016ms
rtt min/avg/max/mdev = 95.681/516.815/1973.697/568.969 ms, pipe 2
收到 ICMP MTU 超出消息后,内核应该调整路由缓存以反映路径限制:
johnf@mtutest:~$ ip ro get 192.168.3.48
192.168.3.48 dev eth0 src 192.168.1.22
cache expires 588sec mtu 1220