Python 如何使用scapy取消TCP数据包中的EOL选项

Python 如何使用scapy取消TCP数据包中的EOL选项,python,tcp,scapy,Python,Tcp,Scapy,我一直在Python中与scapy打交道,但更具体地说,我一直在创建数据包并尝试在TCP层中设置选项 我知道我可以用 >>> a = IP()/TCP() 我还知道我可以通过以下方式设置TCP层中的选项: >>> a[TCP].options=[('MSS',1200),('NOP',None)] 或 我遇到的问题是在我发送数据包并在wireshark中观察它之后。Wireshark始终显示,当我未设置列表结束(EOL)选项时,它已在我的数据包中设置。我不

我一直在Python中与scapy打交道,但更具体地说,我一直在创建数据包并尝试在TCP层中设置选项

我知道我可以用

>>> a = IP()/TCP()
我还知道我可以通过以下方式设置TCP层中的选项:

>>> a[TCP].options=[('MSS',1200),('NOP',None)]

我遇到的问题是在我发送数据包并在wireshark中观察它之后。Wireshark始终显示,当我未设置列表结束(EOL)选项时,它已在我的数据包中设置。我不认为无论发生什么情况都会设置该选项,因为我看到很多TCP数据包没有显示该选项。是否有办法在不包括EOL选项的情况下在scapy中设置TCP选项

谢谢。

我认为这是一个调整的问题。不需要Wireshark来检查。在scapy中,您可以使用
TCP(str(TCP(options=…)))
强制scapy构建数据包并解析生成的字节,也可以使用
.show2()
数据包方法

('MSS',1200)
选项本身需要4个字节,因此不需要添加任何额外的选项:

>>> TCP(str(TCP(options=[('MSS',1200)]))).options
WARNING: No IP underlayer to compute checksum. Leaving null.
[('MSS', 1200)]
('NOP',None)
选项只适合1个字节,因此将添加3个空字节。第一个字节将显示为
('EOL',None)
,当然,由于
EOL
意味着列表结束,接下来的两个字节将不被考虑

>>> TCP(str(TCP(options=[('NOP', None)]))).options
WARNING: No IP underlayer to compute checksum. Leaving null.
[('NOP', None), ('EOL', None)]
需要4字节对齐的原因是数据偏移字段(
dataofs
)表示“从
TCP
层开始到数据开始的4字节字数”

>>> TCP(str(TCP(options=[('NOP', None)]))).options
WARNING: No IP underlayer to compute checksum. Leaving null.
[('NOP', None), ('EOL', None)]