06-3. NTP 時間同步協定

深入理解 NTP 如何實現網路時間同步

⏰ NTP 時間同步協定

⏱️ 閱讀時間: 8 分鐘 🎯 難度: ⭐⭐ (中等)


🎯 本篇重點

理解 NTP 的基本概念、Stratum 層級架構、時間同步原理、以及如何在實際環境中設定。


🤔 什麼是 NTP?

NTP (Network Time Protocol) = 網路時間協定

一句話解釋: NTP 就像是網路世界的「標準時鐘」,讓所有電腦的時間都保持一致,誤差可以小到毫秒等級。

比喻:校園裡的時鐘

沒有 NTP(各自為政):
- 教室 A 的時鐘:10:00
- 教室 B 的時鐘:10:03
- 教室 C 的時鐘:9:58
→ 每個教室下課時間不同,很混亂

有 NTP(統一時間):
- 所有時鐘都對準「校園標準時鐘」
- 教室 A、B、C 都是 10:00
→ 大家同步,井然有序

🏗️ NTP 在網路模型中的位置

OSI 7 層模型

┌──────────────────────────────┬─────────────────┐
│ 7. Application Layer (應用層) │  NTP            │ ← NTP 在這裡
├──────────────────────────────┼─────────────────┤
│ 6. Presentation Layer (表示層)│  加密、壓縮      │
├──────────────────────────────┼─────────────────┤
│ 5. Session Layer (會話層)     │  建立、維護會話  │
├──────────────────────────────┼─────────────────┤
│ 4. Transport Layer (傳輸層)   │  UDP            │
├──────────────────────────────┼─────────────────┤
│ 3. Network Layer (網路層)     │  IP             │
├──────────────────────────────┼─────────────────┤
│ 2. Data Link Layer (資料鏈結層)│  Ethernet       │
├──────────────────────────────┼─────────────────┤
│ 1. Physical Layer (實體層)    │  網路線、光纖    │
└──────────────────────────────┴─────────────────┘

NTP 位於第 7 層(應用層)

  • NTP 是應用層協定
  • 提供網路時間同步服務
  • 確保所有裝置時間一致

TCP/IP 4 層模型

┌─────────────────────────────┬─────────────────┐
│ 4. Application Layer (應用層) │  NTP            │ ← NTP 在這裡
├─────────────────────────────┼─────────────────┤
│ 3. Transport Layer (傳輸層)  │  UDP            │
├─────────────────────────────┼─────────────────┤
│ 2. Internet Layer (網際網路層)│  IP             │
├─────────────────────────────┼─────────────────┤
│ 1. Network Access (網路存取層)│  Ethernet       │
└─────────────────────────────┴─────────────────┘

NTP 位於第 4 層(應用層)

  • 在 TCP/IP 模型中,NTP 是應用層協定
  • 使用 UDP Port 123
  • UDP 提供快速、低延遲的傳輸

對比表:

協定OSI 層級TCP/IP 層級傳輸層協定Port精確度
NTPLayer 7Layer 4UDP123毫秒級
PTP (Precision Time)Layer 2N/AEthernet-微秒/納秒級
SNTP (Simple NTP)Layer 7Layer 4UDP123秒級

重點:

  • NTP 是應用層協定(兩種模型都是)
  • 使用 UDP Port 123
  • 對稱式通訊(Client 和 Server 互相詢問時間)
  • 精確度可達 1-50 毫秒(Internet)、< 1 毫秒(LAN)

NTP 使用 UDP 的原因:

為什麼 NTP 用 UDP?

1. 低延遲需求 ⚡
   時間同步需要精確測量網路延遲
   TCP 的三次握手會增加延遲
   UDP 直接傳送,延遲最小

2. 對稱性 ⚖️
   NTP 需要雙向測量延遲
   Client → Server(往返時間)
   Server → Client(往返時間)
   UDP 更適合這種對稱通訊

3. 輕量級 💨
   時間同步封包很小(< 100 bytes)
   TCP 的額外開銷不值得
   UDP 開銷最小

