Taobao FED

无线性能优化:域名收敛

无线性能优化:域名收敛

这两天相信有不少同学被一个 93 的数字搞得“要死要活”的,93 是无线页面在做发布时强制要求的性能检测达标分数,而检测规则中第一条就是要将图片域名收敛到 gw.alicdn.com

为什么要将域名收敛呢? PC 时代不是为了突破浏览器的域名并发限制,像图片这种还专门做了多个域名吗?好吧,你的回答可能是域名解析慢。那为什么慢? 你的回答可能是:“这,这,这,就是慢呗”。

好,成功的挖下了一个坑,我们尝试把挖的坑填一填。

说到域名,就要从 DNS 讲起,这是一个老生常谈的问题,但还是有一批新生呢^_^.

DNS 是一个诞生于 1983 年的老协议了,算了算,比我年纪都大好多,是一个应用非常广泛的基础协议。我们从以下几点简单了解下 DNS 的一些基础知识,进而看一下为什么要做域名收敛。

  1. 域名结构
  2. DNS 查询方式
  3. HttpDNS 是什么鬼

1. 域名结构

你也许已经知道域名的结构(或者叫命名空间)是一个树状结构,有树就得有根,这个根是一个‘.’(dot)
说到树状结构其实和我们经常打交道的 *nix 下的目录结构是一个道理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mkdir -p root/{com,net,org}/{taobao,tmall}/{www,detail}

[22:53:23] ~ » tree root
root
├── com
│   ├── taobao
│   │   ├── detail
│   │   └── www
│   └── tmall
│   ├── detail
│   └── www
├── net
│   ├── taobao
│   │   ├── detail
│   │   └── www
│   └── tmall
│   ├── detail
│   └── www
└── org
├── taobao
│   ├── detail
│   └── www
└── tmall
├── detail
└── www

如上面所示,域名的层级和上面的目录结构是一致的,我们平常对 root 用到的不多,但并不代表它不存在,比如 www.taobao.com 完整的书写形式其实是 www.taobao.com.,对,最后那个点就是根,只不过是浏览器或者系统的解析器自动帮你补全了。我们要想获取根域都有那些,可以在终端下直接使用 dig 命令,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dig


;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
. 388538 IN NS l.root-servers.net.
. 388538 IN NS b.root-servers.net.
. 388538 IN NS e.root-servers.net.
. 388538 IN NS i.root-servers.net.
. 388538 IN NS h.root-servers.net.
. 388538 IN NS j.root-servers.net.
. 388538 IN NS g.root-servers.net.
. 388538 IN NS d.root-servers.net.
. 388538 IN NS c.root-servers.net.
. 388538 IN NS k.root-servers.net.
. 388538 IN NS a.root-servers.net.
. 388538 IN NS m.root-servers.net.
. 388538 IN NS f.root-servers.net.

可以看到有 13 个,大部分都是在国外的(也有镜像),可以参见 维基百科

根据上面的目录结构,说完根,就该说顶级域了。按照功能划分,顶级域划分为通用顶级域 (com、org、net 等)和国家与地区顶级域(cn、hk、us、tw 等)。

上面的顶级域是不开放给普通人和一般组织去申请的,但最近放开了, 比如咱们阿里云就申请了一个 .xin 的顶级域。我们看一下顶级域的解析路径,同样使用 dig 命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[23:00:58]    ~ » dig com +trace

; <<>> DiG 9.8.3-P1 <<>> com +trace
;; global options: +cmd
. 388325 IN NS g.root-servers.net.
. 388325 IN NS j.root-servers.net.
. 388325 IN NS l.root-servers.net.
. 388325 IN NS a.root-servers.net.
. 388325 IN NS e.root-servers.net.
. 388325 IN NS h.root-servers.net.
. 388325 IN NS d.root-servers.net.
. 388325 IN NS c.root-servers.net.
. 388325 IN NS b.root-servers.net.
. 388325 IN NS m.root-servers.net.
. 388325 IN NS i.root-servers.net.
. 388325 IN NS k.root-servers.net.
. 388325 IN NS f.root-servers.net.
;; Received 496 bytes from 192.168.1.1#53(192.168.1.1) in 161 ms

