learn
RateRatio 怎么算:邻居频比与逐跳通告
用 A-B-C-D 同步链路理解 802.1AS 如何测 NeighborRateRatio、通告 RateRatio,并用它修正 residence time。
本节学习目标
- 理解 RateRatio 是 GM 频率与本节点本地频率的比值。
- 能说明 NeighborRateRatio 如何通过两次 Pdelay 测量估计。
- 知道 correction field 中 residence time 为什么要乘以 RateRatio。
建议先读
核心概念
本章目录
- 01为什么 TSN 需要共同时间从调度窗口、跨设备测量和故障复盘三个场景理解共同时间为什么是 TSN 的坐标系。
- 02时钟模型:offset、drift 与为什么时间会跑偏先理解本地时钟不是完美尺子,再理解 gPTP 为什么要持续校正 offset、drift 和路径延迟。
- 03gPTP 的基本链路:grandmaster、同步与路径延迟用工程直觉理解 802.1AS 如何把一个主时钟传播到网络设备,并校正链路延迟。
- 04同步报文怎么走:Sync、Follow_Up 与 Pdelay 的时间线用一条简化时间线理解 gPTP 报文如何传播时间、记录硬件时间戳并估计相邻链路延迟。
- 05为什么 gPTP 需要频差校正从驻留时间和路径延迟两条线理解:晶振频率差异会把本地计数器换算成错误的共同时间。
- 06RateRatio 怎么算:邻居频比与逐跳通告用 A-B-C-D 同步链路理解 802.1AS 如何测 NeighborRateRatio、通告 RateRatio,并用它修正 residence time。
- 07误差从哪里来:timestamp、链路不对称与同步间隔把 gPTP 误差拆成硬件时间戳、路径延迟估计、时钟漂移、同步间隔、设备执行和拓扑变化几类来源。
- 08时钟误差预算:调度窗口为什么要留余量把时钟漂移、同步间隔、路径延迟误差和设备执行误差转换成 Qbv 窗口设计中的安全余量。
- 09验证共同时间:从同步状态到调度证据把 gPTP 状态、抓包时间戳、设备日志和 Qbv 窗口命中放到同一套验证证据里。
解决什么问题
上一节说明了为什么频差会让 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 校正后,为什么仍然需要做同步误差预算和验证?
掌握检查
读完本节后,先用下面这些问题校准自己,而不是只确认“看过了”。
- 1能写出 rr(C) = rr(B) * nr(B,C) 这类逐跳关系。
- 2能解释为什么 GM 自己向下游通告的 rr 初始值为 1。
- 3能说明 RateRatio 校正主要改变的是驻留时间换算,而不是业务流调度本身。
distributed ratio
每一跳测邻居频比,再把到 GM 的频比继续传下去。
rr(C) = rr(B) * nr(B,C),不需要每台设备直接测到 grandmaster。
ratio chain
RateRatio 是沿同步树逐跳累乘出来的。
调整 A-B、B-C、C-D 三段邻居频比,看下游节点相对 GM 的 rr 如何累积。
NeighborRateRatio 累乘实验
教学估算rr(D) 偏离
+16ppm
修正后误差
5ns
逐跳频比正在累积
不做频差校正时,这段驻留时间的量级误差约 48ns;rr 累乘的目标是把本地时间尺度拉回 GM 尺度。
try it
动手调参数
机制拆解
- 1D 只直接测 C-D 的 NeighborRateRatio。
- 2C 通过 Sync 把 rr(C) 继续通告给 D。
- 3D 用 rr(D) 修正自己的 residence time。
engineering check
为什么 D 不需要直接测 GM A 的频率?
next steps