DNS 域名解析与网络请求路由

从输入域名到请求到达服务器的完整过程

问题

在深圳的浏览器输入 www.baidu.com,请求是如何发送到北京服务器的?

解答

整个过程分为两个阶段:DNS 解析(域名转 IP)和 网络路由(数据包传输)。

1. DNS 解析

浏览器需要先把域名转换成 IP 地址:

www.baidu.com → 180.101.50.242

解析顺序:

1. 浏览器缓存 → 有则直接用
2. 操作系统缓存 → hosts 文件 + 系统 DNS 缓存
3. 本地 DNS 服务器 → 通常是运营商提供(如深圳电信 DNS)
4. 递归查询:
   根域名服务器 → .com 顶级域服务器 → baidu.com 权威服务器
// 可以用 Node.js 查看 DNS 解析结果
const dns = require('dns');

dns.resolve4('www.baidu.com', (err, addresses) => {
  console.log(addresses); // ['180.101.50.242', '180.101.50.188']
});

2. 建立 TCP 连接

拿到 IP 后,浏览器与服务器进行三次握手:

深圳客户端                    北京服务器
    |  ---- SYN ---->            |
    |  <--- SYN+ACK ---          |
    |  ---- ACK ---->            |
    |      连接建立               |

3. 网络路由

数据包从深圳到北京,经过多个路由器转发:

深圳客户端

家庭路由器(192.168.1.1)

小区网关

深圳电信骨干网

省际骨干网(广州 → 武汉 → 北京)

北京联通/电信机房

百度服务器(180.101.50.242)

每个路由器根据路由表决定下一跳地址:

# 查看路由路径
traceroute www.baidu.com

# 输出示例:
# 1  192.168.1.1      1ms    # 家庭路由器
# 2  100.64.0.1       5ms    # 运营商网关
# 3  202.97.94.1      10ms   # 骨干网节点
# ...
# 12 180.101.50.242   25ms   # 目标服务器

4. CDN 加速(实际情况)

实际上,百度使用了 CDN,深圳用户的请求通常不会真的到北京:

DNS 智能解析:
  深圳用户 → 解析到深圳/广州的 CDN 节点
  北京用户 → 解析到北京的 CDN 节点
// 不同地区解析结果可能不同
// 深圳:180.101.50.242(华南节点)
// 北京:220.181.38.150(华北节点)

完整流程图

输入 URL

DNS 解析(域名 → IP)

建立 TCP 连接(三次握手)

发送 HTTP 请求

数据包经路由器逐跳转发

服务器处理并返回响应

浏览器渲染页面

关键点

  • DNS 解析:浏览器缓存 → 系统缓存 → 本地 DNS → 递归查询根/顶级/权威服务器
  • 路由转发:数据包经过多个路由器,每个路由器查路由表决定下一跳
  • CDN 优化:大型网站使用 CDN,DNS 会返回离用户最近的服务器 IP
  • BGP 协议:骨干网路由器通过 BGP 协议交换路由信息,找到最优路径
  • 延迟组成:总延迟 = DNS 解析 + TCP 握手 + 传输时间 + 服务器处理