什么是NTP(网络时间协议)?基础知识梳理

它是"自动设置时间"这个选项背后,默默工作的协议。

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

NTP是一种标准协议,让电脑、服务器和网络设备能够定期将各自内部时钟与互联网上精确的时间服务器进行核对,使用UDP 123端口通信。就像人们用广播报时来校准手表一样,设备之间会自动互相查询时间并据此校正自己的时钟。

时间准确为什么重要

浏览器会把HTTPS证书的有效期与你设备自身的时钟进行比对,如果时钟严重偏差,即使访问的是正常网站也可能出现证书错误。一次性密码(OTP)认证应用是根据当前时间生成验证码的,如果设备和服务器之间的时间差过大,就会导致认证反复失败。要按时间顺序比对多台服务器的日志,也必须建立在各服务器时钟一致的基础上。

层级(Stratum)结构

Stratum 0指的是原子钟或GPS接收器这类本身并不接入网络的最高级基准时钟源。直接连接这类基准源的服务器成为Stratum 1,负责向其他服务器提供时间;参照Stratum 1服务器的服务器则是Stratum 2,以此类推逐级下降。层级数字越小,代表离最初的基准时钟源越近。

NTP如何校正误差

NTP客户端会向多台时间服务器发起查询,根据发送请求到收到响应之间的时间估算网络往返延迟,并据此计算出自己时钟与服务器所报时间之间的偏差(offset)。它会剔除明显异常的数值,而且在校正时钟时不会突然跳变,而是逐步调整时钟走动的速度,慢慢将其对齐。这种方式通常能把设备的同步精度维持在几毫秒到几十毫秒之间。

日常设备中的NTP

Windows、macOS、Android和iOS都内置了通过互联网自动校准时间的功能,这背后正是NTP在发挥作用。如果关闭了这项设置,或者防火墙屏蔽了NTP通信(UDP 123端口),设备内部时钟就会逐渐产生偏差,日后可能引发登录失败或证书错误等看似莫名其妙的问题。

NTP相关的安全风险

配置松散的公共NTP服务器可能被用于NTP放大攻击:攻击者用少量伪造请求诱使服务器向受害者IP发送远大于请求本身的响应数据,从而构成一种DDoS攻击。如果自己搭建并运行NTP服务器,通常建议限制可查询的对象范围,并保持软件版本更新以修补已知漏洞。

每次交互记录的四个时间戳

一次NTP交互会记录四个时刻:客户端发出请求的时间(T1)、服务器收到请求的时间(T2)、服务器发出回复的时间(T3)、客户端收到回复的时间(T4)。往返延迟等于(T4-T1)减去服务器处理时间(T3-T2),时钟偏差则估算为((T2-T1)+(T3-T4))/2。这个估算假定去程和回程耗时大致相同,所以网络路径不对称时会留下小误差。

NTP与SNTP的区别

SNTP(简单网络时间协议)使用相同的报文格式,但省去了过滤和时钟校正算法,只向一台服务器询问后设置时钟。许多手机和嵌入式设备因为轻量而使用SNTP。ntpd、chrony等完整实现会查询多台服务器、过滤噪声,并跟踪本地晶振的漂移趋势,因此结果更稳定。

公共服务器与NTP池

家用设备多使用厂商默认的服务器,如time.windows.com或time.apple.com;Linux系统则常用志愿者运营的pool.ntp.org,它把一个域名对应到众多服务器上以分散负载。大型机构通常自建内部NTP服务器向上游同步,内网设备只向内部服务器查询,避免成千上万台机器同时访问公共服务器。

闰秒与时间“涂抹”

由于地球自转并不均匀,UTC偶尔会插入闰秒。这对软件来说很麻烦:有的系统会重复一秒,有的会暂停一秒。一些大型运营商采用“涂抹”(smearing)的办法,在数小时内把时钟走速稍微放慢,让多出的一秒被逐渐吸收。如果在同一个客户端的服务器列表里混用涂抹和不涂抹的服务器,会出现令人困惑的偏差,所以最好统一方式。

