DNS 解析的原理

提起 DNS,大家都知道是将域名映射成 IP 的一种协议。但是我花了很长时间才真正理解这个“映射”的过程。网上有很多介绍 DNS 的资料,但是遗漏了很多细节,比如都跨过了哪一些缓存,谁去真正发出查询的 packet。我们电脑要配置 DNS 服务器,如果你有网站的话,你会发现你的网站也有一个配置项叫 DNS 解析服务器,这两种服务器是一样的吗?还有一些图和资料是错误的,比如有些图画的是根域名服务器指向权威域名服务器,给人造成一种错觉是根服务器去查询了权威服务器。

本文试图用简单并且准确的图片和文字解释 DNS 查询的过程,以及一些我曾经有的困惑。如果有何 RFC 冲突的地方那肯定是我错了,请指正。

首先介绍一个 DNS,说白了它就是一个名字到 IP 的映射,因为像 64.202.189.170 这样的 IP 太难记了,所以就有了 DNS 这样的东西,好比是一个电话本,我们打电话(访问网页)的时候,就查一下这个名字(网络地址)对应什么样的 IP,然后拨出去。

如果你有很多联系人的话,查号码的时候肯定不会一个一个看,一般会在手机上下拉到这个字母姓氏的地方,然后再定位到这个人的名字。DNS 也是一样,全球已经有上千万个域名了,并且还在实时的变动和更新,所以DNS就采取了一种“分层”的查询。要查询 www.kawabangga.com 这个域名对应的 IP,实际上查询的是 www.kawabangga.com. 最后这个 . 就是 root nameserver,平时我们都省略了,其实这个才是一切开始的地方。

Recursive resolver(下面会讲到这是啥)只知道 . 的地址(一共13个IP),这就够了。当它查询一个域名的时候,它就去 root nameserver 查询,大体的步骤如下:

  1. . root nameserver 发出查询请求,root nameserver 说,“我也不知道 www.kawabangga.com. 这个域名的地址,但是我知道 .com nameserver 的地址。Root Name Server 是怎么知道所有顶级域名的地址呢?因为它就是干这个的,Root Name Server 维护了所有顶级域名对应的地址,这个文件可以在 https://www.internic.net/domain/root.zone 这里下载。现在是 2019 年3月,这个文件是 2万多行,一共2.15M 。
  2. .com Name Server 这种域名是最顶层的域名,所以叫做顶级域名,Top Level Domain Name Server,TLD Name Server。因为……它在最顶层。.com 域名服务商也就叫做顶级域名服务商,其他有名的顶级域名还有 .org .gov .cn 等。TLD nameserver 这里其实也不知道 www.kawabangga.com. 的 IP 地址,但是它知道 kawabangga.com. 的 nameserver 的地址。
  3. kawabangga.com. 的 Name Server 也叫做 Authoritative Name Server,通常翻译成“权威域名服务器”,但是我更喜欢叫他“被授权的域名服务器”,为什么呢?因为……它是被 .com 域名服务器授权的。上一步,TLDName Server 怎么知道 kawabnagga.com. 的Name Server 在哪里的呢?因为你注册一个域名的时候,本质上是花钱购买 xxx.com. 这个权威域名服务器的管理权益,你把钱给域名注册商,域名注册商告诉 .com. TLD Name Server 说,hey 以后把 xxx.com. 这个域名交给 xxx 域名服务器来解析就好啦!于是你就获得了这个域名的解析权利。kawabangga.com. 的 Authoritative Name Server 地址是 ns1.myhostadmin.net. 当 Recursive resolver 过来查询 www.kawabangga.com. 的地址的时候,ns1.myhostadmin.net. 会告诉它对应的IP。到这里,一次查询就宣告结束了。

这三种 Name Server 的职责都很明确:Root Name Server 负责维护全球顶级域名的地址;TLD Name Server 负责维护每一个购买了域名的人提交的他们的 Name Server 地址;Authoritative Name Server 由域名的持有人自己想怎么解析就怎么解析。但是一般的机构和个人都不会自己假设域名服务器,因为可能子域名的需求不多,比如本博客,就3个子域名而已,所以会选择使用一个公共的 DNS 解析服务,比如 DNSPod。域名注册商现在一般也都提供域名解析服务,CDN 像 CloudFlare 也会有域名解析的服务。像大型网站自己假设解析服务器,一般会使用 BIND 这个很流行的软件。当然也有自己研发 DNS 解析服务的。

下面我们再解释一下上面提到的 Recursive Resolver,有的地方叫 Resolving Name Server,意思就是解析 DNS 的 Server。以上的查询工作都由它来完成。

为什么呢?首先 DNS 设计的第一目的就是要快,这是非常基础的设施,所以必须要非常快。但是再快,全世界这么大的量也扛不住啊,并发高?加缓存!DNS 是层层缓存的。缓存有一个经典的问题就是,贵的缓存比较快。这里的贵不一定是价格贵。你在浏览器访问 www.kawabangga.com 的时候,至少经过了浏览器对 DNS 的缓存、电脑对 DNS 的缓存,路由器对 DNS 的缓存…… 浏览器的DNS缓存肯定最快,但是无法跟其他应用共享,如果每个应用都缓存的话,占用的空间就太大了。路由器上面的缓存可以给多台电脑共享,一般又是在本地,所以理所应当的做了最多的缓存。

如果在终端使用 dig 命令,会发现DNS的结果都是路由器给出的。

在这里,路由器就是开放了53端口,来提供DNS查询服务。它就是 Resolving Name Server,每次查询请求发过来,它检查自己的内存是否有答案,如果没有,就执行上述的查询过程。所以当我们执行 DNS 查询的时候,抓包会发现发出了一个包到路由器53端口,收到了一个回到,查询就结束了,还奇怪怎么和书上写的查询过程不一样呢?其实完整的查询过程是在 Resolving Name Server 上面做的。

当然,一个  Resolving Name Server 并不复杂。如果我们在执行 dig 命令的时候,带上 +trace 标志,dig 就会作为 Resolving Name Server 的角色从 . 开始查询直到查询到最后的答案。

CloudFlare 提供了一个很有名的 DNS 服务,1.1.1.1,这其实也是 Resolving Name Server,dig 命令可以使用 @1.1.1.1 的方式来指定。系统也可以设置 DNS 解析地址(现在你明白这个设置是什么意思了吧)。基本上需要网络的设备都可以设置这个DNS服务地址,比如 PS4,电视盒子。很多玩家知道设置成韩国的DNS服务地址玩游戏有时候会更快一些,原理就是这样,DNS是一个基础的服务,你离Resolving Name Server更近了,解析的也就更快了。Resolving Name Server 缓存的命中率高,也就更快,否则的话Resolving Name Server执行起来查询的过程也是耗费时间的。

 

 

参考资料

  1. How the Domain Name System (DNS) Works
  2. https://miek.nl/2013/november/10/why-13-dns-root-servers/
  3. DNS explained

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注