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

1.4 那个按电子表的小学生,已经懂了PTP的核心

一个“超能力”同学的秘密

我上小学的时候,班上有个同学,外号叫“小胖”。

小胖有一个特异功能:每节课最后两分钟,他会突然坐直身体,眼睛死死盯着黑板右上方的那个扩音器。

然后,在全班同学还在交头接耳收拾书包的时候,他会开始倒计时:

“10、9、8……”

一开始没人理他。但后来大家发现,他的倒计时每一次都准得吓人——

“3、2、1、叮铃铃铃……”

他念到“1”的那一瞬间,下课铃声准时响起,误差不会超过半秒。

一时间,小胖成了班里的传奇人物。有人问他是不是有超能力,他嘿嘿一笑,指了指自己手腕上那块廉价电子表。

后来我们才知道他的秘密,简单得令人失望:

每次下课铃响起的时候,小胖会立刻按下电子表上的“重置”按钮,把秒数归零。

就这么简单。

下一次上课铃响的时候,他的表已经又走了45分钟。但因为他每次都在下课铃响时“对表”,所以他的表永远和学校的电子铃保持着微小的误差——小到肉眼无法察觉。

这就是时间同步的全部秘密。

而PTP协议,本质上就是在做和小胖一模一样的事情。只不过:

  • 小胖的“铃声”是主时钟发出的时间同步信号。
  • 小胖的“按按钮”是一个跳跃式的相位校正
  • 小胖的“电子表自己走”是本地守时
  • 小胖每隔45分钟才校准一次,导致误差累积——如果他能每秒钟校准一次,他的表就能达到不可思议的精度。

今天,我们就用小胖的故事,把PTP协议的三个核心机制彻底讲清楚。


核心机制一:相位校正(就是“按按钮”)

我们先来拆解小胖的操作。

下课铃响起的那一刻,学校电子铃显示的是“12:00:00”。

小胖低头看自己的电子表,显示的是“12:00:03”——快了3秒。

他按下“重置秒数”按钮,把自己的秒数归零。于是他的表变成了“12:00:00”。

这个过程,在时间同步领域里有一个专门的名字:相位校正

“相位”这个词听起来很高深,其实很简单。你可以把时间想象成一个圆圈,秒针在圆圈上转圈。“相位”就是秒针在圆圈上的位置。

小胖的表快了3秒,相当于秒针比正确的“相位”超前了3/60圈。他按下归零按钮,就是把秒针强行拨回到正确的位置——这就是相位校正。

在PTP协议里,从时钟收到主时钟的时间后,也会做同样的事情:计算自己的时间和主时钟的差值,然后把差值减掉。

但PTP比小胖做得好得多。小胖的校正精度受限于两个因素:

  1. 听觉延迟:铃声从扩音器传到小胖耳朵里,需要几毫秒。
  2. 反应延迟:小胖听到铃声后,大脑处理、手指按下按钮,需要几十到几百毫秒。

这两个延迟加起来,小胖每次校正都会有大约0.1秒的误差。对于下课铃来说,这完全可以接受。但对于5G基站来说,0.1秒意味着100万倍的超标。

PTP是怎么解决这个问题的?

它不依赖“听到”信号,而是依赖硬件时间戳

我们来看一个简化的PTP同步过程:

  1. 主时钟在物理层发送Sync报文的那一瞬间,硬件记录下精确的发送时间T1(比如12:00:00.000000000)。
  2. 这个Sync报文经过网线、经过交换机,到达从时钟的网卡。
  3. 从时钟的网卡在接收报文的物理层那一瞬间,硬件记录下精确的接收时间T2(比如12:00:00.000003456)。
  4. 从时钟收到了主时钟随后发来的Follow_Up报文,里面写着T1=12:00:00.000000000。

现在从时钟知道了两件事:主时钟在T1时刻发了报文,自己在T2时刻收到了报文。

如果忽略报文在网络上传输的时间,从时钟就可以直接把自己的时间设置为T1——这就相当于小胖的“按按钮”。

但PTP不忽略传输时间。它知道T2 - T1 = 传输延迟(3.456微秒)。所以它会把自己的时间设置为:T1 + 传输延迟。

关键点在于:T1和T2都是在硬件层面记录的,没有软件延迟、没有中断延迟、没有操作系统调度延迟。

这就是PTP能达到纳秒级精度的第一个秘密:硬件时间戳


核心机制二:延迟测量(小胖没有做的事)

小胖有一个问题他没意识到:他以为铃声响起的那一刻,就是“整点”。但实际上,铃声从电子铃发出,经过空气传播到他耳朵里,需要时间。

声音在空气中的传播速度大约是340米/秒。如果小胖坐在教室后排,离扩音器大约10米,那么铃声传播到他耳朵里需要大约30毫秒。

也就是说,当他听到铃声并按下按钮时,真正的“整点”已经过去了30毫秒。他以为自己对准了,其实慢了30毫秒。

