我一直在 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 数据包。有没有办法在不包括 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 字节字数数据的开头”。
关于python - 如何使用 scapy 取消设置 TCP 数据包中的 EOL 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166495/