DNS:从输入URL到网页显示,背后隐藏的分布式电话簿

133 阅读8分钟

DNS:从输入URL到网页显示的第一步,背后隐藏的分布式电话簿

你以为输入网址就能直接访问?中间还差一次关键的“查号”过程!

前言

“请简述从输入URL到页面显示发生了什么?”

这道面试题堪称前端界的“经典八股文”。HTTP协议、TCP三次握手、浏览器渲染...这些概念大家都能说上几句。但很多人往往会忽略一个至关重要的第一步:DNS解析。

今天,就让我们深入这个看似简单却至关重要的系统,让你在面试中谈到DNS时,能够惊艳全场!

一、DNS是什么?互联网的分布式电话簿

DNS(Domain Name System),全称域名系统。它的作用非常简单:作为一个分布式的数据库系统,将我们容易理解和记忆的域名(如 www.baidu.com)解析成机器间通信所需的IP地址(如 183.2.172.185)。

image.png

想象一下,如果没有DNS,我们上网就需要记住一大堆毫无规律的数字IP地址。想刷抖音?记住 111.222.333.444。想逛淘宝?记住 555.666.777.888。这简直是反人类!所以,DNS堪称互联网最伟大的基础设施之一。

核心概念:浏览器在真正发起HTTP(s)请求前,通常都会先做一次DNS解析,拿到IP地址后才能建立TCP连接。

# 一条最简单的命令,背后就隐藏着DNS解析
ping www.baidu.com
# 输出:PING www.a.shifen.com (183.2.172.185)
# 看到了吗?它甚至告诉你,www.baidu.com 的真正“内网名”是 www.a.shifen.com

二、DNS解析全过程:一场高效的全球寻人游戏

当你在浏览器输入一个URL并敲下回车后,一场精心设计的“寻人游戏”就开始了。它的核心原则是:就近查询,逐级递进,目的是以最高效率找到目标IP。

第一步:浏览器缓存 —— “我的最近通话记录”

