时间同步协议NTP - 原理&实践

主页

引言

时间是一种人类幻觉 ——— 爱因斯坦。爱因斯坦的相对论阐述:时间并非一个绝对的、客观的实体,而是相对于观察者和参考系的一种主观幻觉。

虽然时间的本质至今也很难被理解,但是我们的工作、生活中处处离不开时间。xx程序员凌晨2点忙着项目上线;xx领导要求员工要996办公;xx员工通过笔记本日历设置了每周一的周例会提醒。时间如此重要,以至于我们在不同场景下对时间准确度和精度提出了要求。

本文内容组织:

  • 时间同步协议
  • NTP简介
  • NTP工作原理
  • 实践&应用
  • 总结
  • 参考资料

时间同步协议

时间在计算机系统中至关重要的。它不仅仅是为了显示当前的日期和时间,而是为了确保系统的正常运行、安全性、一致性和性能。准确的时间信息对于计算机系统的各个方面都是必不可少的。

  • 同步和协调:时间提供了一个共同的参考点,确保计算机系统中的组件和进程按照正确的顺序执行,保持系统的稳定性和一致性。
  • 安全和认证:时间在计算机安全和认证中起着关键作用,用于验证和保护系统,包括数字证书的有效期限、身份验证令牌的时间同步和防止重放攻击等。
  • 记录和分析:时间戳在记录和日志中起着重要作用,帮助我们了解事件发生的顺序、持续时间和时间间隔,以及在任务调度和性能分析中确定任务优先级、执行时间和延迟等方面的应用。
  • 数据一致性和复制:在分布式系统中,时间对于确保数据一致性和复制的正确性非常重要。时间戳可以用于确定事件的顺序,从而确保数据在不同节点之间的正确复制和同步。

计算机的系统时间一般来自两部分:
image

  • 系统时钟:表示计算机的系统时间,由操作系统维护,定期进行更新和校准。
  • 本地更新:计算机一般内部都配置RTC硬件设备,当操作系统启动时会查询RTC并设置系统时钟。但RTC有个问题就是,会有误差,并且误差会累积,因此当时间拉长,系统时钟会越来越不准确,因此需要定期校准。
  • 校准:本地计算机通过时间同步协议定期同步远程时间服务器时间,并对本地系统时钟进行微调校准。
  • 时间同步协议:通过该协议对本地系统时钟进行校准
  • 时间服务器:通过更高精密的物理设备,提供高精度时间。时间源如:高精度原子钟,GPS卫星时间、其他时间服务器等

常见的时间同步协议如下:

时间同步协议 名称 优点 缺点 常用领域
NTP Network Time Protocol - 广泛应用于互联网和局域网环境
- 可扩展性和灵活性好
- 精度相对较低
- 受网络延迟和时钟漂移影响
互联网、局域网
PTP Precision Time Protocol - 高精度时间同步
- 微秒级或纳秒级精度
- 需要专用硬件支持
- 配置和部署复杂
工业自动化、金融交易系统
GPS Global Positioning System - 提供高精度时间信息
- 全球范围可用
- 需要接收GPS信号的可见性
- 受天气和地理条件影响
科学研究、导航、定位
RTS Radio Time Signals - 提供时间信号广播
- 一些国家和地区可用
- 受地理限制
- 精度相对较低
特定地区的时间同步需求

注:互联网中一般使用NTP协议进行计算机之间的时间同步。

NTP简介

NTP(Network Time Protocol): 是一种用于网络时间同步的协议。它旨在确保计算机和其他网络设备具有准确的时间,并通过与时间服务器进行通信来同步其时钟。

NTP服务器: 是提供时间服务的特定服务器,它们通过网络向客户端提供准确的时间信息。这些服务器通常与原子钟或其他高精度时间源同步,以确保提供高度准确的时间。

NTP发展历程

NTP协议的发展经历了多个版本,从v1到v4,每个版本都引入了新的特性和功能。

image
注:以上图片来自Wikipedia

