3. Protocol Modes (协议模式)
NTP协议有三种变体: 对称 (symmetric)、客户端/服务器 (client/server) 和广播 (broadcast). 每种变体都与关联模式 (association mode, 描述两个NTP对话者之间关系的方式) 相关联, 如图1所示. 此外, 持久关联 (persistent associations) 在启动时被动员, 永远不会被解除动员. 临时关联 (ephemeral associations) 在数据包到达时被动员, 并在错误或超时时被解除动员.
+-------------------+-------------------+------------------+
| Association Mode | Assoc. Mode Value | Packet Mode Value|
+-------------------+-------------------+------------------+
| Symmetric Active | 1 | 1 or 2 |
| Symmetric Passive | 2 | 1 |
| Client | 3 | 4 |
| Server | 4 | 3 |
| Broadcast Server | 5 | 5 |
| Broadcast Client | 6 | N/A |
+-------------------+-------------------+------------------+
图1: 关联和数据包模式
在客户端/服务器变体中, 持久客户端向服务器发送模式4数据包, 服务器返回模式3数据包. 服务器向一个或多个客户端提供同步, 但不接受来自它们的同步. 服务器也可以是参考时钟驱动程序 (reference clock driver), 直接从标准源 (如GPS接收器或电话调制解调器服务) 获取时间. 在此变体中, 客户端从服务器拉取同步.
在对称变体中, 对等体 (peer) 使用对称主动 (symmetric active) 或对称被动 (symmetric passive) 关联同时作为服务器和客户端运行. 持久对称主动关联向对称主动对等关联发送对称主动 (模式1) 数据包. 或者, 当接收到没有匹配关联的对称主动数据包时, 可以动员临时对称被动关联. 该关联发送对称被动 (模式2) 数据包, 并持续到错误或超时. 对等体之间相互推送和拉取同步. 出于本文档的目的, 对等体的运作类似于客户端, 因此对客户端的引用也暗示对等体.
在广播变体中, 持久广播服务器关联发送周期性广播服务器 (模式5) 数据包, 这些数据包可以被多个客户端接收. 在接收到没有匹配关联的广播服务器数据包时, 临时广播客户端 (模式6) 关联被动员, 并持续到错误或超时. 提供一个初始齐射 (initial volley) 是有用的, 其中以客户端模式运行的客户端与服务器交换几个数据包, 以便校准传播延迟 (propagation delay) 并运行Autokey安全协议, 之后客户端恢复到广播客户端模式. 广播服务器向客户端和其他服务器推送同步.
松散地遵循电信行业建立的惯例, 层次结构中每个服务器的级别由层级号 (stratum number) 定义. 主服务器被分配层级一; 每个较低级别的次级服务器被分配比前一级别大一的层级号. 随着层级号的增加, 其精度会根据特定的网络路径和系统时钟稳定性而降低. 平均误差 (mean errors), 通过同步距离 (synchronization distances) 测量, 大约与层级号和测量的往返延迟 (round-trip delay) 成正比增加.
作为标准实践, 时间网络拓扑应组织为避免时间循环 (timing loops) 并最小化同步距离. 在NTP中, 子网拓扑使用Bellman-Ford分布式路由算法 (Bellman-Ford distributed routing algorithm) 的变体确定, 该算法计算根植于主服务器的最短路径生成树 (shortest-path spanning tree). 作为此设计的结果, 该算法自动重组子网, 以产生最准确和可靠的时间, 即使在时间网络中存在故障时也是如此.
3.1. Dynamic Server Discovery (动态服务器发现)
有两种特殊关联, 任播客户端 (manycast client) 和任播服务器 (manycast server), 它们提供动态服务器发现功能 (dynamic server discovery function). 有两种类型的任播客户端关联: 持久型和临时型. 持久任播客户端向指定的IPv4或IPv6广播或多播组地址发送客户端 (模式3) 数据包. 在数据包头部的生存时间 (time-to-live, TTL) 字段范围内的指定任播服务器监听具有该地址的数据包. 如果服务器适合同步, 它使用客户端的单播地址返回普通服务器 (模式4) 数据包. 在接收到此数据包后, 客户端动员临时客户端 (模式3) 关联. 临时客户端关联持续到错误或超时.
任播客户端继续发送数据包以搜索最小数量的关联. 它从等于1的TTL开始, 并持续向其添加1, 直到建立最小数量的关联或TTL达到最大值. 如果TTL达到其最大值但尚未动员足够的关联, 客户端将停止传输一段超时期以清除所有关联, 然后重复搜索周期. 如果已动员最小数量的关联, 则客户端开始每个超时期传输一个数据包以维护关联. 字段约束将最小值限制为1, 最大值限制为255. 这些限制可以针对个别应用需求进行调整.
临时关联之间相互竞争. 随着新临时关联的动员, 客户端运行第10节和第11.2节中描述的缓解算法 (mitigation algorithms), 从总体中选出最佳候选者, 其余临时关联超时并被解除动员. 通过这种方式, 总体仅包括最近响应NTP数据包以调控系统时钟的最佳候选者.