何为DNS?
DNS 即域名系统,全称是 Domain Name System,因特网上作为域名和IP地址互相映射的一个分布式数据库。
当我们在浏览器输入一个 URL 地址时,浏览器要向这个 URL 的主机名对应的服务器发送请求,就得知道服务器的 IP,对于浏览器来说,DNS 的作用就是将主机名转换成 IP 地址(正向解析), 或者根据IP地址查询对应的主机域名(反向解析)。
浏览器如何通过域名去查询 URL 对应的 IP 呢?(DNS解析的过程)
一般来说会是这样的一个顺序:
1)查找本地硬盘的host文件,如果命中直接使用对应的ip地址
2)如果host文件中找不到,浏览器会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般是指网络接入服务器的提供商(比如电信,移动)
3)DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询他的缓存记录,如果缓存中有这条记录就直接返回结果,此过程是递归的方式,如果查找失败,本地DNS服务器还要向根DNS服务器进行查询
4)根DNS服务器不会返回具体域名和IP地址的对应关系,而是告诉本地DNS服务器,可以向域服务器上继续查询,并给出域服务器的地址,这是个迭代的过程
5)本地DNS服务器继续向域服务器发起请求,例如请求的对象是.com域服务器。.com域服务器收到请求后,也不会直接返回域名和IP地址的对应关系,而是告诉本地NDS服务器,你的域名的解析服务器的地址
6)最后,本地DNS服务器向域名解析服务器发出请求,才能收到域名和IP地址的对应关系,本地DNS服务器不仅要将IP地址返回给浏览器,还要把这个对应关系保存在缓存中.
例如:主机m.n.com 想要获取a.b.com的IP 地址,图示:
DNS服务器层级
-
根DNS服务器
首先我们要明确根域名是什么,比如 www.baidu.com,有些同学可能会误以为 com 就是根域名,其实 com 是顶级域名,www.baidu.com 的完整写法是 www.baidu.com.,最后的这个 . 就是根域名。
根 DNS 服务器的作用是什么呢?就是管理它的下一级,也就是顶级域 DNS 服务器。通过询问根 DNS 服务器,我们可以知道一个主机名对应的顶级域 DNS 服务器的 IP 是多少,从而继续向顶级域 DNS 服务器发起查询请求。 -
顶级域 DNS 服务器
除了前面提到的 com 是顶级域名,常见的顶级域名还有 cn、org、edu 等。顶级域 DNS 服务器,也就是 TLD,提供了它的下一级,也就是权威 DNS 服务器的 IP 地址。 -
权威 DNS 服务器
权威 DNS 服务器可以返回主机 - IP 的最终映射
DNS 劫持
现象: 反问a网站DNS应该返回IP地址为1.2.3.4,但却返回了5.6.7.8,浏览器呈现了b页面。
DNS-Prefetch是什么,有什么用?
DNS解析速度是造成页面延迟加载的最大的原因。
DNS Prefetch,即DNS预解析技术,是前端优化的一部分。一般来说,在前端优化中与 DNS 有关的有两点: 一个是减少DNS的请求次数,另一个就是进行DNS预获取 。
DNS Prefetch 是根据浏览器定义的规则,提前解析之后可能会用到的域名,使解析结果缓存到系统缓存中,缩短DNS解析时间,来提高网站的访问速度,减少用户等待时间,提高用户体验。
现代浏览器在 DNS Prefetch 上做了两项工作:
-
html 源码下载完成后,会解析页面的包含链接的标签,提前查询对应的域名
-
对于访问过的页面,浏览器会记录一份域名列表,当再次打开时,会在 html 下载的同时去解析 DNS
DNS-Prefetch的分类
-
隐式解析:默认情况下浏览器会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的DNS Prefetch。
-
显式解析:想对页面中没有出现的域进行预获取,那么就要使用显示的DNS Prefetch了,也就是使用link标签
-
<link rel="dns-prefetch" href="//baidu.com" >
这个标签回让浏览器进行“baidu.com”的解析 -
希望在HTTPS页面开启隐式的DNS Prefetch【自动解析】功能时,添加如下标记
<meta http-equiv="x-dns-prefetch-control" content="on">
-
希望在HTTPS页面关闭隐式的DNS Prefetch【自动解析】功能时,添加如下标记
<meta http-equiv="x-dns-prefetch-control" content="off">
其他
- chrome使用8个线程专门做DNS Prefetching,而且chrome本身不做dns记录的cache,是直接从操作系统读dns。所以直接修改系统的dns记录或者host是可以直接影响chrome。
- 浏览器会对a标签的href自动启用DNS Prefetching,所以a标签里包含的域名不需要在head中手动设置link。但是在HTTPS下面不起作用,需要meta来强制开启功能。这个限制的原因是防止窃听者根据DNS Prefetching推断显示在HTTPS页面中超链接的主机名。