通过网络进行时间同步:NTP 协议

风行水上 @ 2010-07-10 23:14:07
标签:

    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秒。

    程序:用 PHP 访问NTP

    TODO

    一些NTP服务器列表

    • 210.72.145.44 (国家授时中心)
    • stdtime.gov.hk
    • t1.hshh.org
    • t2.hshh.org
    • t3.hshh.org

    参考资源

    标签:

      分享到:
      comments powered by Disqus

      44/47ms