跳到主要内容
  1. Blog/

什么是NTP?如何使用 ntp 校准系统时钟?| 电脑时间不准了怎么办?

··字数 3227·7 分钟
howto

电脑、手机等设备,都内置了时钟。即使,电脑或手机关机,这个时钟还会正常计时。当电脑或者手机设备重新启动,会读取这个时间。这样,就保持了设备上程序运行的日期、时间问题。由于可能的各种原因(比如设备内置的时钟的电量不足?电子时钟本身的微小误差),会导致这个时间不准确。当需要与外界保持近乎同一时刻时,时间误差就成了需要解决的问题。

比如中国的资本市场的股票交易,在工作日上午🕘9:3011:30 开市,这个市场里赚钱与赔钱,是按秒计算的,时间的一致性就非常重要(误差至少要缩短到毫秒级别)。在各种准时抢红包活动、或者抢票过程中,由于用户过多,那么手头上的时钟是否准时也比较重要。又比如,在计费系统,所记录的收费事项,要与用户实际发生的付费行为时间一致。现在非常多的服务系统,后端都是由多台服务器组成,它们之间的协调,需要保持时间一致,不然会发现错乱。…

如何确定是否准时呢?

是否准时?那么一定存在一个参照。这个参照就是协调世界时间 UTC,它是全世界一致的。但如何把这个世界时同步到世界各地的各种设备呢?在互联网时代,自然可以利用互联网技术来传送这个时间。这就是 NTP (Network Time Protocol)网络时间协议。

NTP 网络时间协议与时间同步原理 #

对简单了解网络时间同步原理不感兴趣的,请跳过本小节。

简单讲,NTP 网络时间协议定义了通过网络来同步时间的模型。

NTP网络时间协议同步模型
NTP网络时间协议同步模型

首先建立权威的时钟源,它们做为主时间服务器,向下同步准确时间。第一层次从权威时钟源获取标准时间,第二层次从第一层获取同步时间,以此类推。时钟层次 1~16,层次越小(最接近时钟源),时间越准确。16层以上被认为时间未同步,不能使用。

权威时钟源有原子钟、GPS、北斗卫星等。

由于权威时钟源可能与我们设备的网络距离非常远,中间会有较高的网络延迟;并且需要同步时间的设备非常多,全部设备均从权威时间源获取同步时间并不现实。终端设备应从时间服务器上获取时间来完成同步,这种服务器被称为 授时服务器。授时服务器用来向有时间同步需求的用户提供公共服务,而权威时钟源,则用于向授时服务器的提供准确的时间来源。

设备终端的 NTP 同步原理
设备终端的 NTP 同步原理

终端设备的时间同步过程类似于我们平时访问网页的网络请求(不过在于网络通信协议的区别。NTP 采用 UDP 报文协议,而不是TCP、HTTP 这种需要多次握手的网络连接):

  1. 设备上的客户端程序向服务器发送请求报文(t1)
  2. 请求到达服务端(t2)
  3. 服务端接收并处理后,向客户端返回应答(t3)
  4. 客户端收到结果(t4)

根据上面的4个时刻可知,设备客户端到服务器往返一次的网络延迟是 \( delay = (t4-t1) - (t3-t2) \),其中 \(t_1\)、\(t_4\) 是在客户端所记录的时间,\(t_2\)、\(t_3\)是服务器记录的时间,服务端与客户端之间存在时间差 \(\Delta\),存在以下的数学关系:

$$ t_2=t_1+\Delta+\frac{\mathrm{delay}}2 \\ t_4=t_3-\Delta+\frac{\mathrm{delay}}2 $$

可得到,

$$ \Delta= \frac{ \left(t_2-t_1\right)+ \left(t_3-t_4\right) }2 $$

客户端设置则根据这个公式得到时间差\(\Delta\)来调整自己的时钟,实现与服务器间的时间同步。

公共授时服务器 #

根据上节描述的 NTP 同步原理,我们并不需要找权威信源,而是要找到距离权威时间源最近(尽量的新)、并且距离我们终端设备网络距离较近(同步过程尽量快)的授时服务器用于日常使用。

目前提供这些用于时间同步公共服务的有政府机构、教育科研机构、互联网大厂、电子设备商。 下面不完全列出常用的时间的服务器地址:

组织类型 组织 地址 备注
教育科研机构 中国计量科学研究院 ntp1.nim.ac.cn,ntp2.nim.ac.cn 层次未知
教育科研机构 中国科学技术大学 time.ustc.edu.cn 层次未知
教育科研机构 交通大学 ntp.sjtu.edu.cn 层次未知
教育科研机构 复旦大学 ntp.fudan.edu.cn 层次未知
教育科研机构 东北大学 ntp.neu.edu.cn,ntp2.neu.edu.cn,ntp3.neu.edu.cn 一层服务器,位于 pool.ntp.org 池中
ntp.org ntp.org pool.ntp.org 不是真实地址,官方不建议直接使用,而是使用分区地址。
ntp.org ntp.org 0.cn.pool.ntp.org, 1.cn.pool.ntp.org, 2.cn.pool.ntp.org, 3.cn.pool.ntp.org 中国空间地址
政府机构 香港天文台 stdtime.gov.hk,time.hko.hk 一层服务器,位于 pool.ntp.org 池中
政府机构 澳门地球物理暨气象局 time.smg.gov.mo 层次未知
商业公司 阿里云 ntp.aliyun.com 层次未知
商业公司 鹅厂 ntp.tencent.com 层次未知
商业公司 apple time.apple.com 层次未知
商业公司 微软 time.windows.com 层次未知
商业公司 谷歌 time.google.com 层次未知,国内不通
商业公司 cloudflare time.cloudflare.com 层次未知

