時間同步協議NTP - 原理&實踐

warm3snow發表於2024-04-01

主頁

  • 個人微信公眾號:密碼應用技術實戰
  • 個人部落格園首頁:https://www.cnblogs.com/informatics/

引言

時間是一種人類幻覺 ——— 愛因斯坦。愛因斯坦的相對論闡述:時間並非一個絕對的、客觀的實體,而是相對於觀察者和參考系的一種主觀幻覺。

雖然時間的本質至今也很難被理解,但是我們的工作、生活中處處離不開時間。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的本地時間校準未進行細緻介紹,刪繁就簡僅介紹了基本原理,更詳細的可以透過文末的參考資料進行學習。

參考資料

  • 維基百科NTP:https://en.wikipedia.org/wiki/Network_Time_Protocol
  • 華為NTP:https://support.huawei.com/enterprise/en/doc/EDOC1000178167/e02e56b2/ntp-implementation
  • RFC NTPv4:https://datatracker.ietf.org/doc/html/rfc5905
  • RFC NTPv3: https://datatracker.ietf.org/doc/html/rfc1305
  • RFC SNTPv4: https://datatracker.ietf.org/doc/html/rfc4330
  • NTP Architecture, Protocol and Algorithms:https://www.eecis.udel.edu/~mills/database/brief/arch/arch.pdf
  • NTP General Overview: https://www.eecis.udel.edu/~mills/database/brief/overview/overview.pdf

相關文章