Wikipedia entry没有提供详细信息,RFC过于密集。这里有人知道NTP是如何工作的吗?
我正在寻找一个概述,解释如何使用Marzullo's algorithm(或修改它)将服务器上的时间戳转换为客户端上的时间戳。具体而言,使用什么机制来产生准确度,平均而言,当通过具有高度可变延迟的网络进行通信时,平均在10ms内,这通常是数倍。
答案 0 :(得分:86)
(这不是Marzullo的算法。只有高层服务器才能使用多个来源获得真正准确的时间。这就是普通客户只需一台服务器就能获得时间的方法)
首先,NTP时间戳自1900年1月1日起以秒为单位存储。秒数为32位,秒数为32位。
同步很棘手。客户端在发送请求时存储时间戳(例如A)(所有这些值以秒为单位)。服务器发送一个回复,包括收到数据包时的“真实”时间(称为X)和发送数据包的“真实”时间(Y)。客户端将收到该数据包并记录收到数据的时间(B)。
NTP假设在网络上花费的时间与发送和接收时间相同。在理智的网络上有足够的间隔,它应该是平均值。我们知道从发送请求到接收响应的总传输时间是B-A秒。我们想要删除服务器处理请求所花费的时间(Y-X),只留下网络遍历时间,这样就是B-A-(Y-X)。由于我们假设网络遍历时间是对称的,因此从服务器到客户端的响应所花费的时间是[B-A-(Y-X)] / 2。所以我们知道服务器在时间Y发送了它的响应,并且我们[B-A-(Y-X)] / 2秒响应该响应。
因此,我们收到回复的真实时间是Y + [B-A-(Y-X)] / 2秒。这就是NTP的工作原理。
示例(在几秒钟内完成数学运算):
在正确的实现中,客户端始终作为守护进程运行。在很长一段时间内有很多样本,NTP实际上可以确定计算机的时钟是慢还是快,并相应地自动调整它,即使以后断开网络也能保持合理的时间。与平均来自服务器的响应以及应用更复杂的思维一起,您可以获得非常准确的时间。
当然,还有更多适当的实现,但这是它的要点。
答案 1 :(得分:6)
答案 2 :(得分:0)
如果您使用时间戳来决定订购,则特定时间可能不是必需的。您可以使用lamport clocks代替,这比网络同步更少痛苦。它可以告诉你什么是“第一”,但不是时间的确切差异。它并不关心计算机的时钟究竟在说什么。
答案 3 :(得分:-2)
技巧是一些数据包速度很快,快速数据包会给你严格的时间限制。