浅谈域名收敛与域名发散

性能优化一直是前端工作中十分重要的一环,都说从 10 到 1 容易,从 1 到 0 很难 。而随着前端技术的飞速发展,没有什么技术或者法则是金科玉律一沉不变的 。
很佩服那些勇于挑战权威,推陈出新的勇者,是他们让我们的技术不断的变革更加的卓越 。好像扯远了,本文主要想谈谈两个名词,域名发散和域名收敛 。
域名发散
这个很好理解,前端er都知道,PC 时代为了突破浏览器的域名并发限制,遵循这样一条定律:
http 静态资源采用多个子域名
嗯,为什么要这样做呢,目的是充分利用现代浏览器的多线程并发下载能力 。
由于浏览器的限制,每个浏览器,允许对每个域名的连接数一般是有上限的,附图一枚:
上图展示了各浏览器的并行连接数(同域名),可以看到在一些现代浏览器内每个 hostname 的最大连接数基本都是6个,IE 稍显傲娇,总体而言并发数不高 。
所以 PC 时代对静态资源优化时,通常将静态资源分布在几个不同域,保证资源最完美地分域名存储,以提供最大并行度,让客户端加载静态资源更为迅速 。
另外,为什么浏览器要做并发限制呢?
究其根本原因,在以前,服务器的负载能力差,稍微流量大一点服务器就容易就崩溃 。所以为了保护服务器不被强暴到崩溃,浏览器要对 max connections(最大并发数)进行限制 。如果每个用户的最大并发数不限制的话,服务器的负载能力会大幅下降 。
另外还有一个方面就是, 防止 DDOS 攻击 。最基本的 DoS 攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应 。如果不限制并发请求数量,后果,啊哦,你懂的 。
域名收敛
本文的重点是想谈谈域名收敛,顾名思义,域名收敛的意思就是建议将静态资源只放在一个域名下面,而非发散情况下的多个域名下 。
上面也说到了,域名发散可以突破浏览器的域名并发限制,那么为要反其道而行之呢?因为因地制宜,不同情况区别对待,域名发散是 PC 时代的产物,而现在进入移动互联网时代,通过无线设备访问网站,App的用户已占据了很大一部分比重,而域名收敛正是在这种情况下提出的 。且听我一步步分析 。
http 请求过程
首先要知道,使用一个 http 请求去请求一个资源时,会经历些什么 。简单而言:
1、DNS 域名解析 –>
2、发起 TCP 的 3 次握手 –>
3、建立 TCP 连接后发起 http 请求 –>
4、服务器响应 http 请求
5、……略
在这里第一步,也是关键的第一步 DNS 解析,在移动端的 http 请求耗时中,DNS 解析占据了大部分时间 。
说 DNS 域名解析过程前,再科普一下域名结构 。
域名结构
域名的结构(或者叫命名空间)是一个树状结构,有树就得有根,这个根是一个点‘.’(dot) 。
以 www.example.com 为例,完整的形式应该是 www.example.com. ,注意最后一个点,就是根结点 root ,只不过平时是浏览器或者系统的解析器自动帮我们补全了 。我们要想获取根域都有那些,可以在终端下直接使用 dig 命令(需要安装 dig 指令),如下:
可以看到有 13 个,大部分都是在国外,根节点之后就是顶级域名,就是.cn .com .gov 这些,顶级域划分为通用顶级域 (com、org、net 等)和国家与地区顶级域(cn、hk、us、tw 等) 。我们可以继续使用 dig 查看一下 顶级域名的解析路径,加上 +trace 参数选项,意思是追踪 DNS 解析过程,如下:

可以看到是先到根节点,再查找到 com ,就是根结点会告知下一个结点 com 在哪:就是 com. 172800 IN NS [a-m].gtld-servers.net 。

推荐阅读