参考:
PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习_lichenxi_0528的博客-CSDN博客_ptp协议
gptp主要用于一个局域网内的各个节点的时钟同步,涉及到一些概念。
gptp协议由三部分构成
- Header (对所有gPTP都一样)
- Body (取决于gPTP 报文类型)
- TLV(type length value)
报文帧位于Mac层,mac帧的类型为Ethertype = 0x88F7。
- Header: 固定是34个字节,结构如下
- Body:根据gptp协议的类型决定(在Header中的Message type决定,取值范围如下)
gptp需要实现的任务
- BCMA:Best Master Clock Algorithm,最佳主时钟选择算法
当系统上电后,系统所有的设备都会发一条报文来参与主时钟竞选,每一个设备都会比较自己的时钟与其他设备的时钟信息,所有节点都这样,直到选出主时钟(一个GPTP系统可以预先设定一个主时钟(比如网关等),也可以通过BCMA算法得到)
- 频率同步:
每个节点的时钟频率不一致,比如实际时间过了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
- 设备在PTP这块采用的传输层协议是UDP。PTP协议使用的端口号是319和320,
#define EVENT_PORT 319 #define GENERAL_PORT 320(1)319对应事件消息(EVENT),需要网口记录收发时间戳
(2)320对应普通消息(GENERAL),无需记录收发时间戳。
- 需要通过UDP接受发送5种报文:sync报文,Follow_Up报文,Delay_Follow_Up报文,Delay_Req报文,Delay_Resp报文。并针对master和slave端收发上述的报文做相应的逻辑处理。
- 如何设置某个设备为主时钟?