相信大部分朋友对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映射就可以解决的原因。
五. 向 DNS 服务器发起请求
如果本地缓存和 hosts
文件中都没有该域名的记录,操作系统会将 DNS 查询请求发送到配置好的 DNS 服务器。一般情况下,DNS 服务器的地址由你的网络配置(如通过 DHCP 自动分配或手动指定)提供。
- 递归查询:本地的 DNS 服务器(通常是 ISP 提供的 DNS 服务器或第三方公共 DNS 服务器,如 Google 的
8.8.8.8
)会尝试解析该域名。如果它没有该记录,它会向更高层次的 DNS 服务器请求,直到找到该域名的 IP 地址。 - 权威 DNS 服务器:最终,查询会被传递到 权威 DNS 服务器,这是该域名的正式注册 DNS 服务器,包含该域名的真实 IP 地址记录。
windows
系统可以通过更改网络适配器设置来指定 DNS
域名服务器👇️👇️👇️:
5.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 提供的权威名称服务器。
5.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解析过程》。