路径MTU发现 - ICMP响应在哪里?

时间:2011-07-22 11:28:10

标签: icmp mtu

我正在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数据包?

感谢。

2 个答案:

答案 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