DNS
把网址转换成 ip 的过程,互联网中每一台机器都有唯一标识的 IP 地址,但是这个 IP 不好记,所以需要一个网址和 IP 的转换,即 DNS 解析。
基本概念
顶级域(一级域名): .com、.cn、.org 等
二级域名: zhihu.com、baidu.com、sina.cn 等
子域名(三级及以下): dev.sina.cn、zhuanlan.zhihu.com
解析过程
递归查询
- 主机向本地域名服务器(ldns)的查询一般都是采用递归查询。
- 递归查询只会返回两种信息:要么是所要查询的 IP 地址,要么是查询失败。
迭代查询
- 本地域名服务器向根域名服务器的查询是迭代查询。
TIP
举个 🌰 来描述递归查询和迭代查询,有两位同学 A 和 B,A 遇到了一个问题
递归: A 请教 B,B 去问老师,得到结果后再告诉 A;
迭代: B 说我不会,但是老师会,你去问下老师。 A 去问老师 得到结果;
为什么要有两种查询方式
- 递归查询会一直向下查找,直到找到答案,减少了客户端的网络延迟,但增加了服务器的负担;
- 迭代查询则是客户端一步步向下查找,分摊了服务器的负担,但需要进行多次查询
整体流程
输入www.google.com网址后,首先在本地的域名服务器中查找,没找到去根域名服务器查找,没有再去com顶级域名服务器查找,,如此的类推下去,直到找到IP地址,然后把它记录在本地,供下次使用。大致过程就是. -> .com -> google.com. -> www.google.com.。 (你可能觉得我多写 .,并木有,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求 DNS 的时候会自动加上)
优化
1. 减少 DNS 解析次数
- 合并页面中的 CSS、JS、图片等资源文件
- 将资源放到同一个域名下
WARNING
HTTP /1.1 中每个域只有一定数量的并发限制,如果过多请求,那么就会出现下载资源排队现象,这样就会降低性能。 因此 HTTP /1.1 时:一个网站里面使用至少 2 个域,但不多于 4 个域
2. DNS 预解析
提前解析出页面中要使用的域名,以减少后续的 DNS 解析时间
3. DNS 缓存
浏览器和操作系统会对 DNS 解析结果进行缓存,可以减少 DNS 解析次数和时间。缓存时间根据 DNS 服务器返回的 TTL(Time to Live)来确定,一般为数分钟到数小时不等。
- 浏览器缓存(chrome://dns/)
- 系统缓存(/etc/hosts)
- 路由器缓存
- 互联网服务供应商(ISP) 服务器缓存
- 根域名服务器缓存
- 顶级域名服务器缓存
- 主域名服务器缓存
4. 使用 CDN
CDN(内容分发网络)可以将内容分发到全球各地的节点,提高访问速度和稳定性。CDN 中会缓存 DNS 解析结果,因此可以减少 DNS 解析次数和时间。