跳到主要内容

谈谈你对 dns-prefetch 的理解

DNS 预解析(DNS prefetching)是一种优化技术,用于加速网页加载过程中的域名解析步骤。它通过提前解析网页中的域名,将域名对应的 IP 地址缓存到本地,从而减少后续的 DNS 查询时间,提高网页的加载速度。

当浏览器遇到网页中的链接、资源引用或重定向时,需要进行域名解析以获取对应的 IP 地址。这个过程涉及向 DNS 服务器发送查询请求,等待 DNS 服务器响应并返回 IP 地址。这个过程可能会引入一定的延迟,影响网页的加载速度。

DNS 预解析通过在网页中插入<link>标签来指示浏览器在加载网页时提前解析指定的域名。浏览器在解析 HTML 时遇到该标签会主动发起 DNS 查询,并将解析结果缓存起来。这样,在后续需要访问该域名的资源时,就无需再进行 DNS 查询,直接使用缓存的 IP 地址,从而减少了解析时间。

以下是一个示例的 DNS 预解析的<link>标签:

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

在上述示例中,href属性指定了需要进行 DNS 预解析的域名。浏览器在解析 HTML 时会注意到该标签,并在后台发起 DNS 查询,将解析结果缓存起来。

需要注意的是,DNS 预解析仅在现代浏览器中生效,对于不支持的浏览器,该标签将被忽略。另外,过度使用 DNS 预解析可能会增加网络负载和浏览器资源消耗,因此需要慎重使用。

DNS 预解析是一种简单而有效的优化技术,它可以减少域名解析的时间,从而提高网页的加载速度。通过在网页中添加<link>标签,并指定需要预解析的域名,可以帮助浏览器提前获取域名对应的 IP 地址,优化用户的网页浏览体验。

DNS 是什么

全称 Domain Name System , 即域名系统。

万维网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。DNS 协议运行在 UDP 协议之上,使用端口号 53。

简单的说, 通过域名, 最终得到该域名对应的 IP 地址的过程叫做域名解析(或主机名解析)。

www.zuofc.com (域名)  - DNS解析 -> 111.222.33.444 (IP地址)

有 dns 的地方, 就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对 DNS 结果做一定程度的缓存。

DNS 查询过程如下:

  1. 首先搜索浏览器自身的 DNS 缓存, 如果存在,则域名解析到此完成。
  2. 如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的 hosts 文件看是否存在对应的映射关系, 如果存在,则域名解析到此完成。
  3. 如果本地 hosts 文件不存在映射关系,则查找本地 DNS 服务器 (ISP 服务器, 或者自己手动设置的 DNS 服务器), 如果存在, 域名到此解析完成。
  4. 如果本地 DNS 服务器还没找到的话, 它就会向根服务器发出请求, 进行递归查询。

DNS 协议?

  1. 概念: DNS(Domain Namse System),域名系统,是进行域名和其相应 IP 地址进行转换的服务器。可以将DNS理解为一个翻译官,负责把域名转换为相应的 IP 地址。DNS协议运行在 UDP 协议之上,使用53号端口。

  2. 域名: 域名是一个具有层次的结构,如下:

    bash 代码解读复制代码主机名.次级域名.顶级域名.根域名
    # 即
    host.sld.tld.root

    需要注意的是,根域名.root对于所有域名都是一样的,所以平时是省略的。

    根据域名的层级结构,管理不同层级域名的服务器,可以分为根域名服务器顶级域名服务器权限域名服务器。除此之外,还有电脑默认的本地域名服务器

  3. 查询方式: DNS查询方式分为递归查询迭代查询两种。所谓递归查询,就是 A 向 B 请求,如果 B 不知道所请求的内容,则 B 将继续向上请求,直到获得所需的内容,然后将内容返回给 A。迭代查询,就是 A 向 B 请求,如果 B 不知道,则 B 会告诉 A 如何获得该内容,让 A 继续去请求。

    递归查询.png

    迭代查询.png

  4. 域名缓存: 域名服务器会缓存域名和 IP 之间的映射。分为两种缓存方式: ① 浏览器缓存:浏览器在获取网站域名的地址后会对其进行缓存,减少网络请求的损耗。 ② 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件。

  5. 完整解析过程:

  • 首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表

  • 若没有命中,则继续搜索操作系统的 DNS 缓存

  • 若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果

  • 若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行迭代查询

    • 首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址
    • 本地域名服务器拿到这个顶级域名服务器的地址后,向其发起请求,获取权限域名服务器的地址
    • 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
  • 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来

  • 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来

  • 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来

参考链接:超详细 DNS 协议解析