我正在生成我捕获的数据包的 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 中打开文件我得到46860 年 1 月 12 日
查看有关时间戳的 PCAPNG 规范,它指出以下内容:
时间戳(高)和时间戳(低):表示时间戳的 64 位量的高 32 位和低 32 位。时间戳是一个 64 位无符号整数,表示自 1/1/1970 00:00:00 UTC 以来的单位数。解释该字段的方式由该数据包引用的接口描述块的“if_tsresol”选项(参见图 9)指定。请注意,与 libpcap 文件格式不同,时间戳不保存为两个 32 位值,用于计算自 1970 年 1 月 1 日以来的秒数和微秒数。它们保存为单个 64 位数量,另存为两个 32 位字。
所以我假设我只是将值作为 long 存储在字节缓冲区中然后将其保存到文件中是错误的。但是我应该如何将时间戳保存为两个 32 位字?我尝试了不同的方法,例如将值简单地存储为两个整数,但似乎没有什么能给我正确的格式。
请注意,我还在数据包中指定了 if_tsresol,但无论我给它什么值(3 表示 10^-3 => 毫秒),它都不会影响 Wireshark 解释文件的方式。
另一件需要注意的事情是,如果我将时间戳存储为秒,我会在 Wireshark 中得到一个有效的时间戳。如此处所见但是,毫秒被丢弃,这意味着在给定时间戳的情况下,无法解析在同一秒内接收到的所有数据包的顺序。
作为参考,这里是从之前的 wireshark TCP 捕获中获取的时间戳字段:
86 07 05 00 5A A5 4C F8
不知何故,我需要像他们一样存储我的时间戳。