DNS解析流程
DNS是把域名解析成IP地址的过程,是非常重要的一个知识点,当输入URL时,第一步就是通过DNS将URL转换成IP,浏览器的过程如下:
1, 首先,浏览器会从自身的DNS缓存中去查找(chrome://net-internals/#dns),如果没有则进行下一步
2, 然后,浏览器会先从操作系统里的DNS缓存中找,windows系统中,命令行 ipconfig/displaydns 查看,linux上的NSCD缓存服务;;;如果没有则进行下一步
3, 从计算机host文件里找,这个我们经常配置吧;;;如果没有则进行下一步
4, 请求本地域名服务器(可以认为是你的网络接入服务器商提供,比如中国电信,中国移动,阿里云等域名供应商),如果该服务器有缓存,则直接返回,若没有,则下一步。。。一般80%到这里就可以了(比如你申请一个域名,去阿里云,那么你肯定会写上域名所指向的IP啊)。
5, 若上一步都没命中,那么就需要向根域名服务器迭代请求了,见下面:
准备:
- 首先需要知道的是,根域名服务器和顶级域名服务器全世界大概有十几台,是最顶尖的了,大概知道就行。
- 其次,实际上我们的网址应该为 test.baidu.com . ,注意看后面有的 点 ,只不过浏览器为了方便用户都给省略了。
比如解析test.baidu.com. ,是具体怎么解析成IP地址的呢?可以形容为,从右向左
. -> .com -> baidu.com. -> test.baidu.com
(1)请求根域名服务器,带着 test.baidu.com. ,根域名服务器发现是 .com 结尾,然后告诉你,我只知道 com顶级域名服务器 的IP地址,你去问问它试试
(2)然后浏览器就向 com顶级域名服务器 请求,带着 test.baidu.com. ,com顶级域名服务器 只知道 baidu.com. 所在的服务器地址,并不知道 test. 是啥(因为test.这二级域名,只有百度自己知道啊,因为是百度自己设定的,就像crm.credit.cn,是不是只有公司才知道crm是个啥?)。。。所以 com顶级域名服务器 会告诉你,我只知道baidu.com. 所在的IP地址,你去问问它把(百度公司的web服务器)
(3)然后就向 "百度公司域名服务器" 请求,带着 test.baidu.com. ,百度公司自己肯定知道 test 是个啥,所以百度公司,就把最后真正的IP地址,返回给浏览器,到此,迭代查询完成了
思考:为什么需要迭代查询呢?
如果没有分层,那全世界所有的域名都交由根服务器管理?那不是很乱吗?
所以对域名进行分层次的架构,方便管理
可以想象出了,crm.credit.com 是让公司运维做的指向吧
然后credit.com ,也就是默认www.credit.com,是公司在com域名服务器上面申请的域名吧
com域名服务器肯定是注册到了根域名服务器上了
前端DNS优化
1,减少DNS查询次数
DNS查询需要时间,但是因为DNS可以在浏览器和计算机中缓存一段时间,所以一般只是首次加载网页时会对域名进行解析。
所以尽量减少链子不同 domain 的请求的数量,比如将外部的资源提前下载到同域名的服务器上等。
2,DNS预解析
预解析的原理就是,当加载一个html时,会自动解析其中 a 标签所包含的 href 链接为IP地址,并缓存,如
// index.html
<html>
<a href="test.baidu.com"></a>
</html>
复制代码
当加载index.html时,会预先解析test.baidu.com,之后如果真的点击访问了test.baidu.com,就不需要DNS解析了。
注意,在HTTPS页面中,不会自动预解析,所以需要手动添加
<link rel="dns-prefetch" href="//img.alicdn.com">
复制代码
上面是添加单条的解析,也可以开启自动对所有链接的解析
<meta http-equiv="x-dns-prefetch-control" content="on">
复制代码
注意:并非所有页面都要手动解析,一般在整个站点的入口页做这个工作就行了,毕竟一个站点下用到的大多数域名都会在首页体现
DNS Prefetch 是对网页性能优化的一个通用方案,对国际化的站点来说可能效果更加明显。学习成本和理解成本低,可以放心大胆地用到自己的网页上
CDN原理
上面介绍的DNS,是在没有引入CDN的情况下的流程,如果使用了CDN,那么流程就会变了。
CNAME
首先需要了解,CNAME 是什么东西。
1,A记录
即Address记录,它并不是一个IP或者一个域名,我们可以把它理解为一种指向关系:
- 域名 www.xx.com → 111.111.111.111
- 主机名 DD → 222.222.222.222
可以理解为,最终的域名与IP的对应关系这条记录,就是A记录
2,CNAME
为什么要区分A记录和CNAME?我们可以把CNAME记录叫做别名记录,就是小名。
比如A记录为:
www.credit.com → 111.111.111.111
那么可能有多个CNAME记录
www.100fen.com → www.credit.com
www.baifen.com → www.credit.com
所以大概理解了吧,CNAME就是你主域名A记录的小名
CNAME指向A记录,A记录指向具体的IP地址。
一个网址可以有多个CNAME,可以理解为就是域名转发
CDN流程
CDN的全称是 Content Delivery Network ,即内容分发网络。其目的是通过在现有的Internet流程中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘” ,使用户可以就近取得所需的内容,解决 Internet 网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,解决用户访问网站的响应速度慢的根本原因。
使用CDN好处?
- 提升网页加载速度
- 处理高流量负载
- 无需?本完成本地化覆盖
- 减少带宽消耗
- 在多台服务器间均衡负载
- 使你的网站免于DDoS(拒绝服务)的攻击
- ……
CDN大体是如何工作的?
在之前的DNS解析步骤4中,是向本地域名服务器(可以认为是你的网络接入服务器商提供,比如中国电信,中国移动)中请求
那么引入了CDN后,在这一步中就发生了变化。
我们把本地域名服务器当做阿里云中的域名产品,把 www.credit.com 当做我们从阿里云申请的域名。
如果没有CDN,我们就可以直接配置 www.credit.com → 111.111.111.111,所以一般情况下,DNS步骤解析5的迭代查询,其实是不需要的。
如果我们想引入CDN的话,
在阿里云的控制台,我们可以对 www.credit.com 域名设置几个 CNAME 的配置,比如我们配置:
- CNMAE记录: www.credit.com → cdn.credit.com
- A记录:cdn.credit.com → 222.222.222.222
CDN 是怎么做到优化的
负载均衡
CDN负载均衡设备会为用户选择一台合适的缓存服务器提供服务。
选择的依据包括:
根据用户IP地址,判断哪一台服务器距离用户最近;
根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;
查询各个服务器的负载情况,判断哪一台服务器的负载较小。
基于以上这些依据的综合分析之后,负载均衡设置会把缓存服务器的IP地址返回给用户。
缓存
缓存服务器响应用户请求,将用户所需内容传送到用户。
如果这台缓存服务器上并没有用户想要的内容,而负载均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉取到本地。
缓存还涉及到很多算法,比如,用空间换时间的这种高效的数据结构和算法,多级缓存以热度来区分,前端是SSD后面是机械硬盘等等。。。
CDN总结
在网站和用户之间引入CDN之后,用户不会有任何与原来不同的感觉。
使用CDN服务的网站,只需将其域名的解析权交给CDN的负载均衡设备,CDN负载均衡设备将为用户选择一台合适的缓存服务器,用户通过访问这台缓存服务器来获取自己所需的数据。
由于缓存服务器部署在网络运营商的机房,而这些运营商又是用户的网络服务提供商,因此用户可以以最短的路径,最快的速度对网站进行访问。因此,CDN可以加速用户访问速度,减少源站中心负载压力。
DNS和CDN整体流程的总结
比如我们请求 www.credit.com 域名
1,首先,浏览器会从自身的DNS缓存中去查找(chrome://net-internals/#dns),如果没有则进行下一步
2,然后,浏览器会先从操作系统里的DNS缓存中找,windows系统中,命令行 ipconfig/displaydns 查看,linux上的NSCD缓存服务;;;如果没有则进行下一步
3,从计算机host文件里找,这个我们经常配置吧;;;如果没有则进行下一步
4,请求本地域名服务器(可以认为是 阿里云等域名供应商),
发现阿里云里面有进行过配置,CNMAE记录: www.credit.com → cdn.credit.com ,所以此时告诉浏览器转为请求 cdn.credit.com
此时,浏览器转为请求cdn.credit.com ,上面的1-3步还得再来一遍。。。
1-3步骤重复
4,请求本地域名服务器(可以认为是 阿里云等域名供应商),
发现阿里云里面有进行过配置,A记录:cdn.credit.com → 222.222.222.222 ,然后就把 IP 222.222.222.222 返回给浏览器。
5,浏览器得到了IP地址,注意这个IP地址,实际上是CDN负载均衡服务器的地址。。。继续请求这个地址
6,请求进入到了CDN负载均衡服务器后,服务器会根据算法策略等,返回一个最合适的文件缓存服务器IP地址,至于怎么选择合适的,看下面的优化
7,浏览器访问文件缓存服务器IP地址,最后得到文件资源
作者:晴天633
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。