DNS(Domain Name Server,域名服务器),是一个将域名和IP地址进行相互映射的分布式数据库。它的作用非常简单,就是根据域名查找出对应的IP地址。
DNS记录类型
常用的DNS的记录类型有A、AAAA、CNAME、NS、MX、PTR、TXT等,这里只介绍下文需要用到的类型。
- A记录:将域名映射到一个IP地址。
- CNAME:将域名映射到另外一个域名。
- NS:域名由指定的DNS服务器负责解析。
假设DNS服务器中保存了以下记录:
查询过程:
- 查询域名
www.web-security.cn
:可以直接查询到对应的IP地址为11.11.11.11
。 - 查询域名
b.security.cn
:发现它是一条CNAME记录,指向另外一个域名a.web-security.cn
,需要查询a.web-security.cn
,才能知道b.web-security.cn
实际指向的地址为22.22.22.22
。 - 查询域名
c.web-security.cn
:发现这是一条NS记录,需要向DNS服务器44.44.44.44
发起查询,才能知道域名指向的地址。
域名结构
域名的结构是一个树形结构,如下图所示:
根域名
根域名使用一个点号.
或者.root
表示,由于每个域名的结尾有.
,所以一般忽略不写。
一级域名
一级域名,也叫顶级域名。例如.com
, .net
, .cn
,.互联网
,.google
等等,至少有几百个,有兴趣可以参考维基百科-顶级域名列表。
二级域名
二级域名是二级域名的子域名,一般开放给个人或者企业注册,例如我注册的web-security.cn
。
三级域名
同理,三级域名是二级域名的子域名。例如www.web-security.cn
, blog.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)。 从根域文件截取一部分内容如下:
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.cn
、b.dns.cn
等权威DNS服务器负责解析,如果想查询cn
的域名,就去找它们。同理,com
域名的权威DNS服务器如下:
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
为例:
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.114
、8.8.8.8
以及运营商自动分配的DNS都属于本地DNS服务器。
本地DNS服务器的作用是,当我们需要查询域名时,它会向根域名服务器、权威DNS服务器递归地发起查询请求,查询到IP地址后发送到我们的电脑。
查询过程
如果不考虑缓存,查询一个域名的过程是这样的:
- 我们的电脑向本地DNS服务器发起请求,查询域名
www.web-security.cn
; - 本地DNS服务器向根域服务器发起请求,查询域名
www.web-security.cn.
; - 根域服务器从根域文件Root Zone file中查找后,告诉本地DNS服务器,顶级域名
cn.
是由顶级域名权威服务器a.dns.cn.
负责解析; - 本地DNS服务器又向权威服务器
a.dns.cn.
发起请求,a.dns.cn.
告诉本地DNS服务器,www.web-security.cn
是由另外一台DNS权威服务器f1g1ns2.dnspod.net.
负责解析。 - 本地DNS服务器又向权威服务器
f1g1ns2.dnspod.net.
发起请求,权威服务器告诉本地DNS服务器,www.web-security.cn
的IP地址是111.111.111.111。 - 本地DNS服务器告诉我们的电脑,
www.web-security.cn
的IP地址是111.111.111.111。
从上述查询过程可以看出:
- 本地DNS负责向根域服务器和权威服务器递归地发起请求,经过多次查询,才能查询到域名对应地IP地址。
- 递归查询过程对于客户端来说是透明的,即我们的电脑只知道最后的IP地址是多少,不关心递归查询过程。
常见问题
如何理解递归查询?
本地DNS首先向根域服务器发起查询,然后向顶级域名权威服务器发起查询,然后... 其实不管本地DNS服务器向哪台DNS服务器发起查询,都是一样的处理:
- 如果收到
NS
记录,就向NS记录中的DNS服务器发起查询; - 如果收到CNAME记录,就查询CNAME记录值中的域名;
- 如果收到A记录,就把对应的IP地址返回客户端,完成查询。
经过层层的递归查询,最后就能查找到域名对应的IP地址(或者查找失败)。
为什么根域名服务器的地址是个域名?
有的像是先有鸡还是现有蛋的问题。查询任何一个域名,本地DNS都需要向首先根域服务器发起请求,然而根域服务器地址是个域名,怎么查询根域服务器的IP呢?
放心,根域服务器的IP地址已经写到了本地DNS的配置中。这个配置叫做Root Hints,其中保存了各个根域服务器的域名和IP地址。