Appearance
DNS:域名解析与访问入口定位
如果没有 DNS,你访问网站时就得记住一串串 IP 地址。
这显然不适合真实互联网。
DNS 是 Domain Name System,中文常叫“域名系统”。它主要解决的是:
把更适合人类记忆和使用的域名,解析成网络真正可路由的地址信息。
1. DNS 到底在解决什么问题
应用访问服务时,经常更希望写成:
text
api.example.com而不是:
text
203.0.113.10所以 DNS 的核心职责是:
- 域名到 IP 的解析
- 让访问入口更稳定
- 让服务迁移、扩容、负载分配更灵活
2. 为什么不能直接只靠 IP
因为真实工程里经常会出现:
- IP 变化
- 多机房部署
- 多实例负载均衡
- 同一个业务拆成多个子域名
这时域名的价值就不只是“好记”,而是:
把访问入口和底层地址解耦。
3. DNS 查询大致是怎么发生的
最粗略的过程可以按这条线理解:
- 浏览器或系统先查本地缓存
- 本地 DNS 服务器继续帮你查
- 如果没有答案,再逐级去权威系统寻找结果
- 最终拿到目标域名对应的记录
这里最重要的不是把每一级服务器名字全背下来,而是先知道:
DNS往往不是一步到位- 它大量依赖缓存
- 它本质上是“把名字换成地址”的查找系统
4. 一次 DNS 请求从发起到返回,通常会经历什么
如果把 DNS 只理解成“查一下域名”,还是不够具体。
更贴近真实过程的主线通常是:
- 浏览器看自己有没有可用缓存
- 操作系统再看本机 DNS 缓存
- 如果还没有,本机会把查询请求发给配置好的本地 DNS 服务器
- 本地 DNS 如果自己也没有缓存,就继续帮你往外查
- 最终拿到目标记录后,把结果返回给客户端
- 客户端再拿这个结果去建立后续网络连接
也就是说,DNS 在访问流程里通常是“前置定位阶段”,而不是“正式业务请求阶段”。
5. 一张更适合理解 DNS 的流程图
mermaid
sequenceDiagram
participant Browser as 浏览器
participant OS as 操作系统
participant LocalDNS as 本地 DNS
participant Upstream as 上游 DNS / 权威链路
Browser->>OS: 查询 example.com
OS->>OS: 检查本机缓存
alt 本机缓存命中
OS-->>Browser: 返回 IP
else 本机缓存未命中
OS->>LocalDNS: 发起 DNS 查询
LocalDNS->>LocalDNS: 检查本地 DNS 缓存
alt 本地 DNS 缓存命中
LocalDNS-->>OS: 返回 IP
else 本地 DNS 缓存未命中
LocalDNS->>Upstream: 继续递归 / 迭代查询
Upstream-->>LocalDNS: 返回记录结果
LocalDNS-->>OS: 返回 IP
end
OS-->>Browser: 返回 IP
end这张图最重要的意义是让你看到:
- 浏览器未必直接去查远端 DNS
- 缓存命中会极大影响查询路径
- DNS 结果返回后,真正的业务连接才会开始
6. 为什么说 DNS 查询结果会直接影响后续请求响应
因为后面的 TCP 连接、TLS 握手、HTTP 请求,都得先知道目标地址。
也就是说:
DNS结果如果慢,后面所有步骤都得等DNS如果解析错,后面可能直接连到错误机器DNS如果缓存过期,可能会拿到新的目标地址
所以一次“访问网站很慢”,未必一定是 HTTP 慢,也可能是 DNS 阶段先慢了。
7. 常见记录类型怎么理解
4.1 A 记录
把域名映射到 IPv4 地址。
4.2 AAAA 记录
把域名映射到 IPv6 地址。
4.3 CNAME
把一个域名别名指向另一个域名。
4.4 MX
邮件相关记录。
学习时最重要的不是一次背完,而是知道不同记录类型表达不同解析语义。
8. DNS 的能力边界
5.1 DNS 负责什么
- 名称解析
- 记录查询
- 访问入口解耦
5.2 DNS 不负责什么
- 不负责实际建立业务连接
- 不负责可靠传输业务数据
- 不直接等于负载均衡系统本身
它更像“先告诉你该去找谁”,而不是“替你完成后面的全部通信”。
9. 为什么 DNS 也常和 UDP 放在一起讲
因为很多传统 DNS 查询默认基于 UDP。
原因很现实:
- 查询报文通常较小
- 查询要求快
- 不希望每次都做复杂连接建立
但这不表示 DNS 只能跑在 UDP 上。
所以实际写项目时,更多是这样:
DNS是应用层协议- 它常常跑在
UDP之上
10. 常见命令示例
bash
nslookup example.com
dig example.com
dig api.example.com A
dig example.com AAAA这些命令适合帮助理解:
- 域名最终解析到了什么
- 不同记录类型的结果长什么样
11. 常见误区
11.1 以为域名就是 IP 的别名
不够准确。
域名不仅仅是“另一个名字”,它还承担访问入口抽象和解析体系的角色。
11.2 以为 DNS 查一次就结束
不是。
缓存、TTL 和多级查询都会影响结果。
11.3 以为 DNS 就是网络层协议
不是。
DNS 属于应用层,只是它的结果最终会服务于后续网络访问。
12. 一句话总结
DNS 这条主线,本质上是在解决 如何把人类更容易使用的域名,稳定而高效地解析成后续网络连接真正需要的地址信息。