在维护网络设备或者linux系统设备的时候,时间同步是非常重要的,如应用程序服务,数据库,等工具都是非常依赖数据库的,一般敏感的时差需要在3s内,普通工具和程序时差也不能超过60s,所以时间服务器是很重要的基础设施。

常用的模式: C/S模式 如图:

请求报文: ntp基于UDP协议传输,应用端口是123端口。

其中 LI(Leap Indicator):长度为2比特,值为"11"时表示告警状态,时钟未被同步。为其他值时NTP本身不做处理。 VN(Version Number):长度为3比特,表示NTP的版本号,目前的最新版本为3。

Stratum:系统时钟的层数,取值范围为1~16,它定义了时钟的准确度。层数为1的时钟准确度最高,准确度从1到16依次递减,层数为16的时钟处于未同步状态,不能作为参考时钟。

(Mode为3表示客户端请求) Mode:长度为3比特,表示NTP的工作模式。不同的值所表示的含义分别是:0未定义、1表示主动对等体模式、2表示被动对等体模式、3表示客户模式、4表示服务器模式、5表示广播模式或组播模式、6表示此报文为NTP控制报文、7预留给内部使用。

Peer Polling Interval: 1024s 同步的间隔为1024s (这个值会自动变化) Reference ID : 指给本地NTP服务器提供时间同步的上级NTP服务器源,即NTP服务。

响应报文:

在客户端的/etc/ntp.conf的配置

server 10.20.101.8 prefer
server 10.20.101.8
fudge 127.127.1.0 stratum 8
interface ignore wildcard
interface listen 172.17.0.1
restrict 127.0.0.1
driftfile /var/lib/ntp/drift
restrict 127.0.0.1 mask 255.255.255.255
restrict 127.0.0.1 mask 255.255.255.255
restrict 127.0.0.1 mask 255.255.255.255
disable monitor
#END

注意: interface listen 地址一定不能写成127.0.0.1。这个地址默认就会监听,需要使用其他的本机地址。

ntpp 命令的使用ntpq -pn

内容解释: 相关参数解释: *表示目前使用的ntp server,这里选择的本机; 如果是 有多台 + 表示备用的

remote: 指最先响应这个请求的NTP服务器的名称

refid: 指给本地NTP服务器提供时间同步的上级NTP服务器源。

st: 该值用来表示上级NTP服务器源的层级别。由于NTP是层型结构,有顶端的服务器,多层的NTP服务器源,再到客户端。所以服务器从高到低级别可以设定为1-16。为了减缓负荷和网络堵塞,原则上应该避免直接连接到层级别为1的服务器上。

t: 该值用来表示远程服务器的类型,有如下类型:u代表单播或多播的客户端,b代表广播或组播服务器,l代表本地(参考时钟),s代表同级NTP服务器, A代表多播服务器,B代表广播服务器,M代表组播服务器

when: 该值为自上次接收到数据包的时间距离当前的时间值

poll: 该值为本地NTP服务器和上级NTP服务器源的轮询间隔,即双方每过多久同步一次(单位为秒)。在NTP刚开始运行时,poll值会比较小,此时和上级NTP服务器源同步的频率就会增加,因此可以尽快调整到正确的时间范围内。之后poll值就会逐渐增大,同步的频率也就会相应减小。

reach:这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加

delay:该值为本地NTP服务器和上级NTP服务器源的NTP报文的往返时延。

offset:该值为本地NTP服务器和上级NTP服务器源的时间差值。该值越接近0,我们和上级NTP服务器源的时间就越准确。(日常关注这条)

jitter:该值是用来统计在特定个连续的连接数里面offset(时间差值)的分布情况。该数值的绝对值越小,我们和上级NTP服务器源的时间就越准确。

在使用过程中可能要考虑到 /etc/sysconfig/ntpd 这文件配置ntpd服务启动的参数 -x -g 可以了解下 ntpd服务的方式,又有两种策略,一种是平滑、缓慢的渐进式调整(adjusts the clock in small steps所谓的微调);一种是步进式调整(跳跃式调整)。两种策略的区别就在于,微调方式在启动NTP服务时加了个“-x”的参数,而默认的是不加“-x”参数。

假如使用了-x选项,那么ntpd只做微调,不跳跃调整时间,但是要注意,-x参数的负作用:当时钟差大的时候,同步时间将花费很长的时间。-x也有一个阈值,就是600s,当系统时钟与标准时间差距大于600s时,ntpd会使用较大“步进值”的方式来调整时间,将时钟“步进”调整到正确时间。

假如不使用-x选项,那么ntpd在时钟差距小于128ms时,使用微调方式调整时间,当时差大于128ms时,使用“跳跃”式调整。

这两种方式都会在本地时钟与远端的NTP服务器时钟相差大于1000s时,ntpd会停止工作。在启动NTP时加了参数“-g”就可以忽略1000S的问题。

关于协议有个问题在linux的C/S架构中

我在client端,监听123端口的并非是本机通信的IP地址,UDP报文照样可以正常传输,曾经有过疑问。 后来研究发现 其实通过研究udp协议之间通信可以发现,source port的端口是个随机端口,只不过在ntp中这个随机端口被程序固定成为了123端口,所以容易照成人的误解,所以不论客户端通信的IP地址,是否监听在123端口,都可以和服务端的123端口(只要服务端的udp 123端口是好的)通信,源端只有在通信过程中,和服务端是建立连接(source端的随机端口 123)。