网络时间的那些事情及 ntpq 详解
================================================================================
[Gentoo][1]（也许其他发行版也是？）中 ["ntpq -p" 的 man page][2] 只有简短的描述：“*打印出该服务器已知的节点列表和它们的状态概要信息。*”

我还没见到关于这个命令的说明文档，因此这里对此作一个总结，可以补充进 "[man ntpq][3]" man page 中。更多的细节见这里 “[ntpq – 标准 NTP 请求程序][4]”（原作者），和 [其他关于 man ntpq 的例子][5].

[NTP][6] 是一个设计用于通过 [udp][9] 网络 ([WAN][7] 或者 [LAN][8]) 来同步计算机时钟的协议。引用 [Wikipedia – NTP][10]：

> 网络时间协议（英语：Network Time Protocol，NTP）一种协议和软件实现，用于通过使用有网络延迟的报文交换网络同步计算机系统间的时钟。最初由美国特拉华大学的 David L. Mills 设计，现在仍然由他和志愿者小组维护，它于 1985 年之前开始使用，是因特网中最老的协议之一。

想了解更多有关时间和 NTP 协议的知识，可以参考 “[The NTP FAQ, Time, what Time?][11]”和 [RFCs for NTP][12]。早期的“Network Time Protocol (Version 3) RFC” ([txt][13], or [pdf][14], Appendix E, The NTP Timescale and its Chronometry, p70) 包含了对过去 5000 年我们的计时系统的变化和关系的有趣解释。维基百科的文章 [Time][15] 和 [Calendar][16] 提供了更宏观的视角。

命令 "ntpq -q" 输出下面这样的一个表：

         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     LOCAL(0)        .LOCL.          10 l  96h   64    0    0.000    0.000   0.000
    *ns2.example.com 10.193.2.20      2 u  936 1024  377   31.234    3.353   3.096

### 更多细节 ###

#### 表头 ####


- **remote** – 用于同步的远程节点或服务器。“LOCAL”表示本机 （当没有远程服务器可用时会出现） 
- **refid** – 远程的服务器进行同步的更高一级服务器
- **st** – 远程节点或服务器的 [Stratum][17]（级别，NTP 时间同步是分层的）
- **t** – 类型 (u: [unicast（单播）][18] 或 [manycast（选播）][19] 客户端, b: [broadcast（广播）][20] 或 [multicast（多播）][21] 客户端, l: 本地时钟, s: 对称节点（用于备份）, A: 选播服务器, B: 广播服务器, M: 多播服务器, 参见“[Automatic Server Discovery][22]“)
- **when** – 最后一次同步到现在的时间 (默认单位为秒, “h”表示小时，“d”表示天)
- **poll** – 同步的频率：[rfc5905][23]建议在 NTPv4 中这个值的范围在 4 (16秒) 至 17 (36小时) 之间（即2的指数次秒），然而观察发现这个值的实际大小在一个小的多的范围内 ：64 (2^6 )秒 至 1024 (2^10 )秒
- **reach** – 一个8位的左移移位寄存器值，用来测试能否和服务器连接，每成功连接一次它的值就会增加，以 [8 进制][24]显示
- **delay** – 从本地到远程节点或服务器通信的往返时间（毫秒）
- **offset** – 主机与远程节点或服务器时间源的时间偏移量，offset 越接近于0，主机和 NTP 服务器的时间越接近(以[方均根][25]表示，单位为毫秒)
- **jitter** – 与远程节点同步的时间源的平均偏差（多个时间样本中的 offset 的偏差，单位是毫秒），这个数值的绝对值越小，主机的时间就越精确

#### 字段的统计代码 ####

表中第一个字符（统计代码）是状态标识（参见 [Peer Status Word][26]），包含 " "，"x"，"-"，"#"，"+"，"*"，"o"：

- " " – 无状态，表示:
	- 没有远程通信的主机
	- "LOCAL" 即本机
	- （未被使用的）高层级服务器
	- 远程主机使用的这台机器作为同步服务器
- “**x**” – 已不再使用
- “**-**” – 已不再使用
- “**#**” – 良好的远程节点或服务器但是未被使用 （不在按同步距离排序的前六个节点中，作为备用节点使用）
- “**+**” – 良好的且优先使用的远程节点或服务器（包含在组合算法中）
- “*” – 当前作为优先主同步对象的远程节点或服务器
- “**o**” – PPS 节点 (当优先节点是有效时)。实际的系统同步是源于秒脉冲信号（pulse-per-second，PPS），可能通过PPS 时钟驱动或者通过内核接口。

参考 [Clock Select Algorithm][27].

