linux - 在每个套接字的基础上调整 MTU?

标签 linux networking linux-kernel tcp mtu

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

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

如果目前没有办法做到这一点,您是否知道在 linux 内核中的何处 Hook /打补丁以实现这种可能性?

谢谢。

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

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

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

最佳答案

如果创建套接字后在传出数据包上设置了 DF,您可能会幸运地欺骗(注入(inject))ICMP 分段需要的消息返回给自己,直到您最终获得所需的 MTU。相当丑陋,但取决于你有多绝望,它可能是合适的。

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

另一种方法,如果它只是您关心的 TCP 数据包,您可能会幸运地使用套接字选项 TCP_MAXSEG 或 TCPMSS 目标(如果这适合您的问题)。

对于 UDP 或原始数据包,您可以自由地send() 数据包,只要您喜欢!

更新:

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

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

iptables clamp mss不过,对于通过此“VPN”的 TCP 来说,这是一个很好的解决方案,尤其是当您似乎已经广泛使用 iptables 时。

关于linux - 在每个套接字的基础上调整 MTU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165403/

相关文章:

c - -pie 究竟做了什么?

linux - modprobe : ERROR: could not insert 'tun' : Unknown symbol in module, 或未知参数(参见 dmesg)

linux - 我们如何根据系统 CPU(而不是整体或用户 CPU)对 Linux 上的线程进行排序?

linux - 用户内核模块 "not found in directory"?

linux - 系统重启后 Linux 中的服务自动启动

c - 使用 poll select 或 epoll 了解 udp 数据包大小

networking - 谷歌云如何计算导出和入口流量?

ios - Spaceteam 如何运作?

java - 获取网络中某个 IP 地址的所有主机名

linux - 内核加载地址和入口点有什么区别?