无法使用套接字模块在python中设置ECN位

时间:2014-03-15 12:34:05

标签: python sockets

我想创建一个tcp服务器,该服务器使用IP标头集中的ECN位进行SYN + ACK响应。

这是我写的示例代码:

# pythonTCPserver.py

import socket

TCP_IP = "127.0.0.1" TCP_PORT = 7979

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.setsockopt(socket.SOL_IP, socket.IP_TOS, 0x01)
s.setsockopt(socket.SOL_IP, socket.IP_TTL, 5)

iptos = s.getsockopt(socket.SOL_IP, socket.IP_TOS) ipttl =
s.getsockopt(socket.SOL_IP, socket.IP_TTL)

print "IP TOS is now set to ", iptos print "IP TTL is not set to ", ipttl

s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print "Connection accepted from :", addr print "Closing connection"

conn.close()

当运行它并在wireshark上捕获数据包时,我看到TTL正确设置为5,但ECN位未设置,实际上整个TOS部分未更改。

我们如何设置ECN位的任何想法???

1 个答案:

答案 0 :(得分:1)

我相信您无法使用setsockopt设置ECN位。使用IP_TOS选项,您只能在IP标头中设置DSCP位。两个低位被忽略。因此,使用值0x5而不是0x1将DSCP设置为1并保持ECN位不变。

相反,您可以使用原始套接字,它允许您指定自己的标头,因此您可以为每个数据包自己设置ECN位。那里有很多examples个原始套接字,或者你可以查看python documentation。请注意,您不必指定所有标头。例如,您可以选择仅从IP上指定。