浏览知识库目录

计算机网络

CDN

CDN(Content Delivery Network内容分发网络)是一种通过将内容缓存到全球各地多个服务器节点,让用户从距离自己最近的服务器获取数据的技术,从而提高访问速度、降低延迟,并减轻源服务器压力。

举个简单例子

假设一个网站的服务器在北京:

  • 北京用户访问网站,速度很快。
  • 广州、成都、纽约的用户访问时,由于距离远、网络路径复杂,速度会变慢。

如果使用了 CDN:

           源站(北京)
                │
      ┌─────────┼─────────┐
      │         │         │
 上海CDN节点   广州CDN节点   新加坡CDN节点
      │         │         │
 上海用户     广州用户     东南亚用户

不同地区的用户会自动访问离自己最近的 CDN 节点,而不是直接访问北京的源站,因此网页、图片、视频等资源加载更快。


CDN 是如何工作的?

以访问一个网站图片为例:

  1. 用户打开网页。
  2. 浏览器请求图片资源。
  3. DNS 或 CDN 调度系统判断哪个节点离用户最近。
  4. 请求被发送到最近的 CDN 节点。
  5. 如果节点已经缓存了图片,就直接返回给用户(缓存命中)。
  6. 如果没有缓存(缓存未命中),CDN 会到源站获取图片,缓存到本地,再返回给用户。

流程如下:

用户
 │
 ▼
CDN节点
 │
 ├── 有缓存 → 直接返回
 │
 └── 无缓存
         │
         ▼
      源站服务器
         │
         ▼
     返回内容并缓存

CDN 可以缓存哪些内容?

通常适合缓存静态资源,例如:

  • 图片(jpg、png、webp)
  • CSS
  • JavaScript
  • 视频
  • 音频
  • PDF
  • 字体文件

有些 CDN 也支持缓存部分动态内容,例如:

  • API 响应(设置缓存策略后)
  • HTML 页面
  • SSR(服务端渲染)页面

使用 CDN 的好处

1. 提高访问速度

用户访问最近的节点,网络延迟更低。

例如:

  • 不使用 CDN:用户 → 北京服务器(约 200ms)
  • 使用 CDN:用户 → 上海 CDN 节点(约 20ms)

2. 减轻源站压力

如果有 100 万人访问图片:

  • 不使用 CDN:100 万次请求都打到源站。
  • 使用 CDN:绝大部分请求由 CDN 节点处理,源站只需处理少量未命中的请求。

3. 提高稳定性

即使某个节点出现故障,CDN 通常可以自动切换到其他节点,提高服务可用性。


4. 提升安全性

许多 CDN 提供:

  • DDoS 攻击防护
  • Web 应用防火墙(WAF)
  • HTTPS/SSL 支持
  • 限流、防刷等能力

CDN 与普通服务器的区别

普通服务器 CDN
内容只存放在源站 内容缓存到多个节点
所有用户访问同一台服务器 用户访问最近的节点
源站压力大 大部分请求由 CDN 处理
访问速度受距离影响大 全球访问速度更快

常见 CDN 服务商

国内:

  • 阿里云 CDN
  • 腾讯云 CDN
  • 华为云 CDN
  • 百度智能云 CDN

国际:

  • Cloudflare
  • Amazon Web Services CloudFront
  • Google Cloud CDN
  • Akamai Technologies

一个现实中的例子

以视频网站为例:

假设一个 500 MB 的视频有 10 万人观看。

  • 没有 CDN:10 万人都从源服务器下载,总流量约为 50 TB,源站带宽压力巨大。
  • 有 CDN:视频会缓存到各地节点,用户直接从本地节点下载,源站通常只需在首次缓存时提供内容,后续绝大多数请求由 CDN 节点完成。

一句话总结

CDN 就像遍布各地的“快递仓库”。 源站相当于总仓,CDN 节点相当于各地分仓。用户不需要每次都从总仓取货,而是从最近的分仓获取内容,因此访问更快、服务器压力更小、系统更稳定、更安全

