# 简介

DNS 是一个由分层的 DNS 服务器实现的分布式数据库,提供了主机名和 IP 地址之间的相互转换。
DNS 协议是应用层的协议,HTTP、FTP 等其他应用层协议可以使用 DNS 协议将用户提供的主机名解析称为 IP 地址。

DNS 的传输可以使用 UDP 或者 TCP,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这样域名解析器和域名服务器就需要自己处理超时和重传从而保证可靠性。
在两种情况下会使用 TCP 进行传输:

  • 如果返回的响应超过的 512 字节(因为UDP 最大只支持 512 字节的数据)。
  • 主域名服务器向辅助域名服务器发送变化的数据时,即区域传输。

    # DNS 层次结构

    分布式设计所解决的主要是 DNS 服务器的扩展性问题。DNS 服务器的组织模式为层次方式,并且分布在世界各地,主要有三种 DNS 服务器:根 DNS 服务器、顶级域名 DNS 服务器和权威 DNS 服务器。

    * 根 DNS 服务器

    根 DNS 服务器是 DNS 中最高级别的域名服务器,负责返回顶级域服务器的 IP 地址。

    * 顶级域 DNS 服务器

    顶级域,Top Level Domain,TLD

域名例如 com、org、net等和所有国家级域名都有自己的 TLD 服务器。TLD 服务器返回权威 DNS 服务器的 IP 地址。

* 权威 DNS 服务器

权威 DNS 服务器是实际持有并负责 DNS 资源记录的服务器,同时也是 DNS 查找链底部的服务器。

权威 DNS 服务器通常是在因特网上可公共访问的主机,如 Web 服务器和邮件服务器。这些主机的组织机构提供可供访问的将主机名映射为 IP 地址的 DNS 记录

# 域名解析

以查询 zh.wikipedia.org 为例:

  • 客户端发送查询报文”query zh.wikipedia.org”至 DNS 服务器,DNS 服务器首先检查自身缓存,如果存在记录则直接返回结果。
  • 如果记录老化或不存在,则 DNS 服务器会如下操作:
    • 向根域名服务器发送查询报文”query zh.wikipedia.org”,根域名服务器返回顶级域 .org 的顶级域名服务器地址。
    • 向 .org 域的顶级域名服务器发送查询报文”query zh.wikipedia.org”,得到二级域 .wikipedia.org 的权威域名服务器地址。
    • 向 .wikipedia.org 域的权威域名服务器发送查询报文”query zh.wikipedia.org”,得到主机 zh 的 A 记录,存入自身缓存并返回给客户端。

      |DNS 查询类型

      DNS 中的查询类型有两种方式:递归和迭代。作为 DNS 客户端设置使用的 DNS 服务器一般都是递归服务器,负责全权处理客户端的 DNS 查询请求,直到返回最终结果。而DNS 服务器之间一般采用迭代查询的方法。

      * 递归查询

      如果 DNS 客户端所询问的 DNS 服务器不知道被查询的域名的IP地址,那么该 DNS 服务器就以 DNS 客户端的身份向其它的根域名服务器发起查询。

      递归即替代开始的 DNS 客户端继续查询。

image.png

* 迭代查询

当 DNS 服务器收到本地域名服务器发出的迭代查询请求报文时,如果与查询名称不匹配,则将返回较低级别域名空间的具有权威性的 DNS 服务器的引用,然后 DNS 客户端对引用地址继续查询。
根域名服务器会告知顶级域名服务器的 IP 地址。顶级域名服务器会给出所查询的 IP 地址或告知权威域名服务器的 IP 地址。
image.png

# DNS 缓存

DNS 缓存是由操作系统或者浏览器维护的包含加载过资源的临时数据库。浏览器向外发出请求之前,计算机会拦截每个请求并在 DNS 缓存中查找域名,从而加快响应速度。

DNS 缓存中包含了最近的域名列表和首次发出请求时 DNS 计算的地址。

* 浏览器中的 DNS 缓存

浏览器默认将 DNS 记录缓存一段时间。因为越靠近浏览器进行 DNS 缓存,检查缓存并向 IP 地址发出请求的次数就越少。发出对 DNS 记录的请求时,查询浏览器缓存是本地查询的第一步。

* 操作系统内核缓存

除了浏览器中的 DNS 缓存,操作系统内核中也会对 DNS 进行缓存。查询操作系统内核缓存是 DNS 解析本地查询的最后一步。

# 参考

  1. 域名系统,CS-Note
  2. DNS迭代查询和递归查询,知乎
  3. 域名系统,wikipedia
  4. 长文爆肝 DNS 协议