Zoey
Published on

DNS 解析

Tags

DNS 解析

DNS ( Domain Name System,域名系统)提供了将域名转换为 IP 地址的服务。为了完成这个转化工作,DNS 的数据库中需要维护相关的数据,这些数据被叫做 RR(Resource Record,资源记录)。资源记录有很多种类型,比如 A、NS、SOA、CNAME 和 PTR 记录。

大家接触最多的就是 A(Address)记录。A 记录是一条从域名到 IP 地址的映射记录。而 CNAME(Canonical Name)记录是一条从域名到域名的映射记录。它在 CDN 技术中有举足轻重的作用,很好地实现了业务域名与 CDN 系统域名的解耦。简单理解,如果一个域名配置了 A 记录,DNS 就会把它解析成 A 记录指定的 IP 地址;如果一个域名配置了 CNAME 记录,DNS 就会把它解析成 CNAME 记录指定的另外一个域名;A 记录和 CNAME 记录是互斥的,不能同时存在。

NS (Name Server)记录是和 DNS 服务器相关的一条记录,它指定该域名应该由哪一台 DNS 服务器进行解析。一般把通过 NS 记录指定的 DNS 服务器叫做该域名的权威 DNS 服务器。

存在 DNS 缓存时的解析过程

有缓存时,递归的方式为从左到右,即: www.google.com -> google.com -> .com 每个电脑都有自己的浏览器 DNS 缓存,比如 chrome://net-internals/#dns 下可以直接查询 chrome 中的 DNS 缓存。操作系统,host 文件等也存在 DNS 缓存。当本地存在缓存时,解析过程:

  • 在浏览器中输入 www.google.com 后浏览器会先查看自身有没有对这个域名的缓存,有则返回。
  • 浏览器中没有缓存再去问操作系统缓存中是否有对这个域名的缓存,有则返回。
  • 操作系统中没有缓存则再去 hosts 文件中查找,有则返回。
  • hosts 文件中也没有时才会再去问本地域名服务器。
  • 本地域名服务器会先看自身有没有 www.google.com 对应 IP,也就是权威域名服务器中的 A 记录,有则返回。
  • 本地域名服务器中没有则再去问 google.com 域名服务器有没有 NS 记录,有则去问它。
  • 上述都没有则再去问顶级域名服务器 .com 域名服务器中有没有 NS 记录,
  • 如果顶级域名服务器中也没有 NS 记录才会去问根域名服务器。

不存在 DNS 缓存的解析过程

当连顶级域名服务器中也没有 NS 记录,会从右到左的进行域名解析,即: . -> .com -> google.com. -> www.google.com. 。 最后的一个 . 为根域名服务器。

  • 在浏览器中输入 www.google.com 后询问本地域名服务器: www.google.com 的 IP 是什么
  • 本地域名服务器不知道其对应 IP,则会询问根域名服务器: .(根域名服务器) 的 IP 是什么
  • 根域名服务器答复: 我也不知道,但是 .com 域名服务器有可能知道,你可以去问问它
  • 本地域名服务器向 .com 域名服务器询问: www.google.com 的 IP 是什么
  • .com 域名服务器答复: 我也不知道,但是 google.com 域名服务器有可能知道,你可以去问问它
  • 本地域名服务器向 google.com 域名服务器询问: www.google.com 的 IP 是什么
  • google.com 域名服务器答复: 对应的 IP 或者 别名为 1.1.1.1
  • 如果本地域名服务器得到的是一个别名,则还需要对别名进行查询
  • 本地域名服务器得到 IP 之后本地域名服务器做两件事情:
  • 将 IP 返回给浏览器 并将 IP 放到缓存中

DNS 负载均衡与 CDN 就近访问

CNAME 域名是 CDN 供应商提供的,CDN 供应商拥有对 CNAME 域名的配置权。CDN 供应商会把 CNAME 域名的 NS 记录设置为自己搭建的 DNS 服务器。这样一来,解析 CNAME 域名的时候就会请求 CDN 供应商搭建的 DNS 服务器。而 CDN 供应商在 DNS 服务器中实现了负载均衡,会返回离用户较近的边缘层节点的 IP 地址。如此便实现了就近访问。


参考链接