CDN(内容分发网络)技术原理
编者注:本文为历史博文归档;涉及 JDK、框架与工具链版本请以当前官方文档为准。引用外链图片可能失效,阅读时请注意时效性。
前言
Internet 的高速发展给人们的工作和生活带来了极大的便利,但随着用户数量不断增加,对服务品质和访问速度的要求也越来越高。虽然带宽不断增加,但受 Web 服务器负荷和传输距离等因素影响,响应速度慢的问题仍然经常困扰用户。
解决方案是在网络传输上利用缓存技术,使得 Web 服务数据流能就近访问。这是优化网络数据传输非常有效的技术,能够获得高速的体验和品质保证。
网络缓存技术的目的是减少网络中冗余数据的重复传输,将广域传输转为本地或就近访问。互联网上传递的内容大部分为重复的 Web/FTP 数据,Cache 服务器及应用 Caching 技术的网络设备可大大优化数据链路性能,消除数据峰值访问造成的结点设备阻塞。
Cache 服务器具有缓存功能,大部分网页对象(Web page object),如 .html, .htm, .php 等页面文件,.gif, .tif, .png, .bmp 等图片文件,以及其他格式的文件,在有效期(TTL)内对于重复的访问,不必从原始网站重新传送文件实体。只需通过简单的认证(Freshness Validation)——传送几十字节的 Header,即可将本地的副本直接传送给访问者。由于缓存服务器通常部署在靠近用户端,所以能获得近似局域网的响应速度,并有效减少广域带宽的消耗。
据统计,Internet 上超过 80% 的用户重复访问 20% 的信息资源,这给缓存技术的应用提供了先决条件。缓存服务器的体系结构与 Web 服务器不同,能获得更高的性能。缓存服务器不仅能提高响应速度、节约带宽,对于加速 Web 服务器、有效减轻源服务器的负荷也是非常有效的。
高速缓存服务器(Cache Server)是软硬件高度集成的专业功能服务器,主要做高速缓存加速服务,一般部署在网络边缘。根据加速对象不同,分为客户端加速和服务器加速:
- 客户端加速:Cache 部署在网络出口处,把常访问的内容缓存在本地,提高响应速度和节约带宽。
- 服务器加速:Cache 部署在服务器前端,作为 Web 服务器的前置机,提高 Web 服务器的性能,加速访问速度。
如果多台 Cache 加速服务器分布在不同地域,需要通过有效机制管理 Cache 网络,引导用户就近访问,全局负载均衡流量,这就是 CDN 内容分发网络的基本思想。
什么是 CDN?
CDN 的全称是 Content Delivery Network,即内容分发网络。其目的是通过在现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,解决 Internet 网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因造成的响应速度慢问题。
狭义地讲,内容分发网络 (CDN) 是一种新型的网络构建方式,它是为能在传统的 IP 网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN 代表了一种基于质量与秩序的网络服务模式。
简单地说,内容分发网络 (CDN) 是一个经策略性部署的整体系统,包括以下 4 个要件:
- 分布式存储
- 负载均衡
- 网络请求的重定向
- 内容管理
其中,内容管理和全局的网络流量管理 (Traffic Management) 是 CDN 的核心所在。通过用户就近性和服务器负载的判断,CDN 确保内容以一种极为高效的方式为用户的请求提供服务。
总的来说,内容服务基于缓存服务器,也称作代理缓存 (Surrogate),它位于网络的边缘,距用户仅有“一跳”(Single Hop) 之遥。同时,代理缓存是内容提供商源服务器(通常位于 CDN 服务提供商的数据中心)的一个透明镜像。这样的架构使得 CDN 服务提供商能够代表客户(即内容供应商),向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。
据统计,采用 CDN 技术能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。
与目前现有的内容发布模式相比较,CDN 强调了网络在内容发布中的重要性。通过引入主动的内容管理层和全局负载均衡,CDN 从根本上区别于传统的内容发布模式。在传统的内容发布模式中,内容的发布由 ICP 的应用服务器完成,而网络只表现为一个透明的数据传输通道。这种透明性表现在网络的质量保证仅仅停留在数据包的层面,而不能根据内容对象的不同区分服务质量。此外,由于 IP 网的“尽力而为”的特性,其质量保证是依靠在用户和应用服务器之间端到端地提供充分的、远大于实际所需的带宽通量来实现的。
在这样的内容发布模式下,不仅大量宝贵的骨干带宽被占用,同时 ICP 的应用服务器的负载也变得非常重,而且不可预计。当发生热点事件和出现浪涌流量时,会产生局部热点效应,从而使应用服务器过载退出服务。这种基于中心的应用服务器的内容发布模式的另外一个缺陷在于个性化服务的缺失和对宽带服务价值链的扭曲,内容提供商承担了他们不该干也干不好的内容发布服务。
纵观整个宽带服务的价值链,内容提供商和用户位于整个价值链的两端,中间依靠网络服务提供商将其串接起来。随着互联网工业的成熟和商业模式的变革,在这条价值链上的角色越来越多也越来越细分,比如内容/应用的运营商、托管服务提供商、骨干网络服务提供商、接入服务提供商等等。在这一条价值链上的每一个角色都要分工合作、各司其职才能为客户提供良好的服务,从而带来多赢的局面。
从内容与网络的结合模式上看,内容的发布已经走过了 ICP 的内容(应用)服务器和 IDC 这两个阶段。IDC 的热潮也催生了托管服务提供商这一角色。但是,IDC 并不能解决内容的有效发布问题。内容位于网络的中心并不能解决骨干带宽的占用和建立 IP 网络上的流量秩序。因此,将内容推到网络的边缘,为用户提供就近性的边缘服务,从而保证服务的质量和整个网络上的访问秩序就成了一种显而易见的选择。而这就是内容分发网 (CDN) 服务模式。CDN 的建立解决了困扰内容运营商的内容“集中与分散”的两难选择,无疑对于构建良好的互联网价值链是有价值的,也是不可或缺的。
CDN 的应用场景与客户
目前的 CDN 服务主要应用于证券、金融保险、ISP、ICP、网上交易、门户网站、大中型公司、网络教学等领域。另外在行业专网、互联网中都可以用到,甚至可以对局域网进行网络优化。
利用 CDN,这些网站无需投资昂贵的各类服务器、设立分站点。特别是流媒体信息的广泛应用、远程教学课件等消耗带宽资源多的媒体信息,应用 CDN 网络,把内容复制到网络的最边缘,使内容请求点和交付点之间的距离缩至最小,从而促进 Web 站点性能的提高,具有重要的意义。
CDN 网络的建设主要有以下几种模式:
- 企业建设的 CDN 网络:为企业服务。
- IDC 的 CDN 网络:主要服务于 IDC 和增值服务。
- 网络运营商主建的 CDN 网络:主要提供内容推送服务。
- CDN 网络服务商:专门建设的 CDN 用于做服务,用户通过与 CDN 机构进行合作,CDN 负责信息传递工作,保证信息正常传输,维护传送网络,而网站只需要内容维护,不再需要考虑流量问题。
CDN 能够为网络的快速、安全、稳定、可扩展等方面提供保障。
IDC 建立 CDN 网络:IDC 运营商一般需要有分部各地的多个 IDC 中心,服务对象是托管在 IDC 中心的客户,利用现有的网络资源,投资较少,容易建设。例如某 IDC 全国有 10 个机房,加入 IDC 的 CDN 网络,托管在一个节点的 Web 服务器,相当于有了 10 个镜像服务器,就近供客户访问。
宽带城域网:域内网络速度很快,出城带宽一般就会瓶颈。为了体现城域网的高速体验,解决方案就是将 Internet 网上内容高速缓存到本地,将 Cache 部署在城域网各 POP 点上,这样形成高效有序的网络,用户仅一跳就能访问大部分的内容,这也是一种加速所有网站 CDN 的应用。
CDN 的工作原理
在描述 CDN 的实现原理之前,让我们先看传统的未加缓存服务的访问过程,以便了解 CDN 缓存访问方式与未加缓存访问方式的差别:

