我有一个 .pkt 嗅探器捕获。当我从我的 C 应用程序读取捕获中的每个数据包时,我观察到附加了一个无线电标头。无线电报头包含每个数据包的纪元时间。我想以毫秒为单位找出两个数据包之间的时间差。我不确定如何区分两个纪元值并找出以毫秒为单位的时间差。请帮我解决一下这个。
2 回答
我有一个 .pkt 嗅探器捕获。
什么是“.pkt 嗅探器捕获”?您是否使用 Wireshark 捕获数据包?如果是这样,那么它是 pcap 或 pcap-ng 捕获。
无线电报头包含每个数据包的纪元时间。
在大多数嗅探器格式中,数据包的时间戳是“记录头”的一部分,而不是无线电信息头的一部分。对于 802.11 捕获,某些捕获文件格式可能会提供包含 802.11 定时同步功能计时器的无线电信息标头,但该计时器没有指定的时期。
数据包时间戳的纪元取决于捕获文件格式。pcap 和 pcap-ng 使用 1970 年 1 月 1 日 00:00:00 UTC 的 UN*X 纪元,因为 pcap 最初用于 UN*X 并且 pcap-ng 受 pcap 的影响。例如,其他文件格式可能使用 1601 年 1 月 1 日 00:00:00 "UTC" 的 Windows FILETIME 纪元(使用预测的公历)或其他时间来源。
但如果你想要的只是
以毫秒为单位找出两个数据包之间的时间差
那么纪元是无关紧要的——如果时间表示为“自某个纪元以来的X秒)(其中X不一定是整数;它可能有小数部分),那么“自纪元以来的X秒”和“ Y seconds since the epoch" 是X - Y,并且 epoch 本身抵消了。
那么,最大的问题是“自某个时代以来的秒数”如何表示。秒的整数计数?{纳秒、十分之一微秒、微秒、毫秒等}的整数计数?秒和{纳秒、微秒等}的组合?这就是为什么我们需要知道这是文件格式时间戳还是 802.11 TSFT,如果是文件格式时间戳,那是什么文件格式。
如果,正如您似乎指出的那样,这是一个 Wireshark 捕获(即,使用 Wireshark 进行的捕获,而不仅仅是 Wireshark 碰巧能够读取的捕获 - 它可以从不使用其本机 pcap 的程序中读取捕获或pcap-ng 格式),那么文件格式是 pcap 或 pcap-ng(在这种情况下,纪元是纪元,即 1970 年 1 月 1 日,00:00:00 UTS)并且时间戳是自 32 位秒纪元和自那一秒以来的 32 位微秒,对于 pcap,或自纪元以来的 64 位单位计数(单位由捕获相关数据包的接口的接口描述块指定;默认值为微秒)。
要计算两个 pcap 数据包的时间戳之间的差异,以微秒为单位,取秒值之间的差异,将其乘以 1,000,000,然后将微秒值之间的差异加上(两个差异都有符号)。要将其转换为毫秒,请将其除以 1,000。
要计算两个 pcap-ng 数据包的时间戳之间的差异,取时间戳值之间的差异;这是一秒的分数,其中分数由接口描述块中的指定值定义。要将其转换为毫秒,请根据分数进行适当调整(例如,如果是微秒,则将其除以 1,000)。
要计算两个 802.11 数据包的 TSFT 值之间的差异,只需从另一个值中减去一个值即可;TSFT 值(至少对于 radiotap 而言)以微秒为单位,因此,要将其转换为毫秒,请将其除以 1,000。
“时代”不是单位或格式;这是一个时间点。具体来说,它是 1970 年 1 月 1 日的午夜 UTC。
Unix 时间戳只是从那时起经过的秒数。用较大的减去较小的以秒为单位,然后乘以 1000 以得到毫秒数。