很多朋友可能会发现,在添加 CNAME、MX、NS 等记录的时候,记录值后面通常会自动补充一个”.”(如下图),那为什么会自动添加这个”.”呢?
DNSPod控制台

为什么会自动添加”.”呢?

DNS 命名空间结构

要知到答案,那首先我们应该了解一下 DNS 的层次结构,域名空间实际上是一个树状结构(大概像下图),在这个“树”中任何一个节点完整的域名都是从root到该节点路径上所有标签的逆序组合,或从该节点到root路径上所有标签的顺序组合,中间以”.”分隔。
域名空间
以本站首页域名为例,从”r2wind”到根域名”root”,所以该节点完整的域名则为”r2wind.cn.”(最后面的”.”代表 root,实际上是以”.”和一个空标签结尾的),但为了方便通常写成一个单独的”.”这种写法也被称为完全限定域名 (FQDN) 。

只不过平时在访问的时候,我们通常不会写成”r2wind.cn.”这种形式,而是直接写成”r2wind.cn”,但是在解析系统中这个点是不允许被省略的,不然可能会出现一些奇奇怪怪的问题,当然最重要的是要符合RFC的相关规范。

有关 RFC 的详细信息,可访问互联网工程工作组 (IETF) 的官网查看:IETF | Internet Engineering Task Force

递归 DNS 解析过程

估计到现在大家可能还可能有点懵,那我们再来看看递归 DNS 解析过程,来帮助大家的理解:
下面是一个完整的递归 DNS 解析过程:

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
39
40
41
42
43
44
45
46
47
48
49
50
rttw@Kincaid:~$ dig www.r2wind.cn +trace

; <<>> DiG 9.19.4-1+0~20220818.83+debian11~1.gbp3f0f1b-Debian <<>> www.r2wind.cn +trace
;; global options: +cmd
. 0 IN NS f.root-servers.net.
. 0 IN NS e.root-servers.net.
. 0 IN NS j.root-servers.net.
. 0 IN NS i.root-servers.net.
. 0 IN NS g.root-servers.net.
. 0 IN NS b.root-servers.net.
. 0 IN NS d.root-servers.net.
. 0 IN NS h.root-servers.net.
. 0 IN NS c.root-servers.net.
. 0 IN NS k.root-servers.net.
. 0 IN NS l.root-servers.net.
. 0 IN NS m.root-servers.net.
. 0 IN NS a.root-servers.net.
;; Received 432 bytes from 192.168.192.1#53(192.168.192.1) in 859 ms
# 递归返回根域名服务器的 NS 记录

cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS ns.cernet.net.
cn. 172800 IN NS g.dns.cn.
cn. 172800 IN NS f.dns.cn.
cn. 86400 IN DS 57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn. 86400 IN RRSIG DS 8 1 86400 20220920040000 20220907030000 20826 . Pir1xOUL//xWJtc9ey7zZJDmwSPnXHGGLTHpxxuOKwxchQkQvoSYGtCG L6YrRWEpFputpuFpK3DvPCbtPZQMje1Mr2H4vT7nZ47ht0Xr2brWSDlR maELk8iKsuNYwoJ3fL75yn1N0jEABxnYFfo9r4Pp0nfN0XVAIHvAiGE8 nhEFSmmmEZidrLfPT84+QKeXOc8fotDme/Byi5F3Uc3IRu8mq7BE/N/+ 4nXAVgXbWhO9/ULnlAK76bFqoz0qZmvrcrmSB08K//QVG4io+4nbpFyl dUlziRCAiT6h7L6WwK9XDBeWNhSMptvYJRVS01rC2X7OWqKvnU2fL/Bs FYzCSg==
;; Received 708 bytes from 202.12.27.33#53(m.root-servers.net) in 99 ms
# 根域名服务器返回 cn 域名的 NS 记录

;; UDP setup with 2001:dc7::1#53(2001:dc7::1) for www.r2wind.cn failed: network unreachable.
;; UDP setup with 2001:dc7::1#53(2001:dc7::1) for www.r2wind.cn failed: network unreachable.
;; UDP setup with 2001:dc7::1#53(2001:dc7::1) for www.r2wind.cn failed: network unreachable.
r2wind.cn. 86400 IN NS ns3.dnsv4.com.
r2wind.cn. 86400 IN NS ns4.dnsv4.com.
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QHKTF6LTFG8AAFUUAJSR8RVAJP99SFU NS SOA RRSIG DNSKEY NSEC3PARAM
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220929034902 20220830024902 38388 cn. nQpTOptIW40mn9r1uPSO/yIvyEcdfV/zhfXVU/nZptRs+gDk8MYnqO7c i3yXB2XYzZFXM3ofDWXIJHgHq42agy02zSkDKN3XabB0Y6F2Oy3FhFBP O5fNM97I5Nu1NEE2ZZ5XyGAfMZyNhjsOry66+56C4s/Dlu1LcE151vey ecY=
8TF4MEBDESE2OSVH717D9VC1F7BFN1VI.cn. 21600 IN NSEC3 1 1 10 AEF123AB 8TKMCNJ923RR3GI4UAK4FF8RHB788CNF CNAME RRSIG
8TF4MEBDESE2OSVH717D9VC1F7BFN1VI.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220929034902 20220830024902 38388 cn. MgMG/eoy7e3ugs4TjsTxf5Ji9mvFsYYJpM+e4LayayDIMzs3JpkdKgEn ba3BmaaKclE6aDe8iL0uYSNiUMRgfMJb10yg066tDn+6bQH7BHl0paNY REZMB/+idFumyB3icj+JjCxrQe7j2fPp6aQUv3VBaEVLrp22XbnWZsbx scI=
;; Received 608 bytes from 202.112.0.44#53(ns.cernet.net) in 29 ms
# cn 域名服务器返回 r2wind.cn. 的 NS 记录

