NTP数据报(NTP Packet)是NTP协议进行时间同步的核心数据单元,其基础结构固定为48字节(不包含扩展字段时),包含多个关键字段,用于传递时间信息、时钟状态及同步参数。以下是NTP数据报的详细结构(按字节顺序从前往后排列):
1. 前8字节:控制与状态字段(共8字节)
字段名称 | 位数 | 含义 |
LI(Leap Indicator) | 2位 | 闰秒指示符,用于通知客户端是否需要插入/删除闰秒: - 00:无闰秒 - 01:插入1秒(正闰秒) - 10:删除1秒(负闰秒) - 11:告警(时钟未同步) |
VN(Version Number) | 3位 | NTP版本号(当前主流为版本4,即 |
Mode | 3位 | 操作模式,指示报文的角色: - 0:保留 - 1:主动对等体(主动发起同步) - 2:被动对等体(响应同步请求) - 3:客户端(请求时间同步) - 4:服务器(响应客户端请求) - 5:广播模式 - 6:NTP控制消息 - 7:保留 |
Stratum | 8位 | 时钟层级,标识本地时钟的精度和来源: - 0:未指定(如未同步的客户端) - 1:主时钟(直接同步于原子钟、GPS等基准源) - 2~15:次级时钟(同步于更高层级的时钟) - 16:未同步(不可用) |
Poll Interval | 8位 | 轮询间隔,以2的幂表示(单位:秒),指示对等体之间请求时间的最大间隔(如值为4表示16秒)。 |
Precision | 8位 | 时钟精度,以2的幂表示(单位:秒,有符号整数),指示本地时钟的固有精度(如值为-6表示1/64秒)。 |
2. 中间16字节:时钟偏差与误差字段(共16字节)
字段名称 | 位数 | 含义 |
Root Delay | 32位 | 根延迟,以浮点数表示(单位:秒),指示从本地时钟到根时钟(stratum 1)的总网络延迟(往返)。 |
Root Dispersion | 32位 | 根离散度,以浮点数表示(单位:秒),指示本地时钟与根时钟之间的最大误差(不确定性)。 |
Reference Identifier | 32位 | 参考标识,根据stratum不同含义不同: - stratum 1:表示基准源类型(如 - stratum ≥2:表示上一级同步服务器的IPv4地址(或IPv6地址的低32位)。 |
3. 后24字节:时间戳字段(共24字节,4个时间戳,每个64位)
NTP时间戳以64位表示(32位秒 + 32位小数秒),基于UTC时间,起始点为1900年1月1日00:00:00(与Unix时间戳的1970年起始点不同)。
字段名称 | 位数 | 含义 |
Reference Timestamp | 64位 | 参考时间戳,本地时钟最后一次被设置或更新的时间(同步于参考源的时间)。 |
Originate Timestamp | 64位 | 发起时间戳,客户端发送请求报文的时间(由客户端设置)。 |
Receive Timestamp | 64位 | 接收时间戳,服务器收到客户端请求报文的时间(由服务器设置)。 |
Transmit Timestamp | 64位 | 发送时间戳,服务器发送响应报文的时间(由服务器设置)。 |
核心作用
NTP客户端通过分析报文中的时间戳(尤其是Originate
、Receive
、Transmit
)计算网络延迟和时间偏移,最终实现与服务器的时间同步。例如:
- 网络延迟 ≈(服务器接收时间 - 客户端发送时间)+(服务器发送时间 - 客户端接收时间)
- 时间偏移 ≈ [(服务器接收时间 - 客户端发送时间)+(服务器发送时间 - 客户端接收时间)] / 2
以上是NTP数据报的基础结构,扩展字段(如认证信息)会增加报文长度,但核心同步逻辑依赖上述48字节字段。