首页 > 代码库 > DNS原理入门

DNS原理入门

DNS是互联网上最重要的协议之一,DNS服务是其他很多服务的基础服务,本文详细介绍DNS的原理,并介绍如何使用工具观察DNS的运作机制。

技术分享


一、DNS是什么?


DNS(Domain Name System,域名系统),是一种应用层协议,它要实现的功能是将IP与主机名的映射关系存储在DNS服务器上,而最常用的功能是将主机名解析为IP地址,这样用户就可以基于一串易于记住的字符串(主机名)访问互联网上的主机了,而不需要记住一串难记的数字(IP地址)。这个DNS服务器可以理解为数据库,这个数据库上是按照键值格式存储IP地址与主机名的映射的。


举个例子,当你要访问百度时,只需要键入www.baidu.com,就可以访问到百度在互联网上提供的Web服务器上的资源,而不需要知道这台Web服务器的IP地址是多少。

技术分享


除了能够将主机名解析为IP地址之外,也可以将IP地址解析为主机名,但并不是互联网上的主机IP地址都能解析为主机名。


虽然对于用户来说,DNS服务器的作用只是根据用户的请求返回查询结果,例如用户请求解析www.baidu.com,而DNS返回其IP地址。但背后整个查询过程是比较复杂的,要了解DNS的查询过程,首先要了解DNS的查询方式;而要了解DNS的查询方式,需要先了解什么是FQDN以及DNS的分级查询。


二、DNS的分级查询


问:DNS服务器是如何查到IP地址对应的主机名的?答案是分级查询。


我们不妨使用dig工具查看www.baidu.com对应的A记录(IP地址),如下:

[root@localhost ~]# dig www.baidu.com

; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1087
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		128	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	128	IN	A	163.177.151.110
www.a.shifen.com.	128	IN	A	163.177.151.109

;; Query time: 61 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Mon Mar 27 20:13:29 CST 2017
;; MSG SIZE  rcvd: 90

上面这段信息可分为四段。

第一段是一些查询参数。

; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1087
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0


第二段显示要查询的内容。

;; QUESTION SECTION:
;www.baidu.com.			IN	A

注意:这里显示的是www.baidu.com.,尾部多了一个点。


第三段是DNS服务器的答复。

;; ANSWER SECTION:
www.baidu.com.		128	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	128	IN	A	163.177.151.110
www.a.shifen.com.	128	IN	A	163.177.151.109

上面结果显示,www.baidu.com.的别名是www.a.shifen.com.,而且有两条A记录,即有两个IP地址。其中‘128‘是TTL(Time to Live的缩写),表示该记录缓存128s,即在128s内不需要重新查询。


第四段是DNS服务器传输的信息。

;; Query time: 61 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Mon Mar 27 20:13:29 CST 2017
;; MSG SIZE  rcvd: 90

上面结果显示,查询时间为61ms,DNS服务器为223.5.5.5,查询端口为53,以及回应长度为90字节。


那什么是分级查询?

在上面的例子中,每个域名的尾部都多了一个点。

;; QUESTION SECTION:
;www.baidu.com.			IN	A

比如,www.baidu.com应该写为www.baidu.com.mirrors.163.com应该写为mirror.163.com.。这不是疏忽,而是每个域名后面都有一个根域名。


举个例子,www.example.com的完整写法是:www.example.com.root,简写为www.example.com.。因为.root对所有域名都是一样的,因此可省略不写。


根域名的下一级是“顶级域名”(Top-Level Domian,缩写为TLD),比如.com.net.org等。顶级域名的下一级是“次级域名”(Second-Level Domian,缩写为SLD),比如www.example.com里面的.examplewww.baidu.com里面的.baidu,这一级域名是用户可以注册的。再下一级是主机名(host),这一级又称“三级域名”(3TLD),比如www.example.com里面的www,这一级是用户在自己域内的服务器。


总结一下,域名的层级结构是这样的:

主机名.次级域名.顶级域名.根域名

#即:
host.sld.tld.root

这是常见的格式,也可以有不同的格式,例如github.map.fastly.net。对于域名的层级结构可用树状来理解。


我们称由这样的域名层级结构组织的每一个域名为FQDN(Full Qualified Domian Name,完全合格域名)



三、DNS的查询方式


(1)递归查询