www.r2wind.cn. 600 IN A 120.78.190.225
r2wind.cn. 86400 IN NS ns4.dnsv4.com.
r2wind.cn. 86400 IN NS ns3.dnsv4.com.
;; Received 112 bytes from 1.12.0.25#53(ns3.dnsv4.com) in 39 ms
# r2wind.cn 域名服务器返回 www.r2wind.cn. 的 A 记录

由上面一大串的流程中可以看到查询是从根开始进行查询的,然后根据返回的各个域名 NS 记录进行查询,直到查询到最终的 A 记录。

可能你会好奇,为什么要有根?

根的主要作用是管理互联网的主目录。可以设想一下,如果没有根,以查询 tencent.com 为例,在查询解析的时候你得先找到 com 的 NS 记录及其对应的 IP 地址,然后才能获取到 tencent.com 的 NS记录 继续进行递归查询。

不知道这里会不会有人说那我挨个获取就好了,何必需要根呢?
不得不说这是个好问题,但理想很丰满,现实很骨感,目前全球共有1591个 TLD ,你可以试想一下,你获取这些 TLD 的 NS 记录需要多长时间,而且这些 TLD 的 NS 记录是不断变化的,如果你要想自己维护的话,头大不说,还可能会有很多隐患。交给根他不香嘛?

域名分级

提到这里,那我们再说说域名分级,我们平时能注册到的域名到底是几级域名呢?

答案是二级。

那域名究竟是如何分级的?
回到上面的树状图,我们可以看到,root 下面有若干个顶级域名,例如:cn、com、org、edu等等,这些被称为顶级域名或者一级域名;这些顶级域名下面又分为若干个二级域名,以 cn 为例,下面有若干个二级域名,例如:dnspod、r2wind,而二级域名下面可能又会分为若干个三级域名,以 dnspod 为例,下面又分为了若干个三级域名,例如:www、docs、console 等等,以此类推,这就是域名的分级。

总结一下域名分级规则:

  • 顶级域名(TLD):顶级域是root的子域,例如:com;
  • 一级域名(FLD):一级域也是root的子域(一级域和顶级域是同一个概念);
  • 二级域名(SLD):二级域是一级域的子域,例如:tencent.com是 com 的子域;
  • 依此类推…..

加”.”会影响解析嘛?

仔细看看上面的解析过程,除了一开始输入命令的时候后面没有”.”,剩下其他域名哪个后面没有”.”呢?
在 DNS 中,加”.”不会影响解析,但是不加”.”可能就是另一个故事(事故)啦。所以当你设置相关的记录不能解析的时候,别再怪后面自动加了”.”,找找其他的原因吧。

下面是一个有趣的例子,我查询的是 me,却返回了 me.r2wind.cn的 A 记录:

1
2
3
4
5
6
7
root@Kincaid:~# nslookup me 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: me.r2wind.cn
Address: 106.52.72.124

这是因为我设置了主机的本地域名,所以系统会自动在后面添加上 r2wind.cn,但当我在查询 me 加了”.”后,可以看到报错了,如下:

1
2
3
4
5
6
7
root@Kincaid:~# nslookup me. 8.8.8.8
;; communications error to 8.8.8.8#53: timed out
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
*** Can't find me: No answer

报错的原因也很简单,加”.”系统会认为你查询的是一个完整的域名,这种情况下系统不会在后面添加本地域名,而是直接进行递归查询,但 me 这个域是没有解析 A/AAAA 记录的,所以就会报错。

这里不知道会不会有人说顶级域哪有解析 A/AAAA 记录的,感兴趣的话你可以去访问一下 http://ai./ 这个顶级域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@Kincaid:~# dig ai. @8.8.8.8

; <<>> DiG 9.19.4-1+0~20220818.83+debian11~1.gbp3f0f1b-Debian <<>> ai. @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15833
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;ai. IN A

;; ANSWER SECTION:
ai. 21600 IN A 209.59.119.34

;; Query time: 319 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Thu Sep 08 08:29:01 CST 2022
;; MSG SIZE rcvd: 47

是不是有人想问域名 ai 的后缀是什么?是根 (root) 。

总结

好像说了好多废话哈哈哈,总结一下吧:

  • 不要觉得加”.”很奇怪,如果你觉得奇怪,建议抽空了解一下 DNS 相关的知识吧。
  • 加”.”不会影响解析!加”.”不会影响解析!加”.”不会影响解析!——重要的事情说三遍
  • 由于博主的水平有限,文章中可能会有一些错误,欢迎各位大佬批评指正。

参考

其他

附上一些区域文件:
https://www.internic.net/domain/db.cache
https://www.internic.net/domain/root.zone
https://www.internic.net/domain/arpa.zone
https://www.internic.net/domain/ip6.arpa.zone