在 Linux 机器上临时禁用/启用 PMTU 发现的正确方法是什么?

在 Linux 机器上临时禁用/启用 PMTU 发现的正确方法是什么?

我有一些 pcap 包含大于标准以太网 MTU 大小 1500B 的数据包。我搜索了相关内容,找到了指向巨型帧的引用。我现在明白,由于我使用的是支持发送巨型帧(最高 9k)的 GBE 网络,因此我的 Debian 衍生产品上的 TCP/IP 堆栈将自动调整并使用如此巨大的帧大小(PMTU 发现)这真是太棒了!

但是,我希望对该功能的自动启用进行一些控制。具体来说,我希望确保在捕获 pcap 时,它被暂时禁用,因此所有捕获的数据包都在 1500B 以下。我需要确保这一点,因为我的基于 tcpreplay 的 pcap 重放框架在看到巨型帧时会失败。Tcpreplay 有一个增强请求,支持分片IP包>MTU以启用发送巨型帧。但这是低优先级的票证,可能需要一些时间才能解决。

我阅读了有关手动调整 PMTU 发现行为的方法,并发现 /proc 文件系统下的“ip_no_pmtu_disc”sysctl 变量可能很方便。我在客户端和服务器系统上都启用了它(尽管我认为在其中任何一个上启用它就足够了),并捕获了一些 pcap。但它们仍然有大于 1500B 的数据包。我的网络接口上的默认 MTU 已经设置为 1500B,并且由于 PMTU 发现被禁用,我认为一切都会正常进行。但是,我遗漏了一些东西。我将不胜感激任何参考/指针。

注意:我没有重启系统,因为我所做的 /proc 调整不会持续。我也无法在每次需要重放 pcap 时重启系统。

答案1

您看到的是没有巨型帧的迹象。可能是您的 NIC 在嗅探数据后将其分割成较小的数据包。您可能在 VM 上进行测试?Linux 不会对传出数据包使用比接口上配置的更大的 MTU。如果您的 MTU 为 1500,那么这是最大值。

答案2

听起来你可能启用了 TSO 和 GSO。通常,MSS 由 MTU 标头决定,并且也会向连接的两端通告,这样可以使用两者中最小的值来建立连接,但是,如果启用了 tso 和 gso,linux 将忽略 mtu/mss 并发送大量数据,这些数据将被分割。

相关内容