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 優勢#

方面傳統 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 防盜鏈#

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 更安全