com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.

我们加了一个 trace 的参数,就是跟踪解析过程。可以看到,先去了根,然后根告诉说你找的 com 在 这里,就是 com. 172800 IN NS [a-m].gtld-servers.net.

这里有必要提及一个概念,就是上面出现的 NS,既 NameServer,大部分情况下又叫权威名称服务器简称权威。
什么是权威呢,通俗点讲其实是某些域的权威,也就是权威上面有这些域的最新,最全的数据,所有这些域的数据都应该以此为准(只有权威可以增删改这些域的数据),就像上面 dig com +trace 的结果可以看到,com 的权威是上面的 13 个根域。同理,所有的顶级域(cn、org、net 等等)的权威都是根域。

言归正传,说完 com,下面才是 taobao,tmall ,这些才是我们熟悉的一级域(如果不算根,也可以叫二级域),看上面的目录结构,他是在 com 等顶级域目录的下面的,我们看一下解析过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[23:15:00]    ~ » dig taobao.com. +trace

; <<>> DiG 9.8.3-P1 <<>> taobao.com. +trace
;; global options: +cmd
. 387246 IN NS l.root-servers.net.
. 387246 IN NS d.root-servers.net.
. 387246 IN NS h.root-servers.net.
. 387246 IN NS e.root-servers.net.
. 387246 IN NS b.root-servers.net.
. 387246 IN NS m.root-servers.net.
. 387246 IN NS a.root-servers.net.
. 387246 IN NS f.root-servers.net.
. 387246 IN NS g.root-servers.net.
. 387246 IN NS c.root-servers.net.
. 387246 IN NS k.root-servers.net.
. 387246 IN NS i.root-servers.net.
. 387246 IN NS j.root-servers.net.
;; Received 496 bytes from 124.207.160.106#53(124.207.160.106) in 26 ms

com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
;; Received 488 bytes from 192.58.128.30#53(192.58.128.30) in 501 ms

taobao.com. 172800 IN NS ns4.taobao.com.
taobao.com. 172800 IN NS ns5.taobao.com.
taobao.com. 172800 IN NS ns6.taobao.com.
taobao.com. 172800 IN NS ns7.taobao.com.

可以看到,比 查询 com 的时候 多了 taobao.com. 172800 IN NS ns[4-7].taobao.com. 这些, 到现在, taobao.com 解析过程可以描述为:

  1. 我想知道 taobao.com 的信息,好嘞,先去根上看看。
  2. 来到了根这儿,根一看,哦,taobao.com 是 com 的小弟,我只有 com 的信息,你去问问 com 吧。
  3. 好嘞,屁颠屁颠的根据根给的信息,去找 com。
  4. com 哥,taobao.com 在你这里吧,稍等,我看下,恩,在的,不过我只记录了他们家权威的家庭住址,至于家里有几个娃几条狗我就不清楚了,你根据这个信息去找吧。
  5. 好嘞,然后辗转来到了杭州,感叹了一句,原来你在这里啊。

上面的描述,其实就是 DNS 的迭代解析的一个概念。

同理,我们看下 www.taobao.com. 的解析过程:

1
2
3
4
5
6
7
8
9
10
11
12
...
taobao.com. 172800 IN NS ns4.taobao.com.
taobao.com. 172800 IN NS ns5.taobao.com.
taobao.com. 172800 IN NS ns6.taobao.com.
taobao.com. 172800 IN NS ns7.taobao.com.
;; Received 184 bytes from 192.43.172.30#53(192.43.172.30) in 181 ms

www.taobao.com. 600 IN CNAME www.taobao.com.danuoyi.tbcache.com.
danuoyi.tbcache.com. 10800 IN NS danuoyins8.tbcache.com.
danuoyi.tbcache.com. 10800 IN NS danuoyins4.tbcache.com.

