浏览器 DNS Lookup过程是怎样的?

178 阅读6分钟

相信大部分朋友对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缓存的。因此在networktiming面板中我们可以看到dns lookup时长👇️👇️👇️:

image.png

我们可以看到初次请求时,浏览器并没有缓存,DNS Lookup耗时28.36ms。让我们立马刷新页面👇️👇️👇️:

image.png

此时DNS Lookup没有耗时了,因为chrome存储了上一次DNS解析的结果。

2.2 清空chrome的DNS缓存:

当然你可以清空chromeDNS解析记录👇️👇️👇️: 地址栏输入chrome://net-internals/#sockets,分别点击 Clear host cacheFlush socket pools 按钮。

image.png image.png

清空后再次刷新页面,会发现DNS Lookup 耗时又出现了👇️👇️👇️:

image.png

三. 操作系统的 DNS 缓存

首先需要明确一点的是,经过验证,当浏览器没有缓存时,它不一定会去操作系统的缓存里面查询,可能它自己去dns服务器去查了。这里我没有深入研究,但可以肯定的一点是,操作系统也有DNS缓存。本节命令均使用powershell

3.1 查看域名ip👇️👇️👇️:

nslookup minijude.cn

image.png

这个命令可以查看指定域名的ip地址,但不会将结果存入OS的DNS缓存。 其中第一条指出,查询的是阿里的DNS服务器 223.5.5.5

47.96.80.187就是DNS解析的IP地址。

3.2 查看OS的DNS缓存👇️👇️👇️:

ipconfig /displaydns

image.png

你也可以查看指定域名的dns解析记录👇️👇️👇️:

Get-DnsClientCache | Where-Object {$_.Entry -like "*minijude*"}

image.png

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映射👇️👇️👇️:

image.png

再次ping minijude.cn就会不通👇️👇️👇️:

image.png

这就是为什么上不了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 查询将进入递归查询阶段。以下是递归查询的具体步骤:

  1. 查询根域名服务器

    • 本地配置的 DNS 服务器(如 ISP 的 DNS 服务器或用户手动指定的 DNS 服务器)首先向根域名服务器发送请求。
    • 根域名服务器不会直接返回目标域名的 IP 地址,而是提供对应顶级域名服务器(TLD Server,例如 .com.org)的地址。
  2. 查询顶级域名服务器(TLD Server)

    • 本地 DNS 服务器接着向 TLD 服务器发送查询请求。
    • TLD 服务器返回负责该域名的权威 DNS 服务器的地址。
  3. 查询权威 DNS 服务器

    • 本地 DNS 服务器根据 TLD 服务器提供的地址,向权威 DNS 服务器发送请求。
    • 权威 DNS 服务器会返回目标域名的最终解析结果(如 IP 地址)。
  4. 结果返回

    • 本地 DNS 服务器将从权威 DNS 服务器获得的解析结果返回给路由器,再由路由器返回给操作系统,最终由操作系统交给浏览器或其他应用。

windows系统可以通过更改网络适配器设置来指定DNS域名服务器👇️👇️👇️:

image.png

6.1 wireshark查看DNS解析经过

wireshark过滤器中根据域名筛选dns记录👇️👇️👇️:

dns.qry.name == "minijude.cn"

image.png

image.png

通过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可以在我们申请域名的平台配置(我的是在腾讯云):

image.png

另外谷歌可以开启DoH选项,地址栏输入chrome://settings/security,滚动到下面,开启使用安全DNS

image.png


总结

综上所述,DNS解析流程大致如下👇️👇️👇️:

客户端向递归 DNS 服务器发送查询,递归 DNS 检查缓存,无结果时按层级向根服务器、顶级域名服务器(TLD)、权威 DNS 服务器递归查询,权威服务器返回最终结果,递归服务器将结果缓存后返回给客户端,完成域名到 IP 的转换。

本文主要关注的是如何看到dns解析的一些信息。当然如果你想从浏览器源码角度探究DNS解析过程,推荐看《从Chrome源码看DNS解析过程》