如何使用scapy在TCP数据包中取消设置EOL选项

时间:2014-01-16 15:51:02

标签: python tcp scapy

我一直在使用Python中的scapy,但更具体地说,我一直在创建数据包并尝试在TCP层中设置选项。

我知道我可以使用

创建数据包
>>> a = IP()/TCP()

我也知道我可以通过

设置TCP层中的选项
>>> a[TCP].options=[('MSS',1200),('NOP',None)]

或者

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

我遇到的问题是在发送数据包并在wireshark中观察之后。 Wireshark总是显示我没有设置时在我的数据包中设置了列表结束(EOL)选项。我不认为无论什么选项总是设置,因为我看到很多没有显示该选项的TCP数据包。有没有办法在scapy中设置TCP选项而不包括EOL选项?

感谢。

1 个答案:

答案 0 :(得分:2)

我认为这是一个统一的问题。 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字节字数”