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