1

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

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

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

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

有没有更好的方法使用 libpcap 来做到这一点?

4

1 回答 1

1

自己解决了这个问题。

在我打电话之前pcap_next_ex,我推入ftell(pcap_file(myPcap))了一个vector<unsigned long>. 之后我根据需要手动解析数据包。

EZPZ。只花了24个多小时的脑残......

于 2012-07-28T05:37:38.377 回答