继上一期带你读懂时间敏感网络 (TSN) 中的时间同步协议 gPTP(一),这期为您带来该系列的第二篇。
多端口实例、中继实例
多端口PTP实例的每个端口都具有收发PTP报文的能力,当其成为GrandMaster时会向所有支持802.1AS的链路发送Announce报文与Sync报文。当PTP实例不是中继实例且成为Slave时会选择可获得最
高同步精度的端口作为Slave端口,其他端口收到的Sync报文将被忽略,忽略Sync的端口称为Passive端口。BMCA算法首先使用systemIdentity判断哪个实例是最佳GrandMaster,当多个端口收到相同systemIdentity时,BMCA算法选取连接到至GrandMaster经转发最少链路的端口成为Slave端
口。gPTP通过stepsRemoved识别报文被转发的次数,它和GrandMaster信息一起在Announce报文中传输,每经过一个PTP节点该值会加一。
中继实例(Relay Instance)是指拥有转发和处理时间同步消息功能的PTP实例,通过中继实例时间同步消息能够准确传播到网络中的多个设备上。典型的中继实例有支持gPTP的交换机、路由器等。相对于非中继实例,中继实例会同时拥有Master、Slave、Passive端口。
中继实例选择Slave端口的逻辑与多端口实例的逻辑相同,都是收到包含最佳systemIdentity、stepsRemoved参数Announce报文的端口成为Slave端口。若实例当前GrandMaste的systemIdentity优于端口收到的systemIdentity端口将成为Master端口,其他端口成为Passive端口。以下为PTP实例的Master/Slave层次结构:
注意:本文为方便读者理解将多端口实例、中继实例、单端口实例的BMCA算法进行了拆分解释,实际上各种PTP实例使用的BMCA算法相同。
而当Slave端口与中继实例相连时,Pdelay报文不会被转发而是由中继实例直接响应,Slave端口测得的链路延迟为到中继节点的延迟而非到GrandMaste的延迟。另外中继实例对Sync报文的处理、转发操作也会增加Sync报文从GrandMaste到达Slave的时间,按照前文中的方法将无法得出正确的时钟偏移量。实际上每个gPTP报文的包头都带有correctionField字段,在与Sync对应的Followup报文中该字段表示对应的Sync报文从被GrandMaster发出,到被最后一个中继实例发出经过的时间,有了该变量即使GrandMaster与Slave间存在中继实例,Slave依然可求得与Master时钟的正确偏移量。
中继实例转发Sync报文时会使用新计算的correctionField替换原报文中的correctionField。
rateRatio测量
中继实例通过记录收到Sync报文与发出Sync报文的时间戳来计算自身处理、转发Sync报文的耗时,这些时间戳是基于中继实例本地时钟的。在中继实例与Master同步前本地时钟与Mater时钟会存在一定频率偏差,即便在同步后时钟频率依然会存在轻微误差。而correctionField需要以Master时钟为参考,中继实例与Master时钟的频率偏差会影响到correctionFiled的精度进而影响到时间同步精度。延迟测量也使用了两个以本地时钟为参考的时间戳,所以本地时钟频率偏差一样会影响延迟测量的精度进而影响到时间同步精度。 neighborRate为链路对端实例时钟频率与自身时钟频率的比例,它收到两组Pdelay_resp和Pdelay_Resp_Follow_Up报文的间隔测量,计算公式如下:
rateRatio为实例本地时钟与GrandMaster时钟的频率比例,当前实例的rateRatio通过相连Master端口的rateRatio加上当前实例时钟与GrandMaster时钟的偏差求得即rateRatio+=(1-neighborRate)。相连Master端口的rateRatio通过Sync报文中的cumulativeScaledRateOffset字段求得。
rateRatio会参与链路延迟及correctionField的计算以提高同步精度。
gPTP报文结构
报文头:PTP报文拥有固定的报文头,结构如下:
Announce
Signaling
gPTP-capable与gPTP-capable message interval request的Lenth字段分别为12和10。
message interval request TLV:用于请求对端实例更改发送Pdelay_Req、Sync、Announce报文的的平均间隔。
gPTP-capable TLV:用于向链路对端设备通告本设备支持802.1AS
Sync
Follow_Up
Pdelay_Req
Pdelay_Resp
Pdelay_Resp_Follow_Up
参考文献