跳到主要内容

DNS

DNS,Domain Name System,域名系统,其主要任务是进行从主机名到 IP 地址的转换。用户很难记住 IP 地址,于是便于用户记忆的主机名字代替 IP 地址。DNS 能够把互联网上的主机名字转换成 IP 地址。

DNS 被设计成为一个联机分布式数据库系统

DNS 通过 UDP 协议将用户数据报发给本地域名服务器(使用 UDP 为了减少开续)

域名结构

任何联机在互联网上的主机或路由器,都有一个唯一的层次结构名字,域名(domain name)

DNS 域名服务器按照层次安排。每一个域名服务只对域名体系下的一部分进行管辖。根据域名服务器所起的作用,可以把域名划分四种不同的类型:

  • 根域名服务器:根域名服务器是最高层次的域名服务器。如果本地域名服务器无法解析域名,就首先求助于根服务器
  • 顶级域名服务器:负责管理在该顶级域名服务器注册的所有二级域名
  • 权限域名服务器:保存该区中的所有主机的域名到 IP 地址的映射
  • 本地域名服务器:当一个主机发起 DNS 查询请求,首先发给本地域名服务器

解析过程

  1. 本地电脑会检查浏览器缓存中有没有这个域名对应的解析过的 IP 地址,如果缓存中有,这个解析过程就结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过 TTL 属性来设置。这个缓存时间太长和太短都不太好,如果时间太长,一旦域名被解析到的 IP 有变化,会导致被客户端缓存的域名无法解析到变化后的 IP 地址,以致该域名不能正常解析,这段时间内有一部分用户无法访问网站。如果设置时间太短,会导致用户每次访问网站都要重新解析一次域名。

  2. 如果浏览器中没有数据,浏览器会查找操作系统缓存中是否有这个域名对应的 DNS 解析结果。其实操作系统也有一个域名解析的过程,在 Linux 中可以通过/etc/hosts文件来设置,而在 window 中可以通过C:\\Windows\System32\drivers\etc\hosts文件来设置,用户可以将任何域名解析到任何能够访问的 IP 地址。例如,我们在测试时可以将一个域名解析到一个测试服务器上,这样不用修改任务代码就能测试到单独服务器上的代码业务逻辑是否正确。正式因为有这种本地 DNS 解析的过程,所以有黑客就可能通过修改用户的域名来把特定域名解析到他指定的 IP 地址上,导致这些域名被劫持。

  3. 前两个过程无法解析时,就要用到我们网络设置中的 DNS 服务器地址。操作系统会把这个域名发给本地域名服务器。每个完整的内网通常都会配置本地域名服务器,例如用户是学校或者工作单位接入互联网,那么用户的本地域名服务器肯定在学校或工作单位里面。他们一般会缓存域名解析结果。

  4. 如果本地域名服务器没有命中,就直接到根域名服务器请求解析。

  5. 根域名服务器返回给本地域名服务器一个顶级域名服务器地址。它是国际顶级域名服务器,如.com/.cn/.org等,

  6. 本地 域名服务器再向上一步获得顶级服务器发送的解析请求

  7. 接受请求的顶级域名服务器查找并返回此域名对应的权限域名服务器的地址,这个权限域名服务器就是要访问网站域名提供商的服务器,其实该域名的解析任务就是由域名提供商的服务器来完成的。比如要访问www.baidu.com,而这个域名是从 A 公司注册获得的,那么 A 公司上的服务器就会有www.baidu.com的相关信息

  8. 区域服务器会查询存储的域名和 IP 的映射关系表,在把查询出来的域名和 IP 地址等信息,连同一个 TTL 值返回给本地域名服务器

  9. 返回该域名对应的 IP 和 TTL 值,本地域名服务器会缓存这个域名和 IP 的对应关系,缓存时间由 TTL 值控制

  10. 把解析的结果返回给本地电脑,本地电脑根据 TTL 值缓存在本地系统缓存中,域名解析过程结束在实际的 DNS 解析过程中,可能还不止这 10 步,如 权限域名服务器可能有很多级,或者有一个 GTM 来负载均衡控制,这都有可能会影响域名解析过程。

递归查询

主机像本地域名服务器的查询一般采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其根域名服务器继续发出查询请求报文(即该该主机继续查询),而不是让该主机自己进行下一步的查询。

迭代查询

本地域名服务区向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向那个域名服务器进行查询”。然后让本地域名服务器继续后续的查询(而不是替本地域名服务器进行后续的查询)。根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出索要查询的 IP 地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询,本地域名服务器就这样进行迭代查询。最后,知道了所要解析的域名的 IP 地址,然后把这个结果返给发起查询的主机。

区别

递归查询:客户端-本地域名服务器,返回的结果:查询成功或查询失败
迭代查询:本地域名服务器-其他域名服务器,返回的结果:最佳的查询点或主机地址

缓存

为了提高 DNS 查询效率,并减轻根域名服务器的负荷和减少互联网上的 DNS 查询报文数量,在域名服务器中广泛使用了高速缓存(有时已成为高速缓存域名服务器)。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录

总结

  • DNS 分布式数据库系统
  • 使用 UDP 协议
  • 客户端到本地域名服务器递归查询
  • 域名服务器之间迭代查询
  • DNS 域名解析过程:浏览器缓存->系统 hosts 文件->本地 DNS 解析器缓存->本地域名服务器->根域名服务器->顶级域名服务器->权限域名服务器->本地域名服务器

参考资料

  1. https://www.cnblogs.com/crazymakercircle/p/14976612.html#autoid-h2-5-0-0
  2. https://blog.csdn.net/bangshao1989/article/details/121913780
  3. 计算机网络(第 7 版)