网络时间协议如何工作?

时间:2009-08-04 15:13:24

标签: time synchronization ntp

Wikipedia entry没有提供详细信息,RFC过于密集。这里有人知道NTP是如何工作的吗?

我正在寻找一个概述,解释如何使用Marzullo's algorithm(或修改它)将服务器上的时间戳转换为客户端上的时间戳。具体而言,使用什么机制来产生准确度,平均而言,当通过具有高度可变延迟的网络进行通信时,平均在10ms内,这通常是数倍。

4 个答案:

答案 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的工作原理。

示例(在几秒钟内完成数学运算):

  • 客户端在“错误”时间发送请求100. A = 100。
  • 服务器在“真实”时间150接收请求.X = 150。
  • 服务器很慢,因此在“真实”时间160之前它不发送响应.Y = 160。
  • 客户端在“错误”时间120收到请求.B = 120。
  • 客户确定网络上花费的时间是B-A-(Y-X)= 120-100-(160-150)= 10秒
  • 客户端假设从服务器到客户端的响应所花费的时间是10/2 = 5秒。
  • 当服务器发送响应以估计它在“真实”时间165秒收到响应时,客户端将该时间添加到“真实”时间。
  • 客户现在知道它需要增加45秒的时钟。

在正确的实现中,客户端始终作为守护进程运行。在很长一段时间内有很多样本,NTP实际上可以确定计算机的时钟是慢还是快,并相应地自动调整它,即使以后断开网络也能保持合理的时间。与平均来自服务器的响应以及应用更复杂的思维一起,您可以获得非常准确的时间。

当然,还有更多适当的实现,但这是它的要点。

答案 1 :(得分:6)

  1. NTP客户端询问其所有NTP 服务器现在几点了。
  2. 不同的服务器会给出 不同的答案,因为不同的信心水平 请求将采取不同的金额 从客户到旅行的时间 服务器和后面。
  3. Marzullo的算法会找到最小的算法 时间范围值与 提供了所有答案。
  4. 您可以对此算法的答案的准确性比对任何单个时间服务器的答案的准确性更有信心,因为多个集合的交集可能包含的元素少于任何单个集合。
  5. 您查询的服务器越多,您对可能的答案的约束就越多,您的时钟就越准确。

答案 2 :(得分:0)

如果您使用时间戳来决定订购,则特定时间可能不是必需的。您可以使用lamport clocks代替,这比网络同步更少痛苦。它可以告诉你什么是“第一”,但不是时间的确切差异。它并不关心计算机的时钟究竟在说什么。

答案 3 :(得分:-2)

技巧是一些数据包速度很快,快速数据包会给你严格的时间限制。