4. 容錯性 🔄
   偶爾丟包沒關係(下次再同步)
   不需要 TCP 的可靠性保證
   NTP 本身有多次查詢機制

🚨 為什麼需要時間同步?

時間不同步的問題

場景 1:日誌分析(除錯噩夢)

Web Server:  [10:00:05] 使用者登入
App Server:  [09:59:58] 處理請求
DB Server:   [10:00:12] 查詢資料

問題:
時間順序亂了!
看起來像是「先查資料,才處理請求,最後才登入」
→ 完全無法除錯!

正確順序(時間同步後):
[10:00:00] Web: 使用者登入
[10:00:01] App: 處理請求
[10:00:02] DB: 查詢資料
→ 清楚的時間軸!

場景 2:交易系統(嚴重錯誤)

股票交易:
Server A (10:00:00): 股價 100 元,買入
Server B (09:59:55): 股價 105 元,賣出

實際:先賣後買(虧損)
記錄:先買後賣(獲利)
→ 帳務錯誤!

時間同步後:
兩台 Server 時間一致
交易順序正確

場景 3:安全憑證(無法登入)

SSL 憑證有效期:
2025/01/01 00:00:00 ~ 2026/01/01 00:00:00

如果 Client 時間是 2024/12/31 23:59:00:
→ 憑證還沒生效!連線失敗

如果 Client 時間是 2026/01/02:
→ 憑證過期!連線失敗

時間同步後:
時間正確,憑證驗證通過

場景 4:分散式系統(資料不一致)

分散式資料庫(3 台):
Server A (10:00:00): UPDATE users SET name='Alice'
Server B (10:00:05): UPDATE users SET name='Bob'
Server C (09:59:55): UPDATE users SET name='Charlie'

沒有同步時間:
無法判斷哪個是最新的
→ 資料不一致

時間同步後:
按時間戳排序,取最新的
→ 資料一致性保證

🏗️ NTP 架構:Stratum 層級 ⭐⭐⭐

Stratum(階層):表示時間源的精確度層級

Stratum 0:原子鐘、GPS 時鐘(物理標準)
   │
   │ 直連(無網路)
   ↓
Stratum 1:直接連接 Stratum 0 的伺服器(最精確)
   │       例如:time.nist.gov, time.google.com
   │
   │ 網路連線
   ↓
Stratum 2:連接 Stratum 1 的伺服器
   │       例如:公司內部的 NTP Server
   │
   │ 網路連線
   ↓
Stratum 3:連接 Stratum 2 的客戶端
   │       例如:一般電腦、手機
   │
   ↓
Stratum 4...15(最多 15 層)

Stratum 層級詳解

Stratum 0(參考時鐘)

物理時間源(不可透過網路存取)

範例:
1. 原子鐘(Atomic Clock)
   - 銫原子鐘
   - 精確度:每 100 萬年誤差 1 秒

2. GPS 時鐘
   - 接收 GPS 衛星訊號
   - 精確度:微秒級

3. 無線電時鐘(WWVB, DCF77)
   - 接收無線電訊號
   - 精確度:毫秒級

特點:
- 不在網路上
- 直接連接到 Stratum 1 Server(串列埠、PCIe 卡等)

Stratum 1(主要時間伺服器)

直接連接 Stratum 0 的伺服器

全球公共 NTP Server:
- time.nist.gov(美國國家標準技術研究所)
- time.google.com(Google)
- time.apple.com(Apple)
- time.cloudflare.com(Cloudflare)
- pool.ntp.org(全球 NTP Pool)

特點:
- 最精確(微秒到毫秒級)
- 高可用性(24/7 運作)
- 通常禁止一般用戶直接使用(需透過 Stratum 2)

查詢方式:
ntpdate -q time.google.com

Stratum 2(次級時間伺服器)

連接 Stratum 1,服務一般客戶端

使用場景:
- 公司內部 NTP Server
- ISP 的 NTP Server
- 資料中心的 NTP Server

