所以 136年为一个周期,当到2036年时,数据会溢出。NTP 协议中定义了Era Number 来解决这个问题。从1900 年1 月1 日开始的第一个136 年,Era Number 为0,之后的每136 年加1。但Era Number 的值本身并不能从NTP 的数据中得出,需要从外部采用一些方法来解决。
NTP报文格式
下图所示是NTP报文的格式:
LI闰秒标识器,占2个比特位。预警最近的分钟里将要被插入或者删除的闰秒秒数。
版本号,占3个比特位。现在为版本4.
模式,占3个比特位。
Stratum(层) ,占8个比特位。表示当前时钟的层。
轮询(Poll)间隔,占8个比特位。表示连续信息之间的最大间隔。
本地时钟精度,占8个比特位。
原始时间戳Originate Timestamp,64比特。客户端发出NTP报文的时间。
接收时间戳Receive Timestamp,64比特。服务器端接收到NTP报文的时间。
发送时间戳Transmit Timestamp,64比特。服务器端发送应答的时间。
NTP,SNTP和IEEE1588(PTP)的区别
大多数环境中,NTP可以提供1~50ms的可靠时钟源。但对于很多系统来说,并不需要这么高精度的同步,而且完全实现NTP协议太复杂了,所以SNTP(Simple Network Time Protocol)应运而生。SNTP基于NTP协议,和NTP的数据帧格式是一样的,计算时间偏差以及数据包往返时延的方法也一眼。区别就是SNPT没有NTP中复杂的同步算法。SNTP提供的同步时间精度比NTP低。SNTP与NTP协议具有互操作性,SNTP客户端可以与NTP服务器协同工作,NTP客户端也可以接受SNTP服务器发出的授时信息。
IEEE1588协议是专门针对工业应用提出的精确时钟同步协议。它能提供微秒级的时间同步。
与IEEE1588相比,NTP/SNTP授时精度不高的原因在于打时间戳的位置。NTP/SNTP是在应用层写入或者读出时间戳,客户端发起授时请求,先从应用层到物理层,经过网络传输,到达服务器端再从物理层到应用层被读出,这三个阶段都存在不确定性。反之亦然,造成NTP/SNTP的精度不会很高。
而IEEE1588的时间戳的获取位置是在物理层,可以避免报文处理时间的不一致性。STM32的以太网外设支持IEEE1588协议提供高精度的同步,在每个帧的发送或接收时给出64位时间戳,与NTP的时间戳格式相同。关于IEEE1588的实现可以参考ST的另一篇AN3411。