DNS原理及其理解

DNS(Domain Name Server,域名服务器),是一个将域名和IP地址进行相互映射的分布式数据库。它的作用非常简单,就是根据域名查找出对应的IP地址。

DNS记录类型

常用的DNS的记录类型有A、AAAA、CNAME、NS、MX、PTR、TXT等,这里只介绍下文需要用到的类型。

  • A记录:将域名映射到一个IP地址。
  • CNAME:将域名映射到另外一个域名。
  • NS:域名由指定的DNS服务器负责解析。

假设DNS服务器中保存了以下记录:
DNS记录类型

查询过程:

  1. 查询域名www.web-security.cn:可以直接查询到对应的IP地址为11.11.11.11
  2. 查询域名b.security.cn:发现它是一条CNAME记录,指向另外一个域名a.web-security.cn,需要查询a.web-security.cn,才能知道b.web-security.cn实际指向的地址为22.22.22.22
  3. 查询域名c.web-security.cn:发现这是一条NS记录,需要向DNS服务器44.44.44.44发起查询,才能知道域名指向的地址。

域名结构

域名的结构是一个树形结构,如下图所示:
域名结构

根域名

根域名使用一个点号.或者.root表示,由于每个域名的结尾有.,所以一般忽略不写。

一级域名

一级域名,也叫顶级域名。例如.com, .net, .cn.互联网.google等等,至少有几百个,有兴趣可以参考维基百科-顶级域名列表

二级域名

二级域名是二级域名的子域名,一般开放给个人或者企业注册,例如我注册的web-security.cn

三级域名

同理,三级域名是二级域名的子域名。例如www.web-security.cnblog.web-security.cn。拥有二级域名后,同时也拥有了二级域名的子域名,包括三级域名、四级域名等等。

DNS服务器类型

DNS实际上是一个分布式的数据库,域名的解析记录分布在世界各地的服务器上。与域名的层级稍微有点类似,DNS服务器也分几个级别。查询DNS记录时,自顶向下依次查询。

根域名服务器

根域名服务器是DNS系统中最顶级的域名服务器,全球IPv4根服务器只有13台(但是有很多镜像服务器)。它们被编号为A-M,地址分别是:

  • a.root-servers.net
  • b.root-servers.net
  • c.root-servers.net
  • m.root-servers.net

每台根域名服务器上的配置都是一样的,都保存了负责解析一级域名的DNS服务器地址列表。这个列表叫做根域文件(Root Zone File)
从根域文件截取一部分内容如下:

1
2
3
4
5
6
cn.			172800	IN	NS	a.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS e.dns.cn.
......

上述配置表示,cn域名是由a.dns.cnb.dns.cn等权威DNS服务器负责解析,如果想查询cn的域名,就去找它们。同理,com域名的权威DNS服务器如下:

1
2
3
4
5
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 m.gtld-servers.net.

负责解析com域名的DNS服务器是*.gtld-servers.net.

权威DNS服务器

权威DNS是提供域名解析服务(增加、修改、删除域名与IP的对应关系)的服务器。其中又分为顶级域名权威服务器特定域名权威服务器

例如,上面根域文件中,负责解析cn.域名的DNS服务器a.dns.cn.就是一个顶级域名权威服务器,其中保存了所有.cn的二级域名。以我的域名web-security.cn为例:

1
2
web-security.cn.	86400	IN	NS	f1g1ns1.dnspod.net.
web-security.cn. 86400 IN NS f1g1ns2.dnspod.net.

这是保存在顶级域名权威服务器a.dns.cn上的记录,表示,域名web-security.cn由另外两台权威DNS服务器负责解析, 分别是f1g1ns1.dnspod.net.f1g1ns2.dnspod.net.

这两台权威DNS服务器就是特定域名DNS服务器,上面保存了web-security.cn的解析记录。进行域名解析操作时,实际上就是将域名与IP地址的对应关系存储到了这两台权威DNS服务器上。

本地DNS服务器

本地DNS服务器,也叫递归DNS服务器。也就是是我们电脑上配置的DNS服务器,我们的电脑需要查询域名的IP地址时,就会向本地DNS服务器发起请求。例如114.114.114.1148.8.8.8以及运营商自动分配的DNS都属于本地DNS服务器。

本地DNS服务器的作用是,当我们需要查询域名时,它会向根域名服务器、权威DNS服务器递归地发起查询请求,查询到IP地址后发送到我们的电脑。

查询过程

如果不考虑缓存,查询一个域名的过程是这样的:

  1. 我们的电脑向本地DNS服务器发起请求,查询域名www.web-security.cn
  2. 本地DNS服务器向根域服务器发起请求,查询域名www.web-security.cn.
  3. 根域服务器从根域文件Root Zone file中查找后,告诉本地DNS服务器,顶级域名cn.是由顶级域名权威服务器a.dns.cn.负责解析;
  4. 本地DNS服务器又向权威服务器a.dns.cn.发起请求,a.dns.cn.告诉本地DNS服务器,www.web-security.cn是由另外一台DNS权威服务器f1g1ns2.dnspod.net.负责解析。
  5. 本地DNS服务器又向权威服务器f1g1ns2.dnspod.net.发起请求,权威服务器告诉本地DNS服务器,www.web-security.cn的IP地址是111.111.111.111。
  6. 本地DNS服务器告诉我们的电脑,www.web-security.cn的IP地址是111.111.111.111。

从上述查询过程可以看出:

  • 本地DNS负责向根域服务器和权威服务器递归地发起请求,经过多次查询,才能查询到域名对应地IP地址。
  • 递归查询过程对于客户端来说是透明的,即我们的电脑只知道最后的IP地址是多少,不关心递归查询过程。

常见问题

如何理解递归查询?

本地DNS首先向根域服务器发起查询,然后向顶级域名权威服务器发起查询,然后…
其实不管本地DNS服务器向哪台DNS服务器发起查询,都是一样的处理:

  1. 如果收到NS记录,就向NS记录中的DNS服务器发起查询;
  2. 如果收到CNAME记录,就查询CNAME记录值中的域名;
  3. 如果收到A记录,就把对应的IP地址返回客户端,完成查询。

经过层层的递归查询,最后就能查找到域名对应的IP地址(或者查找失败)。

为什么根域名服务器的地址是个域名?

有的像是先有鸡还是现有蛋的问题。查询任何一个域名,本地DNS都需要向首先根域服务器发起请求,然而根域服务器地址是个域名,怎么查询根域服务器的IP呢?

放心,根域服务器的IP地址已经写到了本地DNS的配置中。这个配置叫做Root Hints,其中保存了各个根域服务器的域名和IP地址。