# 域名系统 DNS

**互联网的域名系统 DNS 被设计成为一个联机分布式数据库系统，并采用客户-服务器方式。**

* DNS 使大多数名字都在本地进行解析，仅少量解析需要在互联网上通信，因此 DNS 系统的效率很高。
* 由于 DNS 是分布式系统，即使单个计算机出了故障，也不会妨碍整个 DNS 系统的正常运行。

## 互联网的域名结构

互联网采用了**层次树状结构**的命名方法，域名（domain name）是用**句点**来分隔的，比如 mail.cctv.com，这里的句点代表了不同层次之间的**界限**。

<mark style="color:blue;">**在域名中，越靠右的位置表示其层级越高。**</mark>

<figure><img src="https://2360649912-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3c4d4G2SmdXooqcxZXXU%2Fuploads%2F3LA7pxGJXIGvMMAQBskr%2Fimage.png?alt=media&#x26;token=24ed0766-e15e-4d06-9ac0-44a98ad68f52" alt="" width="563"><figcaption></figcaption></figure>

## 域名服务器

**互联网上的 DNS 域名服务器也是按照层次安排的**。根据域名服务器所起的作 用，可以把域名服务器划分为以下四种不同的类型：

* <mark style="color:blue;">**根域名服务器（root name server）**</mark>**：**&#x6839;域名服务器是最高层次的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。
* <mark style="color:blue;">**顶级域名服务器：**</mark>这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到 DNS 查询请求时，就给出相应的回答（可能是最后的结果，也可能是下一步应当找的域名服务器的 IP 地址）。
* <mark style="color:blue;">**权限域名服务器：**</mark>负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时，就会告诉发出查询请求的 DNS 客户，下一步应当找哪一个权限域名服务器。
* <mark style="color:blue;">**本地域名服务器（local name server）：**</mark>当一台主机发出 DNS 查询请求时，这个查询请求报文就发送给本地域名服务器。 这种域名服务器有时也称为**默认域名服务器**。

## 域名解析过程

注意两点：

1. <mark style="color:blue;">**主机向本地域名服务器**</mark>**的查询一般都是采用**<mark style="color:blue;">**递归查询（recursive query）**</mark>。

   所谓递归查询就是：**如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址，那么本地域名服务器就以 DNS 客户的身份，向根域名服务器继续发出查询请求报文**（即替该主机继续查询），而不是让该主机自己进行下一步的查询。
2. <mark style="color:blue;">**本地域名服务器向根域名服务器**</mark>**的查询通常是采用**<mark style="color:blue;">**迭代查询（iterative query）**</mark>。

   迭代查询的特点是这样的：

   1. **当根域名服务器收到本地域名服务器发出的迭代查询请求报文时，**&#x6839;域名服务器通常是把自己知道的**顶级域名服务器**的 IP 地址告诉本地域名服务器，**让本地域名服务器再向顶级域名服务器查询。**
   2. **顶级域名服务器在收到本地域名服务器的查询请求后，要么给出所要查询的 IP 地址，要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询**，本地域名服务器就这样进行迭代查询。
   3. 最后，知道了所要解析的域名的 IP 地址，然后把这个结果返回给发起查询的主机。

<details>

<summary><mark style="color:purple;"><strong>实例</strong></mark></summary>

* 客户端首先会发出一个 DNS 请求，问 [www.server.com](http://www.server.com) 的 IP 是啥，并发给本地域名服务器（也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址）。
* 本地域名服务器收到客户端的请求后，如果缓存里的表格能找到 [www.server.com，则它直接返回](http://www.server.com，则它直接返回) IP 地址。如果没有，本地域名服务器会去问它的根域名服务器。根域名服务器是最高层次的，它不直接用于域名解析，但能指明一条道路。
* 根域名服务器收到来自本地域名服务器的请求后，发现后置是 .com，说：“[www.server.com](http://www.server.com) 这个域名归 .com 区域管理”，我给你 .com 顶级域名服务器的地址给你，你去问问它吧。”
* 本地域名服务器收到顶级域名服务器的地址后，发起请求问“老二， 你能告诉我 [www.server.com](http://www.server.com) 的 IP 地址吗？” 顶级域名服务器说：“我给你负责 [www.server.com](http://www.server.com) 区域的权限域名服务器的地址，你去问它应该能问到”。
* 本地域名服务器于是转向问权威域名服务器：“老三，[www.server.com对应的IP是啥呀？”](https://bohans.gitbook.io/ji-chu/network/tcpip-wang-luo-mo-xing/ying-yong-ceng/http:/www.server.com对应的IP是啥呀？”) server.com 的权限域名服务器服务器，它是域名解析结果的原出处。权限域名服务器服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地域名服务器。
* 本地域名服务器再将 IP 地址返回客户端。

</details>

## DNS 缓存

为了提高 DNS 查询效率，并减轻根域名服务器的负荷和减少互联网上的 DNS 查询报文数量，**在域名服务器中广泛地使用了高速缓存。**&#x9AD8;速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

为保持高速缓存中的内容正确，域名服务器应为每项内容设置计时器并处理超过合理时间的项。

不但在本地域名服务器中需要高速缓存，在主机中也很需要。**许多主机在启动时从本地域名服务器下载域名和地址的全部数据库，维护存放自己最近使用的域名的高速缓存，并且只在从缓存中找不到名字时才使用域名服务器**。维护本地域名服务器数据库的主机自然应该定期地检查域名服务器以获取新的映射信息，而且主机必须从缓存中删掉无效的项。由于域名改动并不频繁，大多数网点不需花太多精力就能维护数据库的一致性。
