【问题标题】:Can you index a PCAP file without loading it all into memory?您可以索引 PCAP 文件而不将其全部加载到内存中吗?
【发布时间】:2021-07-29 01:32:00
【问题描述】:

我必须查看相当大的 PCAP,大约 40GB。我现在正在做的是使用 PCAP++ 一次解析一个 PCAP 并处理其中的数据。该数据被放入缓冲区以供查看。为了节省内存,当您继续通过 PCAP 时,我会丢弃旧数据。这使我一次只能使用大约 150MB。但是,如果用户想返回并查看太远的数据,他们不能,因为它已被丢弃。

如果用户想回头看,有什么方法可以查看 PCAP 文件并转到存储数据的数据包并重新处理数据?似乎如果我想获取某些数据包,我将不得不重新加载文件并再次查看每一个数据部分,或者将 pcap 文件拆分成大量的小块。

【问题讨论】:

  • 我对PCAP++一无所知,但你能确定你的PCAP文件中的原始数据包边界吗?如果是这样,您可以在通过文件向前工作时将这些偏移量存储在一个向量中,然后,如果您想要向后移动,您可以重新读取解码数据包所需的原始数据包数据有问题。
  • @PaulSanders 如果我错了,请纠正我,但你所说的建议在我构建对象时,存储与每个对象对应的数据包范围,然后当我需要重新加载对象,再次加载 pcap 文件并仅读取 pcap 文件的该部分。我会尝试看看这是否可能,但这让我回到了如何获得那些特定的数据包。
  • 是的,这就是我的建议。基本上,您只需要存储范围。恐怕我对 PCAP++ 的了解不够多,无法进一步评论,但这似乎是一种值得探索的方法。
  • @PaulSanders Gotcha,我会继续努力,感谢您的帮助 :)

标签: c++ pcap pcapplusplus


【解决方案1】:

所以我想通了,简短的回答是否定的。 PCAP++ 不支持任何可以对 pcap 文件进行索引或模拟索引的功能。我切换回 libpcap,(这也应该在带有 winpcap 的 Windows 中工作,但我还没有测试过),以便使用不同的库来帮助理清需要做的事情。要正确执行此操作,您需要使用指向 pcap 文件中关键数据包(或所有数据包,取决于您想要什么)的文件指针。以下是它的工作原理:

#ifdef _MSC_VER
    pcap_t *pcap = pcap_open_offline((pcapPath.string()).c_str(), errbuf);
#else
    pcap_t *pcap = pcap_open_offline(pcapPath.c_str(), errbuf);
#endif

//-----------------------------
//... General Packet setup ...
//-----------------------------

vector<fpos_t*> pcapIndexer;
while(/*Get Next Packet*/){

    //Parse the packet and get required flag
    //to know if it is a critical packet

    if(/*Check some condition from the data*/){
        fpos_t* position;
#ifdef _MSC_VER
        pcap_fgetpos(pcap, position);
#else
        FILE* f = pcap_file(pcap);
        fgetpos(f, position);
#endif
        pcapIndexer.push_back(position);
    }
}
    

从上面的代码中,您将遍历每个数据包,并根据数据包中的数据,将该文件指针添加到文件指针向量中。然后一旦你需要加载一个数据包,你创建一个新的 pcap_t 指针并使用它:

#ifdef _MSC_VER
    pcap_fsetpos(pcap, pcapIndexer[x]);
#else
    FILE* f = pcap_file(pcap);
    fsetpos(f, pcapIndexer[x]);
#endif

然后您可以从那时起正常阅读。请注意,您必须遍历整个 pcap 文件才能填写此文件指针向量,但是如果您使用多线程,您可以使用早期数据包中的一些数据,而 pcap 文件的其余部分正在通读并添加到向量中。这允许您加载选定数量的数据,然后能够来回跳转以从 pcap 文件的其他位置获取数据。我希望这可以帮助遇到这种情况的其他人。

【讨论】:

  • 请注意 pcap_fgetpos()pcap_fsetpos() 不是标准的 WinPcap/Npcap API;它们只在 [Pat Marion's modified WinPcap](Pat Marion's modified WinPcap) - 我会看看将它添加到 libpcap 是否有效。
  • @user16139739 谢谢,我还没有机会在 Windows 上测试它。我应该说,我的错:(
猜你喜欢
  • 2013-01-08
  • 2015-09-11
  • 2019-11-19
  • 1970-01-01
  • 2015-05-14
  • 2011-05-16
  • 2023-03-21
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多