【问题标题】:How to change TCP Header and options using Python's socket library如何使用 Python 的套接字库更改 TCP 标头和选项
【发布时间】:2019-11-22 10:17:21
【问题描述】:

我想获得一些关于如何修改 TCP 标头以及更改 TCP 标头选项的帮助。我对选项的 MSS 部分特别感兴趣。

我尝试使用不同选项的 setsockopt() 没有成功。

下面是一些试图改变 MSS 的代码:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #! Settings mss
    s.setsockopt(socket.IPPROTO_TCP, socket.IP_OPTIONS , b"MSS:400")

我希望 MSS 更改为 400。代码运行但它不会更改 MSS(使用 Wireshark 检查)。

【问题讨论】:

  • b"MSS:400" 不是 TCP 标头中 MSS 选项的正确值。 TCP 标头选项不是字符串,它们是数字。 MSS 是选项号 2,长度 = 4,值 = 包含值的 2 个字节。

标签: python sockets tcp packet mtu


【解决方案1】:

使用TCP_MAXSEG 选项。

s.setsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG, 400)

【讨论】:

  • 在 Linux 上的工作很棒!由于缺乏原始套接字支持,这在 Windows 上不起作用?!
  • 我认为这与原始套接字无关。
  • sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG, 400) print(sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG)) MSS -> 536 不工作
【解决方案2】:

除了@Barmar 所说的之外,您还可以在任何 unix 系统的“手册页”中找到更多信息,方法是键入以下内容之一:

man 7 ip
man 7 tcp
man 7 udp

man是手册的缩写,7overview/misc section

tcp page 这么说TCP_MAXSEG

传出 TCP 数据包的最大分段大小。在 Linux 2.2 及更早版本中,以及 Linux 2.6.28 及更高版本,如果在建立连接之前设置了此选项,则 还会更改初始数据包中向另一端宣布的 MSS 值。价值观 大于(最终)接口 MTU 无效。 TCP 还将强加其 提供的值的最小和最大界限。

【讨论】:

  • 太棒了,很好的提示!
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多