範例架構:
公司內部 NTP Server (Stratum 2)
└─ 連接 time.google.com (Stratum 1)
   └─ 服務公司內 100+ 台電腦

優點:
- 減輕 Stratum 1 負擔
- 內網同步更快(低延遲)
- 集中管理

Stratum 3-15(客戶端)

一般裝置

Stratum 3:連接 Stratum 2
Stratum 4:連接 Stratum 3
...
Stratum 15:最大層級

越高層級 → 精確度越低

範例:
Stratum 1: time.google.com (誤差 < 1ms)
  ↓
Stratum 2: 公司 NTP (誤差 ~5ms)
  ↓
Stratum 3: 你的電腦 (誤差 ~10ms)
  ↓
Stratum 4: ...

Stratum 16(未同步)

表示「無法同步」或「時間不可信」

原因:
- 無法連接到任何 NTP Server
- 時間差距太大(超過 1000 秒)
- 網路問題

Windows 顯示:
w32tm /query /status
Stratum: 16 (unspecified) ← 未同步

修復:
檢查網路連線
檢查 NTP Server 設定
手動同步:w32tm /resync

📡 NTP 同步流程

時間戳交換

NTP 使用 4 個時間戳計算時間差和延遲

Client                          Server
  │                                │
  ├─ Request ────────────────────>│
  │  T1: Client 發送時間            │
  │  (10:00:00.000)                │
  │                                │
  │                                │  T2: Server 收到時間
  │                                │  (10:00:00.050)
  │                                │
  │                                │  T3: Server 發送時間
  │                                │  (10:00:00.051)
  │<─ Response ────────────────────┤
  │  T4: Client 收到時間            │
  │  (10:00:00.101)                │

4 個時間戳:
T1 = 10:00:00.000  (Client 發送)
T2 = 10:00:00.050  (Server 收到)
T3 = 10:00:00.051  (Server 回應)
T4 = 10:00:00.101  (Client 收到)

計算公式 ⭐

往返延遲(Round-Trip Delay)

Delay = (T4 - T1) - (T3 - T2)

範例:
Delay = (101 - 0) - (51 - 50)
      = 101 - 1
      = 100 毫秒

解釋:
T4 - T1 = 總時間(101ms)
T3 - T2 = Server 處理時間(1ms)
Delay = 網路往返延遲(100ms)

時間偏移(Offset)

Offset = ((T2 - T1) + (T3 - T4)) / 2

範例:
Offset = ((50 - 0) + (51 - 101)) / 2
       = (50 + (-50)) / 2
       = 0 / 2
       = 0 毫秒

解釋:
T2 - T1 = Client 到 Server 的時間差(50ms)
T3 - T4 = Server 到 Client 的時間差(-50ms)
Offset = 平均時間差(0ms → 時間一致)

如果 Offset > 0:Client 時間慢了
如果 Offset < 0:Client 時間快了
如果 Offset = 0:時間一致

同步調整

NTP 不會直接「跳躍」時間

原因:
如果直接改時間,會造成問題:
- 日誌時間倒退
- 程序計時錯誤
- 資料庫交易問題

NTP 的調整方式:

1️⃣ Slew(緩慢調整):
   Offset < 128ms
   → 逐漸加快或減慢時鐘
   → 平滑過渡,不跳躍

   範例:
   目前時間慢 10ms
   → 讓時鐘走快一點點
   → 經過幾分鐘後,時間追上

2️⃣ Step(跳躍調整):
   Offset > 128ms
   → 直接修改時間
   → 快速同步

   範例:
   目前時間慢 5 分鐘
   → 直接跳到正確時間

3️⃣ Panic(拒絕同步):
   Offset > 1000 秒
   → 時間差太大,拒絕自動同步
   → 需要手動確認

   原因:
   可能是設定錯誤或惡意攻擊
   不應該自動接受

🛠️ NTP 實戰設定

Linux:使用 systemd-timesyncd(簡單)

# Ubuntu/Debian 預設已安裝

# 檢查狀態
timedatectl status

