在性能优化的时候,比较常见的一个建议是,把资源部署在CDN上,那么问题来了,CDN是什么?这样作有什么好处?html
咱们先讲一下域名系统DNS(Domain Name System)吧。前端
他是一个分布式数据库,功能是联系域名和ip地址。域名与ip的对应关系,被称为记录(record),可分为各类类型linux
DNS由下面三个部分组成git
假如你要访问baidu.com,须要先经过dns系统查出他的ip地址如220.181.57.216,才能访问。github
那么问题来了,dns是怎么经过域名来查出ip的呢?咱们以浏览器输入www.example.com为例,数据库
若是LDNS服务器没找到,会向跟域名服务器(Root Server)请求解析,分为如下几步:api
向大量开放DNS服务器发送大范围域名查询的DNS请求,并将该DNS请求的源IP地址伪形成想要攻击的目标IP地址。因为请求数据比相应数据小得多,攻击者能够利用该技术放大掌握的带宽资源和攻击流量。浏览器
DNS污染是一种让通常用户因为获得虚假目标主机IP而不能与其通讯的方法,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器假装成DNS服务器向用户发回错误的地址的行为。
dns污染与dns劫持的区别在于,dns劫持修改了dns的解析结果,dns污染是不通过dns服务器,返回错误信息缓存
能够看出,dns解析是一个漫长的过程,如何优化这一过程呢?安全
用户在请求某个连接以前,浏览器先尝试解析该连接的域名再将其进行缓存。这样真正请求的时候就不须要进行DNS解析。
能够
X-DNS-Prefetch-Control
的值为on
启动预解析<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel=”dns-prefetch” href=”//fonts.googleapis.com”>
域名收敛
建议将静态资源只放在一个域名下面,能够有效减小dns的请求
基于Http协议向HTTPDNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,能够避免运营商的域名劫持和进行精准调度。
这过程分为两步
讲完DNS,如今能够开始讲CDN了,CDN的全称是Content Delivery Network,即内容分发网络,它可以实时地根据网络流量和各节点的链接、负载情况以及到用户的距离和响应时间等综合信息将用户的请求从新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的情况,提升用户访问网站的响应速度。
典型的CDN系统由下面三个部分组成
最基本的工做单元就是Cache设备,cache(边缘cache)负责直接响应最终用户的访问请求,把缓存在本地的内容快速地提供给用 户。同时cache还负责与源站点进行内容同步,把更新的内容以及本地没有的内容从源站点获取并保存在本地。Cache设备的数量、规模、总服务能力是衡 量一个CDN系统服务能力的最基本的指标
主要功能是负责对全部发起服务请求的用户进行访问调度,肯定提供给用户的最终实际访问地址。两级调度体系分为全局负载均衡(GSLB)和本 地负载均衡(SLB)。GSLB主要根据用户就近性原则,经过对每一个服务节点进行“最优”判断,肯定向用户提供服务的cache的物理位置。SLB主要负 责节点内部的设备负载均衡
分为运营管理和网络管理子系统,负责处理业务层面的与外界系统交互所必须的收集、整理、交付工做,包含客户管理、产品管理、计费管理、统计分析等功能。
使用CDN的方法很简单,只须要修改本身的DNS解析,设置一个CNAME指向CDN服务商便可。
用户访问未使用CDN缓存资源的过程为:
使用CDN后
上面的字太多,有点绕?通俗点就是用户访问的资源本来是存放在你本身的服务器,经过修改DNS让用户根据IP等状况来选择合适的CDN缓存服务器来获取资源。
这样作有什么好处呢?
本文章为前端进阶系列的一部分,
欢迎关注和star本博客或是关注个人github