NTP(Network Time Protocol) 用于通过网络进行时间同步。它通常可获得毫秒级的精度。
NTP采用UDP传输协议,使用端口123。
SNTP 是一个简化版本的NTP协议,是NTP的子集。
Windows 2000和XP操作系统,自身已经集成了自动对时功能。可以在时间设置中进行同步服务器的设置。
NTP协议中发送和接收的数据包类似,都是48个字节(也可以再多一些,但只需前48个字节就可以进行计算了)。数据包的内容如下:
struct NTP_Packet {
char li:2 ; // Leap Seconds
char vn:3 ; // NTP version
char mode:3 ; // Mode
char stratum;
char poll;
char precision;
short delay; // Root Delay
short delay_fb;
short disp; // Root Dispersion
short disp_fb;
char ident[4]; // Reference Identifier
int ref_time; // Reference Timestamp
int ref_time_fb; // 秒数的二进制小数部分
int org_time; // Originate Timestamp (T1)
int org_time_fb;
int recv_time; // Receive Timestamp (T2)
int recv_time_fb;
int trans_time; // Transmit Timestamp (T3)
int trans_time_fb;
}; // sizeof = 48 bytes
int NTP_ADJ = 2208988800; // seconds diff between 1970 and 1900
int crecv_time = time(); // Client Receive Timestamp (T4)
int roundtrip_delay = (T4-T1) - (T2-T3); // network delay
int clock_offset = ((T2-T1) + (T3-T4))/2;
int adjusted_time = time() + clock_offset;
NTP 协议中的时间是从1900年开始算起的。而一些程序语言本身(比如PHP)中的时间戳是从1970年算起的,因此在计算时需要做一下调整。不考虑润秒(Leap Seconds:每三年多一秒)的情况下,这个秒数差是 2208988800秒。
TODO