我正在使用rdpcapScapy 的功能来读取 PCAP 文件。我还使用了Scapy 中的 HTTP 支持链接中描述的模块,这在我的情况下是必需的,因为我必须检索所有 HTTP 请求和响应以及它们的相关数据包。
我注意到解析大型 PCAP 文件时,该rdpcap函数需要花费太多时间来读取它。
有没有pcap更快读取文件的解决方案?
我正在使用rdpcapScapy 的功能来读取 PCAP 文件。我还使用了Scapy 中的 HTTP 支持链接中描述的模块,这在我的情况下是必需的,因为我必须检索所有 HTTP 请求和响应以及它们的相关数据包。
我注意到解析大型 PCAP 文件时,该rdpcap函数需要花费太多时间来读取它。
有没有pcap更快读取文件的解决方案?
Scapy 还有另一种方法sniff,您也可以使用它来读取 pcap 文件:
def method_filter_HTTP(pkt):
#Your processing
sniff(offline="your_file.pcap",prn=method_filter_HTTP,store=0)
rdpcap将整个 pcap 文件加载到内存中。因此它使用了大量的内存,正如你所说的它很慢。Whilesniff一次读取一个数据包并将其传递给提供的prn函数。该store=0参数确保数据包在处理后立即从内存中删除。
虽然我同意加载时间比预期的要长,但这可能是因为正在解析文件以生成一组高度组合的对象。我必须做的是editcap用来切碎数据包捕获,以使阅读它们更容易一些。例如:
$ editcap -B 2013-05-2810:05:55 -i 5 -F libpcap inputcapture.pcap outputcapture.pcap
请注意:此处提供了此命令开关的完整说明。
此外,这-F libpcap部分似乎是必要的(至少对我而言)以获得pcap能够解析文件的 scapy 函数。(这应该是默认的 pcap 文件输出格式,但无论出于何种原因,这对我来说不是这种情况。您可以使用capinfos(例如,只需 enter capinfos your_capture.pcap)验证输入和输出文件的文件类型。
两者capinfos都editcap可以在 WireShark 发行版中使用。
从 Scapy 2.4.3 开始,它内置了解析 HTTP会话的支持。它可以与sniff() 会话功能一起使用。例如
pkts = sniff(offline="http_chunk.pcap.gz", session=TCPSession, store=0)
当使用TCPsessionHTTP/1 捕获的功能时,它会返回一个“数据包”列表,其中包含来自构成每个 HTTPRequest、HTTPResponse 的所有底层数据包的组装数据。它还将返回单个数据包,例如 Ack 数据包。因此,例如,检查“数据haslayer(HTTPResponse)包”是否包含整个响应有效负载。也可以使用该answers()功能来匹配请求和响应。请注意,您可以使用sniff()实时捕获、offline数据包捕获或数据包列表。
如果您正在寻找响应更快的代码,请考虑使用PcapReader()而不是rdpcap().
PcapReader()创建一个生成器并仅在需要时加载数据包,而不是rdpcap()将整个跟踪加载到内存中。PcapReader()因此,非常适合需要永远加载的大型跟踪rdpcap(),或者抛出 aMemoryError因为它对您的系统来说太大了。
示例代码:
packets = PcapReader('filename.pcap')
for packet in packets:
mac_src = packet[Ether].src
mac_dst = packet[Ether].dst
...
请参阅PcapReader() 文档以获取更多信息。
如果您只关心获得最终输出需要多长时间,那么rdpcap()可能比 具有优势PcapReader(),尽管我不确定差异的大小。