好吧,这可能看起来微不足道,但由于我的应用程序所需的testing性质,我需要得到精确的时间戳。
我正在使用WireShark来分析数据包。
假设我有两台主机h1和h2的networking。
h1和h2分别通过接口h1-eth0和h2-eth0相连。
当我在主机h1上运行Wireshark来捕获接口h1-eth0时,我可以绝对确定所logging的时间戳对应于主机h1的系统时间吗?
虽然这应该是这样,除了你有用的评论,如果我能得到一个相同的链接(这只是我可以正式化我的应用程序)真的会有所帮助。
[CONCLUDING REMARKS]:tcpdump的时间戳模块的联机帮助页。 PCAP-TSTAMP 。
注意:该手册页由Guy Harris自己撰写。 🙂
引用:
当捕获stream量时,每个数据包都有一个时间戳,代表数据包的到达时间,对于传出数据包,表示数据包的传输时间。 这一次是到达或传输时间的近似值。
假设我有两台主机h1和h2的networking。
h1和h2分别通过接口h1-eth0和h2-eth0相连。
当我在主机h1上运行Wireshark来捕获接口h1-eth0时,我可以绝对确定所logging的时间戳对应于主机h1的系统时间吗?
如果在主机h1上运行Wireshark(或tcpdump或WinDump或snoop或Microsoftnetworking监视器或Sniffer或OmniPeek或Commview或任何其他嗅探器,答案不是特定于Wireshark …),则数据包来自捕获机制在主机h1上运行的OS的networking堆栈以及时间戳相应于分组由该networking堆栈加时间戳的时间(即由主机h1加时间戳),或者在某些情况下与时间戳数据包由插入主机h1的networking适配器(或者在HP-UX上,在libpcap 从主机h1上的networking堆栈中读取数据包的时刻标记),因为HP-UX的捕获机制本身没有时间限制,邮票包)。
所以时间标记最接近运行嗅探程序的机器上的主机时间。 它不一定与数据包到达主机h1的networking适配器的确切时间(微秒或毫微秒)一致(除非networking适配器是对数据包进行时间标记,大多数不支持)。 数据包到达networking适配器的时间与时间标记的时间之间可能存在延迟,可能包括:
所以如果通过“我可以绝对确定被logging的时间戳对应于主机h1的系统时间吗? 你的意思是“我能够绝对确定所logging的时间标记是否与包裹到达时主机h1的系统时间高精度一致”,答案是“不一定,即使你在主机上运行H1" 。 它离主机h1到达包的时间比从主机h2发送包的时间还要近,但是如果你需要知道高精度和高精度的时间戳值,你需要专门的在networking适配器或专门调整的接收代码path上标记数据包的硬件(这可能意味着您必须破解接口驱动程序代码和networking堆栈代码;这种特殊调整的接收代码path不是,例如,Linux内核的configuration选项或Windows内核的registry选项)。
(顺便说一句,Mitch的答案只适用于Windows;在我的个人计算机上没有像KeQuerySystemTime这样的例程 – 数据包是用名为microtime的例程返回的值加上时间戳。
请记住,Wireshark是查看器,winpcap是捕获应用程序。
根据代码和邮件列表中有用的post ,时间戳来自非x86系统上的KeQuerySystemTime,以及KequerySystemTime和非x86系统上的rdtsc指令的组合。
无论如何,相对于系统时钟,您应该具有高于100ns的精度。
官方说明: http : //wiki.wireshark.org/Timestamps
在您提到的configuration中捕获networkingstream量时,您无法得到精确的时间戳,原因如下:
简单地说,使用在同一主机上运行的winpcap来testing主机是非常困难的。 我通常使用具有良好时钟的外部数据包捕获设备,如USC4060。