当我 ping 一个远程站点,该站点设置了 DF 位,并且数据包大小对于我的路由器来说太大时,路由器会发送第一个 ICMP“需要分片”消息。之后,该消息来自我的本地主机。
Netstat -rC(在 Linux 上)允许我查看路由表缓存,但是
1) 似乎在名为 MSS 的列下显示 MTU(我预计该列是该链路的较低 TCP MSS)
2)始终显示值为 1500
我的本地主机必须将 PMTU 缓存在某处,以便它可以生成需要分片的消息。但我如何才能看到它呢?
下面是我的机器上的一个例子(netstat 上的 -n 禁止反向 DNS 查找):
[root@vbcentos ~]# ping -c 4 -M do -s 1431 212.58.244.69
PING 212.58.244.69 (212.58.244.69) 1431(1459) bytes of data.
From 217.155.134.6 icmp_seq=1 Frag needed and DF set (mtu = 1458)
From 217.155.134.4 icmp_seq=2 Frag needed and DF set (mtu = 1458)
From 217.155.134.4 icmp_seq=2 Frag needed and DF set (mtu = 1458)
From 217.155.134.4 icmp_seq=2 Frag needed and DF set (mtu = 1458)
--- 212.58.244.69 ping statistics ---
1 packets transmitted, 0 received, +4 errors, 100% packet loss, time 1002ms
[root@vbcentos ~]# netstat -rCn
Kernel IP routing cache
Source Destination Gateway Flags MSS Window irtt Iface
217.155.134.3 217.155.134.4 217.155.134.4 il 0 0 0 lo
217.155.134.4 212.58.244.69 217.155.134.6 1500 0 0 eth0
217.155.134.4 217.155.134.4 217.155.134.4 l 16436 0 0 lo
217.155.134.3 217.155.134.255 217.155.134.255 ibl 0 0 0 lo
217.155.134.4 212.58.244.69 217.155.134.6 1500 0 0 eth0
217.155.134.6 217.155.134.4 217.155.134.4 il 0 0 0 lo
212.58.244.69 217.155.134.4 217.155.134.4 l 0 0 0 lo
[root@vbcentos ~]#
编辑:根据建议:
ip route get to 212.58.244.69
给出
212.58.244.69 via 217.155.134.6 dev eth1 src 217.155.134.4
cache mtu 1500 advmss 1460 hoplimit 64
这似乎也是错误的,因为 MSS 仅比 mtu 少 40,而 mtu 是接口 mtu,而不是 PMTU
答案1
或许
ip route get to 212.58.244.69
答案2
在 Windows 下,使用 netsh 命令查看保存此信息的“目标缓存”。例如(假设 IPv4):
netsh interface ipv4 show destinationcache
答案3
MSS 应该比 MTU 少 40 字节(不包括 IPv4(20 字节)和 tcp(20)字节标头)。所以这是正确的。
ICMP 分片需要消息由路由器发送,而不是您的服务器。
答案4
对我来说也不起作用。但 对于 IPv6,route get
有用的是显示当前缓存的所有内容。并且显示指定目标的 PMTU。route show cache
ip -6 route show cache
ip -6 route get 2001:470:1:18::3:1280
要测试这一点,请使用此测试页面中的 curl 命令:https://test-ipv6.com/faq_pmtud.html
相关 ip route 文档:http://linux-ip.net/html/tools-ip-route.html#tools-ip-route-show-cache
如果您想要 IPv4 上的 PMTU 替代方案,请查看此 cloudflare 文章:https://blog.cloudflare.com/path-mtu-discovery-in-practice/
其中提到“启用智能 MTU 黑洞检测”,可以通过以下方式(临时)启用:echo 1 > /proc/sys/net/ipv4/tcp_mtu_probing; echo 1024 > /proc/sys/net/ipv4/tcp_base_mss