以下是每个版本的特点简要概述:

  • NTP v1:最早的NTP版本,于1985年发布。它是一个简单的协议,主要用于时间同步和基本的时钟校准。
  • NTP v2:于1988年发布,引入了一些改进,如更好的时钟校准算法和更准确的时间同步。
  • NTP v3:于1992年发布,是第一个广泛使用的NTP版本。它引入了一些重要的特性,包括对称性和客户端/服务器模式、更准确的时钟校准算法、更好的时钟选择算法以及更强大的安全性。
  • NTP v4:于2010年发布,是目前最新和最广泛使用的NTP版本。它引入了许多新特性和改进,包括更准确的时钟选择算法、更强大的安全性和认证机制、更好的时钟校准算法、更灵活的配置选项等。

SNTP(Simple Network Time Protocol): 是NTP的简化版本,旨在提供基本的时间同步功能。由于SNTP实现了一部分NTPv4功能,因此SNTPv4相关实现已经合入到NTPv4。与NTP相比,SNTP协议主要关注基本的时间同步功能,功能较少,更加易于理解和实现,不过时间同步精度较差。因此SNTP适合一些对时间精度和可靠性要求不是特别高的互联网或局域网。

NTP工作原理

NTP工作流程

image

假设本地计算机和时间服务器通信时间如下:
image

  • T1:时间同步请求时间
  • T2:时间服务器接收到请求时间
  • T3:时间服务器响应时间
  • T4: 时间同步请求响应时间

计算延迟时间Delay

# Delay为客户端和服务端RoundTrip Time
Delay = [(T4 - T1) - (T3 – T2)]/2

计算时间偏差Offset

# 客户端时间T4加Offset为服务端当前时间
T4 + Offset = T3 + Delay

# Offset为计算服务端和客户端的时间偏差,Offset可以为正或者负值
Offset = T3 + Delay - T4 =  [(T2 - T1) + (T3 – T4)]/2

注:客户端时间校准基于Offset,错略来说客户端当前时间为CurrentTime = T4 + Offset = (T4 + T3 + T2 - T1)

NTP分层结构

NTP服务一般采用分层结构实现,从Stratum 0到Stratum 15不等。,Stratum(层)指的是时间源的层级结构。每个时间源都被分配到一个特定的层级,以下是对Stratum分层结构示意图:
image

  • Stratum:Stratum 0是最高层级,代表原子钟、GPS接收器或其他高精度的时间源。Stratum 1是直接与Stratum 0时间源相连的服务器,Stratum 2是与Stratum 1服务器相连的服务器,以此类推。
  • 分层的目的:分层结构有助于建立时间同步的可靠性和稳定性。通过分层,NTP协议可以避免时间环路和错误传播,确保时间同步的准确性和可靠性。
  • 分层时间精度:不同层级的时间源具有不同的精确度。Stratum 0时间源通常具有最高的精确度,因为它们直接从原子钟或卫星接收到高精度的时间信号。随着层级的增加,精确度可能会略微降低,但在整个NTP网络中,精确度通常仍然非常高。
  • 时间同步过程:较低层级的服务器会定期向较高层级的服务器发送时间请求。较高层级的服务器使用自己的时钟和与更高级别的时间源的同步信息来响应这些请求。通过这种方式,时间信息从更高级别的时间源传播到较低级别的服务器,实现整个网络中的时间同步。

注: 互联网主机通常会同步到Stratum 2或Stratum 3级别的时间服务器。这是因为Stratum 2和Stratum 3级别的时间服务器已经通过Stratum 1级别的时间服务器与高精度的时间源进行了同步,提供了足够准确的时间信息,满足大多数应用的需求。

实践&应用

下面以CentOS为例,安装ntpd并实现时间同步,ntpd为一个时间同步守护进程,用于校正本地系统与时钟源服务器之前的时间,完整实现了NTP协议。ntpd 默认为客户端运行方式

ntpd安装和配置

  • 判断是否安装 ntpd
[root@VM-238-106-centos ~]# rpm -qa | grep ntp
ntpdate-4.2.6p5-29.tl2.2.2.x86_64
ntp-4.2.6p5-29.tl2.2.2.x86_64
fontpackages-filesystem-1.44-8.el7.noarch

# 如果返回类似上面的结果,表示ntpd已安装。如果未安装则执行如下命令
[root@VM-238-106-centos ~]# yum -y install ntp
  • 配置ntpd
