一个文件请求到服务器CDN的过程

一个文件请求到服务器CDN的过程?

以下文章讲解绝对是搬砖了,公司内部技术分享讲解的内容,一字不落的通读一遍感觉真心不错,可以在MS的时候当问你浏览器加载URL发生了什么的时候把这些加上喷死MSG。还有,着重看下CDN工作过程和DNS解析过程。

CDN

由于在不同的地域或者不同的运营商的用户访问网站的相应速度存在差异,为了提高用户的访问速度,需要在用户和服务器之间增加一层中间层,使用户能以最快的速度,从最近的地方获得所需的信息,彻底解决网络拥塞,提升响应速度,是目前大型网站使用的流行的应用方案。CDN的全称是Content Delivery Nerwork,即内容分发网络。CDN是构建在网络之上的内容分发网络,通过在现有的Internet中增加一层新的cache层,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,CDN系统能够实时的根据网络流量和各节点的链接、负载状况以及用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,使用户就近获取所需的内容,降低网络拥塞,提高用户访问的响应速度和命中率。

CDN的组成

CDN网络主要由中心节点、边缘节点两部分构成。

中心节点

包括CDN网管中心和全局负载均衡系统,负责整个CDN网络的分发及管理CDN负载均衡系统通过对DNS重定向解析,将用户的请求导向整个CDN网络中的最佳节点。通常负载均衡可以分为两个层次:全局负载均衡(GSLB)和区域负载均衡(SLB)。全局负载均衡主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)。因此,就近性判断是全局负载均衡的主要功能。区域负载均衡一般局限于一定的区域范围内,其目标是在特定的区域范围内寻找一台最适合的节点提供服务,因此,CDN节点的健康性、负载情况、支持的媒体格式等运行状态是本地负载均衡进行决策的主要依据。

边缘节点

每个边缘节点有两部分组成:负载均衡设备和高速缓存服务器。负载均衡设备负责每个节点中各个cache的负载均衡,保证节点的工作效率;同时负载均衡设备还负责收集节点与周围环境的信息,保持与全局负载DNS的通信,实现真个系统的负载均衡高速缓存服务器(cache)负责存储客户网站的大量信息,就像一个靠近用户的网站服务器一样响应本地用户的访问请求。

CND的工作过程

这块读下来感觉挺好的 会把整个请求机制(不涉及浏览器渲染、ajax请求那些东西,仅仅是请求地址解析这块)讲的步骤很清晰了

  1. 输入一个网址,浏览器发现本地没有关于整个网址的DNS缓存,然后向本地的DNS服务器请求该域名的解析
  2. 本地DNS服务器中如果缓存有这个域名的解析记录,则直接响应用户的请求,如果没有关于整这个域名的解析记录的缓存,则以迭代查询的方式进行DNS解析,将结果返回给浏览器
  3. (没有使用CDN的情况)浏览器得到域名解析的结果,就是该域名对应的服务器的IP地址
  4. (使用CDN的情况)浏览器得到的域名解析结果是网站的DNS服务器设置的CNAME,指向了某个CDN服务器(如阿里,腾讯云之类的供应商),CDN的DNS服务器将CDN的全局负载均衡设备的IP地址返回给用户
  5. 用户向CDN的全局负载均衡设备发起URL访问请求
  6. CDN全局负载均衡设备根据用户IP地址,以及用户请求的URL,选择一台用户所在区域的区域负载均衡设备,告诉用户向这台设备发起请求。
  7. 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户的IP地址,判断哪一台服务器离用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需的内容;查询各个服务器当前的负载情况,判断哪一台服务器上有服务能力。基于以上这些条件的综合分析后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
  8. 全局负载均衡设备把服务器的IP地址返给用户。
  9. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上没有用户想要的内容,而区域均衡设备依然将它分配给用户,那么这台服务器就要向他的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
注:
浏览器对访问的域名进行解析,由于CDN参与后,对域名解析过程进行了调整,解析的结果不再是一个IP地址,而是该域名对应的CNAME。但CNAME无法完成最终的内容获取,所以浏览器要再次对获得CNAME进行DNS解析,以得到实际的IP地址。在此过程中,CDN会根据用户实际的地理位置解析对应的IP地址,使用户能就近访问。单一服务器的场景下,通过将大量子域名指向到CNAME,再由CNAME指向单一域名,解决了服务器更换、迁移带来的大量域名重新指向的问题。另一方面,CNAME配合负载均衡系统,还可以实现将大量访问需求通过CNAME指向到多台服务器,以提高用户访问的速度。在不同区域的用户访问同一个域名却得到不同CDN节点的IP地址,依靠的是智能调度DNS。当用户访问加入CDN服务的网站时,域名解析请求将最终由”智能调度DNS“负责处理。它通过一组预先定义后的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。同时它需要与分布在各地的CDN节点保持通信、跟踪各节点的健康状态、容量等信息、确保将用户的请求分配到就近可用的节点上。
结合上述两点,为了使用CDN缓存,我们至少要对静态资源的部署作出两项改变:
  1. 将静态资源部署到不同网络线路的服务器中,以加速对应网络中CDN节点无缓存时回源的速度
  2. 加载静态资源时使用与页面不同的域名,一方面是便于接入为CDN而设置的智能DNS解析服务,另一方面因为静态资源和主页面不同域,这样加载资源的HTTP请求就不会带上主页面中的cookie等数据,减少了数据传输量,又进一步加快网络访问。
