ntp时钟同步详解

244 阅读8分钟

一、计算机中的时间简介

linux系统中有几个时间:硬件时间(RTC时间)、系统时间(UTC时间)、本地时间

  1. 硬件时间
    • 含义:硬件时间,也被称为实时时钟(RTC),是指计算机主板上的一个独立于操作系统的设备,它在电源关闭甚至断电情况下也能保持运行。其功能是记录当前的日期和时间。大部分操作系统在启动时会从RTC读取时间,然后设置系统时间。同样,操作系统也可以将系统时间写回到RTC中。
# 查询硬件时间
hwclock --show

# 将系统时间设置为硬件时间
hwclock --systohc

# 将硬件时间设置为系统时间
hwclock --hctosys
  1. 系统时间(UTC时间)
    • 含义:系统时间是计算机内部使用的时间,它通常在启动时从RTC设置,然后由系统时钟进行跟踪。系统时钟是操作系统内核的一部分,可以以毫秒或纳秒级别提供精确时间。系统时间通常使用协调世界时(UTC)表示。UTC是一种基于原子时钟的时间标准,全球各地的科学家通过精密测量来维护它。它与格林尼治标准时间(GMT)非常接近,但不受地球自转速度变化的影响。
# 查询系统时间(UTC)
date -u

# 查询本地时间(由系统时间UTC和时区共同决定)
date

# 设置本地时间(后面那串是本地时间)(设置本地时间会同样设置系统时间,只不过会自动帮你做时区转换)
date -s "2022-01-01 00:00:00"

# 直接设置系统时间(不推荐,一般通过设置本地时间来设置系统时间,因为这样设置你还得把后面那串时间计算一下时区)
date -u -s "2022-01-01 00:00:00"
  1. 本地时间(CST中国标准时间):
    • 含义:本地时间是系统时间经过时区转换后的时间。时区是根据地理位置确定的,全球分为24个时区,每个时区大约代表15度的经度。例如,北京时间是UTC+8,而伦敦时间是UTC+0。
date
  1. 时区:
    • 含义:时区是为了方便统一时间而划分的地理区域。全球被划分为24个时区,每个时区大约代表15度的经度。各时区的时间以UTC(协调世界时)为基准,东边的时区比UTC时间晚,西边的时区比UTC时间早。
# 选择时区
tzselect

# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  1. 补充:容器的时钟同步

    • Docker容器的默认时区取决于使用的基础镜像,大多数场景下都是UTC时间。这意味着如果没有在创建或运行Docker容器时显式设置一个特定的时区,那么容器内部的时间将按照UTC来显示。如果希望docker容器中的时区与宿主机保持一致,可以在容器docker run的时候增加以下挂载:
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro\

/etc/timezone: 这个文件包含了当前设置的时区信息。比如,如果系统设置为美国东部时区,这个文件的内容可能会是 America/New_York。
/etc/localtime: 这个文件是当前设定的时区对应的数据文件的复制品或者软链接。这个文件用于提供本地化的日期和时间显示。
只挂载 /etc/timezone 或 /etc/localtime 可能会导致一些问题,比如在处理跨时区的日期和时间时可能出现错误。
默认情况下,Docker容器并不会自动挂载 /etc/localtime 文件。容器是通过宿主机的内核获取物理时间的。
Docker容器虽然在很多方面都与宿主机隔离,但它们共享同一个内核。这意味着,当容器需要获取当前的物理时间(例如,调用 time() 系统调用)时,它会直接从宿主机的内核获取这个信息。这就是为什么即使不挂载 /etc/localtime,容器中的程序仍然能够获取到正确的物理时间。
然而,时区信息并不只是物理时间,它还涉及到逻辑时间的处理,包括日历计算、夏令时调整等等。这些信息是存储在 /etc/timezone 和 /etc/localtime 这两个文件中的。如果希望容器中的程序能够正确地处理这些时区相关的问题,那么需要将这两个文件同时挂载到容器中,缺一不可。

二、计算机中时间同步简介

image.png

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

image.png

三、NTP时钟同步简介

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

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

注:ntp版本有4次迭代,目前在使用的是ntp v4(2010发布)

四、NTP时钟同步原理

4.1 工作流程

image.png

时间同步演示:

image.png

该图显示了NTP的基本工作原理。设备A和设备B通过网络连接。它们都有各自独立的系统时钟,并且它们需要通过NTP实现其系统时钟的自动同步。为了便于理解,进行以下假设:

  1. 设备A向设备B发送NTP消息。消息离开设备A时带有时间戳。时间戳为10:00:00 am(T1)。
  2. 当此NTP消息到达设备B时,设备B添加其自己的时间戳。时间戳是11:00:01 am(T2)。
  3. 当此NTP消息离开设备B时,设备B添加其自己的时间戳并将时间戳更改为11:00:02(T3)。
  4. 设备A收到响应消息后,设备A的本地时间为上午10:00:03(T4)。
  5. 此时,设备A具有足够的信息来计算两个重要参数:

计算延迟时间:

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

计算时间偏差offset:

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

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

4.2 NTP分层结构

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

image.png

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