捕获文件的高效搜索算法

时间:2012-06-19 19:35:07

标签: java algorithm search packet-capture jpcap

我目前正在开发一个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)文件中搜索特定数据包的有效方法。我已经在网上搜索过了,但我找不到任何可以做到的东西。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

一个简单的小解决方案是为相关文件构建一个简单的索引。例如,您可以在每1000个数据包的开头的文件中记录偏移量。在小索引文件中存储此信息(只是一系列64位索引到原始跟踪文件中)。然后,当您进行二进制搜索时,您可以将此索引与原始文件一起使用,以查找(在1000个数据包内)正确的点以开始阅读。

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

答案 1 :(得分:0)

这只是一个猜测但是Interval TreeSegment Tree可能是一个不错的选择。假设您可以将所有数据包装入内存。如果您遵循Cormen等算法,间隔树相当容易创建。段内存在内存方面可能更昂贵,但应该为您提供更快的刺入查询。

如果数据包不适合内存。您可以将捕获文件时间戳用作最宽的时间间隔,并在有人导航到该时间间隔时深入查看每个文件。