前言
DNS 负责把人类好记的域名,解析成网络能使用的 IP 地址。
比如访问:
1 | https://example.com |
浏览器不能直接拿 example.com 建 TCP 连接。
TCP/IP 需要目标 IP:
1 | 93.184.216.34 |
所以要先做 DNS 解析:
1 | example.com -> 93.184.216.34 |
一句话:
DNS 解决“去哪儿”,HTTP 解决“到了以后说什么”。
1. DNS 是应用层协议
DNS 是应用层协议。
它定义的是:
1 | 我要查哪个域名? |
比如:
1 | 查询:example.com 的 A 记录 |
DNS 查询本身也要走网络:
1 | DNS -> UDP/TCP -> IP -> MAC -> 物理层 |
DNS 常用 UDP 53,但也可以用 TCP 53。
2. DNS 常见记录类型
DNS 查的不是只有 IP。
常见记录类型有:
1 | A:域名 -> IPv4 地址 |
比如:
1 | www.example.com CNAME example.com |
意思可能是:
1 | www.example.com 先指向 example.com |
如果遇到 CNAME,解析器还需要继续解析 CNAME 指向的目标。
3. 浏览器访问网站时 DNS 查询顺序
浏览器不会一上来就问根域名服务器。
它会先查缓存。
大概顺序是:
1 | 浏览器 DNS 缓存 |
前几步如果命中,就不会继续往下查。
4. hosts 文件是什么
hosts 文件是本机上的静态域名映射表。
比如:
1 | 127.0.0.1 localhost |
如果 hosts 里有对应记录,系统可以直接使用。
它常用于:
1 | 本地开发 |
5. 本地 DNS 服务器是什么
本地 DNS 服务器也叫递归解析器。
它通常来自:
1 | 路由器 |
你的电脑通常不是自己去问根服务器,而是把问题交给本地 DNS:
1 | example.com 的 IP 是多少? |
本地 DNS 如果有缓存,直接返回。
如果没有,它会继续帮你查。
6. 根、顶级、权威 DNS 怎么分工
DNS 是树状结构。
比如:
1 | www.example.com. |
最后那个点代表根。
可以理解成:
1 | . |
如果本地 DNS 没有缓存,它会从根开始,逐层找到谁有权回答。
根域名服务器
本地 DNS 问根服务器:
1 | 请问 www.example.com 的 A 记录是什么? |
根服务器通常不会直接告诉你 IP。
它会说:
1 | 我不知道 www.example.com 的 IP, |
顶级域名服务器
本地 DNS 再问 .com 顶级域名服务器:
1 | 请问 www.example.com 的 A 记录是什么? |
.com 服务器通常也不会直接告诉你 IP。
它会说:
1 | 我不知道具体 IP, |
权威 DNS 服务器
本地 DNS 再问 example.com 的权威 DNS:
1 | 请问 www.example.com 的 A 记录是什么? |
权威 DNS 才可能回答:
1 | www.example.com 是 93.184.216.34 |
或者:
1 | www.example.com 是 CNAME example.com |
如果是 CNAME,还要继续解析:
1 | example.com 的 A 记录是什么? |
7. 不是先查短域名,而是找谁有权回答
这里很容易误解成:
1 | 先查 www.example.com |
更准确的理解是:
DNS 不是从完整域名往短域名“查 IP”,而是从根往下找“谁有权回答这个完整域名”。
本地 DNS 的目标一直是:
1 | 我要查 www.example.com 的记录。 |
但它一开始不知道谁有权回答。
所以它逐级问:
1 | 根服务器:.com 应该问谁? |
所以 example.com 会出现,但通常是作为:
1 | example.com 这个区域由哪些权威 DNS 服务器负责。 |
不是固定流程里“先查 www.example.com,再查 example.com,再查 .com”。
一句话:
目标一直是完整域名,层级查询是在寻找能回答它的权威服务器。
8. 递归查询和迭代查询
用户电脑通常对本地 DNS 做递归查询:
1 | 你帮我查到底,最后给我结果。 |
本地 DNS 对根、顶级、权威服务器通常做迭代查询:
1 | 你不知道没关系,告诉我下一步该问谁。 |
所以:
1 | 客户端 -> 本地 DNS:递归查询 |
这也是为什么本地 DNS 经常叫递归解析器。
9. DNS 缓存和 TTL
DNS 响应会带 TTL。
比如:
1 | TTL = 300 |
意思是:
1 | 这个结果可以缓存 300 秒。 |
缓存可能存在于:
1 | 浏览器 |
TTL 的好处:
1 | 减少查询次数 |
代价是:
1 | 域名解析变更不会立刻全网生效 |
比如你改了域名 IP,但旧缓存还没过期,有些用户仍然访问旧 IP。
10. DNS 为什么常用 UDP
DNS 查询通常很小:
1 | 问:example.com 的 IP 是什么? |
UDP 不需要三次握手:
1 | 发查询 |
延迟低,开销小。
但 DNS 也可能用 TCP:
1 | 响应太大 |
所以:
1 | DNS 常用 UDP,但不是只能用 UDP。 |
11. DNS 和 HTTP 的关系
DNS 和 HTTP 都是应用层协议,但负责不同事情。
1 | DNS:去哪儿?域名对应哪个 IP? |
访问网站通常是:
1 | DNS 解析域名 |
DNS 查询和 HTTP 请求不是同一条连接。
DNS 通信对象是:
1 | 你的电脑 <-> DNS 服务器 |
HTTP 通信对象是:
1 | 你的浏览器 <-> Web 服务器 |
12. DNS 常见问题
DNS 解析慢
可能原因:
1 | 缓存没命中 |
DNS 解析错
可能原因:
1 | hosts 配置 |
改了 DNS 记录但不生效
常见原因:
1 | TTL 没过 |
ping 域名和访问网页结果不同
因为:
1 | ping 用 ICMP |
而且不同地域、不同 DNS 服务器可能解析到不同 CDN 节点。
13. 一句话总结
DNS 可以这样记:
1 | 浏览器先查缓存 |
更准确地说:
1 | 根服务器告诉你 TLD 该问谁。 |
最短记法:
DNS 负责把域名变成 IP;本地 DNS 帮你递归查,根/TLD/权威一步步告诉它该问谁;TTL 决定结果能缓存多久。