Skip to content

DNS

把网址转换成 ip 的过程,互联网中每一台机器都有唯一标识的 IP 地址,但是这个 IP 不好记,所以需要一个网址和 IP 的转换,即 DNS 解析。

基本概念

顶级域(一级域名): .com、.cn、.org 等

二级域名: zhihu.com、baidu.com、sina.cn 等

子域名(三级及以下): dev.sina.cn、zhuanlan.zhihu.com

解析过程

递归查询

  1. 主机向本地域名服务器(ldns)的查询一般都是采用递归查询。
  2. 递归查询只会返回两种信息:要么是所要查询的 IP 地址,要么是查询失败。

迭代查询

  1. 本地域名服务器向根域名服务器的查询是迭代查询。

TIP

举个 🌰 来描述递归查询和迭代查询,有两位同学 A 和 B,A 遇到了一个问题

递归: A 请教 B,B 去问老师,得到结果后再告诉 A;
迭代: B 说我不会,但是老师会,你去问下老师。 A 去问老师 得到结果;

为什么要有两种查询方式

  1. 递归查询会一直向下查找,直到找到答案,减少了客户端的网络延迟,但增加了服务器的负担;
  2. 迭代查询则是客户端一步步向下查找,分摊了服务器的负担,但需要进行多次查询

整体流程

输入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 解析次数和时间。

参考