原文链接:https://zhuanlan.zhihu.com/p/113398852
一文讲懂gPTP
简介:
gPTP是general precise time protocol的简称,是PTP协议的派生。
gPTP的目的是确保所有局域网里的节点的时间完全一致(ns级别的误差),下面让我们直奔主题。
如何达到NS级别的误差:
为了达到ns基本的误差,gPTP实现了哪些要求呢?
gPTP协议基于L2层传输
在OSI网络模型里,L2是MAC层,L3是IP层,我们通常见到的如交换机是L2层的转发,路由器是L3层的转发。gPTP协议是基于L2层的传播,那么就决定了一个特性,只能在局域网里传播,不能通过路由器往WAN网传输。为了达到ns级别的延时,这个也是必须做的。
MAC上的硬件支持
为了测量更精准的时间,我们必须精准的知道一个MAC帧出去的时间,和收到一个MAC帧的时间,这个地方不能通过软件来获得,因为如果通过软件来获取时间,进出终端,任务抢占的时间是不确定的,不可测的。
这里我们来看一下S32K148的MAC的简单框图
MAC里包含了一个timer,通常这个timer是32bit的,当然如果是64bit的就最好,每次当一帧出去的时候,会有一个timestamp从timer上记录下来,这个时候程序任何时候处理,都知道这一帧出去的真正时间。
通常,这个timer里得到的值最好是ns,假如时钟是100M,那么每一个时钟timer增加10。
测量网线上的延时
为了到达ns级别的延时,网线上的传输时间自然不能忽略,如何测量网线上的传输延时呢?
专业名称叫 peer to peer delay
我们建设A想知道自己传输到B的延时有多少,怎么办的。
A会发出一个信息(PdelayReq,这个信息的内容是什么不重要),由MAC记录下离开MAC发送到网线上的真正时间t1,B收到这一帧,由MAC记录下收到这一帧的时间t2,然后B会发送一个信息(PdelayResp, 这个信息的内容是什么不重要),同样的B记录下t3,A会记录下t4,最后B会把(t2,t3 装再Pdelay_Resp_Follow_UP)这个帧里面发到A,这时候A会有4个时间数据,t1,t2,t3,t4。
我们假设A,B 时间相差offset,线上传输延时为delay.
t1+delay=t2+offset
t3+delay=t4-offset
delay=(t2-t1+t4-t3)/2
这个时候我们就可以测到线上的延时是多少了。
在汽车以太网中,这个测量过程A和B都会互相发起,测量。但是不用太频繁,因为这个值主要受线的长度影响,一旦固定下来,就不会有大的变化了。
有了上面三个因素:
gPTP协议基于L2层传输
MAC上的硬件支持
测量网线上的延时
时间同步:
gPTP规定一个局域网里只能有一个master,其他全部是slave,同时只有endpoint能参与作为时钟节点,bridge不能作为时钟节点,只能作为透明时钟。
在汽车以太网中,不需要动态协商谁是master节点,通常是预先设定好的。
只有master节点能发送,sync 和 follow_up这两个帧,其实这个的作用就是告诉所有slave节点,我的时间是多少,你应该和我设置为一样的。
在上图中,master发出sync的时间为 te11,slave收到的时间为tb11,同时master发送follow-up携带te11,告诉slave,这个时候slave就有了两个时间,tb11,te11。
这个时候slave自然就知道自己和master的时间差是多少了,这个地方还有一个重要的一点,slave端还要加上Pdelay这个时间,要把在网线上传输的时间加上。这个时间我们master和slave的时间就一样了。
SLAVE有了这个时间该如何处理?
我们再来看MAC的timer计数器,这个计数器的时钟通常来在晶振然后PLL作为输入,既然是晶振,那么master和slave的晶振就必然会有误差,随着时间的积累会越来越大。
所有SLAVE需要做的就是利用master发来的sync,follow-up帧和测量的pDelay来纠正这个timer计数器里的值。
这个通常会有硬件上的支持去更改,再看一下S32K148的MAC的框图
这里不去细讲这个,有兴趣可以去看看S32K148的RM。
有了gPTP的协议支持,这个时候不管是master的代码去读timer的值,还是slave的代码去读timer的值,我们理论上认为去到的值都是一样的了。
下图是汽车上gPTP的一些时间标准。
更多细节可以看:
本文主要介绍了gPTP的endpoint的一些特性,后续还会继续介绍一些gPTP bridge节点的一些特性,还有hybird模式的场景等等。