DNS解析过程

概念

域名系统(Domain Name System, DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库, 能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前, 对于每一级域名长度的限制是63个字符, 域名总长度则不能超过253个字符。

域名服务器的四种类型

  1. 根域名服务器

根域名服务器是最高层次的域名服务器, 使用.来表示(域名以英文句号结尾是早期的标准, 如今DNS服务器可以自动补上句号, 但你也可以尝试在当前页面的域名后面加上英文句号, 一样可以访问)。每个根域名服务器都知道所有的顶级域名服务器的域名及其 IP 地址。因特网上共有13个不同IP地址的根域名服务器集群, 用字母 A ~ M 来表示。当本地域名服务器向根域名服务器发出查询请求时, 路由器就把查询请求报文转发到离这个 DNS 客户最近的一个根域名服务器。这就加快了DNS的查询过程, 同时也更合理地利用了因特网的资源。根域名服务器通常并不直接对域名进行解析, 而是返回该域名所属顶级域名的顶级域名服务器的P地址

  1. 顶级域名服务器

顶级域名(TLD)服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到 DNS 查询请求时就给出相应的回答(可能是最后的结果, 也可能是下一级权威域名服务器的 IP 地址)。

顶级域名服务器又分为国家顶级域名(nTLD)和通用顶级域名gTLD:

  • 国家顶级域名(nTLD):包括特定于某个国家/地区或州的任何域名。例如:.uk、.us、.ru 和 .jp、.cn等。

  • 通用顶级域名(gTLD):非特定国家/地区的域名, 一些最知名的通用 TLD 包括 .com、.org、.net、.edu 和 .gov。

  1. 权威域名服务器

权威域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限过名服务器处注册登记。因此权限域名服务器知道其管辖的域名与引P地址的映射关系。另外, 权限域名服务器还知道其下级域名务器的地址。

  1. 本地域名服务器

本地域名服务器不属于上述的域名服务器的等级结构。当一个主机发出DNS请求报文时, 这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用, 会将该报文转发到上述的域名服务器的等级结构中。每一个因特网服务提供者引SP,, 一个大学一个大学里的学院, 都可以拥有一个本地域名服务器, 它有时也称为默认域名服务器。本地域名服务器离用户较近, 一般不超过几个路由器的距离, 也有可能就在同一个局域网中。本地域名服务器的地址需要直接配置在需要域名解折的主机中。在家庭网络中, 本地域名服务器就是网关的地址。

域名解析的过程

域名解析的2种方式

  1. 递归查询

主机首先向其本地域名服务器进行递归查询。本地域名服务器收到递归查询的委托后, 也采用递归查询的方式向某个根域名服务器查询。根域名服务器收到递归查询的委托后, 也采用递归查询的方式向某个顶级域名服务器查询。顶级域名服务器收到递归查询的委托后, 也采用递归查询的方式向某个权威域名服务器查询。当查到域名所对应的 IP 地址后, 查询结果会在之前受委托的各域名服务器之间传递, 最终传回给用户主机。

  1. 迭代查询

主机首先向其本地域名服务器进行递归查询。本地域名服务器采用迭代查询。它先向某个根域名服务器查询。根域名服务器告诉本地域名服务器, 下一次应查询的顶级域名服务器的IP 地址。本地域名服务器向顶级域名服务器进行迭代查询。顶级域名服务器告诉本地域名服务器, 下一次应查询的权威域名服务器的 IP 地址。本地域名服务器向权权威名服务器进行迭代查询。权威域名服务器告诉本地域名服务器所查询的域名的 IP 地址。本地域名服务器最后把查询结果告诉主机。
由于递归查询对于被查询的域名服务器负担太大, 通常采用以下模式:从请求主机到本地域名服务器的查询是递归查询, 而其余的查询是迭代查询。

域名服务器的缓存机制

  1. 如果不久前已经有用户查询过域名为 jd.com 的 IP 地址, 则本地域名服务器的高速缓存中应该存有该域名对应的 IP 地址。当主机向本地域名服器递归查询该域名时, 本地域名服务器就没有必要再向某个根域名服务器进行迭代查询了。而是直接把高速缓存中存放的上次查询结果即该域名的 IP 地址告诉用户主机。需要注意的是, 由于域名到 IP 地址的映射关系 并不是永久不变, 为保持高速缓存中的内容正确, 域名服务器应为每条查询记录设置计时器并删除超过合理时间的记录

  2. 不但在本地域名服务器中需要高速缓存, 在用户主机中也很需要。许多用户主机在启动时从本地域名服务器下载域名和 IP 地址的全部数据库, 维护存放自己最近使用的域名的高速缓存。并且只在从缓存中找不到域名时才向域名服务器查询。同理, 主机也需要保持高速缓存中内容的正确性。

  3. 除了域名缓存, 用户还可以通过编辑本机的 hosts 文件来静态绑定IP与域名的映射关系。通常来说 hosts 文件的优先级高于本机缓存的优先级。
    Windows 的 hosts 文件在 C:\Windows\System32\drivers\etc\hosts, Linux 的 hosts 文件在 /etc/hosts

实验

本实验使用 Linux 的 dig 命令来依次验证不同类型的域名服务器的作用。Windows 可以用 nslookup 命令代替。

通过根域名服务器来查询

首先需要知道根域名服务器的 IP 地址, 可以访问 IANA (互联网数字分配管理局)的官网查询:https://www.iana.org/domains/root/servers

iana

这里我们使用a域名服务器的IP来查询 dash.cloudflare.com:

1
2
dig @198.41.0.4 dash.cloudflare.com
nslookup dash.cloudflare.com 198.1.0.4 # Windows 使用此命令
  • @198.41.0.4: @指定使用的域名服务器的IP, 也可以使用对应的域名

2

根域名服务器给不了 dash.cloudflare.com 的 IP 地址, 但是给出了下一级通用顶级域名(gTLD)服务器 com. 的域名(AUTHORITY SECTION 部分)和其对应的 IP 地址(ADDITIONAL SECTION 部分)。

通过顶级域名服务器来查询

使用上一步查询的得到的通用顶级域名服务器e的 IP 192.12.94.30 来进一步查询:

1
2
dig @192.12.94.30 dash.cloudflare.com
nslookup dash.cloudflare.com 192.12.94.30 # Windows 使用此命令

2

顶级域名服务器给不了 dash.cloudflare.com 的 IP 地址, 但是给出了下一级权威域名服务器 cloudflare.com. 的域名(AUTHORITY SECTION 部分)和其对应的 IP 地址(ADDITIONAL SECTION 部分)。

通过权威域名服务器来查询

使用上一步查询的得到的权威域名服务器ns3的A记录(对应查询IPv4地址) IP 162.159.0.33 来进一步查询:

1
2
dig @162.159.0.33 dash.cloudflare.com
nslookup dash.cloudflare.com 162.159.0.33 # Windows 使用此命令

2

可以看到权威域名服务器给出了 dash.cloudflare.com 的两个IPv4地址。

参考:

  1. https://book.douban.com/subject/36066143/
  2. https://www.cloudflare-cn.com/learning/dns/dns-server-types/
  3. http://www.ruanyifeng.com/blog/2022/08/dns-query.html