# 域名解析过程

我们都知道在浏览器通过域名发起一个网络请求的时候，会有DNS服务器将域名解析成ip地址，以便向正确的ip地址发送请求，那么这一个过程具体是怎么处理的呢？今天整理了一下DNS域名解析的过程。大致分为10步：

## 第一步

浏览器会检查缓存中有没有域名对应的ip地址，这个缓存是有过期时长的，一般是几分钟到几小时不等。

## 第二步

如果浏览器缓存没有，那么就检查操作系统的hosts文件，比如windows就是`C:\Windows\System32\drivers\etc\hosts`文件，linux在`/etc/hosts`文件中配置。

## 第三步

如果本地也没有配置那么就会根据向本机配置的本地区DNS域名服务器（LDNS）发起请求，如果你是通过学校连接互联网的一般是你学校的DNS服务器，如果你是在小区连接互联网的一般是网络提供商比如电信，联通的DNS服务器，DNS服务器通常不会太远。如何查看本机的域名服务器，在Linux可以通过`cat /etc/resolv.conf`查看。到这一步基本能解析80%的域名。

## 第四步

如果LDNS也不能解析，那么就直接到根域名服务器请求解析。

## 第五步

根域名服务器会给本地域名服务器LDNS一个所查询的主域名服务器（gTLD）地址，gTLD是国际顶级域名服务器，比如`.com`,`.cn`,`.org`等。

## 第六步

本地域名服务器LDNS再向上一步返回的gLTD服务器发送请求。

## 第七步

gLTD服务器查询并返回域名对应的Name Server域名服务器的地址，通常是你注册的域名服务器，例如你在某个域名服务器提供商申请的域名，那么这个域名解析任务就由这个域名服务提供商来完成。

## 第八步

Name Server域名服务器会查询存储的域名和ip的映射关系表，将ip连同一个TTL(过期时间)值返回给DNS Server域名服务器。

## 第九步

LDNS拿到ip和TTL会缓存起来，缓存时间由TTL值控制。

## 第十步

把解析的结果返回给用户，用户根据TTL值缓存在本地系统缓存中，域名解析过程结束。

整个过程用一张图来表示：

![](/files/-M7h5c2PLBx0vJUKTUEV)

在实际解析过程中可能不只有这10个步骤，Name Server也有可能有多级或者一个GTM来控制负载均衡，都能影响DNS解析过程。

举个查询DNS的实例：

```
比如终端请求www.baidu.com这个域名的IP。
在没有缓存时，LDNS会从根DNS问起：
1、LDNS问根DNS说：“www.baidu.com的IP是多少啊？”。
2、根DNS说：“我哪有时间管你这么细的问题，你去问com顶级域的DNS吧，我只管到顶级域，喏，这些是com顶级域DNS的名字和IP，你去问它们吧”。（以NS记录回应）
3、LDNS又忙问com的权威DNS，com权威DNS说：“你问的这是三级域名，我不管这么多，你去问baidu.com的权威DNS吧，它的名字是ns.baidu.com，他的IP是XXX（这里可能给出多个权威DNS）”。
4、LDNS继续问baidu.com的权威DNS，这次痛快，因为www.baidu.com正是它管的，它可能直接给出A记录，也可能给出CNAME记录，如果是前者，就直接得到IP，如果是后者，就需要对别名再做查询。
5、最终，LDNS得到www.baidu.com的IP，并将其返回给终端。
```

## dig命令

可以使用dig命令来查询域名的DNS信息：

```
dig meituan.com
; <<>> DiG 9.10.6 <<>> meituan.com  # dig命令版本等信息
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32097
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 13, ADDITIONAL: 27

;; OPT PSEUDOSECTION: # 查询的域名
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;meituan.com.            IN    A

;; ANSWER SECTION: #查询结果
meituan.com.        77    IN    A    101.236.12.4
meituan.com.        77    IN    A    103.37.142.167

;; AUTHORITY SECTION:
com.            20042    IN    NS    f.gtld-servers.net.
...
...

;; ADDITIONAL SECTION:
e.gtld-servers.net.    30031    IN    A    192.12.94.30
...
...

;; Query time: 12 msec # 查询耗时
;; SERVER: 192.168.4.251#53(192.168.4.251)
;; WHEN: Mon Aug 24 10:11:22 CST 2020
;; MSG SIZE  rcvd: 868
```

DNS中存储着记录，最常见的3种：A记录（记录某域名和其IP的对应），NS记录（记录某域名和负责解析该域的权威DNS），CNAME记录（负责记录某域名及其别名）。权威能直接回答的，就回A记录；需要其他权威DNS回答的，就回NS记录，然后LDNS再去找其他权威DNS问；如果该记录是别名类型的，就回CNAME，LDNS就会再去解析别名。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/ji-suan-ji-wang-luo/yu-ming-jie-xi-guo-cheng.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
