前言

CDN(Content Delivery Network,内容分发网络)将源站的内容发布到接近用户的网络“边缘”,用户可以就近获取所需数据,不仅降低了网络的拥塞状况、提高请求的响应速度,也能够减少源站的负载压力。

很多同学都比较熟悉CDN的作用和功能,但是可能也会像我之前一样,对CDN的原理不是十分了解。所以本文旨在对CDN的工作原理和核心组件进行简要的描述。

访问源站的过程

为了更加清楚地展示CDN的原理,我们首先回顾一下不使用缓存直接到源站请求数据的过程:

!()[https://api2.mubu.com/v3/document_image/9b0ebec7-5239-4a6f-802d-4226ea0580b8-3807603.jpg]

如上图所示,如果要访问的网站名为:”join.qq.com”,客户端首先会在本机的hosts文件和hosts缓存中查找该域名对应的IP地址;如果本机中没有此信息,则会到我们的本地DNS进行询问该域名对应的IP地址;如果本地DNS中仍然没有该域名的IP信息时,则会由本地DNS依次向根DNS、顶级域DNS、权威DNS进行询问,最终本地DNS将IP地址发送给客户端。客户端通过IP地址向远程的源站服务器发出HTTP请求并获取相应的数据内容。
以上是通过DNS的迭代解析模式获取域名对应的IP地址并发送HTTP请求的过程。源站的提供商通过配置权威DNS将源站的域名与提供服务的服务器主机进行绑定,使客户端通过DNS服务可以顺利地获取源站域名对应的IP地址并通过IP地址与源站进行通信。

DNS的记录类型

为了方便后续的讨论,需要了解DNS是如何对查询请求进行应答的。
在DNS系统中,最常见的资源记录方式是Internet类记录,该记录由包含4个字段的数据构成:Name、Value、Type、TTL。其中Name和Value可以理解为一对键值对,但是其具体含义取决于Type的类型,TTL记录了该条记录应当从缓存中删除的时间。在资源记录的类型中中,最为常见且重要的类型Type主要有:

  1. A记录(Address)
    A记录用于描述目标域名到IP地址的映射关系,将目标域名与A记录的Name字段进行匹配,将成功匹配的记录的Value字段的内容(IP地址)输出到DNS回应报文中。

  2. NS记录(Name Server)
    NS记录用于描述目标域名到负责解析该域名的DNS的映射关系,根据目标域名对NS记录的Name字段进行匹配,将成功匹配的记录的Value字段(负责解析目标域名的DNS的IP地址)输出到DNS回应报文中。

  3. CNAME记录
    CNAME记录用于描述目的域名和别名的对应关系,如果说A记录可以将目标域名转换为对应主机的IP地址,那么CNAME记录则可以将一个域名(别名)转换为另一个域名,如果多条CNAME记录指向同一个域名,则可以将多个不同的域名的请求指向同一台服务器主机。并且,CNAME记录通常还对应了一条A记录,用于提供被转换的域名的IP地址。

通过CDN获取缓存内容的过程

在上一章节中主要介绍了通过DNS服务直接访问源站的请求响应过程。与其不同的是,CDN将我们对源站的请求导向了距离用户较近的缓存节点,而非源站。
如图所示是通过CDN进行请求响应的过程图。通过图中可以看出,在DNS解析域名时新增了一个全局负载均衡系统(GSLB),GSLB的主要功能是根据用户的本地DNS的IP地址判断用户的位置,筛选出距离用户较近的本地负载均衡系统(SLB),并将该SLB的IP地址作为结果返回给本地DNS。SLB主要负责判断缓存服务器集群中是否包含用户请求的资源数据,如果缓存服务器中存在请求的资源,则根据缓存服务器集群中节点的健康程度、负载量、连接数等因素筛选出最优的缓存节点,并将HTTP请求重定向到最优的缓存节点上。

!()[https://api2.mubu.com/v3/document_image/ec76cc27-5db7-452e-a510-9fd79a836d22-3807603.jpg]

为了更清晰地说明CDN的工作原理,下面以客户端发起对”join.qq.com/video.php”的HTTP请求为例进行说明:

  1. 用户发起对”join.qq.com/video.php”的HTTP请求,首先需要通过本地DNS通过”迭代解析”的方式获取域名”join.qq.com”的IP地址;
  2. 如果本地DNS的缓存中没有该域名的记录,则向根DNS发送DNS查询报文;
  3. 根DNS发现域名的前缀为”com”,则给出负责解析com的顶级DNS的IP地址;
  4. 本地DNS向顶级DNS发送DNS查询报文;
  5. 顶级DNS发现域名的前缀为”qq.com”,在本地记录中查找负责该前缀的权威DNS的IP地址并进行回复;
  6. 本地DNS向权威DNS发送DNS查询报文;
  7. 权威DNS查找到一条NAME字段为”join.qq.com”的CNAME记录(由服务提供者配置),该记录的Value字段为”join.qq.cdn.com”;并且还找到另一条NAME字段为”join.qq.cdn.com”的A记录,该记录的Value字段为GSLB的IP地址;
  8. 本地DNS向GSLB发送DNS查询报文;
  9. GSLB根据本地DNS的IP地址判断用户的大致位置为深圳,筛选出位于华南地区且综合考量最优的SLB的IP地址填入DNS回应报文,作为DNS查询的最终结果;
  10. 本地DNS回复客户端的DNS请求,将上一步的IP地址作为最终结果回复给客户端;
  11. 客户端根据IP地址向SLB发送HTTP请求:”join.qq.com/video.php”;
  12. SLB综合考虑缓存服务器集群中各个节点的资源限制条件、健康度、负载情况等因素,筛选出最优的缓存节点后回应客户端的HTTP请求(状态码为302,重定向地址为最优缓存节点的IP地址);
  13. 客户端接收到SLB的HTTP回复后,重定向到该缓存节点上;
  14. 缓存节点判断请求的资源是否存在、过期,将缓存的资源直接回复给客户端,否则到源站进行数据更新再回复。

其中较为关键的步骤为6~9,与普通的DNS过程不同的是,这里需要服务提供者(源站)配置它在其权威DNS中的记录,将直接指向源站的A记录修改为一条CNAME记录及其对应的A记录,CNAME记录将目标域名转换为GSLB的别名,A记录又将该别名转换为GSLB的IP地址。通过这一系列的操作,将解析源站的目标域名的权力交给了GSLB,以致于GSLB可以根据地理位置等信息将用户的请求引导至距离其最近的”缓存节点”,减缓了源站的负载压力和网络拥塞。
以上主要介绍了目前CDN中最为常见的工作方式,这种工作方式利用CNAME将域名和目标IP之间进行解耦,将目标IP的解析权下放到GSLB中,方便实现更多自定义的功能,是一种更加灵活的方式。

参考链接

CDN原理简析