[英]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個數據包之內)開始讀取的正確點。
當然,這需要對跟蹤文件進行預處理(或在生成時進行處理)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.