强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

CDN 与 WAF 精讲教程 / 第02章 CDN 基础原理

第02章 CDN 基础原理

本章深入 CDN 的核心工作原理,包括边缘节点、源站、缓存机制、回源策略和 DNS 调度算法。理解这些是掌握后续章节的基础。


2.1 边缘节点(Edge Node)

2.1.1 什么是边缘节点

边缘节点是 CDN 部署在各地的缓存服务器集群,是用户请求的第一落点。每个 PoP(Point of Presence)由大量服务器组成,配备大容量 SSD/HDD 存储和高速网络。

2.1.2 节点层次结构

┌──────────────────────────────────────────────────────────┐
│                   CDN 节点层次                             │
│                                                          │
│   ┌─────────────┐    高流量区域,直接服务用户               │
│   │  边缘节点    │    ┌──────────────────────────┐        │
│   │  (Edge)     │───→│ 缓存内容 → 直接响应       │        │
│   └──────┬──────┘    └──────────────────────────┘        │
│          │ Cache Miss                                     │
│          ▼                                                │
│   ┌─────────────┐    区域级缓存,减轻源站压力               │
│   │  中间节点    │    ┌──────────────────────────┐        │
│   │  (Mid-Tier) │───→│ 缓存回源内容 → 缓存共享   │        │
│   └──────┬──────┘    └──────────────────────────┘        │
│          │ Cache Miss                                     │
│          ▼                                                │
│   ┌─────────────┐    ┌──────────────────────────┐        │
│   │   源站      │───→│ 原始内容服务器             │        │
│   │  (Origin)   │    └──────────────────────────┘        │
│   └─────────────┘                                         │
└──────────────────────────────────────────────────────────┘

2.1.3 全球节点分布参考

厂商全球 PoP 数量覆盖区域特点
Cloudflare300+全球 120+ 国家Anycast,免费接入
Akamai4,000+全球 130+ 国家最广覆盖
AWS CloudFront600+全球 90+ 国家集成 AWS 生态
阿里云 CDN3,200+全球 70+ 国家国内节点最多
腾讯云 CDN2,800+全球 50+ 国家与腾讯业务协同

2.1.4 节点内部架构

单个边缘节点通常包含:

组件作用典型配置
L4 负载均衡器TCP/UDP 流量分发DPVS / LVS
L7 代理服务器HTTP 请求处理与缓存Nginx / Varnish / Envoy
缓存存储层存储缓存内容SSD + HDD 分层存储
监控 Agent采集节点指标Prometheus + 自研

2.2 源站(Origin)

2.2.1 源站类型

类型协议场景示例
Web ServerHTTP/HTTPS网站静态文件Nginx / Apache / Caddy
Object StorageS3/OSS大规模静态资源AWS S3 / 阿里云 OSS
Load BalancerHTTP/HTTPS动态请求分发ALB / Nginx Upstream
Media ServerHLS/DASH视频点播/直播自建 / AWS MediaConvert

2.2.2 源站配置建议

源站高可用架构:

              ┌──────────────┐
              │   CDN 节点    │
              └──────┬───────┘
                     │ 回源请求
                     ▼
           ┌──────────────────┐
           │   源站负载均衡    │  ← SLB / NLB
           └────────┬─────────┘
                    │
          ┌─────────┼─────────┐
          ▼         ▼         ▼
     ┌────────┐ ┌────────┐ ┌────────┐
     │ App-1  │ │ App-2  │ │ App-3  │  ← 多实例
     └────────┘ └────────┘ └────────┘
          │         │         │
          └─────────┼─────────┘
                    ▼
              ┌──────────┐
              │  数据库   │  ← 主从/集群
              └──────────┘

关键原则:源站应至少部署 2 个可用区(AZ),避免单点故障。CDN 回源失败会直接返回错误给用户。


2.3 缓存机制

2.3.1 HTTP 缓存头

CDN 依赖 HTTP 响应头决定缓存行为:

头部作用示例
Cache-Control最主要的缓存控制头public, max-age=86400
Expires过期时间(已被 Cache-Control 取代)Thu, 31 Dec 2026 23:59:59 GMT
ETag资源版本标识"5f7b3d8a-1234"
Last-Modified最后修改时间Wed, 10 May 2026 12:00:00 GMT
Vary告知缓存键应包含哪些请求头Vary: Accept-Encoding
CDN-Cache-ControlCDN 专用缓存指令max-age=604800
Surrogate-Control代理专用缓存指令max-age=604800

2.3.2 Cache-Control 常用指令

Cache-Control 指令速查:

┌──────────────────────────────────────────────────────────┐
│ public          → 任何缓存都可以存储(CDN 可缓存)         │
│ private         → 仅浏览器可缓存(CDN 不缓存)            │
│ no-cache        → 每次使用前必须验证(不是不缓存!)       │
│ no-store        → 完全不缓存                              │
│ max-age=N       → 缓存 N 秒后过期                         │
│ s-maxage=N      → 共享缓存(CDN)过期时间,覆盖 max-age   │
│ stale-while-revalidate=N → 过期后 N 秒内可使用旧缓存      │
│ must-revalidate → 过期后必须向源站验证                     │
│ immutable       → 资源永不变,不需验证                     │
└──────────────────────────────────────────────────────────┘

2.3.3 缓存状态码

