相信大部分朋友对DNS解析还停留在只是知道它是拿域名换IP地址的过程,但具体细节如何?让我们从理论到实践,让DNS解析过程看得见摸得着。
DNS(Domain Name System)解析过程是将用户输入的域名(例如 minijude.cn
)转换为对应的 IP 地址(例如 47.96.80.187
)的过程。这个过程通常包括多个步骤,涉及多个 DNS 服务器和缓存机制。以下是详细的 DNS 解析过程:
一. 输入网址
在浏览器的地址栏输入一个网址(如 https://minijude.cn/blog-web
),浏览器需要解析该域名(minijude.cn
),才能通过 IP 地址与服务器建立 TCP 连接。
二. 浏览器的DNS缓存
2.1 查看请求的DNS解析耗时:
以chrome
浏览器为例,初次请求浏览器是没有对该域名的DNS
缓存的。因此在network
的timing
面板中我们可以看到dns lookup
时长👇️👇️👇️:
我们可以看到初次请求时,浏览器并没有缓存,DNS Lookup
耗时28.36ms
。让我们立马刷新页面👇️👇️👇️:
此时DNS Lookup
没有耗时了,因为chrome
存储了上一次DNS
解析的结果。
2.2 清空chrome的DNS缓存:
当然你可以清空chrome
的DNS
解析记录👇️👇️👇️:
地址栏输入chrome://net-internals/#sockets
,分别点击 Clear host cache
和 Flush socket pools
按钮。
清空后再次刷新页面,会发现DNS Lookup
耗时又出现了👇️👇️👇️:
三. 操作系统的 DNS 缓存
首先需要明确一点的是,经过验证,当浏览器没有缓存时,它不一定会去操作系统的缓存里面查询,可能它自己去dns
服务器去查了。这里我没有深入研究,但可以肯定的一点是,操作系统也有DNS
缓存。本节命令均使用powershell
:
3.1 查看域名ip👇️👇️👇️:
nslookup minijude.cn
这个命令可以查看指定域名的ip地址,但不会将结果存入OS的DNS缓存。
其中第一条指出,查询的是阿里的DNS服务器 223.5.5.5
。
47.96.80.187
就是DNS解析的IP地址。
3.2 查看OS的DNS缓存👇️👇️👇️:
ipconfig /displaydns
你也可以查看指定域名的dns解析记录👇️👇️👇️:
Get-DnsClientCache | Where-Object {$_.Entry -like "*minijude*"}
3.3 清空OS的DNS缓存👇️👇️👇️:
ipconfig /flushdns
四. 本地 hosts
文件
如果本地 DNS 缓存没有找到该域名,操作系统会接着检查本地的 hosts
文件。hosts
文件是一个手动维护的文件,用户可以在其中添加域名与 IP 地址的映射。
- 在 Windows 系统中,
hosts
文件位于C:\Windows\System32\drivers\etc\hosts
。 - 在 Linux 和 macOS 系统中,
hosts
文件位于/etc/hosts
。
如果在 hosts
文件中找到该域名的映射,操作系统会直接使用文件中指定的 IP 地址。
当我将hosts文件中随便添加一条错误的dns映射👇️👇️👇️:
再次ping minijude.cn
就会不通👇️👇️👇️:
这就是为什么上不了GitHub时,在hosts文件中手动插入几条github的域名ip映射就可以解决的原因。
五. 路由器和 ISP 的 DNS 缓存
当操作系统的本地缓存和 hosts
文件中都没有该域名的解析记录时,DNS 查询会依次经过路由器和 ISP 的 DNS 缓存。
1. 路由器的 DNS 缓存
- 如果操作系统没有找到域名的解析结果,它会将 DNS 请求发送到本地网络的路由器。
- 路由器通常具有 DNS 缓存功能,用于临时保存最近解析过的域名记录。如果缓存中存在有效记录(TTL 未过期),路由器会直接返回对应的 IP 地址,避免向上级 DNS 服务器查询。
- 如果路由器的 DNS 缓存中没有结果,则会将请求转发给配置的上级 DNS 服务器(通常是 ISP 的 DNS 服务器)。
2. ISP 的 DNS 缓存
- 路由器将未命中的 DNS 请求转发到配置的 DNS 服务器,一般是由 ISP 提供的。
- ISP 的 DNS 服务器也会缓存大量域名解析记录,尤其是访问频繁的热门站点。通过缓存,这些服务器能够快速响应查询请求,提高解析速度。
- ISP 的 DNS 缓存记录也受 TTL 控制。如果缓存记录过期,ISP 的 DNS 服务器会进一步发起递归查询。
六. 向 DNS 服务器发起递归查询
如果缓存(包括路由器和 ISP 的缓存)都没有找到目标域名的解析结果,DNS 查询将进入递归查询阶段。以下是递归查询的具体步骤:
-
查询根域名服务器:
- 本地配置的 DNS 服务器(如 ISP 的 DNS 服务器或用户手动指定的 DNS 服务器)首先向根域名服务器发送请求。
- 根域名服务器不会直接返回目标域名的 IP 地址,而是提供对应顶级域名服务器(TLD Server,例如
.com
、.org
)的地址。
-
查询顶级域名服务器(TLD Server) :
- 本地 DNS 服务器接着向 TLD 服务器发送查询请求。
- TLD 服务器返回负责该域名的权威 DNS 服务器的地址。
-
查询权威 DNS 服务器:
- 本地 DNS 服务器根据 TLD 服务器提供的地址,向权威 DNS 服务器发送请求。
- 权威 DNS 服务器会返回目标域名的最终解析结果(如 IP 地址)。
-
结果返回:
- 本地 DNS 服务器将从权威 DNS 服务器获得的解析结果返回给路由器,再由路由器返回给操作系统,最终由操作系统交给浏览器或其他应用。
windows
系统可以通过更改网络适配器设置来指定DNS
域名服务器👇️👇️👇️:
6.1 wireshark查看DNS解析经过
wireshark
过滤器中根据域名筛选dns
记录👇️👇️👇️:
dns.qry.name == "minijude.cn"
通过wireshark
抓包,我们分析得出👇️👇️👇️:
-
DNS 查询包括了 A 记录和 HTTPS 记录,目标是
minijude.cn
。 -
响应提供了
minijude.cn
的 IPv4 地址(47.96.80.187
)和 SOA 信息。 -
查询通过 UDP 协议完成,往返时间较短。
-
A记录的TTL是1分钟,SOA(Start Of a zone of Authority)记录的TTL是3分钟。
-
查询的权威名称服务器是
alvin.dnspod.net
,是腾讯旗下 DNSPod 提供的权威名称服务器。
6.2 DNS投毒攻击与防范
早在2008年中国和2010年美国都发生过相当大规模的DNS投毒攻击事件,攻击者入侵了部分DNS服务器篡改了DNS缓存记录,导致用户访问被重定向到恶意网站。
防范DNS投毒攻击👇️👇️👇️:
TTL和加密的DNS(DoH/DoT)可以增加其安全性。
TTL可以在我们申请域名的平台配置(我的是在腾讯云):
另外谷歌可以开启DoH选项,地址栏输入chrome://settings/security
,滚动到下面,开启使用安全DNS:
总结
综上所述,DNS解析流程大致如下👇️👇️👇️:
客户端向递归 DNS 服务器发送查询,递归 DNS 检查缓存,无结果时按层级向根服务器、顶级域名服务器(TLD)、权威 DNS 服务器递归查询,权威服务器返回最终结果,递归服务器将结果缓存后返回给客户端,完成域名到 IP 的转换。
本文主要关注的是如何看到dns解析的一些信息。当然如果你想从浏览器源码角度探究DNS解析过程,推荐看《从Chrome源码看DNS解析过程》。