我一直在使用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选项?
感谢。
答案 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字节字数”