目录
- DNS
- 1. DNS 是什么
- 2. DNS 服务器
- 3. 使用dig显示查询过程
- 4. 域名的逐级查询
- 5. 简述DNS解析www.baidu.com的过程
- 参考
DNS
1. DNS 是什么
DNS (Domain Name System 的缩写)是域名解析器,根据域名查出IP地址
2. DNS 服务器
DNS 服务器是一种特殊的服务器,它运行 DNS 协议,用于解析域名到 IP 地址的映射关系。我们输入域名,浏览器就会在后台,自动向 DNS 服务器发出请求,获取对应的 IP 地址。这就是 DNS 查询。
DNS 服务器可以分为几种类型:
- 根 DNS 服务器:
- 这些服务器存储顶级域服务器的信息。
- 它们构成了 DNS 系统的基础。
- 所有域名的起点都是根域名,它写作一个点
.
,放在域名的结尾。因为这部分对于所有域名都是相同的,所以就省略不写了,比如example.com
等同于example.com.
(结尾多一个点)。
- 顶级域(TLD)服务器:
- 如
.com
,.org
,.net
等服务器。 - 它们存储二级域名的权威 DNS 服务器信息。
- 根域名的下一级是顶级域名。
- 如
- 权威 DNS 服务器:
- 对应于具体域名的服务器。
- 存储域名和 IP 地址之间的映射关系。
- 递归 DNS 服务器:
- 这些服务器负责递归地查询并返回最终的 IP 地址。
- 通常是用户的 ISP 提供的 DNS 服务器。
- 我们平常说的 DNS 服务器,一般都是指递归 DNS 服务器。它把 DNS 查询自动化了,只要向它查询就可以了。它内部有缓存,可以保存以前查询的结果,下次再有人查询,就直接返回缓存里面的结果。所以它能加快查询,减轻源头 DNS 服务器的负担。
3. 使用dig显示查询过程
工具软件dig
可以显示整个查询过程。比如我们显示www.baidu.com这个域名的查询过程:
dig www.baidu.com
第一段是查询参数和统计:
第二段是查询内容:
- 上面输出表示,查询域名
www.baidu.com
的A
记录,A
是address的缩写。
第三段是DNS服务器的答复:
- 上面结果显示,
www.baidu.com
有2个A
记录,即2个IP地址,和1个CNAME
记录 CNAME
记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。也就是说用户查询www.baidu.com
的时候,实际上返回的是www.a.shifen.com
的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改www.a.shifen.com
这个域名就可以了,用户的fwww.baidu.com
域名不用修改。
第四段是DNS服务器的一些传输信息:
- 上面结果显示,本机的DNS服务器是
192.168.30.2
,查询端口是53
(DNS服务器的默认端口)
如果不想看到这么多内容,可以使用+short
参数:
4. 域名的逐级查询
要了解DNS 完整的查询过程,就必须了解 域名是一个树状结构。这种树状结构的意义在于,只有上级域名,才知道下一级域名的 IP 地址,所以需要逐级查询。
每一级域名都有自己的 DNS 服务器,存放下级域名的 IP 地址。
所以,如果想要查询二级域名 es6.ruanyifeng.com
的 IP 地址,需要三个步骤。
第一步,查询根域名服务器,获得顶级域名服务器
.com
(又称 TLD 服务器)的 IP 地址。第二步,查询 TLD 服务器
.com
,获得一级域名服务器ruanyifeng.com
的 IP 地址。第三步,查询一级域名服务器
ruanyifeng.com
,获得二级域名es6
的 IP 地址。
下面依次演示这三个步骤。
根域名服务器全世界一共有13台(都是服务器集群)。它们的域名和 IP 地址如下。
根域名服务器的 IP 地址是不变的,集成在操作系统里面。
操作系统会选其中一台,查询 TLD 服务器的 IP 地址。
dig @192.33.4.12 es6.ruanyifeng.com
上面示例中,我们选择192.33.4.12
,向它发出查询,询问es6.ruanyifeng.com
的 TLD 服务器的 IP 地址。
dig 命令的输出结果如下:
[root@server1 ~]# dig @192.33.4.12 es6.ruanyifeng.com
; <<>> DiG 9.11.36-RedHat-9.11.36-14.el8_10 <<>> @192.33.4.12 es6.ruanyifeng.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16169
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 8ede247a436d6ce60100000066b95ffb3e3d919c505717a5 (good)
;; QUESTION SECTION:
;es6.ruanyifeng.com. IN A;; AUTHORITY SECTION:
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS b.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 i.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.;; ADDITIONAL SECTION:
m.gtld-servers.net. 172800 IN A 192.55.83.30
l.gtld-servers.net. 172800 IN A 192.41.162.30
k.gtld-servers.net. 172800 IN A 192.52.178.30
j.gtld-servers.net. 172800 IN A 192.48.79.30
i.gtld-servers.net. 172800 IN A 192.43.172.30
h.gtld-servers.net. 172800 IN A 192.54.112.30
g.gtld-servers.net. 172800 IN A 192.42.93.30
f.gtld-servers.net. 172800 IN A 192.35.51.30
e.gtld-servers.net. 172800 IN A 192.12.94.30
d.gtld-servers.net. 172800 IN A 192.31.80.30
c.gtld-servers.net. 172800 IN A 192.26.92.30
b.gtld-servers.net. 172800 IN A 192.33.14.30
a.gtld-servers.net. 172800 IN A 192.5.6.30
m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30
l.gtld-servers.net. 172800 IN AAAA 2001:500:d937::30
k.gtld-servers.net. 172800 IN AAAA 2001:503:d2d::30
j.gtld-servers.net. 172800 IN AAAA 2001:502:7094::30
i.gtld-servers.net. 172800 IN AAAA 2001:503:39c1::30
h.gtld-servers.net. 172800 IN AAAA 2001:502:8cc::30
g.gtld-servers.net. 172800 IN AAAA 2001:503:eea3::30
f.gtld-servers.net. 172800 IN AAAA 2001:503:d414::30
e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30
d.gtld-servers.net. 172800 IN AAAA 2001:500:856e::30
c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb::30
b.gtld-servers.net. 172800 IN AAAA 2001:503:231d::2:30
a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e::2:30;; Query time: 184 msec
;; SERVER: 192.33.4.12#53(192.33.4.12)
;; WHEN: Mon Aug 12 09:06:03 CST 2024
;; MSG SIZE rcvd: 874
-
因为它给不了
es6.ruanyifeng.com
的 IP 地址,所以输出结果中没有 ANSWER SECTION,只有一个 AUTHORITY SECTION,给出了com.
的13台 TLD 服务器的域名。 -
下面还有一个 ADDITIONAL SECTION,给出了这13台 TLD 服务器的 IP 地址(包含 IPv4 和 IPv6 两个地址)。
有了 TLD 服务器的 IP 地址以后,我们再选一台接着查询:
dig @192.41.162.30 es6.ruanyifeng.com
上面示例中,192.41.162.30 是随便选的一台 .com 的 TLD 服务器,我们向它询问 es6.ruanyifeng.com
的 IP 地址。
返回结果如下。
; <<>> DiG 9.11.36-RedHat-9.11.36-14.el8_10 <<>> @192.41.162.30 es6.ruanyifeng.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30190
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 13
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;es6.ruanyifeng.com. IN A;; AUTHORITY SECTION:
ruanyifeng.com. 172800 IN NS kara.ns.cloudflare.com.
ruanyifeng.com. 172800 IN NS norman.ns.cloudflare.com.;; ADDITIONAL SECTION:
kara.ns.cloudflare.com. 172800 IN A 108.162.192.123
kara.ns.cloudflare.com. 172800 IN A 172.64.32.123
kara.ns.cloudflare.com. 172800 IN A 173.245.58.123
kara.ns.cloudflare.com. 172800 IN AAAA 2606:4700:50::adf5:3a7b
kara.ns.cloudflare.com. 172800 IN AAAA 2803:f800:50::6ca2:c07b
kara.ns.cloudflare.com. 172800 IN AAAA 2a06:98c1:50::ac40:207b
norman.ns.cloudflare.com. 172800 IN A 108.162.193.217
norman.ns.cloudflare.com. 172800 IN A 172.64.33.217
norman.ns.cloudflare.com. 172800 IN A 173.245.59.217
norman.ns.cloudflare.com. 172800 IN AAAA 2606:4700:58::adf5:3bd9
norman.ns.cloudflare.com. 172800 IN AAAA 2803:f800:50::6ca2:c1d9
norman.ns.cloudflare.com. 172800 IN AAAA 2a06:98c1:50::ac40:21d9;; Query time: 311 msec
;; SERVER: 192.41.162.30#53(192.41.162.30)
;; WHEN: Mon Aug 12 09:17:58 CST 2024
;; MSG SIZE rcvd: 365
- 它依然没有 ANSWER SECTION 的部分,只有 AUTHORITY SECTION,给出了一级域名 ruanyifeng.com 的两台 DNS 服务器。
- 下面的 ADDITIONAL SECTION 就是这两台 DNS 服务器对应的 IP 地址。
第三步,再向一级域名的 DNS 服务器查询二级域名的 IP 地址。
dig @172.64.32.123 es6.ruanyifeng.com
返回结果如下。
; <<>> DiG 9.11.36-RedHat-9.11.36-14.el8_10 <<>> @172.64.32.123 es6.ruanyifeng.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29581
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;es6.ruanyifeng.com. IN A;; ANSWER SECTION:
es6.ruanyifeng.com. 300 IN A 104.198.14.52;; Query time: 855 msec
;; SERVER: 172.64.32.123#53(172.64.32.123)
;; WHEN: Mon Aug 12 09:20:38 CST 2024
;; MSG SIZE rcvd: 63
- 这次终于有了 ANSWER SECTION,得到了最终的二级域名的 IP 地址。
至此,三个步骤的 DNS 查询全部完成。
5. 简述DNS解析www.baidu.com的过程
- 客户端查询:
- 用户在浏览器中输入
www.baidu.com
。 - 浏览器首先检查本地缓存中是否有该域名对应的 IP 地址记录。
- 如果缓存中没有找到记录,则浏览器向本地 DNS 服务器发送查询请求。
- 用户在浏览器中输入
- 本地 DNS 服务器查询:
- 本地 DNS 服务器收到查询后,先检查自己的缓存中是否有记录。
- 如果缓存中没有记录,则向根 DNS 服务器发起查询。
- 根 DNS 服务器查询:
- 根 DNS 服务器不保存具体的域名和 IP 地址映射,而是知道顶级域(TLD)服务器的位置。
- 根 DNS 服务器返回
.com
顶级域服务器的信息。
- 顶级域(TLD)服务器查询:
- 顶级域服务器
.com
接收到查询后,返回baidu.com
的权威 DNS 服务器的信息。
- 顶级域服务器
- 权威 DNS 服务器查询:
- 权威 DNS 服务器
baidu.com
接收到查询后,返回www.baidu.com
的 A 记录(IPv4 地址)或 AAAA 记录(IPv6 地址)。
- 权威 DNS 服务器
- 响应客户端:
- 权威 DNS 服务器将结果返回给本地 DNS 服务器。
- 本地 DNS 服务器将结果返回给客户端浏览器,并将结果缓存起来以备后续查询。
注意事项:
- 缓存:DNS 查询的结果会被本地 DNS 服务器和其他中间服务器缓存一段时间,以减少未来的查询次数。
- 递归查询:本地 DNS 服务器通常执行递归查询,这意味着它会负责完成整个查询过程并返回结果给客户端。
- 迭代查询:在查询过程中,DNS 服务器之间的查询通常是迭代的,即每次查询只返回下一步的地址,直到找到权威 DNS 服务器为止。
参考
https://www.ruanyifeng.com/blog/2022/08/dns-query.html