2.5 DNS 与域名解析
域名系统(Domain Name System,DNS) 负责将人类便于记忆的、变长的 主机名(Hostname) 转换为网络设备便于识别与处理的、定长的 IP 地址。DNS 本质上就是一个由分层的 DNS 服务器实现的分布式数据库与一个使得主机能够查询分布式数据库的一种应用层协议。
DNS 由于是一种事务性的应用,它运行在 UDP 上,知名端口为 53。与其它应用层协议一样,DNS 运行在网络边缘,但它支撑着互联网的一项核心功能,即将主机名转换为 IP 地址。
DNS 协议是一种应用层协议,但 DNS 却不是一个直接服务用户的服务,而是为服用用户的应用(例如 HTTP 与 SMTP)提供服务的应用。
DNS 系统需要解决三个问题:如何命名设备、如何完成主机名到 IP 地址的转换、如何更新这一分布式数据库的内容。除此之外,DNS 也能提供一些其它的重要服务。如:
- 主机别名(Host Alias) 到 规范主机名(Canonical Hostname) 的转换。
- 邮件服务器别名到规范主机名的转换。
- 负载均衡。
一种简单直接的 DNS 系统可以是指定一台服务器负责处理整个互联网的域名解析。然而这种集中式的设计毫无可拓展性,且存在 单点故障、通信容量有限、难以维护、对远距离的主机提供服务质量差 等问题。
因此,当前的 DNS 系统使用的是 分布式 的设计。
DNS 服务器的结构
DNS 服务器被以分层的树形结构组织,与 LInux 的树形文件系统类似。大致可以分为 根 DNS 服务器、顶级域(Top-level Domain,TLD)DNS 服务器、权威 DNS 服务器 三层。
- 根服务器:域名系统的树根与起点。存储着所有 TLD 服务器的 IP 地址。IPv4 的根服务器共 13 台,由 1 台主根与 12 台辅根组成。IPv6 的根服务器共 25 台,由 3 台主根与 22 台辅根组成。
- TLD 服务器:代表了所有的 顶级域名。顶级域名分为通用域名(例如 .com, .org, .net)与国家域名(例如 .cn, .us, .jp)两种。每一个顶级域名都有一个 TLD 服务器,该服务器负责维护所有挂载在该顶级域名下的权威 DNS 服务器与直接挂载的服务主机的 IP 地址。
- 权威 DNS 服务器:某个组织机构可以提供权威 DNS 服务器,负责组织内部所有服务器主机与 IP 地址的映射。
相似的,域名也根据这种形式被划分为顶级域与其下的若干层子域。为了解析一个域名,我们从顶级域开始,以英文句点作为层次的分割,逐层向下解析,直到解析完最底层,获得对应主机的 IP 地址。
为了方便管理,管理者可能会将这个域名树上的一部分划为一个区域(例如 google 会将所有挂载在 google.com 域名下的子域划为一个区域)并配置一个 名字服务器,名字服务器也是一种权威 DNS 服务器,负责维护该区域所有主机名与 IP 地址对应关系的权威信息。
需要说明,上述域的划分是 逻辑的 而非物理的。也即,某一个区域的名字服务器完全可以在地理位置上与它维护的主机信息相距甚远。
我们以 https://jwxs.hebut.edu.cn/ 为例进行讲解:我们从右向左,每一个句点都代表一层 DNS 服务器:
.cn代表中国的国家域名,这是一个顶级域名。.edu.cn代表教育相关的学校或组织,这是二级域名。.hebut.edu.cn代表河北工业大学,这是一个三级域名。jwxs.hebut.edu.cn代表教务系统(学生),这是最低级的域名,对该域名作解析可以直接查找到对应的服务器 IP 地址。
除了上述结构之外,ISP 也为管理的所有主机设置了一台 本地 DNS 服务器,本地 DNS 服务器不属于上面所述的结构中的一部分。它负责代理该区域下所有主机的 DNS 解析请求。也即,当一台主机发出一条 DNS 请求时,该请求先被发送到本地 DNS 服务器,由该服务器将该请求转发到上面的层次结构中,并将得到的结果发送回源主机。
除此之外,为了提高效率,许多 DNS 服务器提供了 缓存 功能。具体而言,当某个 DNS 请求到来时,DNS 服务器首先在自己的缓存中查找是否存在该请求对应的 IP 地址,如果有直接返回该 IP 地址,否则按照上述规则逐层解析域名并向对应的 DNS 服务器发送相应的 DNS 请求。添加缓存的直接好处是大大减少了根服务器与 TLD 服务器的压力(因为对顶层 DNS 服务器的请求一般总是重复的)。当然,为了保持一致性(主机名对应的 IP 地址会随时间发生改变),所有缓存都存在一个有效期(一般两天),有效期结束后,DNS 服务器便将过期缓存删除。
因此接下来我们以 [https://jwxs.hebut.edu.cn/] 为例考察一下一个域名是如何被解析成对应的主机 IP 的。
一种方式是这样的:
- 主机发出 DNS 请求,发往其对应的本地 DNS 服务器。
- 本地 DNS 服务器查询本地缓存,若存在该主机名对应 IP 地址的记录,直接返回结果。
- 若没有查找到对应结果,则向跟服务器发出请求,查询
.cn顶级域名对应的 TLD 服务器地址。 - 根服务器返回结果,服务器根据该结果向
.cn的 TLD 服务器发出对.edu.cn的 DNS 请求。 - 重复第 3、4 步,直到返回一个主机 IP 地址,服务器将该地址缓存在本地,随后将结果返回。
- 主机收到所需的结果,根据该结果与对应主机建立连接,请求相关服务。
注意到上述过程中第 4 步,根服务器查找到 .cn 的 TLD 服务器 IP 地址后直接将其返回给了请求方。请求方再根据返回的结果向下一个 DNS 服务器发送请求,以此类推。这种查询方式被叫做 迭代查询(Iterative Queue)。另一种查询方式叫做 递归查询(Recursive Queue),体现在第 1 步中。其形如:一台 DNS 服务器向另一台服务器发出请求,接收方接收到该请求后由 接收方 服务器向下一台 DNS 服务器发送请求,逐层递归查询。得到的结果也是逐层回传给初始的请求方。递归查询的缺点在于 根服务器的负担太重。
DNS 服务器内数据的存储结构
DNS 服务器内部存储了大量的 资源记录(Resource Record),资源记录提供了主机名到 IP 地址的映射。一条典型的资源记录是一个形如 (Name, Value, Type, TTL) 的四元组。各属性意义如下:
- 生存时间(Time To Live,TTL),决定该记录在服务器中的存留时间。对于一个权威 DNS 服务器而言,其所维护的权威的 DNS 资源记录的生存时间为无限长,即永不过期。而充当缓存作用的资源记录其 TTL 一般为两天。TTL 过期后该 RR 就会被删除。
<Name, Value>是 DNS 用于返回查询结果的核心键值对,根据查询请求的Name返回对应的Value。该键值对的意义随Type变化:- 若
Type = A,<Name, Value>代表一个 规范主机名->主机 IP 地址 对。 - 若
Type = NS,<Name, Value>代表一个 区域->该区域名字服务器 IP 地址 对。 - 若
Type = CNAME,<Name, Value>代表一个 主机别名->规范主机名 对。 - 若
Type = MX,<Name, Value>代表一个 邮件服务器别名->规范主机名 对。
- 若
DNS 报文同样分为请求报文与回答报文两种,这两种报文格式相同,其结构如下:

- 标识符:标识某个特定查询,回答时同样使用相同的标识符,便于客户端与服务器确定查询与回答的对应关系。
- 标识位:标识报文的属性,例如:报文类型、是否使用递归查询、递归查询是否可用、回答是否来自权威服务器等。
- 问题区域:包含正在进行的查询,包含
Name与Type字段。回答区域与之类似。 - 权威区域:包含来自其他权威 DNS 服务器的记录。
- 附加信息区域:其它相关信息。
DNS 服务器内部的数据一般是由域名管理机构手动维护的。