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)
方面傳統 DNSHTTPDNS
解析速度多級遞迴一次 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內容分發網路,就近快取靜態資源
GSLBCDN 全域負載均衡,智慧選擇最優節點
防盜鏈時間戳簽章比 Referer 更安全