用NTS实现带认证的授时

传统NTP报文默认不做认证,理论上路径上的攻击者可以篡改客户端的时间。NTS(网络时间安全,RFC 8915标准化)通过TLS交换密钥并让NTP报文带上认证信息。较新的chrony和部分公共服务已经支持,在条件允许时值得开启。

即使GPS已经普及,为什么仍然需要NTP

GPS接收器能提供极其精确的时间,但笔记本电脑、室内的手机、物联网传感器、数据中心里的服务器等日常设备大多既没有内置GPS接收器,也未必有条件接收到卫星信号。这时候层级结构就派上了用场:少数与GPS或原子钟直连的Stratum 1服务器,通过庞大的公共及机构NTP服务器网络逐级分发时间,让几乎所有联网设备都能获得精确时间,而无需自备基准时钟。

需要留意的一点:NTP的精度也有上限

常见的NTP同步精度在几毫秒到几十毫秒之间,这对于网页浏览、身份验证和日常日志记录来说已经绰绰有余。但金融交易系统、电信网络,以及需要微秒甚至纳秒级精度的科研仪器,通常会改用PTP(精确时间协议)——这是一套专为受控、低延迟网络而非开放互联网设计的更严格标准。如果项目对时间精度的要求达到毫秒以下,仅靠NTP通常是不够的。

如何检查并修复走偏的时钟

在Windows上,先在日期和时间设置中确认已开启自动设置时间,用命令w32tm /query /status可以查看同步来源和上次同步时间。在Linux上,timedatectl能显示系统时钟是否已同步,使用chrony时chronyc tracking可以查看当前偏差。如果同步失败,依次检查出站UDP 123端口是否放行、时间服务器域名能否被DNS解析、硬件时钟是否偏差过大。在虚拟机里,宿主机和客户机可能争夺对时,应当只保留一种同步方式。在自己管理的网络中,让所有机器指向同一个内部时间源,各机器日志的时间才能彼此对得上。

提前应对2036年的回绕

NTP用一个从1900年开始计数的32位秒计数器,这个数值会在2036年回绕。协议用“纪元”(era)编号来处理这个问题,现代实现会假定时间接近当前日期来消除歧义。但无法升级的老旧嵌入式设备可能出问题,所以像工业控制器这类长期使用的设备,最好提前清点。这与更有名的32位Unix时间戳2038年问题类似,但二者是不同的问题。

常见问题

电脑时钟不准,实际会造成什么问题?

常见的表现包括:访问本来正常的HTTPS网站却弹出证书错误、双重验证(OTP)验证码反复被判定为无效,以及难以按正确的时间顺序比对多台服务器的日志。

手机也是用NTP来对时的吗?

是的。大多数手机只要在设置中开启类似"使用网络提供的时间"这样的选项,就会通过运营商网络或互联网自动同步时间。如果关闭这项设置,手机就只能依赖自身内部时钟,时间可能会随着使用逐渐产生偏差。

NTP放大攻击现在还是问题吗?

最著名的案例源于旧版ntpd的monlist命令会返回一长串最近的客户端列表,后来的版本已修复。已更新、并且只应答预期客户端的服务器,对攻击者的价值要小得多。仍有风险的是暴露在互联网上、长期没有更新的旧设备。

手机从运营商网络获取的时间和NTP是一回事吗?

移动网络本身也会下发时间,手机会根据设置使用运营商时间或NTP式的互联网对时。两者都以UTC为基准,但运营商时间有时精度较粗,需要更精细的精度时通常使用互联网对时。

客户端应该配置几台时间服务器?

配置三四台以上独立的服务器,即使其中一台出错也能被识别并剔除。只用一台会形成单点故障,用两台则在结果不一致时无法判断哪一台正确。