我不明白为什么人们说 Scapy 的表现更好。我快速检查如下图,获胜者是 dpkt。它是 dpkt > scapy > pyshark。
我用于测试的输入 pcap 文件大约为 12.5 MB。时间是通过 bash 时间命令 time python testing.py 得出的。在每个 sn-p 中,我确保数据包确实是从原始数据中解码出来的。可以为变量 FILENAME 分配所需的 pcap 文件名。
dpkt
from dpkt.pcap import *
from dpkt.ethernet import *
import os
readBytes = 0
fileSize = os.stat(FILENAME).st_size
with open(FILENAME, 'rb') as f:
for t, pkt in Reader(f):
readBytes += len(Ethernet(pkt))
print("%.2f" % (float(readBytes) / fileSize * 100))
平均时间约为0.3秒。
scapy -- 使用 PcapReader
from scapy.all import *
import os
readBytes = 0
fileSize = os.stat(FILENAME).st_size
for pkt in PcapReader(FILENAME):
readBytes += len(pkt)
print("%.2f" % (float(readBytes) / fileSize * 100))
平均时间约为 4.5 秒。
scapy -- 使用 RawPcapReader
from scapy.all import *
import os
readBytes = 0
fileSize = os.stat(FILENAME).st_size
for pkt, (sec, usec, wirelen, c) in RawPcapReader(FILENAME):
readBytes += len(Ether(pkt))
print("%.2f" % (float(readBytes) / fileSize * 100))
平均时间约为 4.5 秒。
pyshark
import pyshark
import os
filtered_cap = pyshark.FileCapture(FILENAME)
readBytes = 0
fileSize = os.stat(FILENAME).st_size
for pkt in filtered_cap:
readBytes += int(pkt.length)
print("%.2f" % (float(readBytes) / fileSize * 100))
平均时间约为 12 秒。
我根本不宣传 dpkt——我不在乎。关键是我目前需要解析 8GB 的文件。所以我用 dpkt 检查了上面编写的 8GB pcap 文件的代码是否完成了 4.5 分钟,这是可以忍受的,而我什至不会等待其他库完成。至少,这是我的第一印象。如果我有一些新信息,我会更新帖子。