如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)

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

提前致谢!

I intend to set the "don't fragment" flag bit in Go, the same thing as this post while it is in C. I checked the constant list but I didn't find this option. So what is the corresponding option in Go?

Thanks in advance!

原文:https://stackoverflow.com/questions/37761538

更新时间:2019-11-05 23:35

最满意答案

如何在Go中设置TCP数据包的“不分段”标志位?

首先你应该知道TCP确实不喜欢IP碎片。 大部分(如果不是全部)主要实现通过使用路径MTU发现来避免TCP段的碎片。

TL; DR是包含TCP段的典型IP包具有DF位置位。 你可以(也应该)尝试一下。 在这里,我嗅探了我的机器和stackoverflow.com之间的几秒钟的流量:

% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com

% tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c

186 0x00000002

0x02表示DF位置位。 我承认在其他捕获中,我看到了没有DF位的IP​​数据包中的偶尔TCP段; 我怀疑rfc1191对此有解释。

现在回到你的问题,我认为没有可移植的方式来设置DF位,这是一个更广泛的问题(甚至没有POSIX便携式方法)。 golang.org/x/sys下的相关软件包中可能会有一个(可能)逃脱孵化器。

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

在Linux上没有IP_DONTFRAG ,正如你从你链接的问题中发现的那样。 解决方法似乎是使用IP_MTU_DISCOVER ,它恰好在unix包中作为常量提供。 你可以使用相同的unix.SetsockoptInt来设置它。

How to set "don't fragment" flag bit for TCP packet in Go?

First up you should know that TCP really doesn't like IP fragments. Most if not all major implementations avoid fragmentation for TCP segments by using path MTU discovery.

The TL;DR is that the typical IP packet containing a TCP segment has a DF bit set. You can (and should) try this out. Here I am sniffing a few seconds of traffic between my machine and stackoverflow.com:

% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com

% tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c

186 0x00000002

0x02 means the DF bit is set. I confess in other captures I have seen the occasional TCP segment in an IP packet without a DF bit; I suspect rfc1191 has an explanation for this.

Now back to your question, I think there's no portable way to set the DF bit and this is a more widespread question (there isn't even a POSIX-portable way). There is (likely) an escape hatch in the relevant package for your implementation under golang.org/x/sys.

For example, on a Unix that supports IP_DONTFRAG such as FreeBSD one could use unix.SetsockoptInt and dig the relevant constant value.

On Linux there is not IP_DONTFRAG, as you discovered from the question you linked. The workaround seems to be to use IP_MTU_DISCOVER which happens to be available as a constant in the unix package. You can use that same unix.SetsockoptInt to set it.

2017-05-23

相关问答

自己解决。 指向发送者IP的是sin.sin_addr.s_addr ,但它必须是服务器ip! 要小心,因为在代码中看到这样的错误并不容易! :-) 现在数据包包含正确的MAC信息。 接下来的问题是为什么我没有从服务器获得任何syn-acks ,但我会为这个问题提出一个新问题。 Solved it myself. It was the sin.sin_addr.s_addr that pointed at the senders IP, but it had to be the servers i

...

如何在Go中设置TCP数据包的“不分段”标志位? 首先你应该知道TCP确实不喜欢IP碎片。 大部分(如果不是全部)主要实现通过使用路径MTU发现来避免TCP段的碎片。 TL; DR是包含TCP段的典型IP包具有DF位置位。 你可以(也应该)尝试一下。 在这里,我嗅探了我的机器和stackoverflow.com之间的几秒钟的流量: % tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com

% tsha

...

前一段时间想出来但忘记发布我发现的内容。 答案是你不可能真的。 在udp头文件中设置标志需要创建原始套接字,这需要root权限,这在iOS中是不具备的。 谢谢苹果! 幸运的是,在我的特殊情况下,我能够让我的客户改进他们的固件。 Figured this out awhile ago but forgot to post what I found. The answer is you can't really. Setting flags on the udp header requires the

...

这看起来很好。 TH_SYN是单个位,因此如果在th_flags设置该位,则表达式将为真(非零)。 That looks fine to me. TH_SYN is a single bit, so that expression will be true (nonzero) if that bit is set in th_flags.

tcp_dissect_pdus没有wslua API。 但你可以自己实现它。 如果你想组装跨越两个或更多数据包的pdu,那就相当简单了: function slicer.dissector(tvb, pinfo, tree)

...

local pdu_length = get_pdu_length(...)

if pdu_length > tvb:len() then

