DNS 协议(重点)
概念
DNS 是域名系统(Domain Name System) 的缩写,提供的是一种主机名到 IP 地址的转换服务,就是我们常说的域名系统。
它是一个由分层的 DNS 服务器组成的分布式数据库,是定义了主机如何查询这个分布式数据库的方式的应用层协议。
能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
作用
将域名解析为 IP 地址,客户端向 DNS 服务器发送域名查询请求,DNS 服务器告知客户机 Web 服务器的 IP 地址。
注意:DNS 服务器本身也需要通过 IP 地址进行网络通信,因此它们也有固定的 IP 地址。
DNS 完整的查询过程(重点)
DNS 服务器解析域名的过程
- 首先,会在浏览器缓存中查找对应的 IP 地址,如果查找到直接返回,若找不到继续下一步。
- 将请求发送给本地 DNS 服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步。
- 本地 DNS 服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址。
- 本地 DNS 服务器向顶级域名服务器发送请求,顶级域名服务器返回相关的下一级的权威域名服务器地址。
- 本地 DNS 服务器向权威域名服务器发送请求,权威域名服务器返回对应的结果。
- 本地 DNS 服务器将返回结果保存在 DNS 缓存中,便于下次使用。
- 本地 DNS 服务器将返回结果返回给浏览器。
场景
比如要查询 www.baidu.com 的 IP 地址:
- 首先,会在浏览器缓存中查找是否有该域名的缓存,如果不存在就将请求发送到本地的 DNS 服务器中。
- 本地 DNS 服务器会判断是否存在该域名的缓存,如果不存在,则向根域名服务器发送一个请求,根域名服务器返回负责
.com的顶级域名服务器的 IP 地址的列表。 - 然后,本地 DNS 服务器再向其中一个负责
.com的顶级域名服务器发送一个请求,负责.com的顶级域名服务器返回负责.baidu的权威域名服务器的 IP 地址列表。 - 然后,本地 DNS 服务器再向其中一个权威域名服务器发送一个请求。
- 最后,权威域名服务器返回一个对应的主机名的 IP 地址列表。
DNS 同时使用 TCP 和 UDP 协议的原因
DNS 占用 53 号端口,同时使用 TCP 和 UDP 协议。
在区域传输的时候使用 TCP 协议
辅域名服务器会定时(一般 3 小时)向主域名服务器进行查询以便了解数据是否有变动,如有变动,会执行一次区域传送,进行数据同步。
区域传送使用 TCP 而不是 UDP,原因包括:
- 数据量大:完整的区域传送(AXFR)可能包含数千条记录,远超 UDP 传统 512 字节限制
- 可靠性要求:区域数据必须完整同步,TCP 的可靠传输和顺序保证至关重要
- 增量传送支持:现代 DNS 支持增量区域传送(IXFR),需要可靠的连接状态管理
在域名解析的时候使用 UDP 协议
客户端向 DNS 服务器查询域名,一般返回的内容都不超过 512 字节,用 UDP 传输即可。
使用 UDP 的优势:
- 无需经过三次握手,响应更快
- DNS 服务器负载更低
- 适合大多数简单的查询-应答场景
在传统 DNS 协议中,UDP 响应被限制为 512 字节。现代 DNS 通过 EDNS0 扩展支持更大的 UDP 数据包(通常可达 4096 字节),但出于兼容性考虑,大多数查询仍优先使用 UDP。
理论上说,客户端也可以指定向 DNS 服务器查询时用 TCP,但事实上,很多 DNS 服务器进行配置的时候,仅支持 UDP 查询包。
递归查询与迭代查询
实际上,DNS 解析是一个包含递归查询和迭代查询的过程。
递归查询
客户端向本地 DNS 服务器(通常由 ISP 或本地网络提供)发起查询,本地 DNS 服务器负责代表客户端完成整个查询链,最终返回结果。
使用递归查询,用户只需要发出一次查询请求。
迭代查询
指的是查询请求后,域名服务器返回单次查询的结果。
下一级的查询由用户自己请求。
使用迭代查询,用户需要发出多次的查询请求。
实际应用
向本地 DNS 服务器发送请求的方式就是递归查询,因为我们只需要发出一次请求,然后本地 DNS 服务器返回给我们最终的请求结果。
本地 DNS 服务器向其他域名服务器请求的过程是迭代查询,因为每一次域名服务器只返回单次查询的结果,下一级的查询由本地 DNS 服务器自己进行。
DNS 记录和报文
DNS 服务器中以资源记录的形式存储信息,每一个 DNS 响应报文一般包含多条资源记录。
一条资源记录的具体的格式为:
(Name,Value,Type,TTL)
其中 TTL 是资源记录的生存时间,它定义了资源记录能够被其他的 DNS 服务器缓存多长时间。
Type 常用的值一共有 4 种,分别是 A、NS、CNAME 和 MX,不同 Type 的值,对应资源记录代表的意义不同:
| Type | Name | Value | 说明 |
|---|---|---|---|
| A | 主机名 | 主机名对应的 IP 地址 | 提供了标准的主机名到 IP 地址的映射 |
| NS | 域名 | 负责该域名的 DNS 服务器的主机名 | 主要用于 DNS 链式查询时,返回下一级需要查询的 DNS 服务器的信息 |
| CNAME | 别名 | 该主机的规范主机名 | 用于向查询的主机返回一个主机名对应的规范主机名,从而告诉查询主机去查询这个主机名的 IP 地址 |
| MX | 邮件服务器的别名 | 邮件服务器的规范主机名 | 作用和 CNAME 是一样的,都是为了解决规范主机名不利于记忆的缺点 |
主机别名主要是为了通过给一些复杂的主机名提供一个便于记忆的简单的别名。