NTP协议和算法
更多文章...

整理中。。。

NTP:Network Time Protocol,网络时间协议,用于时间同步,它可以提供高精准度的时间校正(LAN上与标准时间差小于1毫秒,WAN上几十毫秒)。

NTP校时原理:

每一个NTP通信包内包含对方的接收和发送时间戳(TimeStamp)、我方的接收和发送时间戳。在收到上述包后即可计算出时间的偏差量与网络延迟。算法见后。

为了得到稳定的基准时间,需要同时与多个上级时间服务器进行校时。根据历史时间包,过滤时间抖动,找出相对较可靠的时间来源。

时间信息的传输都使用UDP协议。服务端口123。


NTP协议格式:

NTP packet = NTP header(16字节) + 4个时间戳(每个8字节) = 48字节

其中NTP header的顺序格式:

LI | VN |Mode | Stratum | Poll | Precision |Root Delay |Root Dispersion |Reference Identifier

Li - LeapYearIndicator : 2bit
VN - VersionNumber : 3bit
Mode : 3 bit
Stratum : 8bit
Poll - PollInterval : 8 bit
Percision : 8bit
Root delay : 32bit
Root Dispersion : 32bit
Reference Identifier : 32bit


四个时间戳(TimeStamps) : 共32字节


Reference Timestamp : 64bit
Originate Timestamp : 64bit
Receive Timestamp : 64bit
Transmit Timestamp : 64bit

还可以附加Authenticator (optional) (96) 用于加密。


时间戳和校时算法:

struct TimeStamp {

    unsigned int integer;

    unsigned int fraction;

};

前32bits表示1900年以来的秒数。后32bits用以表示秒以下的部份,是微秒数的4294.967296(=2^32/10^6)倍(奇怪吧?)。


     Originate Timestamp       T1        客户端发送请求的时间 


     Receive Timestamp        T2        服务器接收请求的时间 


     Transmit Timestamp       T3        服务器答复时间 


     Destination Timestamp     T4        客户端接收答复的时间 


     计算客户端和服务器的单向网络延迟为dt:


   dt = [(T2 - T1) + (T4 - T3)] / 2;
标准时间为:t=t3+dt;


如果网络延时和服务器运行稳定,理论上可以精确到到2的-32次方秒。实际使用大约只有50ms(广域网)左右,在局域网可达1ms。精度和您选择什么样的一组服务器有关。


SNTP算是NTP的一个子集,它只考虑和一个Server对时,一般在客户端软件使用。




© time.org.cn