最全DNS、CDN原理

4,194 阅读9分钟

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地址,最后得到文件资源