1.时间同步
1.1 单步同步(OneStep)
单步同步最为简单,master向slave发送一个sync的同步包,同步包里带有这条信息发送时master的当前时间t1,假如这条信息从master传输到slave需要的传输时间是D,那么slave收到信息时,master的当前时间已经变成了t1+D,如果slave当前时间是t2,那么它们之间的时间差
offset = t2 - (t1+D)
比如上图的例子,假如master在自己时间是15:00的时候发送了一个sync包,包里面带有时间t1即15:00,slave在自己时间是15:40的时候收到了这条信息,接收时间点是t2,slave看到包里面数据显示这条信息发送时间点是master的15:00,假如slave已经知道了它和master之间传递消息需要30分钟,那它可以很简单的算出它现在比master快了10分钟,否则它现在应该是15:30。
1.2两步同步(TwoStep)
两步同步一样简单,在单步同步里,sync包直接携带了这个包的发送时间点,两步同步和它唯一的区别在于这个时间点不再直接放在sync包里了,而是在发送完sync包后,紧接着发送一个follow_up包,把这个时间放在follow_up包内。
对于上图的情况就是master在自己时间为15:00时发送了一个sync包给slave,但是这个包里什么也没有。slave在自己时间是15:40时,收到了这个sync包,此时时间点是t2,到这里为止,除了它并不知道sync包是什么时候发送的(t1),其他都和单步一模一样,所以它会继续等待后续的follow_up包。而master在15:10的时候发送了一个follow_up包,所以slave在15:50才收到了follow_up包,但slave对于follow_up包的发送和接收时间根本不关心,因为现在只差sync包的发送时间了,而sync的发送时间就包含在follow_up包内。
是不是觉得单步同步是两步同步的优化版?明明单步就能实现,为何还要多一个follow_up包去传递sync的发送时间?
很简单,思考一下sync这个15:00的时间点是怎么来的?
假如master和slave是两台电脑,你发送sync时,可以直接把15:00填充到sync包里,然后告诉网卡,你需要在15:00把这条信息发送出去,但是这很难实现,而且很麻烦,还需要网卡支持。简单的方法是你把sync包给网卡,但是里面的时间并不填充,而是让网卡在发送时,把这个时间填写进去,这也需要网卡支持,但是明显更符合实际一点。假如我们使用follow_up时,则最简单,我们只需要记录发送时间即可,而根本不需要在发送时填充。
2. 测量延迟
2.1 E2E
在时间同步里,我们假设了我们已知消息传递时间D,但其实这个时间我们一开始并不知道,所以需要计算。E2E的意思是End to End,从名字就可以看出,它从一个终点到另一个终点。
E2E必须要时间同步包sync(如果是两步则也包括follow_up)同时参与。它的计算也很简单,master在t1时刻发送sync给slave,slave收到的时候是t2,slave知道了t1和t2,则有
t2-t1=D+offset
slave在t3时刻发送Delay_Req给master,master收到的时候是t4,然后master把这个时间t4填充到Delay_Resp里再发回给slave,slave知道了t4和t3,则有
t4-t3=D+(-offset)
所以t4-t3+t2-t1=2D,从而消掉了offset,只需再除以2就可以算出D的时间。
或者由上图看,t-ms是master发送到slave的路径延迟,t-sm是slave发送到master的路径延迟。我们用t4-t1-(t3-t2)可以算出t-ms+t-sm的值,当t-ms=t-sm时,D=t-ms=t-sm,所以只需要把结果再除以2就可以了。这里很关键的前提条件是,从master->slave和slave->master的路径延迟相同!其实正常情况下并不相同,但是这里我们为了计算D,把它们看作是相同的。
2.2 P2P
P2P的意思是Peer to Peer,它意思是端到端。请注意上图,两边的设备不再是master和slave,也就是说对于无论是master还是slave都可以主动发送第一条Pdelay-Req消息,从而开启一次测量流程,这点和E2E不同,E2E里我们知道,最后所有的时间只有slave知道,所以只有slave可以计算出路径延迟D。还有一点不同是,仅仅用P2P计算路径延迟D不需要sync包参与,所以当计算完路径延迟D后,再进行时间同步时还需要发送sync包。
实际的计算过程则大同小异,从上图上看,计算无非是:
D=(t4-t1-(t3-t2))/2
当然也可以理解为t4-t3=D+(-offset),t2-t1=D+offset,再去消掉offset计算。
2.3 E2E-TC
其实只单单看E2E和P2P感觉并没有什么不同,所以当然会有感而发,为何有了E2E还需要P2P?
待续...
3. 频率同步
频率同步既可以是单步也可以是两步,对于单步的情况来说,假如15:00的时候B给A发送了sync包,15:10的时候又发送了一个sync包,理论上来说,假如B和A的时间走的一样快,那么A收到两个sync包的时间间隔也是10分钟!路径延迟和两个设备之间的时钟偏差并不影响这个间隔。如果不能理解就再做一个假设,A收到第一个包的时间是15:40,路径延迟是30分钟,那么我们知道A和B时钟偏差是10分钟,算上这个偏差,第二个包里面的时间是15:10,那么A可以计算出来,如果频率没有偏差,收到第二个包的时间应该是15:50!但是假如A收到第二个包的时候它自己的时间是16:00,它就知道了B发送两个包的间隔是10分钟,而自己收到两个包的时间分别是15:40和16:00,间隔20分钟,所以A的时钟比B快一倍!知道这个之后,我们只需要把A的时钟调慢一倍即可,注意不是直接把时钟当前时间减去10分钟,那再过10分钟A又比B快10分钟了,而是把A原来走2秒的时间调成只算做1秒!
附一些PTP相关资料:
1588v2报文格式
linuxptp项目
linuxptp项目github仓库
linuxptp中ptp4l使用手册
瑞萨关于linux对PTP硬件时间戳支持介绍
https://www.elinux.org/images/f/f9/Introduction_to_IEEE_1588_Precision_Time_Protocol_(PTP)_Using_Embedded_Linux_Systems.pdf
https://blog.csdn.net/weixin_43408952/article/details/125009747
https://blog.csdn.net/yaojiawan/article/details/124601694
https://blog.csdn.net/yanceylu/article/details/116085860
新华三PTP介绍
华为PTP介绍