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 | 精確度 |
|---|---|---|---|---|---|
| NTP | Layer 7 | Layer 4 | UDP | 123 | 毫秒級 |
| PTP (Precision Time) | Layer 2 | N/A | Ethernet | - | 微秒/納秒級 |
| SNTP (Simple NTP) | Layer 7 | Layer 4 | UDP | 123 | 秒級 |
重點:
- 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.comStratum 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 1Q2: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