輸出:
               Local time: 三 2025-01-15 20:00:00 CST
           Universal time: 三 2025-01-15 12:00:00 UTC
                 RTC time: 三 2025-01-15 12:00:00
                Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: yes ← 已同步
              NTP service: active ← NTP 啟用
          RTC in local TZ: no

# 設定 NTP Server
sudo vi /etc/systemd/timesyncd.conf

[Time]
NTP=time.google.com time.cloudflare.com
FallbackNTP=pool.ntp.org

# 重啟服務
sudo systemctl restart systemd-timesyncd

# 手動同步
sudo timedatectl set-ntp true

# 查看同步詳情
timedatectl timesync-status

輸出:
       Server: 216.239.35.0 (time.google.com)
Poll interval: 32s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 1 ← 連接 Stratum 1
    Reference: GPS
    Precision: 1us (-25)

Linux:使用 ntpd(進階)

# 安裝
sudo apt install ntp

# 設定檔
sudo vi /etc/ntp.conf

# NTP Servers
server time.google.com iburst
server time.cloudflare.com iburst
server pool.ntp.org iburst

# 限制存取(安全性)
restrict default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

# 本地網路可查詢(如果是 Server)
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# 啟動服務
sudo systemctl start ntp
sudo systemctl enable ntp

# 查看同步狀態
ntpq -p

輸出:
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*time.google.com .GPS.            1 u   64   64  377    5.123   -0.456   0.123
+time.cloudflare .PTP.            1 u   32   64  377    8.456   +0.234   0.234
-pool.ntp.org    .POOL.           2 u   16   64  377   12.345   -1.234   0.345

說明:
* = 目前使用的 Server
+ = 候選 Server(可用)
- = 備選 Server
st = Stratum 層級
delay = 延遲(毫秒)
offset = 時間偏移(毫秒)
jitter = 抖動(毫秒)

Windows:設定 NTP

# 查看狀態
w32tm /query /status

輸出:
Leap Indicator: 0(no warning)
Stratum: 3 (secondary reference - syncd by (S)NTP)
Precision: -23 (119.209ns per tick)
Root Delay: 0.0156248s
Root Dispersion: 7.7949142s
ReferenceId: 0xAC100001 (source IP:  192.168.1.1)
Last Successful Sync Time: 2025/1/15 20:00:00
Source: time.windows.com
Poll Interval: 10 (1024s)

# 設定 NTP Server
w32tm /config /manualpeerlist:"time.google.com time.cloudflare.com" /syncfromflags:manual /update

# 重新同步
w32tm /resync

# 查看同步來源
w32tm /query /peers

# GUI 設定
控制台 → 日期和時間 → 網際網路時間 → 變更設定
→ 伺服器:time.google.com
→ 立即更新

常用公共 NTP Server

# Google
time.google.com
time1.google.com - time4.google.com

# Cloudflare
time.cloudflare.com

# Apple
time.apple.com

# NTP Pool Project(全球分散式)
pool.ntp.org
0.pool.ntp.org - 3.pool.ntp.org

# 台灣特定
tw.pool.ntp.org
time.stdtime.gov.tw(國家時間與頻率標準實驗室)

# 中國特定
cn.pool.ntp.org
ntp.aliyun.com

設定建議:
1. 設定多個 Server(至少 3 個)
2. 選擇地理位置接近的 Server(延遲低)
3. 混合使用不同提供商(容錯)

範例:
server time.google.com iburst
server time.cloudflare.com iburst
server tw.pool.ntp.org iburst

🎓 面試常見問題

Q1:NTP 的 Stratum 是什麼?層級如何劃分?

A:Stratum = 階層,表示時間源的精確度層級

層級劃分:

Stratum 0(參考時鐘):
- 原子鐘、GPS、無線電時鐘
- 不可透過網路存取
- 精確度最高

Stratum 1(主要伺服器):
- 直接連接 Stratum 0
- 例如:time.google.com, time.nist.gov
- 精確度:微秒到毫秒級

