為什麼全國人民都能秒開同一個影片?

> 為什麼你在北京打開一個影片,載入只要1秒?你的朋友在新疆,打開同一個影片,也是1秒?伺服器難道全國各地都放了?

今天,用 "快遞" 的故事,來講講 CDN 的原理。


原文連結

墨淵書肆/為什麼全國人民都能秒開同一個影片?


沒有 CDN 時,網路請求是怎麼跑的?

你在北京,想從上海寄一箱蘋果。

沒有 CDN 的情況下:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

你(北京)→ 上海工廠 → 快遞翻山越嶺 → 你收到蘋果

耗時:3–5 天。

網路請求同理:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

你在北京 → 發出請求到上海伺服器 → 上海伺服器回傳資源 → 你收到回應

耗時:100–300 ms(由物理距離決定)。

如果伺服器在上海,你在新疆,延遲可能高達 500 ms。

更嚴重的是——100 萬人同時看這個影片,上海伺服器直接當掉


CDN 怎麼解決這個問題?

CDN 的核心思想:把內容複製到離使用者最近的地方

快遞公司在全國蓋了很多倉庫:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

你在北京 → 北京倉庫有貨 → 當天到達

網路請求同理:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

你在北京 → 北京 CDN 節點有快取 → 10 ms 到達

這就是 CDN(Content Delivery Network,內容傳遞網路)的核心:就近存取


CDN 的工作原理

1. DNS 智能解析

當你輸入網址,DNS 會解析到離你最近的 CDN 節點:

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

傳統 DNS(固定 IP)

你(北京)→ dns.example.com → 123.125.115.110(上海源站)

CDN 智能 DNS

你(北京)→ dns.example.com → GSLB 判斷位置 → 返回 1.2.3.4(北京節點)
你(新疆)→ dns.example.com → GSLB 判斷位置 → 返回 5.6.7.8(新疆節點)

GSLB(Global Server Load Balancer,全球負載平衡)會根據地理位置回傳最近的節點 IP。

2. 邊緣節點就近回應

CDN 節點稱為 PoP(Point of Presence,邊緣節點),分佈在全國各地:

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

┌─────────────────────────────────────────────────────────────┐
│ CDN 全國節點分佈 │
│ │
│ 東北區 PoP 華北區 PoP 華東區 PoP │
│ (瀋陽) (北京) (上海) │
│ │
│ 西南區 PoP 華中區 PoP 華南區 PoP │
│ (成都) (武漢) (廣州) │
│ │
│ ┌─────────────────┐ │
│ │ 源站伺服器 │ │
│ │ (上海自建) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘

3. 快取命中與回源

CDN 節點會快取源站內容:

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

快取未命中:
使用者 → CDN 節點 → 源站伺服器 → 回傳內容並快取

快取命中:
使用者 → CDN 節點 → (直接回傳快取,不回源)


深入了解 CDN 🔬

CDN 快取策略

CDN 透過 HTTP 回應標頭控制快取行為:

<div><div><div></div><span>http</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

快取有效期(秒)

Cache-Control: public, max-age=86400

不快取(直接回源)

Cache-Control: no-cache, no-store

回應標頭作用:Expires 為過期時間點(絕對時間);Cache-Control: max-age 為快取有效期(相對時間)。
Cache-Control: private 僅瀏覽器可快取,CDN 不可快取;Cache-Control: no-store 禁止快取。

快取失效機制

源站內容更新後,CDN 可能仍會回傳舊快取。常見解法:

方案 原理 適用場景
快取預熱 發布前主動推送新內容到 CDN 節點 大促、熱更新
快取刷新 手動刪除指定 URL 的快取 緊急更新
版本化 URL URL 帶上 hash,如 app.js?v=2.1.0 靜態資源(推薦)
短 TTL 犧牲效能換取即時性 頻繁更新的資源

CDN 判斷快取狀態

CDN 回應時會帶自訂標頭,標示快取命中狀態:

<div><div><div></div><span>http</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

X-Cache: HIT # 命中快取
X-Cache: MISS # 未命中,回源

X-Cache-Status: HIT
X-Cache-Status: REVALIDATED # 快取過期但內容未變,驗證通過

Anycast 與 DNS 劫持

大型 CDN 使用 Anycast 技術:多個節點共用同一個 IP,路由器會自動把請求導到最近的節點。

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

Anycast 示意

北京節點、上海節點、廣州節點 → 都使用 IP 1.2.3.4
使用者請求 → 路由器自動選擇物理距離最近的節點

國內 CDN 的特殊性

由於國內的 ICP 備案制度,CDN 需要網域已備案才能接入。正式的 CDN 服務商會檢查網域的備案狀態。


為什麼 CDN 能「秒開」?

1. 就近存取——物理距離近

