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 握手 + 传输时间 + 服务器处理
目录