14

我有一些软件可以模拟网络上的 BER 和延迟。我需要一种方法来测试软件的 BER 模块,以确保它确实正常工作。我的解决方案是创建一个程序来发送原始以太网帧,并将类型字段设置为未使用的类型。以太网帧内部只是随机位。对于发送的每个帧,我需要将帧记录到pcap文件中。在网络链接的另一端是一个接收应用程序,它简单地将它看到的每个数据包写入自己的pcap日志。运行测试完成后,将比较两个 pcap 日志以获取 BER。

我正在使用 python 模块Scapy,到目前为止它已经完成了我需要的一切。我可以发送带有随机数据的原始以太网帧,并在 Wireshark 中查看它们。但是,我不知道如何获取wrpcap()附加到 pcap 文件的方法,而不是覆盖。我知道我可以将数据包列表写入wrpcap,但是此应用程序需要能够无限期运行,并且我不想等到应用程序退出才能写入发送到硬盘的所有数据包. 因为这将是很多存储在内存中,如果发生了什么事,我将不得不从头开始测试。

我的问题是:如何pcap使用scapy而不是覆盖文件附加到pcap文件?甚至可能吗?如果没有,那么什么模块可以做我需要的?

在寻找具有Scapy's 能力的东西时,我遇到了dpkt,但我没有找到很多关于它的文档。可以dpkt按我的要求做吗?如果可以,我在哪里可以获得一些好的文档?

4

4 回答 4

19

对于后代,PcapWriter 或 RawPcapWriter 看起来是在 scapy 2.2.0 中处理这个更简单的方法。除了浏览源代码之外找不到太多文档。一个简单的例子:

from scapy.utils import PcapWriter

pktdump = PcapWriter("banana.pcap", append=True, sync=True)

...
pktdump.write(pkt)
...
于 2013-12-26T06:31:36.240 回答
7

有一种方法可以做你想做的事,但这意味着:

  • [一个大的内存猪]:从磁盘pcap读取现有的到a ,然后在收到帧时将它们写入。您可以随意选择性地保存中间值,但我认为's中没有任何类似于附加功能的东西。正如您所提到的,此技术还意味着您将整个内容保存在内存中直到完成。pcaprdpcap()scapy PacketList()PacketListPacketListpcapscapywrpcap()PacketList

  • [将单个pcap文件粘合在一起]:仅在内存中保留数据包的小快照...您应该pcap每 X 分钟将快照保存到磁盘,然后在脚本完成时将这些单个文件聚合在一起。

您可以将pcaplinux 中mergecap的文件与wireshark包中的文件合并...以下命令将合并pak1.pcappak2.pcap放入all_paks.pcap

mergecap -w all_paks.pcap pak1.pcap pak2.pcap

至于dpkt,我查看了他们的源代码,它可能能够增量写入数据包,但我不能说他们的代码库有多稳定或维护......从提交日志中看起来有点被忽视(最后一次提交是2011 年 1 月 9 日)。

于 2011-11-28T21:51:32.477 回答
1

如果包含关键字参数,该wrpcap()函数可用于追加append=True。例如:

pkt = IP()
wrpcap('/path/to/filename.pcap', pkt, append=True)
pkt2 = IP()
wrpcap('/path/to/filename.pcap', pkt2, append=True)

rdpcap('/path/to/filename.pcap')

<filename.pcap: TCP:0 UDP:0 ICMP:0 Other:2>

旁注: wrpcap 在每次调用时打开和关闭文件句柄。如果您有 pcap 文件的打开文件句柄,它将在调用wrpcap().

于 2018-02-23T18:56:01.943 回答
0

我想我在这里跟着你,因为数据包被嗅探你想让它们全部写入一个 pcap 文件吗?虽然您不能附加到 pcap,但您可以将数据包附加到列表中,然后一次将它们全部写入 pcap。

我不确定这是否能回答您的问题或是否有帮助,如果不让我知道,我可以调整它以满足您的需求。在这个例子中,我设置了一个阈值来为每 500 个被嗅探的数据包创建一个新的 pcap。如果您运行两次,请小心,因为您的 pcaps 可能会在第二次运行时被覆盖。

#!/usr/bin/python -tt

from scapy.all import *

pkts = []
iter = 0
pcapnum = 0

def makecap(x):
    global pkts
    global iter
    global pcapnum
    pkts.append(x)
    iter += 1
    if iter == 500:
        pcapnum += 1
        pname = "pcap%d.pcap" % pcapnum
        wrpcap(pname, pkts)
        pkts = []
        iter = 0

while 1:
    sniff(prn=makecap)

这应该会给你一点杠杆,但是最后几个数据包可能会丢失(降低 if 语句中的值以减轻这种情况。)建议同时在两侧使用它,以便每个 pcap 应该排队,稍后你如果您愿意,可以按照 Mike 的建议使用 mergepcap。让我知道这是否适合您。

于 2012-04-19T15:31:26.953 回答