向DNS服务器发出查询请求,这个DNS服务器接收到请求后进行查询,并只返回查询结果给DNS客户端。例如DNS客户端向一个DNS服务器查询www.baidu.com的IP地址,而DNS返回www.baidu.com对应的IP地址给请求者。


(2)迭代查询

向DNS服务器发出查询请求,这个DNS服务器接收到请求后进行查询,并返回受其管理的DNS服务器的IP地址,让DNS客户端自己去请求另一台DNS服务器主机。例如DNS客户端向根域DNS(.root)请求解析www.baidu.com的IP地址时,根域DNS服务器返回的是受其管理的域名为.baidu的DNS服务器主机IP地址,让DNS客户端自己去请求这个域名为.baidu的DNS服务器主机,最后这个DNS服务器才返回www.baidu.com的IP地址给客户端。


需要注意的是,迭代查询的好处是减缓了根域DNS服务器的压力,因为假如所有的请求都基于递归方式的话,那么根域对于接收到的每一个请求都必须为之做递归查询,这给根域DNS服务器的系统资源带来很大的消耗。


而在现实中,我们常常指向的DNS服务器(例如114.114.114.114)是缓存DNS服务器,其本身不负责解析域,但可代用户做DNS迭代查询,此时这个缓存DNS服务器充当DNS客户端的角色,从根域开始做查询,之后把查询结果返回给用户,而对于用户来说,这个缓存DNS服务器为用户做的递归查询。因此在平时,我们通过DNS查询一个主机名的IP地址是基于两种方式(递归和迭代)来进行查询的,其中在用户和缓存DNS服务器之间做的是递归查询,而在缓存DNS服务器开始从根域DNS服务器查询一直到最后获取IP地址的过程做的是迭代查询。为了减少查询时间,缓存DNS服务器在返回查询结果给用户之后,会将查询结果缓存在本地一段时间。



四、DNS分级查询示例


dig命令的+trace选项可显示DNS的整个分级查询过程。


[root@localhost ~]# dig +trace math.stackexchange.com


命令的执行结果第一段显示13个根域名服务器.的NS记录(Name Server的缩写)。

技术分享

根据内置的根域名服务器IP地址,DNS服务器向这些根域名服务器发出查询请求,询问math.stackexchange.com的顶级域名.com的NS记录。最先回复的根域名服务器会被缓存,下一次只向这台服务器发出查询请求。

接着是第二段。

技术分享

技术分享

上面第二段列出了13条.com的NS记录,同时还返回了每一条NS记录对应的IP地址。这段信息是由根域名服务器返回的,并且可以看到,最先回复的是f.root-servers.net这台根域名服务器。

然后,DNS服务器向这些顶级域名服务器分别发出请求,询问math.stackexchange.com的次级域名stackexchange.com的NS记录。

技术分享

技术分享

上面第三段信息显示4条stackexchange.com的NS记录,同时返回的还有每一条NS记录对应的IP地址。这段信息是由顶级域名服务器返回的,且最先返回的是b.gtld-servers.net这台服务器。

接着,DNS服务器向分别这四个次级域名服务器查询math.stackexchange.com的主机名为math的IP地址。

技术分享

上面结果显示,math.stackexchange.com一共有4条A记录,即通过这4个IP地址均可访问到math.stackexchange.com这台主机。并且还显示,最先回复的是ns-1029.awsdns-00.org这台次级域名服务器,IP地址为205.251.196.5,其监听端口号为53(默认的DNS端口号)。


五、总结:DNS查询过程


总结一下,当你在浏览器的地址栏输入http://www.baidu.com时,浏览器这个应用程序就会开始进行查询操作:

(1)查找本地的hosts文件,如果在hosts文件中有www.baidu.com与其IP地址对应的映射,则返回这个IP地址映射。

这个hosts文件在Windows系统上为C:\Windows\System32\drivers\etc\hosts,而在Linux系统上为/etc/hosts.


(2)如果在hosts文件中没有找到IP地址映射,则查找本地dns解析器缓存中是否有网址与IP地址的映射关系,如果有,则返回这个IP地址映射。

