5

我正在 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(我收到 send() 调用的 EMSGSIZE 错误),VM1 根本不会发送数据包。

但是,我希望大小超过 1500 的数据包会出现这种行为。并且我希望 VM1 将大小在 750 到 1500 之间的数据包发送到 R1,并且 R1(或 R2)丢弃此类数据包并将 ICMP 数据包返回给 VM1 . 但这不会发生。

有两个问题:

1)为什么?

2) 是否可以根据 RFC 1191 设置我的虚拟网络以接收 ICMP 数据包?

谢谢。

4

2 回答 2

8

VM1 可能缓存了 PMTU 信息。默认情况下,这些缓存条目的超时时间为 10 分钟。您可以通过写入 /proc/sys/net/ipv4/route/mtu_expires(秒)来更改超时。

对于您的实验,请在发送 1500 字节数据包之前尝试刷新缓存(删除 PMTU 缓存):

echo "0" > /proc/sys/net/ipv4/route/flush 

您将收到一条需要 ICMP 分段的消息,该消息将再次填充此目的地的 PMTU 条目!因此,在重试实验之前,您需要不断刷新此缓存。

于 2011-07-26T20:47:53.963 回答
0

使用 ping6 时遇到同样的问题,因为/proc/sys/net/ipv6/conf/default/mtu为 1280。而/proc/sys/net/ipv4/route/min_pmtu默认为 552。

所以你可以修改里面的值。您可以使用-M选项。您不会收到 EMSGSIZE 错误。

-M pmtudisc_opt
          Select  Path MTU Discovery strategy.  pmtudisc_option may be 
           either do (prohibit fragmentation, even local one), want (do 
           PMTU discovery, fragment locally when packet size
           is large), or dont (do not set DF flag).
于 2018-04-11T03:22:39.710 回答