linux 获取ntp客户端
NTP相关知识
一、NTP协议
NTP(Network Time Protocol),网络时间协议。
应用于分布式时间服务器和客户端之间,实现客户端和服务器之间的时间同步,从而使网络内所有设备的时间基本保持一致。NTP工作于UDP的123端口。
①NTP报文格式
0 2 5 8 16 24 32 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |LI | VN |Mode | Stratum | Poll | Precision | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Delay | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Dispersion | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reference Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Reference Timestamp (64) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Originate Timestamp (64) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Receive Timestamp (64) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Transmit Timestamp (64) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Authentication(optional) (64) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ NTPv3报文格式
Leap Indicator(LI)
闰秒指示符,这是一个2位的代码,用于警示在当天的最后一分钟里插入或删除的闰秒。取值如下:
0 无预告
1 最近一分钟有61秒
2 最近一分钟有59秒
3 警告状态(时钟未同步)
闰秒指示符,这是一个2位的代码,用于警示在当天的最后一分钟里插入或删除的闰秒。取值如下:
0 无预告
1 最近一分钟有61秒
2 最近一分钟有59秒
3 警告状态(时钟未同步)
Version Number(VN)
版本号,这是一个3位的整数,用于表示NTP的版本。
版本号,这是一个3位的整数,用于表示NTP的版本。
Mode
模式,这是一个3位的整数,表示模式,值定义如下:
0 保留
1 对称主动
2 对称被动
3 客户端
4 服务器端
5 广播
6 为NTP控制控制消息
7 为自用保留
模式,这是一个3位的整数,表示模式,值定义如下:
0 保留
1 对称主动
2 对称被动
3 客户端
4 服务器端
5 广播
6 为NTP控制控制消息
7 为自用保留
Stratum
本地时钟层级,这是一个八位无符号整数,表示本地时钟的层级,其值定义如下:
0 未定义或难以获得
1 主要参考(如无线电时钟钟,校正的院子时钟)
2-255 第二参考(通过NTP或SNTP)
本地时钟层级,这是一个八位无符号整数,表示本地时钟的层级,其值定义如下:
0 未定义或难以获得
1 主要参考(如无线电时钟钟,校正的院子时钟)
2-255 第二参考(通过NTP或SNTP)
Poll
轮询间隔,这是一个8位有符号整数,用于表示连续消息之间的最大间隔,以最接近2的N次幂来表示。如值为6表示2^6=64。
轮询间隔,这是一个8位有符号整数,用于表示连续消息之间的最大间隔,以最接近2的N次幂来表示。如值为6表示2^6=64。
Precision
本地时钟精度精度,这是一个8位有符号整数,用于表示本地时钟精度,以最接近2的N次幂来表示。
本地时钟精度精度,这是一个8位有符号整数,用于表示本地时钟精度,以最接近2的N次幂来表示。
Root Delay
这是一个32位有符号定点数,表示主要参考源的总往返时延,以秒为单位。该变量可以为正值和负值,具体取决于时间精度和偏移。
这是一个32位有符号定点数,表示主要参考源的总往返时延,以秒为单位。该变量可以为正值和负值,具体取决于时间精度和偏移。
Root Dispersion
这是一个32位有符号定点数,表示相对于主参考源的最大误差,以秒为单位,在15和16位之间。通常在该字段中出现的值范围为0到几百毫秒
这是一个32位有符号定点数,表示相对于主参考源的最大误差,以秒为单位,在15和16位之间。通常在该字段中出现的值范围为0到几百毫秒
Reference Identifier
这是一个标识特定参考源的32位位串。在NTP版本3或版本4层级0或层级1服务器的情况下,这是一个4字符ASCII字符串,左对齐并且以0填充到32位。在NTP版本3辅助服务器中,这是参考源的32位IPv4地址。
这是一个标识特定参考源的32位位串。在NTP版本3或版本4层级0或层级1服务器的情况下,这是一个4字符ASCII字符串,左对齐并且以0填充到32位。在NTP版本3辅助服务器中,这是参考源的32位IPv4地址。
Reference Timestamp
这是以64位时间戳格式表示的上次设置或更正的本地时钟时间。
这是以64位时间戳格式表示的上次设置或更正的本地时钟时间。
Original Timestamp
这是以64位时间戳格式表示的请求离开客户端的时间。
这是以64位时间戳格式表示的请求离开客户端的时间。
Receive Timestamp
这是以64位时间戳格式表示的请求到达服务器端的时间。
这是以64位时间戳格式表示的请求到达服务器端的时间。
Transmit Timestamp
这是以64位时间戳格式表示的应答离开服务器端的时间。
这是以64位时间戳格式表示的应答离开服务器端的时间。
Authentication
认证信息。
认证信息。
②NTP时间戳
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Integer Part | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Fraction Part | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NTP时间戳使用的是自1970-01-01所经过的秒数(单位为秒),它分为整数部分和小数部分。NTP时间戳整数部分与ICMP时间戳消息所使用的时间戳格式整数部分一致,但小数部分却是不同的。
NTP客户端根据NTP报文中的时间戳计算客户端相对于服务器的往返时延d和本地时钟偏移t :
d = (T4 - T1) - (T2 - T3)
t = ((T2 - T1) + (T3 - T4)) / 2
t = ((T2 - T1) + (T3 - T4)) / 2
T1/T2/T3/T4分别为四个时间戳:
Originate Timestamp T1 客户端发送时间请求的时间
Receive Timestamp T2 服务器收到时间请求的时间
Transmit Timestamp T3 服务器发送时间回复的时间
Destination Timestamp T4 客户端收到时间回复的时间
Originate Timestamp T1 客户端发送时间请求的时间
Receive Timestamp T2 服务器收到时间请求的时间
Transmit Timestamp T3 服务器发送时间回复的时间
Destination Timestamp T4 客户端收到时间回复的时间