DNS递归查询与迭代查询的详细流程

名词解析

  1. - 域名:`www.google.com`
  2. - 客户端配置的本地名称服务器:`dns.google.com`
  3. - 域名根目录名称服务器`a.rootserver.net`
  4. - 主要角色
  5. - DNS 客户 -> `DNS 客户`
  6. - 本地名称服务器 -> `Local DNS`
  7. - 根名称服务器 ->`.`
  8. - 一级(顶级)名称服务器 -> `com`
  9. - 二级名称服务器 -> `google.com`
  10. - 权威名称服务器 -> `www.google.com`

基础知识

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 => 迭代查询
  • 递归查询本地名称服务器为中心,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 服务器的解析流程完全一样):

  1. DNS 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。

  2. 本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则向 DNS 客户端返回一条 DNS 应答报文,报文中会给出一些参考信息,如本地名称服务器上的根名称服务器地址等。

  3. DNS 客户端在收到本地名称服务器的应答报文后,会根据其中的根名称服务器地址信息,向对应的根名称服务器再次发出与前面一样的 DNS 查询请求报文。

  4. 根名称服务器在收到 DNS 查询请求报文后,通过查询自己的 DNS 数据库得到请求 DNS 域名中顶级域名所对应的顶级名称服务器信息,然后以一条 DNS 应答报文返回给 DNS 客户端。

  5. DNS 客户端根据来自根名称服务器应答报文中的对应顶级名称服务器地址信息,向该顶级名称服务器发出与前面一样的 DNS 查询请求报文。

  6. 顶级名称服务器在收到 DNS 查询请求后,先查询自己的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给 DNS 客户端,否则通过查询后把对应域名中二级域名所对应的二级名称服务器地址信息以一条 DNS 应答报文返回给 DNS 客户端。

  7. DNS 客户端继续按照步骤 5 与步骤 6 的方法分别向三级、四级名称服务器查询,直到查到最终的权威名称服务器返回到最终的记录。

如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。

DNS 查找到这里就基本来可以获取域名对应的 IP 了,除非需要查找的域名没有配置 IP 则查询失败。

DNS 迭代查询-示例

为了方便理解,例举一个具体的示例,看一下 DNS 迭代解析的工作流程:

  • 假设客户端想要访问自己并不识别的站点www.google.com,那么 DNS 客服端的查询路径如下:
  1. DNS 客户端向所配置的本地名称服务器 dns.google.com 发出解析 www.google.com 域名的 DNS 请求报文。

  2. 本地名称服务器收到 客户端的 DNS 查询请求报文后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器把所配置的根名称服务器 a.rootserver.net 地址信息以 DNS 应答报文返回给 DNS 客户端。

  3. DNS 客户端在收到本地名称服务器的 DNS 应答报文后,根据其中给出的根名称服务器地址信息,向对应的根名称服务器再次发送解析 www.google.com 域名的 DNS 请求报文)。

  4. 根名称服务器在收到 DNS 查询请求后,通过查询得到 .com 顶级域名所对应的顶级名称服务器,然后把查询到的对应顶级域名信息以一条 DNS 应答报文返回给 DNS 客户端。

  5. DNS 客户端在收到根名称服务器的 DNS 应答报文,得到 .com 顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条解析 www.google.com 域名的的 DNS 请求报文。

  6. .com 顶级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,先查询自己的缓存,假设也没有该域名的记录项,则查询 google.com 所对应的二级名称服务器,然后把查询到的对应二级域名信息以一条 DNS 应答报文返回给 DNS 客户端。

  7. DNS 客户端在收到 .com 顶级名称服务器的 DNS 应答报文,得到 google.com 二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条解析 www.google.com 域名的 DNS 请求报文。

  8. google.com 二级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,也先查询自己的缓存,假设也没有该域名的记录项,则查询 www.google.com 所对应的权威名称服务器(因为这个名称服务器已包括了整个域名 www.google.com 所在区域),然后把查询到的对应权威域名信息以一条 DNS 应答报文返回给 DNS 客户端。

  9. DNS 客户端在收到 google.com 二级名称服务器的 DNS 应答报文,得到 www.google.com 三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送解析 www.google.com 域名的 DNS 请求报文。

  10. 权威名称服务器``www.google.com在收到 DNS 客户端的 DNS 查询请求报文后,在它的 DNS 区域数据库中查找,最终得出了 www.google.com 域名所对应的 IP 地址。然后向 DNS 客户端返回一条 DNS 应答报文。这样 DNS 客户端获取 IP 地址后就可以正常访问这个网站了。

DNS 递归查询

递归查询(递归解析)默认的 DNS 解析方式。在这种解析方式中,如果客户端配置的本地名称服务器遇到不能解析的,则后面的查询全由本地名称服务器代替DNS 客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉 DNS 客户端查询的结果。

在递归查询过程中,一直是以本地名称服务器为中心的,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态的,直到本地名称服务器返回最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。

