一、DNS解析过程
第1步,查找浏览器缓存。
浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等。这个缓存时间太长和太短都不好,如果缓存时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。
第2步,查找系统缓存。
如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址。例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确。正是因为有这种本地DNS解析的规程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP地址上,导致这些域名被劫持。
第3步,查找路由器缓存。
如果系统缓存中也找不到,那么查询请求就会发向路由器,它一般会有自己的DNS缓存。
第4步,查找ISP DNS 缓存。
运气实在不好,就只能查询ISP DNS 缓存服务器了。在我们的网络配置中都会有"DNS服务器地址"这一项,操作系统会把这个域名发送给这里设置的DNS,也就是本地区的域名服务器,通常是提供给你接入互联网的应用提供商。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以ISP DNS主要承担了域名的解析工作。
第5步,迭代查询。
最无奈的情况发生了, 在前面都没有办法命中的DNS缓存的情况下,(1)本地域名服务器即将该请求转发到互联网上的根域名服务器(即一个完整域名最后面的那个点,通常省略不写)。(2)根域名服务器将所要查询域名中的顶级域(假设要查询ke.qq.com,该域名的顶级域就是com)的服务器IP地址返回到本地DNS。(3) 本地DNS根据返回的IP地址,再向顶级域(就是com域)发送请求。(4) com域服务器再将域名中的二级域(即ke.qq.com中的qq)的IP地址返回给本地DNS。(5) 本地DNS再向二级域发送请求进行查询。(6) 之后不断重复这样的过程,直到本地DNS服务器得到最终的查询结果,并返回到主机。这时候主机才能通过域名访问该网站。

二、DNS前端优化
1、减少DNS查找,避免重定向:
(1)使用浏览器DNS缓存 、计算机DNS缓存、 服务器DNS缓存,防止DNS迭代查询;
(2)使用Keep-Alive特性 来减少DNS查找的频率;
(3)使用较少的域名(服务器主机)来减少DNS查找的数量。
解释:影响DNS缓存的因素:
首先,服务器可以表明记录可以被缓存多久。查找返回的DNS记录包含了一个存活时间(Time-to-live,TTL)值。该值告诉客户端可以对该记录缓存多久。
尽管操作系统缓存会考虑 TTL 值,但浏览器通常忽略该值,并设置它自己的时间限制。
此外,HTTP 协议中的 Keep-Alive 特性可以同时覆盖 TTL 和浏览器的时间限制。换句话说,只要浏览器和Web服务器愉快地通信着,并保持 TCP 连接打开的状态,就没有理由进行 DNS 查找。
浏览器对缓存的 DNS 记录的数量也有限制,而不管缓存记录的时间。如果用户在短时间内访问了很多具有不同域名的网站,较早的 DNS 记录将被丢弃,必须重新查找该域名。
不过,要记得即便浏览器丢弃了 DNS 记录,操作系统可能依然保持着该记录,这能扭转一下局面,因为无需通过网络发送查询,从而避免了明显的延迟。
当客户端的DNS缓存为空时(浏览器与操作系统缓存为空时),DNS查找的数量与Web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找的数量。
但减少唯一主机名的数量会潜在地减少页面中并行下载的数量。(HTTP1.1,浏览器对于同一个服务器的并行连接数有限制)因此,虽然避免 DNS 查找降低了相应时间,但减少并行下载可能会增加响应时间。所以,在减少 DNS 查找与允许高速并行下载之间做权衡,建议使用 2-4 个服务器主机。
2、DNS的预解析
可以通过用meta信息来告知浏览器, 我这页面要做DNS预解析
<meta http-equiv="x-dns-prefetch-control" content="on" />
可以使用link标签来强制对DNS做预解析:
<link rel="dns-prefetch" href="http://ke.qq.com/" />
参考文章:
DNS解析 - 腾讯Web前端 IMWeb 团队社区