乐趣区

关于DNS解析

这篇文章在说什么

1、域名的结构
2、DNS 解析流程

前奏

在进入正题之前可以先适当的引入 IP 概念,以便下面的流畅阅读。

1、[什么是 IP 地址?](https://segmentfault.com/a/1190000022864573)
IP 地址相当于网络中的身份唯一认证 ID

正题

 DNS:(Domain Name System)域名解析系统

域名解析系统,听着还挺费解的,我们知道当我们浏览器输入网址的时候,输入的是一串域名,例如:www.google.com,但是我们在委托我们的操作系统发送消息时,却不是靠域名来找到对应的服务器,靠的的 IP 地址(这是 TCP/IP 协议的要求)。这个时候,所需要做的就是通过域名解析,来拿到我们的 IP 地址。

域名的结构

域名可以通过 . 拆分成几个部分,从右到左依次是:顶级域名、二级域名、三级域名 …

DNS 解析流程

所以当我们输入网址,去请求资源的话,那它又是如何办到的呢?

简单来说:DNS 解析过程属于应用层协议(不知道应用层也不影响解析流程),当我们生成 http 报文之后,就会在查找浏览器 /host/ 本地 / 网关 / 本地 DNS 服务器 /IPS/ 根域名服务器等中是否有 DNS 缓存,如果有的话,优先取缓存数据,否则,会通过主机上运行的 DNS 客户端(我们的计算机上会有相应的 DNS 客户端,又称 DNS 解析器)向 DNS 服务器发送查询报文,DNS 服务器再根据查询消息返回响应内容。

查询报文

域名、类型(表示域名对应什么类型的记录,类型为 MX 时,表示域名对应的是邮件服务器,类型为 A 时,对应的 IP 地址)、以及 Class(Class 的值用来识别网络信息,现在互联网没有其他网络,所以永远是 IN)。DNS 服务器会根据查询消息来查询对应的消息记录。

邮件查询

邮件的记录类型是 MX,又称为邮件交换记录。它是通过邮件地址的”@“符号后面的域名,得到对应的邮件服务器。DNS 服务器会返回邮件服务器的域名和优先级。(邮件地址有可能对应多个邮件服务器,需要根据优先级来判断哪个服务器优先查询。数值越小越优先。)因为最终也需要得到邮件服务器的 IP 地址,所以拿到邮件的服务器域名后最终又会解析成 IP 地址返回客户端。


演示

光说没用,我们可以来演示一波,当我们查询 www.google.com 时:

DNS 客户端的请求报文

;; QUESTION SECTION:
;www.google.com.            IN    A

DNS 服务器返回的查询结果
只有 1 个 A 记录代表,只有一个 IP 地址。221 是缓存时间,代表 221s 内不用重新查询。

;; ANSWER SECTION:
www.google.com.        221    IN    A    8.7.198.45

NS 记录
即域名服务器记录(Name Server),用来指定该域名由那个 DNS 域名服务器解析。

;; AUTHORITY SECTION:
google.com.        51    IN    NS    ns4.google.com.
google.com.        51    IN    NS    ns3.google.com.
google.com.        51    IN    NS    ns1.google.com.
google.com.        51    IN    NS    ns2.google.com.

DNS 域名服务器的 IP 地址

;; ADDITIONAL SECTION:
ns1.google.com.        266    IN    A    216.239.32.10
ns1.google.com.        197    IN    AAAA    2001:4860:4802:32::a
ns2.google.com.        280    IN    A    216.239.34.10
ns2.google.com.        197    IN    AAAA    2001:4860:4802:34::a
ns3.google.com.        55    IN    A    216.239.36.10
ns3.google.com.        104    IN    AAAA    2001:4860:4802:36::a
ns4.google.com.        299    IN    A    216.239.38.10
ns4.google.com.        92    IN    AAAA    2001:4860:4802:38::a

邮件的 DNS 查询
可以看到 DNS 服务器返回了五个服务器域名以及优先级。

记录类型还有很多种

想了解的可以 => 记录类型


当浏览器发起请求

直接上图吧~ 说太多都没有用~

  • 当我们的浏览器发起 http 请求时,首先会先查询浏览器是否有 DNS 缓存
  • 浏览器没有缓存,则会找到计算机的本地 hosts 文件,是否存在映射关系。
hosts 文件地址
Mac:/etc/hosts
Windows 7: C:\\**Windows**\\System32\\drivers\\etc

我们可以看到,下图中有域名对应着 IP
就相当于告诉计算机,如果我访问这个域名,那你就去这个 ip 地址找资源吧~

  • 如果 hosts 文件不存在映射关系,那么会去找 DNS 的本地缓存。
  • 本地没有缓存的话,则会通过我们本地设置的 DNS 服务器地址,去找本地 DNS 服务器要资源。一般来说本地 DNS 服务器都会有一份缓存,如果有的话,就直接将缓存的内容传回去,没有的话,那么它就会去找根服务器。

说到这里,那我们停一下,现在是不是有两个疑问
1、究竟什么是本地服务器呢?
2、如果本地有缓存又要怎么办?
留着最后回答~
我们先来解释图中本地 DNS 服务器与 DNS 服务器之间的关系,以及什么是根服务器。


DNS 服务器之间的联系

DNS 服务器相互之间的联系是:管理下一级域名的服务器会将自己注册到管理上级域名的 DNS 服务器上。


所以,当我们从根域名服务器一层层往下找,就可以找到当前域名所在的 DNS 服务器了。

什么是根域名服务器

前面说了域名的结构,但是在我们的互联网中,还有一个不为人知的地方,叫做根域。它处于一级域名(顶级域名)的上方,根域没有自己的名字(不配有姓名),我们在输入域名时经常省略了它。它是一个点,是的,就是一点”.”,如果要表明根域,那么域名就会写成这样:”www.youzan.com.”没在域名的最后加一个句号。一般都不会写句号。根域名服务器管理的不是所有的域名,而是管理一级域名的服务器所在地址,比如管理着 com 域名服务器的地址。

很多资料上说,全世界 IPv4 根域名服务器只有 13 台。13 台根域名服务器的名字是从 A -M。1 个主根服务器在美国,其余为 12 个辅根服务器,美国(9),英国(1),瑞典(1),日本(1)。有人是不是想问为什么中国没有?嗯,就是没有。(因为互联网起源于美国,一开始只有美国有互联网,大部分在美国无可厚非。)但是中国有 IPv4 镜像根服务器。编号相同的镜像根服务器使用同一个 IP。所以,其实上面的说法是不精准的,根域名服务器其实有很多台,但是服务器的 IP 地址只有 13 个。题外话:IPv6 根服务器中国有 4 个,一个主根,三个辅根。

主根和辅根的区别:主根和辅根的数据是一致的,当有新的域名出现时,会先更新到主根服务器,再复制到辅根服务器。

镜像服务器:相当于镜子里的你,除了不是真正的你,也具有你的特征。就像你的桌面图标生成一个快捷方式的图标一样。


现在我们了解了 DNS 服务器之间的联系,那么我们回到流程图中:

  • 本地 DNS 服务器先是去根服务器找域名的 ip,根域名服务器没有,给了他 com 域名服务器的 ip。
  • 但是 com 域名服务器也不知道 www.test.com 的 ip,但是知道 test.com 在哪台域名服务器上。
  • 最终,找到了 www.test.com

QA 环节

1、究竟什么是本地服务器呢?
当我们打开网络配置的时候,会看到有一个 DNS IP 地址,这个 IP 地址则是我们指向的本地 DNS 服务器地址。
不同的操作系统设置方式不一样,DNS 服务器的地址可以是提前设置好的也可以是自动分配的,MacOS 的长这样:

在我们非手动设置的情况下:如果我们的网络是直连的运营商网络,一般而言那我们的本地 DNS 则是 ISP 运营商 IP 地址。
如果我们设置了转发(使用了路由器),那我们的地址极有可能是 192.168.1.1(如上图),路由器本身,我们的路由器会将请求转发到上层 DNS,也就是 ISP 运营商 DNS 服务器。

2、如果本地有缓存又要怎么办?
所以以后如果页面打不开了,可以先清除浏览器或者电脑的 DNS 缓存试试,看是否是因为本地的缓存导致域名解析错误。

清除 DNS 缓存:Mac(10.13.6): sudo dscacheutil -flushcache
Window: ipconfig /flushdns
谷歌浏览器:chrome://net-internals/#events.

3、为什么服务器的 IP 地址只有 13 个?

因为 DNS 查询用的是 UDP,而不是 TCP。UDP 实现中能保证正常工作的最大包是 512 字节,所以只能 13 个根服务器地址。想要了解更多,请进入[传送门](https://jaminzhang.github.io/dns/The-Reason-of-There-Is-Only-13-DNS-Root-Servers/)

4、IPv4 与 IPv6 的区别

IPv4:由 32 位二进制数组成
IPv6:可由 128 位二进制组成
[详文可阅读](https://zhuanlan.zhihu.com/p/50747832)

5、为什么需要域名解析,而不直接是 IP?

1、域名好记,给你 ip,你可以记几个 ip 地址哇
2、不同域名可以对应同一个 IP
3、服务器 IP 变了咋办
4、TCP/IP 协议的需要

参考资料:
《网络是怎么连接的》

退出移动版