PTP 精密时间协议 IEEE 1588:硬件时间戳与 MAC 打戳点
更新时间:2026-09-19。前置:以太网 MII/RGMII 接口。NTP 软件打戳通常只到毫秒,PTP(IEEE 1588)配合硬件时间戳能做到亚微秒甚至纳秒级,用于 5G、工业以太网、测量、音视频同步。
本文要回答的问题
- PTP 用哪几条消息测出主从时差和路径延迟?
- 软件打时间戳为什么不准,硬件应在哪一点打?
- 本地时钟怎么被「调教」到主时钟(相位/频率伺服)?
- 边界时钟、透明时钟解决了什么,多端口交换的误差从哪来?
一、E2E 延迟请求-响应机制
普通时钟(OC)用四条消息算出时间偏移:
bash
t1 主 ──── Sync ────► 从(实际到达 t2)
主随后发 Follow_Up,携带 Sync 的精确发出时间 t1
t3 从 ──Delay_Req──► 主(到达 t4)
主回 Delay_Resp 携带 t4
路径延迟(假设往返对称):
delay = ((t2 - t1) + (t4 - t3)) / 2
从钟相对主钟偏移:
offset = (t2 - t1) - delay = ((t2-t1) - (t4-t3))/2- Sync/Follow_Up 两消息模式(two-step):发出瞬间还不知道精确 t1,先发自增序号的 Sync,随后 Follow_Up 携带硬件记下的精确 t1。one-step 时钟则直接在 Sync 里就地修正时间,省一条消息但 MAC 更复杂。
- t1/t2/t3/t4 都应是硬件时间戳,软件栈时间含排队、调度抖动。
二、硬件时间戳打在哪
时间戳点必须尽量靠近线路、跨所有协议栈抖动最小处:
bash
应用/协议(PTPd/linuxptp)
│ 软件打戳点:抖动大(调度/协议栈)
MAC ─ 最佳打戳点:MAC 与 PHY 之间的 MII/GMII/RGMII,
│ 识别帧 SOF/SFD 时刻对本地 RTC 采样
PHY ─ 更理想(PHY 打戳,消除 MAC-PHY 延迟),需支持
线路- MAC 检测 PTP 帧(EthType 0x88F7,按 UDP/IPv4/IPv6 或二层封装),在 SFD 采样点对本地维护的 PTP RTC(实时计数器)取戳,经描述符/寄存器交给软件。
- 发送方向打「真正离开 MAC」时刻、接收方向打「到达」时刻,需要校准 MAC↔PHY↔端口的固定 PHY 延迟(ingress/egress latency 补偿,10/100/1000 不同)。
- 时间戳常与 DMA 描述符绑定(见 DMA 描述符环),CPU 收到包时一并拿到硬件戳。
三、本地可调时钟与伺服
PTP 从节点维护一个硬件时钟(PTP Hardware Clock),软件(linuxptp 的 servo)用 offset/频率误差输出修正:
- 相位调整(time adjust):一次性加减,用于初始大偏差。
- 频率微调(frequency/syntonization):用很小的数值(ppb,十亿分之一)持续调 RTC 计数率,把漂移拉到与主钟一致,稳态下只做频率锁定避免跳变。
- PI 控制器:误差→频率字,类似锁相环(见 全数字 PLL)。
- RTC 计数器宽度/加秒/闰秒处理、时间读回要原子(高低字闩锁),避免读到撕裂值。
四、边界时钟与透明时钟
多台交换机级联时,普通 BC/OC 逐跳恢复时间会累积误差与抖动:
| 类型 | 行为 |
|---|---|
| 普通时钟 OC | 一个 PTP 端口,终端从机 |
| 边界时钟 BC | 交换机每端口跑 PTP,上游对主同步、下游当主,隔离级联抖动,但仍逐跳伺服 |
| 透明时钟 TC | 不重建时间,只测量 PTP 帧穿过交换机的**驻留时间(residence time)**并改写 correctionField,让端到端误差≈线路传播 |
E2E TC 加驻留时间,P2P TC 用 peer delay 机制逐段测链路延迟,适合大规模确定性网络。
五、常见的坑
- 用软件时间戳做 PTP:协议栈/调度抖动几十~几百 μs,达不到指标,必须开硬件时间戳。
- 打戳点没固定:在驱动层而非 MAC SFD 打戳,延迟随负载变。
- 没做 PHY 延迟补偿:RGMII 收发固定延迟、不同速率不同,offset 有恒定偏差。
- two-step 丢 Follow_Up/不关联序号:t1 对不上 Sync,计算错乱。
- 路径不对称:公式假设往返对称,上下行延迟不同会有固有误差,需手工 asym 校正。
- 频率调整粒度太粗/只做相位跳变:稳态时间来回跳,应用采样出错。
- RTC 读回撕裂:高低 32 位非原子读,偶发巨大错误值。
- 普通交换机不支持 PTP:存储转发随机排队破坏时间戳,必须用支持 BC/TC 的设备。
- 打戳通道选错:IPv4/IPv6/L2、VLAN、one/two-step 与硬件识别规则不匹配,取不到戳。
- 时间戳中断/描述符处理慢:丢戳后这轮同步失败,需要超时重同步。
- 主时钟本身质量差:本地晶振决定从钟极限,高精度要用 OCXO/带 GPS/1588 的 grandmaster。
相关与延伸
MAC-PHY 接口与打戳位置见 MII/RMII/GMII/RGMII;硬件时钟伺服类比 全数字 PLL;时间戳随包交付见 DMA 描述符环。
总结
PTP(1588) 用 Sync+Follow_Up(给出 t1)、到达 t2、Delay_Req(t3)、Delay_Resp(t4) 四个硬件时间戳算出 offset=((t2-t1)-(t4-t3))/2 和往返路径延迟;精度的关键是在 MAC-PHY 的 MII/GMII 处对 SFD 采样本地 PTP RTC 打硬件戳并补偿固定 PHY 延迟,再用 PI 伺服以 ppb 级微调时钟频率而不是频繁跳相位;交换机可用边界时钟隔离抖动或透明时钟把驻留时间写进 correctionField——软件打戳、打戳点不固定、不补 PHY 延迟和路径不对称是四大误差源。