DNS 到底怎么工作的? (How does dns work?)

时间:2023-12-12 20:21:20

其实这个问题每次看的时候都觉得很明白,但是很久之后就忘记了,所以这次准备记录下来。深入到这个过程的各个细节之中,以后多看看。

Step 1 请求缓存信息:

当你在开始访问一个 www.baidu.com 开始,第一件事情就是去访问本地缓存查询是否有缓存了这个地址的 ip 地址。如果能获取到直接返回,然后访问。这个缓存来自于你之前访问之后存下来的,这里还涉及到另外一个概念就是缓存的 TTL。那什么是 TTL (Time To Live)?

TTL (Time to Live)是每个DNS记录的设置,它指定解析器在查询过期之前应该缓存(或记住)DNS查询的时间,还有一个新产生的 DNS 查询记录什么时候过期。

那么当我们之前 retrieve 了一个地址之后,我们会缓存 TTL 这么久的时间,当我们现在再发起一个新请求的时候,查询到有这个缓存就可以直接拿来使用了。

让我们来看下 chrome 再访问过网址之后的 DNS 缓存情况直观的了解一下:

在 chrome 打开地址 chrome://net-internals/#dns

DNS 到底怎么工作的? (How does dns work?)

这是在我清理过一次 cache 之后重新访问 google 的解析数据。可以看到这里可以显示  DNS 查询到的 ip 地址和 hostname 的映射,其中还包括过期时间之类的东西。可以很明确看到 TTL 就是经过多少 s 之后过期。 TTL 的单位是毫秒。

Step1 + 查看本地 hosts:

如果浏览器 cache 上没有还活着的记录,会去查询本地操作系统的 hosts 文件。hosts 文件上面存放着对应的 ip 地址和 ns 的关系。如果找到对应的指向就会返回。

Step2 递归查询 ISP server:

如果本地没有查询到缓存,那么这个查询将会以递归的方式去询问 ISP 服务。 ISP 的递归查询服务也有自己的缓存,所以你的查询通常到这里就结束了。

Step3 询问根域名服务器:

如果 ISP 服务器并不知道你查询的域名地址在哪儿,那么就需要去查询根域名服务器。全球 13 个 DNS 服务器根扮演者一个类似于基于 DNS 电话簿一样的角色。他们虽然不知道你查询的地址的 ip 地址是多少,但是他们可以定向你到知道这个地址。

Step4 询问 TDL 服务器:

当根域名服务器在接收到查询请求之后,会将你查询的域名拆开看你的*域部分。比如查询 www.baidu.com 。那么会从右往左拿到 .com 并且定向查询到 TDL (*域名查询)。不同的*域都有不同的查询服务器例如 .tv .cn .org 等等等。这些*域查询服务器其实也没有我们需要的直接的答案,也就是我们需要的 ip 地址。但是他们同样可以将我们定向到有这些信息的服务器那里去,根域名服务器如果发现是 .com 之后就会返回 .com 的 ns(name server) 地址。

Step5 询问权威服务器:

*域名服务器 TDL 会 review 这个我们的请求并且拿到 baidu.com 这部分,将这个查询定向指定的权威域名服务器上去(同样是通过返回 ns 地址的方法)。这些权威域名服务器负责了解有关特定领域的所有信息通过存储 DNS 记录。这里存储了各种各样的类型的记录,以包含不同类型的信息。打个比方说就是上面我们想要知道的 www.baidu.com 这个地址,那么我们就是在询问权威域名服务器了解 A 地址。

Step6 取回这个查询到的记录:

现在我们查询到这个记录了 ISP 服务器将取回这个记录并且将它记录下来(存进自己的缓存基于 TTL)。如果后面有人再问谁知道 www.baidu.com 这个地址的时候就不再需要去询问根服务器,因为他已经自己缓存得有答案了。当然在 TTL 过期之后,就会重新进行一次 look up process 以保证自己的缓存尽量具有实时性以应对互联网上的改动。

Step7 从 ISP 取回这个记录:

ISP 获得记录之后会返回给发起这个查询的我们的电脑。我们的浏览器也同样会将这个记录缓存起来。然后我们就根据返回的这个地址访问这个 ip 地址并且建立连接(tcp/ip协议)。然后我们就愉快的在浏览器上看到内容了!

这里其实再提一嘴域名的划分问题,这个也是比较容易混淆的地方。

例如 baidu.com 这就是一个*域名,

www.baidu.com 不是一个*域名,只是*域名 baidu.com 上的一个 www 主机。也可以称为是一个二级域名。

a.www.baidu.com 可以称为 一个三级域名。

其实在 *域名上面和二级域名上面还有一些争议或者不同的说法。 例如 .com. 其实这才是*域名这样的说法似乎也被认可。只需要了解即可,通常的说法就是我前面例举的那种不要搞混淆咯。

Reference:

https://dyn.com/blog/dns-why-its-important-how-it-works/  dns-why-its-important-how-it-works

https://www.verisign.com/en_US/website-presence/online/how-dns-works/index.xhtml  How the Domain Name System (DNS) Works

https://dyn.com/blog/dyn-tech-everything-you-ever-wanted-to-know-about-ttls/  Everything You Ever Wanted To Know About TTLs

http://blog.csdn.net/hanghangaidoudou/article/details/51753695  DNS 的几个基本概念

https://serversforhackers.com/c/hosts-file-and-dns  hosts-file-and-dns