设置IP头的标志字段

2024-10-02 12:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的Python脚本,它使用socket模块发送UDP包。这个脚本在我的Windows机器上运行得很好,但是在我的ubuntulinuxpc上,它发送的数据包略有不同。在Windows上,IP报头中的flags字段为零,但是在Linux上使用相同的代码创建了一个flags字段设置为4的包。我想修改我的脚本,使它在Windows和Linux上有一致的行为。在

有没有方法控制套接字模块中的标志字段?或者,这是我在Linux中必须更改的设置吗?在


Tags: 模块方法代码ip脚本机器标志linux
3条回答

这是我最后选择的路线。我跟随SashaN在D.Shwley的答案评论中发布的链接,了解了为什么在Linux的UDP包中设置“don't fragment”位。原来这和PMTU的发现有关。长话短说,在Python中,可以通过使用socket对象中的setsockopts函数清除UDP包中的don't fragment位。在

import socket
IP_MTU_DISCOVER   = 10
IP_PMTUDISC_DONT  =  0  # Never send DF frames.
IP_PMTUDISC_WANT  =  1  # Use per route hints.
IP_PMTUDISC_DO    =  2  # Always DF.
IP_PMTUDISC_PROBE =  3  # Ignore dst pmtu.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("10.0.0.1", 8000))
s.send("Hello World!") # DF bit is set in this packet
s.setsockopt(socket.SOL_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DONT)
s.send("Hello World!") # DF bit is cleared in this packet

我猜flags字段实际上被设置为2=b010而不是4—flags等于4是一个无效的IP包。请记住,flags是IP Header中的一个3位值。我希望看到UDP数据报的标志值为2,这意味着“不要分段”。在

至于你的问题,我不认为有一种方法可以直接设置IP标志而不必一直使用raw sockets。我不会担心这个问题,因为大多数应用程序并没有充分的理由直接处理IP甚至UDP/TCP报头。在

construct可以胜任这项工作吗?在

相关问题 更多 >

    热门问题