回源:当有用户访问某个资源的时候,如果被解析到的那个CDN节点没有缓存响应的内容,或是缓存已经过期,就会回源站去获取。没有人访问,CDN节点不会主动去源站请求资源
特点:
  CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
  大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载;
  可以有效地预防黑客入侵以及降低各种DDoS攻击对网站的影响
注:想了解 DDoS攻击 可以自己查查资料了解一下

DNS

DNS(Domain Name System)域名系统是互联网的一项核心服务,它的作用就是把域名映射成计算机可以识别的IP地址,这个过程称为域名解析,域名解析需要专门的域名解析服务器来完成

域名的层级

www.example.com真正的域名是www.example.com.root,简写为www.example.com。因为根域名.root对于所有域名都是一样的,所以一般是省略。根域名的下一级,叫做顶级域名(top-level domain,缩写为TLD),比如.com、.net;再下一级叫次级域名(second-level domain,缩写为SLD),比如www.example.com里面的.example,这一级的域名使用户可以注册的;再下一级是主机名(host),比如www.example.com里面的www,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

DNS记录类型

域名与IP之间的对应关系,称为”记录“(record)。
  • A(Address)地址记录:是用来指定域名对应的IP地址记录。
  • NS域名服务器记录(Name Server):返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
  • CNAME记录:即别名记录,就是把域名解析到另外一个域名,这种记录允许将多个名字映射到另外一个域名。
  • MX邮件记录(Mail eXchagne):表示域名对应的事邮件服务器地址。
  • PTR逆向查询记录(Pointer Record):用于从IP地址反查域名。
DNS服务器根据域名的层级,进行分级查询。所谓”分级查询“,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,大致过程如下:
  1. 从根域名服务器查到顶级域名服务器的NS记录和A记录
  2. 从顶级域名服务器查到次级域名服务器的NS记录和A记录
  3. 从次级域名服务器查出主机名的IP地址

DNS解析过程

域名解析实际上就是解析出指定的域名所对应的IP地址,或者该域名的一个CNAME。如果这个域名对应的是IP地址,则返回这个IP地址,如果对应的是CNAME,则继续查找CNAME域名对应的IP地址,然后将该地址返回。一个域名在DNS服务器中可以配置多个A记录,即对应对个IP地址,DNS服务器利用负载均衡算法计算出一个IP地址并返回,这样通过在A记录中配置多个服务器就可以构成一个集群实现负载均衡。

域名解析过程

主机向本地域名服务器LDNS的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份向其他根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址或者是报错,表示无法查询所需的IP地址。本地域名服务器LDNS向根域名服务器的查询是迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代请求报文时,要么给出所要的IP地址,要么告诉本地服务器下一步应当向哪一个域名服务器进行查询。然后本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询。最后知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
  1. 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果有,这个解析过程就结束了,直接拿到IP地址进行访问。这个浏览器缓存域名是有限制的,除了缓存大小有限制缓存时间也有限制,由TTL属性来配置。
  2. 如果用户浏览器缓存中没有,浏览器会查找操作系统中是否有这个域名对应的DNS解析结果。Windows中C:/windows/system32/drivers/etc/hosts文件设置,linux中/etc/hosts文件中设置。当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个结果。(修改hosts文件不立即生效的原因)
  3. 当前面两步骤都不能解析时,操作系统会把这个域名发送到LDNS,一般是本地区域名服务器或者是自己设置的域名服务器地址,如果命中,那解析就此结束并返回IP并标记为非权威服务器的应答。如果是学校的互联网,那么你的DNS服务器肯定在你的学校,如果你是一个小区接入互联网,那这个DNS就是提供给你接入互联网的应用供应商(电信、联通等),Windows中可以用ipconfig查看DNS服务器地址,Linux中cat/etc/resolv.conf可以查看DNS服务器地址。
  4. 如果LDNS没有命中,LDNS就会像Root Server域名服务器请求解析。LDNS会从配置文件里面读取13个根域名服务器地址,然后向其中一台发起请求。
  5. 根服务器拿到请求后,返回这个顶级域名.com对应的NS记录,一般来说是13台主机名和IP(gTLD-国际顶级域名服务器地址),返回给本地域名服务器即LDNS。
  6. LDNS再向上一步返回的其中一台gLTD服务器发送请求,.com域名服务器(gLTD)返回次级域名xx.com对应的NS记录,返回给本地域名服务器即LDNS。
  7. LDNS接受gLTD返回的服务器地址(即域名服务提供商的域名服务器)并向其中的一台再次发起请求,在xx.com的域下面查询是否有www的这台主机,如果有就把这个IP地址返回。
  8. LDNS接受返回的IP地址和TTL值。
  9. LDNS缓存这个域名和IP的对应关系,缓存时间由TTL控制。
  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存在本地系统的缓存中,域名解析结束。
TTL(Time-To-Live),简单的说它表示一条域名解析记录在DNS服务器上缓存的时间。当各地的DNS服务器接收到解析请求时,就会向域名指定的DNS服务器发出解析请求从而获得解析记录;
在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接受到这个域名的解析请求,DNS服务器将不再向下一级的DNS服务器发出请求,而是直接返回刚才获得的记录;
而这个记录在DNS服务器上保留的时间就是TTL值。
 
利用dig查看DNS解析过程 https://www.cnblogs.com/jeavenwong/p/11406922.html
QUESTION SECTION:查询的内容
ANSWER SECTION:相应的内容,一般会得到至少一条A记录,否则就还没有定义
AUTHORITY SECTION:授权信息
ADDITIONAL SECTION:每个授权服务器的IP地址
SERVER:查询的DNS服务器,可能会被缓存
原文地址:https://www.cnblogs.com/zhenjianyu/p/12965561.html