1

我有一个 pcap 文件(~90M),我想重播那个文件。我遇到了 scapy,它提供了读取 pcap 文件并重放它的方法。我尝试了以下两种重播数据包的方法

sendp(rdpcap(<filename>)

pkts = PcapReader(<filename>);
for pkt in pkts:
     sendp(pkt)

第一个游戏我内存错误,python进程的内存消耗上升到3 gig,最后它死了。但是第二个选项对我来说效果很好,因为它没有将整个文件读入内存。我有以下三个问题

  1. 90M pcap 文件是否太大而无法重播?

  2. 每当我们使用 tcpdump/wireshark 时,每个数据包都有与之关联的时间戳。假设数据包 1 在时间 T 到达,数据包 2 在时间 T+10 到达,scapy 会以类似的方式重放数据包,第一个数据包在时间 T,第二个数据包在 T+10?或者它只会继续循环发送它们,我认为稍后是 PcapReader 的情况。

  3. 如果上述问题的答案是否定的(它只是循环重播,不考虑数据包间到达时间),我们是否有任何其他 python 库可以为我完成这项工作?甚至 python 对我来说也不是约束。

4

2 回答 2

1

要回答您的第一个问题,听起来您自己回答了!尝试在另一个 40-50 MB 的 pcap 文件上再次运行第一个选项,然后查看是否出现错误。这样,您至少可以检查文件对于您的系统来说是否太大,并结合 Scapy 来处理(系统中没有足够的 RAM 来处理 Scapy 如何运行其算法,因为它是为一次处理几个数据包而构建的,而不是90MB pcap 文件)或者它只是代码中的某些内容。

为了回答你的第二个问题,根据过去几周我在 Scapy 上所做的阅读,我坚信这是肯定的。但是,我不知道有任何消息来源可以支持此验证。

忍者编辑 - 我在另一个 StackOverflow 问题上看到了这个 -在 Scapy 中的每个数据包上指定时间戳?

虽然这是针对单个数据包的 - 如果每个数据包在 Scapy 中都有时间戳,那么我想它对于您读入的大型 pcap 文件中的每个数据包都是相同的。这样,当您重放数据包时,它应该进入相同的顺序。

在这个答案中进行了很多有根据的猜测,但希望对您有所帮助!

于 2013-04-28T03:50:11.607 回答
1
  1. 不,它不应该占用 3GB 的内存。我经常在只有 2GB 内存的机器上打开较大的 pcap 文件。只需尝试pkts = rdpcap(<filename>)看看需要多少内存,然后从那里开始。如果问题仍然存在,您可能希望尝试不同版本的 scapy。

  2. 不,sendp()默认情况下不这样做。您可以尝试实时参数(help(sendp)在控制台上输入)。但总的来说,根据我的经验,scapy 并不擅长保持准确的计时。

  3. 我使用的是 tcpreplay(linux CLI 工具)。它有许多选项,包括各种计时机制。

于 2015-04-21T23:57:55.103 回答