# DNS 解析

# DNS 解析过程

  1. 操作系统首先检查本地的 hosts 文件中是否有请求网址的映射,如果有,优先调用这个 IP 地址映射,完成解析
  2. 检查浏览器自身有没有缓存过要解析的域名对应的 IP 地址
    如果有,解析完成
    如果没有,首先找 TCP/IP 参数中设置的首选 DNS 服务器(本地 DNS 服务器),向本地 DNS 服务器发起查询
  3. 本地 DNS 服务器收到查询时,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析
  4. 如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置,采用递归查询或迭代查询,直至解析完成

# 递归查询

举例:客户端想访问 XXX 网站,要进行 DNS 解析

  1. 客户端向本地 DNS 服务器询问域名对应的 IP 地址
  2. 本地 DNS 服务器不知道,于是说:"根域名服务器可能知道,我替你去问问他"
  3. 本地 DNS 服务器:"根域名服务器大佬,请求 XXX 的 IP 地址是多少?"
    根域名服务器:"不好意思我也不知道,但是 A 顶级域名服务器可能知道,我替你去问问他"
  4. 根域名服务器:"A 顶级域名服务器,求问 XXX 的 IP 地址是多少?"
    A 顶级域名服务器:"不好意思我不也知道,但是B域名服务器可能会知道,我替你去问他吧"
    ......依次循环重复这个过程直到找到或者询问完所有的 DNS 服务器没有找到
  • 找到了 -> 一层一层返回 IP 地址(递归求解的过程)
  • 没找到 -> 返回错误信息

递归查询是类似一层一层代理查询,查询到了之后又一层一层返回结果,客户端只需要发送一次查询请求

# 迭代查询

举例:客户端想访问 XXX 网站,要进行 DNS 解析

  1. 客户端向本地 DNS 服务器询问域名对应的 IP 地址
  2. 本地 DNS 服务器不知道,于是说:"根域名服务器可能知道,你自己去问他吧"
  3. 客户端:"根域名服务器大佬,求问 XXX 的 IP 地址是多少?"
    根域名服务器:“不好意思,我不也知道,但是 A 顶级域名服务器可能会知道,你自己去问他吧"
    根域名服务器将 A 顶级域名服务器的地址发给客户端
  4. 客户端跑去问 A 顶级域名服务器
    ......依次循环这个过程直到找到或者询问完所有的 DNS 服务器没有找到
  • 如果查询到了 -> 客户端是直接拿到 IP 地址(一手信息,而不是经转得到)
  • 如果没找到 -> 返回错误信息

迭代查询是亲力亲为,所有苦力都是自己一个干,其他人只是给你指个路

# 总结

  • 递归查询:客户端只发出一次请求,要求对方给出最终结果
  • 迭代查询:客户端发出一次请求,对方如果没有授权回答,他就会返回一个能解答这个查询的其他名称服务器列表,客服端再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器

授权回答:向 DNS 服务器查询一个域名,如果这个域名刚好是本服务器负责,返回的结果就是授权回答

# 递归查询和迭代查询使用场景

  • 客户端 - 本地 DNS 服务器:递归查询 -> 本地 DNS 服务器代替客户端去查询
  • DNS 服务器之间:迭代查询 -> 本地 DNS 服务器向其他根域名服务器一个个查询
Last Updated: 5/6/2020, 11:48:16 AM