DNS 與 CDN#
DNS 負責域名到 IP 位址的解析,CDN 負責內容的就近分發。本章涵蓋 DNS 工作原理、HTTPDNS 技術和 CDN 架構。
DNS 基礎#
DNS 是什麼#
DNS(Domain Name System) 是網路的「地址簿」,將人類可讀的域名轉換為機器可用的 IP 位址。
www.example.com ───DNS解析───→ 93.184.216.34
(域名) (IP位址)DNS 層級結構#
DNS 採用樹狀層級結構,保證高可用和分散式查詢:
┌───────────┐
│ 根 DNS │ (全球 13 組)
│ . │
└─────┬─────┘
┌───────────────┼───────────────┐
↓ ↓ ↓
┌───────────┐ ┌───────────┐ ┌───────────┐
│ .com TLD │ │ .org TLD │ │ .cn TLD │
└─────┬─────┘ └───────────┘ └───────────┘
↓
┌───────────┐
│example.com│ ← 權威 DNS
│ 權威DNS │
└───────────┘| 層級 | 職責 | 範例 |
|---|---|---|
| 根 DNS | 指向頂級域 DNS | . |
| 頂級域 DNS (TLD) | 管理二級域名 | .com, .org, .cn |
| 權威 DNS | 儲存實際的域名記錄 | example.com |
DNS 解析流程#
遞迴查詢過程#
sequenceDiagram
participant C as 用戶端
participant L as 本地 DNS<br/>(ISP 提供)
participant R as 根 DNS
participant T as .com TLD
participant A as 權威 DNS
C->>L: 1. 查詢 www.example.com
L->>R: 2. 查快取,無則查根 DNS
R->>L: 3. 回傳 .com TLD 位址
L->>T: 4. 查詢 .com TLD
T->>L: 5. 回傳權威 DNS 位址
L->>A: 6. 查詢權威 DNS
A->>L: 7. 回傳目標 IP
L->>C: 8. 回傳 IP 給用戶端本地 DNS 會快取查詢結果,大多數情況下不需要完整的遞迴查詢。
DNS 記錄類型#
| 類型 | 用途 | 範例 |
|---|---|---|
| A | 域名 → IPv4 位址 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 位址 | example.com → 2606:2800:... |
| CNAME | 域名別名 | www.example.com → example.com |
| MX | 郵件伺服器 | example.com → mail.example.com |
| NS | 域名伺服器 | example.com → ns1.example.com |
| TXT | 任意文字 | 用於 SPF、DKIM 等驗證 |
DNS 快取#
快取層級(從近到遠):
1. 瀏覽器快取 ← 最快
2. 作業系統快取
3. hosts 檔案
4. 本地 DNS 快取
5. 上級 DNS 快取
6. 權威 DNS ← 源頭# 查看 Linux DNS 快取
systemd-resolve --statistics
# 清除快取
sudo systemd-resolve --flush-caches
# Windows 清除 DNS 快取
ipconfig /flushdns
# 查詢 DNS
nslookup www.example.com
dig www.example.com
host www.example.com傳統 DNS 的問題#
| 問題 | 描述 | 影響 |
|---|---|---|
| 快取與更新延遲 | 本地快取未及時更新,全網生效慢 | 訪問到舊 IP,故障切換生效慢 |
| 域名轉發 | 電信業者 DNS 轉發給其他業者 | 跨業者訪問慢 |
| NAT 問題 | 出口 NAT 改變來源 IP | 權威 DNS 誤判位置 |
| 解析延遲 | 多級遞迴查詢 | 首次訪問慢 |
電信業者的本地 DNS 可能會有「小心思」:快取過期資料、私自轉發請求、插入廣告等。
HTTPDNS#
HTTPDNS 繞過傳統 DNS,透過 HTTP 協定直接向解析服務請求最佳 IP。主要解決傳統 DNS 的「劫持」與「跨業者誤判」兩大痛點。
傳統 DNS:用戶端 → 本地DNS → 根DNS → TLD → 權威DNS
HTTPDNS:用戶端 → HTTP請求 → HTTPDNS伺服器(直接回傳IP)| 方面 | 傳統 DNS | HTTPDNS |
|---|---|---|
| 解析速度 | 多級遞迴 | 一次 HTTP 請求 |
| 快取控制 | 由電信業者控制 | 由 App 控制 |
| 準確調度 | 可能誤判 | 精確識別業者和位置 |
| 更新速度 | 全網生效慢 | 即時生效 |
| 防劫持 | 易被劫持 | HTTPS 防劫持 |
HTTPDNS 主要用於行動 App(需在用戶端整合 SDK)。瀏覽器訪問網頁仍使用傳統 DNS。
CDN 基礎#
什麼是 CDN#
CDN(Content Delivery Network) 是分布在全球各地的快取節點網路,將內容快取到離使用者最近的位置。
無 CDN:
使用者(北京)────────────────────→ 源站(美國)
高延遲
有 CDN:
使用者(北京)──→ CDN邊緣節點(北京)
↓ (快取未命中時)
CDN區域節點
↓
CDN中心節點
↓
源站CDN 架構#
┌───────────┐
│ 源站 │
└─────┬─────┘
│
┌─────┴─────┐
│ 中心節點 │
└─────┬─────┘
┌─────────────┼─────────────┐
↓ ↓ ↓
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 區域節點 │ │ 區域節點 │ │ 區域節點 │
│ (華北) │ │ (華東) │ │ (華南) │
└─────┬─────┘ └───────────┘ └───────────┘
┌───────┼───────┐
↓ ↓ ↓
┌──────┐┌──────┐┌──────┐
│邊緣 ││邊緣 ││邊緣 │ ← 使用者訪問
│節點 ││節點 ││節點 │
└──────┘└──────┘└──────┘CDN 如何選擇節點#
CDN 透過 DNS 智慧調度,選擇最佳節點:
1. 使用者訪問 www.example.com
↓
2. DNS 回傳 CNAME: www.example.cdn.com
↓
3. 解析 CDN 域名,到達 GSLB(全局負載均衡)
↓
4. GSLB 根據以下因素選擇節點:
- 使用者地理位置
- 使用者電信業者
- 節點負載
- 節點健康狀態
↓
5. 回傳最佳邊緣節點 IP
↓
6. 使用者訪問邊緣節點CDN 應用場景#
靜態資源加速#
最常見的場景,適合:
- 圖片、CSS、JS 檔案
- 下載檔案
- 靜態 HTML 頁面
# Nginx 設定 CDN 回源
location /static/ {
proxy_pass http://cdn.example.com;
proxy_set_header Host $host;
proxy_cache_valid 200 1d;
}串流媒體加速#
CDN 支援串流媒體協定:
| 協定 | 特點 |
|---|---|
| HLS | 點播與直播,廣泛支援 |
| DASH | 點播與直播,開放標準 |
| RTMP | 直播推流,低延遲 |
串流媒體特殊處理:
- 預熱:熱門內容主動推送到邊緣
- 轉碼:適配不同碼率(720p, 1080p, 4K)
- 切片:影片分片儲存和傳輸
動態加速#
對於動態內容(API、資料庫查詢結果),CDN 也能優化:路徑優化(CDN 內部網路優化傳輸)、連接復用(邊緣到源站保持長連接)、協定優化(HTTP/2、QUIC)。部分 CDN 廠商還提供邊緣計算能力,可在邊緣節點執行輕量邏輯,但這已超出 DNS/CDN 核心主題,不展開。
CDN 防盜鏈#
Referer 防盜鏈#
# Nginx 設定
location /video/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
}Referer 容易偽造,只能防君子不能防小人。
時間戳防盜鏈#
1. 管理員在 CDN 設定加密金鑰
2. 用戶端產生帶簽章的 URL:
/video.mp4?key=SIGNATURE&expire=TIMESTAMP
3. CDN 驗證簽章和過期時間範例簽章演算法:
import hashlib
import time
secret_key = "your_secret_key"
path = "/video.mp4"
expire = int(time.time()) + 3600 # 1小時後過期
sign_str = f"{secret_key}{path}{expire}"
signature = hashlib.md5(sign_str.encode()).hexdigest()
url = f"https://cdn.example.com{path}?sign={signature}&t={expire}"DNS 與 CDN 結合#
完整流程#
sequenceDiagram
participant U as 使用者
participant L as 本地 DNS
participant CDN as CDN 系統<br/>(GSLB)
participant E as 邊緣節點
participant O as 源站
U->>L: 1. 解析 example.com
L->>L: 2. 回傳 CNAME: cdn.example.com
L->>CDN: 3. 解析 CDN 域名
CDN->>L: 4. GSLB 回傳最優 IP
L->>U: 5. 回傳邊緣節點 IP
U->>E: 6. 請求邊緣節點
alt 快取未命中
E->>O: 7. 回源請求
O->>E: 8. 源站回傳內容
end
E->>U: 9. 回傳內容(並快取)全域負載均衡(GSLB)#
GSLB 智慧調度考慮的因素:
| 因素 | 調度策略 |
|---|---|
| 地理位置 | 優先選擇就近節點 |
| 電信業者 | 同業者優先 |
| 節點狀態 | 避開高負載或故障節點 |
| 內容是否快取 | 優先有快取的節點 |
常用工具#
# DNS 查詢
dig +trace www.example.com # 顯示完整解析路徑
nslookup -type=CNAME www.example.com
# 測試 CDN 節點
curl -I https://www.example.com
# 查看 X-Cache, X-CDN 等頭部
# 查看本地 DNS
cat /etc/resolv.conf
# 強制使用特定 DNS
dig @8.8.8.8 www.example.com本章小結#
| 概念 | 關鍵點 |
|---|---|
| DNS | 域名 →IP 的地址簿,樹狀層級結構 |
| DNS 快取 | 多級快取提速,但可能導致更新延遲 |
| HTTPDNS | 繞過傳統 DNS,HTTP 直接查詢,更精準更快 |
| CDN | 內容分發網路,就近快取靜態資源 |
| GSLB | CDN 全域負載均衡,智慧選擇最優節點 |
| 防盜鏈 | 時間戳簽章比 Referer 更安全 |