那是不是意味着CDN 会在很多节点中存储同一份资源的多个副本

CDN 会在很多节点中存储同一份资源的多个副本,这也是 CDN 能够加速访问的核心原因之一。

不过实际情况比“所有资源在所有 CDN 节点存一份”复杂很多。


1. CDN 确实会产生多份副本

例如一个网站有一个图片:

logo.png  (源站)
大小:1MB

假设 CDN 有这些节点:

                源站
                 |
    ┌────────────┼────────────┐
    │            │            │
 北京节点      上海节点      美国节点
 logo.png     logo.png     logo.png
    │            │            │
 用户          用户          用户

最终可能存在:

源站:
logo.png

北京 CDN:
logo.png

上海 CDN:
logo.png

美国 CDN:
logo.png

所以确实是空间换速度


2. 但不是所有资源都会复制到所有节点

CDN 通常采用按需缓存(Lazy Cache)。比如,你的服务器有:

100万个图片

但是:

  • 北京用户只访问其中 10 万个
  • 美国用户只访问其中 5 万个

那么 CDN 不会一开始把 100 万个全部复制过去。

而是:

第一次访问:

用户
 |
北京 CDN
 |
发现没有图片
 |
请求源站
 |
缓存图片
 |
返回用户

之后:

用户
 |
北京 CDN
 |
直接返回缓存

所以 CDN 节点里面存的是:

热门资源的副本,而不是完整复制整个网站。


3. CDN 如何决定删除哪些缓存?

CDN 节点容量有限。

例如一个节点:

硬盘容量:100TB

但是可能服务:

几十万个网站

所以它需要缓存淘汰策略。

最常见的是:

LRU(Least Recently Used)

最近最少使用:

例如缓存:

a.jpg  最近访问10000次
b.jpg  最近访问5000次
c.jpg  半年没人访问

空间不足:

删除:

c.jpg

保留:

a.jpg
b.jpg

4. 那 CDN 公司是不是需要巨大存储?

是的。

大型 CDN 公司拥有非常庞大的存储系统。

例如:

一个全球 CDN:

10000 个节点

每个节点:
几十 TB ~ 几 PB 存储

总容量:
EB 级别

(1 EB = 1024 PB)


5. 为什么不直接让用户访问源站?

因为网络距离影响很大。

假设:

源站:

美国

用户:

中国

访问:

用户
 |
跨境网络
 |
美国服务器

可能:

  • 延迟 200ms+
  • 丢包
  • 带宽受限

使用 CDN:

用户
 |
上海 CDN
 |
返回数据

延迟可能:

20ms

6. CDN 不只是存储,还做流量调度

很多人以为 CDN = 缓存服务器。其实 CDN 还有一个非常重要的部分:

智能调度

比如:用户(北京电信),CDN 判断:北京电信节点最好。返回:1.2.3.4。用户访问:北京节点, 而不是:广州节点,甚至:同一个域名:www.xxx.com,不同用户解析结果可能不同:

北京用户:

北京 CDN IP

美国用户:

美国 CDN IP

7. 一个很形象的比喻

把 CDN 看成连锁仓库:

厂家仓库(源站)
       |
       |
全国仓库(CDN)
       |
       |
消费者

厂家生产:

10000种商品

但是,北京仓库不会存全部商品。它可能存:

热门手机
热门电脑
热门零件

没人买的东西,不会占地方。


所以总结:

是的,CDN 会保存同一资源的多个副本,但通常是“按需缓存 + 热点缓存”,不是所有资源复制到所有节点。它通过增加存储成本,换取更低延迟、更高并发和更好的稳定性。

如果你理解了这一点,其实就已经接近理解 CDN 的核心设计思想了。你后面学习 Nginx 缓存、反向代理、Redis 缓存、分布式系统里的缓存层,会发现它们的思想非常类似。