Stratum 2(次級伺服器):
- 連接 Stratum 1
- 公司內部 NTP Server
- 精確度:毫秒級

Stratum 3-15(客戶端):
- 層層往下
- 層級越高,精確度越低

Stratum 16(未同步):
- 表示無法同步
- 時間不可信

選擇建議:
一般電腦 → 連接 Stratum 2 或 Pool
公司 Server → 自建 Stratum 2,連接多個 Stratum 1

Q2:NTP 如何計算時間偏移(Offset)和延遲(Delay)?

A:使用 4 個時間戳

時間戳:
T1 = Client 發送時間
T2 = Server 收到時間
T3 = Server 回應時間
T4 = Client 收到時間

往返延遲(Delay):
Delay = (T4 - T1) - (T3 - T2)

範例:
T1 = 0ms, T2 = 50ms, T3 = 51ms, T4 = 101ms
Delay = (101 - 0) - (51 - 50)
      = 101 - 1
      = 100ms

時間偏移(Offset):
Offset = ((T2 - T1) + (T3 - T4)) / 2

範例:
Offset = ((50 - 0) + (51 - 101)) / 2
       = (50 - 50) / 2
       = 0ms

解釋:
Offset = 0 → 時間一致
Offset > 0 → Client 慢了
Offset < 0 → Client 快了

為什麼除以 2?
假設網路延遲對稱(往返相同)
取平均值補償延遲

Q3:NTP 為什麼用 UDP 而不是 TCP?

A:三個原因

1️⃣ 低延遲需求
   時間同步需要精確測量延遲
   TCP 三次握手增加延遲
   UDP 直接傳送,延遲最小

2️⃣ 對稱通訊
   NTP 需要測量雙向延遲
   Client ⇄ Server(往返時間)
   UDP 更適合這種對稱模式

3️⃣ 輕量級
   NTP 封包 < 100 bytes
   TCP 額外開銷(ACK、重傳)不值得
   UDP 開銷最小

丟包處理:
NTP 會多次查詢(通常 8 次)
取中位數,過濾異常值
偶爾丟包影響不大

Port:
UDP 123(Client 和 Server 都用)

Q4:時間差距很大時,NTP 如何處理?

A:三種調整策略

1️⃣ Slew(緩慢調整)
   Offset < 128ms
   → 逐漸加快或減慢時鐘
   → 平滑過渡

   優點:
   ✅ 時間不會倒退
   ✅ 日誌順序正確
   ✅ 程序計時正常

   缺點:
   ❌ 調整時間較長(可能數小時)

2️⃣ Step(跳躍調整)
   128ms < Offset < 1000s
   → 直接修改系統時間
   → 快速同步

   優點:
   ✅ 快速同步

   缺點:
   ❌ 時間可能倒退
   ❌ 程序可能出錯

   使用場景:
   - 系統剛啟動
   - 手動強制同步

3️⃣ Panic(拒絕同步)
   Offset > 1000s (16.7 分鐘)
   → 拒絕自動調整
   → 需要手動確認

   原因:
   可能是設定錯誤或攻擊
   不應自動接受

   解決:
   手動檢查 Server 設定
   手動調整時間
   ntpdate -b time.google.com(強制同步)

面試加分:
提到「leap second」(閏秒)
NTP 支援閏秒調整
確保時間與 UTC 一致

Q5:如何設定公司內部的 NTP Server?

A:三步驟設定

步驟 1:選擇硬體
中小型公司:
- 一般 Linux Server(虛擬機也可)
- 連接多個 Stratum 1 Server

大型公司:
- 專用 NTP Server
- 可選配 GPS 時鐘(Stratum 1)

步驟 2:設定 NTP Server
# /etc/ntp.conf

# 上游 NTP Server(Stratum 1)
server time.google.com iburst
server time.cloudflare.com iburst
server pool.ntp.org iburst

# 允許內網客戶端查詢
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap

# 本機可以查詢和修改
restrict 127.0.0.1

