当大多数人初次接触**网络时间协议(NTP)**时,往往会想象一个简单的场景:

我的电脑向时间服务器询问当前时间,收到答复后更新自己的时钟。

遗憾的是,这种方法会产生不准确的时钟。

网络时间协议(NTP) 是一种网络协议,用于在 IP 网络上同步计算机和网络设备的时钟。NTP 并非简单地请求当前时间,而是估算网络延迟、补偿时钟漂移,并持续调整系统时钟,以尽可能精确地保持计算机同步。

真正的挑战不在于获取时间,而在于确定网络延迟对答复产生了多大影响。解决这个问题正是 NTP 成为分布式系统中最优雅、最广泛使用的协议之一的原因。

在本指南中,你将了解 NTP 的工作原理、精确时间的重要性,以及 NTP 如何利用四个时间戳计算时钟偏移和网络延迟。

此外,你还将了解 NTP 为何要查询多个时间服务器,以及它如何在硬件不完美和网络不可预测的情况下保持时钟同步。

首先,我们从 NTP 究竟是什么开始。

什么是网络时间协议(NTP)?

网络时间协议(NTP) 是一种网络协议,用于在 IP 网络上同步计算机和其他设备的时钟。它估算网络延迟、补偿时钟漂移,并持续调整系统时钟,使参与设备保持共同的时间概念。

NTP 并非简单地询问服务器当前时间,而是交换多个时间戳、过滤不准确的测量值,并逐步校准本地时钟。这使得互联网上的计算机在正常情况下能够在毫秒级内保持同步。

精确时间为何重要

现代计算机依赖精确时间,其用途远不止显示正确的日期和时间。几乎每个分布式系统都假设参与机器的时钟是合理同步的。

即使只有几秒钟的差异,也可能导致身份验证失败、日志排序错误、计划任务失败或服务器间数据不一致。

精确时间对许多日常技术至关重要,包括:

  • Web 安全: HTTPS 和 TLS 证书具有有效期。如果系统时钟严重错误,浏览器和应用程序可能会拒绝原本有效的证书。
  • 系统日志: 管理员使用时间戳来排查问题和调查安全事件。不同步的时钟使得难以跨多个系统重建事件的正确顺序。
  • 分布式系统: 数据库、消息队列和分布式应用程序通常依赖时间戳来协调操作、检测冲突和排序事件。
  • 计划任务: Cron 任务、自动备份、软件更新和维护窗口都依赖于准确的系统时间。
  • 身份验证协议: Kerberos 等安全机制使用时间戳来防止重放攻击。较大的时钟差异可能导致身份验证请求失败。
  • 金融系统: 银行、证券交易所和支付处理商需要精确的时间戳用于审计、法规遵从和交易排序。
  • 监控与可观测性: 监控平台关联来自多台机器的指标、日志和追踪。一致的时间戳使得能够识别故障的根本原因。

尽管在网络上实现完美同步是不可能的,但 NTP 通过持续估算网络延迟、纠正时钟漂移并逐步调整本地系统时钟,使时钟对于大多数应用来说足够接近。

要点: 精确时间是可靠、安全和分布式计算的基础要求。NTP 的存在是因为在不可靠的网络上保持时钟同步远比简单地询问另一台计算机当前时间要困难得多。

NTP 使用原子钟吗?

不直接使用。

大多数计算机从不与原子钟通信。相反,时间是通过一个层级结构来分发的。

Atomic clock / GPS reference
│
▼
Stratum 1 servers
│
▼
Stratum 2 servers
│
▼
Stratum 3 servers
│
▼
Your Linux system

Stratum 1 服务器连接到权威参考时钟,例如 GPS 接收器或其他精密时间源。你的计算机通常与 Stratum 2 或 Stratum 3 servers 同步,这些服务器从层级结构中更高层的服务器继承时间。

要点: 你的计算机不需要原子钟。它只需要一条可信的链条,最终追溯到原子钟即可。

时钟偏差 vs. 时钟漂移

这两个术语经常被混淆。

时钟偏差 是特定时刻两个时钟之间的差值。

例如:

Computer A: 10:00:05
Computer B: 10:00:00
Clock skew = 5 seconds

时钟漂移 描述的是时钟因硬件振荡器不完美而加快或减慢的速度。

即使是高质量的石英振荡器,也会以百万分之几的速率漂移,导致时钟在未同步的情况下逐渐偏离。

为什么简单地询问时间行不通

想象一下你的电脑发送了这个请求:

“现在几点了?”

服务器回复:

“14:50:00”

但当回复到达你的电脑时:

  • 网络延迟是 2 ms 吗?
  • 20 ms?
  • 200 ms?

