CDN的原理

#介绍

屏幕快照 2019-04-05 下午8.17.33

CDN,全称Content Delivery Network,主要作用是为源站减少访问压力的同时,为客户端提供更快速的内容响应。除此之外,CDN还能对源站进行安全防护。其实真正为CDN付费的是源站,所以CDN的用户其实是源站,例如新浪微博,youku视频,淘宝网啊之类的。而客户端,是CDN的用户的用户。所以CDN是夹在源站和源站的用户之间的,以下称客户端均指源站的用户。

CDN工作原理

传统网站访问过程

要说CDN的工作原理,就得先说说Internet资源的访问过程。传统的来说,在浏览器访问网站应当有这么一些步骤:

  1. 在浏览器键入网址www.taobao.com
  2. 浏览器请求dns服务器,查询到www.taobao.com对应的IP
  3. 浏览器向服务器发起TCP连接
  4. 浏览器通过建立的TCP连接发送HTTP协议报文
  5. 服务器向浏览器发送页面内容
  6. 浏览器将页面展现出来

对于上面提到的第2步,其实还是有需要来更加详细的说明一下dns的解析过程,因为它是CDN能工作的基本条件。

DNS工作过程

DNS的工作过程容易被人忽略,一般只知道DNS的输入是一个网址,输出的是一个IP。==DNS的协议主要是基于UDP的,所以dns server的qps一般都是很惊人的,比web server(http是基于tcp的)的qps是高出几个量级的。有个基本概念就是dns的记录类型,常见的dns记录类型有AAAAACNAME等。A记录是域名到IPV4地址的;AAAA记录是域名到IPV6地址的;**CNAME记录类似于查询过程中的转发,意思是你去问问这个个人,他管这事。好的,下面继续说说DNS的工作过程。

  1. 在浏览器键入www.taobao.com,其实真正dns协议里用到的是www.taobao.com.最后还有一个点,可能是因为美观等原因,一般都不显示
  2. 查询本地缓存(host文件或者是浏览器的缓存)中有没有该域名对应的记录,有的话就直接用了
  3. 向运营商的DNS服务器发起dns解析的请求,一般称运营商的DNS服务器为local dns
  4. local dns会查询本地的缓存,local dns设置的缓存时间是有讲究的,过长过短都不好。另外local dns的查询是运营商的事,这里面水很深,外部不可控
  5. local dns如果没有缓存,会把域名从右往左扫描,依次请求对应的服务器,例如对于域名 www.taobao.com.,先去问负责.的根域名服务器,就是传说中全球只有几台的那些服务器,他们会答复.com是谁管理的,然后local dns又去找管理.com的服务器(假设名字为S1),去问问taobao.com是谁管,一般来说,在S1查到的记录是一条cname记录(阿里毕竟大公司,自己管理自己旗下的域名),然后就转到了阿里自己的DNS服务器上来了,一般称之为权威服务器
  6. 权威服务器是阿里自己建的,然后根据公司内部的一些配置啊,调整啊,查到www.taobao.com.对应的服务器是谁,返回一个IP地址
  7. local dns缓存这个IP地址,并且回复浏览器
  8. 浏览器和对应的IP地址的服务器简历TCP连接,发送HTTP报文

买过域名的朋友都知道,假如你在万网买了cstdlib.com,然后你想启用一个二级域名go.cstdlib.com,那么你要去万网的控制台(已经和阿里云合并)设置一条A记录的解析,将go.cstdlib.com指向你想要的IP。每次增加二级域名的过程都是这样子。那么,如果你知道了DNS的解析过程,你可以这么做:

  1. 在服务器D1上起一个dns server,作为cstdlib.com的dns权威服务器
  2. 在万网的控制台新增一条CNAME记录,将cstdlib.com的解析转到D1来
  3. D1想返回什么IP就返回什么IP

这样一来,一切尽在掌控,毕竟D1是你的,而且以后你再也不用去万网的控制台了,这就是自建DNS服务器。

CDN 访问原理

3593233181

首先,我们作为终端用户(END USERS)在地址栏中键入 www.baidu.com,浏览器发现本地没有关于 www.baidu.com 的 DNS 缓存,于是向网站的 DNS 服务器发起请求。

然后,网站的 DNS 域名服务器设置了 CName,指向了某个 CDN 服务(比如 www.baidu.com),去请求 CDN 中的智能 DNS 均衡负载系统

均衡负载系统解析域名,把对用户响应最快的节点(CDN Node)返回给用户,然后用户向该节点发出请求。

如果是第一次访问该内容,CDN 服务器会向源站(Origin Server)请求数据并缓存,否则的话,直接在缓存节点中找到该数据,将请求结果发给用户。

对于最简单的 CDN 系统而言,只要一台 DNS 调度服务器和一个节点服务器即可,但在复杂的应用中,会存在多级缓存,多台 Cache 来协同工作。

CDN选择优质节点

回到正题,CDN如何为用户选择时延更小的源站。这次不以访问淘宝为例了,因为阿里有自己的CDN,要是以访问淘宝为例,容易混淆CDN的提供者和源站。这次举例以新浪微博为源站,假设微博使用了阿里的CDN,那么阿里CDN会告诉微博,你要我给你加速一张图片是吧,那你就把这个图片解析到我的服务器来(可以CNAME,也可以直接写阿里CDN的url,牛客项目中是直接写云的URL),那么,阿里CDN的dns权威服务器,会收到这么一个解析请求,“请告诉我,新浪微博的1.png的源站在哪”。这时CDN系统就要大展身手了。

假设我们现在是阿里CDN的dns权威服务器,有人问我们“新浪微博的1.png的源站在哪”,那我会这么做:先看看问我的这个人IP是多少(回忆一下dns解析的过程,我们看到的应该是local dns的IP),然后根据这个IP查到他是哪里的,北京还是广州,上海还是深圳。如果是北京,那好,我就给你返回北京的源站的地址;如果是上海,那我就给你返回上海的源站的地址,这样就实现了就近访问。

在把IP地址对应到地理位置的过程中,需要用到IP库,阿里CDN的IP地址库很NB,因为阿里CDN的负责人叔度在ArchSummit架构师峰会上说,他们可以用淘宝的包裹记录来校准,真是机智。

当然,就近只是一个要考虑的因素之一,还有很多因素需要考虑的,例如网络成本,流量分布,源站负载等。这是个很复杂的过程,我只是举了一个直观的方面来说。

CDN减少源站压力

刚才说了CDN是如何选择优质节点的,那么对于客户端,算是有个交代了。所以接下来考虑怎么给源站一个交代:减小源站压力。如果每一个用户请求都让他直接去源站拿的话,那源站将会承受巨大的压力,所以要考虑为源站提供一个HTTP的缓存,通过提升缓存的命中率来减小源站的压力。

比如刚才第一个用户请求了1.png,那么CDN先把这张图片缓存(缓存简单可以认为是一个哈希表,key是url,value是response)起来,下次再有人要1.png,就直接返回给他,从而减少回源流量。

牛客项目中:

项目中存放在云上的图片url:云上的外链接+图片在云上的名,所以在返回给客户端HTML页面中,图片的地址就是

云上的外链接+图片在云上的名,用户需要查看图片时,直接联系的是服务你的云,云会根据你发出请求的IP地址,就近为你选择一台离你最近的服务器为你服务。这样既加快的图片的传输,又因为源站不用处理获取图片的请求,达到了减少源站压力的目的

总结一下

CDN的工作原理:通过权威dns服务器来实现优质节点的选择,通过缓存来减少源站的压力。


   转载规则


《CDN的原理》 xuxinghua 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录
I I