比如时钟同步技术。
现在几点几分按理说是一个很简单的问题,但是对计算机网络来说却是一个非常困难的问题。
计算机内部有一个东西叫RTC(Real-Time Clock,实时时钟芯片)。它是主板上一块独立的小芯片,有自己的纽扣电池,即使电脑关机它也在滴答作响。
RTC的原理是晶体震荡,芯片里有一块石英晶体,通电之后以固定频率震动,通常是32768Hz,为什么是这个数?因为32768 = 2¹⁵,方便用数字电路做分频。振动32768次计数器进一位,代表过了1秒。
但问题就在这,任何振荡器都不是完美的,它会受各种因素影响而产生频率偏差。
普通计算机的石英时钟每天可能偏1~2秒,听起来也不多。但一台服务器如果连续运行一年,时钟可能偏差几分钟。一个数据中心有很多台服务器,每台偏移的方向还不一样。
第二个影响时间同步的是网络延迟,假设你问一台服务器现在几点了,它回答了你。但这个回答在网络上传播需要时间, 更麻烦的是这个时间延迟每次是不一样的、不稳定的。
如果互联网上的设备之间时钟不能同步,那会带来多少问题应该不用多说。尤其涉及到互联网上的交易,这些操作分布在不同的服务器上,要靠时间戳判断先后顺序,搞错了就会引发大问题。
那怎么解决呢?
-
既然每台电脑自己的时钟会发生偏移,那就找一个公认准确的时间源,让所有电脑定期去对准一下。
这套机制叫NTP(Network Time Protocol,网络时间协议),1985年发明,沿用至今,我们的手机、电脑此刻都在使用。
NTP的顶端是原子钟,原子钟不依赖任何机械震荡,而是依靠原子的能级跃迁。
最常用的是铯-133原子。它的基态超精细跃迁频率是9192631770赫兹。
这个数字本身就是秒的定义。1967年国际计量大会定义铯-133原子超精细跃迁9192631770个周期所经历的时间为1秒。
铯原子钟的的精度极高,1亿年误差不超过1秒。
全球可能有几百台Stratum1服务器直连着原子钟,然后它们把获取到的时间传递给Stratum2服务,也就是各大公司运营商的NTP服务器,Stratum2再把时间传到我们的路由器、手机、电脑里面。
但原子钟只解决了晶体震荡带来的时间误差,依然无法解决网络延迟带来的时间误差。
NTP是怎么解决这个问题的呢?比较简单,测量往返时间,然后取一半作为单程延迟的估算, 相当于默认上行和下行的网络延迟相等,但实际上这两个延迟并不相等,所以通常会带来几毫秒的误差。
当然NTP也不是简单的往返时间取平均,NTP还会对同一台服务器连续多次采样,选择其中网络延迟最小的结果来使用,还会有多台服务器进行交叉验证,把明显异常的时间排除出去,这样结果就比较可信了。
通过上面这两步,也就是从原子钟来获时、并且校正了网络延迟之后,如果发现本地的时间不准确,又该怎么办呢?
比如发现本地时钟走快了200毫秒,能不能直接往回调200毫秒?通常不行。因为很多系统有一个基本预设,那就是时间只会向前走。
所以NTP的解决办法是让时钟走快一点或走慢一点,逐步调整。比如本地时钟慢了200毫秒,NTP就让它每秒多走0.5毫秒,400秒后就追平了。
NTP能达到的时间精度在互联网上通常是几毫秒,在局域网内优化后甚至可以达到亚毫秒级。
-
但是在某些场景下,这样的时间精度依然不够。
比如电网调度,不同发电站的交流电必须精确同步相位,误差超标就会导致电流倒灌,再比如一些金融交易也要求微秒级的误差。
还有5G技术对基站之间的时间和相位同步也有很高的要求,否则可能带来信道干扰,有些要求需要达到1.5微秒的精度。
这个时候就不能只依靠NTP了,而需要PTP(Precision Time Protocol,精确时间协议),精度可以达到纳秒级。
1秒=1,000毫秒=1,000,000微秒=1,000,000,000纳秒。
NTP的误差来源主要在网络延迟上,一个数据包从发出到被处理,要经历很多环节:
网络延迟中的误差又有两个来源,第一个是时间戳的位置。
NTP通常是在应用程序层打时间戳,但是从应用程序准备发出到网卡真正发出之间,数据包在操作系统里还要排队等待调度,这段时间可能是几微秒,也可能是几毫秒,每次不同。这个不确定的等待时间被算进了网络延迟里面,就成了噪声。服务器越忙,这个噪声就越大。所以NTP在繁忙服务器上精度就会下降。
PTP的改进办法就是把时间戳移到硬件层。既然操作系统的调度延迟是误差来源,那就绕过操作系统,在硬件层打时间戳。
支持PTP的网卡,在数据包刚到达网卡的瞬间,由硬件电路立刻打上时间戳,不经过任何软件层。发送时也一样,在数据包真正离开网卡的瞬间,由硬件记录发送时间。
这样测出来的延迟就是数据包在网络上真正传输的时间,不包含任何操作系统调度的噪声。
但光解决了这个问题还不够,误差的大头还是这些信息在网络中上行和下行的时间,NTP是默认上下行时间一样,但实际并不一样。
那PTP怎么解决呢?直接把上下行的时间给统计出来。PTP有一个叫透明时钟的专用设备,支持PTP的交换机,会精确测量每个PTP数据包在自己内部停留多长,然后把这个驻留时间也写进数据包里。接收端收到数据包时,会把途中所有交换机的驻留时间加起来,从总延迟里扣掉,就可以还原出纯粹的传播延迟。
数据包在交换机内部的排队停留时间正是造成上下行不对称的主要原因。把这部分扣掉之后,剩下的基本就是数据包在网线上纯粹的物理传播时间,如果能让上下行的物理链路对称,那么这个时间差异也能消除。
PTP的精度在普通以太网上可以达到微秒级,配合支持硬件时间戳的网卡可以达到100纳秒级。如果在专用光纤链路上配合高精度的硬件可以达到1纳秒级。
在一个物理上分散、通信上有延迟的世界里,同时这个概念其实很难达成。但如果不能达成,我们的网络世界就无法正常运转。
NTP和PTP应运而生,从毫秒到纳秒跨越6个数量级的精度。我们每次刷新网页、打开导航、完成支付都在使用它们,只不过几乎无人知道。
)