我是靠谱客的博主 认真睫毛,最近开发中收集的这篇文章主要介绍IEEE1588v2解析(4)--透明时钟/一步时钟/二步时钟,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

透明时钟是PTP协议里面最复杂和最难理解的部分;下面是全网最清晰的透明时钟介绍。

在介绍透明时钟之前,需要先介绍下PTP协议的报文类型:

PTP报文分两种大类

一类是Event报文:

  • Sync, 同步消息 , 由主设备发送给从设备 , 消息中可以包含 Sync 发送时间标签 , 也可以在后续的Follow UP 消息中包含 ;
  •  Delay_Req,请求对端返回接收到 Delay Req消息时的时间标签 , 时间标签嵌入在响应消息Delay Resp
  •  Pdelay_Req,用于发起链路延时测量请求 , 带发送时间标签。
  •  Pdelay_Resp

这类型报文有个特别的要求,即发送和接收这些报文的端口需要记录发送时间点或者接收时间点。

另一类是general报文:

  • Announce
  • Follow_Up
  • Delay_Resp
  • Pdelay_Resp_Follow_Up
  • Management 
  • Signaling 

报文的公共header: 

  • sourcePort Identity用来区分请求发起方的端口
  • correctionField用来存储时间信息,单位为纳秒,具体取值除以2的16次方以后是真正的值,也就是最低的16bit可以表示小于纳秒的值
  • flagField里面的twostep标志位,可以用来标识是否采用二步时钟

 不同消息内容的定义:

 一步时钟 one-step clock:使用单个Event报文(比如Sync)来提供时间信息的时钟;

二步时钟 two-step clock:使用一个Event报文(比如Sync)和紧接着的一个general报文(比如follow up)来提供时间信息的时钟。

比如普通时钟/边界时钟作为主时钟时候,可以是一步时钟,也可以是二步时钟,一般取决于硬件标记时间戳的性能,能力强的可以一步,这个在前面的文章中提到过。

透明时钟:一个设备,可以测量PTP event报文经过自己的所花费时间(residence time),并且将此时间添加到PTP报文里面。本身并不需要和grandmater进行时间同步,通常保持频率同步即可。需要转发所有非PTP报文。

透明时钟的分类:

  • 端到端的时钟 E2E TC
    • 转发所有PTP报文
    • 对于Sync, Follow_Up和Delay_Req报文按照规范要求进行residence time的处理
    • 不支持PeertoPeer的路径测量
  • 点到点的时钟 P2P TC
    • 执行PeertoPeer的路径测量
    • 转发Announce, Sync, Follow_Up, Management, Signaling 报文;
    • 扔掉Delay_Req 和 Delay_Resp报文
    • Sync 和 Follow_Up报文需要按照规范要求进行residence time的处理。

上面两种时钟,可以是一步时钟,也可以是二步时钟;

在同一通信链路上,不允许同时存在E2E TC和P2P TC。

下面谈一下透明时钟的作用:

      透明时钟通常是网络交换机类型的设备,当交换机上有大量数据流量时候,会出现报文排队,每个端口的排队情况都不会一样,PTP的路径计算假设了链路时延是对称的,也就是主时钟到从时钟的时延和从时钟到主时钟的时延相等,对于线路上,这种假设一般是成立的,但是线路上还存在交换机类设备,那么由于排队情况的存在,两个方向的时延并不一定是相同的,这样就会引入误差,通过在交换机的端口上启用透明时钟,可以把经过自身的排队时间放在PTP报文上,这样从时钟在处理PTP报文时候,可以消除两个方向上排队时间带来的差异,这样能大大提高时间同步的准确度。

下面是透明时钟如何消除差异的原理分析,