存取路徑單程延遲與往返延遲(RTT)比較:
北京 → 上海(無 CDN)單程 100–150 ms,往返 200–300 ms
北京 → 北京 CDN 節點 單程 1–5 ms,往返 2–10 ms
快了 20–100 倍。

2. 骨幹網路直連

CDN 服務商自建骨幹網路,像高鐵專線:

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

公網路由(多跳)

北京 → 西安中轉 → 成都中轉 → 上海伺服器
(每跳增加 10–50 ms 延遲)

CDN 骨幹網路

北京 PoP ←→ 上海 PoP ←→ 源站伺服器
(跳數少、延遲低)

3. 邊緣運算能力

現代 CDN 不只是快取,還能做邊緣運算:

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

CDN 邊緣節點能力:
├── 靜態資源快取
├── 動態請求加速(路由優化)
├── TLS/SSL 終止(加解密在邊緣完成)
├── 圖片壓縮/格式轉換(WebP/AVIF)
├── A/B 測試分流
├── 防 DDoS 攻擊
└── Edge Functions(邊緣函數)


CDN 服務架構

<div><div><div></div><span>yaml</span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

┌─────────────────────────────────────────────────────────────┐
│ 使用者請求 │
└─────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ DNS 智能解析 │
│ (GeoDNS:根據地理位置返回節點) │
└─────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ GSLB 全域負載平衡器 │
│ (健檢 + 就近調度) │
└───────┬─────────┬─────────┬─────────┬─────────┬───────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐┌────────┐┌────────┐┌────────┐┌────────┐
│北京 PoP ││上海 PoP││廣州 PoP││成都 PoP││新疆 PoP│
└────┬───┘└────┬───┘└────┬───┘└────┬───┘└────┬───┘
│ │ │ │ │
└─────────┴────┬────┴─────────┴─────────┘
│ 快取未命中時回源

┌─────────────────┐
│ 源站伺服器 │
│ (上海自建) │
└─────────────────┘


CDN 服務商選擇

服務商 特點 適用場景
Cloudflare 免費額度大,全球 Anycast 個人部落格、中小型網站
Akamai 全球最大、節點最多 大型企業、國際化業務
阿里雲 CDN 國內節點密集 國內業務
騰訊雲 CDN 與微信生態整合 遊戲、直播
AWS CloudFront 與 AWS 生態深度整合 AWS 使用者
自建 CDN 完全可控 超大型企業

選型考量

因素 說明
節點分佈 使用者群體的地理位置
價格模型 按流量、按頻寬、按請求數等
快取命中率 命中率越高,源站壓力越小
HTTPS 支援 免費憑證、自動續期
附加功能 防 DDoS、邊緣運算、HTTP/3 支援

CDN 的常見問題

1. 快取生效延遲

更新網站內容後,CDN 仍在回傳舊快取:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

你更新了 CSS → CDN 節點仍有舊版本 → 使用者看到排版錯位頁面

解決方案:使用版本化 URL(style.css?v=2.0.0)、發布後手動刷新快取。

2. 快取穿透

惡意請求大量不存在的 URL,直接打到源站:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

攻擊者 → 隨機 URL → CDN 無快取 → 回源 → 源站當掉

解決方案:CDN 安全配置、源站防護、使用布隆過濾器(Bloom Filter)判斷資源是否存在。

3. HTTPS 憑證管理

CDN 節點需配置 SSL 憑證,更新時需同步到所有節點:

<div><div><div></div><span></span></div><div><div> <span>體驗AI程式助理</span></div><div> <span>程式碼解讀</span></div><div>複製程式碼</div></div></div>

憑證過期 → TLS 握手失敗 → 使用者無法存取

解決方案:使用 CDN 內建免費憑證、設定自動續期、監控憑證狀態。


總結:CDN 核心知識點

概念 說明
PoP / 邊緣節點 離使用者最近的 CDN 伺服器
回源 快取未命中時,向源站請求內容
GSLB 全域負載平衡,根據位置返回最近節點
GeoDNS 根據使用者地理位置返回不同解析結果
快取命中率 快取命中請求佔總請求的比例,越高越好
Anycast 多節點共用 IP,路由自動選最近節點

寫在最後

現在應該明白了:

  • CDN = 在全國各地建倉庫,就近發貨
  • PoP/邊緣節點 = 離你最近的倉庫
  • 回源 = 倉庫沒貨,去工廠拿
  • GSLB = 智能調度,看你在哪就分配哪個倉庫
  • 秒開 = 物理距離近 + 骨幹網路 + 快取重用

下次影片載入飛快時,記得——背後有數千個 CDN 節點在為你「跑腿」。

技術不複雜,但讓「全國人民秒開同一個影片」成為可能。


原文出處:https://juejin.cn/post/7621753314950692870


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝12   💬10   ❤️2
362
🥈
我愛JS
📝2   💬9   ❤️2
93
🥉
💬1  
4
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登