# DNS 域名解析

### 什么是 DNS

DNS（Domain Name System，域名系统）是一种把域名称解析为对应的 IP 地址的服务。在 UNIX 和 Linux 操作系统中的 DNS 服务通常称为 BIND（Berkeley Internet Name Domain Service，伯克利因特网名称域服务）。

整个互联网是一个 DNS 名称空间，DNS 名称空间是一个树形结构，最顶端称为互联网的“根域”，以一个小圆点（.）表示，接下来是顶级域，再接下来是二级域、三级域，依此类推。其中，顶级域名和二级域名必须是由对应的互联网域名管理机构颁布的。

-   顶级域名：是根域名下的第一级域名，包括三类，即国家地区类、通用类、新增的通用类，如 cn（中国）、us（美国）、jp（日本）等
-   二级域名：是指顶级域名下的域名，分为两类：在国际顶级域名下，它是指域名注册人的网上名称，例如 ibm、microsoft 等，这是可供用户申请的；在国家或地区顶级域名下，它表示注册企业类别的符号，如 com、edu、gov、net 等，这些是不能直接供用户申请注册的。
-   三级域名：可以由用户自己申请注册的，可以采用字母（A~Z、a~z、大小写组合等）、数字（0~9）和连接符（-）等，各级域名之间用小圆点（.）连接。

### DNS 域名服务器

即担当 DNS 域名解析任务并配置了 DNS 服务的服务器。为了有效地管理整个互联网的 DNS 域名解析工作，DNS 系统开发者设计了一个与分层的 DNS 域名结构类似的层次化 DNS 域名服务器结构，把所有 DNS 域名称服务器自高到低分成 4 个级别：根域名服务器、顶级域名服务器、权威域名服务器和本地域名服务器。它们都是由互联网域名管理机构或下级的 ISP（互联网服务供应商） 负责配置建立的。

#### 根域名服务器

“根名称服务器”（root name server）是由互联网管理机构配置建立的，是最高层次的名称服务器，负责对互联网上所有“顶级名称服务器”进行管理，有全部的顶级名称服务器的 IP 地址和域名映射。
全球共有 13 套，这 13 台主根名称服务器主机名分别为字母 A-M，即完整 DNS 名称为 a.rootserver.net~m.rootserver.net。

#### 顶级域名服务器

“顶级名称服务器”（top level name server）是各顶级域名自己的名称服务器，负责它们各自所管理的二级域名解析。每一个顶级域名，不论是 不论是 gTLD（通用顶级域），还是 ccTLD（国别顶级域），它们都有自己的域名服务器。

#### 权威域名服务器

“权威名称服务器”（authoritative name server）是针对 DNS 区域提供名称解析服务而专门配置、建立的名称服务器，可为用户提供最权威的 DNS 域名解析。每一个域名在互联网上都可找到一台权威名称服务器，ISP 也可为用户的每一个 DNS 域名区域配置一台权威名称服务器。

#### 本地域名服务器

这里所说的“本地名称服务器”不是指用户局域网中的名称服务器，而是用户端操作系统所配置的、由本地 ISP 提供的名称服务器（也就是本地 DNS 服务器）。它是离用户最近的互联网名称服务器。用户发出的 DNS 域名解析请求，首先到达的就是本地名称服务器。

如果本地名称服务器解析不了用户所请求的域名，那么这个本地名称服务器就会直接向所配置的根名称服务器发出解析请求，由根名称服务器告知它该向哪个顶级名称服务器查询。如果顶级名称服务器还不能解析，则顶级名称服务器会向本地名称服务器告知要向哪个权威名称服务器发出请求，然后本地名称服务器继续向对应权威名称服务器请求解析。如果权威名称服务器还不能解析的话，则这次 DNS 域名解析请求失败。

### DNS 递归解析基本流程

<div align="center"><img src="http://cdn.inoongt.tech/images/thinkin/DNS_RESOLVE.png"/></div>

1. 客户端向本机配置的本地域名服务器发出 DNS 域名查询请求。
2. 本地域名服务器收到请求后，先查询本地的缓存，如果有该域名的记录项，则本地域名服务器直接把查询的结果返回给客户端；如果本地缓存中没有该域名的记录，则本地域名服务器再以 DNS 客户端的角色发送与前面一样的 DNS 域名查询请求给根域名服务器。
3. 根域名服务器收到 DNS 请求后，把顶级域名所对应的顶域名称服务器地址返回给本地域名服务器。
4. 本地域名服务器根据根域名服务器返回的顶级域名服务器地址，向对应的顶级域名服务器发送与前面一样的 DNS 域名查询请求。
5. 对应的顶级域名服务器在收到 DNS 查询请求后，也是先查询自己的缓存，如果有所请求的 DNS 域名的记录项，则先把对应的记录项返回给本地域名服务器，然后再由本地域名服务器返回给 DNS 客户端，否则向本地域名服务器返回所请求的 DNS 域名中的二级域名所对应的二域名称服务器地址。
6. 然后，本地域名服务器继续按照前面介绍的方法一次次地向三级、四级域名服务器查询，直到最终的对应域名所在区域的权威域名服务器返回最终的记录给本地域名服务器，再由本地域名服务器返回给 DNS 客户，同时本地域名服务器会缓存本次查询得到的记录项。
