【前端面试小册】网络-第1节:DNS 进阶
第1节:DNS 进阶
一、DNS 是什么
1.1 定义
DNS(Domain Name System,域名系统)是互联网的一项服务,它将域名和 IP 地址相互映射。
1.2 为什么需要 DNS
访问网页获取资源的本质是通过 IP 建立连接传输数据,但是 IP 地址长且难记,访问不方便。
问题:
- IP 地址难以记忆:
220.181.38.148 - 不方便用户使用
解决方案:
- 通过相对语义化的网站域名,更容易记住
- 当我们输入网站域名,DNS 服务器就负责解析出域名对应的 IP,然后建立起连接通信传输资源
示例:
www.baidu.com ---> DNS解析 ----> 220.181.38.148
1.3 总结
域名映射 IP,通过域名的形式让用户更方便访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
类比理解:DNS 就像电话簿,域名就像人名,IP 地址就像电话号码。我们记住人名(域名),通过电话簿(DNS)查找电话号码(IP 地址)。
二、DNS 域名解析
2.1 DNS 服务器特点
DNS 服务器是高可用、高并发和分布式的,它是树状结构。
特点:
- 高可用:多台服务器备份,单点故障不影响服务
- 高并发:支持大量并发查询请求
- 分布式:全球分布,就近访问
- 树状结构:层次化的域名体系
2.2 域名的层级
完整域名格式:
主机名.次级域名.顶级域名.根域名
host.sld.tld.root
示例解析:www.baidu.com
看起来和我们平常输入的网站(www.baidu.com)有点区别,输入的网站是 3 部分,相比域名层级 4 部分少了一部分?
原因:最后部分的根域名对于所有域名都一样,所以平时省略了。但是我们通过域名查询工具 dig,是可以看到省略部分的。
实际查询地址:www.baidu.com.(注意末尾的点)
www.baidu.com. 是 www.baidu.com.root 的简写。
层级分解:
www:主机名,又叫三级域名baidu:次级域名,用户可以注册.com:顶级域名(TLD - Top Level Domain).root:根域名(通常省略)
2.3 域名查询相关知识和工具
DNS 记录类型
| 标识 | 含义 | 说明 |
|---|---|---|
| A | 地址记录(Address) | 返回域名指向的 IP 地址 |
| NS | 域名服务器记录(Name Server) | 返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为 IP 地址 |
| MX | 邮件记录(Mail eXchange) | 返回接收电子邮件的服务器地址 |
| CNAME | 规范名称记录(Canonical Name) | 返回另一个域名,即当前查询的域名是另一个域名的跳转 |
| PTR | 逆向查询记录(Pointer Record) | 只用于从 IP 地址查询域名 |
| AAAA | IPv6 地址记录 | 返回 IPv6 地址 |
| TXT | 文本记录 | 用于存储任意文本信息 |
DNS 查询工具
| 工具 | 使用 | 简介 |
|---|---|---|
| dig | dig www.baidu.com |
功能强大的 DNS 查询工具,返回详细的查询信息 |
| host | host www.baidu.com |
dig 命令的简化版本,返回当前请求域名的各种记录 |
| nslookup | nslookup |
命令用于互动式地查询域名记录 |
| whois | whois www.baidu.com |
查看域名的注册情况 |
dig 命令分析
以 dig www.baidu.com 为例:
第一部分:输入查询命令
第二部分:查询参数和统计
第三部分:查询内容
www.baidu.com.标识查询的域名
第四部分:DNS 服务器的响应
注意:www.baidu.com. 的别名(CNAME)指向 www.a.shifen.com
也就是说我们最终获取的是 www.a.shifen.com 的 IP,这又是为什么?
原因:
- 当需要变更服务器的 IP 地址的时候,只需要修改
www.a.shifen.com的域名就行了 - 这样用户记住的
www.baidu.com域名就不用修改 - 这样的更改的好处用户无感知
第五部分:DNS 服务器的一些传输信息
三、DNS 的查询顺序
3.1 查询流程图
graph TD
A[输入 URL 域名] --> B[浏览器缓存]
B --> C{有缓存?}
C -->|有| D[返回 IP]
C -->|无| E[系统 hosts 文件]
E --> F{有记录?}
F -->|有| D
F -->|无| G[本地 DNS 解析器缓存]
G --> H{有缓存?}
H -->|有| D
H -->|无| I[本地 DNS 服务器]
I --> J{有缓存?}
J -->|有| D
J -->|无| K[递归查询]
K --> L[根域名服务器]
L --> M[顶级域名服务器]
M --> N[主域名服务器]
N --> O[返回 IP]
O --> D
3.2 详细查询步骤
-
输入 URL(域名)后要获取域名对应的 IP 地址
-
浏览器缓存:查看是否有该域名的 IP 映射,有返回,没有下一步
-
系统 hosts 文件:查看本地 hosts 文件,有返回,没有下一步
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/Mac:
/etc/hosts
- Windows:
-
本地 DNS 解析器缓存:查找,有返回,没有下一步
-
本地 DNS 服务器:查询,有返回;若没有查到,根据本地 DNS 服务器配置,发送解析请求到递归解析服务器
5.1 递归查询过程
步骤 1:客户端向本地 DNS 服务器(递归解析服务器)发出解析 tool.chinaz.com 域名的请求
步骤 2:本地 DNS 服务器查看缓存,是否有缓存过 tool.chinaz.com 域名,如果有直接返回给客户端
步骤 3:如果没有,执行下一步:本地 DNS 服务器向根域名服务器发送请求,查询 com 顶级域的 nameserver 地址
步骤 4:拿到 com 域名的 IP 后,再向 com nameserver 发送请求,获取 chinaz 域名的 nameserver 地址
步骤 5:继续请求 chinaz 的 nameserver,获取 tool 域名的地址,最终得到了 tool.chinaz.com 的 IP,本地 DNS 服务器把这个结果缓存起来,以供下次查询快速返回
步骤 6:本地 DNS 服务器把结果返回给客户端
3.3 缓存查询顺序总结
方式一:浏览器 → 系统 → 路由器 → ISP DNS
- 浏览器缓存
- 浏览器会检查缓存中有没有这个域名对应的解析过的 IP 地址
- 如果缓存中有,这个解析过程就将结束
- 浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制
- 通常情况下为几分钟到几小时不等
缓存时间的影响:
- 太长:一旦域名被解析到的 IP 有变化,会导致被客户端缓存的域名无法解析到变化后的 IP 地址,以致该域名不能正常解析
- 太短:会导致用户每次访问网站都要重新解析一次域名
- 系统缓存
- 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的 DNS 解析结果
- 在 Windows 中可以通过
C:\Windows\System32\drivers\etc\hosts文件来设置 - 你可以将任何域名解析到任何能够访问的 IP 地址
- 如果你在这里指定了一个域名对应的 IP 地址,那么浏览器会首先使用这个 IP 地址
应用场景:
- 测试时可以将一个域名解析到一台测试服务器上
- 这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确
安全风险:
- 黑客有可能通过修改你的域名解析来把特定的域名解析到它指定的 IP 地址上
- 导致这些域名被劫持
-
路由器缓存
- 如果系统缓存中也找不到,那么查询请求就会发向路由器
- 它一般会有自己的 DNS 缓存
-
ISP DNS 服务器缓存
- 运气实在不好,就只能查询 ISP DNS 缓存服务器了
- 在我们的网络配置中都会有"DNS 服务器地址"这一项
- 操作系统会把这个域名发送给这里设置的 DNS,也就是本地区的域名服务器
- 通常是提供给你接入互联网的应用提供商
- 这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果
- 当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素
- 大约 80% 的域名解析都到这里就已经完成了,所以 ISP DNS 主要承担了域名的解析工作
-
根域名服务器缓存
-
顶级域名服务器缓存
-
主域名服务器缓存
四、DNS 可能导致的问题
4.1 DNS 欺骗
将用户引导到错误的互联网站点,或者发送一个电子邮件到一个未经授权的邮件服务器。网络攻击者通常通过两种方法进行 DNS 欺骗。
缓存感染
黑客会熟练的使用 DNS 请求,将数据放入一个没有设防的 DNS 服务器的缓存当中。这些缓存信息会在客户进行 DNS 访问时返回给客户,从而将客户引导到入侵者所设置的运行木马的 Web 服务器或邮件服务器上,然后黑客从这些服务器上获取用户信息。
DNS 信息劫持
入侵者通过监听客户端和 DNS 服务器的对话,通过猜测服务器响应给客户端的 DNS 查询 ID。每个 DNS 报文包括一个相关联的 16 位 ID 号,DNS 服务器根据这个 ID 号获取请求源位置。黑客在 DNS 服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。
DNS 重定向
攻击者能够将 DNS 名称查询重定向到恶意 DNS 服务器。这样攻击者可以获得 DNS 服务器的写权限。
IP 更新问题
IP 更新,DNS 缓存存在走老 IP,访问不了。
4.2 拒绝服务攻击
黑客主要利用一些 DNS 软件的漏洞,如在 BIND 9 版本(版本 9.2.0 以前的 9 系列)如果有人向运行 BIND 的设备发送特定的 DNS 数据包请求,BIND 就会自动关闭。攻击者只能使 BIND 关闭,而无法在服务器上执行任意命令。
影响:
- 如果得不到 DNS 服务,那么就会产生一场灾难
- 由于网址不能解析为 IP 地址,用户将无法访问互联网
- 这样,DNS 产生的问题就好像是互联网本身所产生的问题,这将导致大量的混乱
4.3 分布式拒绝服务攻击(DDoS)
DDoS 攻击通过使用攻击者控制的几十台或几百台计算机攻击一台主机,使得服务拒绝攻击更难以防范,更难以通过阻塞单一攻击源主机的数据流,来防范服务拒绝攻击。
4.4 缓冲区漏洞溢出攻击
黑客利用 DNS 服务器软件存在漏洞,比如对特定的输入没有进行严格检查,那么有可能被攻击者利用,攻击者构造特殊的畸形数据包来对 DNS 服务器进行缓冲区溢出攻击。如果这一攻击成功,就会造成 DNS 服务停止,或者攻击者能够在 DNS 服务器上执行其设定的任意代码。
五、DNS 优化
5.1 减少 DNS 查找,避免重定向
优化方法:
- 浏览器 DNS 缓存
- 计算机 DNS 缓存
- 服务器 DNS 缓存
- 使用 Keep-Alive 特性来减少 DNS 查找
考虑影响 DNS 缓存的因素:
-
服务器 TTL 值
- 服务器可以设置 TTL 值表示 DNS 记录的存活时间
- 本机 DNS 缓存将根据这个 TTL 值判断 DNS 记录什么时候被抛弃
- 这个 TTL 值一般都不会设置很大,主要是考虑到快速故障转移的问题
-
浏览器 DNS 缓存
- 浏览器 DNS 缓存也有自己的过期时间
- 这个时间是独立于本机 DNS 缓存的,相对也比较短
- 例如 Chrome 只有 1 分钟左右
-
浏览器 DNS 记录数量限制
- 浏览器 DNS 记录的数量也有限制
- 如果短时间内访问了大量不同域名的网站,则较早的 DNS 记录将被抛弃,必须重新查找
- 不过即使浏览器丢弃了 DNS 记录,操作系统的 DNS 缓存也有很大机率保留着该记录
- 这样可以避免通过网络查询而带来的延迟
5.2 DNS 的预解析
通过 meta 信息告知浏览器
<meta http-equiv="x-dns-prefetch-control" content="on" />
使用 link 标签强制对 DNS 做预解析
<link rel="dns-prefetch" href="http://ke.qq.com/" />
原理:
- 当客户端的 DNS 缓存为空时,DNS 查找的数量与 Web 页面中唯一主机名的数量相等
- 减少唯一主机名的数量就可以减少 DNS 查找的数量
- 较少的域名来减少 DNS 查找(2-4 个主机)
使用场景:
- 预解析第三方域名(CDN、API 等)
- 预解析图片域名
- 预解析字体域名
5.3 DNS 优化最佳实践
- 减少域名数量:尽量使用同一个域名
- 使用 DNS 预解析:提前解析可能访问的域名
- 合理设置 TTL:平衡缓存时间和更新速度
- 使用 CDN:CDN 通常有更好的 DNS 解析性能
六、其他知识
6.1 本地 DNS 地址
一般指 IPv4 中的 DNS 地址。
常见 DNS 服务器:
- 114.114.114.114(国内)
- 8.8.8.8(Google)
- 1.1.1.1(Cloudflare)
6.2 DNS 缓存时间
Chrome 默认 1 分钟刷新
本地缓存
通过域名解析命令获取 ISP(Internet Service Provider)端的域名服务中的 TTL(Time to live 域名解析在 DNS 中存在时间)时间。
但是 ISP 缓存是 15 分钟,就算刷新本机缓存,ISP 仍然存在。
MAC 系统
MAC 系统会严格遵循 DNS 协议中的 TTL。
iOS 设备
iOS 设备上每 24 小时刷新一次 DNS 缓存。
6.3 DNS 查询类型
递归查询(Recursive Query)
客户端向本地 DNS 服务器发送查询请求,本地 DNS 服务器负责完成整个查询过程,并返回最终结果。
迭代查询(Iterative Query)
DNS 服务器之间相互查询,每个服务器返回它知道的最佳答案,客户端需要继续查询。
七、面试要点总结
核心知识点
- DNS 作用:域名映射 IP,方便用户访问
- 域名层级:主机名.次级域名.顶级域名.根域名
- 查询顺序:浏览器缓存 → 系统缓存 → 路由器缓存 → ISP DNS → 根域名服务器
- DNS 记录类型:A、NS、MX、CNAME、PTR 等
- DNS 优化:减少 DNS 查找、DNS 预解析
常见面试题
Q1: DNS 是什么?为什么需要 DNS?
答:DNS 是域名系统,用于将域名解析为 IP 地址。因为 IP 地址难以记忆,通过域名可以更方便地访问互联网。
Q2: DNS 的查询顺序是什么?
答:
- 浏览器缓存
- 系统 hosts 文件
- 本地 DNS 解析器缓存
- 本地 DNS 服务器
- 递归查询(根域名服务器 → 顶级域名服务器 → 主域名服务器)
Q3: 如何优化 DNS 查询?
答:
- 减少域名数量
- 使用 DNS 预解析(
dns-prefetch) - 合理设置 TTL
- 使用 CDN
实战建议
- ✅ 理解 DNS 的工作原理和查询流程
- ✅ 掌握 DNS 记录类型和查询工具
- ✅ 了解 DNS 优化方法
- ✅ 注意 DNS 安全问题
每天更新3-4节,持续更新中... 目标:50天学完,上岸银行总行!