状态含义说明
HIT缓存命中直接从边缘节点响应
MISS缓存未命中已向源站回源
EXPIRED缓存过期已过期,正在回源验证
STALE陈旧缓存使用过期缓存(源站不可达时)
REVALIDATED重新验证ETag/Last-Modified 验证后使用缓存
BYPASS绕过缓存请求命中绕过规则
DYNAMIC动态内容不可缓存的动态响应

2.4 回源策略(Origin Pull)

2.4.1 何时触发回源

用户请求 → 边缘节点
    │
    ├── 情况1: 缓存命中(HIT)→ 直接返回缓存
    │
    ├── 情况2: 缓存未命中(MISS)→ 回源
    │   ├── 首次请求
    │   ├── 缓存已过期(TTL Expired)
    │   ├── 缓存被主动清除(Purge)
    │   └── Vary 头变化导致新缓存键
    │
    └── 情况3: 请求不应缓存(BYPASS/DYNAMIC)
        ├── Cache-Control: no-store / private
        ├── 请求方法非 GET/HEAD
        └── 命中不缓存规则

2.4.2 回源验证机制

当缓存过期时,CDN 会使用条件请求向源站验证:

验证方式请求头场景网络开销
ETag 验证If-None-Match: "etag-value"精确版本匹配低(304 响应体为空)
时间验证If-Modified-Since: <date>基于修改时间低(304 响应体为空)
直接回源无条件头缓存未存储高(传输完整内容)

2.4.3 回源优化

策略说明效果
回源合并同一资源多个并发请求合并为一次回源减少源站 QPS 90%+
Stale-While-Revalidate过期后在后台异步回源用户无感知延迟
预热(Preheat)提前将热门资源推送到边缘大促/发布前必备
回源盾(Shield)指定一个节点作为回源中转减少源站出口流量

2.5 DNS 调度

2.5.1 DNS 解析流程

DNS 调度是 CDN 就近分配的核心机制:

用户 (北京) 请求 cdn.example.com
    │
    ├── 1. 浏览器缓存 → 未命中
    ├── 2. OS 缓存 → 未命中
    ├── 3. 本地 DNS (LDNS) → 未命中
    │
    ▼
    4. 递归查询
    │
    ├── Root DNS → 返回 .com NS
    ├── .com DNS → 返回 example.com NS
    ├── example.com DNS → CNAME → cdn.example.cdnprovider.net
    │
    ▼
    5. CDN 厂商 DNS (调度系统)
    │
    ├── 识别 LDNS 来源 IP(或 EDNS Client Subnet)
    ├── 查询北京区域最优节点
    │
    ▼
    6. 返回 103.x.x.x(北京 PoP IP)
    │
    ▼
    用户浏览器 → 连接到 103.x.x.x(北京边缘节点)

2.5.2 DNS 调度算法

算法原理优点缺点
GeoDNS根据 LDNS IP 地理位置分配简单高效LDNS 位置 ≠ 用户位置
EDNS Client Subnet (ECS)携带用户真实 IP 子网精准定位需 LDNS 支持
Anycast多节点共享同一 IP,BGP 路由选路天然就近路由收敛慢
延迟探测边缘节点主动探测 LDNS 延迟最优延迟系统复杂度高
负载均衡考虑节点负载和健康状态避免过载可能牺牲距离

2.5.3 TTL 策略

场景TTL 建议原因
稳定业务300-600s减少 DNS 查询,稳定调度
高可用要求60-120s快速切换故障节点
即将迁移30-60s平滑切换
DDoS 防护极短或依赖 Anycast快速切换到清洗中心

2.6 典型业务场景

2.6.1 静态网站加速

场景:个人博客 / 企业官网
缓存策略:
  ├── HTML: max-age=3600, s-maxage=86400  (CDN 缓存 1 天)
  ├── CSS/JS: max-age=31536000, immutable  (1 年,文件名带 hash)
  ├── 图片: max-age=2592000               (30 天)
  └── 字体: max-age=31536000, immutable    (1 年)

2.6.2 API 加速

场景:移动端 API 接口
策略:
  ├── 使用 CDN 动态加速(TCP 优化、路由优化)
  ├── 不缓存 POST/PUT/DELETE 请求
  ├── GET 接口可选择性缓存(如商品详情 5-60 秒)
  └── 开启 WebSocket 支持(实时通信场景)

2.7 注意事项

⚠️ 缓存一致性:CDN 缓存与源站之间存在时间窗口差异,更新内容时需要主动 Purge。

⚠️ LDNS 劫持:部分 ISP 会劫持 DNS 解析,导致用户被调度到非最优节点。

⚠️ 回源风暴:大批量缓存同时过期可能导致瞬间大量回源(Thundering Herd),应使用 stale-while-revalidate 或错开 TTL。

⚠️ 缓存键设计:URL 中的无意义参数(如 ?utm_source=xxx)应被忽略,避免同一内容生成多个缓存副本。


2.8 扩展阅读


本章小结

主题核心要点
边缘节点用户第一落点,Cache HIT 则直接响应
源站内容唯一来源,需高可用部署
缓存机制HTTP Cache-Control 驱动,支持条件验证
回源策略合并回源、预热、回源盾减少源站压力
DNS 调度GeoDNS + ECS 实现就近分配

下一章:第03章 CDN 架构设计 →