欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浏览器 DNS缓存与DNS prefetch (DNS预解析)

程序员文章站 2022-03-26 12:16:47
浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间。 浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,其中Chrome ......

浏览器 dns缓存

浏览器dns缓存的时间跟dns服务器返回的ttl值无关。

注:ttl(time-to-live),就是一条域名解析记录在dns服务器中的存留时间。

浏览器在获取网站域名的实际ip地址后会对其ip进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的dns缓存时间,其中chrome的过期时间是1分钟,在这个期限内不会重新请求dns。chrome浏览器看本身的dns缓存时间比较方便,在地址栏输入:

chrome://net-internals/#dns

dns prefetch

概述

dns(domain name system, 域名系统),是域名和ip地址相互映射的一个分布式数据库。dns 查询就是将域名转换成 ip 的过程,这个过程短的话 2ms 几乎无感,长则可能达到几秒钟。


当浏览器访问一个域名的时候,需要解析一次dns,获得对应域名的ip地址。在解析过程中,按照浏览器缓存、系统缓存、路由器缓存、isp(运营商)dns缓存、根域名服务器、*域名服务器、主域名服务器的顺序,逐步读取缓存,直到拿到ip地址。


dns prefetch,即dns预解析就是根据浏览器定义的规则,提前解析之后可能会用到的域名,使解析结果缓存到系统缓存中,缩短dns解析时间,来提高网站的访问速度。

使用

现代浏览器在 dns prefetch 上做了两项工作:

  • 1、html 源码下载完成后,会解析页面的包含链接的标签,提前查询对应的域名。
  • 2、对于访问过的页面,浏览器会记录一份域名列表,当再次打开时,会在 html 下载的同时去解析 dns。

dns预解析分为以下两种:


自动解析

浏览器使用超链接的href属性来查找要预解析的主机名。当遇到a标签,浏览器会自动将href中的域名解析为ip地址,这个解析过程是与用户浏览网页并行处理的。但是为了确保安全性,在https页面中不会自动解析

手动解析

在页面添加如下标记:

<link rel="dns-prefetch" href="//g.alicdn.com" />

上面的link标签会让浏览器预取"g.alicdn.com"的解析

希望在https页面开启自动解析功能时,添加如下标记:

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

希望在http页面关闭自动解析功能时,添加如下标记:

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

并非所有页面都要手动解析,一般在整个站点的入口页做这个工作就行了,毕竟一个站点下用到的大多数域名都会在首页体现。

看下淘宝首页的dns解析预解析代码:

<link rel="dns-prefetch" href="//g.alicdn.com" />
<link rel="dns-prefetch" href="//img.alicdn.com" />
<link rel="dns-prefetch" href="//tce.alicdn.com" />
<link rel="dns-prefetch" href="//gm.mmstat.com" />
<link ref="dns-prefetch" href="//tce.taobao.com" />
<link rel="dns-prefetch" href="//log.mmstat.com" />
<link rel="dns-prefetch" href="//tui.taobao.com" />
<link rel="dns-prefetch" href="//ald.taobao.com" />
<link rel="dns-prefetch" href="//gw.alicdn.com" />
<link rel="dns-prefetch" href="//atanx.alicdn.com"/>
<link rel="dns-prefetch" href="//dfhs.tanx.com"/>
<link rel="dns-prefetch" href="//ecpm.tanx.com" />
<link rel="dns-prefetch" href="//res.mmstat.com" />

作用

dns prefetch有效缩短了dns的解析时间

如果浏览器最近将一个域名解析为ip地址,所属的操作系统将会缓存,下一次dns解析时间可以低至0-1ms。 如果结果不在系统本地缓存,则需要读取路由器的缓存,则解析时间的最小值大约为15ms。如果路由器缓存也不存在,则需要读取isp(运营商)dns缓存,一般像taobao.combaidu.com这些常见的域名,读取isp(运营商)dns缓存需要的时间在80-120ms,如果是不常见的域名,平均需要200-300ms。一般的网站在运营商这里都能查询的到,所以普遍来说dns prefetch可以给一个域名的dns解析过程带来15-300ms的提升,尤其是一些大量引用很多其他域名资源的网站,提升效果就更加明显了

浏览器底层缓存进行了建模,当chrome浏览器启动的时候,就会自动的快速解析浏览器最近一次启动时记录的前10个域名。所以经常访问的网址就没有dns解析的延迟,打开速度更快。