Mac OS中的IP不分片位

5

我正在编写一个基于TCP的文件传输程序。

我想在IP上设置不分段标志。

在套接字上,这就是我想要做的:

int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));

然而,在 Mac OS 上似乎没有 IP_DONTFRAG 可用。我有什么遗漏吗?或者是我没有正确地包含它?

如果有人知道的话,请提前感谢。

--Sam

4个回答

2

不幸的是,该线程中的下一条消息指出,这仅适用于原始套接字,而这并不是发帖者所要求的:http://lists.apple.com/archives/macnetworkprog/2006/Jul/msg00017.html - NPE
好的,我现在明白了。谢谢。但是接下来的回复表明可能没有其他方法可以做到这一点。 - jcomeau_ictx
我看到了,但是我希望避免使用原始套接字。我认为这一定是可能的,因为当我在我的网络上捕获数据包时,OS X使用的TCP机制本身具有该标志。我猜他们这样做是为了获得一些速度,并且它也适合于我目前的发送机制。 - thewormsterror

1

看起来在 /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers 这里它被称为 IP_DF

netinet/ip.h
99:#define IP_DF 0x4000                    /* dont fragment flag */
netinet6/in6.h
547:#define IPV6_DONTFRAG           62 /* bool; disable IPv6 fragmentation */

1

DF位通常用于操作系统通过TCP连接自动进行路径MTU(PMTU)发现。如果需要,您可以使用套接字选项禁用PMTU发现,这将导致永远不设置DF(在Linux上是IP_MTU_DISCOVER套接字选项)。如果保留PMTU发现,则会始终设置DF。

按数据包设置/取消设置没有意义,因为您正在使用TCP,而TCP是基于段而不是数据包运作的。如果要设置数据包级别的内容,您需要使用更低层次的协议。


1
对于类似 VPN 即 TCP-over-TCP 的情况,这并不正确。 - JamesWebbTelescopeAlien

0

不分片位通常在所有TCP数据包上设置。您无需进行任何特殊操作即可实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接