一 、DNS是什么?

DNS,即域名系统(Domain Name System),是计算机网络中的一项基础服务。通常来说,在网络上访问某个主机有两种方式:主机名、或IP地址。我们知道在网络层,通信需要使用IP地址进行定位,因此为了能够将主机名映射为IP地址,DNS服务应运而生。
显然,DNS协议是一个应用层协议(类似于HTTP、FTP、SMPT等),其运行在UDP之上,使用53号端口。另外,DNS辅域名服务器会定时向主域名服务器查询一次数据变动情况,如果数据发生变动,会使用TCP协议进行一次区域传送,进行数据同步。
DNS从设计上像是一个分层的、分布式的数据库,这和域名分级是类似的。

二、 DNS服务器类型

粗略来说,DNS服务器具有以下几种:

  • 根DNS服务器。根服务器在逻辑上共有13个(即13个IP地址),分布在世界各地。由于UDP查询和响应报文的最大长度为512字节,为了保证根服务器数据能被包含在一个UDP包中,最多只能允许13个根DNS服务器存在,其命名从A到M。
  • 顶级域DNS服务器。这些服务器负责顶级域名的DNS查询,如com、org、net等,以及国家的顶级域名。
  • 权威DNS服务器。特定的机构为了使得自己的域名可以被公共访问,需要维护对应的DNS记录。可以选择自己的权威DNS服务器以保存这些记录,也可以选择支付费用以存储在某个服务提供商的权威DNS服务器中。
  • 本地DNS服务器。对于一个ISP来说,都有一台本地DNS服务器承担代理的作用。它严格上并不属于DNS层级中。

三、 DNS通信过程

例如访问一个_www.baidu.com_的地址,DNS查询过程主要包括递归查询与迭代查询:

  • 查询本地浏览器缓存
  • 查询本地hosts文件
  • 请求本地DNS服务器进行域名查询(至此的查询为递归查询)
  • 若本地DNS服务器没有对应地址的缓存,则请求根DNS服务器,返回com顶级DNS服务器的地址。
  • 请求com顶级DNS服务器,获得baidu.com权威DNS服务器的地址
  • 请求baidu.com权威DNS服务器,获得www.baidu.com的地址(至此的查询为迭代查询)

下图展示了这一查询过程。


如果每次查询都经过这样的全部过程,那耗时将是不可接受的,因此DNS缓存应运而生。在整个DNS网络中,当某个DNS服务器接受到一个DNS应答时,它将在本地进行缓存,从而在未来的一段时间内(例如2天)对于同样的域名进行直接应答,从而减少请求的次数。

四、 DNS记录类型

DNS服务器实际存储的是一条条资源记录(Resource Record,RR),一条资源记录包括以下4个字段:Name、Value、Type和TTL。其中TTL表示该记录应从缓存中删除的时间,其余三个字段在不同的组合下拥有如下的含义:

TYPE NAME VALUE 含义
A 主机名 主机名的IP地址 提供一条主机名到IP地址的映射(ipv4)
AAAA 主机名 主机名的IP地址 提供一条主机名到IP地址的映射(ipv6)
NS 该域中权威DNS的主机名 路由DNS查询
CNAME 主机别名 规范主机名 提供一个主机别名到规范主机名的映射
MX 邮件服务器别名 规范主机名 提供一个邮件服务器别名到规范主机名的映射

需要注意的是,CNAMEMX记录均提供的是主机名间的映射,因此邮件服务器和其他服务器允许使用相同的别名而被映射到不同的服务器。

五、DNS解析流程实例

www.baidu.com这个域名为例,使用dig工具查看其DNS解析流程。
首先我们在命令行输入:

dig +trace www.baidu.com

即可看到这个域名的解析流程。显然,首先需要获得根DNS服务器的列表与对应的IP地址(未显示):

; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
;; global options: +cmd
.           2165    IN  NS  a.root-servers.net.
.           2165    IN  NS  b.root-servers.net.
.           2165    IN  NS  c.root-servers.net.
.           2165    IN  NS  d.root-servers.net.
.           2165    IN  NS  e.root-servers.net.
.           2165    IN  NS  f.root-servers.net.
.           2165    IN  NS  g.root-servers.net.
.           2165    IN  NS  h.root-servers.net.
.           2165    IN  NS  i.root-servers.net.
.           2165    IN  NS  j.root-servers.net.
.           2165    IN  NS  k.root-servers.net.
.           2165    IN  NS  l.root-servers.net.
.           2165    IN  NS  m.root-servers.net.
;; Received 239 bytes from 223.5.5.5#53(223.5.5.5) in 76 ms

列表中第一列.表示所在域(即记录中的Name),第二列**2165**表示TTL(从响应可以看到,根DNS服务器列表是从局域网地址得到的),第三列NS表示记录类型,第四列***.root-servers.net**即为根DNS服务器的域名。需要注意的是,这里所有的记录都是NS类型的,表示如果想要解析.域下的域名,需要请求NS类型中的地址作为其DNS服务器。

接下来,选择一个根DNS服务器(可以看到,选择的是c.root-servers.net),获得com顶级域DNS服务器的列表:

com.            172800  IN  NS  f.gtld-servers.net.
com.            172800  IN  NS  k.gtld-servers.net.
com.            172800  IN  NS  b.gtld-servers.net.
com.            172800  IN  NS  g.gtld-servers.net.
com.            172800  IN  NS  c.gtld-servers.net.
com.            172800  IN  NS  e.gtld-servers.net.
com.            172800  IN  NS  j.gtld-servers.net.
com.            172800  IN  NS  a.gtld-servers.net.
com.            172800  IN  NS  l.gtld-servers.net.
com.            172800  IN  NS  h.gtld-servers.net.
com.            172800  IN  NS  d.gtld-servers.net.
com.            172800  IN  NS  m.gtld-servers.net.
com.            172800  IN  NS  i.gtld-servers.net.
com.            86400   IN  DS  19718 13 2 8ACBB0CD28F41250A80A491389424D341522D946B0DA0C0291F2D3D7 71D7805A
com.            86400   IN  RRSIG   DS 8 1 86400 20240723170000 20240710160000 20038 . OfDtFYEgmnoIzOWqzMKhlw3Aw0G3twEqAbKm53KH2EwZQk87W04LMWO6 DAaruRa1J/AfFjEJIe8O7sMZXgrLQqNsbsF0ENvM0a1D4ds7oQt7e0ZH FRjGjQpFGAbDL1z3NvZ8WeXvpJDen7frbi8D4l+3NGOHFY7bOFM2TwPq yYlNNswjgncnznBYsy2EMPN13pTlho0G2pNP+cCqvZ0FDVE3k8DzJpl1 WJxBnlcFvJuKlmLOwuO0PFrGx32IsJdft8GejEit1uGQTv2/wMGVj/BC c+wNEJH8cqkzU8MJ+/IdRa9F3fW41sitRYRNkpNxsvT9bttY7K5RjIKj SkfQJA==
;; Received 1176 bytes from 192.33.4.12#53(c.root-servers.net) in 182 ms

同理得到baidu.com权威DNS服务器的列表:

baidu.com.      172800  IN  NS  ns2.baidu.com.
baidu.com.      172800  IN  NS  ns3.baidu.com.
baidu.com.      172800  IN  NS  ns4.baidu.com.
baidu.com.      172800  IN  NS  ns1.baidu.com.
baidu.com.      172800  IN  NS  ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 13 2 86400 20240715002454 20240707231454 956 com. tzsJ3z4Kk4KryI1O0h5CIzr28u4EV4XP/ZAgWu2AXJfKxvbZfAycog1V CJB55AyLB+17t54QOsdjTlYN1KSmvA==
HPVV1UNKTCF9TD77I2AUR73709T975GH.com. 86400 IN NSEC3 1 1 0 - HPVVP23QUO0FP9R0A04URSICJPESKO9J  NS DS RRSIG
HPVV1UNKTCF9TD77I2AUR73709T975GH.com. 86400 IN RRSIG NSEC3 13 2 86400 20240718004722 20240710233722 956 com. jufH2opJnm7T6wF6DIHNvz/zRbSuI81M5G9Js1zImbdNrMlL0PxVJF0q QCvnh9uPYVLdkUgXMRaBLiFwCGRmNA==
;; Received 657 bytes from 192.41.162.30#53(l.gtld-servers.net) in 171 ms

www.baidu.com.      1200    IN  CNAME   www.a.shifen.com.
;; Received 72 bytes from 220.181.33.31#53(ns2.baidu.com) in 44 ms

可以发现baidu.com域下有5个域名服务器(nsx.baidu.com),最终我们选择一个域名服务器,解析我们最终需要的域名www.baidu.com:
这里出现了一个CNAME记录,可见www.baidu.com实际是www.a.shifen.com的别名。因此我们需要重新对www.a.shifen.com这个域名进行解析。重复的流程不再赘述,最终可以得到这个域名的解析结果:

www.a.shifen.com.   120 IN  A   180.101.50.188
www.a.shifen.com.   120 IN  A   180.101.50.242
a.shifen.com.       1200    IN  NS  ns2.a.shifen.com.
a.shifen.com.       1200    IN  NS  ns3.a.shifen.com.
a.shifen.com.       1200    IN  NS  ns4.a.shifen.com.
a.shifen.com.       1200    IN  NS  ns5.a.shifen.com.
a.shifen.com.       1200    IN  NS  ns1.a.shifen.com.
;; Received 335 bytes from 14.215.177.229#53(ns4.a.shifen.com) in 33 ms

终于出现了我们需要的A记录,我们也最终获得了www.baidu.com的IP地址:180.101.50.188180.101.50.242

六、其他关于DNS参考链接

为什么中国没有DNS根服务器
国内DNS大全
根域名服务器 - MBA智库百科
中国域名根服务器有什么用
全球根域名管理机构主席澄清关于根服务器若干传言_国际互联网发展_网络研究_赛尔网络
什么是 Anycast?
IP anycast + BGP 网络技术 - du-z - 博客园
如何给服务器申请dns
如何搭建一个DNS服务器
CloudXNS、Route 53、阿里云解析等 DNS 服务的全面对比 | ZE3kr