我有一台配备Intel i350 T2 NIC的PC,我希望使用tcpdump
同时在两个接口上捕获。两个接口都连接到一个100mbit HUB(原文如此!),它可以在同一时间将来自外部流量源的各种流量转发到两个接口,因此我可以测量各个以太网MAC所做的时间戳的差异。
同时捕捉:
user@rt:~$ sudo tcpdump -j adapter --time-stamp-precision nano -B 1048576 -i eth2 -w test_eth2.pcap
user@rt:~$ sudo tcpdump -j adapter --time-stamp-precision nano -B 1048576 -i eth3 -w test_eth3.pcap
之后我将两个文件合并在一起以比较时间戳:
user@rt:~$ mergecap -F nseclibpcap -w merged.pcap test_eth2.pcap test_eth3.pcap
然后Wireshark告诉我,对于一些数据包,我得到了大约20-40nsec的重复帧的时间戳差异(这对我的应用来说很好并且足够了!)。 但是,当比较相应的副本时,还有很多帧显示差异达数十微秒。
user@rt:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 15.04
Release: 15.04
Codename: vivid
user@rt:~$ uname -r
3.19.0-28-generic
user@rt:~$ lscpu | grep "Model name"
Model name: Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
phc2sys
将所有适配器时钟同步到CLOCK_REALTIME?THX寻求帮助或指出我的错误!
答案 0 :(得分:2)
从igb_ethtool.c
快速浏览一下,您的NIC确实能够进行硬件时间戳。您观察到的抖动(20-40ns)恰好处于从同步到以太网时钟的预期PHY抖动范围内。 (对于100Mbit,时钟为25MHz或40ns。)
到目前为止,感谢英特尔。没有多少NIC /驱动程序具有此功能。
现在不好的部分:我怀疑现在有什么东西正在将CLOCK_REALTIME同步到NIC适配器时钟。时钟可能以略微不同的频率自由运行。这些振荡器通常规定为50ppm,典型的漂移量约为5ppm,这意味着它们每秒漂移约5us,随室温而变化。使用纳秒精度时请记住这一点。如果您的系统使用NTP,您甚至可能会看到发生NTP漂移调整。
但好消息是你可能不需要同步它们,除非你真的想要绝对的时间戳。您的NIC完全支持硬件时间戳的主要原因可能是支持IEEE1588 PTP(精确时间协议)。如果你需要亚微秒精度的绝对时间,你应该看看这个协议和/或购买GPS接收器。
如果您只需要相对时间戳,则可以尝试-j adapter_unsynced
而不是-j adapter
,或者您可以尝试阻止NTP尝试漂移校正您的系统时钟。如果所有这些都失败了,您可以尝试启动linuxptp,这可能具有正确同步NIC和系统时间的能力,即使您没有PTP网络也是如此。
最后......你正在使用HUB,这意味着以太网以半双工模式运行,这意味着......冲突。除非你的NIC绝对安静。我认为理论上这应该无关紧要,因为您在两个NIC中都观察到相同的冲突,并且帧不会根据它们采用的路径而延迟或排队。但是,由于半双工现在如此罕见,因此可能没有实现NIC时间戳支持。这种实现中的典型错误例如是返回前一帧的时间戳而不是当前帧的时间戳。
答案 1 :(得分:0)
英特尔i350数据表的第7.9章可能会帮助您解决第3个问题。它提供了一组可在igb驱动程序中配置的PTP寄存器。