在pcap文件上执行以下Python代码时:
if tcp.dport == 80:
try:
http=dpkt.http.Request(tcp.data)
except (dpkt.dpkt.NeedData):
continue
except (dpkt.dpkt.UnpackError):
continue
if http.method == 'POST':
print('POST Message')
这是一个单独的httppost消息,分为两个TCP段,每个TCP段在不同的数据包中发送。但是,由于第一个段仅为TCP,而第二个段被识别为HTTP,因此当dpkt.http.Request请求尝试读取第一个段,因为它失败了。你知道吗
到目前为止没有问题。失败是可以的,因为它实际上不是一个完整的HTTP消息。但是,问题是它似乎根本没有读取第二段(“未打印POST Message”)!!!第二段被完全忽略,好像它不存在!!!唯一可能的解释是,当dpkt识别出第二个段是同一消息的段时,它会立即自动读取第二个段。你知道吗
问题是,尽管两个TCP段同时被读取(遵循上述假设),但是tcp.data协议未被识别为HTTP数据包,而是仍然被识别为TCP only,因为消息的第一段是TCP only数据包。你知道吗
那么我该怎么读取这些pcap文件的HTTP头和数据呢?你知道吗
dpkt
只在包级别工作。dpkt.http.Request
期望完整的HTTP请求作为输入,而不仅仅是当前数据包中的部分。这意味着您必须从属于连接的所有数据包收集输入,即重新组装TCP数据流。你知道吗重新组装不是简单地连接数据包,而是确保没有丢失的数据包,没有重复的数据包,并且数据包以正确的顺序重新组装,而这可能不是线路上的顺序。本质上,在将提取的有效负载放入套接字缓冲区之前,您需要执行操作系统内核将执行的所有操作。你知道吗
有关如何完成部分工作的示例,请参见Follow HTTP Stream (with decompression)。请注意,这里的示例盲目地假设数据包已经是有序的、完整的并且没有重复的数据包,而这一假设在现实生活中是不能保证的。你知道吗
相关问题 更多 >
编程相关推荐