将时间戳存储为两个32位字(pcapng格式)

时间:2014-11-21 18:32:38

标签: java timestamp byte pcap-ng

我正在生成我捕获的数据包的PCAPNG文件。除了每个数据包的时间戳无效外,一切似乎都能正常工作。

简单地说,我将时间戳存储在bytebuffer中以及所有其他数据并将其写入文件。当我使用十六进制编辑器检查文件时,我得到时间戳字段的以下值:

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规范,它说明了以下内容:

  

时间戳(高)和时间戳(低):a的高32位和低位   表示时间戳的64位数量。时间戳是单一的   64位无符号整数,表示自以后的单位数   UTC时间:1/1/1970 00:00:00指定了解释此字段的方法   通过接口的'if_tsresol'选项(参见图9)   此数据包引用的描述块。请注意   与libpcap文件格式不同,时间戳不保存为   两个32位值,表示自那以来的秒和微秒   1/1/1970。它们保存为单个64位数量,保存为两个   32位字。

所以我假设我只是将值作为long存储在bytebuffer中然后将其保存到文件中是错误的。但我怎么能把时间戳保存为两个32位字呢?我尝试了不同的东西,比如简单地将值存储为两个整数但似乎没有给我正确的格式。

请注意,我还在数据包中指定了if_tsresol,但无论我给它的值是多少(3 ^ 10 = -3 => millis),它都不会影响Wireshark解释文件的方式。

另外需要注意的是,如果我将时间戳存储为秒,我会在wireshark中获得有效的时间戳。如所见here但是,毫秒被丢弃,这意味着在给定时间戳的情况下,无法解析在同一秒内接收的所有数据包的排序。

作为参考,这里是一个时间戳字段,取自先前的wireshark TCP捕获:

86 07 05 00 5A A5 4C F8

不知怎的,我需要像他们一样存储我的时间戳。

可以找到最新的PCAP规范草案here

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案。

时间戳确实正确存储为毫秒,但是,我没有在接口标头块中正确存储ts_resol选项。我只是存储了一个32位对齐值(整数)作为选项值。这是错误的,因为规范声明最高有效位决定了时间戳分辨率的值。

因此,解决方案是将ts_resol值存储为单个字节,然后添加3个额外字节作为填充以将值对齐为32位。

之前

ts_resol:

00 09 00 01 00 00 00 03
<解决方案之后

ts_resol:

00 09 00 01 03 00 00 00