同事问我 DNS 原理是什么?

399 阅读5分钟

我正在忙于工作(摸鱼),突然看到产品妹子发消息过来...

👩:什么是 DNS

👩:公司项目最近不是在搞 IPv6 吗,经常有听到 DNS ,这是个啥东西?

👨:域名系统 DNS (Domain Name System)是互联网使用的命名系统

👩:? ? ?

👨:举个例子:我们在网址上输入 www.baidu.com ,背后实际是在和互联网上某个主机 IP 地址通信,电脑怎么知道域名对应的 IP 地址,这就需要 DNS 了。

至于为啥不用域名进行通信,因为域名的长度是不固定的,有 baidu.com,也有 bilibili.com,机器处理起来比较困难。IP 的地址就是固定的32位二进制地址(如果是 IPv6,就是128位),例如:199.59.149.231

但也不能在网址上输入 IP 地址,这个也太难记了

👩:原理是什么呀

👨:原理这东西,得慢慢和你说...

域名和域名服务器

域名

image.png

上图是域名构成结构,他们之间是用英文符号 . 去连接

根是没有名字的,例如 www.baidu.com ,完整的的写法应该是 www.baidu.com. ,你可以用 ping 和 curl 等工具去访问一下(浏览器是不行的)

根的下一级是顶级域名,通用顶级域名有:com(公司企业),net(网络服务机构),org(非营利机构),int(国际组织),edu(美国专用的教育机构),gov(美国的政府机构),mail(美国的军事部门)。

域名在互联网中是唯一的

域名服务器

image.png

根域名服务器是最高层次的域名服务器,由13个固定的 IP 地址和域名组成,分别为 a.rootservers.net,...,m.rootservers.net,他管理着所有顶级域名服务器的 IP 地址。

image.png

但他不是由 13 台服务器组成(全世界互联网这么多人,也不够用啊),实际是由 13 套系统构成 13 组服务器遍布全世界(2020 年 3 月的数据是 1375 台),因为他用了任播(anycast)技术,所以当 DNS 客户端向某个 IP 地址发起请求时,他能找到离客户端最近的一个服务器和他通信。

顶级域名服务器,他管理着所有权限域名服务器的 IP 地址,例如: baidu.com 域名服务器

权限域名服务器,他管理着三级/四级以及更多级域名的 IP 地址,例如:www.baidu.com

域名的解析过程

image.png

还是以电脑浏览器输入 www.baidu.com 为例,以下是整个解析过程:

  1. 浏览器输入地址后,解析器 (电脑的解析程序),把待解析的域名(www.baidu.com)放到请求报文中,并成为 DNS 的一个客户端

  2. DNS 客户端首先向本地 DNS 服务器发起请求,因为他没有缓存 www.baidu.com 的 IP 地址,所以他暂时成为 DNS 的另一个客户端,并向其他域名服务器发起查询请求(递归查询)

  3. 本地 DNS 服务器采用迭代查询,他先向其中一个根域名服务器查询请求

  4. 根域名服务器根据请求报文,得知他的顶级域名是 com ,返回了一组com 顶级域名服务器的 IP 地址

  5. 本地 DNS 服务器向顶级域名服务器发起查询请求

  6. 顶级域名服务器返回了一组权限域名服务器的 IP 地址

  7. 本地 DNS 服务器向权限服务器发起查询请求

  8. 权限服务器返回了 www.baidu.com 的 IP 地址

  9. 本地 DNS 服务器把 IP 地址返回了 DNS 客户端

  10. 最后 DNS 客户端告诉了 IP 地址给浏览器

递归查询:本地 DNS 服务器收到客户的请求后,他并不知道 www.baidu.com 的 IP 地址,所以他就以 DNS 客户端的身份,向其他域名服务器发起请求,得到最终结果后才告诉 DNS 客户端,这样的查询方式就叫递归查询。

迭代查询:本地 DNS 服务器向根域名服务器发起查询请求时,他不直接返回 www.baidu.com 的 IP 地址,而是告诉你下一步要去找的域名服务器 IP 地址,让你自己发起查询请求,这样的查询方式就叫迭代查询。

关于 第 3 至 8 步骤,也可以使用递归查询的方式,如图:

image.png

这样本地 DNS 服务器只需要发送一次查询请求,后面都是域名服务器用递归查询的方式进行传输,但总的报文次数也是和迭代一样的。

本地 DNS 服务器选择递归还是迭代查询,取决于最初的请求报文

DNS 缓存

为了减轻根域名服务器和互联网上 DNS 的报文数量,域名服务器广泛使用了缓存

假如:我们已经访问过 www.baidu.com ,上面的解析过程已经走过一遍,本地 DNS 服务器知道了www.baidu.com 域名的 IP 地址,所以当 DNS 客户端发起查询请求时,他能直接返回www.baidu.com IP 地址,不用再走下面的步骤。

又假如:本地 DNS 服务器缓存里没有 www.baidu.com 域名的 IP 地址,但缓存了 com 顶级域名服务器的 IP 地址,这样他就能不通过根域名服务器,向顶级域名服务器发起查询请求,然后返回 www.baidu.com 的 IP 地址。

缓存时间由权限域名服务器设置,即 TTL ,每次他响应查询请求时,都会加上这个值。

👩:好复杂啊...

👩:那假如世界上只有一台 DNS 服务器,然后缓存所有互联网域名的 IP 地址,那我直接请求他不就行了

👨:理论上是可以的,但互联网域名这么多,一台服务器压力肯定承载不了,而且发生故障时,所有人都冲不了浪

👩:浏览网页不行,我上微信和刷抖音应该没问题吧

👨:也是一样的,微信和抖音也有用到 DNS ,表面上你是看不到域名这个东西,但背后他实际也是通过域名和互联网服务器通信的。

👩: Soga

参考

计算机网络(第8版)