我想知道是否有任何方法可以调整(在 Linux 系统上)给定套接字的 MTU。 (使 IP 层分段成小于实际设备 MTU 的块)。
当我说对于给定的套接字时,我并不是指在拥有该套接字的应用程序代码中以编程方式,而是在外部,例如通过 sysfs 条目。
如果目前没有办法做到这一点,您是否有关于在 Linux 内核中的何处挂钩/修补以实现这种可能性的想法?
Thanks.
编辑:我到底为什么要这么做?
我正在做一些 Layer3-in-Layer4(例如:通过 TCP 隧道对 IP 及以上进行隧道传输)隧道。与类似 VPN 的解决方案不同,我没有使用虚拟接口来实现这一点。我正在使用 iptables 捕获数据包,以正常方式丢弃它们并将它们写入隧道套接字。
考虑一下大文件传输的情况,所有数据包都被填充到 MTU 大小。当我对它们进行隧道传输时,我增加了一些开销,导致每个原始数据包产生两个隧道数据包,这不是最佳的。
如果创建套接字时在传出数据包上设置 DF,那么您可能会幸运地欺骗(注入)一条需要 ICMP 分段的消息,直到您最终获得所需的 MTU。相当丑陋,但取决于你有多绝望,这可能是合适的。
例如,您可以使用 iptables 规则生成这些数据包,因此匹配和发送非常简单并且在您的应用程序外部。看起来 iptables 的 REJECT 目标没有需要碎片的拒绝,但添加一个可能不会太棘手。
另一种方法,如果您只关心 TCP 数据包,那么您可能会幸运地使用套接字选项 TCP_MAXSEG 或 TCPMSS 目标(如果这适合您的问题)。
对于 UDP 或 raw,您可以自由选择send()
您想要的小包!
Update:
基于“我为什么要这样做?”答案,如果未设置 DF,则似乎会对数据包进行分段,或者提高 ICMP“需要分段”,而丢弃实际上是正确的解决方案。
这是一个更“正常”的路由器会做的事情,只要防火墙不吃掉 ICMP 数据包,那么它在所有情况下都会表现得正常,而回顾性地改变事情会导致奇怪的行为。
iptables钳位MSS不过,对于这个“VPN”上的 TCP 来说,这是一个相当好的修复方法,特别是当您似乎已经广泛使用 iptables 时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)