(笔记)【NTP系列:05】NTP时间同步失败:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端


 
一、问题现象
使用windows(W32Time)作NTP时钟源服务端,控制板端Linux作为客户端,使用ntpd服务无法同步时间,但是ntpdate是可以同步成功。
 


二、问题分析

1. 从报文的角度分析ntpd是否正常工作,以及与ntpdate的报文区别

通过使用抓包工具发现,NTP虽然同步失败,但其实NTP是有一直在发送NTP报文的,如下:

 
推断结论:ntpd启动后,会一直定时发送请求报文,默认是64S。且报文与ntpdate无异,由此可知,ntpd服务工作是正常的,但是时间没有同步,应是由于内部某种机制判断报文时间无效造成。
 
 
2. 使用“ntpq -c as”进行分析

[root@DB ~]# ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 46885  9024   yes   yes  none    reject   reachable  2
[root@db~]# ntpq -c "rv 46885"
associd=46885 status=9024 conf, reach, sel_reject, 2 events, reachable,
srcadr=192.170.150.251, srcport=123, dstadr=192.170.150.13, dstport=123,
leap=00, stratum=1, precision=-6, rootdelay=0.000, rootdisp=10742.889,
refid=LOCL, reftime=db2c9fb9.07818901  Sun, Jul 10 2016 18:19:37.029,
rec=db2d94e4.cabd81b8  Mon, Jul 11 2016 11:45:40.791, reach=377,
unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=50,
flash=400 peer_dist, keyid=0, offset=72815.578, delay=0.423,
dispersion=16.529, jitter=10.969, xleave=0.029,
filtdelay=     0.42    0.36    0.37    0.35    0.35    0.34    0.32    0.35,
filtoffset= 72815.5 72812.7 72810.1 72808.1 72805.4 72803.5 72800.8 72798.6,
filtdisp=     15.63   16.63   17.64   18.61   19.60   20.59   21.60   22.57

 

Rootdelay: 表示相对于同步子网根的主参考源的最大误差, 只有大于零的正值才有可能。
Delay :表示对端时钟相对于本地时钟在它们之间的网络路径上的往返延迟. 请注意,此变量可以采用正值和负值,具体取决于时钟精度和偏斜误差累积
Dispersion :表示对端时钟相对于它们之间网络路径上的本地时钟的最大误差。 只有大于零的正值才有可能。
Root Dispersion :表示相对于同步子网根时钟源的最大误差。 只有大于零的正值才有可能。
Jitter :抖动(也称为定时抖动)是指频率的短期变化。
Offset:客户端与时钟源的时差。
filtdelay,filtoffset和filtdisp:三个对等变量显示最后八轮测量轮次中的每一轮的延迟,偏移和抖动统计。这些统计信息及其趋势是服务器,客户端和网络的重要性能指标。例如,延迟和抖动的大幅波动表明网络拥塞。缺少时钟滤波器阶段表明网络中的数据包丢失。

 

推断结论:上述结果表示NTP拒绝了这个server,返回码flash=400 peer_dist(对于flash状态码的解释请查阅本文附一),表示distance(距离)超过了距离阈值,默认的距离阈值是1.5s。

distance(距离)计算公式(ms单位换算为s):
distance = ((delay + rootdelay) / 2 + dispersion + rootdispersion + jitter) / 1000

将上述调试结果具体值带入计算公式得到距离值distance: distance = ((0.423 + 0.000) / 2 + 16.529 + 10742.889 + 10.969) / 100010.770s > 1.5s(默认距离阈值)

本例中rootdisp值较大,一般常见的是w32time时钟源场景,且该时钟源服务器windows可能未配置稳定的外部时钟源。而默认的tos maxdist距离阈值是1.5s(1500ms),超过该阈值则不会被时钟选择算法认可,客户端不会从这个时钟源进行时间同步。
 
 
备注:

(1)对于同步距离,官方文档对该部分介绍的中文翻译为:
同步距离(定义为延迟的一半加上色散)表示最大误差统计量。抖动表示预期的错误统计信息。从对等变量计算的最大错误和预期错误表示服务器的质量度量。从系统变量计算的最大误差和预期误差表示客户端的质量度量。如果任何服务器的根同步距离超过1.5秒(称为选择阈值),则认为该服务器无效。
1.5S是linux的默认值,如果不人工配置该值,则默认值生效,可以在/etc/ntp.conf中加入tos maxdist 30将同步距离的阈值改为30。如果一次同步的同步距离大于设置的门限值,客户端会认为该时钟源不可信,不会进行同步,此时的flash状态码会返回400,说明超过最大同步距离。但是会继续发送探测报文。造成同步距离变大的原因不在少数,比较常见的是网络波动和某一端发生时间跳变。
 
(2)距离阈值是可设置的,可以在/etc/ntp.conf中(在restrict、server行之前)修改/新增tos maxdist 30来设置距离阈值为30s,提升系统对时钟源稳定性的容忍度。
 
 
 
三、解决方案
方案一:更换linux系统作ntp时钟源(推荐)
方案二:添加参数规避(规避方案,不推荐)
1、使用vi编辑器,修改/etc/ntp.conf,在所有“restrict”、“server”开头的行之前添加一行tos maxdist 30;添加之后,按esc,输入:wq存盘退出。
 
2、强制时间同步(对时间敏感的业务需停业务后执行此操作,如数据库)
[root@db~]# systemctl stop ntpd
[root@ db~]# ntpdate 172.16.1.200        //172.16.1.200是ntp服务器IP
[root@ db~]# systemctl start ntpd


此时可使用“ntpq -p”指令查看时间同步是否恢复正常,remote列IP前面有*代表NTP服务器正常工作。

[root@DB~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==================================================================
 *172.16.1.200       .LOCL.     1 u  3  64   1    0.210   -0.500   0.000

 



附一:NTP官方文档对于flash状态码的解释
 

 
NTP官方文档对于flash状态码的解释
信息 描述
0000 ok 同步成功
0001 pkt_dup 重复包
0002 pkt_bogus 伪包
0004 pkt_unsync 服务器未同步
0008 pkt_denied 拒绝访问
0010 pkt_auth 验证失败
0020 pkt_startum 无效的跳跃或阶层
0040 pkt_header 标头距离超出
0080 pkt_autokey 自动键序列错误
0100 pkt_crypto 自动键协议错误
0200 peer_stratum 无效的标题或阶层
0400 peer_dist 超出距离阈值
0800 peer_loop 同步循环
1000 peer_unreach 无法访问或未选择

Flash状态码定义来自:https://www.eecis.udel.edu/~mills/ntp/html/decode.html#flash

 

posted on 2023-02-03 10:52  tdyizhen1314  阅读(2482)  评论(0编辑  收藏  举报

导航