Skip to content

DNS:域名解析与访问入口定位

如果没有 DNS,你访问网站时就得记住一串串 IP 地址。

这显然不适合真实互联网。

DNS 是 Domain Name System,中文常叫“域名系统”。它主要解决的是:

把更适合人类记忆和使用的域名,解析成网络真正可路由的地址信息。


1. DNS 到底在解决什么问题

应用访问服务时,经常更希望写成:

text
api.example.com

而不是:

text
203.0.113.10

所以 DNS 的核心职责是:

  1. 域名到 IP 的解析
  2. 让访问入口更稳定
  3. 让服务迁移、扩容、负载分配更灵活

2. 为什么不能直接只靠 IP

因为真实工程里经常会出现:

  1. IP 变化
  2. 多机房部署
  3. 多实例负载均衡
  4. 同一个业务拆成多个子域名

这时域名的价值就不只是“好记”,而是:

把访问入口和底层地址解耦。


3. DNS 查询大致是怎么发生的

最粗略的过程可以按这条线理解:

  1. 浏览器或系统先查本地缓存
  2. 本地 DNS 服务器继续帮你查
  3. 如果没有答案,再逐级去权威系统寻找结果
  4. 最终拿到目标域名对应的记录

这里最重要的不是把每一级服务器名字全背下来,而是先知道:

  1. DNS 往往不是一步到位
  2. 它大量依赖缓存
  3. 它本质上是“把名字换成地址”的查找系统

4. 一次 DNS 请求从发起到返回,通常会经历什么

如果把 DNS 只理解成“查一下域名”,还是不够具体。

更贴近真实过程的主线通常是:

  1. 浏览器看自己有没有可用缓存
  2. 操作系统再看本机 DNS 缓存
  3. 如果还没有,本机会把查询请求发给配置好的本地 DNS 服务器
  4. 本地 DNS 如果自己也没有缓存,就继续帮你往外查
  5. 最终拿到目标记录后,把结果返回给客户端
  6. 客户端再拿这个结果去建立后续网络连接

也就是说,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

这张图最重要的意义是让你看到:

  1. 浏览器未必直接去查远端 DNS
  2. 缓存命中会极大影响查询路径
  3. DNS 结果返回后,真正的业务连接才会开始

6. 为什么说 DNS 查询结果会直接影响后续请求响应

因为后面的 TCP 连接、TLS 握手、HTTP 请求,都得先知道目标地址。

也就是说:

  1. DNS 结果如果慢,后面所有步骤都得等
  2. DNS 如果解析错,后面可能直接连到错误机器
  3. DNS 如果缓存过期,可能会拿到新的目标地址

所以一次“访问网站很慢”,未必一定是 HTTP 慢,也可能是 DNS 阶段先慢了。


7. 常见记录类型怎么理解

4.1 A 记录

把域名映射到 IPv4 地址。

4.2 AAAA 记录

把域名映射到 IPv6 地址。

4.3 CNAME

把一个域名别名指向另一个域名。

4.4 MX

邮件相关记录。

学习时最重要的不是一次背完,而是知道不同记录类型表达不同解析语义。


8. DNS 的能力边界

5.1 DNS 负责什么

  1. 名称解析
  2. 记录查询
  3. 访问入口解耦

5.2 DNS 不负责什么

  1. 不负责实际建立业务连接
  2. 不负责可靠传输业务数据
  3. 不直接等于负载均衡系统本身

它更像“先告诉你该去找谁”,而不是“替你完成后面的全部通信”。


9. 为什么 DNS 也常和 UDP 放在一起讲

因为很多传统 DNS 查询默认基于 UDP

原因很现实:

  1. 查询报文通常较小
  2. 查询要求快
  3. 不希望每次都做复杂连接建立

但这不表示 DNS 只能跑在 UDP 上。

所以实际写项目时,更多是这样:

  1. DNS 是应用层协议
  2. 它常常跑在 UDP 之上

10. 常见命令示例

bash
nslookup example.com
dig example.com
dig api.example.com A
dig example.com AAAA

这些命令适合帮助理解:

  1. 域名最终解析到了什么
  2. 不同记录类型的结果长什么样

11. 常见误区

11.1 以为域名就是 IP 的别名

不够准确。

域名不仅仅是“另一个名字”,它还承担访问入口抽象和解析体系的角色。

11.2 以为 DNS 查一次就结束

不是。

缓存、TTL 和多级查询都会影响结果。

11.3 以为 DNS 就是网络层协议

不是。

DNS 属于应用层,只是它的结果最终会服务于后续网络访问。


12. 一句话总结

DNS 这条主线,本质上是在解决 如何把人类更容易使用的域名,稳定而高效地解析成后续网络连接真正需要的地址信息。

基于 VitePress 构建的个人技术笔记。