Skip to main content

7. Data Structures (数据结构)

NTP状态机在以下各节中定义. 状态变量根据其在数据包头、对等体和轮询进程、系统进程以及时钟调控进程中的功能分为不同类别. 数据包变量 (Packet variables) 表示传输和接收数据包中的NTP头值. 对等体和轮询变量 (Peer and poll variables) 分别表示每个服务器的关联内容. 系统变量 (System variables) 表示依赖客户端所看到的服务器状态. 时钟调控变量 (Clock discipline variables) 表示时钟调控算法的内部工作原理. 附录A中描述了一个示例.

7.1. Structure Conventions (结构约定)

为了区分在不同进程中使用的同名但不同的变量, 采用图5中总结的命名约定. 接收数据包变量v是数据包结构r的成员, 完全限定名称为r.v. 类似地, x.v是传输数据包变量, p.v是对等体变量, s.v是系统变量, c.v是时钟调控变量. 每个关联都有一组对等体变量; 只有一组系统和时钟变量.

名称 (Name)描述 (Description)
r.接收数据包头变量 (receive packet header variable)
x.传输数据包头变量 (transmit packet header variable)
p.对等体/轮询变量 (peer/poll variable)
s.系统变量 (system variable)
c.时钟调控变量 (clock discipline variable)

图5: 前缀约定

7.2. Global Parameters (全局参数)

除了变量类别外, 本文档还定义了许多全局参数, 包括图6中显示的带值的参数.

名称 (Name)值 (Value)描述 (Description)
PORT123NTP端口号 (NTP port number)
VERSION4NTP版本号 (NTP version number)
TOLERANCE15e-6频率容差PHI (frequency tolerance PHI, s/s)
MINPOLL4最小轮询指数 (minimum poll exponent, 16 s)
MAXPOLL17最大轮询指数 (maximum poll exponent, 36 h)
MAXDISP16最大离散 (maximum dispersion, 16 s)
MINDISP.005最小离散增量 (minimum dispersion increment, s)
MAXDIST1距离阈值 (distance threshold, 1 s)
MAXSTRAT16最大层级数 (maximum stratum number)

图6: 全局参数

虽然这些是互操作性所需的唯一全局参数, 但在任何实现中都需要更大的集合. 附录A.1.1包含骨架用于缓解算法、时钟调控算法和相关实现依赖函数的那些参数. 其中一些参数值是固定不变的, 例如IANA分配的NTP端口号和NTPv4本身分配的版本号. 其他参数, 如频率容差 (也称为PHI), 涉及对系统时钟一旦同步然后在其源变得不可达时允许漂移的最坏情况行为的假设. 最小和最大参数定义了本文档后续章节中描述的状态变量的限制.

虽然在本文档中显示为固定值, 但某些实现可能通过配置命令使它们成为可调整的变量. 例如, 参考实现将PRECISION的值计算为多次迭代读取系统时钟的最小时间的log2值.

7.3. Packet Header Variables (数据包头变量)

从外部角度来看, 最重要的状态变量是图7及以下描述的数据包头变量. NTP数据包头由网络字节顺序的整数个32位 (4字节) 字组成. 数据包格式由三个组件组成: 头本身、一个或多个可选扩展字段以及可选的消息认证码 (message authentication code, MAC). 头组件与NTPv3头和先前版本相同. 可选扩展字段由[RFC5906]中描述的Autokey公钥加密算法使用. 可选MAC由Autokey和本RFC中描述的对称密钥加密算法使用.

名称 (Name)公式 (Formula)描述 (Description)
leapleap闰秒指示器 (leap indicator, LI)
versionversion版本号 (version number, VN)
modemode模式 (mode)
stratumstratum层级 (stratum)
pollpoll轮询指数 (poll exponent)
precisionrho精度指数 (precision exponent)
rootdelaydelta_r根延迟 (root delay)
rootdispepsilon_r根离散 (root dispersion)
refidrefid参考ID (reference ID)
reftimereftime参考时间戳 (reference timestamp)
orgT1起源时间戳 (origin timestamp)
recT2接收时间戳 (receive timestamp)
xmtT3传输时间戳 (transmit timestamp)
dstT4目的时间戳 (destination timestamp)
keyidkeyid密钥ID (key ID)
dgstdgst消息摘要 (message digest)

图7: 数据包头变量

NTP数据包是UDP数据报 [RFC0768]. 某些字段使用多个字, 其他字段则打包在字内的较小字段中. 图8所示的NTP数据包头有12个字, 后跟可选扩展字段, 最后是由密钥标识符字段和消息摘要字段组成的可选消息认证码 (MAC).

    0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Delay |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Dispersion |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reference ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Reference Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Origin Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Receive Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Transmit Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Extension Field 1 (variable) .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| dgst (128) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

