跳到主要内容

附录 B. NTP 控制消息

本附录描述 NTP Control Message (NTP 控制消息) 格式, 它提供一种监控和控制 NTP 实现的机制. 控制消息是可选特性, 不必在所有情况下实现. 实现时, 控制消息只用于 client/server 模式, 不用于 broadcast 模式. 控制消息按标准 NTP 消息格式组织, mode 字段设置为 6 (control message).

控制消息为监控和控制 NTP 实现提供简单的查询/响应机制. 它主要用于管理和监控 NTP 实现, 提供对协议机器维护的内部变量的访问. 外部管理应用可以检查这些变量, 在某些情况下也可以修改它们. 控制消息提供了一种在不干扰正常协议操作的情况下检查实现状态和性能的方法.

B.1. NTP 控制消息格式

NTP Control Message 格式如下:

 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 |R|E|M| OpCode | Sequence |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Status | Association ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset | Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Data .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier (optional) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Message Digest (optional) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明

Leap Indicator (LI): 这是一个 2 位代码, 用于警告即将发生的闰秒, 其定义见 NTP 消息格式.

Version Number (VN): 这是一个 3 位整数, 表示 NTP 版本号, 当前为 3.

Mode: 这是一个 3 位整数, 表示模式. 对控制消息而言, 该字段设置为 6.

Response Bit (R): 查询时设置为 0, 响应时设置为 1.

Error Bit (E): 正常响应时设置为 0, 错误响应时设置为 1.

More Bit (M): 如果此分片后还有更多数据则设置为 1, 最后一个分片设置为 0.

Operation Code (OpCode): 这是一个 5 位代码, 指定要执行的操作:

操作
0保留
1读取状态
2读取变量
3写入变量
4读取时钟变量
5写入时钟变量
6设置 Trap 地址
7Trap 响应
8-31保留

Sequence: 这是一个 16 位整数, 用于匹配请求和响应.

Status: 这是一个 16 位代码, 表示系统、peer 或时钟的状态.

Association ID: 这是一个 16 位整数, 标识特定 peer 关联. 值 0 表示系统变量.

Offset: 这是一个 16 位整数, 指定数据区中第一个八位组的偏移.

Count: 这是一个 16 位整数, 指定数据区中的八位组数量.

Data: 这是一个可变长度字段, 包含请求或响应的数据. 格式取决于操作码.

Authenticator (optional): 实现认证时, 此字段包含附录 C 定义的 Key Identifier 和 Message Digest.

B.2. 状态字

控制消息头中的 status 字段包含一个 16 位代码, 提供关于系统、peer 或时钟的信息. 格式取决于所报告状态的类型.

B.2.1. 系统状态字

系统状态字出现在关联标识符为 0 的 read status 命令响应的 status 字段中. 格式为:

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LI | Source | Count | Code|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Leap Indicator (LI): 这是一个 2 位代码, 用于警告即将发生的闰秒.

Clock Source (Source): 这是一个 4 位代码, 表示当前同步源:

来源
0未指定或未知
1原子钟
2VLF 无线电
3HF 无线电
4UHF 无线电
5本地网络
6NTP
7UDP/TIME
8手表
9调制解调器

System Event Counter (Count): 这是一个 4 位整数, 表示自上次读取系统状态字以来发生的系统异常事件数量.

System Event Code (Code): 这是一个 4 位整数, 标识最近的系统异常事件:

事件
0未指定
1系统重启
2系统故障
3系统时钟重置
4关联事件
5操作模式变化
6-15保留

B.2.2. Peer 状态字

Peer 状态字出现在关联标识符非 0 的 read status 命令响应的 status 字段中. 格式为:

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Status | Sel | Count| Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Peer Status (Status): 这是一个 5 位代码, 表示 peer 状态:

置位时含义
0已配置 (peer.config)
1已启用认证
2认证正常
3可达性正常
4保留

Peer Selection (Sel): 这是一个 3 位整数, 表示 peer 选择过程的状态:

选择状态
0已拒绝
1通过健全性检查
2通过正确性检查
3通过候选检查
4通过离群值检查
5当前同步源
6备用同步源
7保留

Peer Event Counter (Count): 这是一个 4 位整数, 表示 peer 异常事件数量.

Peer Event Code (Code): 这是一个 4 位整数, 标识最近的 peer 异常事件.

B.2.3. 时钟状态字

时钟状态字出现在 read clock variables 命令响应的 status 字段中. 格式依赖实现.

B.2.4. 错误状态字

错误状态字出现在错误响应的 status 字段中. 格式为:

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Error Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Error Code: 这是一个 16 位整数, 标识错误条件:

错误
0无错误
1不兼容实现
2未实现请求
3权限被拒绝
4无效消息格式
5无效消息长度

B.3. 命令

控制消息命令提供读取和写入系统、peer 和时钟变量的机制. 定义如下命令:

Read Status: 返回系统 (association ID = 0) 或特定 peer (association ID != 0) 的状态字.

Read Variables: 返回系统或特定 peer 的一个或多个变量值. data 字段包含以逗号分隔的变量名列表.

Write Variables: 设置一个或多个变量的值. data 字段包含以逗号分隔的 variable=value 对列表.

Read Clock Variables: 返回一个或多个参考时钟变量的值.

Write Clock Variables: 设置一个或多个参考时钟变量的值.

Set Trap Address: 设置 trap 接收者地址. 发生重要事件时, 实现会向指定地址发送未经请求的 trap response 消息.

Trap Response: 这是发生重要事件时发送给 trap 接收者的未经请求消息.

控制消息设施为监控和管理 NTP 实现提供了强大机制. 但是, 应谨慎使用, 以避免扰乱正常协议操作或损害安全性.