DNS查询及优化

什么是DNS

DNS域名系统是一种适用于TCP/IP的分布式数据库,提供的功能包括:

  • 主机名字和IP地址之间的转化
  • 有关电子邮件的选路信息
    另外DNS还规定了DNS服务器之间交换信息的报文格式,这个报文在应用层,基于UDP或者TCP
DNS查询

如果计算机内置DNS无法解析域名,则会询问上级DNS服务器,逐级向上传递信息,直到到达顶级服务器——根服务器,它直到向哪个服务器请求解析,得到IP地址后,原路返回请求计算机。

DNS的存储结构

这里写图片描述
命名:
这里写图片描述

DNS查询得到IP

两种方法:
* 递归解析
当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式,如图所示的是递归方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。
* 迭代解析
  当局部DNS服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析,如图所示。局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。比如说:baidu.com的服务器ip地址在192.168.4.5这里,你自己去查吧,本人比较忙,只能帮你到这里了。
如果输入的是域名,需要进行dns解析成IP。

举个例子:

  • 查询www.163.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

  • 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

  • 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你域名的解析服务器(即前面说到的权限域名服务器)的地址。

  • 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

这里写图片描述

高速缓存

  • 为了提高DNS查询效率,减轻服务器负荷,在域名服务器和本机上都广泛的使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射的的记录。
    *在不久前已经查询或www.163.com,那么本地域名服务器就可以直接把自己在告诉缓存中的结果取出来返回客户本机。

  • 如果本地域名服务器缓存没有对用IP地址,而缓存了顶级域名服务器地址,就可以跳过根域名服务器直接向顶级域名服务器发出请求,减少报文数量和根域名服务器的符合。

  • 每项都有一个缓存时间。权限域名服务器回答一个查询是,在响应中都指明绑定有效存在的时间值。增加此时间可减少网络开销,而减少此时间可提高域名转化的准确性。

  • 处理本地域名服务器,本机也有缓存。它在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存。查询域名时,在本机host文件和缓存中找不到时就会请求本地域名服务器。

dns-prefetch

需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化。

  • DNS Prefetch,即DNS预获取,是前端优化的一部分。一般来说,在前端优化中与 DNS 有关的有两点: 一个是减少DNS的请求次数,另一个就是进行DNS预获取 。

  • DNS 作为互联网的基础协议,其解析的速度似乎很容易被网站优化人员忽视。现在大多数新浏览器已经针对DNS解析进行了优化,典型的一次DNS解析需要耗费 20-120 毫秒,减少DNS解析时间和次数是个很好的优化方式。DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能 减少用户的等待时间,提升用户体验 。

  • 默认情况下浏览器会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的 DNS Prefetch。如果想对页面中没有出现的域进行预获取,那么就要使用显示的 DNS Prefetch 了。

目前大多数浏览器已经支持此属性,支持版本如下:

– Safari: 5+
– Chrome: All
– Firefox: 3.5+
– Opera: Unknown
– IE: 9+ (called “Pre-resolution” on blogs.msdn.com)
其中 Chrome 和 Firefox 3.5+ 内置了 DNS Prefetching 技术并对DNS预解析做了相应优化设置。所以 即使不设置此属性,Chrome 和 Firefox 3.5+ 也能自动在后台进行预解析 。

目前很多大型站点也应用了这一优化,例如:
DNS Prefetch 应该尽量的放在网页的前面,推荐放在 后面。具体使用方法如下:

<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//www.zhix.net">
<link rel="dns-prefetch" href="//api.share.zhix.net">
<link rel="dns-prefetch" href="//bdimg.share.zhix.net">

需要注意的是,虽然使用 DNS Prefetch 能够加快页面的解析速度,但是也不能滥用,因为有开发者指出 禁用DNS 预读取能节省每月100亿的DNS查询 。

如果需要禁止隐式的 DNS Prefetch,可以使用以下的标签:

<meta http-equiv="x-dns-prefetch-control" content="off">

猜你喜欢

转载自blog.csdn.net/lay136362687/article/details/81294429