Skip to main content

CDN 内容分发网络

一、CDN 的定义​

1、为什么需要 CDN​

根本上的原因是,访问速度对互联网应用的用户体验、口碑、甚至说直接的营收都有巨大的影响,任何的企业都渴望自己站点有更快的访问速度。而 HTTP 传输时延对 web 的访问速度的影响很大,在绝大多数情况下是起决定性作用的,这是由 TCP/IP 协议的一些特点决定的。物理层上的原因是光速有限、信道有限,协议上的原因有丢包、慢启动、拥塞控制等。

要提高访问速度,最简单的做法当然就是多设置几个服务器,让终端用户离服务器更近。但存在部署困难、一致性没法保障、成本高等问题。

CDN 是一种公共服务,本身有很多台位于不同地域、接入不同运营商的服务器,而所谓的使用 CDN 实质上就是让 CDN 作为网站的门面,用户访问到的是 CDN 服务器,而非直接访问到网站。由于 CDN 内部对 TCP 的优化、对静态资源的缓存、预取,加上用户访问 CDN 时,会被智能地分配到最近的节点,降低大量延迟,让访问速度可以得到很大提升。

总的来说,CDN 的目的是解决因服务器性能带来的访问延迟问题,提高用户访问网站的响应速度和成功率。

2、什么是 CDN​

CDN(Content Delivery Network)即内容分发网络,利用最靠近每位用户的服务器,更快、更可靠地将请求的资源发给用户,节省用户访问的时间。

CDN = 更智能的镜像 + 流量引流 + 缓存

3、CDN 的缺点​

  • 实施复杂,投资大。
  • 大部分只对静态内容加速。

二、CDN 的原理​

CDN 做了两件事,一是让用户访问最近的节点,二是从缓存或提供内容的站点获取资源。

在访问没有应用 CDN 的资源地址时,输入域名访问某一个站点的过程为:

  1. 用户提交域名
  2. 浏览器对域名进行解释
  3. DNS 解析得到目的主机的 IP 地址
  4. 根据 IP 地址访问发出请求
  5. 得到请求数据并回复

当用户访问 CDN 的资源地址时,DNS 返回的不再是 IP 地址,而是一个 CNAME(Canonical Name)别名记录,指向 CDN 的全局负载均衡,过程如下:

首先会经过本地的 DNS 解析,请求 CNAME 指向的源站 DNS 服务器,DNS 服务器根据一系列的策略确定最适合的 CDN 节点,并将解析的 IP 地址转发给用户,用户再完成重定向。

CNAME 实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是 CDN 实现的关键。

举个例子:

用户在首次访问 https://xx-cdn.com/a.svg , 假设不委托 local DNS 服务器递归查询,会经历以下几个过程:

  1. 浏览器检查本地有没有这个资源的有效缓存,有则使用缓存,没有则进行对 xx-cdn.com 的 DNS 查询,获得一个 CNAME 记录 xx.map.net,多个加速域名可以解析到同一个 CNAME;
  2. 进行对 xx.map.net 的 DNS 查询,获得一个 A/AAAA 记录,给出地址 103.245.222.133, 这一步对 CDN 来说时十分重要的,它给出了离用户最近的边缘节点;
  3. 浏览器选一个返回的地址,然后进行真正的 HTTP 请求,开始向 103.245.222.133 握手,握手完了把 HTTP 请求头也发给了该边缘服务器;
  4. 边缘服务器检查自己的 cache 里面有没有 https://xx-cdn.com/a.svg 这个资源,有则返回给用户,如果没有,向 CDN 中心服务器发起请求;
  5. CDN 中心服务器检查自己的 cache 里面有没有这个资源,有则返回给边缘服务器,没有则回源;
  6. 中心服务器发现客户配置了 xx.map.net 的回源地址(这个只有 CDN 会知道,假设是 xxx.xxx.xxx.xxx),就把 HTTP 请求发到源站地址上,源站返回后返回给请求方;

可以看出 CDN 加速的原理很大部分是跟 DNS 挂钩在一起的,CDN 供应商几乎一定需要一个智能 DNS 服务器。CDN 可以拿到所有的明文数据,所以对数据安全性、保密性要求比较高的企业会选择自建 CDN 或者设置 NS 记录,指向自建的智能 DNS 服务器。

上述步骤每一步都可以缓存,注意是每一步,所以 CDN 要清除缓存很难,因为有很多服务器上的缓存要清除。无论是用户对边缘服务器的请求,还是 CDN 服务器的回源都可以使用 HTTPS。

注意,实际环境中图中每个服务器都可以是集群,甚至 CDN 分区域中心和总中心。

三、CDN 的应用​

1、网站加速​

站点或者应用中大量静态资源的加速分发,可以将站点内容进行动静分离,动态文件可以结合云服务器 ECS,静态资源如各类型 HTML、CSS、JS、图片、文件、短视频等,可以结合对象存储 OSS 存储海量静态资源,有效加速内容加载速度。

适用于:

  • 终端用户访问慢:网站小文件内容多打开速度太慢;
  • 跨区域访问质量差:终端用户分布在不同区域,不同区域的访问速度和质量高低不一;
  • 高并发压力大:运营推广期间,源站服务器压力大,容易挂掉,造成服务不可用;
  • 图片格式分辨率处理复杂:无法根据适合的终端情况进行图片压缩和优化。

2、超大文件下载​

网站或应用 App 的主要业务为大文件下载,例如:安装包文件 apk、音频文件 mp3、驱动程序 exe、应用更新文件 zip 等,平均单个文件大小在 20M 以上,如游戏、各类客户端下载和 App 下载商店等。

适用于:

  • 终端用户无法下载或者下载太慢;
  • 网络环境不稳定时,下载容易中断,重新下载会耗费额外的资源;
  • 网站内容不安全,容易被劫持;
  • 文件存储成本过高,同时对源站性能要求高。

四、常见的 CDN​

BootCDN:稳定、快速、免费的前端开源项目 CDN 加速服务