首先看E2E TC(二步时钟)的情况:

  1. 如果收到Sync报文的twoStepFlag 是FALSE,代表后续不会收到follow up报文。透明时钟转发Sync报文,并将twoStepFlag修改为True,并计算和记录Sync报文经过它时候花费的时间residence time(master到slave的方向的排队时间,记为C1
  2. 然后透明时钟需要自己产生follow_up报文,因为自己是二步时钟,此时需要把Sync报文的originTimestamp(也就是t1)放在follow_up的preciseOriginTimestamp;follow_up的twoStepFlag也是Ture。
  3. residence time需要放在follow_up的correctionField。
  4. 然后发送follow_up。
  5. 如果收到了Delay_req消息,那么需要计算Delay_req经过自己时候花费的时间residenceTime(slave到master的方向的排队时间,记为C2),然后转发Delay_req。
  6. 后续接收到Delay_resp的消息后,将residence time需要放在Delay_resp的correctionField,然后转发Delay_resp。

 路径时延计算:

<meanPathDelay> =[(t2 - t3) +(t4 - t1)]/2=   [(t2 - t3) + (receiveTimestamp of
Delay_Resp message(t4的纳秒以上部分) – preciseOriginTimestamp of Follow_Up message(t1的纳秒以上部分)) – correctionField of
Sync message(取值0)– correctionField of Follow_Up message(取值为:t1的小于纳秒的部分 + C1) – correctionField of Delay_Resp
message(取值为:C2 - t4的小于纳秒的部分)]/2  = [(t2 - t3) +(t4 - t1)]/2-(C1+C2)/2 =  [(t2 - t1) +(t4 - t3)]/2- (C1+C2)/2

时钟偏差值计算:

<offsetFromMaster> = t2-t1-<meanPathDelay> =  <syncEventIngressTimestamp>(即t2) - <preciseOriginTimestamp>(即t1大于纳秒部分) -
<meanPathDelay> - correctionField of Sync message(取值0) - correctionField of Follow_Up
message(t1小于纳秒部分+C1) = t2-t1-[(t2 - t1) +(t4 - t3)]/2-(C1+C2)/2 -C1= t2-t1-(D+C1)

上式假设

 t2 - t1 = D+C1   master到slave时延

 t4-t3 = D+C2;slave到master时延

假设线路时延两个方向都相等,都是D,C1为master到slave增加的排队时间,C2为slave到master的排队时延;

所以最终offsetFromMaster = t2-t1-(D+C1);也就是正好减去了master到slave的线路时延和排队时间。这样就消除了两个方向排队时间不对等带来的影响。

再看P2P TC(一步时钟)的情况:

  1. 如果收到Sync报文,记算Sync报文经过它时候花费的时间residence time(master到slave的方向的排队时间,记为C1),并放到correctionField,然后转发Sync报文
  2. 即使后续收到follow_up报文,直接转发,不做任何修改
  3. Pdelay_Req 和Pdelay_Resp 报文,终结于P2P TC,也就是P2P TC使用这两个报文进行z按正常的链路时延测量,t3-t2放入Pdelay_Resp的correctionField。
  4. 另外,透明时钟还需要把计算得到的路径时延增加加到Sync报文的correctionField。此时correctionFiled里面的值为(路径时延+C1)

 路径时延计算:

<meanPathDelay> = [(t4 − t1) − correctionField of Pdelay_Resp]/2 = [(t4 − t1) −(t3 − t2) ]/2 

按照以上公式,可以计算出Master到透明时钟的路径时延meanPathDelay_1,和透明时钟到slave的路径时延meanPathDelay_2;

时钟偏差值计算:

t2-t1-<meanPathDelay_2> =  <syncEventIngressTimestamp>(即t2) ─ <originTimestamp> (即t1)─
<meanPathDelay_2> ─ correctionField of Sync message(即meanPathDelay_1 + C1) = t2-t1-<meanPathDelay_2>-<meanPathDelay_1>-C1

可以看出,只有master时钟到slave时钟方向的排队时间C1参与了时间偏差值计算;所以消除了两个方向排队时间不一致的影响。

总结一下: 

P2P TC,如下图所示,Clock A和ClockC分别是master和slave时钟,ClockB是透明时钟;ClockB会使用PeertoPeer的时延测量方法(PDelayReq和PDelayResp)测出A到B的时延X,同样,ClockC会测量出B到C的时延Y;同时作为透明时钟的ClockB,需要测量Sync消息路过它的时候的内部排队时间C1,然后把C1+X放到Sync或Follow_Up消息的correctionField;当Clock C收到Sync或Follow_Up消息后,可以通过以下等式计算出和class A的时间偏差。

timeoffset = t2-t1-Y-(X+C1) = t2-t1-(X+Y+C1)

所以X+Y+C1正好是Clock A到Clock C的路径时延。


E2E TC,如下图所示,Clock A时master,Clock C是 Slave,Clock B是E2E透明时钟。

ClockA和Clock C之间采用DelayReq-Resp测量机制,测量A和C之间的平均时延M。C1和C2分别是A->C和C->A方向的排队时延。 C1是通过Sync报文经过ClockB时候测量出来的,C2是DelayReq报文经过CLockB测量出来的;C1会放在Sync或Follow_Up消息的correctionField,C2会放在DelayResp的correctionField。当Clock C收到C1和C2后,可以计算出和主时钟的时间偏差。

假设A到C的时延是D+C1,C到A的时延是D+C2

平均路径时延M = (D+C1+D+C2)/2

考虑correctionField的取值后的平均路径时延M = (D+C1+D+C2)/2 -  (C1+C2)/2 = D

可以看出,此时的平均路径时延M,去掉了C1和C2后的平均值;

而真正的A到C方向的路径时延应该是D+C1;

所以最终的TimeOffset = t2-t1 - M- C1 = t2-t1-D-C1 = t2-t1-(D+C1)

所以最终的TimeOffset只有C1的影响,没有了C2,消除了C2带来的误差;

最后

以上就是认真睫毛为你收集整理的IEEE1588v2解析(4)--透明时钟/一步时钟/二步时钟的全部内容,希望文章能够帮你解决IEEE1588v2解析(4)--透明时钟/一步时钟/二步时钟所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部