9. 对等方进程 (Peer Process)
当服务器或对等方数据包到达时, 将调用对等方进程 (peer process). 它运行线上协议 (on-wire protocol), 以确定时钟偏移量 (clock offset) 和往返延迟 (round-trip delay), 并计算供系统进程 (system process) 和轮询进程 (poll process) 使用的统计量. 对等方变量 (peer variable) 在关联数据结构 (association data structure) 初始化时实例化, 并由到达的数据包更新. 每个服务器都有一个对等方进程, 一个轮询进程和一个关联进程 (association process).
9.1. 对等方进程变量
以下是对等方进程使用的主要变量类别:
配置变量 (Configuration Variables)
| 名称 | 公式 | 描述 |
|---|---|---|
| srcaddr | srcaddr | 源地址 |
| srcport | srcport | 源端口 |
| dstaddr | dstaddr | 目的地址 |
| dstport | destport | 目的端口 |
| keyid | keyid | 密钥标识符 (key ID) |
数据包变量 (Packet Variables)
| 名称 | 公式 | 描述 |
|---|---|---|
| leap | leap | 闰秒指示符 (leap indicator) |
| version | version | 版本号 |
| mode | mode | 模式 |
| stratum | stratum | stratum |
| ppoll | ppoll | 对等方轮询指数 |
| rootdelay | delta_r | 根延迟 (root delay) |
| rootdisp | epsilon_r | 根离散度 (root dispersion) |
| refid | refid | 参考 ID (reference ID) |
| reftime | reftime | 参考时间戳 (reference timestamp) |
时间戳变量 (Timestamp Variables)
| 名称 | 公式 | 描述 |
|---|---|---|
| org | T1 | 起源时间戳 (origin timestamp) |
| rec | T2 | 接收时间戳 (receive timestamp) |
| xmt | T3 | 发送时间戳 (transmit timestamp) |
| t | t | 数据包时间 |
统计变量 (Statistics Variables)
| 名称 | 公式 | 描述 |
|---|---|---|
| offset | theta | 时钟偏移量 (clock offset) |
| delay | delta | 往返延迟 (round-trip delay) |
| disp | epsilon | 离散度 (dispersion) |
| jitter | psi | 抖动 (jitter) |
| filter | filter | 时钟滤波器 (clock filter) |
| tp | t_p | 过滤器时间 |
9.2. 对等方进程操作
数据包接收流程 (Packet Reception Flow)
接收例程定义了数据包到达时的处理流程. 主要步骤包括:
- 访问控制 (Access Control): 执行访问控制列表 (ACL) 检查.
- 格式验证 (Format Validation): 检查字段长度, 对齐, 版本号和扩展字段语法.
- 认证 (Authentication): 如果实现了认证, 必须支持 MD5 密钥化哈希算法 (MD5-keyed hash algorithm).
- 关联查找 (Association Lookup): 在关联表 (association table) 中搜索匹配的源地址和端口.
对等方分派表 (Peer Dispatch Table)
系统根据关联模式 (association mode) 和数据包模式 (packet mode) 的组合, 将处理分派到不同步骤:
| Association Mode | Packet Mode 1 | Packet Mode 2 | Packet Mode 3 | Packet Mode 4 | Packet Mode 5 |
|---|---|---|---|---|---|
| No Association 0 | NEWPS | DSCRD | FXMIT | MANY | NEWBC |
| Symm. Active 1 | PROC | PROC | DSCRD | DSCRD | DSCRD |
| Symm. Passive 2 | PROC | ERR | DSCRD | DSCRD | DSCRD |
| Client 3 | DSCRD | DSCRD | DSCRD | PROC | DSCRD |
| Server 4 | DSCRD | DSCRD | DSCRD | DSCRD | DSCRD |
| Broadcast 5 | DSCRD | DSCRD | DSCRD | DSCRD | DSCRD |
| Bcast Client 6 | DSCRD | DSCRD | DSCRD | DSCRD | PROC |
处理动作 (Processing Actions):
- DSCRD: 丢弃数据包 (非致命协议违规).
- ERR: 丢弃数据包并解除对称被动关联 (symmetric passive association) (致命协议违规).
- FXMIT: 快速发送 (fast transmit, 无状态服务器响应).
- MANY: 多播服务器响应 (manycast server response).
- NEWBC: 新建广播关联 (broadcast association).
- NEWPS: 新建对称被动关联 (symmetric passive association).
- PROC: 处理匹配的关联.
数据包验证 (Packet Validation)
对于 PROC 处理, 系统执行严格的时间戳检查, 以避免无效, 重复或伪造的数据包. 主要验证包括:
- 检查发送时间戳 (transmit timestamp) 是否非零.
- 验证起源时间戳 (origin timestamp) 是否匹配先前发送的发送时间戳.
- 检测重复数据包 (发送时间戳匹配已保存的起源时间戳).
- 验证目的时间戳 (destination timestamp) 是否晚于起源时间戳.
通过这些检查后, 系统计算偏移量和延迟, 更新时钟滤波器, 并为系统进程准备统计量.