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 构建的个人技术笔记。