如何正确地读取分为两个TCP段的httppost消息?

2024-04-26 17:26:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在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')

以下数据包会产生问题: enter image description here

这是一个单独的httppost消息,分为两个TCP段,每个TCP段在不同的数据包中发送。但是,由于第一个段仅为TCP,而第二个段被识别为HTTP,因此当dpkt.http.Request请求尝试读取第一个段,因为它失败了。你知道吗

到目前为止没有问题。失败是可以的,因为它实际上不是一个完整的HTTP消息。但是,问题是它似乎根本没有读取第二段(“未打印POST Message”)!!!第二段被完全忽略,好像它不存在!!!唯一可能的解释是,当dpkt识别出第二个段是同一消息的段时,它会立即自动读取第二个段。你知道吗

问题是,尽管两个TCP段同时被读取(遵循上述假设),但是tcp.data协议未被识别为HTTP数据包,而是仍然被识别为TCP only,因为消息的第一段是TCP only数据包。你知道吗

那么我该怎么读取这些pcap文件的HTTP头和数据呢?你知道吗


Tags: 文件http消息dataifrequestpcap数据包
1条回答
网友
1楼 · 发布于 2024-04-26 17:26:09

dpkt只在包级别工作。dpkt.http.Request期望完整的HTTP请求作为输入,而不仅仅是当前数据包中的部分。这意味着您必须从属于连接的所有数据包收集输入,即重新组装TCP数据流。你知道吗

重新组装不是简单地连接数据包,而是确保没有丢失的数据包,没有重复的数据包,并且数据包以正确的顺序重新组装,而这可能不是线路上的顺序。本质上,在将提取的有效负载放入套接字缓冲区之前,您需要执行操作系统内核将执行的所有操作。你知道吗

有关如何完成部分工作的示例,请参见Follow HTTP Stream (with decompression)。请注意,这里的示例盲目地假设数据包已经是有序的、完整的并且没有重复的数据包,而这一假设在现实生活中是不能保证的。你知道吗

相关问题 更多 >