2009-08-04 107 views
33

Wikipedia entry没有提供细节,而RFC太密集。在这里,任何人都可以用一般的方式知道NTP的工作原理吗?网络时间协议如何工作?

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

回答

72

(这不是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。
  • 客户端确定网络上的时间花费是BA-(YX)= 120-100-(160-150)= 10秒
  • 客户端假设从服务器获取响应所花费的时间量客户端是10/2 = 5秒。
  • 当服务器发送响应以估计它在“真”时间165秒收到响应时,客户端将此时间添加到“真实”时间。
  • 客户端现在知道它需要增加45秒时钟。

在适当的实现中,客户端一直以守护进程的方式运行。 NTP可以在很长一段时间内对很多样品进行测试,实际上可以确定计算机的时钟速度是否较慢或较快,并相应地自动进行调整,即使稍后断开与网络的连接,也可以保持合理的良好时间。结合平均服务器的反应,以及应用更复杂的思维,您可以获得令人难以置信的准确时间。

当然,还有更多的东西比这个更合适,但这就是它的要点。

+2

谢谢,这正是我正在寻找的那种解释。所做的假设和一些约束有点令人惊讶。例如,服务器如何轻松地为'Y'提供可靠的保证?另外,我想知道实际上网络时代是如何对称的?似乎你可能能够使用Marzullo的算法来减少由这两种不确定性引起的误差。 – 2009-08-06 15:30:44

+0

更详细地了解服务器如何获得时间“X”和“Y” - 即它是否需要操作系统的帮助来计算数据包被接收/将被传输的确切时间,或者需要帮助。 ..? – 2013-07-18 18:12:16

-1

诀窍是有些数据包速度很快,并且快速数据包给你时间上的严格限制。

+1

重要的洞察力,为什么它在实践中的作品。这本可以作出很好的评论。 – 2015-02-13 14:42:01

5
  1. NTP客户端询问它的所有NTP 服务器什么时间。
  2. 不同的服务器会给 不同的答案,不同的置信水平,因为 请求需要的时间不同量 从客户前往 服务器和背部。
  3. Marzullo的算法会找到最小的 范围的时间值与 一致提供的所有答案。
  4. 对于来自此算法的答案的准确性,您比任何单一时间服务器的答案更准确,因为多个集合的交集可能会包含比任何单个集合更少的元素。
  5. 您查询的服务器越多,对可能的答案的约束就越多,并且您的时钟的准确度也会越高。
+2

我想知道这些置信区间是如何计算的。 – 2009-08-06 15:34:26

0

如果您使用时间戳来决定排序,特定的时间可能不是过时的。您可以使用lamport clocks,这比网络同步更省心。它可以告诉你什么是“第一”,但不是时间的确切差异。它并不在乎计算机的时钟实际上说什么。