输入www.baidu.com后,DNS在背后经历了什么?

538 阅读5分钟

作为一名前端开发者,你有没有想过,当你在浏览器里输入 www.baidu.com,按下回车后,页面是怎么“瞬间”出现的?很多人第一反应是“发了个 HTTP 请求”,但其实,在这之前,还有一个关键的“幕后功臣”——DNS。

今天,我们就来聊聊这个看似简单,实则复杂而精妙的系统:DNS(Domain Name System)。它不只是把域名转成 IP 地址那么简单,背后藏着的是互联网高效运转的底层逻辑。

从一次 ping 说起

我们先来执行一条最熟悉的命令:

ping www.baidu.com

你可能会看到这样的输出:

image.png

咦?我明明 ping 的是 www.baidu.com,怎么变成了 www.a.shifen.com?这个 a.shifen.com 又是什么?

别急,这正是 DNS 开始的地方。

为什么需要 DNS?

我们喜欢记名字,比如 baidu.comgoogle.com,但机器只认数字——IP 地址。你的电脑要和百度服务器通信,必须知道它的 IP。但 IP 地址难记又难写,比如 183.2.172.177,谁能记住几十个网站的 IP?

于是,DNS 应运而生。它本质上是一个分布式的数据库,负责把“好记的域名”翻译成“机器能懂的 IP 地址”。

浏览器按下回车后,DNS 到底经历了什么?

当你在浏览器输入 https://www.baidu.com,按下回车,页面还没加载,DNS 解析就已经悄悄开始了。整个过程,像是一场精密的“寻址接力赛”。

第一步:补全 URL

你输入的 www.baidu.com,浏览器会自动补全协议和路径,变成:

https://www.baidu.com/

这是后续所有操作的基础。

第二步:层层“查缓存”,能快则快

DNS 解析并不是每次都从零开始。为了效率,系统设计了多层缓存机制,像“记忆网络”一样,能省则省。

  1. 浏览器缓存
    Chrome、Firefox 等浏览器都会缓存最近解析过的域名。你可以打开 Chrome 的 chrome://net-internals/#dns 查看当前缓存的 DNS 记录。如果 www.baidu.com 刚访问过,这里就有它的 IP,直接命中,解析结束。

  2. 操作系统缓存
    如果浏览器没找到,会去问操作系统。在 Windows 上,你可以用命令:

ipconfig /displaydns

查看系统缓存的 DNS 记录。Linux 和 macOS 也有类似的机制(如 systemd-resolveddnscache)。

  1. Hosts 文件:手动干预的“捷径”
    C:\Windows\System32\drivers\etc\hosts(Windows)或 /etc/hosts(Linux/macOS)中,你可以手动添加一条:
127.0.0.1   www.mycompany.com

这样,访问 www.mycompany.com 就会直接指向本地服务器。开发中非常实用——比如你想在本地调试线上域名的项目,又不想改代码,host 文件就是你的“魔法开关”。

第三步:缓存失效?开始“递归查询”

如果以上缓存都没命中,那就得走正式流程了:递归解析

你的设备会把请求交给“递归解析器”——通常是你的 ISP(运营商)提供的 DNS 服务器,比如电信的 114.114.114.114,或者公共 DNS 如 8.8.8.8(Google)、1.1.1.1(Cloudflare)。

  1. 问根域名服务器
    .com 域的权威服务器在哪?”
    全球有 13 组根服务器(实际是集群),它们的 IP 地址是“写死”在 DNS 软件里的,是整个 DNS 系统的起点。

  2. 问顶级域(TLD)服务器
    根服务器告诉它:“.com 的服务器是 x.x.x.x。”
    于是解析器再去问 .com 的服务器:“baidu.com 的权威服务器在哪?”

  3. 问权威 DNS 服务器
    .com 服务器返回:baidu.com 的权威服务器是 ns.baidu.com
    解析器最后去问 ns.baidu.com:“www.baidu.com 的 IP 是多少?”

  4. 拿到结果,层层返回
    权威服务器返回 IP,比如 183.2.172.177
    递归解析器把结果缓存下来,再返回给你的浏览器。

整个过程像是一级级“问路”,最终找到目的地。

为什么是 a.shifen.com

回到前面那个问题:为什么 www.baidu.com 最终指向 a.shifen.com

这是因为百度使用了内部域名系统来做流量调度。a.shifen.com 是百度搜索服务的通用域名,背后是一组 IP 地址池。

也就是说,同一个域名,不同时间、不同地点解析出的 IP 可能完全不同

这背后是两大核心技术在支撑:

1. 负载均衡(Load Balancing)

百度有成千上万台服务器。DNS 解析时,权威服务器会根据你的地理位置、当前服务器负载等情况,通过算法(如轮询、最少连接、哈希等)返回一个“最优”的 IP,避免某台服务器过载。

2. CDN(Content Delivery Network)

静态资源(如 CSS、JS、图片)不会每次都回源站加载。它们被缓存到离你更近的 CDN 节点。比如你在广州访问,可能从广州的 CDN 服务器获取资源;在北京,则从北京的节点加载。

这就是“就近原则”——让内容离用户更近,加载更快

这也是为什么你在 ping 时看到的 IP,可能和别人不一样。

如何优化 DNS?前端能做什么?

作为前端,我们不能直接改 DNS 服务器,但可以通过一些手段“提前准备”,让页面加载更快。

1. dns-prefetch:提前解析

如果页面要加载第三方资源,比如阿里云的 CDN:

<link rel="dns-prefetch" href="//g.alicdn.com">

这行代码告诉浏览器:“我待会儿要用这个域名,你先帮我解析一下 DNS。”
这样,当真正请求资源时,DNS 解析已经完成,省去了等待时间。

2. preconnect:提前建立连接

更进一步,不只是解析 DNS,还可以提前建立 TCP 连接,甚至完成 TLS 握手:

<link rel="preconnect" href="https://unpkg.byted-static.com" crossorigin="anonymous">

这相当于告诉浏览器:“我要和这个服务器通信,你先把通道打开。”
对于关键资源,这能显著减少首屏加载时间。

⚠️ 注意:preconnect 消耗资源,不要滥用。只对高频、关键的第三方域名使用。

总结

DNS 看似只是“域名转 IP”,但它的设计体现了分布式系统的智慧:缓存、递归、分层、负载均衡、CDN 调度……每一个环节都在为“更快、更稳”服务。

作为前端开发者,理解 DNS 不仅能帮你排查“页面打不开”这类问题,还能在性能优化中做出更明智的决策。比如:

  • 开发时用 hosts 文件模拟线上环境;
  • 对关键 CDN 使用 dns-prefetchpreconnect
  • 分析 chrome://net-internals 诊断 DNS 延迟。

下一次,当你输入 www.baidu.com,看着页面缓缓展开,不妨想一想,在这背后,DNS 已经默默完成了一场跨越全球的“寻址之旅”。

而我们,正是这场旅程的“导演”之一。