# DNS解析流程,前端如何做DNS优化
# 解析流程
比如说查询一个网址为:www.baidu.com:
浏览器缓存:浏览器会记录DNS一段时间,所以第一步会查看浏览器中是否有对应ip;
操作系统缓存:搜索操作系统中的DNS缓存,如本地hosts文件或者DNS缓存;
路由器缓存:搜索路由器缓存;
查询:浏览器会发出一个DNS请求到本地DNS(域名分布系统)服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信、中国移动,ISP(互联网服务提供商(Internet Service Provider))搜索;
本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有则进行下列步骤:
- 本地DNS服务器向DNS根服务器(全球13台,固定ip地址)进行查询。根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到顶级域名服务器上去继续查询,并给出顶级域名服务器的地址。这种过程是迭代的过程;
- 本地DNS服务器继续向顶级域名服务器发出请求,在这个例子中,请求的对象是
.com顶级域名服务器。.com顶级域名服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器负责该域名的权威域名服务器并给出服务器的地址; - 最后,本地DNS服务器向权威域名服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP DNS缓存 -> 递归搜索
TIPS
DNS查询模式有三种:
- 递归查询:客户端向本地DNS服务器发送查询请求,本地DNS服务器负责完成整个解析过程,并将结果返回给客户端。客户端只需等待最终结果;客户机只需接触一次DNS服务器(客户端(如浏览器、操作系统)通常向本地DNS服务器发送递归查询请求)。
- 迭代查询:客户端向本地DNS服务器发送查询请求,本地DNS服务器依次向根域名服务器、顶级域名服务器和权威域名服务器查询,并将每一步的结果返回给客户端。客户端需要参与多次查询(DNS服务器之间的查询通常是迭代查询,本地DNS服务器向根域名服务器、顶级域名服务器和权威域名服务器发送迭代查询请求)。
- 反向查询:客户利用IP地址查询主机完整域名。
# 前端优化DNS
参考资料:
通常浏览器查找一个给定URL的IP地址要花费20-120ms,在DNS查找完成前,浏览器不能从host那里下载任何东西。
TTL(Time To Live):表示查找返回的DNS记录包含的一个存活时间,过期则这个DNS记录将被抛弃。
影响DNS缓存的因素
- 服务器可以设置TTL值表示DNS记录的存活时间。本机DNS缓存将根据这个TTL值判断DNS记录什么时候被抛弃,这个TTL值一般都不会设置很大,主要是考虑到快速故障转移的问题。
- 浏览器DNS缓存也有自己的过期时间,这个时间是独立于本机DNS缓存的,相对也比较短,例如chrome只有1分钟左右。
- 浏览器DNS记录的数量也有限制,如果短时间内访问了大量不同域名的网站,则较早的DNS记录将被抛弃,必须重新查找。不过即使浏览器丢弃了DNS记录,操作系统的DNS缓存也有很大机率保留着该记录,这样可以避免通过网络查询而带来的延迟。
解决方法:
减少DNS的请求次数
当客户端的DNS缓存为空时,DNS查找的数量与Web页面中唯一主机名的数量相等。所以减少唯一主机名的数量就可以减少DNS查找的数量。
然而减少唯一主机名的数量会潜在地减少页面中并行下载的数量,避免DNS查找降低了响应时间,但减少并行下载可能会增加响应时间。当页面的组件量比较多的时候,可以考虑将组件分别放到至少2-4个主机名,已获得最大收益。
DNS预解析
<!-- 当前页面是否需要预解析
on:启用DNS预解析。在浏览器支持DNS预解析的特性时即使不使用该标签浏览器依然会进行预解析。
off:关闭DNS预解析。这个属性在页面上的链接并不是由你控制的或是你根本不想向这些域名引导数据时非常有用。 -->
<meta http-equiv="x-dns-prefetch-control" content="on" />
<!-- 或者是服务端发送报头
X-DNS-Prefetch-Control: on
X-DNS-Prefetch-Control: off -->
<!-- DNS Prefetch 应该尽量的放在网页的前面,推荐放在 <meta charset="UTF-8"> 后面。 -->
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />
2
3
4
5
6
7
8
9
10
WARNING
dns-prefetch需慎用,多页面重复DNS预解析会增加重复DNS查询次数。因为有开发者指出:禁用DNS,预读取能节省每月100亿的DNS查询。