2013-04-25 34 views
1

我有一个pcap文件(~90M),我想重播该文件。我遇到了scapy,它提供了读取pcap文件并重放它的方式。我尝试以下两种方法来重播包使用scapy基于数据包时间戳的Pcap文件重播

sendp(rdpcap(<filename>) 

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

第一个游戏我的内存错误,Python进程的内存占用上升到3演出最后它死了。但是第二个选项对我来说工作得很好,因为它没有将整个文件读入内存。我有以下三个问题

  1. 90M pcap文件是太大scapy重播?

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

  3. 如果上述问题的答案是否定的(它只是在循环中重播,没有考虑到数据包到达时间),我们是否有其他可以为我完成这项工作的Python库?即使python不是我的约束。

回答

1

要回答你的第一个问题,听起来好像你自己回答了!尝试在另一个40-50 MB的pcap文件上再次运行第一个选项,然后查看是否有错误。通过这种方式,至少可以检查文件是否与Scapy一起处理系统中的大文件(系统中没有足够的RAM来处理Scapy如何运行其算法,因为它一次处理几个数据包,而不是一个90MB的pcap文件)或者只是代码中的东西。

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

忍者编辑 - 我认为这对其他StackOverflow的问题 - Specify timestamp on each packet in Scapy?

虽然这是一个单一的数据包 - 如果每一个数据包内Scapy的时间戳,那么我想,这将是为每个数据包同样在大您读入的pcap文件。通过这种方式,当您播放数据包时,它应该按照相同的顺序进行。

在这个答案中有很多受过教育的猜测,希望它可以帮助你!

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

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

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