...

上面省略了部分信息,可以看到,到了 taobao.com 之后,才能知道 www 的信息。

同理也可以知道 taobao.com 的权威是 com 所在的 NS, www.taobao.com 的权威是 taobao.com 所在的 NS。

2. DNS 的解析方式

上面无形中就说了迭代解析,还有另外一种递归解析方式:只要发出递归查询,服务器必需回答目标 IP 与域名的映射关系。而迭代查询是,服务器收到一次迭代查询回复一次结果,这个结果不一定是目标 IP 与域名的映射关系,也可以是其它 DNS 服务器的地址。

举个栗子,从客户端到本地 DNS 服务器(又称 Local DNS ,就是你电脑里面配置的或者 DHCP 分配的)是属于递归查询,而 DNS 服务器之间就是的交互查询就是迭代查询。

简单讲,我想知道 www.taobao.com 的 IP 地址,你发的请求是给本地的 LocalDNS 的,这一段是递归,而 LocalDNS 要会先查看本地缓存(缓存多长时间根据域名的 TTL ),如果没有就会发生上面的迭代请求,直到拿到结果给你。

可以看到,如果 LocalDNS 本地没有缓存,是费了老鼻子劲了,几乎绕了地球一大圈(稍微夸张)。
下面附上在 2G,3G,4G, WIFI 情况下 DNS 递归解析的时间 (ms):

网络\域 com taobao.com www.taobao.com 总耗时
2G 1421 2732 8166 7997 20316
3G 748 680 549 58 2035
4G 649 575 454 55 1733
WIFI 91 65 201 48 405

3. HttpDNS 是什么鬼

上面可以看到,一次域名解析,是挺费时间的,尤其是在 2G, 3G 这种弱网环境,最最关键的是 DNS 请求是走 UDP 的,虽然没有 TCP 三次握手的开销,但是 UDP 是没有保证的,尤其是在弱网环境,说丢就丢了,然后会根据你配置的第二个本地 DNS(一般都会有俩主用和备用,最多看系统限制)去重试,这期间起码 1s 就过去了(重试间隔也因各系统所异)。

如果顺利,本地 DNS 有缓存,也就是几十 ms 到几百 ms 的事情,不顺利,几秒到十几秒都有可能。

严格来讲,DNS 才是我们发出去的第一个请求,我们谈 1s 加载,DNS 这一块歇菜了,后面也无从谈起。

所以减少开销就两条路,第一个就是减少 DNS 的请求,第二个就是缩短 DNS 解析路径。

第一个就是做域名收敛的主要原因,相比于 PC 是对于域名的并发限制,无线上来说对并发的要求会弱很多(一般尽量是第一屏,后面使用懒加载)。

第二个就是缩短解析路径,这里所说的缩短解析路径其实就说各级的缓存:本机的缓存,LocalDNS 的缓存,不过他们或多或少也不靠谱,尤其是运营商的 LocalDNS 给你劫持一下,篡改一下都是常有的事情,于是这个情况下,就有了 HttpDNS。

HttpDNS 是为了解决移动端 DNS 解析请求而生的,顺便解决 DNS 劫持,合并请求和缓存结果进而提高解析质量。

HttpDNS 是内置在手淘里面的。这样手淘自己就会做一次缓存,同时也绕过了乱起八糟的递归和迭代查询(因为就像一般的 API 一样直接请求的),大大提高效率。

4. 结论

  1. 在移动网络环境下,减少非必要 DNS 请求,将相关域名收敛成一个,可以尝到缓存的红利,进而可以减少打开页面时间
  2. 移动端减少 DNS 解析时间有两种方式:
    • 减少 DNS 请求
    • 缩短 DNS 解析路径

从上面的各种网络环境下 DNS 解析时间对比,减少 DNS 请求是我们做域名收敛的主要原因。HttpDNS 的诞生不仅可以合并请求,缩短 DNS 解析路径,还有防止运营商劫持等功效。