DNS递归查询与迭代查询的详细流程
持续更新...
# 前言
# 名词解析
- 域名:`www.google.com`
- 客户端配置的本地名称服务器:`dns.google.com`
- 域名根目录名称服务器`a.rootserver.net`
- 主要角色
- DNS 客户 -> `DNS 客户`
- 本地名称服务器 -> `Local DNS`
- 根名称服务器 ->`.`
- 一级(顶级)名称服务器 -> `com`
- 二级名称服务器 -> `google.com`
- 权威名称服务器 -> `www.google.com`
2
3
4
5
6
7
8
9
10
11
12
# 基础知识
DNS,Domain Name System/域名系统,一个面向互联网的将域名和 IP 地址相互映射的一个分布式数据库。是一个树状结构的记录、映射域名和 IP 地址的分布式系统。DNS 查询使用 UDP 协议。
为啥需要 DNS 呢,因为终端间的数据交互是通过 IP 地址来定位目标的,IP 地址如 192.168.8.8。由于人类对无规律的 IP 地址不容易记忆,因此一般使用 域名地址 来代替 IP 地址 进行搜索使用,但实际上终端间的访问最终还是通过 域名地址映射获取 IP 地址来访问的。
用户习惯使用域名地址来访问终端,当浏览器发出请求后,操作系统会使用 DNS 来查询域名地址对应的 IP 地址是什么,查询成功后操作系统会通过 IP 地址来访问终端来获取资源。
域名 DNS 名称服务器查询都是从根部.
按照从右往左顺序原则进行的。
通常情况下,主机向本地名称服务器的查询一般都是采用递归查询,而本地名称服务器向 DNS(一级、二级、三级...)名称服务器采用迭代查询。
主机的 DNS 查询主要有两种方式,递归查询 和 迭代查询,其主要区别为:
发送 DNS 查询时,DNS
请求报头部
的RD 字段
默认为1
,默认为递归查询
。- RD 为
1
=>递归查询
,默认查询方式 - RD 为
0
=>迭代查询
- RD 为
递归查询
以本地名称服务器
为中心,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当于中介代理
的作用。递归查询
的触发条件:1. 默认触发;2. RD 设置为 1 触发;迭代查询
以DNS客户端自己
为中心。所有查询工作全部是 DNS 客户端自己进行。DNS客户
会按照顺序 向 本地名称服务器 、一级名称服务器、二级名称服务器、权威名称服务器发出查询 DNS 的 请求查询报文,这个过程中每一级服务器就会返回一个能解答这个查询的下一个名称服务器列表 A,获取到下个查询列表信息 A 后 DNS 客户 会再向返回的列表 A 中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。迭代查询
的触发条件:1. 在所配置的本地名称服务器上查询触发(因为本地名称服务器禁止使用递归查询);2. RD 设置为 0 触发;递归查询
和迭代查询
查询一级域名服务器到权威域名服务器的步骤相似,主要区别是递归查询
以本地名称服务器
为中心进行查询,迭代查询
以DNS客户端自己
为中心查询。
# DNS 迭代查询
迭代查询,也叫迭代解析。使用迭代解析方式时,所有的查询工作都是由 DNS 客户自己进行的。如果它所配置的主名称服务器(如 Windows 系统中的首选 DNS 服务器
)不能解析的话,客户端还会继续向所配置的其它名称服务器(如 Windows 系统中的备用 DNS 服务器
)查询。
如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,迭代名称解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS 服务器的解析流程完全一样):
DNS 客户端
向本机配置的本地名称服务器
发出 DNS 域名查询请求。本地名称服务器
收到请求后,先查询本地的缓存
,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则向 DNS 客户端返回一条 DNS 应答报文,报文中会给出一些参考信息,如本地名称服务器上的根名称服务器地址等。DNS 客户端
在收到本地名称服务器的应答报文后,会根据其中的根名称服务器地址信息,向对应的根名称服务器再次发出与前面一样的 DNS 查询请求报文。根名称服务器
在收到 DNS 查询请求报文后,通过查询自己的 DNS 数据库得到请求 DNS 域名中顶级域名所对应的顶级名称服务器信息,然后以一条 DNS 应答报文返回给 DNS 客户端。DNS 客户端
根据来自根名称服务器应答报文中的对应顶级名称服务器地址信息,向该顶级名称服务器发出与前面一样的 DNS 查询请求报文。顶级名称服务器
在收到 DNS 查询请求后,先查询自己的缓存
,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给 DNS 客户端,否则通过查询后把对应域名中二级域名所对应的二级名称服务器地址信息以一条 DNS 应答报文返回给 DNS 客户端。DNS 客户端
继续按照步骤 5 与步骤 6 的方法分别向三级、四级名称服务器查询,直到查到最终的权威名称服务器返回到最终的记录。
如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。
DNS 查找到这里就基本来可以获取域名对应的 IP 了,除非需要查找的域名没有配置 IP 则查询失败。
# DNS 迭代查询-示例
为了方便理解,例举一个具体的示例,看一下 DNS 迭代解析的工作流程:
- 假设客户端想要访问自己并不识别的站点
www.google.com
,那么 DNS 客服端的查询路径如下:
DNS 客户端
向所配置的本地名称服务器dns.google.com
发出解析www.google.com
域名的 DNS 请求报文。本地名称服务器
收到 客户端的 DNS 查询请求报文后,先查询本地缓存
。假设没有查到该域名对应记录,则本地名称服务器把所配置的根名称服务器a.rootserver.net
地址信息以 DNS 应答报文返回给 DNS 客户端。DNS 客户端
在收到本地名称服务器的 DNS 应答报文后,根据其中给出的根名称服务器地址信息,向对应的根名称服务器再次发送解析www.google.com
域名的 DNS 请求报文)。根名称服务器
在收到 DNS 查询请求后,通过查询得到.com
顶级域名所对应的顶级名称服务器,然后把查询到的对应顶级域名信息以一条 DNS 应答报文返回给 DNS 客户端。DNS 客户端
在收到根名称服务器的 DNS 应答报文,得到.com
顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条解析www.google.com
域名的的 DNS 请求报文。.com
顶级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,先查询自己的缓存
,假设也没有该域名的记录项,则查询google.com
所对应的二级名称服务器,然后把查询到的对应二级域名信息以一条 DNS 应答报文返回给 DNS 客户端。DNS 客户端
在收到.com
顶级名称服务器的 DNS 应答报文,得到google.com
二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条解析www.google.com
域名的 DNS 请求报文。google.com
二级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,也先查询自己的缓存
,假设也没有该域名的记录项,则查询www.google.com
所对应的权威名称服务器(因为这个名称服务器已包括了整个域名www.google.com
所在区域),然后把查询到的对应权威域名信息以一条 DNS 应答报文返回给 DNS 客户端。DNS 客户端
在收到google.com
二级名称服务器的 DNS 应答报文,得到www.google.com
三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器
发送解析www.google.com
域名的 DNS 请求报文。权威名称服务器``www.google.com
在收到 DNS 客户端的 DNS 查询请求报文后,在它的 DNS 区域数据库中查找,最终得出了www.google.com
域名所对应的IP 地址
。然后向 DNS 客户端返回一条 DNS 应答报文。这样 DNS 客户端获取 IP 地址后就可以正常访问这个网站了。
# DNS 递归查询
递归查询(递归解析)
是默认的 DNS 解析方式。在这种解析方式中,如果客户端配置的本地名称服务器遇到不能解析的,则后面的查询全由本地名称服务器
代替DNS 客户端
进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉 DNS 客户端查询的结果。
在递归查询过程中,一直是以本地名称服务器为中心的,DNS 客户端
只是发出原始的域名查询请求报文,然后就一直处于等待状态
的,直到本地名称服务器
返回最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。
如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,则递归解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS 服务器的解析流程完全一样):
客户端
向本机配置的本地名称服务器
发出 DNS 域名查询请求。本地名称服务器
收到请求后,先查询本地的缓存
,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以 DNS 客户端的角色发送与前面一样的 DNS 域名查询请求发给根名称服务器。根名称服务器
收到 DNS 请求后,把所查询得到的所请求的 DNS 域名中顶级域名所对应的顶级名称服务器地址返回给本地名称服务器。本地名称服务器
根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的 DNS 域名查询请求。顶级名称服务器
在收到 DNS 查询请求后,也是先查询自己的缓存
,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的二级域名所对应的二级名称服务器地址。本地名称服务器
根据根名称服务器所返回的二级名称服务器地址,向对应的二级名称服务器发送与前面一样的 DNS 域名查询请求。二级名称服务器
在收到 DNS 查询请求后,也是先查询自己的缓存
,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的三级域名所对应的三级名称服务器地址。就这样
本地名称服务器
重复步骤 6 和步骤 7 的方法一次次地向三级、四级名称服务器等查询,直到
最终的对应域名所在区域的权威名称服务器
返回到最终的记录给本地名称服务器。然后再由
本地名称服务器
返回给DNS 客户
,同时
本地名称服务器会缓存
本次查询得到的记录项。
如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。
简单的讲,递归查询步骤;
客户端
向本机配置的本地名称服务器
发出 DNS 域名查询请求,发出请求后客户端
一直处于等待状态,等待本地名称服务器
返回查询结果。本地名称服务器
收到 DNS 请求后,先查询本地的缓存
,查到存在该域名记录项立即返回结果,否则本地名称服务器
不断向 DNS 名称服务器发送 DNS 请求查询,直到查到改域名对应的权威名称服务器
并获得记录结果。本地名称服务器
解析到结果后将结果返回给客户端
。
# DNS 递归查询-示例
为了方便理解,例举一个具体的示例,看一下 DNS 递归解析的工作流程:
- 假设客户端想要访问自己并不识别的站点
www.google.com
,那么 DNS 客服端的查询路径如下:
DNS 客户端
向所配置的本地名称服务器dns.google.com
发出解析www.google.com
域名的 DNS 请求报文。本地名称服务器
收到请求后,先查询本地缓存
。假设没有查到该域名对应记录,则本地名称服务器向所配置的根名称服务器a.rootserver.net
发出解析请求解析www.google.com
域名的 DNS 请求报文(相当于对本地名称服务器说:“请给我www.google.com
所对应的 IP 地址”)。根名称服务器
收到 客户端的 DNS 查询请求报文后,通过查询得到.com
顶级域名所对应的顶级名称服务器,然后向本地名称服务器返回一条应答报文(相当说“我不知道www.google.com
域名所对应的 IP 地址,但我现在告诉你.com
域名所对应的顶级名称服务器地址”)。本地名称服务器
在收到根名称服务器的 DNS 应答报文,得到.com
顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条请求解析www.google.com
域名的 DNS 请求报文。.com
顶级名称服务器在收到 DNS 请求报文后,先查询自己的缓存
,假设也没有该域名的记录项,则查询google.com
所对应的二级名称服务器,然后也向本地名称服务返回一条 DNS 应答报文(相当于对本地名称服务器说:“我不知道www.google.com
域名所对应的 IP 地址,但我现在告诉你google.com
域名所对应的二级名称服务器地址”。本地名称服务器
在收到.com
顶级名称服务器的 DNS 应答报文,得到google.com
二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条请求解析www.google.com
域名的 DNS 请求报文。google.com
二级名称服务器在收到 DNS 请求报文后,也先查询自己的缓存
,假设也没有该域名的记录项,则查询www.google.com
所对应的权威名称服务器,然后也向本地名称服务器返回一条 DNS 应答报文(相当于本地名称服务器说:“我不知道www.google.com
域名所对应的 IP 地址,但我现在告诉你www.google.com
域名所对应的权威名称服务器地址”)。本地名称服务器
在收到google.com
二级名称服务器的 DNS 应答报文,得到www.google.com
三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送一条请求解析www.google.com
域名的 DNS 请求报文。www.google.com``权威名称服务器
在收到 DNS 请求后,在它的 DNS 区域数据库中查找,最终得出了www.google.com
域名所对应的 IP 地址。然后向本地名称服务器返回到条 DNS 应答报文(相当于对本地名称服务器说:“www.google.com
域名的 IP 地址为 xxx.xxx.xxx.xxx”)。本地名称服务器
在收到权威名称服务器
的应答报文后,向DNS 客户端
返回一条 DNS应答报文
,告诉 DNS 客户端所得到的www.google.com
域名的IP 地址
。这样 DNS 客户端就可以正常访问这个网站了。
PS:DNS 是基于 UDP 做的查询,大家也可以考虑下为什么之前不考虑使用 TCP 去实现。
# 相关文献
- DNS 的递归查询与迭代查询-原文
- 例解 DNS 递归/迭代名称解析原理-csdn
- dnscheck-工具
- 《深入理解计算机网络》