使用scapy基于包时间戳的Pcap文件重放

2024-09-28 20:49:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

sendp(rdpcap(<filename>)

以及

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

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

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

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

  3. 如果上述问题的答案是否定的(只是在循环中重放,不考虑包的到达时间),我们是否还有其他的python库可以为我做这项工作?即使是python对我来说也不是限制。


Tags: 文件方法内存infor时间pcapfilename
2条回答
  1. 不,它不应该占用3GB的内存。我经常在只有2GB内存的机器上打开更大的pcap文件。试着做pkts = rdpcap(<filename>)看看需要多少内存,然后从那里开始。如果问题仍然存在,您可能希望尝试不同版本的scapy。

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

  3. tcpreplay(linux CLI工具)是我使用的。它有很多选择,包括各种时间保持机制。

为了回答你的第一个问题,听起来你是自己回答的!请尝试在另一个40-50 MB的pcap文件上再次运行第一个选项,并查看是否出错。这样,你至少可以检查它,这个文件对你的系统来说太大了,再加上Scapy来处理(在你的系统中没有足够的RAM来处理Scapy如何运行它的算法,因为Scapy一次只能处理几个包,而不是90mbpcap文件),或者如果它只是代码中的某个东西。

为了回答你的第二个问题,基于过去几周里我在Scapy上做的阅读,我坚信这是一个肯定。不过,我不知道有什么消息来源可以支持这一验证。

忍者编辑-我在另一个StackOverflow问题上看到这个-Specify timestamp on each packet in Scapy?

虽然这是针对单个数据包-如果每个数据包都在Scapy中加上了时间戳,那么我想对于一个大的pcap文件中读到的每个数据包都是一样的。这样当你重放数据包时,它应该以相同的顺序进行。

在这个答案中进行了很多有教育意义的猜测,希望能对你有所帮助!

相关问题 更多 >