浅谈时钟、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 池。目前最大的 NTP 池为 www.pool.ntp.org,其中收录了人们自愿贡献的许多 NTP 服务器,目前接近 4000 个。只要将 NTP 服务器地址设定为其告示的域名,便会自动解析到最佳的 NTP 服务器上。

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

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


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

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注