本文将详细介绍DNS预解析prefetch的主要内容html
当浏览器访问一个域名的时候,须要解析一次DNS,得到对应域名的ip地址。在解析过程当中,按照浏览器缓存
、系统缓存
、路由器缓存
、ISP(运营商)DNS缓存
、根域名服务器
、顶级域名服务器
、主域名服务器
的顺序,逐步读取缓存,直到拿到IP地址前端
DNS Prefetch,即DNS预解析就是根据浏览器定义的规则,提早解析以后可能会用到的域名,使解析结果缓存到系统缓存
中,缩短DNS解析时间,来提升网站的访问速度数据库
现代浏览器在 DNS Prefetch 上作了两项工做:api
一、html 源码下载完成后,会解析页面的包含连接的标签,提早查询对应的域名浏览器
二、对于访问过的页面,浏览器会记录一份域名列表,当再次打开时,会在 html 下载的同时去解析 DNS缓存
DNS预解析分为如下两种:安全
【自动解析】性能优化
浏览器使用超连接的href
属性来查找要预解析的主机名。当遇到a
标签,浏览器会自动将href
中的域名解析为IP地址,这个解析过程是与用户浏览网页并行处理的。可是为了确保安全性,在HTTPS
页面中不会自动解析服务器
【手动解析】分布式
在页面添加以下标记
<link rel="dns-prefetch" href="//img.alicdn.com">
上面的link
标签会让浏览器预取"img.alicdn.com"的解析
但愿在HTTPS
页面开启自动解析功能时,添加以下标记
<meta http-equiv="x-dns-prefetch-control" content="on">
但愿在HTTP
页面关闭自动解析功能时,添加以下标记
<meta http-equiv="x-dns-prefetch-control" content="off">
并不是全部页面都要手动解析,通常在整个站点的入口页作这个工做就好了,毕竟一个站点下用到的大多数域名都会在首页体现
DNS Prefetch有效缩短了DNS的解析时间
若是浏览器最近将一个域名解析为IP地址,所属的操做系统将会缓存,下一次DNS解析时间能够低至0-1ms。 若是结果不在系统本地缓存,则须要读取路由器的缓存,则解析时间的最小值大约为15ms。若是路由器缓存也不存在,则须要读取ISP(运营商)DNS缓存,通常像taobao.com
、baidu.com
这些常见的域名,读取ISP(运营商)DNS缓存须要的时间在80-120ms,若是是不常见的域名,平均须要200-300ms。通常的网站在运营商这里都能查询的到,因此广泛来讲DNS Prefetch能够给一个域名的DNS解析过程带来15-300ms的提高,尤为是一些大量引用不少其余域名资源的网站,提高效果就更加明显了
浏览器底层缓存进行了建模,当Chrome浏览器启动的时候,就会自动的快速解析浏览器最近一次启动时记录的前10个域名。因此常常访问的网址就没有DNS解析的延迟,打开速度更快
DNS Prefetch 是对网页性能优化的一个通用方案,对国际化的站点来讲可能效果更加明显。学习成本和理解成本低,能够放心大胆地用到本身的网页上
以小火柴的前端小站为例
<link rel="dns-prefetch" href="//api.xiaohuochai.cc"/> <link rel="dns-prefetch" href="//static.xiaohuochai.site"/> <link rel="dns-prefetch" href="//demo.xiaohuochai.site"/> <link rel="dns-prefetch" href="//pic.xiaohuochai.site"/>