#### refid ####

**refid** 有下面这些状态值

- 一个IP地址 – 远程节点或服务器的 [IP 地址][28] 
- **.LOCL.** – 本机 (当没有远程节点或服务器可用时）
- **.PPS.** –  时间标准中的“[Pulse Per Second][29]”（秒脉冲）
- **.IRIG.** – [Inter-Range Instrumentation Group][30] 时间码
- **.ACTS.** – 美国 [NIST 标准时间][31] 电话调制器
- **.NIST.** –美国 NIST 标准时间电话调制器
- **.PTB.** – 德国 [PTB][32] 时间标准电话调制器
- **.USNO.** – 美国 [USNO 标准时间][33] 电话调制器
- **.CHU.** – [CHU][34] ([HF][35], Ottawa, ON, Canada) 标准时间无线电接收器
- **.DCFa.** – [DCF77][36] ([LF][37], Mainflingen, Germany) 标准时间无线电接收器
- **.HBG.** – [HBG][38] (LF Prangins, Switzerland) 标准时间无线电接收器
- **.JJY.** – [JJY][39] (LF Fukushima, Japan) 标准时间无线电接收器
- **.LORC.** – [LORAN][40]-C station ([MF][41]) 标准时间无线电接收器，注： [不再可用][42] (被 [eLORAN][43] 废弃)
- **.MSF.** – [MSF][44] (LF, Anthorn, Great Britain) 标准时间无线电接收器
- **.TDF.** – [TDF][45] (MF, Allouis, France)标准时间无线电接收器
- **.WWV.** – [WWV][46] (HF, Ft. Collins, CO, America) 标准时间无线电接收器
- **.WWVB.** – [WWVB][47] (LF, Ft. Collins, CO, America) 标准时间无线电接收器
- **.WWVH.** – [WWVH][48] (HF, Kauai, HI, America) 标准时间无线电接收器
- **.GOES.** – 美国[静止环境观测卫星][49];
- **.GPS.** – 美国 [GPS][50];
- **.GAL.** – [伽利略定位系统][51]欧洲 [GNSS][52];
- **.ACST.** – 选播服务器
- **.AUTH.** – 认证错误
- **.AUTO.** – Autokey （NTP 的一种认证机制）顺序错误
- **.BCST.** – 广播服务器
- **.CRYPT.** – Autokey 协议错误
- **.DENY.** – 服务器拒绝访问;
- **.INIT.** – 关联初始化
- **.MCST.** – 多播服务器
- **.RATE.** – (轮询) 速率超出限定
- **.TIME.** – 关联超时
- **.STEP.** – 间隔时长改变，偏移量比危险阈值小(1000ms) 比间隔时间 (125ms)大

#### 操作要点 ####

一个时间服务器只会报告时间信息而不会从客户端更新时间（单向更新），而一个节点可以更新其他同级节点的时间，结合出一个彼此同意的时间（双向更新）。

[初次启动][53]时：

> 除非使用 iburst 选项，客户端通常需要花几分钟来和服务器同步。如果客户端在启动时时间与 NTP 服务器的时间差大于 1000 秒，守护进程会退出并在系统日志中记录，让操作者手动设置时间差小于 1000 秒后再重新启动。如果时间差小于 1000 秒，但是大于 128 秒，会自动矫正间隔，并自动重启守护进程。

> 当第一次启动时，时间频率文件（通常是 ntp.drift 文件，记录时间偏移）不存在，守护进程进入一个特殊模式来矫正频率。当时钟不符合[规范][54]时这会需要 900 秒。当校正完成后，守护进程创建时间频率文件进入普通模式，并分步校正剩余的偏差。

NTP 0 层（Stratum 0 ）的设备如原子钟（铯，铷），GPS 时钟或者其他标准时间的无线电时钟为 1 层（Stratum 1）的时间服务器提供时间信号。NTP 只报告[UTC][55] 时间（统一协调时，Coordinated Universal Time）。客户端程序使用[时区][56]从 UTC 导出本地时间。

NTP 协议是高精度的，使用的精度小于纳秒（2的 -32 次方）。主机的时间精度和其他参数（受硬件和操作系统限制）使用命令 “ntpq -c rl” 查看（参见 [rfc1305][57] 通用变量和  [rfc5905][58]）。

#### “ntpq -c rl”输出参数 ####

- **precision** 为四舍五入值，且为 2 的幂数。因此精度为 2^precision （秒）
- **rootdelay** – 与同步网络中主同步服务器的总往返延时。注意这个值可以是正数或者负数，取决于时钟的精度。
- **rootdisp** – 相对于同步网络中主同步服务器的偏差(秒)
- **tc** – NTP 算法 [PLL][59] （phase locked loop，锁相环路） 或 [FLL][60] (frequency locked loop，锁频回路) 时间常量
- **mintc** – NTP 算法 PLL/FLL 最小时间常亮或“最快响应
- **offset** – 由结合算法得出的系统时钟偏移量（毫秒）
- **frequency** – 系统时钟频率
- **sys_jitter** – 由结合算法得出的系统时钟平均偏差（毫秒）
- **clk_jitter** – 硬件时钟平均偏差（毫秒）
- **clk_wander** – 硬件时钟偏移([PPM][61] – 百分之一)

Jitter (也叫 timing jitter) 表示短期变化大于10HZ 的频率， wander 表示长期变化大于10HZ 的频率 （Stability 表示系统的频率随时间的变化，和 aging, drift, trends 等是同义词）

#### 操作要点（续） ####

NTP 软件维护一系列连续更新的频率变化的校正值。对于设置正确的稳定系统，在非拥塞的网络中，现代硬件的 NTP 时钟同步通常与 UTC 标准时间相差在毫秒内。（在千兆 LAN 网络中可以达到何种精度？）

对于 UTC 时间，[闰秒 leap second ][62] 可以每两年插入一次用于同步地球自传的变化。注意本地时间为[夏令时][63]时时间会有一小时的变化。在重同步之前客户端设备会使用独立的 UTC 时间，除非客户端使用了偏移校准。

#### [闰秒发生时会怎样][64] ####

> 闰秒发生时，会对当天时间增加或减少一秒。闰秒的调整在 UTC 时间当天的最后一秒。如果增加一秒，UTC 时间会出现 23:59:60。即 23:59:59 到 0:00:00  之间实际上需要 2 秒钟。如果减少一秒，时间会从 23:59:58 跳至 0:00:00 。另见 [The Kernel Discipline][65].

那么… 间隔阈值（step threshold）的真实值是多少: 125ms 还是 128ms？ PLL/FLL tc 的单位是什么 (log2 s? ms?)？在非拥塞的千兆 LAN 中时间节点间的精度能达到多少？

感谢 Camilo M 和 Chris B的评论。 欢迎校正错误和更多细节的探讨。

谢谢
Martin

### 附录 ###

- [NTP 的纪元][66] 从 1900 开始而 UNIX 的从 1970开始.
- [时间校正][67] 是逐渐进行的，因此时间的完全同步可能会画上几个小时。 
- [节点状态][68] 可以被记录到 [summarise/plot time offsets and errors][69]
- [RMS][70] – 均方根
- [PLL][71] – 锁相环路
- [FLL][72] – 锁频回路 
- [PPM][73] – 百万分之一，用于描述频率的变化
- [man ntpq (Gentoo 简明版本)][74]
- [man ntpq (长期维护版本)][75]
- [man ntpq (Gentoo 长期维护版本)][76]

### 另见 ###

- [ntpq – 标准 NTP 查询程序][77]
- [The Network Time Protocol (NTP) 分布][78]
- NTP 的简明[历史][79] 
- 一个更多细节的简明历史 “Mills, D.L., A brief history of NTP time: confessions of an Internet timekeeper. Submitted for publication; please do not cite or redistribute” ([pdf][80])
- [NTP RFC][81] 标准文档
- Network Time Protocol (Version 3) RFC – [txt][82], or [pdf][83]. Appendix E, The NTP Timescale and its Chronometry, p70, 包含了对过去 5000 年我们的计时系统的变化和关系的有趣解释。
- 维基百科: [Time][84] 和 [Calendar][85]
- [John Harrison and the Longitude problem][86]
- [Clock of the Long Now][87] – The 10,000 Year Clock
- John C Taylor – [Chronophage][88]
- [Orders of magnitude of time][89]
- [Greenwich Time Signal][90]

### 其他 ###

SNTP （Simple Network Time Protocol, [RFC 4330][91]，简单网络协议）基本上也是NTP，但是少了一些基于 [RFC 1305][92] 实现的 NTP 的一些不再需要的内部算法。

Win32 时间 [Windows Time Service][93]  是 SNTP 的非标准实现，没有精度的保证，并假设精度几乎有 1-2 秒的范围。（因为没有系统时间变化校正）

还有一个[PTP (IEEE 1588)][95] Precision Time Protocol（精准时间协议）。见维基百科：[Precision Time Protocol][96]。软件程序为 [PTPd][97]。虫咬的功能是这是一个 [LAN][98] 高精度主从同步系统，精度在毫秒级，使用 [International Atomic Time][99] (TAI， [monotonic][100]，无闰秒)。数据报时间戳需要在网卡中启用。支持 PTP 的网络会对数据报记录时间戳以减少交换机路由器的影响。也可以在不记录时间戳的网络中使用 PTP 但可能应为时间偏差太大而无法同步。因此使用这个需要对网络进行设置。

### 更老的时间同步协议 ###

- DTSS – DEC公司的数字时间同步服务， 被 NTP 所取代。例子： [DTSS VMS C code c2000][101]。 （哪里有关于 DTSS 的文章或文档吗？）
- [DAYTIME protocol][102]，使用 [TCP][103] 或 [UDP][104]  13 端口同步
- [ICMP Timestamp][105] 和 [ICMP Timestamp Reply][106]，使用 [ICMP][107] 协议同步
- [Time Protocol][108]，使用 TCP 或 UDP 37 号端口同步

--------------------------------------------------------------------------------

via: http://nlug.ml1.co.uk/2012/01/ntpq-p-output/831

作者：Martin L
译者：[Liao](https://github.com/liaosishere)
校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出

[1]:http://www.gentoo.org/
[2]:http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-brief-version/853
[3]:http://www.thelinuxblog.com/linux-man-pages/1/ntpq
[4]:http://www.eecis.udel.edu/~mills/ntp/html/ntpq.html
[5]:http://linux.die.net/man/8/ntpq
[6]:http://www.ntp.org/
[7]:http://en.wikipedia.org/wiki/Wide_area_network
[8]:http://en.wikipedia.org/wiki/Local_area_network
[9]:http://en.wikipedia.org/wiki/User_Datagram_Protocol
[10]:http://en.wikipedia.org/wiki/Network_Time_Protocol
[11]:http://www.ntp.org/ntpfaq/NTP-s-time.htm
[12]:http://www.ntp.org/rfc.html
[13]:http://www.ietf.org/rfc/rfc1305.txt
[14]:http://www.rfc-editor.org/rfc/rfc1305.pdf
[15]:http://en.wikipedia.org/wiki/Time
[16]:http://en.wikipedia.org/wiki/Calendar
[17]:http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_strata
[18]:http://en.wikipedia.org/wiki/Unicast
[19]:http://www.eecis.udel.edu/~mills/ntp/html/manyopt.html#mcst
[20]:http://en.wikipedia.org/wiki/Broadcasting_%28computing%29
[21]:http://en.wikipedia.org/wiki/Multicast
[22]:http://www.eecis.udel.edu/~mills/ntp/html/manyopt.html
[23]:http://www.ietf.org/rfc/rfc5905.txt
[24]:http://en.wikipedia.org/wiki/Octal#In_computers
[25]:http://en.wikipedia.org/wiki/Root_mean_square
[26]:http://www.eecis.udel.edu/~mills/ntp/html/decode.html#peer
[27]:http://www.eecis.udel.edu/~mills/ntp/html/select.html
[28]:http://en.wikipedia.org/wiki/Ip_address
[29]:http://en.wikipedia.org/wiki/Pulse_per_second
[30]:http://en.wikipedia.org/wiki/Inter-Range_Instrumentation_Group
[31]:http://en.wikipedia.org/wiki/Standard_time_and_frequency_signal_service
[32]:http://www.ptb.de/index_en.html
[33]:http://en.wikipedia.org/wiki/United_States_Naval_Observatory#Time_service
[34]:http://en.wikipedia.org/wiki/CHU_%28radio_station%29
[35]:http://en.wikipedia.org/wiki/High_frequency
[36]:http://en.wikipedia.org/wiki/DCF77
[37]:http://en.wikipedia.org/wiki/Low_frequency
[38]:http://en.wikipedia.org/wiki/HBG_%28time_signal%29
[39]:http://en.wikipedia.org/wiki/JJY#Time_standards
[40]:http://en.wikipedia.org/wiki/LORAN#Timing_and_synchronization
[41]:http://en.wikipedia.org/wiki/Medium_frequency
[42]:http://en.wikipedia.org/wiki/LORAN#The_future_of_LORAN
[43]:http://en.wikipedia.org/wiki/LORAN#eLORAN
[44]:http://en.wikipedia.org/wiki/Time_from_NPL#The_.27MSF_signal.27_and_the_.27Rugby_clock.27
[45]:http://en.wikipedia.org/wiki/T%C3%A9l%C3%A9_Distribution_Fran%C3%A7aise
[46]:http://en.wikipedia.org/wiki/WWV_%28radio_station%29#Time_signals
[47]:http://en.wikipedia.org/wiki/WWVB
[48]:http://en.wikipedia.org/wiki/WWVH
[49]:http://en.wikipedia.org/wiki/GOES#Further_reading
[50]:http://en.wikipedia.org/wiki/Gps#Timekeeping
[51]:http://en.wikipedia.org/wiki/Galileo_%28satellite_navigation%29#The_concept
[52]:http://en.wikipedia.org/wiki/Gnss
[53]:http://www.eecis.udel.edu/~mills/ntp/html/debug.html
[54]:http://www.ntp.org/ntpfaq/NTP-s-algo-kernel.htm
[55]:http://en.wikipedia.org/wiki/Coordinated_Universal_Time
[56]:http://en.wikipedia.org/wiki/Time_zone
[57]:http://www.ietf.org/rfc/rfc1305.txt
[58]:http://www.ietf.org/rfc/rfc5905.txt
[59]:http://en.wikipedia.org/wiki/PLL
[60]:http://en.wikipedia.org/wiki/Frequency-locked_loop
[61]:http://en.wikipedia.org/wiki/Parts_per_million
[62]:http://en.wikipedia.org/wiki/Leap_second
[63]:http://en.wikipedia.org/wiki/Daylight_saving_time
[64]:http://www.ntp.org/ntpfaq/NTP-s-time.htm#Q-TIME-LEAP-SECOND
[65]:http://www.ntp.org/ntpfaq/NTP-s-algo-kernel.htm
[66]:http://www.ntp.org/ntpfaq/NTP-s-algo.htm#AEN1895
[67]:http://www.ntp.org/ntpfaq/NTP-s-algo.htm#Q-ACCURATE-CLOCK
[68]:http://www.ntp.org/ntpfaq/NTP-s-trouble.htm#Q-TRB-MON-STATFIL
[69]:http://www.ntp.org/ntpfaq/NTP-s-trouble.htm#AEN5086
[70]:http://en.wikipedia.org/wiki/Root_mean_square
[71]:http://en.wikipedia.org/wiki/PLL
[72]:http://en.wikipedia.org/wiki/Frequency-locked_loop
[73]:http://en.wikipedia.org/wiki/Parts_per_million
[74]:http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-brief-version/853
[75]:http://nlug.ml1.co.uk/2012/01/man-ntpq-long-version/855
[76]:http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-long-version/856
[77]:http://www.eecis.udel.edu/~mills/ntp/html/ntpq.html
[78]:http://www.eecis.udel.edu/~mills/ntp/html/index.html
[79]:http://www.ntp.org/ntpfaq/NTP-s-def-hist.htm
[80]:http://www.eecis.udel.edu/~mills/database/papers/history.pdf
[81]:http://www.ntp.org/rfc.html
[82]:http://www.ietf.org/rfc/rfc1305.txt
[83]:http://www.rfc-editor.org/rfc/rfc1305.pdf
[84]:http://en.wikipedia.org/wiki/Time
[85]:http://en.wikipedia.org/wiki/Calendar
[86]:http://www.rmg.co.uk/harrison
[87]:http://longnow.org/clock/
[88]:http://johnctaylor.com/
[89]:http://en.wikipedia.org/wiki/Orders_of_magnitude_%28time%29
[90]:http://en.wikipedia.org/wiki/Greenwich_Time_Signal
[91]:http://tools.ietf.org/html/rfc4330
[92]:http://tools.ietf.org/html/rfc1305
[93]:http://en.wikipedia.org/wiki/Network_Time_Protocol#Microsoft_Windows
[94]:http://en.wikipedia.org/wiki/Personal_computer
[95]:http://www.nist.gov/el/isd/ieee/ieee1588.cfm
[96]:http://en.wikipedia.org/wiki/IEEE_1588
[97]:http://ptpd.sourceforge.net/
[98]:http://en.wikipedia.org/wiki/Local_area_network
[99]:http://en.wikipedia.org/wiki/International_Atomic_Time
[100]:http://en.wikipedia.org/wiki/Monotonic_function
[101]:http://antinode.info/ftp/dtss_ntp/
[102]:http://en.wikipedia.org/wiki/DAYTIME
[103]:http://en.wikipedia.org/wiki/Transmission_Control_Protocol
[104]:http://en.wikipedia.org/wiki/User_Datagram_Protocol
[105]:http://en.wikipedia.org/wiki/ICMP_Timestamp
[106]:http://en.wikipedia.org/wiki/ICMP_Timestamp_Reply
[107]:http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol
[108]:http://en.wikipedia.org/wiki/Time_Protocol
