DNS 解析
什么是 DNS
在数据网络中,使用数字 IP 地址标记设备以便通过网络发送和接收数据。 大多数用户无法记住此数字地址。 于是,人们创建了可以将数字地址转换为简单易记名称的域名系统。
域名系统(domain name system) 作为将域名和 IP 地址相互映射的一个分布式数据库,使用 TCP 和 UDP 端口 53,作用就是根据域名查出对应 IP 地址。

域名层级
| 域名 | 值 | 描述 |
|---|---|---|
| 使用的域名 | www.example.com | 日常真实使用的域名 |
| 真正的域名 | www.example.com.root | .root通常省略,或为 . |
| 根域名 | .root | 对所有域名 |
| 顶级域名 | .com | top-level domains(TLD) |
| 次级域名 | .example | second-level domains(SLD),用户可注册的 |
| 三级域名(主机名) | www | 用户在自己的域里面为服务器分配的名称 |
DNS 解析

工作步骤:
- 检查浏览器缓存,命中则解析过程结束。浏览器缓存有大小和时间限制,缓存时间可通过 TTL(time to live) 属性来配置;
- 若 1 未命中,则浏览器会查找操作系统缓存中是否有这个域名对应的 DNS 解析结果。Windows 可以通过
C:\Windows\System32\drivers\etc\hosts文件来配置,Linux 则为/etc/hosts文件来配置,用户可以将任何域名解析到任何能够访问的 IP 地址; - 发送至本地域名服务器(LDNS)。LDNS 一般都会缓存域名解析结果,当然缓存时间是受到域名的失效时间控制的。Windows 下通过命令行输入
ipconfig,Linux 环境下通过cat /etc/resolv.conf就可以查询配置的 DNS 服务器; - 若 3 未命中,则直接到根域名服务器(root name server)请求解析。根域名服务器是最高级别的域名服务器,负责返回顶级域的权威域名服务器地址;
- 根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD server)地址。gTLD 是通用顶级域,如 .com、.cn、.org 等;
- LDNS 再向上一步返回的 gTLD 服务器发送请求;
- gTLD 服务器查找并返回此域名对应的域名服务器(name server)的地址,这个域名服务器通常就是用户注册的,例如用户在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成;
- 向域名服务器发起请求,域名服务器会查询存储的域名和 IP 的映射关系表。
- 返回该域名对应的 IP 和 TTL 值,LDNS 会缓存这个域名和 IP 的对应关系,缓存时间由 TTL 值控制;
- 把解析的结果返回给用户,用户根据 TTL 值缓存在本地系统缓存中,域名解析过程结束。
以 www.example.com 为例,解析过程从右向左: . => .com. => .example.com. => www.example.com. => IP
全球 13 组根域名服务器以英文字母 A 到 M 依序命名,域名格式为”字母.root-servers.net”。其中有11个是以任播技术在全球多个地点设立镜像站。
DNS 层级
一个 DNS 的解析大致可以分两个部分:
- 客户端向 LDNS 的请求,通常这部分使用递归请求
- LDNS 的请求,通常这部分使用迭代请求
DNS 清除缓存
DNS 域名解析后会缓存解析结果,其中主要在两个地方缓存:
- 本地 DNS 服务器(LDNS)
- 用户的本地机器 - 包括浏览器缓存和操作系统缓存
针对用户本机,针对不同系统环境可以采用以下命令清除缓存:
- Windows - ipconfig / flushdns
- Linux - /etc/init.d/nscd restart
- macOS - dscacheutil -flushcache 或 killall -HUP mDNSResponder
DNS 查询
dig 查询
以 www.baidu.com 为例,一共返回六段信息:
$ dig www.baidu.com
# ------查询参数和统计--------------------------------------------------------
; <<>> DiG 9.9.7-P3 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64176
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 3
# ------查询域名www.baidu.com.的 A 记录,即 address----------------------------
;; QUESTION SECTION:
;www.baidu.com. IN A
# ------DNS 服务器的响应。774 和 600 即 TTL 值,CNAME 为别名解析-----------------
;; ANSWER SECTION:
www.BaidU.cOm. 774 IN CNAME www.a.shifen.com.
WwW.a.ShIfEn.cOm. 600 IN A 180.97.33.107
WwW.a.ShIfEn.cOm. 600 IN A 180.97.33.108
# ------查询的权威服务器 NS 的域名地址------------------------------------------
;; AUTHORITY SECTION:
a.ShIfEn.cOm. 825 IN NS ns5.a.ShIfEn.cOm.
a.ShIfEn.cOm. 825 IN NS ns4.a.ShIfEn.cOm.
a.ShIfEn.cOm. 825 IN NS ns2.a.ShIfEn.cOm.
a.ShIfEn.cOm. 825 IN NS ns3.a.ShIfEn.cOm.
a.ShIfEn.cOm. 825 IN NS ns1.a.ShIfEn.cOm.
# ------获得的权威服务器的 IP 地址, 用来进行递归查询------------------------------
;; ADDITIONAL SECTION:
ns1.a.ShIfEn.cOm. 539 IN A 61.135.165.224
ns4.a.ShIfEn.cOm. 162 IN A 115.239.210.176
ns5.a.ShIfEn.cOm. 162 IN A 119.75.222.17
# ------DNS 服务器的一些传输信息,本地 DNS 服务器地址即为 192.168.1.1,默认端口为 53
;; Query time: 22 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Feb 18 22:14:16 CST 2018
;; MSG SIZE rcvd: 257
使用 +trace 参数进行路径跟踪查询或者 +short 直接返回 DNS 服务器的响应。
$ dig www.baidu.com +short
www.a.shifen.com.
180.97.33.107
180.97.33.108
host
host 命令可以看作 dig 命令的简化版本,返回当前请求域名的各种记录。host 命令也可以用于逆向查询,即从 IP 地址查询域名,等同于 “dig -x ip”。
$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
Www.a.shifen.com has address 180.97.33.107
Www.a.shifen.com has address 180.97.33.108
nslookup
互动式地查询域名记录。
$ nslookup www.baidu.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: Www.a.shifen.com
Address: 180.97.33.107
Name: Www.a.shifen.com
Address: 180.97.33.108
whois
用来查看域名的注册情况,需要安装 whois 插件,如 “brew install whois”。
refer: whois.verisign-grs.com
domain: COM
organisation: VeriSign Global Registry Services
address: 12061 Bluemont Way
address: Reston Virginia 20190
address: United States
...
DNS 记录类型
域名与 IP 之间的对应关系,称为记录(record)。根据使用场景,记录可以分成不同的类型(type)。
| 类型 | 名称 | 描述 |
|---|---|---|
| A | 地址记录(Address) | 返回域名指向的 IP 地址 |
| NS | 域名服务器记录(Name Server) | 返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为 IP 地址 |
| MX | 邮件记录(Mail eXchange) | 返回接收电子邮件的服务器地址 |
| CNAME | 规范名称记录(Canonical Name) | 返回另一个域名,即当前查询的域名是另一个域名的跳转 |
| PTR | 逆向查询记录(Pointer Record) | 只用于从IP地址查询域名,如 dig -x ip |
参考链接
- DNS 原理入门 By 阮一峰
- DNS 域名解析过程 By 清觞煮雪
- DNS 层级
- 【重拾网络】DNS By zhanghTk
- Apple - Reset the DNS cache in OS X