我试图Scapy
从一开始就使用 Python 分析数据包。在最近的搜索中,我发现 python 中有另一个模块名为dpkt
. 使用这个模块,我可以解析数据包的层,创建数据包,读取.pcap
文件并写入.pcap
文件。我发现它们之间的区别是:
缺少实时数据包嗅探器
dpkt
有些字段需要使用
struct.unpack
in解包dpkt
。
我还缺少其他差异吗?
Scapy
比 表现更好dpkt
。
.pcap
文件。rdpcap
offline
sniff
可能还有许多其他差异。
我不明白为什么人们说 Scapy 表现更好。我快速检查如下图,获胜者是 dpkt。它是 dpkt > scapy > pyshark。
我用于测试的输入 pcap 文件大约为 12.5 MB。时间是用 bash time 命令得出的time python testing.py
。在每个片段中,我确保数据包确实是从原始片段中解码出来的。可以为变量 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 分钟,这是可以忍受的,而我什至不会等待其他库完成。至少,这是我的第一印象。如果我有一些新信息,我会更新帖子。