在NTP报文中,stratum字段用来标记时间服务器的层级位置。它不直接表示时间误差有多大,而是说明当前节点距离基准时钟经过了多少次同步跳转。权威参考源位于最顶层,往下每一级在同步链路上增加一层。这个字段的取值范围、过滤规则和实际网络环境中的表现,是排查时间不同步问题时最先需要搞清楚的内容。

一、stratum层级的定义与取值范围
NTP把时间源划分为0到15共16个有效层级。stratum 0不是网络中的服务器,而是直接产生标准时间的物理设备,包括铯原子钟、GPS或北斗接收机、无线电授时台等。这些设备通常只通过串口、PPS脉冲或专用内核驱动向计算机提供时间信息,并不会在网络上用NTP协议直接应答客户端请求。
真正接受NTP查询的是stratum 1服务器。这类机器通过硬件接口直接绑定stratum 0设备,并把读取到的时间作为自身系统时钟。stratum 2服务器则从stratum 1同步,stratum 3从stratum 2同步,依此类推。NTP协议允许的最大正常层级是15,超过这个深度就认为同步链路太长,不再适合作为时间源。stratum 16是特殊取值,表示设备当前没有有效上游、尚未同步,其他客户端不应把它当作候选服务器。
# 查看当前NTP服务器的层级和同步状态
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*time.cloudflare 10.0.0.1 2 u 32 64 377 12.345 -0.123 0.567
+ntp.aliyun.com 203.0.113.5 2 u 45 64 377 18.901 0.456 0.789
LOCAL(0) .LOCL. 10 l - 64 0 0.000 0.000 0.000
上面输出中的st列就是stratum。带星号的是当前选中源,加号表示候选源。LOCAL(0)被手动设置为stratum 10,它使用本地时钟作为所有上游都不可达时的最后兜底。需要留意,stratum值写在NTP报文头部,用8位无符号整数表示,0到15是正常范围,16为不同步,17以上为保留值。
二、客户端如何利用stratum选择时间源
NTP客户端不会因为某台服务器st列数值最小就直接选择它。最初阶段,客户端会先根据stratum、可达性和同步距离过滤掉明显不可用的节点,例如stratum 16、不可达或root distance过大的源。通过初筛后,再综合比较各服务器的延迟、抖动、偏移量等指标,选出最优时钟。
所以stratum更像一个信任门槛,而不是精度的绝对保证。一个通过高延迟链路可达的stratum 1源,其offset可能因为路径抖动而不稳定;相反,数据中心内部一台从稳定stratum 1同步来的stratum 2服务器,延迟低、抖动小,最终可能提供更平滑的时间。实际选择中还涉及NTP的时钟过滤算法和组合算法,它们会维护多个候选源并持续评估质量。
# chrony配置示例 server time.cloudflare.com iburst server ntp.aliyun.com iburst # 默认stratumweight为0.05,可调整层级在距离计算中的权重 stratumweight 0.05 # 本地时钟兜底,stratum设置为10 local stratum 10
在chrony中,stratumweight参数用于控制层级在同步距离计算里的权重。默认值0.05表示每增加一层,同步距离增加约0.05秒。这个参数可以在特殊网络里微调,让客户端在低层级但高延迟与高层级但低延迟之间取得平衡。如果不想让本地时钟过早接管,可以把local stratum设置为较大的值,比如10或12。
三、配置与排障中的层级误区和实践
最常见的误区是把stratum值直接等同于时间精度。stratum 1并不一定比stratum 2更准确,它只说明这台设备直接连接了参考时钟。参考时钟本身的稳定度、上游接收机质量、操作系统PPS处理延迟,都会影响最终输出的时间。如果一台stratum 1服务器的本地振荡器很差,失去GPS信号后很快漂移,那么它对客户端来说未必比一台由高质量晶振构建的stratum 2服务器更可靠。
另一个容易混淆的概念是stratum 16。有些人在ntpq输出里看到st列显示16,却没有理解这意味着服务器自己已经失去同步。客户端不应选择stratum 16的源,除非已经把所有正常源都标记为不可用,并且配置了本地时钟兜底。把stratum 16服务器留在配置里,可能导致NTP反复尝试无效请求,拉长收敛时间。
# /etc/ntp.conf 示例:忽略stratum 16的源并限制轮询间隔 server 192.0.2.10 iburst minpoll 6 maxpoll 10 tos maxdist 16
上面配置中,tos maxdist 16设置最大同步距离。当上游源超过这个距离时,NTP会认为它不适合同步。实际运维中,不要只盯着st列的数值,而应该结合reach、delay、offset、jitter等字段判断时间源质量。如果要把自己的主机配置成stratum 1,必须安装GPS接收机或原子钟驱动并正确接入PPS信号;仅仅在配置文件中写local stratum 1并不会让它成为真正的权威时间源。