前言
网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址
的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133
”之类的IP地址,而不能识别域名
。
用IP地址来标记网站,对于我们来说很难记忆。所以我们访问网站时,更多是在浏览器地址栏中输入更加语义化的域名
,就能看到所需要的页面,这是因为有个域名系统
(叫 DNS
)把我们的域名“翻译
”成了相应的IP地址,然后调出IP地址所对应的网页
。
DNS 定义
- DNS(Domain Name System, 域名系统),是域名和IP地址
相互映射
的一个分布式数据库
。打个比方,就好比是电话本
,域名是用户名,IP地址是电话号码
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页,否则会造成不必要的资源浪费