关注「前端向后」微信公众号,你将收获一系列「用心原创」的高质量技术文章,主题包括但不限于前端、Node.js以及服务端技术
一.概念
CDN(Content Delivery Network,内容分发网络)是由分布在不同地理位置的代理服务器及其数据中心组成的网络:
A content delivery network or content distribution network (CDN) is a geographically distributed network of proxy servers and their data centers.
希望在空间距离上为用户就近提供服务,以提高可用性和性能:
The goal is to provide high availability and high performance by distributing the service spatially relative to end-users.
P.S.空间距离体现在网络传输上就是跳数(hop),从客户端到服务器所经过的跳数越多,距离越远,一般延迟也越大
二.作用
CDN 一般用来托管 Web 资源(包括文本、图像和脚本),可供下载的资源(媒体文件、软件、文档等),应用程序(电子商务、门户网站等),以及流媒体和社交媒体网站,加速这些资源的访问
性能方面,引入 CDN 的作用在于:
- 用户收到的内容来自最近的数据中心,延迟更低,内容加载更快
- 部分资源请求被外包给了 CDN,减少了服务器负载
一方面缩短了内容与最终用户之间的距离,另一方面,内容不直接从服务器获取,节省了服务器的计算资源,分担了源站压力
安全性上,CDN 有助于防御 DDoS、MITM 等网络攻击:
- DDoS(Distributed Denial of Service):通过监控分析异常流量,限制其请求频率
- MITM(Man-In-The-Middle):从源服务器到 CDN 节点到 ISP(Internet Service Provider),全链路 HTTPS 通信
此外,作为一种基础的云服务(IaaS),CDN 同样具有资源托管、按需扩展(能够应对流量高峰)等方面的优势:
This reduces content providers’ infrastructure requirements, and lets them deploy or expand services more quickly and easily.
P.S.关于 IaaS、PaaS、SaaS 的更多信息,见IaaS-PaaS-SaaS 定义
三.结构
拓扑结构上,CDN 分为分散式(Scattered CDN)和整合式(Consolidated CDN)两种
Scattered CDN
在世界各地部署尽可能多的服务器,称为分散式 CDN:
Scattered CDNs aim to have as many servers scattered around the world as possible.
早期的 CDN 用大量的中低性能服务器密集地填满选定的地理区域,这些小节点易于部署,尤其适用于低连接性(low-connectivity)的区域
随着全球连接性的不断提高,缩减物理距离的收益逐渐减少,大量节点的维护成本也凸现出来,于是出现了整合式 CDN
Consolidated CDN
整合式 CDN 只在主要的数据中心有少量节点,但节点性能更强大,包括网络、吞吐量以及抗 DDoS 的能力:
Consolidated CDNs have fewer points, but bigger ones built for network performance, throughput, and DDoS resistance.
这种集中式的结构有助于提升整体响应能力,为用户和网络运营商提供更多的控制,但部署相对复杂,而且在低连接性区域效果较差
四.分类
CDN 按内容分发方式分为 Push CDN 与 Pull CDN
前者由内容服务器提前把内容“推”到 CDN 缓存起来,后者在用户访问内容时 CDN 才去“拉”目标资源并缓存起来
Push CDN
每次内容发生变化时,都把新内容上传到 Push CDN。由于只需要上传新增的内容和发生变化的内容,用于传输的流量相对较少,但要存储的内容相对较多
因此,Push CDN 适用于小流量,或内容更新不频繁的站点,内容一次性放到 CDN,无需周期性地重新拉取。如果流量负担本就很重,或者内容改动频繁,Push CDN 会给服务器带来额外的压力
Pull CDN
Pull CDN 无需手动上传,在用户首次访问时自动从服务器拉取新内容,并缓存起来。按需缓存节省了 CDN 存储空间,但在文件过期或在未发生变化时重新拉取也会造成不必要的流量开销
因此,Pull CDN 适用于大流量站点,只缓存最近使用(最受欢迎)的内容,一旦配置好就能按需缓存内容,维护成本较低
五.原理
涉及几个术语:
- 源服务器(Origin server):提供内容(数据)源的服务器
- 边缘服务器(Edge server):用来缓存来自源服务器的内容的服务器
- 入网点(Point of Presence,PoP):边缘服务器所在的物理位置,一个入网点可能存在多个边缘服务器
- CDN 反向代理(CDN Reverse Proxy):将用户请求转发到源服务器,并缓存来自源服务器的响应,用于 Pull CDN
- 回源(Back-to-source):CDN 节点未缓存请求资源或缓存资源已到期时,回源站获取资源,返回给客户端
工作原理
以 Pull CDN 为例,特定地区的用户首次访问资源时,从源服务器取,内容响应给用户之后,资源会被缓存在该地区的边缘服务器上,如果同一地区的用户再次请求相同资源,则从边缘服务器响应:
P.S.可以通过响应头的特定字段来区分内容响应来自源服务器还是 CDN 缓存,例如:
X-Cache: HIT
:命中缓存,响应内容来自 CDN 缓存X-Cache: MISS
:未命中缓存,响应内容来自源服务器
实现原理
实现上,将子域名的解析权通过CNAME 记录交给 CDN,接着通过基于地理位置临近程度的路由策略,将请求映射到距用户最近的边缘服务器:
对于 Push CDN,边缘服务器仅提供缓存服务,未命中缓存就返回 404,而对于 Pull CDN,边缘服务器提供反向代理服务,未命中缓存时回源去取
参考资料
- Content delivery network
- Globally distributed content delivery
- In the world of cloud computing, where does CDN services fall: IAAS, PAAS or SAAS?
- The Differences Between Push And Pull CDNs
- Understanding CDNs: Four Pillars and Deployment Topology