在不知道延迟的情况下,仅凭时间戳是不够的。

这就是分布式系统中的基本同步问题。

NTP 如何估算网络延迟

NTP 不是交换单个时间戳,而是交换四个。

Client                     Server
t1  ---------------------->
receives at t2
replies at t3
<-----------------------  t4

其中:

  • t1 = 客户端发送请求
  • t2 = 服务器接收请求
  • t3 = 服务器发送回复
  • t4 = 客户端接收回复

利用这四个时间戳,客户端估算两个关键值:

往返延迟

δ = (t4 − t1) − (t3 − t2)

时钟偏移

θ = ((t2 − t1) + (t3 − t4)) / 2

这些公式使客户端能够估算通信延迟以及其时钟与服务器时钟的差异。

NTP 如何选择最佳时间服务器

关于网络时间协议(NTP)的最大误解之一是,它只是联系最近或最低 Stratum 的服务器,并信任其报告的时间。

实际上,NTP 要谨慎得多。

计算机网络本质上是不可靠的。数据包可能因拥塞而延迟,服务器可能配置错误,硬件时钟可能漂移,即使是高精度的时间服务器也可能因网络条件而暂时提供较差的测量值。

为了实现可靠的同步,NTP 会评估多个时间源,并持续确定哪个最值得信赖。

步骤 1:查询多个时间服务器

NTP 客户端通常配置为与多个独立的时间服务器通信,而不是依赖单个服务器。

每个服务器返回其当前时间,使客户端能够比较多个测量值,而不是盲目信任单个源。

Server A
\
Server B -----> Your Computer
/
Server C

使用多个服务器可以提高准确性和容错能力。如果某个服务器不可用或开始报告错误时间,客户端可以继续与其余服务器同步。

步骤 2:测量网络延迟和时钟偏移

对于它联系的每个服务器,NTP 会计算两个重要值:

  • 网络延迟:消息在客户端和服务器之间传输的估计时间。
  • 时钟偏移:客户端时钟与服务器时钟之间的估计差值。

这些测量值帮助客户端不仅确定服务器报告的时间,还确定该测量值的可靠性。

网络延迟非常大或变化剧烈的服务器,通常不如具有稳定、低延迟连接的服务器适合同步。

步骤 3:拒绝不可靠的时间源

并非每个服务器都值得信任。

服务器可能因以下原因报告错误时间:

  • 硬件故障
  • 配置错误
  • 过度网络拥塞
  • 临时网络问题
  • 与其上游时间源失去同步

由于三个服务器非常接近,而一个服务器差异显著,NTP 将异常服务器识别为异常值,并将其排除在同步过程之外。

这种过滤过程有助于防止单个故障服务器导致客户端设置错误的系统时间。

步骤 4:选择最佳同步源

过滤掉不可靠的测量值后,NTP 会选择最有可能提供准确和稳定时间的服务器。

该决策基于多个因素,包括:

  • 低网络延迟
  • 随时间保持一致的测量值
  • 稳定的时钟行为
  • Stratum 级别
  • 整体同步质量

一个常见的误解是 Stratum 1 服务器总是最佳选择。

实际上,情况并非如此。

例如,通过快速、低延迟网络连接的附近 Stratum 2 服务器,可能比通过缓慢或拥塞的互联网连接访问的远程 Stratum 1 服务器提供更准确的同步。

因此,NTP 会评估每个同步源的整体质量,而不是简单地选择 Stratum 编号最低的服务器。

为何这很重要

如果没有这些选择和过滤机制,即使单个故障服务器也可能导致成千上万台计算机采用错误的系统时间。

通过比较多个独立的时间源、拒绝不一致的测量值并持续重新评估同步质量,NTP 即使在单个服务器或网络路径变得不可靠时也能保持弹性。

要点: NTP 并非简单地选择最近或最低 Stratum 的服务器。它会持续比较多个时间源,过滤不可靠的测量值,并与在当前网络条件下提供最准确、最稳定时间的服务器同步。

为什么 NTP 通常不会跳跃时钟

假设你的电脑发现它快了五秒钟。

一个天真的实现会立即将时钟向后拨。

不幸的是,这可能会给以下方面带来问题:

  • 数据库
  • 计划任务
  • 日志文件
  • TLS 证书
  • 分布式应用程序

相反,NTP 通常会微调时钟。

它不是立即更改显示的时间,而是稍微加快或减慢系统时钟,直到它收敛到正确的时间。

较大的误差可能仍然需要跳跃,但正常操作依赖于通过时钟校准算法进行逐步调整。