这就是路径延迟——信号从主时钟传播到从时钟所需要的时间。

小胖没有处理这个延迟,因为30毫秒的误差对他来说无所谓。

但PTP不能无视延迟。在5G基站之间,30毫秒的误差意味着30万倍的超标。在金融交易中,30毫秒意味着几十万笔订单已经排在前面了。

所以PTP必须测量这个延迟。

怎么测?我们来看PTP的延迟测量机制(标准称为E2E机制,End-to-End):

第一步:测量往返延迟

从时钟在T3时刻发送一个Delay_Req报文给主时钟。主时钟收到这个报文时,硬件记录下接收时间T4,然后通过Delay_Resp报文把T4发回给从时钟。

现在从时钟知道了四个时间戳:

  • T1:主时钟发送Sync的时间
  • T2:从时钟接收Sync的时间
  • T3:从时钟发送Delay_Req的时间
  • T4:主时钟接收Delay_Req的时间

第二步:假设对称

PTP做了一个关键假设:报文从主到从的传输延迟,等于报文从从到主的传输延迟。

这个假设在大部分有线网络中是近似成立的。光纤的长度是固定的,光在往返方向上传播速度相同(不考虑色散等二阶效应)。交换机的处理延迟在理想情况下也是对称的。

在这个假设下,我们可以计算:

设单程延迟 = d。

那么:

  • T2 = T1 + d
  • T4 = T3 + d

由第一个等式:d = T2 - T1 由第二个等式:d = T4 - T3

等等,这里出现了两个不同的d?不对,因为从时钟和主时钟的时间还没有对齐。上面的T2和T3是从时钟的时间,T1和T4是主时钟的时间,它们之间有偏差。

设从时钟相对于主时钟的偏差 = offset(从时钟比主时钟快了多少,可能是负数)。

那么真实的T2(从时钟本地时间)= 主时钟的T2 + offset。

不对,我们再仔细推导一遍:

设:

  • Tm(t) = 主时钟在真实时间t的读数
  • Ts(t) = 从时钟在真实时间t的读数
  • offset(t) = Ts(t) - Tm(t)(从时钟比主时钟快多少)

在真实时间t1,主时钟发送Sync,记录Tm(t1) = T1。 从时钟在真实时间t2收到Sync,记录Ts(t2) = T2。 传输延迟 d = t2 - t1。

我们有: T2 = Ts(t2) = Tm(t2) + offset(t2) = (t2) + offset(t2) T1 = Tm(t1) = t1

由于 t2 = t1 + d,所以: T2 = t1 + d + offset(t2) T2 - T1 = d + offset(t2) (1)

现在从时钟在真实时间t3发送Delay_Req,记录Ts(t3) = T3。 主时钟在真实时间t4收到Delay_Req,记录Tm(t4) = T4。 传输延迟 d’ = t4 - t3(假设d’ = d,对称假设)。

我们有: T3 = Ts(t3) = t3 + offset(t3) T4 = Tm(t4) = t4

由于 t4 = t3 + d,所以: T4 = t3 + d T4 - T3 = d - offset(t3) (2)

假设offset在短时间内不变(t2到t3通常只有几毫秒),令offset = offset(t2) = offset(t3)。

则由(1)和(2): (1) + (2) = (d + offset) + (d - offset) = 2d 所以 d = [(T2 - T1) + (T4 - T3)] / 2

(1) - (2) = (d + offset) - (d - offset) = 2offset 所以 offset = [(T2 - T1) - (T4 - T3)] / 2

Bingo!

从时钟不需要知道真实传输延迟d,也不需要知道真实时间t,只需要用本地的四个时间戳,就能计算出两个关键值:

  • offset:从时钟相对于主时钟的偏差
  • d:单程传输延迟

然后从时钟就可以把自己当前的读数减去offset,完成一次相位校正。

这就是PTP的核心算法。它优雅得令人惊叹——只需要四次时间戳,不需要任何外部信息,就能在假设对称的前提下,完美计算出偏差和延迟。


核心机制三:频率校正(小胖没意识到的问题)

小胖还有一个问题他没意识到。

他的电子表用的是石英晶振,频率是标称的32768赫兹。但实际频率不可能正好是32768,总会有一点点偏差。

假设小胖的表每天快5秒。这意味着他的表“心跳”比标准时间快大约0.00578%。

这个偏差非常小,一秒钟只差0.0000578秒,根本感觉不到。但积累一天,就是5秒。积累一个月,就是两分半。

这就是频率漂移

小胖每隔45分钟校准一次,所以频率漂移最多积累45分钟,大约0.15秒——这就是为什么他的倒计时看起来那么准。

但如果小胖想要更高的精度,比如误差不超过1毫秒,他需要更频繁地校准吗?

不一定。还有另一种方法:直接测量并补偿频率漂移。

PTP就可以做这件事。它不需要像小胖那样“每次听到铃声就按按钮”,而是可以持续地观察从时钟相对于主时钟的“速度偏差”,然后微调从时钟的计时频率。

