What happens when (一)DNS

What happens when (一)DNS

访问网站时,从输入 URL 到显示页面间发生了什么?

这是个老生常谈的话题。大一时在科创社有次分享就是围绕这个展开。想想某个简单的功能背后是如何实现的,这就是 What happen when 问题。

众所周知,访问网页的流程是:输入网址敲回车->查 DNS->找到 IP 地址->通过 TCP 三次握手建立连接->浏览器发送 Http 请求->收到回应->浏览器渲染页面->结束连接

但是具体细节如 DNS 怎么查,TCP/IP 中各个协议间的关系,三次握手四次挥手的目的,http 与 https,长连接与短连接的问题,就不太能说清了。本系列将会梳理整个过程涉及到的知识点。这次从 DNS 说起。

一、概述

**DNS(Domain Name System)**,用来将域名翻译为 IP 地址。最早的地址是手动分配的:

“在工作时间内,通过电话联系SRI的NIC(网络信息中心),将自己的主机名与地址告诉他们,写入集中式主机表。”

这时候有了域的概念,如教育机构的计算机应该属于 edu. 域。后来,手动维护一个集中主机表变得越来越复杂,于是有了 DNS 协议。DNS 在 1983 年 11 月在因特网标准草案 RFC822 发布。原文地址: https://tools.ietf.org/html/rfc882

域名空间采用树结构, 全球 13 组根域名服务器以英文字母 A 到 M 依序命名。

在域名中 com. org. cn. 这些是顶级域名,结尾的.号可以省略,URL 再往前是二级域名、三级域名。

二、查询域名过程

查询域名的IP,第一步是检查浏览器的本地缓存,之后检查本机缓存(host),在 Windows 中为C:\Windows\System32\drivers\etc\hosts,在 Linux 中是 /etc/hosts。接下来是本地 DNS 服务器缓存,也就是 LDNS,使用递归查找。本地 DNS 服务器若还没找到,则去请求根域名服务器,从树的顶点迭代向下查,找到顶级域名服务器地址,继续查找,直到找到。如图所示:

dns.ip.cn 这里列出了一些公共 DNS 服务器的IP地址,有我们熟悉的114.114.114.114,8.8.8.8以及各大运营商的各省 DNS 服务器。

DNS 主要在端口号 53 上使用 UDP 来完成请求。DNS 查询由客户端的单个 UDP 请求和服务器的单个 UDP 响应组成。当答案的长度超过 512 字节时,若客户端和服务器均支持 EDNS 时,将使用较大的UDP数据包。否则,将使用 TCP 再次发送。

三、DNS 记录

在官方网站,可以看到根域名服务器的顶级域名文件 https://www.iana.org/domains/root/files ,下载来的 root.zone 文件只有2.09MB。根 DNS 服务器的记录,截止目前共有 22016 行,每一个顶级域名都会有若干条记录,比如 me. 这个顶级域名,前五行指向了五个 me. 顶级域名的 DNS 服务器域名,他们的 IP 地址在后续记录,每个都支持 IPV4 与 IPV6.

记录有 A、CNAME、MX、NS、TXT、SPF 等多种类型,位于倒数第二列。其中:

A/AAAA: IPv4 与 IPv6 地址
CNAME: 别名,指向原名
MX: 邮件路由记录,指向邮件服务器
NS: 指向域名解析服务器
DS: TXT: 说明性的字符
SPF: TXT 的一种运用,发信侧在 SPF 记录备注规则(如自身 IP),接收方可以通过查询,决定是否接受

四、DNS 负载均衡: CDN (内容分发网络)

仅仅一台服务器很难应付高并发、远距离的可靠连接,故而需要负载均衡技术。CDN 使用了 DNS 负载均衡:

①当用户点击网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统会最终将域名的解析权交给CNAME指向的 CDN 专用 DNS 服务器。

②CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回用户。

③用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。

④CDN 全局负载均衡设备根据用户IP地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。

⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。

⑥全局负载均衡设备把服务器的 IP 地址返回给用户。

⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

—— 《CDN 技术详解》

在 Linux 下用 dig命令看看 DNS 如何解析饿了么官网 ele.me

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
leo@leo-virtual-machine:~$ dig @a.root-servers.net ele.me

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @a.root-servers.net ele.me
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2200
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 11
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ele.me. IN A

;; AUTHORITY SECTION:
me. 172800 IN NS c0.nic.me.
me. 172800 IN NS a0.nic.me.
me. 172800 IN NS b2.nic.me.
me. 172800 IN NS b0.nic.me.
me. 172800 IN NS a2.nic.me.

;; ADDITIONAL SECTION:
c0.nic.me. 172800 IN A 199.253.61.1
c0.nic.me. 172800 IN AAAA 2001:500:55::1
a0.nic.me. 172800 IN A 199.253.59.1
a0.nic.me. 172800 IN AAAA 2001:500:53::1
b2.nic.me. 172800 IN A 199.249.127.1
b2.nic.me. 172800 IN AAAA 2001:500:4f::1
b0.nic.me. 172800 IN A 199.253.60.1
b0.nic.me. 172800 IN AAAA 2001:500:54::1
a2.nic.me. 172800 IN A 199.249.119.1
a2.nic.me. 172800 IN AAAA 2001:500:47::1

;; Query time: 178 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Mar 26 19:23:12 CST 2020
;; MSG SIZE rcvd: 344

找到 me. 的五顶级域名服务器,选一个看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
leo@leo-virtual-machine:~$ dig @a0.nic.me ele.me

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @a0.nic.me ele.me
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42409
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ele.me. IN A

;; AUTHORITY SECTION:
ele.me. 86400 IN NS ns1.alibabadns.com.
ele.me. 86400 IN NS ns2.alibabadns.com.

;; Query time: 302 msec
;; SERVER: 199.253.59.1#53(199.253.59.1)
;; WHEN: Thu Mar 26 19:23:44 CST 2020
;; MSG SIZE rcvd: 85

获得两个阿里巴巴的 DNS 域名,ns1.alibabadns.comns2.alibabadns.com,继续查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
leo@leo-virtual-machine:~$ dig @ns2.alibabadns.com ele.me

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @ns2.alibabadns.com ele.me
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20973
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ele.me. IN A

;; ANSWER SECTION:
ele.me. 300 IN A 106.15.160.220
ele.me. 300 IN A 106.14.48.241

;; Query time: 134 msec
;; SERVER: 106.11.35.18#53(106.11.35.18)
;; WHEN: Thu Mar 26 19:24:46 CST 2020
;; MSG SIZE rcvd: 67

找到了饿了么的两个 IP 地址。也可以使用 nslookup 命令查询,在 Windows 下分别查询 ele.me 与 www.ele.me:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C:\Users\leo-6>nslookup ele.me
服务器: public1.114dns.com
Address: 114.114.114.114

非权威应答:
名称: ele.me
Addresses: 106.14.48.241
106.15.160.220

C:\Users\leo-6>nslookup www.ele.me
服务器: cache1-xx
Address: 124.89.1.129

非权威应答:
名称: v6-zb-alibaba-clould.tengine.alibaba.com
Addresses: 2408:4001:1000::4
47.92.62.13
47.92.21.245
Aliases: www.ele.me
dualstack-sopush.elemecdn.com

试一试访问 ele.me 会发生什么。首先是302的状态码,把我们重定向至 www.ele.me

之后是访问 www.ele.me 的地址 47.92.21.245 ,获得了一些 js 文件。

文件让我们继续访问 https://shadow.elemecdn.com/god/WEB://www.ele.me

地址是 113.200.15.85,根据域名判断,显然是它的一个 CDN 服务器。

原本打算一次写完,结果一个 DNS 就写了好多。先到这里吧。

参考资料:
https://segmentfault.com/a/1190000002578457 利用dns解析来实现网站的负载均衡
https://www.jianshu.com/p/b483300378af DNS的A、CNAME、MX、NS、TXT、SPF记录