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 頂級域 DNS 地址
L->>T: 4. 查詢 .com 頂級域 DNS
T->>L: 5. 返回 example.com 權威 DNS 地址
L->>A: 6. 查詢 example.com 權威 DNS
A->>L: 7. 返回 www.example.com 的 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 的問題#
| 問題 | 描述 | 影響 |
|---|---|---|
| 快取過期 | 本地 DNS 快取未及時更新 | 訪問到舊 IP |
| 域名轉發 | 運營商 DNS 轉發給其他運營商 | 跨運營商訪問慢 |
| NAT 問題 | 出口 NAT 改變源 IP | 權威 DNS 誤判位置 |
| 更新延遲 | 全網 DNS 更新慢 | 故障切換生效慢 |
| 解析延遲 | 多級遞歸查詢 | 首次訪問慢 |
運營商的本地 DNS 可能會有「小心思」:快取過期資料、私自轉發請求、插入廣告等。
HTTPDNS#
什麼是 HTTPDNS#
HTTPDNS 繞過傳統 DNS,通過 HTTP 協定直接請求解析服務:
傳統 DNS:
客戶端 → 本地DNS → 根DNS → TLD → 權威DNS
HTTPDNS:
客戶端 → HTTP請求 → HTTPDNS伺服器(直接返回IP)工作原理#
┌──────────────────────────────────────────────────────────────┐
│ 1. App 內置 HTTPDNS SDK │
│ 2. 需要解析時,直接 HTTP 請求 HTTPDNS 伺服器 │
│ 3. HTTPDNS 伺服器根據客戶端 IP 判斷運營商和地理位置 │
│ 4. 返回最優的 IP 地址列表 │
│ 5. 結果快取在 App 本地 │
└──────────────────────────────────────────────────────────────┘範例請求:
curl "http://httpdns.example.com/d?dn=www.example.com"
# 回應
{
"dns": [{
"host": "www.example.com",
"ips": ["1.2.3.4", "5.6.7.8"],
"ttl": 300
}],
"client": {
"ip": "223.5.5.5",
"isp": "telecom"
}
}HTTPDNS 優勢#
| 方面 | 傳統 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 防盜鏈#
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 更安全 |