一次完整的 HTTP 请求过程 涉及 应用层 → 传输层 → 网络层 → 数据链路层 → 物理层 的封装与解析,并最终返回响应。下面以 访问 https://www.example.com 为例,详细拆解整个过程:
🌐 1. DNS 解析(获取目标IP)
目标:将域名 www.example.com 解析为 IP 地址(如 93.184.216.34)。
过程:
- 浏览器缓存 → 检查是否缓存过该域名。
- 系统 Hosts 文件 → 检查是否有手动映射。
- 本地 DNS 服务器(如
8.8.8.8)→ 递归查询:
• 先查 根域名服务器(.)→ 指向.com服务器。
• 再查 .com 服务器 → 指向example.com的权威 DNS 服务器。
• 最终返回www.example.com的 IP 地址。
📡 2. 建立 TCP 连接(三次握手)
目标:与服务器 93.184.216.34:443(HTTPS 默认端口)建立可靠连接。
过程:
- 客户端 → 服务器:发送
SYN=1, seq=x(同步请求)。 - 服务器 → 客户端:回复
SYN=1, ACK=1, seq=y, ack=x+1(确认并同步)。 - 客户端 → 服务器:发送
ACK=1, seq=x+1, ack=y+1(最终确认)。
✅ TCP 连接建立成功,进入数据传输阶段。
🔐 3. TLS/SSL 握手(HTTPS 加密)
目标:协商加密方式,建立安全通道(仅 HTTPS 需要)。
过程:
- Client Hello:客户端发送支持的加密算法(如 AES、RSA)和随机数
Client Random。 - Server Hello:服务器选择加密算法,并返回
Server Random+ 证书(含公钥)。 - 客户端验证证书(CA 机构签发,防止中间人攻击)。
- 生成会话密钥:客户端用公钥加密
Pre-Master Secret发送给服务器,双方用Client Random + Server Random + Pre-Master生成 对称加密密钥(如 AES-256)。
✅ 加密通道建立,后续数据均加密传输。
📨 4. 发送 HTTP 请求
目标:客户端向服务器发送请求(如 GET / HTTP/1.1)。
请求报文示例:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
封装过程:
- 应用层(HTTP) → 生成原始请求数据。
- 传输层(TCP) → 添加源端口(如
54321)、目标端口(443),封装成 TCP 报文段。 - 网络层(IP) → 添加源 IP(如
192.168.1.100)、目标 IP(93.184.216.34),封装成 IP 包。 - 数据链路层(以太网) → 添加源 MAC(如
00:1A:2B:3C:4D:5E)、目标 MAC(通过 ARP 获取),封装成 以太网帧。 - 物理层 → 转为比特流(电信号/光信号)发送。
📡 5. 服务器处理请求
目标:服务器接收请求并返回响应。
过程:
- 物理层 → 接收比特流,还原为以太网帧。
- 数据链路层 → 检查 MAC 地址,去掉帧头,得到 IP 包。
- 网络层 → 检查 IP 地址,去掉 IP 头,得到 TCP 报文段。
- 传输层 → 检查端口(
443),交给 HTTPS 服务处理。 - 应用层 → Web 服务器(如 Nginx)解析 HTTP 请求,返回
HTTP/1.1 200 OK+ HTML 内容。
📩 6. 返回 HTTP 响应
响应报文示例:
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html
Content-Length: 1234
<!DOCTYPE html>
<html>...</html>
封装过程(与请求对称):
- 服务器 → 客户端:数据经过 TLS 加密 → TCP → IP → MAC → 比特流。
- 客户端接收:物理层 → 数据链路层 → 网络层 → 传输层 → 应用层(浏览器渲染 HTML)。
🔄 7. 关闭连接(四次挥手)
目标:释放 TCP 连接(HTTP/1.1 默认 Connection: keep-alive,可能复用连接)。
过程:
- 客户端 → 服务器:发送
FIN=1, seq=u(请求关闭)。 - 服务器 → 客户端:回复
ACK=1, ack=u+1(确认)。 - 服务器 → 客户端:发送
FIN=1, seq=v(服务器也准备关闭)。 - 客户端 → 服务器:回复
ACK=1, ack=v+1(最终确认)。
✅ TCP 连接关闭。
📊 完整流程图
1. DNS 解析 → 2. TCP 三次握手 → 3. TLS 握手(HTTPS)→ 4. 发送 HTTP 请求 →
5. 服务器处理 → 6. 返回 HTTP 响应 → 7. TCP 四次挥手(可选)
🌟 关键点总结
- DNS 解析:域名 → IP。
- TCP 三次握手:建立可靠连接。
- TLS 握手(HTTPS):协商加密密钥。
- HTTP 请求/响应:数据封装与解析。
- TCP 四次挥手:释放连接(HTTP/1.1 可能复用)。
这样,一次完整的 HTTP(S) 请求就完成了! 🚀

被折叠的 条评论
为什么被折叠?