怎么做?

从时钟每完成一次同步,就能得到一个offset值。如果把offset随时间的变化画成一条曲线,这条曲线的斜率,就是频率漂移。

假设:

  • 第1秒测量,offset = +0.001秒(从时钟快了1毫秒)
  • 第11秒测量,offset = +0.002秒(从时钟快了2毫秒)

那么这10秒内,从时钟相对于主时钟又额外快了0.001秒。也就是说,从时钟的频率比主时钟快了0.0001(万分之一)。

知道了这个值,从时钟就可以调整自己的计时速度。比如,它可以把每“真实1秒”对应的时间增量从1秒调整为0.9999秒。

这样一来,从时钟的“心跳”就和主时钟的“心跳”无限逼近了。即使长时间不进行相位校正,误差的累积也会非常缓慢。

这个持续微调的过程,叫做时钟伺服

你可以把它理解为:小胖的电子表不再只是“听到铃声就归零”,而是学会了自己微调“走快一点”或“走慢一点”,让它和电子铃的节奏保持一致。


小胖 vs PTP:一张表看懂差距

现在我们可以把小胖的操作和PTP做一个完整的对比了:

维度小胖的电子表PTP协议
主时钟学校电子铃Grandmaster Clock(通常是原子钟/GPS驯服钟)
同步信号声音(340米/秒)以太网帧(光/电,2×10⁸米/秒)
时间戳方式人耳听 + 大脑反应 + 手指按(~100ms误差)硬件在物理层打戳(<10ns误差)
相位校正按归零按钮计算offset,调整本地时钟
路径延迟处理忽略(~30ms误差)精确测量(E2E或P2P机制)
频率校正伺服算法持续微调
校正周期每45分钟一次每秒可达数十次至数千次
典型精度~0.1秒亚微秒级(<1µs),最优可达纳秒级

你看,小胖做的事情,和PTP做的事情,本质上一模一样

  • 都有一个权威时间源(铃声 vs Grandmaster)
  • 都需要接收时间信号(听到 vs 收到报文)
  • 都需要计算自己与权威的差距(看表 vs 计算offset)
  • 都需要调整自己的时间(按按钮 vs 相位校正)

区别只在于:PTP把每一步都做到了物理极限。

路径延迟:小胖忽略,PTP精确测量。 时间戳精度:小胖靠人脑,PTP靠硬件。 频率漂移:小胖没办法,PTP持续补偿。 校正频率:小胖每45分钟一次,PTP每秒成百上千次。

这就是为什么小胖的精度是0.1秒,而PTP的精度可以达到纳秒级——相差8个数量级,一亿倍。


回到我们最初的问题

现在我们可以回答1.1结尾的那个小练习了。

你盯着屏幕上的秒数,在59跳到00的时候喊了一声“现在”。

为什么你喊出的“现在”永远不是真正的“现在”?

因为:

  • 屏幕上的00显示出来,比手机内部认为的整点,晚了屏幕刷新延迟(~16ms)
  • 光线从屏幕传到你的眼睛,晚了约3纳秒(可以忽略)
  • 你的视觉信号从视网膜传到大脑,晚了约20毫秒
  • 你的大脑处理这个信号并决定“喊出来”,晚了约100毫秒
  • 你的声带和口腔发出“现在”的声音,晚了约50毫秒

所以,你说的那个“现在”,实际上是大约200毫秒之前的“过去”。

而PTP协议做的事情,就是把这个200毫秒,压缩到200纳秒——缩小一百万倍。

这就是时间同步的魅力。它不是在创造时间,而是在不断地逼近那个我们永远无法真正触及的“现在”。


本章小结

第一章到这里就结束了。我们用四篇文章,走完了从哲学到历史、从日常到工程的旅程:

  • 1.1 如果你周围的一切都静止了:时间是什么?它依附于变化。
  • 1.2 人类为时间画下的刻度:从日晷到原子钟,我们如何一步步逼近更精准的“秒”。
  • 1.3 为什么你手机上的时间和我不一样?:漂移、延迟、不对称——为什么同步这么难。
  • 1.4 那个按电子表的小学生,已经懂了PTP的核心:相位校正、延迟测量、频率校正——PTP三大机制。

现在,你应该对“时间同步”有了一个完整的感性认识和初步的技术轮廓。

下一章,我们将正式进入PTP协议本身。我们会打开1588协议的文档,逐条解读它的每一个核心概念、每一条报文、每一个状态机。

你准备好了吗?

【第二章预告】

PTP协议里有一大堆听起来很吓人的名词:Grandmaster、Boundary Clock、Transparent Clock、Sync、Follow_Up、Delay_Req、Delay_Resp、Announce、Best Master Clock Algorithm……

别怕。下一章我们会用“交响乐团”这个比喻,把这些概念一个一个讲清楚。你会发现,它们其实都很简单。