我正在编写一个通过TCP传输程序的文件。
我想在IP
上设置do not fragment标志在套接字上,这就是我想要做的事情:
int val = 1;
setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
但Mac OS上似乎无法使用IP_DONTFRAG
。我错过了什么吗?还是我忘了把它正确包括在内?
如果有人知道,请提前致谢
- 萨姆
答案 0 :(得分:2)
答案 1 :(得分:1)
DF位通常由具有TCP连接的操作系统自动用于path MTU (PMTU) discovery。如果有的话,你可能有一个套接字选项来禁用PMTU发现,这将导致永远不会设置DF(它是linux上的IP_MTU_DISCOVER套接字选项)。如果启用PMTU发现,则会产生始终设置DF的效果。
在逐个数据包的基础上设置/取消设置是没有意义的,因为您使用TCP和TCP操作段而不是数据包。如果要设置数据包级别的东西,则需要使用较低层协议。
答案 2 :(得分:0)
通常在所有TCP数据包上设置Don't Fragment
位。你没有必要做任何特殊的事情来实现这一点。
答案 3 :(得分:0)
在/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 */