我正在编写一个基于TCP的文件传输程序。
我想在IP上设置不分段标志。
在套接字上,这就是我想要做的:
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
然而,在 Mac OS 上似乎没有 IP_DONTFRAG
可用。我有什么遗漏吗?或者是我没有正确地包含它?
如果有人知道的话,请提前感谢。
--Sam
我正在编写一个基于TCP的文件传输程序。
我想在IP上设置不分段标志。
在套接字上,这就是我想要做的:
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
然而,在 Mac OS 上似乎没有 IP_DONTFRAG
可用。我有什么遗漏吗?或者是我没有正确地包含它?
如果有人知道的话,请提前感谢。
--Sam
看起来在 /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 */
DF位通常用于操作系统通过TCP连接自动进行路径MTU(PMTU)发现。如果需要,您可以使用套接字选项禁用PMTU发现,这将导致永远不设置DF(在Linux上是IP_MTU_DISCOVER套接字选项)。如果保留PMTU发现,则会始终设置DF。
按数据包设置/取消设置没有意义,因为您正在使用TCP,而TCP是基于段而不是数据包运作的。如果要设置数据包级别的内容,您需要使用更低层次的协议。
不分片
位通常在所有TCP数据包上设置。您无需进行任何特殊操作即可实现此功能。