本系列文章主要介绍计算机系统中时钟的处理。 主要内容有NTP、Lamport逻辑时钟、矢量时钟、TrueTime等。 本文第一篇,介绍NTP协议。
电脑表
不知道你有没有注意到,如果时隔几天打开你的电脑,任务栏上的时间依然显示得很正确。 即使你的电脑没有联网,这怎么做?
post-quartz.png
计算机主板上有晶体振荡器和纽扣电池。 晶体振荡器的频率为32768Hz每秒。 通电中,水晶晶体每振动32768次,电路就会发出信息,表示1秒到了,记录时间。 但是石英晶体有误差,通常每天的定时误差为正负1秒。 而且极端的温度,例如负20度时误差会变大。
NTP协议体系结构
由于石英晶体误差很大,1985年特拉华大学的David L. Mills设计了网络时间协议(NTP ),以同步不同计算机系统之间的时钟。
NTP协议的目标是将所有计算机的时间同步到几毫秒的误差内。 实际上广域网可以达到几十毫秒的误差,局域网的误差可以在1毫秒以内。 NTP协议是一种主从体系结构协议,它使用称为Stratum的分层时钟源系统,分层上限为15,第16层表示异步设备。 典型的层次结构如下
post-stratum.png
第0层
参考(基准)时钟主要由铯、铷原子钟、GPS时钟、收音机时钟等高精度计时装置制作。 它们生成非常准确的脉冲信号,触发计算机上的中断和时间戳。
第1层
主时间服务器,连接到第0层设备并在几微秒的误差内同步系统时钟。 第1层服务器之间可以相互连接,进行一致性检查和备份。
第2层
这些计算机通过网络与第1层服务器同步。 各计算机可以访问多个第1层服务器,第2层计算机之间也可以相互连接。
第3层
这些计算机与第2层服务器同步。
NTP协议流程
NTP协议的时钟同步过程如下:
post-ntp-sequence.png
客户端a向服务器b发送包含发送时间戳T1的NTP消息
服务器b接收到NTP消息时,将接收时间T2写入该消息
服务器b将该NTP消息发送到客户端a,并且将发送时间T3写入该消息
客户端a接收到该NTP消息的时间为T4
根据上面的流程可以很容易地计算出来。
AB之间的网络往返时间RTT (运行时间) (=) T4-T1 )T3-T2 ) ) ) ) ) ) ) ) ) ) )。
AB之间的时间偏移:=(T2-T1 ) T3 - T4 )/2
导出处理:从a发送请求消息到接收响应的时间间隔为T4 - T1,其中T3 - T2为b的处理时间,因此网络往返时间
=(T4-T1 )-)- (T3 - T2 )。
设a和b的时间偏差为,则T3 - =T3 `。
T4和T3 `的间隔为一半的RTT:T4 - T3`=/2
将T3 `和代入上述等式,则得到=((t2-t1 ) ) T3 - T4 )/2。
NTP协议格式
NTP协议使用UDP协议传输,端口为123,消息格式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-------------请参阅
“池”页
-------------请参阅
|根目录|
-------------请参阅
根位置
-------------请参阅
参考id
-------------请参阅
| |
参考时间(64 )。
| |
-------------请参阅
+-+| |
+ Origin Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Receive Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Transmit Timestamp (64) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Optional (96) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
各个字段的含义如下:
LI Leap Indicator: 2比特,用来警告是否有闰秒或者未和上级同步。具体定义如下:
+-------+----------------------------------------+
| Value | Meaning |
+-------+----------------------------------------+
| 0 | no warning |
| 1 | last minute of the day has 61 seconds |
| 2 | last minute of the day has 59 seconds |
| 3 | unknown (clock unsynchronized) |
+-------+----------------------------------------+
VN Version Number: 3比特,协议版本,目前是4。
Mode: 3比特,工作模式,具体定义如下:
+-------+--------------------------+
| Value | Meaning |
+-------+--------------------------+
| 0 | reserved |
| 1 | symmetric active |
| 2 | symmetric passive |
| 3 | client |
| 4 | server |
| 5 | broadcast |
| 6 | NTP control message |
| 7 | reserved for private use |
+-------+--------------------------+
Stratum: 8比特,阶层,具体定义如下:
+--------+-----------------------------------------------------+
| Value | Meaning |
+--------+-----------------------------------------------------+
| 0 | unspecified or invalid |
| 1 | primary server (e.g., equipped with a GPS receiver) |
| 2-15 | secondary server (via NTP) |
| 16 | unsynchronized |
| 17-255 | reserved |
+--------+-----------------------------------------------------+
Poll: 8比特,轮询间隔时间,两个NTP报文之间的时间间隔,用2的幂表示。
Precision: 8比特,系统的时钟精度,用2的幂表示。
Root Delay: 32比特,本地到主时钟源的往返时间RTT。
Root Dispersion: 32比特。
Reference Identifier: 32比特,上层时钟源的标识。
Reference Timestamp: 64比特,本系统时钟最后一次被设置的时间。
Originate Timestamp: 64比特,NTP报文离开发送端时发送端本地时间,也即前面图中的T1。
Receive Timestamp: 64比特,NTP报文到达接收端时接收端端本地时间,也即前面图中的T2。
Transmit Timestamp: 64比特,NTP报文离开接收端时接收端本地时间,也即前面图中的T3。
NTP的误差
NTP协议在广域网可以达到几十毫秒的误差,局域网误差可以在1毫米内。误差最大的一个原因是发送请求和接收响应这两个阶段的网络时间可能是不一样的。前面我们推导时间偏移公式的时候,假设网络往返发送和接收阶段的时间是一样的,但是实际网络中,这两个阶段走的路由可能是不一样的,所花的时间也可能不一样,计算的时间偏移也不准确,这样就造成了广域网的误差可能达到几十毫秒甚至更高。局域网中因为网络比较稳定,经过的路由器也比较少,所以误差可以到1毫米内。
参考: