我在正在工作的一些网络机器上安装了 ntp。当我检查 ntpstat 时,我看到它显示时钟同步到几毫秒,通常在 12 到 70 毫秒之间。
我的问题是:
- NTP 如何找出上述值?
- 如果它知道这些值,为什么它不自我修正?
- 这些值是正数还是负数?
答案1
NTP 如何找出上述值?
NTP 协议允许每台计算机计算网络延迟(带有时间戳的数据包从一台计算机传输到另一台计算机所需的时间)的影响以及时钟时间的任何差异。
如果它知道这些值,为什么它不自我修正?
确实如此,但是它试图平稳地完成,网络抖动会使时间差异看起来发生变化,但实际上并没有。
这些值是正数还是负数?
ntpq -p
当为负数时,它们通常以 - 号显示。
答案2
我从未使用过ntpstat
(它不是 debian/ubuntu 上的标准安装),但使用 ntp 多年,通常查看ntpq -nc peer
或的输出ntpq -np
,可能显示类似的信息。ntpq
输出确实显示正值和负值。
基本上,如果 ntp(stat) 说它已同步(或 ntpq 的输出用“*”标记服务器),那么它就已经尽可能接近了,但它会继续尝试改进。
NTP 操作的简单解释是,它定期向时间服务器发送数据包,其中包含本地计算机认为的时间的时间戳。然后服务器添加其时间戳并将数据包返回到本地计算机。数据包到达后,本地计算机就会获得第三个时间戳,即到达时间。假设数据包到达和返回的时间相同,则 NTP 可以计算出服务器添加时间戳时本地计算机的时间,从而可以计算出差异并进行调整。
网络数据包通常需要几十毫秒才能到达服务器并返回。由于网络流量变化,传出和传入的传输时间可能不一样,但无法确定这一点,因此 NTP 必须假设它们是相同的。因此,NTP 永远无法接近精确同步的几毫秒,并且当发送和接收时间戳与服务器的时间戳相符时,它将声明同步。
即使同步,NTP 仍会继续交换数据包并尝试调整时间以尽量减少时间差异。它通过进行细微调整(实际上是通过稍微增加或减少一秒钟内的时钟“滴答”次数)来实现这一点,这样就不会出现突然的跳跃并避免因网络异常而导致的问题。
所以当ntpstat
说它是同步的时候,它是尽可能接近的,但它给出了它可能相差多远的最佳估计。