文章目录
-
- 引言
- 一、完整流程概览
-
- [8 个步骤的完整流程](#8 个步骤的完整流程)
- 二、详细步骤解析
-
- [步骤 1:获取 IP 地址(DHCP 协议)](#步骤 1:获取 IP 地址(DHCP 协议))
- [步骤 2:找到网关(ARP 协议)](#步骤 2:找到网关(ARP 协议))
- [步骤 3:域名解析(DNS 协议)](#步骤 3:域名解析(DNS 协议))
- [步骤 4:路由导航(IP 协议)](#步骤 4:路由导航(IP 协议))
- [步骤 5:建立连接(TCP 三次握手)](#步骤 5:建立连接(TCP 三次握手))
- [步骤 6:加密协商(TLS 握手)](#步骤 6:加密协商(TLS 握手))
- [步骤 7:发送请求(HTTP 协议)](#步骤 7:发送请求(HTTP 协议))
- [步骤 8:关闭连接(TCP 四次挥手)](#步骤 8:关闭连接(TCP 四次挥手))
- 三、时间线分析
- 四、协议栈层次关系
- [五、8 个协议速查表](#五、8 个协议速查表)
- 六、总结
从输入网址到网页显示,8 个协议的协同工作
引言
当你在浏览器输入 www.baidu.com 并按下回车时,发生了什么?
这个过程涉及 8 个核心网络协议 ,经过 8 个关键步骤 ,总耗时约 200ms - 2s。
本文将以访问百度为例,带你完整体验一次 Web 请求的历程!
一、完整流程概览
8 个步骤的完整流程
┌─────────────────────────────────────────────────────────┐
│ 步骤 1:网络初始化(DHCP) │
│ - 获取 IP 地址、子网掩码、网关、DNS │
│ - 耗时:约 100ms │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 2:ARP 解析 │
│ - 获取网关的 MAC 地址 │
│ - 耗时:约 1ms │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 3:DNS 解析 │
│ - 将 www.baidu.com 解析为 14.215.177.38 │
│ - 耗时:约 10-100ms │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 4:IP 路由 │
│ - 确定数据包路径,经过多个路由器 │
│ - 耗时:取决于距离 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 5:TCP 三次握手 │
│ - 建立可靠连接 │
│ - 耗时:约 1-3 个 RTT(往返时间) │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 6:TLS 握手(HTTPS) │
│ - 协商加密套件,交换密钥 │
│ - 耗时:约 1-2 个 RTT │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 7:HTTP 请求/响应 │
│ - 发送 GET 请求,接收 HTML 响应 │
│ - 耗时:取决于服务器响应速度 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 步骤 8:TCP 四次挥手 │
│ - 关闭连接(或保持连接复用) │
│ - 耗时:约 1-2 个 RTT │
└─────────────────────────────────────────────────────────┘
总耗时:约 200ms - 2s(取决于网络状况)
二、详细步骤解析
步骤 1:获取 IP 地址(DHCP 协议)
作用:你的电脑需要先有自己的 IP 地址
生活中的比喻:
就像打电话前,自己得先有个电话号码。
工作过程(四步握手):
客户端(你的电脑) DHCP 服务器(路由器)
| |
|--- DHCP Discover ----------------->| 广播:有 DHCP 服务器吗?
| |
|<-- DHCP Offer --------------------| 回复:有!我给你留了个 IP
| |
|--- DHCP Request ------------------>| 确认:好的,我就要这个 IP
| |
|<-- DHCP ACK ----------------------| 完成:好的,这个 IP 归你了
关键知识点:
- 广播通信:Discover 和 Request 使用广播(255.255.255.255)
- 租约期限:IP 地址不是永久的,通常有 24 小时租期
- 续租机制:租期过半时,会自动尝试续租
实战命令:
bash
# 查看本机 IP 地址
ip addr show
# 重新获取 IP
sudo dhclient -r
sudo dhclient
步骤 2:找到网关(ARP 协议)
作用:将 IP 地址转换成 MAC 地址
生活中的比喻:
你知道朋友的电话号码(IP 地址),但快递员需要实际地址(MAC 地址)才能送达。
工作过程:
客户端(你的电脑) 网关(路由器)
| |
|--- ARP Request ------------------->| 广播:谁是 192.168.1.1?
| |
|<-- ARP Reply ----------------------| 回复:我是!MAC 是 xx:xx:xx:xx:xx:xx
关键知识点:
- ARP 缓存:为了减少广播,操作系统会缓存 ARP 响应
- 缓存超时:通常保留 2-10 分钟
实战命令:
bash
# 查看 ARP 缓存
ip neigh show
# 清除 ARP 缓存
sudo ip neigh flush all
步骤 3:域名解析(DNS 协议)
作用:将域名转换成 IP 地址
生活中的比喻:
就像查手机通讯录,把"张三"转换成电话号码。
DNS 层次结构:
. (根域名)
/ \
/ \
.com .cn (顶级域)
| |
baidu.com tsinghua.cn (二级域)
| |
www www (子域/主机)
查询过程:
1. 检查浏览器缓存
↓
2. 检查操作系统缓存(/etc/hosts)
↓
3. 查询本地 DNS 服务器(递归查询)
↓(如果本地 DNS 没有缓存)
4. 查询根 DNS 服务器
↓
5. 根 DNS 返回 .com DNS 地址
↓
6. 查询 .com DNS 服务器
↓
7. .com DNS 返回 baidu.com 的权威 DNS 地址
↓
8. 查询 baidu.com 的权威 DNS 服务器
↓
9. 返回 www.baidu.com 的 IP 地址
↓
10. 本地 DNS 缓存结果并返回给你
常见 DNS 记录:
| 记录类型 | 作用 | 示例 |
|---|---|---|
| A | 域名 → IPv4 地址 | www.baidu.com → 14.215.177.38 |
| CNAME | 域名 → 另一个域名 | www.baidu.com → www.a.shifen.com |
| MX | 邮件服务器 | baidu.com → mx.baidu.com |
实战命令:
bash
# 查看 DNS 配置
cat /etc/resolv.conf
# DNS 查询
nslookup www.baidu.com
dig www.baidu.com
# 清除 DNS 缓存
sudo systemd-resolve --flush-caches
步骤 4:路由导航(IP 协议)
作用:决定数据包如何到达目标服务器
生活中的比喻:
就像导航系统规划从北京到上海的路线。
路由表查看:
bash
ip route show
输出示例:
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
追踪路径:
bash
traceroute www.baidu.com
输出示例:
1 192.168.1.1 (192.168.1.1) 1.234 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms
3 123.45.67.89 (123.45.67.89) 15.234 ms
4 14.215.177.38 (14.215.177.38) 25.123 ms
关键知识点:
- NAT 转换:内网 IP ↔ 公网 IP 的转换
- 私有 IP 范围:192.168.x.x、10.x.x.x、172.16.x.x - 172.31.x.x
步骤 5:建立连接(TCP 三次握手)
作用:建立可靠的通信连接
生活中的比喻:
就像打电话前的确认过程。
三次握手过程:
客户端(你的电脑) 服务器(百度)
| |
|--- 1. SYN ----------------------->| 我想和你建立连接
| (SEQ=100) |
| |
|<-- 2. SYN-ACK --------------------| 好的,我同意建立连接
| (SEQ=200, ACK=101) |
| |
|--- 3. ACK ----------------------->| 好的,连接建立成功
| (ACK=201) |
| |
|======= 连接已建立,开始传输数据 =======|
为什么需要三次握手?
- 确认双方的发送和接收能力都正常
- 两次不够,四次太多,三次刚刚好
实战命令:
bash
# 查看 TCP 连接
ss -tn
# 测试端口连通性
nc -vz www.baidu.com 80
步骤 6:加密协商(TLS 握手)
作用:协商加密方式,保证通信安全
为什么需要 HTTPS?
HTTP 的三大安全问题:
- 窃听风险:路由器可以看到你的请求内容
- 篡改风险:中间人可以修改网页内容
- 冒充风险:可以伪造网站
HTTPS 握手过程:
客户端(浏览器) 服务器(网站)
| |
|--- 1. Client Hello -------------->| 支持的加密套件
| |
|<-- 2. Server Hello ---------------| 选择的加密套件
| 服务器证书(包含公钥) |
| |
|--- 3. 验证证书 ------------------>| 验证证书有效性
| |
|--- 4. 生成随机数 ---------------->| 用公钥加密
| (预主密钥) |
| |
|<-- 5. 双方生成会话密钥 ------------| 使用相同的算法
| |
|======= 握手完成,开始加密通信 =======|
加密技术:
- 对称加密:加密解密速度快(如 AES)
- 非对称加密:更安全但慢(如 RSA)
- 混合加密:HTTPS 使用两者结合
实战命令:
bash
# 查看证书信息
openssl s_client -connect www.baidu.com:443
# 查看 HTTPS 详情
curl -v https://www.baidu.com
步骤 7:发送请求(HTTP 协议)
作用:请求网页内容
生活中的比喻:
就像在餐厅点菜。
HTTP 请求格式:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0
Accept: text/html
请求行三要素:
- 方法:GET(获取)、POST(提交)、PUT(更新)、DELETE(删除)
- 路径:/(首页)
- 协议版本:HTTP/1.1
HTTP 响应格式:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 2443
<!DOCTYPE html>
<html>...</html>
常见状态码:
| 状态码 | 说明 | 场景 |
|---|---|---|
| 200 | 成功 | 请求成功 |
| 301 | 永久重定向 | 网页已永久移动 |
| 302 | 临时重定向 | 网页临时移动 |
| 404 | 未找到 | 网页不存在 |
| 500 | 服务器错误 | 服务器内部错误 |
实战命令:
bash
# 获取网页
curl www.baidu.com
# 查看响应头
curl -I www.baidu.com
# 显示详细信息
curl -v www.baidu.com
# 手动发送 HTTP 请求
telnet www.baidu.com 80
# 然后输入:
# GET / HTTP/1.1
# Host: www.baidu.com
# (空行)
步骤 8:关闭连接(TCP 四次挥手)
作用:完成通信后关闭连接
生活中的比喻:
就像打完电话说再见。
四次挥手过程:
客户端(你的电脑) 服务器(百度)
| |
|--- 1. FIN ----------------------->| 我没有数据要发送了
| |
|<-- 2. ACK ------------------------| 好的,我知道了
| |
| (服务器可能还有数据要发送) |
| |
|<-- 3. FIN ------------------------| 我也没有数据要发送了
| |
|--- 4. ACK ----------------------->| 好的,再见
| |
|======= 连接已关闭 =======|
为什么需要四次挥手?
- TCP 是全双工通信,两个方向的连接需要分别关闭
三、时间线分析
典型的时间分配
假设总耗时为 500ms,各阶段时间分配如下:
0ms 15ms 45ms 89ms 120ms 500ms
|--------|--------|----------|-----------|---------------|
DNS TCP TLS HTTP 数据传输
解析 握手 握手 请求 和渲染
15ms 30ms 44ms 31ms 380ms
关键观察:
- DNS 解析:15ms(本地 DNS 缓存命中)
- TCP 握手:30ms(1 个 RTT)
- TLS 握手:44ms(1-2 个 RTT)
- HTTP 请求:31ms(服务器处理时间)
- 数据传输:380ms(下载 HTML、CSS、JS、图片等)
优化建议
1. 减少 DNS 解析时间
bash
# 使用更快的 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
2. 减少 TCP 连接时间
bash
# 使用持久连接
curl --keepalive-time 60 https://www.baidu.com
3. 减少 TLS 握手时间
bash
# 使用 TLS 会话复用
curl --sessionid https://www.baidu.com
4. 使用 HTTP/2
bash
# 检查是否支持 HTTP/2
curl --http2 -I https://www.baidu.com
四、协议栈层次关系
┌──────────────────────────────────────┐
│ 应用层:HTTP/HTTPS │
├──────────────────────────────────────┤
│ 传输层:TCP │
├──────────────────────────────────────┤
│ 网络层:IP + 路由 │
├──────────────────────────────────────┤
│ 数据链路层:ARP │
├──────────────────────────────────────┤
│ 物理层:网线/WiFi │
└──────────────────────────────────────┘
辅助协议:
- DHCP:获取网络配置
- DNS:域名解析
五、8 个协议速查表
| 步骤 | 协议 | 作用 | 关键命令 | 耗时 |
|---|---|---|---|---|
| 1 | DHCP | 获取 IP 地址 | dhclient |
100ms |
| 2 | ARP | 解析 MAC 地址 | ip neigh |
1ms |
| 3 | DNS | 域名转 IP | nslookup |
10-100ms |
| 4 | IP | 路由导航 | traceroute |
取决于距离 |
| 5 | TCP | 建立连接 | ss -tn |
1-3 RTT |
| 6 | TLS | 加密通信 | openssl s_client |
1-2 RTT |
| 7 | HTTP | 请求网页 | curl |
取决于服务器 |
| 8 | TCP | 关闭连接 | ss -tn |
1-2 RTT |
六、总结
核心要点
- 从下到上:物理连接 → 网络层 → 传输层 → 应用层
- 缓存优先:DNS 有多级缓存加速
- 可靠传输:TCP 保证数据不丢失、不重复、按序到达
- 加密安全:HTTPS 防止窃听、篡改和冒充
完整流程回顾
输入网址 → DHCP → ARP → DNS → IP 路由 → TCP 握手 → TLS 握手 → HTTP 请求 → 获取网页 → TCP 挥手