gptp协议

帧格式:1588v2(PTP)报文格式

参考:

车载以太网之时间同步协议gPTP - 知乎

GPTP-智能驾驶时间同步之利器_king110108的博客-CSDN博客_自动驾驶时间同步

gptp主要用于一个局域网内的各个节点的时钟同步,涉及到一些概念。

IEEE 802.1AS-2011

  • gptp协议

gptp协议由三部分构成

  1. Header (对所有gPTP都一样)
  2. Body (取决于gPTP 报文类型)
  3. TLV(type length value)

报文帧位于Mac层,mac帧的类型为Ethertype = 0x88F7。

  • Header: 固定是34个字节,结构如下

  • Body:根据gptp协议的类型决定(在Header中的Message type决定,取值范围如下)

gptp需要实现的任务

  • BCMA:Best Master Clock Algorithm,最佳主时钟选择算法

当系统上电后,系统所有的设备都会发一条报文来参与主时钟竞选,每一个设备都会比较自己的时钟与其他设备的时钟信息,所有节点都这样,直到选出主时钟(一个GPTP系统可以预先设定一个主时钟(比如网关等),也可以通过BCMA算法得到)

算法分为两个部分:
第一部分:从所有Annouce报文中选出最佳报文。
第二部分:使用最佳报文和自身属性比较,算出最终状态。

  • 频率同步:

每个节点的时钟频率不一致,比如实际时间过了100s, 从节点A计时是过了90s,所以从节点需要和主节点的时钟频率需要匹配 

原理:主节点过10s,从节点过 9s,那么这个偏差R = 10 / 9,然后每次从节点拿到时间就会*R ,来得到和主节点一样的时间。

偏差公式: R = (T3 - T1) / (T4 - T2) 

说白了R 就是两边的时间转换系数。

  • 延时测量

为了将自己的时钟与master同步,slave必须测量出自己与master之间报文传递的延迟时间。时延测量使用到的上文中提到的PDelay_Req、PDelay_Resp和PDelay_Resp_Followup三种gPTP报文。具体的测量方式如下图所示:

从逻辑上理解:就是要算delay的时间,当到达T4时间的时候,slave拿到了T1~T4 ,所以按理说: slave---->master: delay = T4*R -T3

      master---->slave:delay = T2 -T1*R,

但是来回需要取平均,于是总的dealy:

delay = [ (T4*R -T3) + (T2 -T1*R) ] /2, 把公式整理下:

delay = [(T4 - T1)*R - (T3 - T2) ] /2

  • 时间同步

按理算:T1到达Ta的时候,Tb = T1 + delay + (Tb-T2)*R  一定要*R,因为对于slave来说,经过了(Tb-T2)实际上转换到master的时间是 (Tb- T2) *R才行。

R = [Ta - ( T1 + delay) ]  / (Tb - T2),  于是可以实现 Ta  = Tb 

  1. master发送sync请求消息,slave收到slave记下时间t2, slave得到t2
  2. master发送Follow-up消息,带着t1的时间。 slave得到t1,t2
  3. slave发送Delay_req消息,带着时间t3,  slave得到t1,t2,t3
  4. master发送Delay__Resp消息,带着时间t4
  •  
  1.  master和slave之间的误差:MS_diffrence = slave收到的时间t2 - Master发送的时间 t1
  2. MS_different = master和slave之间的t2 - t1 [通过sync和follow-up消息得到]
  3. MS_different = master和slave的时间偏差offset + 传输的延时 MS_delay
  1.  同理,通过Delay_Req和Delay_Resp消息确认的t4和t3
  2. SM_difference = - (slave和master的时间偏差offset) + 延时 delay
  1. 通过上面的计算: MS_difference = offset + MS delay 和   SM_difference = – offset + SM delay
  1. 于是整理上面的公式,可以得到:
  2. offset = {MS_difference – SM_difference}/2    两边时间的偏差
  3. one_way_delay = {MS_difference + SM_difference}/2   传输的延迟
  1. 但是根据上面的计算,发现并不能完全精准调整时间,比如按之前的推导,时间的offset是 55 不是真正的60
  2. 但如果把60对应的minutes换成ns呢,即使有误差,也是ns级别,实测最多到几百ms,与实际的网络拓扑状态有关,可以在代码加一些判定,比如delay在10ms以内,则停止纠正时间!!,但无论怎样,按照 offset = {MS_difference – SM_difference}/2 和 one_way_delay = {MS_difference + SM_difference}/2可让两端时间同步

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值