如何在Go中为TCP数据包设置“do not fragment”标志位?

时间:2016-06-11 08:18:35

标签: sockets go tcp

我打算在Go中设置“do not fragment”标志位,与它在C中的this post相同。我检查了constant list但是我没有找到这个选项。那么Go中的相应选项是什么?

提前致谢!

1 个答案:

答案 0 :(得分:5)

  

如何在Go?

中为TCP数据包设置“do not fragment”标志位

首先你应该知道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。我在其他捕获中承认我在没有DF位的IP​​数据包中偶尔看到TCP段;我怀疑rfc1191对此有解释。

现在回到你的问题,我认为没有可移植的方法来设置DF位,这是一个更普遍的问题(甚至没有POSIX可移植方式)。 在golang.org/x/sys下,您可以在相关包中找到一个逃生舱。

例如,在支持IP_DONTFRAG的Unix上,例如FreeBSD,可以使用unix.SetsockoptInt并挖掘相关的常量值。

在Linux上,IP_DONTFRAG没有发现IP_MTU_DISCOVER。解决方法似乎是使用unix.SetsockoptInt,它恰好以the question you linked的形式提供。您可以使用相同的tns run android --emulator进行设置。