IEEE 1588 Sync报文单步时间戳
扫描二维码
随时随地手机看文章
什么是单步时间戳
什么叫两步时间戳,什么叫单步时间戳?我们结合Sync报文的发送来看一下。Master在发送Sync报文时,记录发送时间戳t1,紧接着通过发送一个Follow_up报文,把t1告诉slave。所以说对slave而言,接收Sync报文并且拿到Sync报文的发送时间戳t1,是需要master的两步发送。这种情况下的时间戳,就叫做两步时间戳。
单步时间戳实际上省去了发送Follow_up报文的步骤,在Sync报文从master的网络硬件发出来的同时,网络硬件会直接在报文上插入t1的时间信息。这样slave在收到Sync报文的时候,报文上已经包含了t1的信息。这种情况下的时间戳,就叫做单步时间戳。
显然,使用单步时间戳必须要网络硬件支持才行。
Sync报文的格式
在进一步了解单步时间戳如何将发送时间信息插入到Sync报文上之前,我们不得不先看看Sync报文的格式。IEEE 1588除了对1588报文分配了指定的以太网层,UDP/IP层的多播地址、端口和ethtype之外,还对报文的数据内容做了定义。Sync报文的数据内容定义如下。它是由一个header和一个originTimestamp的字段组成。
其header中的各个字段定义如下。
我们在这里重点关注两个字段,一个是originTimestamp,一个是correctionField。因为Sync报文两步时间戳和单步时间戳的区别就在这两个字段的内容上。
originTimestamp字段代表对Sync报文发送时间的评估值。其格式定义如下。在两步时间戳的情况下,该字段为0。
struct Timestamp
{
UInteger48 secondsField;
UInteger32 nanosecondsField;
};
correctionFeild字段代表Sync报文从网络硬件发出之前,经历的链路延迟。它的类型是interger64,其数值是链路延迟的纳秒值乘以2^16。例如,2.5ns可以表示为0x0000000000028000。通常作为master构建的Sync报文发送时,两步时间戳的情况下该字段为0。Sync报文单步时间戳插入
上面我们了解到,在两步时间戳的情况下,Sync报文的originTimestamp和correctionFeild字段的数值都是0。那么单步时间戳有什么不同呢。- 在发送Sync报文之前,originTimestamp字段会被写入发送时间评估值,这个评估值和真正的发送时间戳要求误差要在1s之内。通常是软件读出1588 time写到这个字段内。
- Sync报文真正从硬件发送的时候,硬件会在correctionFeild字段加上一个延迟时间。
correctionFeild
originTimestamp