3

我想知道是否有任何方法可以调整(在 linux 系统上)给定套接字的 MTU。(使 IP 层分成比实际设备 MTU 更小的块)。

当我说给定套接字时,我并不是指以编程方式在拥有该套接字的应用程序的代码中,而是在外部,例如通过 sysfs 条目。

如果目前没有办法做到这一点,您对在 linux 内核中的何处挂钩/修补以实现这种可能性有任何想法吗?

谢谢。

编辑:我到底为什么要这样做?

我正在做一些Layer3-in-Layer4(例如:通过TCP隧道隧道IP及以上)隧道。与类似 VPN 的解决方案不同,我没有使用虚拟接口来实现这一点。我正在使用 iptables 捕获数据包,以正常方式丢弃它们并将它们写入隧道套接字。

考虑一个大文件传输的情况,所有数据包都被填充到 MTU 大小。当我隧道它们时,我增加了一些开销,导致每个原始数据包产生两个隧道数据包,它不是最佳的。

4

2 回答 2

2

如果创建了套接字,以便在传出数据包上设置 DF,那么您可能会在欺骗(注入)ICMP 分段所需消息方面取得一些运气,直到您最终获得所需的 MTU。相当丑陋,但取决于你有多绝望,它可能是合适的。

例如,您可以使用 iptables 规则生成这些数据包,因此匹配和发送很简单,并且在您的应用程序之外。看起来 iptables 的 REJECT 目标没有需要的碎片拒绝,但添加一个可能不会太棘手。

另一种方法,如果它只是你关心的 TCP 数据包,你可能会对套接字选项 TCP_MAXSEG 或 TCPMSS 目标有一些运气,如果这适合你的问题。

对于 UDP 或 raw,您可以随意发送send()数据包!

更新:

基于“我为什么要这样做?” 答案,如果未设置 DF 或提高 ICMP“需要分段”,似乎将数据包分段,并且丢弃实际上是正确的解决方案。

这是一个更“正常”的路由器会做的事情,并且如果防火墙不吃 ICMP 数据包,那么它将在所有情况下都表现良好,而回顾性地改变事情是导致奇怪行为的秘诀。

不过,iptables钳制 mss是通过此“VPN”对 TCP 的一个很好的修复,尤其是当您似乎已经在广泛使用 iptables 时。

于 2010-11-12T14:09:37.643 回答
0

MTU 是链接的属性,而不是套接字。它们属于堆栈的不同层。也就是说,TCP 在三次握手期间执行路径 MTU 发现,并非常努力地避免碎片。您将很难让 TCP 发送片段。使用 UDP,最简单的方法是在接口上强制使用一些较小的 MTU ifconfig(8),然后发送大于该值的数据包。

于 2010-11-12T14:16:45.087 回答