CDN 内容分发网络详解

1. 概述与核心作用

CDN 是一组分布在不同地理位置的缓存服务器集群,通过将内容缓存到离用户更近的节点,使用户就近获取数据。

CDN 主要解决两类问题:

  • 读延迟:静态资源从就近节点获取,减少跨地域、跨运营商的网络往返
  • 带宽瓶颈:边缘节点承担大部分请求,降低回源流量,减轻源站负载与主干链路压力

对源站而言,CDN 相当于一层“前置缓存 + 流量卸载”设施;对用户而言,则是更近、更快的内容获取入口。

2. CDN 工作原理

理解 CDN 的关键在于一次完整请求的调度过程。当用户访问接入 CDN 的资源时,流程如下:

  1. 用户发起请求(如访问 img.example.com
  2. DNS 解析时,域名的 CNAME 指向 CDN 调度系统
  3. GSLB(全局负载均衡)根据用户位置、节点负载、链路质量等,返回最优边缘节点的 IP
  4. 用户直接向该边缘节点发起请求
  5. 节点判断缓存是否命中:命中则直接返回;未命中则回源拉取,再缓存并返回
flowchart TD
    A[用户请求 img.example.com] --> B[DNS 解析]
    B --> C{CNAME 是否指向 CDN}
    C -->|否| D[直接回源站]
    C -->|是| E[GSLB 智能调度]
    E --> F[返回最近边缘节点 IP]
    F --> G[用户请求边缘节点]
    G --> H{缓存是否命中}
    H -->|命中| I[返回缓存内容]
    H -->|未命中| J[回源拉取]
    J --> K[源站返回内容]
    K --> L[边缘节点缓存并返回]
    I --> M[用户获取资源]
    L --> M

3. 节点层级架构

CDN 节点并非扁平的一层,而是分层部署,以进一步降低源站压力:

  • 边缘节点(Edge Node):直接面向用户,提供就近缓存与响应
  • 中层节点 / 回源盾(Mid-tier / Origin Shield):位于边缘与源站之间,边缘未命中时统一回源到回源盾,由回源盾合并请求再回源,避免大量边缘节点同时回源打垮源站
  • 源站(Origin Server):内容的权威来源
flowchart TD
    A[源站 Origin] --> B[回源盾 Origin Shield]
    B --> C1[边缘节点 Edge 1]
    B --> C2[边缘节点 Edge 2]
    B --> C3[边缘节点 Edge N]
    C1 --> D1[用户群 1]
    C2 --> D2[用户群 2]
    C3 --> D3[用户群 N]

回源盾的核心价值是收敛回源请求:即使上千个边缘节点同时未命中,也只有回源盾向源站发起一次请求,其余在回源盾层命中。

4. 缓存机制

4.1 三种缓存更新方式

CDN 缓存的更新与维护有三种典型模式,适用场景各异:

模式 触发方 工作方式 适用场景
Push(主动推送) 源站 源站主动将内容推送到各节点 大文件预热、重要资源提前分发
Pull(被动拉取) 用户请求 节点未命中时回源拉取并缓存 默认模式,绝大多数静态资源
Purge / Invalidation(主动失效) 运维/源站 通知节点清除旧缓存,下次请求触发回源 内容更新后立即生效

Push 与 Pull 并非互斥,常配合使用:发布前 Push 预热关键资源,日常请求由 Pull 兜底;内容更新时用 Purge 清除旧版本。

通过以上方式,全球节点可在一定时间内达到数据的最终一致性。

4.2 缓存命中率

缓存命中率是衡量 CDN 效果的核心指标,指命中缓存的请求占总请求的比例。命中率越高,回源流量越少,加速效果越好。

影响命中率的主要因素:

  • TTL 设置:TTL 过短导致频繁回源,过长则内容陈旧
  • 缓存键设计:URL 规则、是否忽略查询参数(如 ?v=1?v=2 是否分开缓存)
  • URL 可缓存性:动态参数过多、URL 变体过多会分散缓存
  • 预热策略:Push 预热可提升首次访问命中率
  • 节点容量:节点存储空间不足时,LRU 淘汰会降低命中率

4.3 缓存控制相关 Header

通过 HTTP 响应头控制节点与浏览器的缓存行为:

  • Cache-Control: max-age=N:缓存有效期(秒),优先级高于 Expires
  • Cache-Control: no-cache:每次需向源站验证(配合 ETag)
  • Cache-Control: no-store:禁止缓存
  • Expires:指定绝对过期时间
  • ETag / If-None-Match:协商缓存,304 响应体为空

5. 内容安全:防盗版与防盗链

防止 CDN 缓存内容被非法使用,需要从两个层面区分理解:

  • 防盗版:防止内容本身被复制、解密、二次传播(针对内容数据本身)
  • 防盗链:防止资源 URL 被第三方站点直接引用,消耗己方流量(针对访问来源)

5.1 防盗版(内容保护)

  1. 内容加密:对内容本身加密(如 HLS/DASH 加密、DRM),仅合法客户端可解密
  2. 数字水印:嵌入水印追踪盗版来源,便于事后溯源

5.2 防盗链(访问控制)

  1. URL 鉴权(Token 防盗链):通过时间戳 + 密钥生成签名 URL,仅携带有效签名的请求可访问,过期失效
  2. Referer 校验:检查请求来源,仅允许来自合法页面/域名的请求
  3. IP 黑白名单:直接拦截或放行指定 IP
  4. 并发连接数限制:限制单 IP 或单用户的并发数,防刷量
  5. 地理访问限制(Geo Restriction):按地域放行或屏蔽
  6. 短 TTL:设置较短有效期,降低 URL 被长期盗用的风险
flowchart TD
    A[内容安全防护] --> B[内容层:加密/水印]
    A --> C[访问层:URL签名/Token鉴权]
    A --> D[来源层:Referer校验/IP黑白名单]
    A --> E[策略层:TTL/并发限制/地理限制]

实际部署中,访问层与来源层手段常叠加使用,形成纵深防御。

6. 动态数据处理与动态加速

6.1 动态内容为何不能直接缓存

动态数据(如订单查询、实时库存、个性化推荐)每次返回结果不同,不适合在 CDN 长期缓存。传统做法是请求透传回源,但跨地域回源本身存在延迟。

6.2 动态加速

现代 CDN(如阿里云 DCDN、Cloudflare Argo、AWS CloudFront)提供动态加速能力,不止于静态缓存:

  • 网络路径优化:利用 CDN 内部骨干网络,选择更优回源路径
  • TCP 连接复用:边缘节点与源站保持长连接,减少握手开销
  • 智能路由(GSLB):根据实时链路状况选择最优回源路径,保障响应速度与可用性

对于动态请求,CDN 的角色从“缓存层”变为“网络加速层 + 智能路由层”。

7. GSLB 全局负载均衡

GSLB(Global Server Load Balancing)是 CDN 实现“就近访问”的核心调度组件,通常基于 DNS 智能解析实现:

  • 接收用户 DNS 查询后,综合用户地理位置、节点负载、链路质量、运营商等因素
  • 返回最优边缘节点的 IP,而非固定 IP
  • 也可通过 HTTP 302 重定向实现更精细的调度
flowchart LR
    A[用户 DNS 查询] --> B[GSLB 调度决策]
    B --> C[用户位置]
    B --> D[节点负载]
    B --> E[链路质量]
    B --> F[运营商]
    C & D & E & F --> G[返回最优边缘节点 IP]

GSLB 的调度策略直接影响命中率与用户体验,是 CDN 厂商调度能力的核心体现。

8. HTTPS 与 SSL 支持

CDN 边缘节点提供 HTTPS 终结能力,是现代 CDN 的标配功能:

  • 证书托管:在边缘节点部署 SSL 证书,由节点与用户建立 HTTPS 连接
  • 回源协议:节点到源站可选择 HTTPS 或 HTTP(回源加密)
  • 协议优化:支持 HTTP/2、HTTP/3(QUIC),提升传输效率
  • 会话复用:TLS 会话票据、0-RTT 等减少握手开销

典型链路为:用户 →(HTTPS)→ 边缘节点 →(HTTP 或 HTTPS)→ 源站。边缘节点承担证书管理与加解密开销,源站压力降低。

9. 接入方式

将业务接入 CDN 常见两种方式:

接入方式 说明 特点
CNAME 接入 域名 CNAME 指向 CDN 调度域名 最常用,调度灵活,需修改 DNS
NS 接入 将域名 NS 整体托管到 CDN 厂商 调度更彻底,由 CDN 厂商接管 DNS

CNAME 接入适用于子域名加速(如 img.example.com);NS 接入适用于全站加速,将整个域名的解析交给 CDN。

10. 秒杀场景中 CDN 的作用

秒杀的核心挑战是短时间高并发下保证先到先得、不超卖、不重复下单。CDN 本身处理静态资源,秒杀的动态交易逻辑需全链路配合,但 CDN 在其中承担关键的“前置卸载”角色。

10.1 CDN 层职责

  • 静态资源 CDN 化:秒杀商品详情页、JS/CSS、图片提前缓存到 CDN,减少源站压力
  • 边缘限流与风控:在边缘节点做 IP 频率限制、恶意请求拦截,挡住无效流量
  • 预热:活动前 Push 预热静态资源,确保命中率

10.2 全链路配合

秒杀的“先后问题”本质是并发下的顺序一致性,CDN 卸载静态流量后,后端通过以下分层方案保障公平与一致性:

flowchart LR
    A[前端限流] --> B[CDN 边缘拦截]
    B --> C[接入层排队]
    C --> D[消息队列串行化]
    D --> E[Redis 原子扣减]
    E --> F[数据库乐观锁]
    A2[按钮置灰/倒计时] -.-> A
    A3[幂等去重] -.-> E
  • 前端:按钮置灰、倒计时,防止重复点击
  • 排队机制:接入层将请求按到达顺序放入 MQ(Kafka、RocketMQ),先到先排队;通过一致性哈希将同一商品路由到同一队列,避免并发写冲突
  • 令牌限流:Redis 中原子递减库存令牌(DECR),令牌耗尽直接返回“已售罄”
  • 串行化处理:后端从 MQ 按序消费,单线程或分片串行处理下单
  • 数据层:Redis 原子扣减保证库存原子性,数据库乐观锁(版本号)或悲观锁(行锁)防止超卖
  • 幂等性:每个请求携带唯一 ID,服务端去重
  • 公平性:服务端时间统一校准,风控识别机器刷票与黄牛

10.3 总结

通过“静态资源 CDN 扛量 + 边缘限流 + 令牌削峰 + 消息队列排队串行 + Redis/DB 原子扣减 + 幂等风控”的分层方案,既保证先到先得的公平性,又避免后端被高并发打垮。

11. 关键指标小结

衡量 CDN 运营效果的核心指标:

指标 含义 优化方向
缓存命中率 命中缓存的请求占比 TTL、缓存键、预热
回源率 未命中需回源的请求占比 与命中率互补
首字节时间(TTFB) 首字节到达时间 节点部署、调度优化
下载速度 资源传输速率 节点带宽、协议优化
可用性 节点服务可用比例 多节点冗余、故障切换