azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.84k stars 260 forks source link

【每日一题】- 2020-04-03 - DNS查询是递归查询还是迭代查询? #108

Closed azl397985856 closed 4 years ago

azl397985856 commented 4 years ago

递归查询指的是查询请求发出后,域名服务器代为向下一级域名服务器发出请求,最后向用户返回查询的最终结果。使用递归 查询,用户只需要发出一次查询请求。

迭代查询指的是查询请求后,域名服务器返回单次查询的结果。下一级的查询由用户自己请求。使用迭代查询,用户需要发出 多次的查询请求。

那么DNS查找过程使用的是递归查询还是迭代查询呢?

扩展:

azl397985856 commented 4 years ago

DNS

DNS工作就是将域名映射为IP。 当然域名包括www域名,邮箱域名等等。

工作原理

分层

首先我们将域名进行分层。 其中层之间以点分割。分为顶级域名,根域名和次级域名

image

将域名解析为IP的过程也是类似。 我们将DNS也分为几类,分别处理顶级域名,根域名和次级域名。

image

首先我们会请求本地DNS服务器,本地资源服务器会经过一系列操作,拿到我们想到的IP地址。可能是一个IP,也可能是一个IP LIST,我们从中选择一个连接(大型网站都是这么做的)。

image

负载均衡

上面提到了DNS会返回一个IP LIST。 那么如果客户端随机选择一个IP,就可以做到负载均衡了。

guaizi149 commented 4 years ago

感觉本地服务器向远端查询时,应该使用的是迭代。可以使用dig +trace www.xxx.com来查看。 具体可参考

Zephylaci commented 4 years ago

简单..看了下描述,那重点其实是这里的“本地DNS服务器”是指客户端本身的一个服务.. 还是首选DNS服务器? 如果是客户端本身..那实际就是迭代? 如果其实是首选DNS服务器在做迭代那其实就是递归?

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

suukii commented 4 years ago

授权型 DNS 服务器

授权型 DNS 服务器(authoritative DNS server, aka, nameserver 名称服务器),会把它们所管理的域名下的所有 IP 地址存放在数据库中,我们向授权型 DNS 服务器查询某个域名的 IP 地址时,可以直接获取返回结果。

比如 github.com 的一个授权型 DNS 服务器是 ns-421.awsdns-52.com.,我们可以通过

dig @ns-421.awsdns-52.com github.com +short

直接查到 github.com 的 IP 地址,+short 是一个参数,表示只显示结果,隐藏其他查询细节。

不过通常客户端不会对授权型 DNS 服务器直接进行查询,而是通过递归型 DNS 服务器。

递归型 DNS 服务器

递归型 DNS 服务器(recursive DNS server)并不知道哪个域名对应哪个 IP 地址,它们是通过向授权型 DNS 服务器询问,最终找到正确的 IP 地址,然后把 IP 地址进行缓存以便再次查询。

dig github.com +trace

使用 +trace 参数会显示递归查询的过程。

如何通过递归型 DNS 服务器查询 IP 地址?

dns

  1. 用户在浏览器中输入 github.com
  2. github.com 请求被路由到 DNS 解析程序(一般由 ISP 进行管理);
  3. 如果 ISP 的 DNS 解析程序上有 github.com IP 地址的缓存,直接返回缓存,如果没有缓存或者缓存已过期,那就继续查询;
  4. DNS 解析程序将请求转发到 DNS 根名称服务器(root nameserver);
  5. 根名称服务器根据请求的信息,决定把请求转发到 .com 域的一个 TLD(top-level domain)名称服务器;
  6. 对于这个请求,.com 域的名称服务器响应了 8 个与 github.com 相关的名称服务器;
  7. ISP 的 DNS 解析程序选择其中一个名称服务器 ns-421.awsdns-52.com. 并向它转发 github.com 请求;
  8. 这个名称服务器在托管 github.com 的区域找到相应的 IP 地址 13.229.188.59 返回;
  9. ISP 的 DNS 解析程序最终获取用户需要的 IP 地址,将它缓存起来,并把地址返回给浏览器;
  10. 浏览器将请求发送到 13.229.188.59
  11. 13.229.188.59 上的 Web 服务器将页面返回显示在浏览器中。
stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.