# 如果上游斷線,用本機時鐘(不推薦)
server 127.127.1.0
fudge 127.127.1.0 stratum 10

# 啟動
sudo systemctl restart ntp

步驟 3:客戶端設定
所有內網電腦指向此 Server:

Linux:
sudo vi /etc/systemd/timesyncd.conf
NTP=192.168.1.10

Windows:
w32tm /config /manualpeerlist:"192.168.1.10" /syncfromflags:manual /update

驗證:
# Server 端
ntpq -p
→ 確認連接到 Stratum 1

# Client 端
ntpq -p 192.168.1.10
→ 確認連接到內部 Server

架構圖:
Internet
  ↓
time.google.com (Stratum 1)
  ↓
公司 NTP Server (Stratum 2)
  ↓
內網電腦 (Stratum 3)

優點:
✅ 減輕外部 Server 負擔
✅ 內網同步快(低延遲)
✅ 集中管理
✅ 外網斷線仍可同步(內網之間)

Q6:NTP 和 SNTP 有什麼差別?

A:功能複雜度不同

NTP(Network Time Protocol):
- 完整功能
- 精確度高(毫秒級)
- 支援多 Server 選擇
- 支援時鐘品質評估
- 雙向時間戳交換

特點:
✅ 高精確度(1-50ms)
✅ 容錯性好(多 Server)
✅ 自動選擇最佳 Server
✅ 支援 Slew 緩慢調整

使用場景:
- 伺服器
- 資料中心
- 需要高精確度的設備

SNTP(Simple NTP):
- 簡化版 NTP
- 精確度較低(秒級)
- 單向時間戳
- 沒有複雜演算法

特點:
✅ 簡單易實作
✅ 資源需求低
❌ 精確度較低(~1 秒)
❌ 沒有容錯機制

使用場景:
- 嵌入式設備
- IoT 裝置
- 對時間精確度要求不高的設備

對比表:
| 特性 | NTP | SNTP |
|------|-----|------|
| 精確度 | 1-50ms | ~1s |
| 複雜度 | 高 | 低 |
| 資源需求 | 高 | 低 |
| 容錯性 | 高 | 低 |
| 使用場景 | 伺服器 | IoT |

選擇建議:
伺服器、需要精確時間 → NTP
嵌入式、IoT 裝置 → SNTP

✅ 重點回顧

NTP 定義:

  • NTP = Network Time Protocol
  • 網路時間同步協定
  • UDP Port 123

Stratum 層級:

  • Stratum 0:原子鐘、GPS(參考時鐘)
  • Stratum 1:直連 Stratum 0(最精確)
  • Stratum 2-15:層層往下
  • Stratum 16:未同步

時間計算公式(重要):

Delay = (T4 - T1) - (T3 - T2)
Offset = ((T2 - T1) + (T3 - T4)) / 2

調整策略:

  • Slew (< 128ms):緩慢調整,不跳躍
  • Step (< 1000s):直接修改時間
  • Panic (> 1000s):拒絕同步

為什麼用 UDP:

  • 低延遲(時間同步需求)
  • 對稱通訊(雙向測量)
  • 輕量級(封包小)

實用命令:

# Linux
timedatectl status       # 查看狀態
ntpq -p                  # 查看同步詳情

# Windows
w32tm /query /status     # 查看狀態
w32tm /resync            # 手動同步

公共 NTP Server:

  • time.google.com
  • time.cloudflare.com
  • pool.ntp.org
  • tw.pool.ntp.org

面試重點:

  • ✅ Stratum 層級概念
  • ✅ 時間計算公式(Delay、Offset)
  • ✅ 為什麼用 UDP
  • ✅ 三種調整策略
  • ✅ NTP vs SNTP

記憶口訣:

  • Stratum = 「原主次客」(原子鐘、主要、次級、客戶端)
  • 調整 = 「滑跳慌」(Slew、Step、Panic)

上一篇: 06-2. DHCP 動態 IP 分配 下一篇: 07-1. FTP 基礎


最後更新:2025-01-15

0%