如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,则递归解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS 服务器的解析流程完全一样):

  1. 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。

  2. 本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以 DNS 客户端的角色发送与前面一样的 DNS 域名查询请求发给根名称服务器。

  3. 根名称服务器收到 DNS 请求后,把所查询得到的所请求的 DNS 域名中顶级域名所对应的顶级名称服务器地址返回给本地名称服务器。

  4. 本地名称服务器根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的 DNS 域名查询请求。

  5. 顶级名称服务器在收到 DNS 查询请求后,也是先查询自己的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的二级域名所对应的二级名称服务器地址。

  6. 本地名称服务器根据根名称服务器所返回的二级名称服务器地址,向对应的二级名称服务器发送与前面一样的 DNS 域名查询请求。

  7. 二级名称服务器在收到 DNS 查询请求后,也是先查询自己的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的三级域名所对应的三级名称服务器地址。

  8. 就这样本地名称服务器重复步骤 6 和步骤 7 的方法一次次地向三级、四级名称服务器等查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。

  9. 然后再由本地名称服务器返回给 DNS 客户同时本地名称服务器会缓存本次查询得到的记录项。

如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。

简单的讲,递归查询步骤;

  1. 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求,发出请求后客户端一直处于等待状态,等待本地名称服务器返回查询结果。
  2. 本地名称服务器收到 DNS 请求后,先查询本地的缓存,查到存在该域名记录项立即返回结果,否则本地名称服务器不断向 DNS 名称服务器发送 DNS 请求查询,直到查到改域名对应的权威名称服务器并获得记录结果。
  3. 本地名称服务器 解析到结果后将结果返回给 客户端

DNS 递归查询-示例

为了方便理解,例举一个具体的示例,看一下 DNS 递归解析的工作流程:

  • 假设客户端想要访问自己并不识别的站点www.google.com,那么 DNS 客服端的查询路径如下:
  1. DNS 客户端 向所配置的本地名称服务器 dns.google.com 发出解析 www.google.com 域名的 DNS 请求报文。

  2. 本地名称服务器收到请求后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器向所配置的根名称服务器 a.rootserver.net 发出解析请求解析 www.google.com 域名的 DNS 请求报文(相当于对本地名称服务器说:“请给我 www.google.com 所对应的 IP 地址”)。

  3. 根名称服务器收到 客户端的 DNS 查询请求报文后,通过查询得到.com 顶级域名所对应的顶级名称服务器,然后向本地名称服务器返回一条应答报文(相当说“我不知道www.google.com 域名所对应的 IP 地址,但我现在告诉你 .com 域名所对应的顶级名称服务器地址”)。

  4. 本地名称服务器在收到根名称服务器的 DNS 应答报文,得到 .com 顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条请求解析 www.google.com 域名的 DNS 请求报文。

  5. .com顶级名称服务器在收到 DNS 请求报文后,先查询自己的缓存,假设也没有该域名的记录项,则查询 google.com 所对应的二级名称服务器,然后也向本地名称服务返回一条 DNS 应答报文(相当于对本地名称服务器说:“我不知道 www.google.com 域名所对应的 IP 地址,但我现在告诉你 google.com 域名所对应的二级名称服务器地址”。

  6. 本地名称服务器在收到 .com 顶级名称服务器的 DNS 应答报文,得到google.com 二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条请求解析 www.google.com 域名的 DNS 请求报文。

  7. google.com 二级名称服务器在收到 DNS 请求报文后,也先查询自己的缓存,假设也没有该域名的记录项,则查询 www.google.com 所对应的权威名称服务器,然后也向本地名称服务器返回一条 DNS 应答报文(相当于本地名称服务器说:“我不知道 www.google.com 域名所对应的 IP 地址,但我现在告诉你 www.google.com 域名所对应的权威名称服务器地址”)。

  8. 本地名称服务器在收到 google.com 二级名称服务器的 DNS 应答报文,得到 www.google.com 三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送一条请求解析 www.google.com 域名的 DNS 请求报文。

  9. www.google.com``权威名称服务器在收到 DNS 请求后,在它的 DNS 区域数据库中查找,最终得出了www.google.com 域名所对应的 IP 地址。然后向本地名称服务器返回到条 DNS 应答报文(相当于对本地名称服务器说:“www.google.com 域名的 IP 地址为 xxx.xxx.xxx.xxx”)。

  10. 本地名称服务器收到权威名称服务器的应答报文后, DNS 客户端返回一条 DNS 应答报文告诉 DNS 客户端所得到的www.google.com 域名的 IP 地址。这样 DNS 客户端就可以正常访问这个网站了。

PS:DNS 是基于 UDP 做的查询,大家也可以考虑下为什么之前不考虑使用 TCP 去实现。

相关文献


文章标签:

原文连接:https://juejin.cn/post/7042956796020916261

相关推荐