计算机网络系列 -- DNS 解析及预解析

699 阅读3分钟

前言

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能识别域名

用IP地址来标记网站,对于我们来说很难记忆。所以我们访问网站时,更多是在浏览器地址栏中输入更加语义化的域名,就能看到所需要的页面,这是因为有个域名系统(叫 DNS )把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页

DNS 定义

  • DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库。打个比方,就好比是电话本,域名是用户名,IP地址是电话号码

image.png

DNS 解析

  • DNS 解析就是将域名转换成 IP 的过程
  • 当浏览器访问一个域名的时候,需要解析一次DNS,获得对应域名的ip地址。在解析过程中,按照浏览器缓存、系统缓存、路由器缓存、ISP(运营商)DNS缓存、根域名服务器、顶级域名服务器、主域名服务器的顺序,逐步读取缓存,直到拿到IP地址

DNS 预解析 dns - prefetch

定义

提前解析之后可能会用到的域名,使解析结果缓存到系统缓存中缩短DNS解析时间,来提高网站的访问速度

注意:只是缩短 DNS 解析时间,并不是提前资源下载好

分类

隐式 DNS 预解析:对页面中存在异域的链接或资源进行预加载

  • HTTP 网页 会自动预解析<img>(外域图片)、<script>(外域JS代码)、<link>(外域CSS代码、HTML代码)、<a>(外域链接)

如需关闭:<meta http-equiv="x-dns-prefetch-control" content="off">

  • HTTPS 网页 不会自动预解析:处于安全考虑——防止窃听者根据 DNS 预解析推断显示在HTTPS页面中超链接的主机名

如需开启:<meta http-equiv="x-dns-prefetch-control" content="off">

显式 DNS 预解析:对页面中没有出现的域进行预加载

一般是在 <link> 标签的 rel 属性中进行设置

在文档顶部的 <head>标签中加入以下内容:<link rel="dns-prefetch" href="//img.alicdn.com">

拓展

预连接 rel="preconnect"

与 DNS 预解析类似,Preconnect 不仅完成 DNS 预解析,同时还将进行 TCP 握手和建立传输层协议

<link rel="preconnect" href="http://example.com">

预获取 rel="prefetch"

如果我们确定某个资源(图片/脚本文件/css文件)将来一定会被使用到,我们可以让浏览器预先请求该资源并放入浏览器缓存中。与 DNS 预解析不同,预获取真正请求并下载了资源,并储存在缓存

<link rel="prefetch" href="image.png / test.js / test.css">

预渲染 rel="prerender"

对一个用户将来一定会打开的 tab 页:将【下载所有资源、创建 DOM 结构、完成页面布局、应用 CSS 样式和执行 JavaScript 脚本】等。当用户真正访问该链接时,隐藏的页面就切换为可见,使页面看起来就是瞬间加载完成一样

<link rel="prerender" href="http://example.com">

前提是:用户在将来一定会打开该tab页,否则会造成不必要的资源浪费