NTP 有多精确?

在稳定的局域网(LAN)上,NTP 通常可以将时钟同步到几毫秒甚至更优的范围内。

在公共互联网上,精度通常在几十毫秒内,具体取决于网络延迟、拥塞、服务器质量和硬件。

NTP 可以在没有互联网的情况下工作吗?

可以。NTP 不需要互联网连接。

组织通常出于可靠性和安全性考虑,部署自己的内部 NTP 基础设施。内部 NTP 服务器可以与以下设备同步:

  • GPS 接收器
  • 原子参考时钟
  • 另一个受信任的内部 NTP 服务器

隔离网络、工业控制系统、军事环境和研究实验室通常使用本地 NTP 服务器来维护精确时间,而无需访问互联网。

为什么分布式系统将时间同步视为难题

乍一看,主从架构似乎就足够了。

Master
/    |    \
A     B     C

然而,现实引入了几个复杂因素:

  • 每个客户端经历不同的网络延迟
  • 网络延迟不断变化
  • 时钟持续漂移
  • 服务器可能故障
  • 某些服务器可能报告错误时间

NTP 通过结合延迟估算、统计过滤、多个时间源和持续时钟校准来解决这些问题,而不是盲目信任单个主服务器。

这就是教科书用整章篇幅讲解时钟同步的原因。该协议解决的问题远不止“向服务器询问时间”。

为什么 NTP 不能让每台计算机显示完全相同的时间?

在网络上实现完美同步是不可能的。

每个 NTP 数据包都会经历略有不同的延迟,原因包括:

  • 网络拥塞
  • 路由器队列
  • 可变传输时间
  • 处理延迟
  • 每台计算机内部的时钟漂移

NTP 通过统计过滤和持续时钟调整来最小化这些误差,但它无法完全消除不确定性。其目标不是实现完美同步,而是使时钟足够接近以实现可靠运行。

关于 NTP 的常见误解

常见问题(FAQ)

问:什么是网络时间协议(NTP)?

答:网络时间协议(NTP)是一种网络协议,用于在 IP 网络上同步计算机和网络设备的时钟。它估算网络延迟、补偿时钟漂移,并持续调整本地时钟,使系统保持共同的时间概念。

问:NTP 如何同步计算机时钟?

答:NTP 在客户端和时间服务器之间交换四个时间戳。利用这些时间戳,它估算往返网络延迟以及客户端与服务器时钟之间的差值(时钟偏移)。然后,客户端逐步调整其时钟以最小化误差。

问:Linux 使用 NTP 吗?

答:是的。大多数现代 Linux 发行版使用兼容 NTP 的软件(如 chronyd(Chrony)或 systemd-timesyncd)来同步时间。两者都通过与受信任的 NTP 服务器同步来自动维护准确的系统时间,不过 Chrony 通常在网络连接不稳定或时钟漂移变化较大的系统上提供更好的性能。

问:NTP 使用原子钟吗?

答:大多数计算机从不直接与原子钟通信。相反,它们与 NTP 服务器同步,这些服务器最终将其时间追溯到高精度参考时钟,例如原子钟或 GPS 校准时钟。这种层级结构使得精确时间能够高效地分布到整个互联网。

问:时钟偏差和时钟漂移有什么区别?

答:时钟偏差 是特定时刻两个时钟当前读数之间的差值。

时钟漂移 描述的是时钟因硬件振荡器不完美而加快或减慢的速度。如果时钟不定期同步,漂移会导致偏差随时间增加。

问:为什么 NTP 使用四个时间戳而不是一个?

答:单个时间戳无法区分当前时间和传递它所需的网络延迟。通过交换四个时间戳,NTP 可以估算通信延迟和时钟偏移,从而实现更精确的同步。

问:四个 NTP 时间戳是什么?

答:四个时间戳是:

  • T1: 客户端发送请求。
  • T2: 服务器接收请求。
  • T3: 服务器发送响应。
  • T4: 客户端接收响应。

这些时间戳使客户端能够计算网络延迟和时钟偏移。

问:为什么 NTP 不立即更改系统时钟?

答:突然将系统时钟向前或向后拨动可能会中断应用程序、数据库、计划任务和日志文件。相反,NTP 通常会微调时钟,通过稍微改变其速度直到匹配正确时间。较大的误差可能仍然需要跳跃时钟。

问:为什么 NTP 要查询多个时间服务器?

答:网络延迟、硬件故障和错误的服务器配置可能导致不准确的时间测量。NTP 比较来自多个服务器的响应,过滤掉不可靠的结果,并选择最值得信赖的时间源,以提高准确性和弹性。

问:什么是 Stratum 服务器?

答:Stratum 表示服务器与权威参考时钟的距离:

  • Stratum 0: 参考时钟,例如原子钟或 GPS 接收器(无法通过网络直接访问)。
  • Stratum 1: 直接连接到 Stratum 0 参考时钟的服务器。
  • Stratum 2: 与 Stratum 1 同步的服务器。
  • Stratum 3 及以下: 与更高层 Stratum 服务器同步的服务器。

较低的 Stratum 通常表示同步跳数较少,但并不自动保证更好的准确性。网络条件和服务器质量也起着重要作用。

问:NTP 和 PTP 有什么区别?

答:NTP 专为 IP 网络上的通用时间同步而设计,适用于大多数服务器、桌面和网络设备。

精确时间协议(PTP) 专为需要更高精度的环境而设计,通常达到微秒或纳秒级别,例如电信、工业自动化、科学研究和高频交易。PTP 通常需要硬件时间戳和专门的网络支持。

问:如果 NTP 停止工作会发生什么?

答:如果 NTP 不可用,系统时钟将继续使用本地硬件振荡器运行。由于没有振荡器是完美准确的,时钟会逐渐偏离正确时间。

随着时间的推移,这可能导致:

  • 身份验证失败(例如 Kerberos)
  • HTTPS 证书验证错误
  • 日志文件中的时间戳不正确
  • 错过计划任务
  • 跨多个服务器关联事件时出现问题
  • 分布式系统中的数据不一致

同步不可用的时间越长,时钟误差通常就越大。

问:NTP 是否考虑网络延迟?

答:是的。估算网络延迟是 NTP 的主要功能之一。

NTP 不是信任单个时间戳,而是在客户端和服务器之间交换四个时间戳。这些时间戳使客户端能够估算往返网络延迟以及其自身时钟与服务器时钟之间的差值。

由于网络延迟不断变化,NTP 会重复执行此过程,并持续优化其估算值,而不是假设延迟是恒定的。

问:NTP 使用 UDP 还是 TCP?

答:NTP 使用用户数据报协议(UDP) 而非 TCP。

UDP 非常适合时间同步,因为它开销较低,并且避免了可能引入额外和不可预测延迟的重传。由于 NTP 定期交换小数据包,偶尔的数据包丢失影响不大,因为下一个同步周期会很快更新时钟。

问:NTP 使用哪个网络端口?

答:NTP 使用 UDP 端口 123 进行客户端和服务器通信。

在配置防火墙或网络安全策略时,必须允许 NTP 客户端与其时间服务器之间的 UDP 端口 123。阻止此端口将阻止系统同步其时钟。

问:Chrony 和 ntpd 有什么区别?

答:Chrony 和 ntpd 都实现了网络时间协议,但它们针对不同的环境进行了优化。

Chrony 通常提供:

  • 启动后更快的同步
  • 在笔记本电脑和虚拟机上更好的性能
  • 改进了对间歇性网络连接的处理
  • 更好地补偿时钟漂移不稳定的系统

ntpd 是传统的 NTP 守护进程,已在 Unix 和 Linux 系统上使用了数十年。虽然它仍然得到广泛支持,但许多现代 Linux 发行版现在默认使用 Chrony 作为时间同步服务,因为它在现实条件下的性能更好。

问:为什么 GPS 用于 NTP?

答:GPS 卫星持续广播源自机载原子钟的高精度定时信息。

连接到 NTP 服务器的 GPS 接收器可以将这些信号用作高精度参考时钟。这使得服务器能够作为 Stratum 1 时间服务器运行,并将精确时间分发给网络上的其他系统。

尽管许多人将 GPS 与导航联系起来,但精确时间分发是其核心功能之一。

问:什么是闰秒?

答:闰秒是偶尔添加到协调世界时(UTC)的一秒调整,以使其与地球略微不规则的旋转保持一致。

由于地球自转并非完全恒定,UTC 偶尔需要调整以与天文时间保持同步。

NTP 包含通知客户端即将到来的闰秒的机制,以便它们能够正确处理调整。

一些组织还使用诸如闰秒涂抹之类的技术,该技术将调整逐渐分散到更长的时期内,以避免可能中断分布式应用程序的突然一秒跳跃。

结论

从研究分布式系统中得到的最重要的教训之一是,时间出乎意料地困难。

NTP 的成功并非因为它拥有原子钟,而是因为它仔细地估算不确定性、过滤不可靠的测量值,并持续纠正硬件缺陷。

这种组合使得数百万台计算机能够在网络不可靠和硬件不完美的情况下,保持非常精确的时钟。

资源: