Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.7 四个时间戳的魔法:E2E延迟测量机制

一个看似简单的问题

假设你想测量一个网球从你手里飞到墙壁,再弹回来的时间。

最简单的方法:

  1. 你看手表,记录发球时间:10:00:00.000
  2. 球弹回来,你看手表,记录接球时间:10:00:02.500
  3. 往返时间 = 2.500秒

但PTP面临的问题比这复杂得多。

问题一:主时钟和从时钟的时间不一致。你用你的手表,我用我的手表,两个手表可能差几秒甚至几分钟。

问题二:往返路径不对称。球去和回来的速度可能不同。

问题三:我们无法直接测量“单程时间“,只能测量“往返时间“。

PTP如何解决这些问题?

答案就在四个时间戳


E2E机制的基本原理

消息交换过程

E2E(End-to-End,端到端)延迟测量机制涉及三类报文:

  1. Sync:主时钟发送,携带发送时间戳
  2. Delay_Req:从时钟发送,请求测量
  3. Delay_Resp:主时钟回复,携带接收时间戳

消息交换时序

主时钟                                    从时钟
  |                                          |
  |------ Sync (t1) ----------------------->| (t2)
  |                                          |
  |<----- Delay_Req ------------------------| (t3)
  |                                          |
  |------ Delay_Resp (t4) ----------------->| 
  |                                          |

四个时间戳

  • t1:主时钟发送Sync的时间(主时钟的时间)
  • t2:从时钟接收Sync的时间(从时钟的时间)
  • t3:从时钟发送Delay_Req的时间(从时钟的时间)
  • t4:主时钟接收Delay_Req的时间(主时钟的时间)

关键洞察

注意这四个时间戳的特点:

  • t1和t4:主时钟记录的,使用主时钟的时间基准
  • t2和t3:从时钟记录的,使用从时钟的时间基准

问题是:主时钟和从时钟的时间基准不一致

假设从时钟比主时钟快了100纳秒(offset = +100ns)。

那么:

  • 从时钟的“1000秒“,实际上是主时钟的“999.9999999秒“
  • 从时钟记录的t2和t3,都比主时钟的“真实时间“快了100ns

如何消除这个时间偏差的影响?

这就是PTP算法的精妙之处。


数学推导:从四个时间戳到两个关键值

定义

设:

  • offset:从时钟相对于主时钟的时间偏差
    • offset > 0:从时钟比主时钟快
    • offset < 0:从时钟比主时钟慢
  • delay:单程传播延迟(假设对称,即主→从 = 从→主)

时间关系

Sync报文传播过程

主时钟在真实时间T1发送Sync,主时钟读数 = t1
Sync经过delay时间到达从时钟
从时钟在真实时间T1 + delay接收Sync,从时钟读数 = t2

由于从时钟比主时钟快offset:

从时钟读数 = 主时钟读数 + offset

因此:

t2 = t1 + delay + offset  ... (公式1)

Delay_Req报文传播过程

从时钟在真实时间T3发送Delay_Req,从时钟读数 = t3
Delay_Req经过delay时间到达主时钟
主时钟在真实时间T3 + delay接收Delay_Req,主时钟读数 = t4

同样考虑offset:

t3 = t4 - delay + offset  ... (公式2)

求解

我们有两个方程,两个未知数(delay和offset)。

从公式1

t2 - t1 = delay + offset
offset = t2 - t1 - delay  ... (公式1a)

从公式2

t3 - t4 = -delay + offset
offset = t3 - t4 + delay  ... (公式2a)

联立方程

公式1a = 公式2a:

t2 - t1 - delay = t3 - t4 + delay

解:

t2 - t1 - t3 + t4 = 2 × delay
delay = [(t2 - t1) + (t4 - t3)] / 2  ... (公式3)

这就是meanPathDelay(平均路径延迟)的计算公式。

代入求offset

将delay代入公式1a:

offset = t2 - t1 - [(t2 - t1) + (t4 - t3)] / 2
       = [(t2 - t1) - (t4 - t3)] / 2  ... (公式4)

这就是offsetFromMaster(主从时间偏差)的计算公式。


一个完整的数值例子

让我们用一个具体的数值例子,演示整个计算过程。

场景设置

假设

  • 主时钟和从时钟之间的真实传播延迟:100纳秒(对称)
  • 从时钟比主时钟快:50纳秒(offset = +50ns)

主时钟在1000.000000000秒发送Sync

  • t1 = 1000.000000000秒(主时钟读数)
  • Sync经过100ns到达从时钟
  • 从时钟在真实时间1000.000000100秒接收Sync
  • 从时钟读数 = 1000.000000100 + 50ns = 1000.000000150秒
  • t2 = 1000.000000150秒

从时钟在1000.001000000秒发送Delay_Req

  • t3 = 1000.001000000秒(从时钟读数)
  • 真实时间 = 1000.001000000 - 50ns = 1000.000999950秒
  • Delay_Req经过100ns到达主时钟
  • 主时钟在真实时间1000.001000050秒接收Delay_Req
  • 主时钟读数 = 1000.001000050秒
  • t4 = 1000.001000050秒

计算

四个时间戳

  • t1 = 1000.000000000秒
  • t2 = 1000.000000150秒
  • t3 = 1000.001000000秒
  • t4 = 1000.001000050秒

计算meanPathDelay

meanPathDelay = [(t2 - t1) + (t4 - t3)] / 2
              = [(150ns) + (50ns)] / 2
              = 200ns / 2
              = 100ns

正确! 真实延迟确实是100ns。

计算offset

offset = [(t2 - t1) - (t4 - t3)] / 2
       = [150ns - 50ns] / 2
       = 100ns / 2
       = 50ns

正确! 从时钟确实比主时钟快50ns。

验证

让我们验证一下这个结果的正确性。

假设从时钟根据offset调整时间

从时钟知道offset = +50ns,于是将自己的时间减去50ns。

调整后的从时钟时间

  • 原始读数:1000.000000150秒
  • 减去offset:1000.000000150 - 50ns = 1000.000000100秒

与主时钟对比

  • 主时钟发送Sync的真实时间:1000.000000000秒
  • 主时钟发送后100ns,从时钟接收
  • 从时钟调整后的时间:1000.000000100秒
  • 主时钟当时的真实时间:1000.000000100秒

完全一致! 同步成功。


实际实现:考虑correctionField

上面的推导假设:

  1. 报文传播完全对称
  2. 没有透明时钟
  3. 没有其他延迟

实际上,PTP报文可能经过透明时钟,correctionField会被累加。

完整的计算公式

meanPathDelay

meanPathDelay = [(t2 - t1) + (t4 - t3) 
                 - correctedSyncCorrectionField 
                 - Delay_Resp.correctionField] / 2

其中:

  • correctedSyncCorrectionField = Sync.correctionField + ingressDelayAsymmetry

offsetFromMaster

one-step模式

offsetFromMaster = t2 - originTimestamp - meanPathDelay - correctedSyncCorrectionField

two-step模式

offsetFromMaster = t2 - preciseOriginTimestamp - meanPathDelay 
                   - correctedSyncCorrectionField - Follow_Up.correctionField

correctionField的含义

Sync.correctionField包含:

  • 主时钟的小数纳秒部分(originTimestamp无法表示的部分)
  • 所有透明时钟的驻留时间
  • 所有透明时钟的入口不对称校正值

Follow_Up.correctionField包含:

  • two-step模式下的精确时间戳补充
  • 透明时钟累加的校正值

Delay_Resp.correctionField包含:

  • Delay_Req路径上透明时钟的驻留时间
  • Delay_Req路径上透明时钟的出口不对称校正值

不对称的影响

对称假设

E2E机制的核心假设:主→从延迟 = 从→主延迟

如果这个假设成立,meanPathDelay的计算是准确的。

如果不对称?

假设:

  • 主→从延迟:100ns
  • 从→主延迟:150ns
  • 真实平均延迟:125ns
  • 不对称量:25ns

计算meanPathDelay

meanPathDelay = [(t2 - t1) + (t4 - t3)] / 2
              = [主→从延迟 + 从→主延迟] / 2
              = [100ns + 150ns] / 2
              = 125ns

meanPathDelay是正确的!

offset的计算会出错

offset = [(t2 - t1) - (t4 - t3)] / 2
       = [主→从延迟 - 从→主延迟] / 2
       = [100ns - 150ns] / 2
       = -25ns

问题:这个-25ns是不对称引入的误差,会叠加到真实的offset上。

不对称误差的量化

设:

  • t_ms = 主→从延迟
  • t_sm = 从→主延迟
  • 真实不对称 = delayAsymmetry = (t_ms - t_sm) / 2

则:

计算的offset = 真实offset + delayAsymmetry

示例

假设:

  • 真实offset = +50ns
  • t_ms = 100ns, t_sm = 150ns
  • delayAsymmetry = (100 - 150) / 2 = -25ns

计算:

计算的offset = 50ns + (-25ns) = 25ns

误差 = 25ns,从时钟以为自己只快了25ns,实际上快了50ns。

如何应对不对称?

方法一:测量并配置不对称值

如果已知链路的不对称(例如光纤长度差),可以通过管理接口配置portDS.delayAsymmetry

PTP会在计算时补偿这个值。

方法二:使用P2P机制

P2P机制逐链路测量延迟,可以更好地控制不对称。但P2P也有自己的不对称问题(见下一节)。

方法三:外部校准

使用外部测量设备(如示波器、时间间隔计数器)测量实际不对称,然后配置到PTP设备中。


Delay_Req的发送时机

两种模式

模式一:周期性发送

从时钟按照logMinDelayReqInterval规定的间隔,周期性发送Delay_Req。

优点

  • 简单
  • 可预测

缺点

  • 浪费带宽(即使不需要测量延迟)
  • 延迟测量的更新频率固定

模式二:事件触发

从时钟在收到Sync报文后,立即发送Delay_Req。

优点

  • 及时更新延迟测量
  • 减少延迟(Sync和Delay_Req紧挨着)

缺点

  • 可能增加网络突发流量

PTP标准的要求

PTP标准规定:

  • 连续两个Delay_Req的最小间隔应 ≥ 0.9 × 2^(logMinDelayReqInterval)
  • 从时钟应尊重主时钟通告的logMinDelayReqInterval

示例

如果主时钟通告logMinDelayReqInterval = 0(即间隔1秒),从时钟发送Delay_Req的间隔应 ≥ 0.9秒。


一个完整的E2E测量流程示例

场景

主时钟A ---- TC_B ---- 从时钟C

参数

  • 主时钟A发送Sync时间:t1 = 1000.000000000秒
  • TC_B驻留时间:5μs
  • TC_B入口不对称:0
  • TC_B出口不对称:0
  • A→C真实传播延迟:100ns + 5μs = 5.1μs

消息交换

步骤1:主时钟A发送Sync

  • originTimestamp = 1000.000000000秒
  • correctionField = 0

步骤2:Sync经过TC_B

  • TC_B测量驻留时间:5μs
  • 更新correctionField:0 + 5μs = 5μs

步骤3:从时钟C接收Sync

  • 接收时间戳:t2 = 1000.000005100秒 (包含5μs驻留时间 + 100ns传播延迟)
  • Sync.correctionField = 5μs

步骤4:从时钟C发送Delay_Req

  • 发送时间戳:t3 = 1000.010000000秒
  • Delay_Req.correctionField = 0

步骤5:Delay_Req经过TC_B

  • TC_B测量驻留时间:5μs
  • 更新correctionField:0 + 5μs = 5μs

步骤6:主时钟A接收Delay_Req

  • 接收时间戳:t4 = 1000.010005050秒 (从时钟发送时间 + 传播延迟 + 驻留时间)

步骤7:主时钟A发送Delay_Resp

  • receiveTimestamp = t4 = 1000.010005050秒
  • Delay_Resp.correctionField = 5μs

步骤8:Delay_Resp经过TC_B

  • TC_B测量驻留时间:5μs
  • 更新correctionField:5μs + 5μs = 10μs

