【问题标题】:Python Scapy vs dpktPython Scapy 与 dpkt
【发布时间】:2015-08-29 19:47:15
【问题描述】:

我试图从一开始就使用 Python 的 Scapy 分析数据包。在最近的搜索中,我发现python中有另一个模块名为dpkt。使用这个模块,我可以解析数据包的层,创建数据包,读取.pcap 文件并写入.pcap 文件。我发现它们之间的区别是:

  1. dpkt 中缺少实时数据包嗅探器

  2. 有些字段需要在dpkt中使用struct.unpack解包。

还有其他我遗漏的区别吗?

【问题讨论】:

  • 性能如何?您是否对它们进行了测试以了解它们的比较情况?
  • 与 dpkt 相比,Scapy 的性能更好。
  • 但永远不要忘记数据包捕获接口缓冲。您必须解决这个问题,否则会因实时监控而遭受巨大的性能损失
  • 以上是错误的。 Scapy是纯python

标签: python scapy dpkt


【解决方案1】:

我不明白为什么人们说 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 分钟,这是可以忍受的,而我什至不会等待其他库完成。至少,这是我的第一印象。如果我有一些新信息,我会更新帖子。

【讨论】:

  • 不应该真正进行比较。一般来说,您可能不应该使用任何基于 Python 的软件来非常快速地处理大量数据。 dpkt 更快,但在scapy 中添加自己的层更容易。 pyshark wraps tshark = wireshark,所以你根本不能添加任何东西,但它受益于 Wireshark 的稳定性和多样性。
  • FTR 如果你使用 pypy 尝试 Scapy,它会加速 x4
  • 对于那些只解析大型 PCAP 文件的人,我发现 pypacker gitlab.com/mike01/pypacker 的解析速度比 dpkt 快 3 倍。
【解决方案2】:

Scapy 的性能优于 dpkt

  1. 您可以使用 scapy 创建、嗅探、修改和发送数据包。而 dpkt 只能分析数据包并创建它们。要发送它们,您需要原始套接字。
  2. 正如您所提到的,Scapy 可以实时嗅探。它可以从网络中嗅探,也可以使用rdpcap 方法或sniff 方法的offline 参数读取.pcap 文件。
  3. Scapy 通常用于创建数据包分析器和注入器。它的模块可用于为特定目的创建特定应用程序。

可能还有许多其他差异。

【讨论】:

  • 嗯,dpkt 要快得多,对于某些(相当常见的)操作来说,它的速度要快 10 倍左右。我在 15 分钟内通过一些相对基本的操作处理了大约 5000 万个数据包,但仍然如此。我还没准备好等待我之前完成的 scapy 实现。
  • @AdamKalisz 我同意。但是通过对 scapy 进行一些调整,scapy 的性能与 dpkt 相当。只需将一些常用操作更改为内置函数即可。
  • 如果您能指出您提到的这些更改的记录并且可能将其合并到主要的 Scapy 文档中,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
相关资源
最近更新 更多