# ntpd配置文件为/etc/ntp.conf
[root@VM-238-106-centos ~]# vim /etc/ntp.conf
....
 54 # Disable the monitoring facility to prevent amplification attacks using ntpdc
 55 # monlist command when default restrict does not include the noquery flag. See
 56 # CVE-2013-5211 for more details.
 57 # Note: Monitoring will not be disabled with the limited restriction flag.
 58 disable monitor
 59 server 0.pool.ntp.org iburst
 60 server 1.pool.ntp.org iburst
 61 server 2.pool.ntp.org iburst
 64 interface ignore wildcard
 65 interface listen eth1

注:以上0.pool.ntp.org表示时间服务器(不是真实地址,仅用于展示),可以配置多个。

  • 启动ntpd
# 启动ntpd
[root@VM-238-106-centos ~]# systemctl restart ntpd.service

# 设置开启自动启动
[root@VM-238-106-centos ~]# systemctl enable ntpd.service
  • 检查ntpd状态
[root@VM-238-106-centos ~]#  systemctl status ntpd.service
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-10-23 15:31:57 CST; 5 months 7 days ago
 Main PID: 8953 (ntpd)
   CGroup: /system.slice/ntpd.service
           └─8953 /usr/sbin/ntpd -u ntp:ntp -g

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

# 或者通过端口号检查是否监听成功,ntpd监听端口为123
[root@VM-238-106-centos ~]# netstat -nupl | grep ntp
udp        0      0 9.134.238.106:123       0.0.0.0:*                           8953/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           8953/ntpd
udp6       0      0 fe80::5054:ff:fedd::123 :::*                                8953/ntpd
udp6       0      0 ::1:123                 :::*                                8953/ntpd

获取ntp服务信息

[root@VM-238-106-centos ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+169.x.x.79    100.y.y.196   2 u  266 1024  377    0.743    0.554   0.605
-169.x.x.80    100.y.y.196   2 u  171 1024  377    0.611    0.524   0.390
+169.x.x.81    100.y.y.196   2 u  292 1024  377    0.617   -0.094   0.208
*169.x.x.82    100.y.y.196   2 u  163 1024  377    0.844    0.296   0.268
+169.x.x.83    100.y.y.196   2 u  408 1024  377    0.689   -0.043   0.272
  1. remote:远程NTP服务器的IP地址或主机名。
  2. refid:远程NTP服务器所参考的时间源的IP地址或主机名。
  3. st:远程NTP服务器的时钟层级(stratum)。较低的数字表示更接近时间源的服务器。
  4. t:远程NTP服务器的时钟类型。u 表示未确定,s 表示本地挂钟,l 表示本地原子钟,f 表示外部参考源。
  5. when:自上次成功同步以来的时间(以秒为单位)。
  6. poll:NTP客户端向远程服务器发送时间请求的间隔(以秒为单位)。
  7. reach:表示最近8个时间请求中成功接收到响应的数量。每个时间请求成功接收到响应时,对应的位会被设置为1。
  8. delay:NTP客户端与远程服务器之间的往返延迟(以毫秒为单位)。
  9. offset:NTP客户端与远程服务器之间的时间偏差(以毫秒为单位)。正值表示客户端时间比服务器时间晚,负值表示客户端时间比服务器时间早。
  10. jitter:NTP客户端与远程服务器之间的时钟抖动(以毫秒为单位)。它表示时钟的不稳定性。

在上面列表中,每行表示一个远程NTP服务器的信息。前面的符号(+、-、)表示服务器的同步状态。+ 表示该服务器是当前所选的同步源,- 表示该服务器可用但不是首选同步源, 表示该服务器是当前所选的同步源并且具有较低的偏差和抖动。

总结

ntpd作为守护进程运行在后台,默默校正本地系统与时钟源服务器之前的时间,以便保证本地系统时间的准确性。本文简单介绍了NTP时间同步协议的发展历程工作原理,并在最后基于linux系统,详细介绍了ntpd安装、配置、启动以及ntpq查询ntp服务信息等相关命令。希望读着通过本文对NTP协议原理和应用有个初步的了解。本文中对基于Offset的本地时间校准未进行细致介绍,删繁就简仅介绍了基本原理,更详细的可以通过文末的参考资料进行学习。

参考资料


posted @ 2024-04-02 09:59  warm3snow  阅读(382)  评论(2编辑  收藏  举报