使用 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 文件中确定捕获的数据包的文件偏移量?的主要内容,如果未能解决你的问题,请参考以下文章
libevent 1.4 版和 2.0 版之间的差异如何影响 libpcap 事件?