Python 如何正确读取分为两个TCP段的HTTP Post消息?

Python 如何正确读取分为两个TCP段的HTTP Post消息?,python,tcp,dpkt,Python,Tcp,Dpkt,在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') 以下数据包会产

在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')
以下数据包会产生问题:

这是一个HTTP Post消息,分为两个TCP段,每个段在不同的数据包中发送。但是,由于第一段仅为TCP,第二段被识别为HTTP,因此当dpkt.HTTP.Request尝试将第一段作为HTTP读取时,似乎失败了

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

问题在于,尽管两个TCP段同时读取(根据上述假设),但生成的TCP.data不会被识别为HTTP数据包,而是仍然被识别为TCP,因为消息的第一段是仅TCP的数据包


那么,我应该如何读取此类pcap文件的HTTP头和数据呢?

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

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


有关如何完成这一部分的一些示例,请参见。请注意,这里的示例盲目地假设数据包已经有序、完整且没有重复,而这一假设在现实生活中是无法保证的。

可能有点晚了。他提出的观点是正确的。但是,假设您没有这些问题(即没有丢失、重复的PKT等),您可以像我重新组装分布在多个TLS数据包上的TLS帧那样进行一些基本的重新组装。您可以对HTTP通信应用类似的逻辑。您可以在我发布的关于TLS机架重新组装的类似问题的文章中找到我的解决方案。顺便说一句,在我的解决方案中,我使用了scapy。

或者您可以使用scapy2.4.3中的内置功能+


非常感谢。我会试试你的方法,然后再打给你。
sniff(session=TCPSession, [...])