ntp.org 是 Network Time Protocol (NTP) Project 网络时间协议的项目官网。pool.ntp.org是时间服务器的大型集群,为众多客户端提供可靠网络时间服务的项目。它后端的服务器遍布全球,由各种各样的机构所提供。在使用时,pool.ntp.org 相当于总线,会根据客户端来返回它认为最近的时间服务器,而且是随机的。根据官方建议,如果你在中国,因使用中国空间的地址,其背后由服务器部署中国的 vender 提供。中国空间有地址 [0,1,2,3].cn.pool.ntp.org,共 4 个。

ntp 全球服务器数量
ntp 全球服务器数量

上图来自 pool.ntp.org 网站, ntppool.org 中文 (不确定你是否能访问这个网站)。

如果你的服务对时间极其敏感,并且要更加可靠的网络时间服务,那你可能需要寻求商业化方案,这超出了有悟的认知范围。

个人电脑时钟同步 #

手机设备提供了“使用网络时间”一项,已经为用户自动设置好了。并未提供手动调整的授时服务器的功能。

手机中类似于“使用网络时间”的设置
手机中类似于“使用网络时间”的设置

而桌面电脑,也默认设置了品牌商的网络时间。所以平时我们并没有感到时间存在多大的误差,不过还是提供了界面给用户手动调整。

macos 通用设置
macos 通用设置
macos 日期与地区设置
macos 日期与地区设置
macos 授时服务器设置
macos 授时服务器设置

macos 的 时间服务器 已经默认设置为苹果提供的 time.apple.com,一般不用再做调整,除非你无法访问到 time.apple.com 服务器。 windows 也提供了类似的设置功能。

进阶 - NTP 工具 #

以于喜欢折腾的电脑用户来说,光桌面自动设置系统满足不了好奇心。其实,ntp 设置的手动设置,在服务器后端更常见。因为这个群体本身就是一群喜欢折腾的用户。

有没有人好奇,上面 《公共授时服务器》所列的授时服务器,时间误差有多少呢?又有没有好奇,从授时服务器,可以获取哪些信息?

macos 上的 ntp 客户端工具 #

本节以 macos 为例来讲述。macos 提供了 sntp 命令行工具。⚠️ sntp 在 macos 11.0 以上才提供。sntp 命令的常用命令有:

# 1.打印时间差 𝚫
sntp 授时服务器地址或IP

# 2. 显示更详细的值,用于调试。
# 比如原理中提到的 t1、t2、t3、t4、延迟、时间差
sntp -d 授时服务器地址或IP

# 3. 命令行设置同步并设置系统时间服务器
sntp -sS 授时服务器地址或IP

比如,打印出系统时间差,单位为秒:

macos 查询 \\(时间差offset\\)
macos 查询 \(时间差offset\)

打印出计算时间差的各个项 \(t_1\)、\(t_2\) 、\(t_3\)、\(t_4\) 、\(delay\) 延迟 、\(offset\) 时间差,单秒为秒:

macos 调试时间差 \\(t_1\\)、\\(t_2\\) 、\\(t_3\\)、\\(t_4\\) 、\\(delay\\) 延迟 、\\(offset\\) 时间差
macos 调试时间差 \(t_1\)、\(t_2\) 、\(t_3\)、\(t_4\) 、\(delay\) 延迟 、\(offset\) 时间差

如果你有使用 macos,就可以看到,sntp -d 命令打印的全部内容,它显示了 sntp 通过多次获取时间,来消减可能由于网络不稳定造成延迟一项不准确、从而结果误差较大的情况。

linux 上的 ntp 工具 #

linux 应该是涉及用户干预配置最多的操作系统,相关工具非常多,因大多是涉及服务器运维配置,不属于本文的详细程度所于讲解清楚。有需要的请互联网上搜索诸如“linux ntp 配置”,能找到相应内容。

如果仅是为了查询与设置系统时间,那么 ntpq、timedatectl 就够了。ntqp 是 ntpd 后台服务的客户端,命令参数复杂到不能简单理解其功能。timedatectl 用于配置系统时钟自动同步,如果仅是查询时间延迟,那么 ntpq 或者 sntp 就够了。这些工具都可以通过 apt install 获取。

ntpq 查询当前所设置的同步服务器
ntpq 查询当前所设置的同步服务器

sntp 查询授时服务器
sntp 查询授时服务器

timedatectl 管理系统 ntp 配置
timedatectl 管理系统 ntp 配置

windows 上的 ntp 工具 #

有悟当下没有可用的 windwos 环境,无法为各位进行测试。

看看命令提示符终端能否运行: w32tm /config /syncfromflags:manual 或者 net time,如果可以,看看都有哪些命令选项。

来自 ntppool.org 上的例子:

  1. `w32tm /config /syncfromflags:manual /manualpeerlist:“0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org”``
  2. `net time /setsntp:“0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org”``

网页查询 #

还有个精美的网页,可以帮助我们简单检查系统是否准时。

time.is

界面如下:

time.is 界面
time.is 界面

广州时间:

资料参考 #