本地dns解析器缓存是系统上的一个缓存机制,在Windows系统上有开启这个功能,可在命令行界面下输入‘ipconfig/displaydns‘查询当前系统上的缓存记录。但在Linux系统上没有开启这个功能,如果要在Linux系统上进行缓存,可借用DNS协议的实现工具,例如bind这个应用程序,可以通过‘rndc dumpdb‘命令来查看DNS Cache,不过rndc需要事先配置好。这个命令会在/var/named(这个目录是在bind的配置文件named.conf中指定的)目录中生成named_dump.db文件。


(3)如果在hosts文件和本地dns解析器缓存中都没有找到这个网址和IP的映射,则会找网络配置中指向的主DNS服务器。这个主DNS服务器收到请求之后,如果该DNS服务器有缓存服务器(.com)的IP地址映射,则直接返回;否则从根域开始迭代查询www.baidu.com的A记录。  

在Linux之下就是利用/etc/resolv.conf这个文件,而在Windows下通过查询网卡配置属性可得知DNS服务器指向,如图。

技术分享


(4)向最顶层的根域名服务器(.(root))查询,根域名服务器返回顶级域名(.com)的NS记录,即返回.com的DNS服务器地址。

用户指向的DNS服务器会主动向.(root)询问www.baidu.com的IP地址,而根域服务器检查之后发现,www.baidu.com中的.com是受自己管理的,所以.(root)就告知:“虽然我不知道这部主机的IP,不过,你应该向.com这个域的DNS服务器询问。我跟你说,.com这个域的DNS服务器在哪里吧。”


(5)向第二层的.com服务器查询,.com服务器返回次级域名(.baidu.com)的NS记录,即返回.baidu.com的DNS服务器地址。

接着,用户指向的DNS服务器继续向.com这个域的DNS服务器询问,经过比对之后发现,.baidu.com是我们要找的区域,所以.com的DNS服务器会告知说:“你去找.baidu.com这个域的DNS服务器吧,我给你它的IP。”


(6)向第三层的.baidu.com服务器查询,.baidu.com服务器返回受其管理的www.baidu.com这台主机的A记录,即返回其IP地址。

然后,用户指向的DNS服务器再去询问.baidu.com这个域的DNS服务器。.baidu.com这个域的DNS服务器一看,发现www就是自己负责管理的主机,所以会说:“没错,这台主机是我管理的,我跟你说它的IP是......”所以此时用户指向的DNS服务器就知道www.baidu.com这台主机的IP地址是什么了。


(7)用户指向的这台DNS服务器查到了www.baidu.com对应的IP地址之后,记录在缓存中并返回给用户。

每次查询到的结果都会缓存在DNS服务器中,这样下次有相同的请求时,则直接返回缓存的IP地址即可,可快速响应,并且节省了大量的系统资源和网络带宽。问题是,如果在缓存过程中,对方的主机名和IP地址的映射关系调整了,那么在用户询问时DNS服务器会返回旧的IP地址映射。所以,DNS服务器上的缓存是有期限的,这个期限通常是数十分钟到三天之内。因此当一个domain name修改之后,可能需要2到3天后才能全面启用。


(8)用户根据DNS服务器返回的IP地址就可以对网站进行访问。

如果用户使用的Windows系统的话,则会通过系统的缓存机制把这个刚刚查询到的主机名和IP地址映射关系记录下来。同样地可在命令行下使用‘ipconfig/displaydns‘查询DNS Cache。


图解DNS查询主机名的流程:

技术分享

六、DNS服务器类别


从上面的DNS查询过程中可以发现,DNS服务器有多种类型,例如上述中用户指定的缓存DNS服务器,其本身不负责解析一个或多个域,但却可以帮助用户去迭代查询,并把查询结果缓存给自己一份,这种就是缓存名称服务器。而例如根域名服务器、顶级域名服务器、次级域名服务器等,这些服务器负责解析一个或多个域。


因此,按照DNS服务器是否负责解析至少一个域可分为两类:

(1)负责至少解析一个域

主DNS服务器
从DNS服务器

(2)不负责域解析

缓存DNS服务器


之所以有主-从DNS服务器是为了避免出现单点故障问题。如果只有一台DNS服务器管理一个或多个域、主机,那么当这台服务器出故障了,别人也访问不了下一层的域或主机。


本文出自 “Tab” 博客,请务必保留此出处http://xuweitao.blog.51cto.com/11761672/1911227

DNS原理入门