我有一个 .pkt 嗅探器捕获。当我从 C 应用程序中读取捕获中的每个数据包时,我观察到附加了一个 radio header 。 radio header 包含每个数据包的时间(以纪元为单位)。我想找出两个数据包之间的时间差(以毫秒为单位)。我不知道如何区分两个纪元值并找出以毫秒为单位的时间差。请帮我解决这个问题。
最佳答案
I have a .pkt sniffer capture.
什么是“.pkt 嗅探器捕获”?你是用Wireshark抓包的吗?如果是这样,那么它要么是 pcap 要么是 pcap-ng 捕获。
The radio header contains the time in epoch for each and every packet.
在大多数嗅探器格式中,数据包的时间戳是“记录 header ”的一部分,而不是 radio 信息 header 的一部分。对于 802.11 捕获,某些捕获文件格式可能会提供包含 802.11 定时同步功能计时器的 radio 信息 header ,但该计时器没有指定的纪元。
数据包时间戳的纪元取决于捕获文件格式。 pcap 和 pcap-ng 使用 UN*X 纪元 1970 年 1 月 1 日 00:00:00 UTC,因为 pcap 最初在 UN*X 上使用,并且 pcap-ng 受 pcap 的影响。例如,其他文件格式可能使用 Windows FILETIME 纪元 1601 年 1 月 1 日 00:00:00“UTC”(使用 proleptic Gregorian calendar )或某个其他时间原点。
但如果你想要的只是
find out the time difference between two packets in terms of milliseconds
那么纪元是无关紧要的 - 如果时间表示为“自某个纪元以来的X秒”(其中X不一定是整数;它可以有一个小数部分),则“自纪元以来的X秒”和“自纪元以来的Y秒”之间的时间为X - 是的,纪元本身就抵消了。
那么,最大的问题是如何表示“自某个纪元以来的秒数”。秒的整数计数? {纳秒、十分之一微秒、微秒、毫秒等}的整数计数?秒和{纳秒、微秒等}的组合?这就是为什么我们需要知道这是文件格式时间戳还是 802.11 TSFT,如果是文件格式时间戳,则是什么文件格式。
如果,正如您似乎指出的那样,这是一个 Wireshark 捕获(即,使用 Wireshark 进行的捕获,而不仅仅是 Wireshark 恰好能够读取的捕获 - 它可以从不使用其 native pcap 或 pcap-ng 格式),则文件格式为 pcap 或 pcap-ng(在这种情况下,纪元为 Epoch,即 1970 年 1 月 1 日,00:00:00 UTS),时间戳为 32-自纪元以来的位秒数和自该秒以来的 32 位微秒(对于 pcap)或自纪元以来的 64 位单位计数(单位由捕获相关数据包的接口(interface)的接口(interface)描述 block 指定;默认为微秒)。
要计算两个 pcap 数据包的时间戳之间的差异(以微秒为单位),请将秒值之间的差异乘以 1,000,000,然后加上微秒值之间的差异(两个差异均带符号)。要将其转换为毫秒,请将其除以 1,000。
要计算两个 pcap-ng 数据包的时间戳之间的差异,请取时间戳值之间的差异;这是秒的分数的计数,其中分数由接口(interface)描述 block 中的指定值定义。要将其转换为毫秒,请根据分数进行适当调整(例如,如果是微秒,则将其除以 1,000)。
要计算两个 802.11 数据包的 TSFT 值之间的差异,只需将一个值减去另一个值即可; TSFT 值(至少对于 radiotap 而言)以微秒为单位,因此,要将其转换为毫秒,请将其除以 1,000。
关于c - Epoch和wireshark捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956296/