Skip to content

CDN(内容分发网络)

CDN 的全称是 Content Delivery Network(内容分发网络)。如果说 DNS 是互联网的电话簿,那么 CDN 就是互联网的**“全球快递系统”**。

CDN 的核心思想是:“就近原则”。它将你网站上的内容(如图片、视频、JS/CSS 文件)复制并缓存到全球各地的“边缘节点”(缓存服务器)上。当用户访问网站时,系统会自动分配离该用户物理距离最近、网络状态最好的节点来提供服务。

1. CDN 的核心组件与原理

从技术实现的角度来看,CDN 系统主要由三个核心部分协同工作:

  1. 分布式缓存节点 (Edge Nodes):这是 CDN 的物理基础,遍布全球的机房中。它们负责存储网站内容的副本,并直接响应最终用户的请求。
  2. 智能路由与调度系统 (Global Server Load Balancing, GSLB):这是 CDN 的大脑。它通过分析用户的 IP 地址(通常是用户的 Local DNS IP)、网络拥堵情况、各节点的负载状态,实时计算并为用户分配一个最优的边缘节点
  3. 回源机制 (Origin Pull):这是 CDN 与源站(你自己的服务器)之间的纽带。当用户请求的内容在边缘节点上不存在(未缓存)或已过期时,节点会主动向源站请求最新的内容,并将其缓存下来,以便后续用户访问。

2. CDN 加速的详细步骤(工作流程)

假设你的网站 www.example.com 接入了 CDN,用户在浏览器中输入这个网址,完整的请求流程如下:

  1. 用户发起请求:浏览器尝试解析 www.example.com 的 IP 地址。
  2. CNAME 引导:因为你接入了 CDN,你在域名的 DNS 设置中,将 www.example.com 的 A 记录改成了 CNAME 记录,指向了 CDN 服务商提供的一个域名(如 example.cdnprovider.com)。
  3. 智能 DNS 调度:用户的 Local DNS 向 CDN 提供商的智能 DNS(GSLB)发起解析请求。GSLB 根据用户的地理位置、网络运营商(ISP)等信息,挑选一个离该用户最近、负载最轻的 CDN 节点 IP,并将其返回给用户的浏览器。
  4. 就近访问:浏览器拿到 CDN 节点的 IP 后,直接向该节点发起 HTTP 请求。
  5. 节点处理请求(分两种情况)
    • 缓存命中 (Cache Hit):如果该节点上已经缓存了用户请求的文件(例如一张热门图片),节点会直接将文件返回给用户。此时,请求根本没有到达你的源站服务器,速度极快。
    • 缓存未命中 (Cache Miss) / 回源 (Origin Pull):如果该节点上没有这个文件,或者文件已过期,节点就会向你的源站服务器 (Origin Server) 发起请求,获取最新的文件。节点拿到文件后,一边将其返回给用户,一边存入自己的缓存中,以备下一次请求。

3. 全站加速(静态加速 vs 动态加速)

现代 CDN 不仅仅能缓存静态文件,还发展出了全站加速技术:

  • 静态内容加速:针对图片、CSS、JS 文件、视频等不经常变动的内容。原理就是上面提到的缓存。这是 CDN 最基础、最强大的功能。
  • 动态内容加速:针对 HTML 页面、API 接口(如登录请求、获取购物车信息)等因人而异、实时变化的内容。这些内容不能被缓存(因为每个人的数据不同)。CDN 加速动态内容的原理是智能路由优化协议优化。CDN 节点虽然不缓存内容,但它会利用 CDN 提供商内部的优质私有专线,避开公网的拥堵路段,以最快、最稳定的路径将请求转发给源站,并将响应送回给用户。

4. CDN 的核心优势

  • 极速的用户体验:大幅降低网络延迟,网页秒开,视频不卡顿。
  • 降低源站压力与带宽成本:CDN 替源站挡住了 80%~90% 以上的静态资源请求,源站服务器的 CPU 和带宽压力骤减,通常能节省大量服务器成本。
  • 高可用性与负载均衡:即使某个 CDN 节点宕机,智能路由也会自动将流量切换到其他健康节点。
  • 安全防护 (缓解 DDoS 攻击):CDN 拥有海量的带宽储备和分布式的架构。当面临 DDoS 攻击(如海量的恶意垃圾流量)时,这些流量会被分散到全球的 CDN 节点上消化掉,从而保护了脆弱的源站服务器免受崩溃。许多 CDN(如 Cloudflare、阿里云)还内置了 WAF(Web 应用防火墙)功能。

5. 常见问题 (FAQ) 与面试题

5.1 什么是 CDN 的“命中率”?为什么命中率低?

  • 命中率:指用户请求的内容直接由 CDN 节点响应(未回源)的次数占总请求次数的比例。命中率越高,说明 CDN 效果越好。
  • 命中率低的原因
    • 缓存配置错误(如设置了不缓存、或者缓存过期时间 max-age 设置得太短)。
    • 大量用户访问了冷门资源(节点上没有)。
    • URL 中带有随机参数(如 ?t=12345),导致 CDN 认为每次都是新请求而频繁回源(可以在 CDN 控制台开启“忽略参数”功能)。
    • 刚刷新了 CDN 缓存。

5.2 前端发版了新代码,用户看到的还是旧页面,怎么办?(CDN 缓存刷新)

因为新代码被缓存在了 CDN 节点上且未过期。解决方法有:

  • 最佳实践(工程化):前端打包时,给静态文件名加上哈希值(如 app.v1a2b.js)。发版后文件名变了,浏览器和 CDN 就会去请求新文件,旧文件自然失效。
  • 手动刷新/预热:登录 CDN 提供商的控制台,手动提交需要**清除缓存(Purge/Refresh)**的 URL 或目录。CDN 会强制全网节点删除旧副本。

5.3 CNAME 记录在 CDN 中起什么作用?

CNAME(别名记录)是接入 CDN 的关键一步。它将你自己的域名(如 www.test.com)指向了 CDN 厂商分配给你的调度域名(如 test.cdn.aliyun.com)。这样,当用户解析你的域名时,DNS 请求就会被“转交”给 CDN 的智能调度系统,由它来分配最优的节点 IP。

5.4 什么是“第一公里”问题?

在互联网术语中,“第一公里”是指服务器连接到互联网骨干网的这一段链路。由于带宽限制或跨网互联(如电信访问联通服务器),这通常是网络传输中最容易出现瓶颈的地方。CDN 通过在全球部署节点,把内容推送到离用户最近的“最后一公里”,从而完美绕过了“第一公里”的拥堵。

5.5 CDN 和负载均衡(Load Balancer, LB)有什么区别?

两者都用于分发流量,但场景和层级不同:

  • CDN:是广域网(全球/全国)级别的分发。通过地理位置分布缓存内容,解决物理距离带来的延迟问题。
  • 负载均衡 (LB):通常是局域网/数据中心级别的分发。在源站机房内部,将请求均匀地分配给后端的 10 台或 100 台服务器,解决单台服务器算力不足的问题。两者经常结合使用(CDN 负责边缘,LB 负责源站核心)。