我打算在Go中设置“不要片段化”标志位,与C中的this post相同。我检查了constant list,但没有找到此选项。那么Go中相应的选项是什么?
提前致谢!
最佳答案
首先,您应该知道TCP确实不喜欢IP片段。大多数(如果不是全部)主要实现都是通过使用路径MTU发现来避免TCP分段的。
TL; DR是包含TCP段的典型IP数据包设置了DF位。您可以(并且应该)尝试一下。在这里,我正在嗅探我的机器和stackoverflow.com之间的几秒钟的流量:
% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com
<wait a few seconds>
% tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c
186 0x00000002
0x02表示DF位置1。我承认,在其他捕获中,我看到IP数据包中偶尔有TCP段,但没有DF位。我怀疑rfc1191对此有一个解释。
现在回到您的问题,我认为没有一种可移植的方法来设置DF位,这是一个更广泛的问题(甚至没有POSIX便携式方法)。
相关软件包中(可能)有一个逃生阴影,供您在golang.org/x/sys下实现。
例如,在支持
IP_DONTFRAG
(例如FreeBSD)的Unix上,可以使用 unix.SetsockoptInt
并挖掘相关的常数值。在Linux上没有
IP_DONTFRAG
,就像从the question you linked中发现的那样。解决方法似乎是使用IP_MTU_DISCOVER
,它恰巧可以作为a constant in the unix package来使用。您可以使用相同的unix.SetsockoptInt
进行设置。