我试图设置使用UDP发送数据包的DF(不分段标志).
看看Richard Steven的书第1卷Unix网络编程; 套接字网络API,我无法找到如何设置它.
我怀疑我会用setsockopt()来做,但是在第193页的表格中找不到它.
请建议如何做到这一点.
你可以setsockopt()
通过使用IP_DONTFRAG
选项::
int val = 1; setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
这是一个更详细地解释这一点的页面.
对于Linux,您似乎必须使用IP_MTU_DISCOVER
带有值的选项IP_PMTUDISC_DO
(或IP_PMTUDISC_DONT
将其关闭):
int val = IP_PMTUDISC_DO; setsockopt(sd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
我没有测试过这个,只是查看了头文件和一些网页搜索,所以你需要测试它.
至于是否可以设置DF标志的另一种方式:
我发现在我的程序中没有设置"强制DF标志",但
tcpdump
建议它是.有没有其他方法可以设置?
从这个优秀的页面在这里:
IP_MTU_DISCOVER:
设置或接收套接字的"路径MTU发现"设置.启用后,Linux将在此套接字上执行RFC 1191中定义的路径MTU发现.在所有传出数据报上设置了不分段标志.系统范围的默认值由ip_no_pmtu_disc
sysctl
forSOCK_STREAM
套接字控制,在其他所有套接字上禁用.对于非SOCK_STREAM
套接字,用户有责任将数据打包为MTU大小的块,并在必要时进行重新传输.如果设置了此标志(带EMSGSIZE
),内核将拒绝大于已知路径MTU的数据包.
在我看来,您可以使用sysctl
以下方法设置系统范围的默认值:
sysctl ip_no_pmtu_disc
"error: "ip_no_pmtu_disc" is an unknown key"
在我的系统上返回,但它可以设置在你的系统上.除此之外,我不知道setsockopt()
可能影响设置的其他任何事情(除了前面提到的).