DNS预解析什么?dns-prefetch对网站速度又能提升有多少?

今天在群里面蓝大富分享了一个网站给我。看了下源码,说实话,真的写得很工整。今天主要讲一下在代码里面看到的下面这一段代码:

<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="//www.zhaozongjie.com">
<link rel="dns-prefetch" href="https://apps.bdimg.com">
<link rel="dns-prefetch" href="https://zz.bdstatic.com">
<link rel="dns-prefetch" href="//push.zhanzhang.baidu.com">
<link rel="dns-prefetch" href="https://wn.pos.baidu.com">
<link rel="dns-prefetch" href="https://cpro.baidustatic.com">
<link rel="dns-prefetch" href="https://dup.baidustatic.com">
<link rel="dns-prefetch" href="https://pos.baidu.com">
<link rel="dns-prefetch" href="https://crs.baidu.com">
<link rel="dns-prefetch" href="https://cb.baidu.com">
<link rel="dns-prefetch" href="https://hm.baidu.com">
<link rel="dns-prefetch" href="https://imageplus.baidu.com">
<link rel="dns-prefetch" href="https://su.bdimg.com">

这段代码是什么意思呢?

阻挡

我们知道当浏览器请求一个URL的时候,通过firebug我们可以发现大概有以下几个过程:阻挡、域名解析、建立连接、发送请求、等待响应、接收数据。后面四个跟用户的网络情况与我们的服务器处理速度有关。不同的浏览器对单个域名的最大并发连接数有一定的限制,HTTP/1.0和HTTP/1.1也不相同。比如HTTP/1.1协议下,IE6的并发连接数限制是2个;而在HTTP/1.0下,IE6的并发连接数可以达到4个。在其它浏览器也有类似的限制,一般是4~8个。这个时候,如果浏览器同时对某一域名发起多个请求,超过了限制就会出现等待,也就是阻挡。

方案

那么为了解决阻挡这一问题,我们可以对某些URL的域名分散处理,比如我们的图片域名,一般用类似img.ccswust.org的域名,当一个页面包含20多张图片的时候,那至少有10几个请求会被阻挡,而如果我们分散到

img.ccswust.org
img1.ccswust.org
img2.ccswust.org
…

等不同域名的时候,至少这20个图片请求会并发进行,网站打开速度会明显提升很多。类似的,可以对一些css/js的域名同样处理。

什么是DNS?

域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址,如下图所示。也就是说,当用户第一次访问某个网站的时候,会先去DNS查询这个网站的IP地址(后面继续访问的话会缓存)。

图片[1]-DNS预解析什么?dns-prefetch对网站速度又能提升有多少?-夏末浅笑

什么是DNS 预读取?

由下图会发现,有时候花在域名解析的时间会非常的长,在实际的测试过程中,我甚至见过3s的。DNS prefetch,是一种DNS 预解析技术,当浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在单击当前网页中的连接时就无需进行DNS的解析,减少用户等待时间,提高用户体验。

图片[2]-DNS预解析什么?dns-prefetch对网站速度又能提升有多少?-夏末浅笑

从我们的域名到查询IP的过程,这个过程其实一般都很快的,但也会引起延迟。一般浏览器会适当的对解析结果缓存,并对页面中出现的新域名进行预解析,但并不是所有的浏览器都会这么做,为了帮助其它浏览器对某些域名进行预解析,你可以在页面的html标签中添加dns-prefetch告诉浏览器对指定域名预解析。

那么要怎样实现DNS prefetch呢?其实非常简单。首先要打开浏览器端对域名进行欲解析,目前主流浏览器都是支持这个功能的,如Chrome/Firefox。如果要控制浏览器端是否对域名进行预解析,可以通过Http header 的x-dns-prefetch-control 属性进行控制。

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

如果要浏览器端对特定的域名进行解析,可以再页面中添加link标签实现。例如:

<link rel="dns-prefetch" href="www.test.com" />

如果细心一点,你会在淘宝的网站发现这两个现象,淘宝有很多类似img0.tbcdn.cn这样的域名。 cookie隔离

那就是为什么用img0.tbcdn.cn这个域名,而不是img0.taobao.com呢?这个得从cookie说起,淘宝的cookie已经非常大了,据说曾接近1K,如果用后面的域名,那每次请求图片都会带上长长的cookie,后果可想而知,不仅使得网络请求变慢,而且还浪费了带宽,而淘宝图片服务器并不需要这些cookie。这就是所说的cookie污染,为了解决这一问题,单独的域名是很有必要的。

DNS Prefetch 应该尽量的放在网页的前面,推荐放在<meta charset="UTF-8">后面。

注:dns-prefetch需慎用,多页面重复DNS预解析会增加重复DNS查询次数。

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

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

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

对于网站测试人员来说,当你知道了这之中的原理,才会更好地有针对性地去做一些测试。那么DNS prefetch会影响的是Page Load Time。当然,分析各个request的DNS 解析时间会更直接(可以用WebPageTest)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
相关推荐
  • 暂无相关文章
  • 评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容