本博客 hjy-xh,转载请申明出处
DNS
DNS 全称 Domain Name System
,即域名系统
DNS 是网络请求要走的第一步,我们日常访问的网站使用的 HTTP/HTTPS`` 协议的下层是
TCP/IP` ,而通过其中的 IP 协议,才能知道将数据包发送到何处
由于 IP 长且难记,通过 IP 访问网站不方便,后来通过发明了 DNS 服务器,这个时候我们访问网站输入网站域名,DNS服务器就解析我们的域名为 IP, 这样我们实际访问的就是对应的 IP 地址
它实质上是一个域名和 IP相互映射的分布式数据库,有了它我们就可以通过域名更方便的访问互联网
域名的树状结构
想要知道如何解析域名,还得从域名的树状结构说起
最顶层的域名是根域名(root),然后是顶级域名(top-level domain,简写 TLD),再是一级域名、二级域名、三级域名
- 根域名
所有域名的起点都是根域名,它写作一个点.,放在域名的结尾,可以省略不写(任何一个域名结尾加一个点,浏览器都可以正常解读)
根域名服务器全世界一共有13台(都是服务器集群)
- 顶级域名
根域名的下一级是顶级域名。它分成两种:通用顶级域名(gTLD,比如 .com 和 .net)和国别顶级域名(ccTLD,比如 .cn 和 .us)
- 一级域名
一级域名就是你在某个顶级域名下面,自己注册的域名
比如,a.b.com就是我在顶级域名,.b就是一级域名
- 二级域名
二级域名是一级域名的子域名,是域名拥有者自行设置的,不用得到许可
查询
DNS解析分为递归查询
与迭代查询
:
- 主机向本地域名服务器的查询一般都是采用递归查询
如果主机向本地域名服务器查询的是未知的 IP 地址,那么本地域名服务器就以 DNS 客户的身份向其它根域名服务器继续发出查询请求报文,也就是替主机继续查询,而不是让主机自己进行下一步查询 - 本地域名服务器向根域名服务器的查询的迭代查询
当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所查询的 IP 地址,要么告诉本地域名服务器下一步应该向哪个域名服务器查询(以便本地域名服务器进行后续查询)
DNS缓存机制
用户输入 URL 以后,浏览器首先要查询域名对应服务器的 IP 地址,这个操作一般需要耗费 20-120 毫秒时间,而DNS 查询完成之前,浏览器无法从服务器下载任何数据,因此基于性能考虑,ISP、局域网、操作系统、浏览器都会有相应的 DNS 缓存机制:
- IE 缓存 30 分钟,可以通过注册表中 DnsCacheTimeout 项设置
- Firefox 缓存 1 分钟,通过 network.dnsCacheExpiration 配置
- Chrome 缓存 1 分钟,通过 chrome://net-internals/#dns 配置
DNS存在的问题
- 查询路径过长导致业务访问延时
- 缓存时间不统一
- DNS 劫持(被黑客劫持信息,插入广告)
- 根服务器停止服务的风险
优化手段
X-DNS-Prefetch-Control
头控制着浏览器的 DNS 预解析功能:
1 | <meta http-equiv="x-dns-prefetch-control" content="on"> |
DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验