pinfo.desegment_len = pdu_length - tvb:len(

...

就像@Sivir所说,你需要建立三次握手,因为你想使用TCP协议。 从理论上讲,握手应该是这样的 YourProgram :发送SYN数据包 服务器 :发送SYNACK数据包 YourProgram :发送ACK数据包 有关这方面的更多信息,请点击此处 。 Like @Sivir said you need to establish a three way handshake because you want to use the TCP protocol. In theory the hands

...

以这种方式调整TCP连接是不可能的,控制它是没有意义的。 如果您需要使用此行为产生流量,则无法使用普通的TCP套接字,但需要使用原始套接字 ,您可以根据需要设置标头。 您当然需要在应用程序中重新实现所需的TCP连接的所有部分才能实现此功能。 Tuning a TCP connection this way can not be done and it would not make really sense to control it. If you need to produce traffic

...

发送字符串时,可能会在多个TCP数据包中发送。 如果发送多个字符串,它们可能都在一个TCP数据包中发送。 您没有接触到数据包,TCP套接字只是一个恒定的数据流。 不要指望对recv()每次调用都与recv()的单个调用配对,因为这不是真的。 您可以发送"abcd"和"efg" ,并可以从recv()读取"a" , "bcde"和"fg" 。 最好在收到数据后立即发送数据,以便网络堆栈尽可能快地提供有关您要发送的内容的信息。 它将确切地决定做什么。 您可以根据需要发送大字符串,如有必要,它将被分解为

...

不,因为永远不会发送目标主机名。 发件人使用DNS查找要与之通信的主机的IP地址,然后将数据包发送到该IP地址。 (更低级别,IP地址转换为MAC地址,这是硬件层使用的) 您的TCP套接字层应该允许您查看套接字的源和目标IP地址,然后您必须执行反向DNS查找以将其转换回主机名。 但请记住,一个IP地址可以转换为多个主机名... No, because the destination hostname is never sent. The sender uses DNS to find the IP

...

首先,让我们澄清MTU和MSS之间的区别。 这些属于堆栈的不同层(2和3)。 TCP / IP是一个非常不幸的分层蛋糕,它们都支持碎片,但不同,它们在这个问题上没有合作。 IP碎片是TCP不知道的事情。 事实上,如果其中一个IP片段丢失,整个系列就会被宣告丢失。 TCP不是这样:如果属于同一TCP流的IP数据报之一丢失,并且它们被TCP分段,则只需要重新传输丢失的部分。 这种混乱的核心原因是路由器必须能够在具有不同MTU的两个物理网络之间进行阻抗匹配, 而无需了解更高(TCP)协议 。 现在,所有

...

c语言sgoto 标志位,如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)...相关推荐

  1. python构造icmp数据包_如何在python中构造ICMP数据包

    为了学习,我目前正在尝试创建一个简单的python porgram来向某个设备发送ICMP ping数据包.为了开始,我查看了python模块Pyping:https://github.com/Akh ...

  2. python解析http数据包_如何在python中嗅探HTTP数据包?

    I want to sniff all the HTTP packets in my computer via python(version2.6.. is this possible? can I ...

  3. java 千位分隔符_如何在Java中设置千位分隔符?

    问题 如何在Java中设置千位分隔符?我有BigDecimal的String表示,我想设置千位分隔符并返回String. #1 热门回答(180 赞) 你可以使用格式功能","; ...

  4. html中写自增数字,WPS word中数字怎么自增 如何在word中设置数字的千位分隔符

    选中某行,列或者某一部分,选择菜单栏的"行和列"->"填充"选项,选择序列选项. 在弹出的窗口中设置你需要的选项. WPS文字怎样自动增加数字 如何在WP ...

  5. 网络编程—使用C语言实现发送TCP数据包,以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port;(原理和常见错误分析)

    任务要求: 1.以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port: 2.头部参数自行设定,数据字段为"This is my h ...

  6. 【机器学习基础】如何在Python中处理不平衡数据

    特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...

  7. linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

    今日锦囊 特征锦囊:如何在Python中处理不平衡数据 ? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何 ...

  8. linux中设置环境变量_如何在Linux中设置环境变量

    linux中设置环境变量 Wondering how to set environment variables in Linux? This is exactly what we'll be doin ...

  9. html img图片不平铺,如何在css中设置图片不平铺

    如何在css中设置图片不平铺 发布时间:2021-04-29 15:39:28 来源:亿速云 阅读:80 作者:Leah 这篇文章将为大家详细讲解有关如何在css中设置图片不平铺,文章内容质量较高,因 ...

最新文章

  1. 历届华人 AAAI Fellows
  2. mybatis 代码生成器_spring Boot手把手教学(4): mybatis-plus 代码生成器,自动帮你生成代码
  3. 封装时间转换工具类_利用swig封装C++的dll为C#方便使用
  4. python opencv显示图片一闪而过_解决Opencv+Python cv2.imshow闪退问题
  5. 数据库连接池配置和优化
  6. 拓端tecdat|R语言具有Student-t分布改进的GARCH(1,1)模型的贝叶斯估计
  7. Atitit java播放mp3 目录 1.1. 不能直接支持mp3播放。。需要解码播放转化为pcm 1 1.2. 使用\javalayer类库播放 3 1.3. ,就是普通的java sound
  8. 人工智能ai以算法为基础_IT团队如何为AI项目奠定正确的基础
  9. VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
  10. 有限元分析基本理论问答
  11. PS如何快速更换logo颜色
  12. html旋转360度特效,CSS3图片旋转特效(360/60/-360度)?
  13. photoshop 重复上一次变换操作 ctrl+shift+alt+t
  14. 如何用python语言解一元二次方程式
  15. ODBC连接达梦数据库
  16. mixins的实用案例和常见问题
  17. uni-app开发多端之钉钉小程序
  18. 光脚丫学LINQ(014):LINQ to SQL简介
  19. iframe跨域嵌套头部
  20. C语言加密和解密算法

热门文章

  1. c#字符相似度对比通用类
  2. ORA-00911:无效字符 错误及解决
  3. MITK医学Python开发入门详细版
  4. luogu P2216 [HAOI2007]理想的正方形 递推+ST表
  5. C++PrimerPlus学习——第十一章编程练习
  6. 牺牲阳极计算机安装标准储罐,钢质储罐阴极保护牺牲阳极保护方法与设计安装...
  7. python数据处理框架_python 最快 web 框架 Sanci 快速入门
  8. linux 内核io操作,关于Linux内核中的异步IO的使用
  9. Js数组去重的多种方法
  10. 新版Elemen Plus 国际化 1.0.2-beta.59(包含59)