【问题标题】:Efficient Searching Algorithm for Capture File捕获文件的高效搜索算法
【发布时间】:2012-06-19 19:35:06
【问题描述】:

我目前正在用 java 开发一个工具,该工具将帮助跟踪和解释通过以太网连接发送的数据。我已经成功开发了数据包嗅探器和数据包数据解释器。

我在尝试导航到跟踪文件中的特定数据包时遇到了问题。每个数据包都有一个相关的时间戳,我希望能够导航到特定的时间窗口。我目前的方法如下。

public ArrayList<Packet> getTimeWindow(double time, int window) {
    ArrayList<Packet> packets = new ArrayList<Packet>();
    double start = time - window;
    double end = time + window;

    JpcapCaptor captor = null;
    try {
        captor = JpcapCaptor.openFile(this.traceFile); 
    } catch (IOException e) {e.printStackTrace();}

    Packet p = captor.getPacket();
    while(packet != null) {
        if(f.timestamp > end) return packets;
        if(p.timestamp >= start) packets.add(p);    
        packet=captor.getPacket();
    }
    return packets;
}

这适用于小跟踪,但当我们处理数百万个数据包时可能会变得很慢。我想实现某种形式的二进制搜索算法,但我想不出一种方法来导航到数据包的中间而不对其进行预处理。数据包没有按行整齐地组织,即使我跳到文件中的一个随机点,我也不能保证我在一个数据包的开头。

总结:我正在寻找一种有效的方法来搜索捕获(.pcap 或 .cap)文件中的特定数据包。我已经搜遍了网络,但找不到任何可以完全满足我要求的东西。

如果有人有任何想法/解决方案您可以提出建议,我们将不胜感激。

谢谢!

【问题讨论】:

  • 不确定它是否可行,但您可以使用 ResultSet 之类的东西吗?让它读入、处理、然后丢弃本地数据,然后只存储对其位置的引用(例如 Map),然后您可以通过该引用找到您要查找的内容?这样,您的二进制搜索将在一个有序的 keySet 上进行。最初填充地图时仍然会有开销,但不会像尝试将其全部保存在内存中那样糟糕。
  • 这对于后期处理来说实际上并不是一个坏主意。如果我无法通过单个跟踪文件找到一种方法,我可能会考虑这样做。我试图尽量减少后期处理时间,但这只是一种需要,而不是需要。如果我最终这样做了,我会告诉你的,谢谢!

标签: java algorithm search packet-capture jpcap


【解决方案1】:

一个简单的小型解决方案是为有问题的文件建立一个简单的索引。例如,您可以在文件中记录每 1000 个数据包开始的偏移量。将此信息(只是原始跟踪文件中的 64 位索引序列)存储在一个小型索引文件中。那么当你进行二分查找时,你可以使用这个索引,连同原始文件,找到(1000个数据包内)正确的开始读取点。

当然,这需要对跟踪文件进行预处理(或在生成时进行处理)。

【讨论】:

  • 我喜欢这个想法,但是在生成跟踪的同时进行处理是不可能的,不过谢谢!
  • 好吧,这里是 Jpcap 使用的文件格式的描述,也许能够以某种方式检测数据包标头(随机搜索,找到看起来像标头的东西,提高标头所说的大小,然后查看如果有另一个标题。重复几次以确定):manpagez.com/man/5/pcap-savefile
  • 我接受了这个答案,因为您的评论让我得到了最终的答案。我不得不做一些花哨的步法,但最终我找到了解决问题的有效方法。谢谢。
【解决方案2】:

这只是一个猜测,但Interval TreeSegment Tree 可能是一个不错的选择。假设您可以将所有数据包放入内存。如果您遵循 Cormen 等人的算法,则可以很容易地创建区间树。 Segment Tree 在内存方面可能会更昂贵,但应该会给您更快的 stabling 查询。

如果数据包不适合内存。您可以将捕获文件时间戳用作最广泛的时间间隔,如果有人导航到该时间间隔,则可以深入了解每个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多