由上图可见,用户访问未使用 CDN 缓存网站的过程为:
- 用户向浏览器提供要访问的域名;
- 浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的 IP 地址;
- 浏览器使用所得到的 IP 地址,向域名的服务主机发出数据访问请求;
- 浏览器根据域名主机返回的数据显示网页的内容。
通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。CDN 网络是在用户和服务器之间增加 Cache 层,如何将用户的请求引导到 Cache 上获得源服务器的数据,主要是通过接管 DNS 实现。下面让我们看看访问使用 CDN 缓存后的网站的过程:

通过上图,我们可以了解到,使用了 CDN 缓存后的网站的访问过程变为:
- 用户向浏览器提供要访问的域名;
- 浏览器调用域名解析库对域名进行解析。由于 CDN 对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的 CNAME 记录。为了得到实际 IP 地址,浏览器需要再次对获得的 CNAME 域名进行解析以得到实际的 IP 地址;在此过程中,使用的全局负载均衡 DNS 解析,如根据地理位置信息解析对应的 IP 地址,使得用户能就近访问。
- 此次解析得到 CDN 缓存服务器的 IP 地址,浏览器在得到实际的 IP 地址以后,向缓存服务器发出访问请求;
- 缓存服务器根据浏览器提供的要访问的域名,通过 Cache 内部专用 DNS 解析得到此域名的实际 IP 地址,再由缓存服务器向此实际 IP 地址提交访问请求;
- 缓存服务器从实际 IP 地址得到内容以后,一方面在本地进行保存以备以后使用,另一方面把获取的数据返回给客户端,完成数据服务过程;
- 客户端得到由缓存服务器返回的数据以后显示出来,并完成整个浏览的数据请求过程。
通过以上的分析我们可以得到,为了实现既要对普通用户透明(即加入缓存以后用户客户端无需进行任何设置,直接使用被加速网站原有的域名即可访问),又要在为指定的网站提供加速服务的同时降低对 ICP 的影响,只要修改整个访问过程中的域名解析部分,以实现透明的加速服务。下面是 CDN 网络实现的具体操作过程:
- 作为 ICP,只需要把域名解释权交给 CDN 运营商,其他方面不需要进行任何的修改;操作时,ICP 修改自己域名的解析记录,一般用 CNAME 方式指向 CDN 网络 Cache 服务器的地址。
- 作为 CDN 运营商,首先需要为 ICP 的域名提供公开的解析。为了实现 Sortlist,一般是把 ICP 的域名解释结果指向一个 CNAME 记录。
- 当需要进行 Sortlist 时,CDN 运营商可以利用 DNS 对 CNAME 指向的域名解析过程进行特殊处理,使 DNS 服务器在接收到客户端请求时可以根据客户端的 IP 地址,返回相同域名的不同 IP 地址。
- 由于从 CNAME 获得的 IP 地址并且带有 Hostname 信息,请求到达 Cache 之后,Cache 必须知道源服务器的 IP 地址。所以在 CDN 运营商内部维护一个内部 DNS 服务器,用于解释用户所访问的域名的真实 IP 地址。
- 在维护内部 DNS 服务器时,还需要维护一台授权服务器,控制哪些域名可以进行缓存,而哪些又不进行缓存,以免发生开放代理的情况。
CDN 的技术手段
实现 CDN 的主要技术手段是高速缓存、镜像服务器。可工作于 DNS 解析或 HTTP 重定向两种方式,通过 Cache 服务器,或异地的镜像站点完成内容的传送与同步更新。
- DNS 方式:用户位置判断准确率大于 85%。
- HTTP 方式:准确率为 99% 以上。
一般情况下,各 Cache 服务器群的用户访问流入数据量与 Cache 服务器到原始网站取内容的数据量之比在 2:1 到 3:1 之间,即分担 50% 到 70% 的到原始网站重复访问数据量(主要是图片、流媒体文件等内容);对于镜像,除数据同步的流量,其余均在本地完成,不访问原始服务器。
镜像站点(Mirror Site) 服务器是我们经常可以看到的,它让内容直截了当地进行分布,适用于静态和准动态的数据同步。但是购买和维护新服务器的费用较高,另外还必须在各个地区设置镜像服务器,配备专业技术人员进行管理与维护。大型网站在随时更新各地服务器的同时,对带宽的需求也会显著增加,因此一般的互联网公司不会建立太多的镜像服务器。
高速缓存手段的成本较低,适用于静态内容。Internet 的统计表明,超过 80% 的用户经常访问的是 20% 的网站的内容。在这个规律下,缓存服务器可以处理大部分客户的静态请求,而原始的 WWW 服务器只需处理约 20% 左右的非缓存请求和动态请求,于是大大加快了客户请求的响应时间,并降低了原始 WWW 服务器的负载。根据美国 IDC 公司的调查,作为 CDN 的一项重要指标——缓存的市场正在以每年近 100% 的速度增长,全球的营业额在 2004 年将达到 45 亿美元。网络流媒体的发展还将刺激这个市场的需求。
CDN 的网络架构
CDN 网络架构主要由两大部分组成,分为中心和边缘两部分:
- 中心:指 CDN 网管中心和 DNS 重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房。
- 边缘:主要指异地节点,CDN 分发的载体,主要由 Cache 和负载均衡器等组成。
当用户访问加入 CDN 服务的网站时,域名解析请求将最终交给全局负载均衡 DNS 进行处理。全局负载均衡 DNS 通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户能够得到快速的服务。同时,它还与分布在世界各地的所有 CDN 节点保持通信,搜集各节点的通信状态,确保不将用户的请求分配到不可用的 CDN 节点上,实际上是通过 DNS 做全局负载均衡。
对于普通的 Internet 用户来讲,每个 CDN 节点就相当于一个放置在它周围的 Web。通过全局负载均衡 DNS 的控制,用户的请求被透明地指向离他最近的节点,节点中 CDN 服务器会像网站的原始服务器一样,响应用户的请求。由于它离用户更近,因而响应时间必然更快。
每个 CDN 节点由两部分组成:
- 负载均衡设备:负责每个节点中各个 Cache 的负载均衡,保证节点的工作效率;同时,负载均衡设备还负责收集节点与周围环境的信息,保持与全局负载 DNS 的通信,实现整个系统的负载均衡。
- 高速缓存服务器(Cache):负责存储客户网站的大量信息,就像一个靠近用户的网站服务器一样响应本地用户的访问请求。
CDN 的管理系统是整个系统能够正常运转的保证。它不仅能对系统中的各个子系统和设备进行实时监控,对各种故障产生相应的告警,还可以实时监测到系统中总的流量和各节点的流量,并保存在系统的数据库中,使网管人员能够方便地进行进一步分析。通过完善的网管系统,用户可以对系统配置进行修改。
理论上,最简单的 CDN 网络有一个负责全局负载均衡的 DNS 和各节点一台 Cache,即可运行。DNS 支持根据用户源 IP 地址解析不同的 IP,实现就近访问。为了保证高可用性等,需要监视各节点的流量、健康状况等。一个节点的单台 Cache 承载数量不够时,才需要多台 Cache;多台 Cache 同时工作,才需要负载均衡器,使 Cache 群协同工作。
CDN 配置示例
商业化的 CDN 网络是用于服务性质的,高可用性等要求非常高,有专业产品和 CDN 网络解决方案。本文主要从理论角度,理解 CDN 的实现过程,并利用已有网络环境和开源软件做实际配置,更深刻理解 CDN 的具体工作过程。
Linux 是开放源代码的免费操作系统,已经成功应用于许多关键领域。Bind 是 Unix/FreeBSD/Linux 等类 Unix 平台上非常有名的 DNS 服务程序,Internet 上超过 60%的 DNS 运行的是 Bind。Bind 的最新版本是 9.x,用的比较多的是 8.x。Bind 9 有很多新特性,其中一项是根据用户端源地址对同一域名解析不同的 IP 地址。有了这种特性,能把用户对同一域名的访问,引导到不同地域节点的服务器上去访问。Squid 是 Linux 等操作系统上有名的 Cache 引擎,与商业 Cache 引擎相比,Squid 的性能比较低,基本功能工作原理与商业 Cache 产品是一致的,作为试验,是非常容易配置运行起来。以下简要介绍 CDN 的配置流程。
域名解析权移交
要加入 CDN 服务的网站,需要域名(如www.linuxaid.com.cn, 地址202.99.11.120)解析权提供给 CDN 运营商。Linuxaid 的域名解析记录只要把www主机的 A 记录改为 CNAME 并指向cache.cdn.com即可。cache.cdn.com是 CDN 网络自定义的缓存服务器的标识。在/var/named/linuxaid.com.cn域名解析记录中,由:www IN A 202.99.11.120改为:
www IN CNAME cache.cdn.com.CDN 运营商解析配置
CDN 运营商得到域名解析权以后,得到域名的 CNAME 记录,指向 CDN 网络属下缓存服务器的域名,如cache.cdn.com。CDN 网络的全局负载均衡 DNS,需要把 CNAME 记录根据策略解析出 IP 地址,一般是给出就近访问的 Cache 地址。Bind 9 的基本功能可以根据不同的源 IP 地址段解析对应的 IP,实现根据地域就近访问的负载均衡,一般可以通过 Bind 9 的
sortlist选项实现根据用户端 IP 地址返回最近的节点 IP 地址。具体的过程为:1) 为
cache.cdn.com设置多个 A 记录,/var/named/cdn.com的内容如下:$TTL 3600 @ IN SOA ns.cdn.com. root.ns.cdn.com. ( 2002090201 ;Serial num 10800 ;Refresh after 3 hours 3600 ;Retry 604800 ;Expire 1800 ;Time to live ) IN NS ns www IN A 210.33.21.168 ns IN A 202.96.128.68 cache IN A 202.93.22.13 ; 有多少个 CACHE 地址 cache IN A 210.21.30.90 ; 就有多少个 CACHE 的 A 记录 cache IN A 211.99.13.472)
/etc/named.conf中的内容为:options { directory "/var/named"; sortlist { # 这一段表示当在本地执行查询时 # 将按照 202.93.22.13,210.21.30.90,211.99.13.47 的顺序返回地址 { localhost; { localnets; 202.93.22.13; { 210.21.30.90; 211.99.13.47; }; }; }; # 这一段表示当在 202/8 地址段进行 DNS 查询时 # 将按照 202.93.22.13,210.21.30.90,211.99.13.47 的顺序返回地址 { 202/8; { 202.93.22.13; { 210.21.30.90; 211.99.13.47; }; }; }; # 这一段表示当在 211/8 地址段进行 DNS 查询时 # 将按照 211.99.13.47,202.93.22.13,210.21.30.90 的顺序返回地址, # 也就是 211.99.13.47 是最靠近查询地点的节点 { 211/8; { 211.99.13.47; { 202.93.22.13; 210.21.30.90; }; }; }; { 61/8; { 202.93.22.13; { 210.21.30.90; 211.99.13.47; }; }; }; }; }; zone "." { type hint; file "root.cache"; }; zone "localhost" { type master; file "localhost"; }; zone "cdn.com" { type master; file "cdn.com"; };- Cache 工作模式
Cache 在 CDN 网络中如果工作在服务器加速模式,因为配置里已经写明加速服务器的 URL,所以 Cache 直接匹配用户请求,到源服务器获得内容并缓存供下次使用;如果 Cache 工作在客户端加速模式,Cache 需要知道源服务器的 IP 地址,所以 CDN 网络维护和运行一个供 Cache 使用的 DNS 服务器,解析域名的真实 IP 地址,如202.99.11.120,各域名的解析记录与未加入 CDN 网络之前一样。 Squid 透明代理配置
工作在 CDN 网络中缓存服务器必须工作在透明方式,对于 Squid 来说,需要设置以下参数:httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on
说明
- 时效性提示:本文涉及的技术案例(如 Bind 9 配置、Squid
httpd_accel参数)属于较早时期的实现方案。现代 CDN 架构通常采用 Anycast、EDNS Client Subnet (ECS) 等更先进的技术,且 Squid 新版配置语法已有所变更。 - 数据参考:文中引用的市场统计数据(如 2004 年营业额)仅反映当时历史情况,不代表当前市场现状。
- 实践建议:若需搭建现代 CDN 或缓存服务,请参考各软件(如 Bind, Nginx, Varnish, Squid)的最新官方文档。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/cdn-nei-rong-fen-fa-wang-luo--ji-shu-yuan-li.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。