整理中。。。
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字节
还可以附加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对时,一般在客户端软件使用。