计算机网络
CDN
发布于 2026年7月31日
CDN(Content Delivery Network,内容分发网络)是一种通过将内容缓存到全球各地多个服务器节点,让用户从距离自己最近的服务器获取数据的技术,从而提高访问速度、降低延迟,并减轻源服务器压力。
举个简单例子
假设一个网站的服务器在北京:
- 北京用户访问网站,速度很快。
- 广州、成都、纽约的用户访问时,由于距离远、网络路径复杂,速度会变慢。
如果使用了 CDN:
源站(北京)
│
┌─────────┼─────────┐
│ │ │
上海CDN节点 广州CDN节点 新加坡CDN节点
│ │ │
上海用户 广州用户 东南亚用户
不同地区的用户会自动访问离自己最近的 CDN 节点,而不是直接访问北京的源站,因此网页、图片、视频等资源加载更快。
CDN 是如何工作的?
以访问一个网站图片为例:
- 用户打开网页。
- 浏览器请求图片资源。
- DNS 或 CDN 调度系统判断哪个节点离用户最近。
- 请求被发送到最近的 CDN 节点。
- 如果节点已经缓存了图片,就直接返回给用户(缓存命中)。
- 如果没有缓存(缓存未命中),CDN 会到源站获取图片,缓存到本地,再返回给用户。
流程如下:
用户
│
▼
CDN节点
│
├── 有缓存 → 直接返回
│
└── 无缓存
│
▼
源站服务器
│
▼
返回内容并缓存
CDN 可以缓存哪些内容?
通常适合缓存静态资源,例如:
- 图片(jpg、png、webp)
- CSS
- JavaScript
- 视频
- 音频
- 字体文件
有些 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 缓存、分布式系统里的缓存层,会发现它们的思想非常类似。