步骤9:从时钟C接收Delay_Resp

  • Delay_Resp.receiveTimestamp = 1000.010005050秒
  • Delay_Resp.correctionField = 10μs

计算

四个时间戳

  • t1 = 1000.000000000秒
  • t2 = 1000.000005100秒
  • t3 = 1000.010000000秒
  • t4 = 1000.010005050秒

校正字段

  • Sync.correctionField = 5μs
  • Delay_Resp.correctionField = 10μs
  • ingressDelayAsymmetry = 0
  • correctedSyncCorrectionField = 5μs + 0 = 5μs

计算meanPathDelay

下面的例子展示如何正确计算。假设:

  • 主时钟和从时钟之间的传播延迟:100ns
  • 从时钟比主时钟快:50ns
t1 = 1000.000000000秒
t2 = 1000.000000150秒(包含100ns延迟 + 50ns offset)
t3 = 1000.010000000秒
t4 = 1000.010000050秒(包含100ns延迟,减去50ns offset)

计算meanPathDelay

meanPathDelay = [(t2 - t1) + (t4 - t3)] / 2
              = [(150ns) + (50ns)] / 2
              = 100ns

计算offset

offset = [(t2 - t1) - (t4 - t3)] / 2
       = [(150ns) - (50ns)] / 2
       = 50ns

E2E机制的优缺点

优点

1. 端到端测量

直接测量主时钟到从时钟的整个路径延迟,不需要中间设备支持P2P机制。

2. 简单

只需要三类报文(Sync、Delay_Req、Delay_Resp),实现相对简单。

3. 兼容透明时钟

透明时钟可以正确处理Sync和Delay_Req,累加驻留时间。

4. 适合层级网络

在有多级边界时钟的网络中,E2E机制可以正确工作。

缺点

1. 依赖对称性

假设往返延迟对称,如果不对称,会引入误差。

2. 测量延迟较大

需要四次消息交换(Sync + Delay_Req + Delay_Resp),测量延迟较大。

3. 报文数量多

每个从时钟都需要发送Delay_Req,在大规模网络中,报文数量可能很大。

4. 主时钟负载重

主时钟需要响应所有从时钟的Delay_Req,负载可能很重。


小结:E2E机制的核心要点

基本原理

  • 主时钟发送Sync,记录发送时间戳t1
  • 从时钟接收Sync,记录接收时间戳t2
  • 从时钟发送Delay_Req,记录发送时间戳t3
  • 主时钟接收Delay_Req,记录接收时间戳t4
  • 从时钟收到Delay_Resp,获取t4

核心公式

meanPathDelay = [(t2 - t1) + (t4 - t3)] / 2

offsetFromMaster = [(t2 - t1) - (t4 - t3)] / 2

关键假设

  • 往返延迟对称
  • 主时钟和从时钟的频率一致(或接近)

不对称影响

  • meanPathDelay不受影响
  • offsetFromMaster会引入误差 = delayAsymmetry

实际计算

  • 需要考虑correctionField
  • 需要考虑透明时钟的驻留时间
  • 需要考虑不对称校正值

下集预告

现在,我们知道了E2E机制如何用四个时间戳测量路径延迟。

但E2E机制有一个关键假设:往返延迟对称。如果不对称,会引入误差。

更重要的是,E2E机制测量的是整个路径的延迟,无法感知中间每一段链路的延迟。

有没有一种机制,可以逐链路测量延迟,并且更好地处理不对称?

答案就是:P2P机制

下一节,我们将深入讲解P2P延迟测量机制——如何用Pdelay_Req/Pdelay_Resp逐链路测量延迟。

【悬念留给2.8】

P2P机制的精妙之处在于:它让每个链路两端的设备相互测量链路延迟,而不是让从时钟测量整个路径。

这样做的好处是:每个链路的延迟测量是独立的,不受网络规模的影响。

但代价是:所有设备都必须支持P2P机制,不能有“不支持P2P的设备“在中间。

下一节,我们详细解读P2P机制的工作原理和适用场景。