图8: 数据包头格式

字段解释

LI (Leap Indicator, 闰秒指示器, leap): 2位整数, 警告即将插入或删除闰秒, 值定义如图9所示.

值 (Value)含义 (Meaning)
0无警告 (no warning)
1当天最后一分钟有61秒 (last minute has 61 seconds)
2当天最后一分钟有59秒 (last minute has 59 seconds)
3未知 (时钟未同步, clock unsynchronized)

图9: 闰秒指示器

VN (Version Number, 版本号, version): 3位整数, 表示NTP版本号, 当前为4.

Mode (模式, mode): 3位整数, 表示模式, 值定义如图10所示.

值 (Value)含义 (Meaning)
0保留 (reserved)
1对称主动 (symmetric active)
2对称被动 (symmetric passive)
3客户端 (client)
4服务器 (server)
5广播 (broadcast)
6NTP控制消息 (NTP control message)
7保留用于私有使用 (reserved for private use)

图10: 关联模式

Stratum (层级, stratum): 8位整数, 表示层级, 值定义如图11所示.

值 (Value)含义 (Meaning)
0未指定或无效 (unspecified or invalid)
1主服务器 (primary server, 例如配备GPS接收器)
2-15辅助服务器 (secondary server, 通过NTP)
16未同步 (unsynchronized)
17-255保留 (reserved)

图11: 数据包层级

Poll (轮询): 8位有符号整数, 表示连续消息之间的最大间隔, 以log2秒为单位. 建议的最小和最大轮询间隔默认限制分别为6和10.

Precision (精度): 8位有符号整数, 表示系统时钟的精度, 以log2秒为单位. 例如, 值-18对应约1微秒的精度.

Root Delay (rootdelay, 根延迟): 到参考时钟的总往返延迟, 采用NTP短格式.

Root Dispersion (rootdisp, 根离散): 到参考时钟的总离散, 采用NTP短格式.

Reference ID (refid, 参考ID): 32位代码, 标识特定服务器或参考时钟. 解释取决于层级字段的值. 对于数据包层级0 (未指定或无效), 这是一个四字符ASCII字符串, 称为"kiss code", 用于调试和监控目的. 对于层级1 (参考时钟), 这是分配给参考时钟的四字节、左对齐、零填充ASCII字符串.

Reference Timestamp (reftime, 参考时间戳): 系统时钟最后一次设置或校正的时间, 采用NTP时间戳格式.

Origin Timestamp (org, 起源时间戳, T1): 请求离开客户端前往服务器的时间, 采用NTP时间戳格式.

Receive Timestamp (rec, 接收时间戳, T2): 请求从客户端到达服务器的时间, 采用NTP时间戳格式.

Transmit Timestamp (xmt, 传输时间戳, T3): 响应离开服务器前往客户端的时间, 采用NTP时间戳格式.

Destination Timestamp (dst, 目的时间戳, T4): 回复从服务器到达客户端的时间, 采用NTP时间戳格式.

7.4. The Kiss-o'-Death Packet (Kiss-o'-Death数据包)

如果Stratum字段为0, 这意味着未指定或无效, 则Reference Identifier字段可用于传达对状态报告和访问控制有用的消息. 这些被称为Kiss-o'-Death (KoD) 数据包, 它们传达的ASCII消息称为kiss codes. KoD数据包因其早期用途而得名, 即告诉客户端停止发送违反服务器访问控制的数据包.

接收到kiss codes的客户端MUST检查它们, 并在以下情况下采取以下行动:

a. 对于kiss codes DENY和RSTR, 客户端MUST解除与该服务器的任何关联并停止向该服务器发送数据包;

b. 对于kiss code RATE, 客户端MUST立即减少其到该服务器的轮询间隔, 并且每次收到RATE kiss code时继续减少它.

c. 以ASCII字符"X"开头的kiss codes用于未注册的实验和开发, 如果无法识别则MUST被忽略.

d. 除上述条件外, KoD数据包没有协议意义, 检查后即被丢弃.

7.5. NTP Extension Field Format (NTP扩展字段格式)

在NTPv4中, 可以在头之后、MAC之前插入一个或多个扩展字段, 当扩展字段存在时, MAC始终存在. 除了定义字段格式外, 本文档不使用字段内容. 扩展字段包含如图14所示格式的请求或响应消息.

    0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Field Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. Value .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Padding (as needed) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

图14: 扩展字段格式

所有扩展字段都零填充到字 (四字节) 边界. Field Type字段特定于定义的功能, 此处不详细说明. 虽然包含所需字段的最小字段长度为四字 (16字节), 但最大字段长度仍有待确定.

Length字段是16位无符号整数, 指示整个扩展字段的长度 (以字节为单位), 包括Padding字段.