浅谈时钟、NTP 服务和其他

准确的时间,对于今天的人类来讲,无疑是重要的。自打工业革命以来,我们就习惯了在严格的时刻表下生活、学习、工作,将自己安排到每一分钟。但你是否知道,互联网上需要多么精确的时钟,而意义又何在?

滴答声里的互联网

时间在各个领域的精度要求千差万别。对于太空中快速飞行的 GPS 卫星而言,对时间精度的要求高到需要用相对论效应消除微秒级别的误差;而对于动辄以地质年代记岁的地理学,几万年的误差也微不足道。到了人们日常生活中接触的计算机与网络,对时间精度的要求通常位居其间:毫秒级到秒级。注:本文讨论的是软件级别的时钟要求,硬件级别的往往高出多个数量级。

时钟在计算机系统中应用广泛,尤其是在各类互联网系统中,对时间的一致性具有更高的要求。在众多应用场景中,我们最熟悉的可能就是短信验证码了:假设服务 A 发送了一条只在 3 分钟内有效的验证码,而校验验证码的服务 B 却比 A 的时钟晚了不止 3 分钟,那么验证码永远都无法验证成功。

当然,这只是一般用户最常见的应用,而非最常用的,更不是精度要求最高的。对自己账户安全比较在意的同学,应该知道动态令牌这种保护机制:网站提供一个密钥,手机上对应的 app 录入密钥之后,每隔可能 30 秒生成一个验证码;用户每次登录的时候,除密码之外,还必须使用最新的验证码才能登录。如果手机或者服务器的时间相差超过了30秒,那么这种认证也就无法成功了。

某动态令牌 app 的界面,在登录相应账号时,

只有输入当前显示的验证码方可登录

右下角为过期倒计时

在普通用户看不见的地方,是对时间精度更加频繁、更加精确的要求,尤其是在分布式系统之中。

在 Windows 域环境中(常用于各种企业、机关内网环境),提供用户会话认证的 Kerberos 服务签发的票据(ticket)需要多方有一致的时间。

在分布式数据库中,不一致的时间会影响数据的增量更新、UUID(通用唯一识别码)的生成。

对 SSL 证书有效性的验证,依赖准确的时间。

数字货币的安全性需要由同步的时钟保证。

一般来讲,时间的准确性对计费、日志记录、安全审计、文件完整性都十分重要,在日益增长的分布式计算领域尤为突出。

NTP,古老而长青的协议

一致的时间如此重要,可偏偏又不是一劳永逸的:就算一开始将一台设备对时准确,随着时间的流逝,它依然会因为时钟漂移(clock drift)而产生误差。这在老旧设备与低端设备中更为严重,但即使是最新的设备,日积月累也无法逃脱时钟漂移的魔咒。这就要求有这么一种机制,能够频繁地将设备与可靠的时间源(原子钟、GPS 时钟等)同步。

时间同步的方案不少,根据不同的需求与应用也有不同的最佳方案,但对于电脑、手机等设备而言,最常用的非 NTP 莫属。

NTP 介绍

NTP(Network Time Protocol,网络时间协议)自 1985 年投入使用以来,可谓是互联网上仍在使用的最古老的协议之一。它提供了一种在延迟可变的网络中进行时间同步的方法,采用 UDP 协议实现。在广域网上,NTP 往往可以达到数十毫秒的精度;在局域网内,同步的精度甚至可达到一毫秒以内。各大操作系统均内置对 NTP 的支持。

NTP 的层次结构

NTP 的层次结构

为分担负载,NTP 采用了一种与 DNS 相仿的层次结构,层层同步。每一台 NTP 服务器都有其所属的层次(stratum)。处于最顶层的 0,通常是原子钟、GPS 时钟等被认为绝对可靠的时钟源。连接 0 层设备的主机,作为服务器时,则处在 1 层;从 1 层服务器同步的主机,作为服务器时,则处在 2 层,以此类推。一般认为层数越高的服务器精度越差。

在互联网上提供服务的 NTP 服务器,通常位于 stratum 2 及以上,但对于个人用户而言,基本已经足够了。

NTP 的安全问题

古老的协议往往伴随着漏洞,NTP 在过去的几十年里虽然已被被多次修正,但依然有漏洞出现。例如可以被中间人攻击,骇客可以使用冒充的服务器将客户端设置为错误的时间,从而进行其他攻击;因为使用的 UDP 协议,源地址可被伪造,骇客可以进行与 DNS 放大攻击类似的 NTP 放大攻击;同时还有一些具体软件实现上的漏洞。所幸这些漏洞都有对应的方法消除或缓解。

NTP 池的现状

NTP 服务是互联网时代的刚需,却常常遭到人们的忽视。在互联网上提供 1 层的 NTP 服务,需要购置原子钟、GPS 接收器等设备;而提供任何层级的 NTP 服务,几乎都需要持久而可靠的服务器与互联网连接。1 层的 NTP 往往由政府、大学、研究所等提供,而其余层次则由各种组织,包括志愿者提供。

不过值得一提的是,在这个池中,NTP 服务器的分布十分不均。欧洲的 NTP 服务器数量接近 3000 个,而亚洲仅有 200 余个,中国大陆境内更是只有区区 20~40 个。这一项目的发起者去年年初在讨论区里说到,“中国区目前每秒约有 100,000 个请求”,并号召在中国增加更多的服务器。目前,在国内请求此 NTP 池时,很多时候都会解析到境外的 NTP 服务器上。

不知道你是否有可用性高、带固定 IP 的服务器,并且愿意做出一份贡献呢?(x

我们是电子科技大学百度校园菁英俱乐部。

如果你有兴趣与我们一起学习、分享知识,或与我们一起出去见见外面的世界,欢迎加入我们!

请实时关注我们的动态,同时也可以在公众号内留言。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180826G1EUF500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券