NTP(Network Time Protocol)的核心是通过网络交换时间戳,估算客户端与时间服务器之间的时钟偏移和网络延迟,并据此校准本机时间。
- 客户端发送请求时记录发送时间
T1 - 服务器收到请求时记录
T2 - 服务器发送响应时记录
T3 - 客户端收到响应时记录
T4
利用这四个时间戳,可以估算客户端与服务器之间的时钟偏移(offset)和网络往返时延(delay)。由于网络路径可能存在不对称时延,因此得到的是统计意义上的估计值,而不是绝对精确的测量值。
NTP 并不是简单地“一次对准”,而是持续进行多次采样,通过滤波、选择和统计分析,降低网络拥塞、抖动等异常因素的影响,得到更加可靠的时间偏移估计。
同时,NTP 客户端会根据长期采样结果估计本地晶振的频率偏差(frequency offset),通过调整系统时钟的运行速率来抑制时钟漂移。对于较大的时间偏差,也可能直接进行 step(跳变校时);对于较小的偏差,则通常采用 slew(渐进校时)。
因此,NTP 本质上是一个持续测量、统计估计、时钟校准和频率校正的闭环系统。最终精度受到网络延迟、网络抖动、路径不对称以及本地时钟源和时间戳精度等因素限制。
主要国家授时机构
- 中国科学院国家授时中心(NTSC)
- 美国国家标准与技术研究院(NIST)
- 德国国家计量研究院(PTB)
- 法国巴黎天文台 SYRTE(Observatoire de Paris)
- 日本国家信息与通信技术研究所(NICT)
- 俄罗斯全俄物理、技术和无线电工程计量研究院(VNIIFTRI)
Linux 上常见的 NTP 服务软件
- Chrony:现代 Linux 环境中最常用的 NTP 实现之一,启动快、收敛速度快,对网络不稳定、虚拟机和频繁休眠/唤醒环境适应性较好。
- ntpd:传统 NTP 实现,历史悠久、兼容性好,在大量老旧系统和传统环境中仍然存在。
- OpenNTPD:OpenBSD 项目的轻量级 NTP 实现,强调代码简洁、安全和易维护。