网络时间的那些事及 ntpq 详解
Gentoo（也许其他发行版也是？）中 &quot;ntpq -p&quot; 的 man page 只有简短的描述：打印出该服务器已知的节点列表和它们的状态概要信息。 我还没见到关于这个命令的说明文档，因此这里对此作一个总结，可以补充进 &quot;man ntpq&quot; man page 中。更多的细节见这里 ntpq  标准 NTP 请求程序（原作者），和 其他关于 man ntpq 的例子. NTP 是一个设计用于通过 udp 网络 (WAN 或者 LAN) 来同步计算机时钟的协议。引用 Wikipedia  NTP：  网络时间协议（英语：Network Time Protocol，NTP）一种协议和软件实现，用于通过使用有网络延迟的报文交换网络同步计
ntp ntpq 网络时间协议 闰秒
Gentoo（也许其他发行版也是？）中 &quot;ntpq -p&quot; 的 man page 只有简短的描述：打印出该服务器已知的节点列表和它们的状态概要信息。 我还没见到关于这个命令的说明文档，因此这里对此作一个总结，可以补充进 &quot;man ntpq&quot; man page 中。更多的细节见这里 ntpq  标准 NTP 请求程序（原作者），和 其他关于 man ntpq 的例子. NTP 是一个设计用于通过 udp 网络 (WAN 或者 LAN) 来同步计算机时钟的协议。引用 Wikipedia  NTP：  网络时间协议（英语：Network Time Protocol，NTP）一种协议和软件实现，用于通过使用有网络延迟的报文交换网络同步计
[Gentoo](http://www.gentoo.org/)（也许其他发行版也是？）中 ["ntpq -p" 的 man page](http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-brief-version/853) 只有简短的描述：“*打印出该服务器已知的节点列表和它们的状态概要信息。*”


我还没见到关于这个命令的说明文档，因此这里对此作一个总结，可以补充进 "[man ntpq](http://www.thelinuxblog.com/linux-man-pages/1/ntpq)" man page 中。更多的细节见这里 “[ntpq – 标准 NTP 请求程序](http://www.eecis.udel.edu/%7Emills/ntp/html/ntpq.html)”（原作者），和 [其他关于 man ntpq 的例子](http://linux.die.net/man/8/ntpq).


[NTP](http://www.ntp.org/) 是一个设计用于通过 [udp](http://en.wikipedia.org/wiki/User_Datagram_Protocol) 网络 ([WAN](http://en.wikipedia.org/wiki/Wide_area_network) 或者 [LAN](http://en.wikipedia.org/wiki/Local_area_network)) 来同步计算机时钟的协议。引用 [Wikipedia – NTP](http://en.wikipedia.org/wiki/Network_Time_Protocol)：



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


想了解更多有关时间和 NTP 协议的知识，可以参考 “[The NTP FAQ, Time, what Time?](http://www.ntp.org/ntpfaq/NTP-s-time.htm)”和 [RFCs for NTP](http://www.ntp.org/rfc.html)。早期的“Network Time Protocol (Version 3) RFC” ([txt](http://www.ietf.org/rfc/rfc1305.txt), or [pdf](http://www.rfc-editor.org/rfc/rfc1305.pdf), Appendix E, The NTP Timescale and its Chronometry, p70) 包含了对过去 5000 年我们的计时系统的变化和关系的有趣解释。维基百科的文章 [Time](http://en.wikipedia.org/wiki/Time) 和 [Calendar](http://en.wikipedia.org/wiki/Calendar) 提供了更宏观的视角。


![](/data/attachment/album/201501/14/140915fngkkks1xxnwlg7s.jpg)


命令 "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](http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_strata)（级别，NTP 时间同步是分层的）
* **t** – 类型 (u: [unicast（单播）](http://en.wikipedia.org/wiki/Unicast) 或 [manycast（选播）](http://www.eecis.udel.edu/%7Emills/ntp/html/manyopt.html#mcst) 客户端, b: [broadcast（广播）](http://en.wikipedia.org/wiki/Broadcasting_%28computing%29) 或 [multicast（多播）](http://en.wikipedia.org/wiki/Multicast) 客户端, l: 本地时钟, s: 对称节点（用于备份）, A: 选播服务器, B: 广播服务器, M: 多播服务器, 参见“[Automatic Server Discovery](http://www.eecis.udel.edu/%7Emills/ntp/html/manyopt.html)“)
* **when** – 最后一次同步到现在的时间 (默认单位为秒, “h”表示小时，“d”表示天)
* **poll** – 同步的频率：[rfc5905](http://www.ietf.org/rfc/rfc5905.txt)建议在 NTPv4 中这个值的范围在 4 (16秒) 至 17 (36小时) 之间（即2的指数次秒），然而观察发现这个值的实际大小在一个小的多的范围内 ：64 (2<sup> 6</sup> )秒 至 1024 (2<sup> 10</sup> )秒
* **reach** – 一个8位的左移移位寄存器值，用来测试能否和服务器连接，每成功连接一次它的值就会增加，以 [8 进制](http://en.wikipedia.org/wiki/Octal#In_computers)显示
* **delay** – 从本地到远程节点或服务器通信的往返时间（毫秒）
* **offset** – 主机与远程节点或服务器时间源的时间偏移量，offset 越接近于0，主机和 NTP 服务器的时间越接近(以[方均根](http://en.wikipedia.org/wiki/Root_mean_square)表示，单位为毫秒)
* **jitter** – 与远程节点同步的时间源的平均偏差（多个时间样本中的 offset 的偏差，单位是毫秒），这个数值的绝对值越小，主机的时间就越精确


#### 字段的统计代码


表中第一个字符（统计代码）是状态标识（参见 [Peer Status Word](http://www.eecis.udel.edu/%7Emills/ntp/html/decode.html#peer)），包含 " "，"x"，"-"，"#"，"+"，"\*"，"o"：


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


参考 [Clock Select Algorithm](http://www.eecis.udel.edu/%7Emills/ntp/html/select.html).


#### refid


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


* 一个IP地址 – 远程节点或服务器的 [IP 地址](http://en.wikipedia.org/wiki/Ip_address)
* **.LOCL.** – 本机 (当没有远程节点或服务器可用时）
* **.PPS.** – 时间标准中的“[Pulse Per Second](http://en.wikipedia.org/wiki/Pulse_per_second)”（秒脉冲）
* **.IRIG.** – [Inter-Range Instrumentation Group](http://en.wikipedia.org/wiki/Inter-Range_Instrumentation_Group) 时间码
* **.ACTS.** – 美国 [NIST 标准时间](http://en.wikipedia.org/wiki/Standard_time_and_frequency_signal_service) 电话调制器
* **.NIST.** –美国 NIST 标准时间电话调制器
* **.PTB.** – 德国 [PTB](http://www.ptb.de/index_en.html) 时间标准电话调制器
* **.USNO.** – 美国 [USNO 标准时间](http://en.wikipedia.org/wiki/United_States_Naval_Observatory#Time_service) 电话调制器
* **.CHU.** – [CHU](http://en.wikipedia.org/wiki/CHU_%28radio_station%29) ([HF](http://en.wikipedia.org/wiki/High_frequency), Ottawa, ON, Canada) 标准时间无线电接收器
* **.DCFa.** – [DCF77](http://en.wikipedia.org/wiki/DCF77) ([LF](http://en.wikipedia.org/wiki/Low_frequency), Mainflingen, Germany) 标准时间无线电接收器
* **.HBG.** – [HBG](http://en.wikipedia.org/wiki/HBG_%28time_signal%29) (LF Prangins, Switzerland) 标准时间无线电接收器
* **.JJY.** – [JJY](http://en.wikipedia.org/wiki/JJY#Time_standards) (LF Fukushima, Japan) 标准时间无线电接收器
* **.LORC.** – [LORAN](http://en.wikipedia.org/wiki/LORAN#Timing_and_synchronization)-C station ([MF](http://en.wikipedia.org/wiki/Medium_frequency)) 标准时间无线电接收器，注： [不再可用](http://en.wikipedia.org/wiki/LORAN#The_future_of_LORAN) (被 [eLORAN](http://en.wikipedia.org/wiki/LORAN#eLORAN) 废弃)
* **.MSF.** – [MSF](http://en.wikipedia.org/wiki/Time_from_NPL#The_.27MSF_signal.27_and_the_.27Rugby_clock.27) (LF, Anthorn, Great Britain) 标准时间无线电接收器
* **.TDF.** – [TDF](http://en.wikipedia.org/wiki/T%C3%A9l%C3%A9_Distribution_Fran%C3%A7aise) (MF, Allouis, France)标准时间无线电接收器
* **.WWV.** – [WWV](http://en.wikipedia.org/wiki/WWV_%28radio_station%29#Time_signals) (HF, Ft. Collins, CO, America) 标准时间无线电接收器
* **.WWVB.** – [WWVB](http://en.wikipedia.org/wiki/WWVB) (LF, Ft. Collins, CO, America) 标准时间无线电接收器
* **.WWVH.** – [WWVH](http://en.wikipedia.org/wiki/WWVH) (HF, Kauai, HI, America) 标准时间无线电接收器
* **.GOES.** – 美国[静止环境观测卫星](http://en.wikipedia.org/wiki/GOES#Further_reading);
* **.GPS.** – 美国 [GPS](http://en.wikipedia.org/wiki/Gps#Timekeeping);
* **.GAL.** – [伽利略定位系统](http://en.wikipedia.org/wiki/Galileo_%28satellite_navigation%29#The_concept)欧洲 [GNSS](http://en.wikipedia.org/wiki/Gnss);
* **.ACST.** – 选播服务器
* **.AUTH.** – 认证错误
* **.AUTO.** – Autokey （NTP 的一种认证机制）顺序错误
* **.BCST.** – 广播服务器
* **.CRYPT.** – Autokey 协议错误
* **.DENY.** – 服务器拒绝访问;
* **.INIT.** – 关联初始化
* **.MCST.** – 多播服务器
* **.RATE.** – (轮询) 速率超出限定
* **.TIME.** – 关联超时
* **.STEP.** – 间隔时长改变，偏移量比危险阈值小(1000ms) 比间隔时间 (125ms)大


#### 操作要点


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


[初次启动](http://www.eecis.udel.edu/%7Emills/ntp/html/debug.html)时：



> 
> 除非使用 iburst 选项，客户端通常需要花几分钟来和服务器同步。如果客户端在启动时时间与 NTP 服务器的时间差大于 1000 秒，守护进程会退出并在系统日志中记录，让操作者手动设置时间差小于 1000 秒后再重新启动。如果时间差小于 1000 秒，但是大于 128 秒，会自动矫正间隔，并自动重启守护进程。
> 
> 
> 当第一次启动时，时间频率文件（通常是 ntp.drift 文件，记录时间偏移）不存在，守护进程进入一个特殊模式来矫正频率。当时钟不符合[规范](http://www.ntp.org/ntpfaq/NTP-s-algo-kernel.htm)时这会需要 900 秒。当校正完成后，守护进程创建时间频率文件进入普通模式，并分步校正剩余的偏差。
> 
> 
> 


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


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


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


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


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


#### 操作要点（续）


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


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


#### [闰秒发生时会怎样](http://www.ntp.org/ntpfaq/NTP-s-time.htm#Q-TIME-LEAP-SECOND)



> 
> 闰秒发生时，会对当天时间增加或减少一秒。闰秒的调整在 UTC 时间当天的最后一秒。如果增加一秒，UTC 时间会出现 23:59:60。即 23:59:59 到 0:00:00 之间实际上需要 2 秒钟。如果减少一秒，时间会从 23:59:58 跳至 0:00:00 。另见 [The Kernel Discipline](http://www.ntp.org/ntpfaq/NTP-s-algo-kernel.htm).
> 
> 
> 


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


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


谢谢 Martin


### 附录


* [NTP 的纪元](http://www.ntp.org/ntpfaq/NTP-s-algo.htm#AEN1895) 从 1900 开始而 UNIX 的从 1970开始.
* [时间校正](http://www.ntp.org/ntpfaq/NTP-s-algo.htm#Q-ACCURATE-CLOCK) 是逐渐进行的，因此时间的完全同步可能会画上几个小时。
* [节点状态](http://www.ntp.org/ntpfaq/NTP-s-trouble.htm#Q-TRB-MON-STATFIL) 可以被记录到 [summarise/plot time offsets and errors](http://www.ntp.org/ntpfaq/NTP-s-trouble.htm#AEN5086)
* [RMS](http://en.wikipedia.org/wiki/Root_mean_square) – 均方根
* [PLL](http://en.wikipedia.org/wiki/PLL) – 锁相环路
* [FLL](http://en.wikipedia.org/wiki/Frequency-locked_loop) – 锁频回路
* [PPM](http://en.wikipedia.org/wiki/Parts_per_million) – 百万分之一，用于描述频率的变化
* [man ntpq (Gentoo 简明版本)](http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-brief-version/853)
* [man ntpq (长期维护版本)](http://nlug.ml1.co.uk/2012/01/man-ntpq-long-version/855)
* [man ntpq (Gentoo 长期维护版本)](http://nlug.ml1.co.uk/2012/01/man-ntpq-gentoo-long-version/856)


### 另见


* [ntpq – 标准 NTP 查询程序](http://www.eecis.udel.edu/%7Emills/ntp/html/ntpq.html)
* [The Network Time Protocol (NTP) 分布](http://www.eecis.udel.edu/%7Emills/ntp/html/index.html)
* NTP 的简明[历史](http://www.ntp.org/ntpfaq/NTP-s-def-hist.htm)
* 一个更多细节的简明历史 “Mills, D.L., A brief history of NTP time: confessions of an Internet timekeeper. Submitted for publication; please do not cite or redistribute” ([pdf](http://www.eecis.udel.edu/%7Emills/database/papers/history.pdf))
* [NTP RFC](http://www.ntp.org/rfc.html) 标准文档
* Network Time Protocol (Version 3) RFC – [txt](http://www.ietf.org/rfc/rfc1305.txt), or [pdf](http://www.rfc-editor.org/rfc/rfc1305.pdf). Appendix E, The NTP Timescale and its Chronometry, p70, 包含了对过去 5000 年我们的计时系统的变化和关系的有趣解释。
* 维基百科: [Time](http://en.wikipedia.org/wiki/Time) 和 [Calendar](http://en.wikipedia.org/wiki/Calendar)
* [John Harrison and the Longitude problem](http://www.rmg.co.uk/harrison)
* [Clock of the Long Now](http://longnow.org/clock/) – The 10,000 Year Clock
* John C Taylor – [Chronophage](http://johnctaylor.com/)
* [Orders of magnitude of time](http://en.wikipedia.org/wiki/Orders_of_magnitude_%28time%29)
* [Greenwich Time Signal](http://en.wikipedia.org/wiki/Greenwich_Time_Signal)


### 其他


SNTP （Simple Network Time Protocol, [RFC 4330](http://tools.ietf.org/html/rfc4330)，简单网络协议）基本上也是NTP，但是少了一些基于 [RFC 1305](http://tools.ietf.org/html/rfc1305) 实现的 NTP 的一些不再需要的内部算法。


Win32 时间 [Windows Time Service](http://en.wikipedia.org/wiki/Network_Time_Protocol#Microsoft_Windows) 是 SNTP 的非标准实现，没有精度的保证，并假设精度几乎有 1-2 秒的范围。（因为没有系统时间变化校正）


还有一个[PTP (IEEE 1588)](http://www.nist.gov/el/isd/ieee/ieee1588.cfm) Precision Time Protocol（精准时间协议）。见维基百科：[Precision Time Protocol](http://en.wikipedia.org/wiki/IEEE_1588)。软件程序为 [PTPd](http://ptpd.sourceforge.net/)。虫咬的功能是这是一个 [LAN](http://en.wikipedia.org/wiki/Local_area_network) 高精度主从同步系统，精度在毫秒级，使用 [International Atomic Time](http://en.wikipedia.org/wiki/International_Atomic_Time) (TAI， [monotonic](http://en.wikipedia.org/wiki/Monotonic_function)，无闰秒)。数据报时间戳需要在网卡中启用。支持 PTP 的网络会对数据报记录时间戳以减少交换机路由器的影响。也可以在不记录时间戳的网络中使用 PTP 但可能应为时间偏差太大而无法同步。因此使用这个需要对网络进行设置。


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


* DTSS – DEC公司的数字时间同步服务， 被 NTP 所取代。例子： [DTSS VMS C code c2000](http://antinode.info/ftp/dtss_ntp/)。 （哪里有关于 DTSS 的文章或文档吗？）
* [DAYTIME protocol](http://en.wikipedia.org/wiki/DAYTIME)，使用 [TCP](http://en.wikipedia.org/wiki/Transmission_Control_Protocol) 或 [UDP](http://en.wikipedia.org/wiki/User_Datagram_Protocol) 13 端口同步
* [ICMP Timestamp](http://en.wikipedia.org/wiki/ICMP_Timestamp) 和 [ICMP Timestamp Reply](http://en.wikipedia.org/wiki/ICMP_Timestamp_Reply)，使用 [ICMP](http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol) 协议同步
* [Time Protocol](http://en.wikipedia.org/wiki/Time_Protocol)，使用 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/) 荣誉推出

