2014-11-21 572 views
0

我正在生成我捕獲的數據包的PCAPNG文件。除了每個數據包的時間戳無效以外,一切看起來都很好。將時間戳存儲爲兩個32位字(pcapng格式)

簡而言之,我將時間戳與所有其他數據一起存儲在字節緩衝區中,並將其寫入文件。當我然後用十六進制編輯器,我得到以下值時間戳字段檢查文件:

ByteBuffer data = ByteBuffer.allocate(epbLength).order(ByteOrder.BIG_ENDIAN); 
data.putlong(timestamp); 

00 00 01 49 D3 7F B4 D9 => 1416592602329 (According to Hex Fiend) 

這似乎是一個有效的時間戳。然而,在Wireshark的打開文件我得到January 12, 46860

望着關於時間戳PCAPNG規範其規定如下:

時間戳(高)和時間戳(低):高,低32位 表示時間戳的64位數量。時間戳是一個單獨的 64位無符號整數,表示自 1/1/1970 00:00:00 UTC以來的單元數。通過接口 描述該數據包引用的塊的'if_tsresol'選項來指定解釋該字段的方式 。請注意, 與libpcap文件格式不同,時間戳不會保存爲 兩個32位值,它們自從 1/1/1970開始計算秒和微秒。它們被保存爲一個單一的64位數量,保存爲32位字的兩個 。

因此,我認爲我只是簡單地將值存儲在字節緩衝區中,然後將其保存到文件中是錯誤的。但我該如何將時間戳保存爲兩個32位字?我嘗試過不同的東西,比如簡單地將值存儲爲兩個整數,但似乎沒有給出正確的格式。

請注意,我還在數據包中指定了if_tsresol,但無論我給它什麼值(3爲10^-3 => millis),它都不會影響Wireshark解釋文件的方式。

另一件需要注意的事情是,如果我將時間戳存儲爲秒,我確實在wireshark中獲得了有效的時間戳。如所看到的here然而,毫秒被丟棄,這意味着在給定時間戳的情況下,在同一秒內接收的所有分組的排序不能被解決。

作爲參考,在這裏是從Wireshark的TCP捕捉較早採取了時間戳字段:

86 07 05 00 5A A5 4C F8 

不知怎的,我需要存儲我的時間戳像他們這樣做。

最新PCAP規範草案可以發現here

回答

0

我找到了解決問題的辦法。

時間戳確實正確存儲爲毫秒,但是,我沒有正確地在接口標題塊中存儲ts_resol選項。我只是存儲了一個32位對齊值(整數)作爲選項值。這是錯誤的,因爲規範說明最重要的位決定了時間戳分辨率的值。

解決方案是將ts_resol值存儲爲單個字節,然後添加3個額外的字節作爲填充以將值與32位對齊。

ts_resol之前:

ts_resol後(溶液)
00 09 00 01 00 00 00 03 

00 09 00 01 03 00 00 00