CDN 是什么
内容分发网络(Content delivery network 或 Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
为什么需要 CDN
根本上的原因是,访问速度对互联网应用的用户体验、口碑、甚至说直接的营收都有巨大的影响,任何的企业都渴望自己站点有更快的访问速度。而 HTTP 传输时延对 web 的访问速度的影响很大,在绝大多数情况下是起决定性作用的,这是由 TCP/IP 协议的一些特点决定的。物理层上的原因是光速有限、信道有限,协议上的原因有丢包、慢启动、拥塞控制等。
要提高访问速度,最简单的做法当然就是多设置几个服务器,让终端用户离服务器“更近”。典型的例子是各类下载网站在不同地域不同运营商设置镜像站,或者是像 Google 那样设置多个数据中心。但是多设几个服务器的问题也不少,一是多地部署时的困难,二是一致性没法保障,三则是管理困难、成本很高。实际上,在排除多地容灾等特殊需求的情况下,对大多数公司这种做法是不太可取的。当然,这种方案真正做好了,甚至是比后续所说的使用 CDN 要好的。
CDN 是一种公共服务,他本身有很多台位于不同地域、接入不同运营商的服务器,而所谓的使用 CDN 实质上就是让 CDN 作为网站的门面,用户访问到的是 CDN 服务器,而不是直接访问到网站。由于 CDN 内部对 TCP 的优化、对静态资源的缓存、预取,加上用户访问 CDN 时,会被智能地分配到最近的节点,降低大量延迟,让访问速度可以得到很大提升。
这样做有什么好处呢?
- 本地 Cache 加速,加快访问速度
- 镜像服务,消除运营商之间互联的瓶颈影响,保证不同网络的用户都能得到良好的访问质量
- 远程加速,自动选择 cache 服务器
- 带宽优化,分担网络流量,减轻压力,
- 集群抗攻击
- 节约成本
CDN 的原理
CDN 做了两件事,一是让用户访问最近的节点,二是从缓存或者源站获取资源
CDN 有个源站的概念,源站就是提供内容的站点(网站的真实服务器), 从源站取内容的过程叫做回源。
每次访问的具体流程如图(以最普通的 CDN 为例)![]()
具体举个例子:
用户在首次访问 https://assets-cdn.github.com/pinned-octocat.svg , 假设不委托 local DNS 服务器递归查询,会经历以下几个过程
- 浏览器检查本地有没有这个东东的有效缓存,有则使用缓存,没有有效缓存则进行对
assets-cdn.github.com的 DNS 查询,获得一个 CNAME 记录,igithub.map.fastly.net,值得注意的是,多个加速域名可以解析到同一个 CNAME,CDN 回源和缓存的时候考虑到了 hostname,👍; - 进行对
github.map.fastly.net的 DNS 查询,获得一个 A/AAAA 记录,给出地址103.245.222.133(视网站不同返回的不一样,可以有多个), 这一步对 CDN 来说时十分重要的,它给出了离用户最近的边缘节点; - 浏览器选一个返回的地址,然后进行真正的 http 请求,开始向
103.245.222.133握手,握手完了把 http 请求头也发给了该边缘服务器; - 边缘服务器检查自己的 cache 里面有没有
[https://assets-cdn.github.com/pinned-octocat.svg](https://assets-cdn.github.com/pinned-octocat.svg)这个资源,有则返回给用户,如果没有,向 CDN 中心服务器发起请求; - CDN 中心服务器检查自己的 cache 里面有没有这个资源,有则返回给边缘服务器,没有则回源;
- 中心服务器发现客户配置了
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 缓存后的网站的访问过程变为:![]()
- 用户输入访问的域名,操作系统向 LocalDns 查询域名的 ip 地址;
- LocalDns 向 ROOT DNS 查询域名的授权服务器(这里假设 LocalDns 缓存过期);
- ROOT DNS 将域名授权 dns 记录回应给 LocalDns,LocalDns 得到域名的授权 dns 记录后,继续向域名授权 dns 查询域名的 ip 地址;
- 域名授权 dns 查询域名记录后(一般是 CNAME),回应给 LocalDns,LocalDns 得到域名记录后,向智能调度 DNS 查询域名的 ip 地址;
- 智能调度 DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的 CDN 节点 ip 地址回应给 LocalDns,LocalDns 将得到的域名 ip 地址,回应给用户端,用户得到域名 ip 地址后,访问站点服务器;
- CDN 节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)
作者:renaesop
链接:https://github.com/renaesop/blog/issues/1
时间:2016-05-06
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。