什么是NTP?如何使用 ntp 校准系统时钟?| 电脑时间不准了怎么办?
目录
电脑、手机等设备,都内置了时钟。即使,电脑或手机关机,这个时钟还会正常计时。当电脑或者手机设备重新启动,会读取这个时间。这样,就保持了设备上程序运行的日期、时间问题。由于可能的各种原因(比如设备内置的时钟的电量不足?电子时钟本身的微小误差),会导致这个时间不准确。当需要与外界保持近乎同一时刻时,时间误差就成了需要解决的问题。
比如中国的资本市场的股票交易,在工作日上午🕘9:30
至 11:30
开市,这个市场里赚钱与赔钱,是按秒计算的,时间的一致性就非常重要(误差至少要缩短到毫秒级别)。在各种准时抢红包活动、或者抢票过程中,由于用户过多,那么手头上的时钟是否准时也比较重要。又比如,在计费系统,所记录的收费事项,要与用户实际发生的付费行为时间一致。现在非常多的服务系统,后端都是由多台服务器组成,它们之间的协调,需要保持时间一致,不然会发现错乱。…
如何确定是否准时呢?
是否准时?那么一定存在一个参照。这个参照就是协调世界时间 UTC,它是全世界一致的。但如何把这个世界时同步到世界各地的各种设备呢?在互联网时代,自然可以利用互联网技术来传送这个时间。这就是 NTP (Network Time Protocol)网络时间协议。
NTP 网络时间协议与时间同步原理 #
对简单了解网络时间同步原理不感兴趣的,请跳过本小节。
简单讲,NTP 网络时间协议定义了通过网络来同步时间的模型。
首先建立权威的时钟源,它们做为主时间服务器,向下同步准确时间。第一层次从权威时钟源获取标准时间,第二层次从第一层获取同步时间,以此类推。时钟层次 1~16,层次越小(最接近时钟源),时间越准确。16层以上被认为时间未同步,不能使用。
权威时钟源有原子钟、GPS、北斗卫星等。
由于权威时钟源可能与我们设备的网络距离非常远,中间会有较高的网络延迟;并且需要同步时间的设备非常多,全部设备均从权威时间源获取同步时间并不现实。终端设备应从时间服务器上获取时间来完成同步,这种服务器被称为 授时服务器。授时服务器用来向有时间同步需求的用户提供公共服务,而权威时钟源,则用于向授时服务器的提供准确的时间来源。
终端设备的时间同步过程类似于我们平时访问网页的网络请求(不过在于网络通信协议的区别。NTP 采用 UDP 报文协议,而不是TCP、HTTP 这种需要多次握手的网络连接):
- 设备上的客户端程序向服务器发送请求报文(t1)
- 请求到达服务端(t2)
- 服务端接收并处理后,向客户端返回应答(t3)
- 客户端收到结果(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 个。
上图来自 pool.ntp.org 网站, ntppool.org 中文 (不确定你是否能访问这个网站)。
如果你的服务对时间极其敏感,并且要更加可靠的网络时间服务,那你可能需要寻求商业化方案,这超出了有悟的认知范围。
个人电脑时钟同步 #
手机设备提供了“使用网络时间”一项,已经为用户自动设置好了。并未提供手动调整的授时服务器的功能。
而桌面电脑,也默认设置了品牌商的网络时间。所以平时我们并没有感到时间存在多大的误差,不过还是提供了界面给用户手动调整。
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
比如,打印出系统时间差,单位为秒:
打印出计算时间差的各个项 \(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
获取。
windows 上的 ntp 工具 #
有悟当下没有可用的 windwos 环境,无法为各位进行测试。
看看命令提示符终端能否运行: w32tm /config /syncfromflags:manual
或者 net time
,如果可以,看看都有哪些命令选项。
来自 ntppool.org 上的例子:
- `w32tm /config /syncfromflags:manual /manualpeerlist:“0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org”``
- `net time /setsntp:“0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org”``
网页查询 #
还有个精美的网页,可以帮助我们简单检查系统是否准时。
界面如下:
广州时间: