CDN
Published in:2022-12-12 | category: 前端 浏览器

CDN 是什么

内容分发网络(Content delivery network 或 Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

为什么需要 CDN

根本上的原因是,访问速度对互联网应用的用户体验、口碑、甚至说直接的营收都有巨大的影响,任何的企业都渴望自己站点有更快的访问速度。而 HTTP 传输时延对 web 的访问速度的影响很大,在绝大多数情况下是起决定性作用的,这是由 TCP/IP 协议的一些特点决定的。物理层上的原因是光速有限、信道有限,协议上的原因有丢包、慢启动、拥塞控制等。
要提高访问速度,最简单的做法当然就是多设置几个服务器,让终端用户离服务器“更近”。典型的例子是各类下载网站在不同地域不同运营商设置镜像站,或者是像 Google 那样设置多个数据中心。但是多设几个服务器的问题也不少,一是多地部署时的困难,二是一致性没法保障,三则是管理困难、成本很高。实际上,在排除多地容灾等特殊需求的情况下,对大多数公司这种做法是不太可取的。当然,这种方案真正做好了,甚至是比后续所说的使用 CDN 要好的。
CDN 是一种公共服务,他本身有很多台位于不同地域、接入不同运营商的服务器,而所谓的使用 CDN 实质上就是让 CDN 作为网站的门面,用户访问到的是 CDN 服务器,而不是直接访问到网站。由于 CDN 内部对 TCP 的优化、对静态资源的缓存、预取,加上用户访问 CDN 时,会被智能地分配到最近的节点,降低大量延迟,让访问速度可以得到很大提升。
这样做有什么好处呢?

  1. 本地 Cache 加速,加快访问速度
  2. 镜像服务,消除运营商之间互联的瓶颈影响,保证不同网络的用户都能得到良好的访问质量
  3. 远程加速,自动选择 cache 服务器
  4. 带宽优化,分担网络流量,减轻压力,
  5. 集群抗攻击
  6. 节约成本

CDN 的原理

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

CDN 有个源站的概念,源站就是提供内容的站点(网站的真实服务器), 从源站取内容的过程叫做回源
每次访问的具体流程如图(以最普通的 CDN 为例)

具体举个例子:
用户在首次访问 https://assets-cdn.github.com/pinned-octocat.svg , 假设不委托 local DNS 服务器递归查询,会经历以下几个过程

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

可以看出 CDN 加速的原理很大部分是跟 DNS 挂钩在一起的,CDN 供应商几乎一定需要一个智能 DNS 服务器。CDN 可以拿到所有的明文数据,所以对数据安全性、保密性要求比较高的企业会选择自建 CDN 或者设置 NS 记录,指向自建的智能 DNS 服务器。
上述步骤每一步都可以缓存,注意是每一步! 所以 CDN 要清除缓存很难,因为有很多服务器上的缓存要清除。无论是用户对边缘服务器的请求,还是 CDN 服务器的回源都可以使用 https。
注意,实际环境中图中每个服务器都可以是集群,甚至 CDN 分区域中心和总中心。

文件更新的原理

用户访问使用了 CDN 技术的文件后,在多个环节都可能会产生缓存,比如用户的浏览器中、CDN 的边缘节点等。浏览器端的缓存一般通过过期时间来自动更新;而对于 CDN 节点上缓存的更新,一般是通过源站更新后,手动触发 CDN 的缓存删除操作。

使用 CDN (用 CDN 托管静态资源)

(使用 CDN,抛开无用的 cookie)
要知道,浏览器第一次打开页面的时候,浏览器缓存是起不了作任何用的;使用 CDN,效果就很明显。
CDN 缓存,也叫网关缓存、反向代理缓存。浏览器先向 CDN 网关发起 WEB 请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态地请求转发到合适的源服务器上。
通过在现有的 Internet 中增加一层新的 CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
cdn 从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。CDN 网络是在用户和服务器之间增加 Cache 层,主要是通过接管 DNS 实现,将用户的请求引导到 Cache 上获得源服务器的数据
使用了 CDN 缓存后的网站的访问过程变为:
image.png

  1. 用户输入访问的域名,操作系统向 LocalDns 查询域名的 ip 地址;
  2. LocalDns 向 ROOT DNS 查询域名的授权服务器(这里假设 LocalDns 缓存过期);
  3. ROOT DNS 将域名授权 dns 记录回应给 LocalDns,LocalDns 得到域名的授权 dns 记录后,继续向域名授权 dns 查询域名的 ip 地址;
  4. 域名授权 dns 查询域名记录后(一般是 CNAME),回应给 LocalDns,LocalDns 得到域名记录后,向智能调度 DNS 查询域名的 ip 地址;
  5. 智能调度 DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的 CDN 节点 ip 地址回应给 LocalDns,LocalDns 将得到的域名 ip 地址,回应给用户端,用户得到域名 ip 地址后,访问站点服务器;
  6. CDN 节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)

作者:renaesop
链接:https://github.com/renaesop/blog/issues/1
时间:2016-05-06
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Prev:
generator函数生成器及其实现
Next:
数据处理库