我正在Linux中进行路径MTU发现的一些实验。据我所知,从RFC 1191中,如果路由器接收到一个非零DF位的数据包,并且数据包无法在没有分段的情况下发送到下一个主机,那么路由器应丢弃数据包并将ICMP消息发送到初始发件人。
我在计算机上创建了几个VM,并按以下方式链接它们:
VM1 (192.168.100.2)
R1 (192.168.100.1,
192.168.150.1)
R2 (192.168.150.2,
192.168.200.1)
VM2 (192.168.200.2)
Rx - 是安装了Linux的虚拟机,它们有两个带静态路由的网络接口。从V1 Ping V2并反之亦然。
traceroute from 192.168.100.2 to 192.168.200.2 (192.168.200.2)
1 192.168.100.1 (192.168.100.1) 0.437 ms 0.310 ms 0.312 ms
2 192.168.150.2 (192.168.150.2) 2.351 ms 2.156 ms 1.989 ms
3 192.168.200.2 (192.168.200.2) 43.649 ms 43.418 ms 43.244 ms
tracepath 192.168.200.2
1: ubuntu-VirtualBox.local 0.211ms pmtu 1500
1: 192.168.100.1 0.543ms
1: 192.168.100.1 0.546ms
2: 192.168.150.2 0.971ms
3: 192.168.150.2 1.143ms pmtu 750
3: 192.168.200.2 1.059ms reached
段100.x和150.x具有MTU 1500.段200.x具有MTU 750。
我正在尝试发送启用了DF的UDP数据包。事实上,在数据包大小超过750的情况下,VM1根本不发送数据包(我收到了send()调用的EMSGSIZE错误)。
但是我期望大小超过1500的数据包的这种行为。我希望VM1将大小介于750和1500之间的数据包发送到R1,并且R1(或R2)丢弃此类数据包并返回ICMP数据包到VM1。但这不会发生。
有两个问题:
1)为什么?
2)是否可以根据RFC 1191设置我的虚拟网络以接收ICMP数据包?
感谢。
答案 0 :(得分:6)
VM1可能缓存了PMTU信息。默认情况下,这些缓存条目的超时为10分钟。您可以通过写入/ proc / sys / net / ipv4 / route / mtu_expires(seconds)来更改超时。
对于您的实验,请尝试在发送1500字节数据包之前刷新缓存(删除PMTU缓存):
echo "0" > /proc/sys/net/ipv4/route/flush
您将收到一条需要ICMP碎片的消息,该消息将再次填充此目的地的PMTU条目!因此,在重试实验之前,您需要继续刷新此缓存。
答案 1 :(得分:0)
使用ping6时遇到同样的问题, 因为 / proc / sys / net / ipv6 / conf / default / mtu 是1280。 / proc / sys / net / ipv4 / route / min_pmtu 默认为552。
所以你可以修改里面的值。 您可以使用 -M 选项。你不会收到EMSGSIZE错误。
dissolve=TRUE