浏览器首先会检查自己的“最近通话记录”——本地缓存。Chrome浏览器甚至有一个专门的面板来管理这些DNS缓存(chrome://net-internals/#dns)。

  • 如果是第一次访问,没有缓存,进入下一步。
  • 如果不是第一次,恭喜,直接使用缓存IP,解析结束!🚀

第二步:操作系统缓存 & Hosts文件 —— “我的私人通讯录”

如果浏览器缓存没找到,请求就来到了操作系统层面。

  • 操作系统缓存:系统本身也会缓存DNS记录。

    • Windows用户可以用 ipconfig /displaydns 查看。
    • Mac用户可以用 dscacheutil -q all 查看。
  • Hosts文件:这是一个没有后缀的系统文件,是手动配置域名映射的终极武器。它就像一个私人通讯录,优先级非常高!

    ✨ 面试亮点:如何手动指定域名解析? 这就是Hosts文件的妙用。你可以通过修改它,强制将某个域名解析到你指定的IP。

    为什么这很重要?

    1. 开发环境模拟线上环境:公司官网是 www.my-company.com,你在本地跑项目时,IP是 192.168.1.100。你可以在Hosts里加一行:
      192.168.1.100    www.my-company.com
      
      这样,你在浏览器访问 www.my-company.com,就会直接指向你的本地服务器,效果和线上一模一样,方便调试和开发。
    2. 屏蔽恶意网站:可以将一些广告或恶意网站的域名解析到 127.0.0.1(本地),让它们无法访问。
    3. 科学上网:(嗯...这个就不展开了😜)

    位置:

    • Windows: C:\Windows\System32\drivers\etc\hosts
    • Mac/Linux: /etc/hosts

第三步:递归解析器 —— “专业的查号台”

如果本地“通讯录”都找不到,你的电脑就会把问题抛给一个“专业的查号台”——通常是你的网络服务提供商(ISP) 提供的递归解析器(也叫Local DNS)。

它接到任务后,就开始了真正的“全球问路”。

第四步:迭代查询 —— “问路问到大佬”

递归解析器会从内置的13组根域名服务器(Root DNS Server)的地址开始问起(这些地址是写死在软件里的)。这个过程是迭代查询。

以查找 www.baidu.com 为例:

  1. 问根服务器: “请问 .com 域名服务器(TLD Server)的地址是多少?” 根服务器一看是 .com 结尾的,就回复:“我不知道它的IP,但我可以告诉你谁管 .com,这是它的地址列表。”

  2. 问顶级域(.com)服务器: “请问 baidu.com 的权威域名服务器(Authoritative DNS Server)的地址是多少?” .com 服务器回复:“管 baidu.com 的服务器在那呢,地址是 X.X.X.X。”

  3. 问权威服务器: “请问 www.baidu.com 的IP地址是多少?” 权威服务器终于知道了答案,回复:“它的IP是 183.2.172.185!”

最终,递归解析器欢快地把IP地址返回给你的电脑,并缓存起来以备下次使用。你的电脑拿到IP后,终于可以进行TCP三次握手,建立连接,发送HTTP请求,获取数据,渲染页面...

三、深入理解:负载均衡与CDN

故事到这里还没完。为什么我们 ping www.baidu.com 得到的是 www.a.shifen.com 和一个IP?这背后隐藏着两个提升性能和可靠性的关键技术。

1. 负载均衡 (Load Balancing)

像百度、淘宝这样的网站,访问量巨大,不可能只用一台服务器。域名背后是分布在全球各地机房的大量服务器集群

当DNS解析发生时,权威服务器并不会简单地返回一个固定IP。它会根据一套复杂的算法(如基于地理位置、基于服务器当前负载等),从健康的服务器池中选出一个最合适的IP返回给你。

这个过程就叫DNS负载均衡。它就像一个大公司的总机接线员,根据你的需求和当前各部门的繁忙程度,把你的电话转接到最合适的客服那里。

2. 内容分发网络 (CDN - Content Delivery Network)

CDN是DNS负载均衡的一个经典应用。它的核心思想是:让用户离内容更近

一个网站的内容通常分为:

  • 动态内容:需要实时计算,必须从中央主服务器获取(如用户登录、下单)。
  • 静态内容:不变的资源,如CSS、JS、图片、视频等。

CDN厂商会在全球部署大量边缘节点服务器,提前将网站的静态资源缓存起来。当用户发起请求时:

  1. DNS解析会通过负载均衡技术,将域名解析到离用户地理位置最近的CDN节点服务器的IP上。
  2. 用户直接从该节点获取静态资源,速度极快。
  3. 只有动态请求才会绕回到源站(中央服务器)。

双11、春晚抢红包这种海量并发场景,CDN功不可没! 它极大地减轻了源站压力,加速了内容传输。

所以,www.a.shifen.com 正是百度用于自家CDN网络的内部域名系统。

四、DNS优化:让网络飞起来

DNS解析虽然快,但通常也需要几十到几百毫秒。对于追求极致性能的网站来说,这依然是可优化的点。

1. DNS Prefetch (DNS预解析 dns-prefetch)

这是一个前端工程师可以直接使用的优化手段。通过在HTML头部添加 <link> 标签,浏览器会在空闲时提前对指定域名进行DNS解析。

<!-- 告诉浏览器:“别等了,快去把baidu.com的IP先查好!” -->
<link rel="dns-prefetch" href="//www.baidu.com">

当后面真正需要请求该域下的资源时,IP已经躺在缓存里了,直接使用,节省了DNS查询时间。

2. Preconnect (预连接)

这是一个更超前的优化!它不仅会解析DNS,还会提前建立TCP连接,甚至进行TLS协商(如果是HTTPS)。

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

这相当于不仅查了号,还把电话线先给你接好了,只等你开口说话。这对于需要从多个CDN域名加载资源的现代网站非常有效,能显著降低延迟。

使用策略:对最重要的第三方域名使用 preconnect,对其他的使用 dns-prefetch 即可,因为保持连接也是需要开销的。

总结

现在,让我们再回头看那个经典问题:“从输入URL到页面显示发生了什么?” 你现在可以自信地补充上:

“在发起HTTP请求之前,浏览器首先要进行DNS解析,这是一个复杂的分布式查询过程。它会先查询本地缓存(浏览器和系统),再检查 Hosts文件。如果都没有,会由递归解析器从根服务器开始,经过顶级域服务器,最终找到权威服务器,获取到IP地址。为了提高性能,大型网站会采用负载均衡CDN技术,而前端可以通过 DNS PrefetchPreconnect 来进一步优化这一过程。”

当你把DNS这个“第一步”讲得如此清晰、深入时,面试官的表情一定会是这样:😲 -> 🤔 -> 😃

恭喜你,离Offer又近了一步!