DNS

了解 DNS 的功能以及域名查询的步骤,可能在选择题中考察。

层次域名空间

DNS 使用 层次域名空间 来组织域名,将域名划分为多个级别,每个级别之间以点(.)分隔。域名从右到左逐级递增,最右边是 顶级域名(TLD),然后是 二级域名三级域名,以此类推。

例如, www.example.com 中, .com 是顶级域名, example.com 是二级域名, www.example.com 是子域名。

Glevel2_label顶级域名level3_label二级域名level4_label三级域名level5_label四级域名rootaeroaeroroot->aerocomcomroot->comnetnetroot->netorgorgroot->orgedueduroot->edugovgovroot->govcncnroot->cnukukroot->ukdots1...root->dots1cskaoyancskaoyancom->cskaoyancctvcctvcom->cctvgooglegooglecom->googlebjbjcn->bjededucn->edcom2comcn->com2dots2...cn->dots2mail1mailcskaoyan->mail1www1wwwcskaoyan->www1dots3...cskaoyan->dots3husthusted->husthithited->hited->dots3mail2mailhust->mail2www2wwwhust->www2dots4...hust->dots4

DNS 层次域名空间 的设计使得域名分布在不同的管理区域中,每个管理区域负责管理其自己的域名空间。这种分层结构有助于提高可扩展性和效率。

域名服务器

DNS_Hierarchyroot根域名服务器tld_comcom域名服务器root->tld_comtld_orgorg域名服务器root->tld_orgtld_cncn域名服务器root->tld_cndots1...root->dots1dots2...root->dots2auth_csgraduatescsgraduates.com域名服务器tld_com->auth_csgraduatesdots3...tld_org->dots3auth_eduedu.cn域名服务器tld_cn->auth_edusub_husthust.edu.cn域名服务器auth_edu->sub_hust

在 DNS 体系结构中,服务器按照层级划分,每一层负责不同的职责。下面按照从最高层到最低层的顺序,对四类常见的域名服务器进行说明:

  1. 根域名服务器 (Root Name Servers):
    • 这些服务器位于 DNS 解析的最顶端。它们不直接回答关于哪个域名映射到哪个 IP 地址的查询,而是告诉查询者下一步应该询问哪个顶级域名(TLD)服务器。
    • 根服务器的数量是有限的,并且它们的位置在全球都是已知的。
  2. 顶级域名服务器 (Top-Level Domain Name Servers, TLD):
    • 这些服务器负责特定的顶级域名(如 .com, .org, .net 等)。它们为下一级的域名(如 example.com)提供有关权威名称服务器的信息。
  3. 权威域名服务器 (Authoritative Name Servers):
    • 这些服务器为特定的域名(如 example.com)提供详细的 DNS 记录信息(例如 A 记录、MX 记录等)。只有权威服务器才能为其负责的域名提供这些信息。
    • 大多数组织拥有权威 DNS服务器来为他们的域名提供解析服务。
  4. 本地域名服务器 (Local Name Server)
    • 是在本地网络环境中运行的DNS服务器,它为该网络中的设备提供域名解析服务。
    • 每个 ISP 或一所大学都可以有一个本地域名服务器。

域名解析过程

域名解析分为 递归查询迭代查询 两种。

  • 递归查询:请求方(本地 DNS 服务器)把解析任务 完全交给 对方。
  • 迭代查询:请求方会得到一个“指引”,然后自己去问下一层。

迭代查询

在域名解析过程中,本地域名服务器 向根域名服务器发送的通常是迭代查询。

根域名服务器 收到查询请求后,不会代替本地域名服务器继续查询,而是返回结果中的两种情况之一:

  • 若能解析出所需的 IP 地址,则直接返回;
  • 若不能解析,则告知本地域名服务器应当联系的下一级顶级域名服务器。

随后,本地域名服务器根据指引,向对应的 顶级域名服务器 继续查询。顶级域名服务器的处理方式类似:

  • 若能解析出所需的 IP 地址,则返回结果;
  • 否则告知本地域名服务器应当访问的下一步权限域名服务器。

权限域名服务器的处理流程类似,这里不赘述了。最终,当本地域名服务器获得目标域名对应的 IP 地址后,会将结果返回给最初发起请求的主机。

sequenceDiagram
  participant Host as 主机
  participant Local as 本地域名服务器
  participant Root as 根域名服务器
  participant TLD as 顶级域名服务器 (TLD)
  participant Auth as 权限域名服务器 (Authoritative)

  Host->>Local: 1) 查询 www.example.com
  Local->>Root: 2) 迭代查询(请求根服务器)
  Root-->>Local: 3) Referral: 指向对应的 TLD 服务器(例如 .com)
  Local->>TLD: 4) 迭代查询(请求 TLD 服务器)
  TLD-->>Local: 5) Referral: 指向该域的 权限域名服务器
  Local->>Auth: 6) 迭代查询(请求权限域名服务器)
  Auth-->>Local: 7) 返回最终 IP 地址(例如 93.184.216.34)
  Local-->>Host: 8) 本地 DNS 将 IP 返回给主机
  Note right of Local: 本地域名服务器可能会把结果缓存一段时间

递归查询

递归查询的过程如上图所示,本地域名服务器只需向 根域名服务器查询一次(步骤 2),后面的几次查询都是 递归地 在其他几个域名服务器之间进行的(步骤 3-7)。在步骤 7 中,本地域名服务器从根域名服务器得到了所需的 IP 地址,最后在步骤 8 中,本地域名服务器把查询结果告诉发起查询的主机。

因为该方法给根域名服务器造成的负载过大,所以实际中几乎不使用。

sequenceDiagram
  participant Host as 主机
  participant Local as 本地域名服务器
  participant Root as 根域名服务器
  participant TLD as 顶级域名服务器 (TLD)
  participant Auth as 权限域名服务器 (Authoritative)

  Host->>Local: 1) 查询 www.example.com
  Local->>Root: 2) 向根域名服务器发起递归查询
  Root->>TLD: 3) 根服务器代为查询 TLD 服务器
  TLD->>Auth: 4) TLD 服务器递归查询权限域名服务器
  Auth-->>TLD: 5) 返回最终 IP 地址
  TLD-->>Root: 6) TLD 把结果返回给根服务器
  Root-->>Local: 7) 根服务器把最终 IP 地址交给本地 DNS
  Local-->>Host: 8) 本地 DNS 返回结果给主机

DNS 递归查询 和 迭代查询的不同点如下表所示:

特点递归查询迭代查询
查询责任DNS 服务器负责查询所有结果客户端逐级查询
查询复杂度客户端简单,只需发起一次请求客户端复杂,需要多次查询
使用场景用户设备、本地 DNS 服务器DNS 服务器之间的交互
性能服务器负担较大服务器负担较小

DNS 缓存

无论是浏览器、操作系统,还是本地的递归 DNS 服务器,在接收到域名解析结果之后,都会将其暂时保存在本地 缓存 中。这样,如果同一个域名在短时间内被多次请求,就可以直接从 缓存 中获取结果,而不需要再次向外部服务器发送查询请求。

DNS 记录中包含一个名为 TTL(Time to Live)的字段,用于指定这条记录可以在缓存中 保存多久。比如 TTL3600 表示记录在缓存中可保留 3600 秒(即一小时)。在这段时间内,只要有查询,就可以直接使用缓存的结果。当 TTL 到期后,缓存记录会被丢弃,下一次查询将重新走完整的解析流程。