解决什么问题
上一节说明了为什么频差会让 residence time 换算出错。本节回答实现思路:一个非 GM 节点并不能直接观察 GM 晶振和自己的晶振,它怎么知道自己的 RateRatio?
802.1AS 的做法可以拆成两个动作。第一,节点测量自己和上游邻居之间的频率比,称为 NeighborRateRatio。第二,上游节点通过 Sync / Follow_Up 把自己已经算出的 GM 频比通告给下游。下游把这两个比值相乘,就得到自己相对 GM 的 RateRatio。
逐跳计算 RateRatio
假设同步树是一条链:
A(GM) -> B -> C -> DA 是 grandmaster。它相对自己的频率比当然是 1:
rr(A) = 1B 测到 A 和 B 的邻居频比 nr(A,B),于是:
rr(B) = rr(A) * nr(A,B)
= fA / fBC 从 B 收到 rr(B),同时自己测到 nr(B,C),于是:
rr(C) = rr(B) * nr(B,C)
= (fA / fB) * (fB / fC)
= fA / fCD 继续同样的逻辑:
rr(D) = rr(C) * nr(C,D)
= fA / fD这个乘法链条的好处是,每个节点只需要测量相邻链路上的频率关系,不需要直接和 GM 做频率测量。RateRatio 作为“到 GM 的累计频率尺度关系”沿同步树逐跳传递。
NeighborRateRatio 怎么从 Pdelay 里看出来
NeighborRateRatio 可以利用周期性的 Pdelay 测量建立直觉。以下游节点 C 测上游节点 B 为例。C 多次发起 Pdelay,B 在每次响应时记录自己的发送时间戳,C 也记录响应到达自己的接收时间戳。
选两次测量 i 和 j。B 本地看到的响应发送时间间隔为 X,C 本地看到的响应接收时间间隔为 Y。如果 B 和 C 的晶振频率完全一致,那么这两个间隔应该相等。若 B 的时钟走得更快,它在同一段真实时间里会看到更大的计数跨度;若 C 更快,则 C 看到的跨度更大。
学习阶段可以用这个简化式理解:
nr(B,C) = fB / fC ≈ X / Y真实实现还要考虑滤波、时间戳精度、异常样本、链路状态变化和字段表示,但核心直觉就是:用同一组相邻链路测量事件,在两台设备的本地时间尺度下比较“间隔长度”。
| 量 | 来源 | 含义 |
|---|---|---|
| X | 上游 B 的两个响应发送时间戳差 | B 的本地时间尺度 |
| Y | 下游 C 的两个响应接收时间戳差 | C 的本地时间尺度 |
| X / Y | 两个时间尺度的比例 | nr(B,C) 的估计值 |
correction field 怎么用 RateRatio
节点 C 转发 Sync 时,需要把上游到 C 的 path delay 和 C 内部的 residence time 加入 correction field。简化地写:
COR += PathDelay(B,C) + ResidentDelay(C)考虑频差校正后,C 本地计数器换算出的 residence time 需要乘以 rr(C),变成 GM 时间尺度下的 residence time:
COR += PathDelay(B,C) + rr(C) * ResidentDelay(C)这就是 RateRatio 在时间同步中的关键位置。它不是让业务报文直接变快,也不是替代 offset 校正,而是让 bridge 把“本地测得的一段停留时间”转换到 GM 期望的时间尺度后再写入修正信息。
带来了什么新问题
RateRatio 校正降低了由频率尺度不一致造成的系统性误差,但它不会消灭所有同步误差。NeighborRateRatio 的测量本身有噪声;硬件时间戳点可能不一致;路径延迟可能不对称;软件处理可能引入更长、更不稳定的 residence time;grandmaster 切换或 holdover 时,频率关系也可能暂时变差。
因此,RateRatio 应该进入后面的误差来源和预算讨论。你不需要把它当成独立孤岛,而要把它放回共同时间证据链:时钟模型解释 drift,Sync/Pdelay 提供测量事件,RateRatio 修正时间尺度,误差预算再判断剩余误差是否足以支撑 Qbv 和端到端测量。
检查点
- 为什么 rr(C) 可以通过 rr(B) 和 nr(B,C) 相乘得到?
- 如果 NeighborRateRatio 测量噪声很大,correction field 中的 residence time 会受到什么影响?
- RateRatio 校正后,为什么仍然需要做同步误差预算和验证?