文章目录- 时间为什么总是走“不准”?
- 自动校准网络时间
- 国际时间标准
- 计算机如何同步时间?
- 参考文献
在网上看到这个问题,这是个好问题。在分布式锁的学习过程中看到马丁博士指出计算机时钟不可信的观点的时候,我也曾疑虑过,我认同这个观点,但是我不知道为什么计算机时钟不可信。 今天有个大佬把这个问题解答了,我学习总结一下。
时间为什么总是走“不准”?
小时候,家里的墙上总是挂着一个大时钟。每过一段时间,我就要去手动调整一下,因为它不准了。那时候小,以为是指针向上走的时候比较难,向下走的时候有惯性,所以走着走着就有了偏差。
后来有电脑了,但是由于经常的高三,电脑就一直处于关机状态。当高考完想打开电脑打游戏的时候,发现它的时钟也不准了。当时觉得是因为长时间断电导致的。
后来我明白,钟表和计算机内部都有一个叫做「晶体振荡器」的东西,给它加上电压,它就会以固定的频率振动。但这个振动频率的「稳定性」,取决于它的制造工艺,以及外界环境的影响。虽然它们的误差很小,但日积月累下来,误差就越来越明显。
原来墙上的钟表不准是时间的杰作呀,原来那个电脑时钟不准真的是因为断电呀。。
自动校准网络时间
现在的计算机都有自动校准网络时间的功能了,但是问题来了,这个网络时间?哪儿来的?可靠?可控?
为什么我电脑上的网络时间和你电脑上的网络时间会是一致的呢?
首先我们排除一下我们的电脑通过网络互通有无的可能性哈,网络都是有延迟的。
其实最早接触计算机时间的时候,我是这样想的:国际上有某个管理计算机时钟的组织,我们的每台电脑向该组织校准我们的时间,再通过一定的技术消除这个网络延迟。
看到我这句话学物理的朋友估计要冲出来揍我了:误差只能减少,不可能消除。
虽然我物理不咋地,但是这句话我还是有深刻印象的。
所以,我电脑上的时间,跟你电脑上的时间,肯定是不一样的,只不过这个差距可以通过技术手段使得它小的可怜。
我看的那篇回答中还介绍了时间是怎么来的,以及人类对时间认知的发展。这里我就不多说了,文末附上原文,感兴趣的朋友或者觉得我说的理论不通的朋友可自行查看。
国际时间标准
现在,科学家制定出了两套时间标准: 1、世界时:基于天文现象 钟表计时,永远与地球自转时间相匹配。(如果对天文学有感兴趣的朋友会知道,地球的自转是越来越慢的,每年都要少那么几分钟。) 2、国际原子时:基于原子钟计时,每一秒的周期完全等长且固定(以铯原子跃迁 9192631770 个周期,所持续的时间长度定义为 1 秒!) 这个铯原子非常之稳定,计时上亿年误差不会超过一秒。
为了协调二者,出现了闰秒的概念。(这里主要是要说一声儿:虽然一个慢,一个稳,但是会通过人为手段使二者基本一致。我们的计算机使用的自然是原子时间了。)
同时,为了进一步降低原子钟的测量误差,每个国家会在每个月,统一上报自己计算的协调世界时到一个权威机构,然后这个权威机构会根据各国实验室的精度,进行加权计算,算出「最终」的协调世界时。
之后,再把这个最终的时间下发到各个国家,让各个国家进行对表校准,保证全世界的时间误差在 100 纳秒以内。
之后,中国会在自己算出的协调世界时的基础上,再加 8 个小时(中国在东八区),最终得出来的时间,就是「北京时间」!
计算机如何同步时间?
通常来说,无线电波的传播速度更快、传播误差小,所以授时中心会通过这种方式,把时间发送给全国各地的「时间服务器」。
时间服务器有了准确的时间后,再通过其它方式(例如网络)广播到下一层的终端用户使用。
现在知道我们的网络时间是这么来的了,就又回到开头的问题了:消除误差(啊呸,减少误差)。
数据在网络传输过程中,也是需要时间的,这个时间也会影响到时间的准确性。
于是人们想了一种方案,当计算机在做时间校准时,也需要把网络延迟计算进去,最后「修正」这个同步过来的时间,降低误差。
具体怎么做呢?空话谁都会说。
现在,已经有个软件已经把这一切都做好了。我们部署应用程序的服务器上,都会启动一个「自动校准」时间的服务,这个服务就是 NTP(Network Time Protocol),它可以保证每台机器的时间与时间服务器保持同步。
简单来讲,它是通过在网络报文上打「时间戳」的方式,然后配合计算网络延迟,从而修正本机的时间。
代码语言:javascript复制网络延时 = (t4 - t1) - (t3 - t2)
时间差 = t2 - t1 - 网络延时 / 2 = ((t2 - t1) (t3 - t4)) / 2
这个计算过程假设网络来回路径是对称的,并且时延相同。
这样一来,客户端就可以「校准」自己的本机时间了,与服务端保持同步,这个时间误差在广域网下是 10ms - 500ms,在局域网下通常可以小于 1ms。
同步时间时,对正在运行的程序有没有影响? 可大可小,万一出现“时间倒流”的情况,对某些使用时间戳的系统的影响就,嗯。对于无所谓时间的系统那另当别论。
我想这里需要解释一下为什么会出现“时光倒流”的情况: 我们的计算机是每隔一段时间向时间服务器请求时间的,不可能说时时刻刻都在校准哈,校准之后还是要依靠自身电磁振荡来维系的。所以在后面校准的时候可能会出现偏差。
NTP 在校准时间时,提供了 2 种方式: 1、ntpdate:一切以服务端时间为准,「强制修改」本机时间 2、ntpd:采用「润物细无声」的方式修改本机时间,把时间差均摊到每次小的调整上
也就是说,ntpd 当接收到需要「回拨」的时间时,会让本机时间走得「慢」一点,小步调整,逐渐与服务端的时钟「对齐」,这样一来,本机时间依旧是递增的,避免发生「倒流」。
当我们在配置 ntp 服务时,需要格外注意这种情况。另外,在编写程序时,也要注意调用的时间 API 获取的是哪个时间,避免业务逻辑发生异常。
参考文献
计算机时钟是如何运行的?时针硬件、时针软件、NTP与计算机时钟都有什么联系?怎样才能清楚的描述出来? 【转】How to do distributed locking 分布式领域专家 Martin Kleppmann