使用 libpcap,有没有办法从离线 pcap 文件中确定捕获的数据包的文件偏移量?

Posted

技术标签:

【中文标题】使用 libpcap,有没有办法从离线 pcap 文件中确定捕获的数据包的文件偏移量?【英文标题】:Using libpcap, is there a way to determine the file offset of a captured packet from an offline pcap file? 【发布时间】:2012-07-27 04:55:46 【问题描述】:

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

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

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

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

有没有更好的方法来使用 libpcap?

【问题讨论】:

【参考方案1】:

自己解决了问题。

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

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

【讨论】:

以上是关于使用 libpcap,有没有办法从离线 pcap 文件中确定捕获的数据包的文件偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

libpcap 过滤 pcap_compile

libpcap

libevent 1.4 版和 2.0 版之间的差异如何影响 libpcap 事件?

请问*.pcap文件都是啥软件产生的啊?wireshark我知道保存的文件格式是.pcap文件,请问还有别的软件吗?

libpcap 读取数据包大小

2020-01-14 转载【dpdk】使用libpcap-PMD驱动收发包