域名发散导致多次DNS解析增加时耗的问题

酷狗复试的时候被技术面试官问到的一个问题,之前没了解过,事后查看了一些资料有了个大概的了解。

一. 问题描述

当我们在加载一个网页的时候往往会伴随着许多静态文件的加载(包括css、js、img文件等等),但是浏览器一般对于同一个域名有一个并发访问数目的限制(多数为6),也就是说浏览器同时只能向服务器请求6个文件,其他的必须排队等待,这样的话对于静态文件比较多的文件加载时间就会很长,导致用户体验很不好。

问题解决: DS域名发散和CDN内容分发网络

1. DS(domain sharding)域名发散

域名发散主要就是将静态资源放置在不同的域名下,从而可以增加浏览器的并发请求的数目,达到加速网页加载的目的。其中,这里不同的域名可以是一个主域名下划分的多个子域名,也可以是直接通过CNAME设置了别名的不同域名。

2. CND(content delivery network)内容分发网络

CND一般是基于多服务器的云平台,这些多个服务器之间共享文件,在收到用户请求的时候通过一定算法计算出最近的服务器地址,然后从最近的服务器返回用户请求的文件,由于距离比较近,所以一般响应速度比较快,常应用于网页加速。使用CDN加速不需要改动网站的基本架构,只需要修改一下对应资源的DNS解析,给相应的域名设置一个CNAME指向对应的CND服务商的域名即可(这里也会增加一次DNS解析)。

DS (domain sharding) 和 CDN的区别
  • DS 主要是为了解决浏览器通域名下并发访问限制而提出的一种将资源放置到不同域名下的方法
  • CND 的原理是将资源放置在全国或者说全世界某些服务商提供的统一的服务器上,然后就近去取(虽然CND的本质也是利用了DS技术来实现的,但由于它是就近的,而且CND服务器可以缓存,所以整体效率会比原始的DS高)

二. 问题描述

根据上一步,网页经常使用DS (domain sharding) 域名发散(即将静态资源存放于不同域名下)的方式来加载静态资源。但是随着域名的增加,我们会发现每一个域名都需要一次DNS解析的过程,这个过程也是比较耗时的,怎么解决多次dns解析耗时长的问题?

问题解决:

1. SPDY

SPDY 是google开发的一种用于发送网页内容的应用层网络传输协议,它主要是基于TCP协议,也被看做是HTTP/2的前身,它的主要特点就是多路复用,也就是说在不增加域名的情况下,直接在一个TCP请求里面可以请求多个资源,不仅减少了多次建立TCP连接的时间,也减少了多次DNS解析的时间,从而降低网页的加载时间。

SPDY主要有以下几个特点:
  • 多路复用,从而优化请求(可设置并行请求的优先级,按优先级加载)
  • 支持服务器主动推送
  • 压缩HTTP请求头部信息,数据内容默认压缩
  • 采用SSL传输协议加密

2. 预加载

DNS 预加载是一项可以使浏览器主动去执行域名解析的功能,包括CSS、JS、图片等各种静态文件的URL解析,预读取操作是在后台执行,等页面正式加载相应URL对应的资源时就减少了DNS解析这个过程的时耗,减少用户等待时间,提高了用户体验。
打开或关闭预读取功能可以通过 <meta> 标签定义如下:

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

然后需要设置预加载功能的URL可以通过如下标签来实现:

1
2
3
4
5
6
<link rel="dns-prefetch" href="http://www.yourfileURL.com/">
<!-->
<link> 元素也可以使用不完整的 URL 的主机名来标记预解析,
但这些主机名前必需要有双斜线,如下:
<-->
<link rel="dns-prefetch" href="//www.yourfileURL.com/">