使用libpcap,是否有一种方法可以确定从脱机pcap文件捕获的数据包的文件偏移量

Using libpcap, is there a way to determine the file offset of a captured packet from an offline pcap file?

本文关键字:文件 脱机 pcap 偏移量 数据包 是否 libpcap 方法 一种 使用      更新时间:2023-10-16

我正在编写一个程序来重建Snort捕获的TCP流。我读过的大多数关于会话重建的例子都是:

  • 将整个pcap文件加载到内存中开始(由于硬件限制以及某些捕获文件的大小为10 GB,因此不是解决方案),或者
  • 在读取捕获时将每个数据包缓存在内存中,并在进行时丢弃不相关的数据包;这与将整个文件读入内存基本上存在相同的问题

我目前的解决方案是编写自己的pcap文件解析器,因为格式很简单。我将每个数据包的偏移量保存在一个向量中,并可以在传递后重新加载每个数据包。这与libpcap一样,一次只将一个数据包流式传输到内存中;我只使用序列号和标志进行排序,而不是数据包数据。与libpcap不同,它明显较慢。使用libpcap处理一个570MB的捕获大约需要0.9秒,而我的代码需要3.2秒。然而,我的优势是可以向后搜索,而无需重新加载整个捕获。

如果我在速度问题上坚持使用libpcap,我想我可以创建一个初始值为24(pcap文件全局头的大小)的currentOffset变量,每次加载新数据包时将其推送到一个向量,每次调用pcap_next_ex时将其递增数据包的大小+16(pcap记录头的大小)。然后,每当我想读取单个数据包时,我都可以使用传统方法加载它,并查找packetOffsets[packetNumber]

使用libpcap有更好的方法吗?

自己解决了这个问题。

在调用pcap_next_ex之前,我将ftell(pcap_file(myPcap))推送到vector<unsigned long>。之后,我根据需要手动解析数据包。

EZPZ。这只是花了24个多小时的脑力劳动。。。