我有一个pcap文件(~90M),我想重播该文件。我遇到了scapy,它提供了读取pcap文件并重放它的方法。我尝试了两种重放数据包的方法
sendp(rdpcap(<filename>)
和
pkts = PcapReader(<filename>);
for pkt in pkts:
sendp(pkt)
第一个游戏我的内存错误,python进程的内存消耗达到3 gig,最后它死了。但第二个选项对我来说很好,因为它没有将整个文件读入内存。我有以下三个问题
90M的pcap文件是否太大而无法重播?
每当我们使用tcpdump / wireshark时,每个数据包都有与之关联的时间戳。假设分组1在时间T到达,分组2在时间T + 10到达,将scapy以类似的方式重放分组,第一个分组在时间T,第二个分组在T + 10?或者它会继续发送它们循环,我想以后是PcapReader的情况。
如果上述问题的答案是肯定的(它只是在循环中重放,而不考虑数据包到达间隔时间),我们是否还有其他可以为我做这项工作的python库?即使是python也不是我的约束。
答案 0 :(得分:1)
回答你的第一个问题,听起来好像你自己回答了!尝试在另一个40-50 MB的pcap文件上再次运行第一个选项,看看是否有错误。这样你至少可以检查文件是否适合你的系统与Scapy一起处理(系统中没有足够的RAM来处理Scapy如何运行其算法,因为它是为了一次处理几个数据包而构建的,而不是一个90MB的pcap文件)或者它只是代码中的东西。
为了回答你的第二个问题,基于过去几周我在Scapy上所做的阅读,我坚信这是肯定的。但是,我不知道有什么消息来支持这个验证。
Ninja编辑 - 我在另一个StackOverflow问题上看到了这个问题 - Specify timestamp on each packet in Scapy?
虽然这是针对单个数据包的 - 如果每个数据包都在Scapy中加上时间戳,那么我想,对于你读入的大型pcap文件中的每个数据包都是一样的。这样当你重放数据包时它应该按顺序排列。
在这个答案中进行了大量有根据的猜测,希望它对你有帮助!
答案 1 :(得分:0)
没有。它不应该占用3GB的内存。我经常在只有2GB内存的机器上打开更大的pcap文件。只需尝试pkts = rdpcap(<filename>)
来查看需要多少内存,然后从那里开始。如果问题仍然存在,您可能希望尝试不同版本的scapy。
不,sendp()
默认情况下不会这样做。您可以尝试实时参数(在控制台上键入help(sendp)
)。但总的来说,根据我的经验,scapy并不擅长保持准确的时机。
tcpreplay(linux CLI工具)就是我用的。它有很多选择,包括各种计时机制。