简介
NTP是从时间协议(Time Protocol)和ICMP时间戳报文(ICMP TimeStamp Message)演变而来,在准确性和健壮性方面进行了特殊的设计,理论上精度可达十亿分之一秒。
NTP协议应用于分布式时间服务器和客户端之间,实现客户端和服务器的时间同步,从而使网络内所有设备的时钟基本保持一致。
NTP协议是基于UDP进行传输的,使用端口号为123。
报文格式
图1 NTP数据报文格式
字段名 | 长度(比特) | 含义 |
---|---|---|
LI(Leap Indicator) | 2比特 | 这是一个两位的代码,表示在NTP时间标尺中将要插入的下一跳情况。值为“11”时表示告警状态,时钟不能被同步。 |
VN(Version Number) | 3比特 | NTP的版本号。 |
Mode | 3比特 | NTP的工作模式。不同值表示的含义如下: 0:reserved,保留。 1:symmetric active,主动对等体模式。 2:symmetric passive,被动对等体模式。 3:client,客户模式。 4:server,服务器模式。 5:broadcast,广播模式。 6:reserved for NTP control messages,NTP控制报文。 7:reserved for private use,内部使用预留。 |
Stratum | 8比特 | 时钟的层数,定义了时钟的准确度。层数为1的时钟准确度最高,从1到15依次递减。 |
Poll Interval | 8比特 | 轮询时间,即发送报文的最小间隔时间。 |
Precision | 8比特 | 时钟的精度。 |
Root Delay | 32比特 | 到主参考时钟的总往返延迟时间。 |
Root Dispersion | 32比特 | 本地时钟相对于主参考时钟的最大误差。 |
Reference Identifier | 32比特 | 标识特定参考时钟。 |
Reference Timestamp | 64比特 | 本地时钟最后一次被设定或更新的时间。如果值为0表示本地时钟从未被同步过。 |
Originate Timestamp | 64比特 | NTP报文离开源端时的本地时间。 |
Receive Timestamp | 64比特 | NTP报文到达目的端的本地时间。 |
Transmit Timestamp | 64比特 | 目的端应答报文离开服务器端的本地时间。 |
Authenticator | 96比特 | (可选)验证信息。 |
图2 NTP控制报文格式
字段名 | 长度 | 含义 |
---|---|---|
0 | 2比特 | 保留位。NTP本身不做处理。 |
VN(Version Number) | 3比特 | NTP的版本号,目前值为3。 |
6 | 3比特 | 表明是控制报文。 |
REM | 3比特 | R:0表示命令,1表示响应。 E:0表示发送正常响应,1表示发送错误响应。 M:0表示最后一个分片,1表示其他。 |
Op | 5比特 | 操作码,表明命令的类型。 |
Sequence | 16比特 | 发送或接受到报文的顺序号。 |
Status | 16比特 | 表明当前系统的状态。 |
Association ID | 16比特 | 连接标示。 |
Offset | 16比特 | 偏移量。 |
Count | 16比特 | 数据域的长度。 |
Data | 最大468比特 | 包括发送报文或接受报文中的数据信息。 |
Padding | 16比特 | 填充字段。 |
Authenticator | 96比特 | (可选)验证信息。 |
报文示例
图3 NTP报文(Broadcast)
图4 NTP报文(client)
图5 NTP报文(server)
Arduino库文件