2016-11-23 74 views
1

我有三台机器A, B, C通过以太网连接。 A将发送UDP数据包到B,这将转发到C。我想要可靠地测量传播时间。假设三台机器使用本地NTP server进行时间同步。可靠地比较不同机器在C++中的时间戳

C++中生成时间戳的最佳方式是什么?我目前的猜测是chrono。我理解它的方式是它的high_resolution_clock在这里没有问题,因为它可以使用像每个操作递增的CPU寄存器之类的东西。因此,这取决于机器启动的时间而变化很大。相反,我将与steady_clock一起使用,这将使用同步的系统时间,但希望可以防止我遇到像闰秒这样的事情,如果我使用system_clock时会出现问题。

我对这些假设是否正确?有没有更好的方法来做到这一点?

+0

您定位的是哪个操作系统/工具链? – user4581301

+0

Linux(一些Ubuntu变体),事情使用boost :: asio发送出去。每当有东西被发送时,源将记住它发送该数据包的时间戳。水槽将记住到达的时间戳。这两个数据都会周期性地发送。 – kunterbunt

+0

忽略闰秒。如果您发现在测量过程中或测量周围发生闰秒,请放弃该测量。要处理最多六个月发生的事件,要比特殊情况要容易得多。 – user4581301

回答

3

稳定的时钟根本不会帮你,因为它不是挂钟,它可以根据定义不同步(稳定,NTP不能改变它)。所以你唯一的选择是挂钟/系统时钟。

但是你的问题之一是通过NTP的时间同步不是很精确。如果你想比较几秒钟内的时间戳,它可能是好的。对于其他任何事情,你的时钟往往太过遥远,无法提供良好的结果。

存在用于在不同机器之间同步时钟的专用协议,例如, PTP和gPTP。其中一些甚至需要专用硬件(例如支持以太网AVB的硬件)。如果您需要精确,那么您的第一个研究应该是如何将这些内容整合到您的系统中以及如何阅读它们的时间戳。

+0

关于PTP的好处。 NTP对时间精度的保证非常广泛,如果您想在本地网络上对数据包进行定时,NTP的保证功能不是很有用。 – user4581301

+0

此链接(https://www.eecis.udel.edu/~mills/ntp/html/discipline.html)指出,在快速LAN上,NTP可以“在一毫秒内保持名义上的同步”。这对我来说很好,而且比秒更准确...... – kunterbunt

+1

你的问题是提到测量数据包延迟。在LAN上,UDP数据包的延迟将在微秒范围内。所以我猜你需要高精度,并且这些协议是为了达到这个目的而开发的。 – Matthias247