簡體   English   中英

捕獲文件的高效搜索算法

[英]Efficient Searching Algorithm for Capture File

我目前正在用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)文件中的特定數據包。 我已經搜尋了網,但找不到任何可以完全滿足我要求的內容。

如果有人有任何想法/解決方案可以建議,我們將不勝感激。

謝謝!

一個簡單的小解決方案是為有問題的文件建立一個簡單的索引。 例如,您可以將偏移量記錄在第1000個數據包開頭的文件中。 將此信息(只是將64位索引的序列存儲到原始跟蹤文件中)存儲在一個小的索引文件中。 然后,當您進行二進制搜索時,可以將該索引與原始文件一起使用,以找到(在1000個數據包之內)開始讀取的正確點。

當然,這需要對跟蹤文件進行預處理(或在生成時進行處理)。

這只是一個猜測,但也許間隔樹分段樹將是一個不錯的選擇。 假設您可以將所有數據包放入內存中。 如果遵循Cormen等人的算法,則很容易創建間隔樹。 細分樹在內存方面可能會更昂貴,但是應該為您提供更快的插入查詢。

如果數據包無法放入內存中。 您可以將捕獲文件的時間戳記用作最廣泛的時間間隔,如果有人導航到該時間間隔,則可以深入查看每個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM