1、數據包格式
兩種數據包格式,pcap和pcapng兩種。pcapng為升級版,時間戳細粒度更高。
2、時間戳位置(arrival time)
時間戳在數據包中表現為物理層的arrival time
a、pcap格式
打開包找到arrival time下面的Epoch Time根據時間戳計算十六進制(在線工具:https://tool.oschina.net/hexconvert/),打開二進制工具搜索十六進制直接修改。數據包中每幀都包含有一個時間戳,且不在包本身的內容里,需要查看二進制數據才能找到。
b、pcapng格式
pcapng格式修改時間較為復雜,需要通過復雜的計算出對應的時間。可以使用010 editer的格式工具查看pcapng包能夠讀到時間戳如下:
時間是根據Timestamp (High) 和 Timestamp (Low)計算出的,計算公式(算法內容pcapng文檔有解釋說明)取自010的模版:
local uint8 tsresol_base = 10; // 10 or 2 local uint8 tsresol = 6; local int64 tsoffset = 0; local double tsscale = Pow(tsresol_base, -tsresol); string Read_TimeStamp(TimeStamp &ts) { local string res; local double seconds = (((int64)ts.timestamp_high * (int64)0xFFFFFFFF + ts.timestamp_low) + tsoffset) * tsscale; local time_t timet = (time_t) seconds; local double rem = seconds - (uint32)timet; // NOTE: This is fragile. TimeToString wants time_t which is 32 bits SPrintf(res, "%s + %.9lf UTC", TimeTToString(timet, "yyyy-MM-dd hh:mm:ss"), rem); return res; }
讀取方法為找到8位時間戳,分前后4位后分別以小端存儲方式讀取。
定位到算法后還是不明白為什么時間戳在新版的數據包中要使用如此復雜的方式進行計算存儲,希望看到的前輩給予指導。
格式參考文檔:https://pcapng.github.io/pcapng/