非常好 👍 阿杰,这里是一份系统、通俗又技术细节兼具的讲解——
“一次完整的 HTTP 请求过程”
让你清楚了解浏览器从输入网址到页面显示背后的每一步。
🌐 一、从输入网址开始
当你在浏览器地址栏输入:
https://www.example.com/index.html
然后按下回车,整个 HTTP 请求过程 正式开始。
🧭 二、DNS 解析(域名到 IP)
1️⃣ 浏览器首先要找到 www.example.com
的 IP 地址。
它会按以下顺序查找缓存:
- 浏览器缓存(最近访问过的域名)
- 操作系统缓存(如
/etc/hosts
文件) - 本地域名服务器(DNS 服务器)缓存
- 若都没有命中,系统会发起递归查询:
- 询问根域名服务器
.
- 根告诉它
.com
的顶级域服务器地址 - 再向
.com
顶级域服务器请求,得到example.com
的权威服务器地址 - 最后向
example.com
的权威服务器获取到最终 IP(例如:93.184.216.34
)
- 询问根域名服务器
💡 结果:浏览器得到服务器 IP 地址。
🚪 三、建立 TCP 连接(三次握手)
1️⃣ 浏览器向服务器发起 TCP 连接请求(端口号通常是 80 或 443):
阶段 | 发起方 | 内容 | 目的 |
---|---|---|---|
第一次握手 | 客户端 → 服务器 | SYN | 我要连接你 |
第二次握手 | 服务器 → 客户端 | SYN + ACK | 我收到了,可以连接 |
第三次握手 | 客户端 → 服务器 | ACK | 收到确认,连接建立 |
💡 TCP 连接正式建立,双方可以开始通信。
🔒 四、TLS 握手(HTTPS 才有)
如果是 https://
开头,会在 TCP 连接基础上增加 TLS 安全握手:
1️⃣ 客户端发送支持的加密算法列表
2️⃣ 服务器选择算法并返回数字证书(含公钥)
3️⃣ 客户端验证证书合法性(CA 签发)
4️⃣ 双方协商生成对称密钥
5️⃣ 之后的 HTTP 通信都将加密传输
💡 HTTPS = HTTP + 加密层,保证了数据机密性与完整性。
📤 五、浏览器发送 HTTP 请求报文
连接建立后,浏览器向服务器发送一个标准的 HTTP 请求:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0)
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN
Connection: keep-alive
请求报文结构
- 请求行:
GET /index.html HTTP/1.1
- 请求头:描述客户端信息、数据类型、缓存策略等
- 请求体(可选):POST/PUT 等请求时携带,如表单数据或 JSON
🖥️ 六、服务器接收并处理请求
1️⃣ 服务器(例如 Nginx 或 Apache)接收到请求
2️⃣ 根据 URL 判断请求资源(静态文件或动态页面)
3️⃣ 如果是动态请求(如 PHP、Spring Boot、Node.js):
- 转发到对应应用程序
- 执行代码逻辑、查询数据库
- 生成响应内容(HTML/JSON)
💡 例如:
{ "message": "Hello 阿杰" }
📩 七、服务器返回 HTTP 响应报文
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 2048
Cache-Control: max-age=600
Date: Thu, 16 Oct 2025 02:30:00 GMT
<html>
<head><title>Hello 阿杰</title></head>
<body>欢迎回来!</body>
</html>
响应报文结构
- 状态行:
HTTP/1.1 200 OK
- 响应头:说明内容类型、长度、缓存控制等
- 响应体:实际返回的数据(HTML、JSON、图片等)
🚚 八、TCP 四次挥手(断开连接)
如果请求完成并没有设置 Connection: keep-alive
,
双方会关闭 TCP 连接:
阶段 | 发起方 | 内容 |
---|---|---|
1️⃣ | 客户端 → 服务器 | FIN(我传完了) |
2️⃣ | 服务器 → 客户端 | ACK(知道了) |
3️⃣ | 服务器 → 客户端 | FIN(我也传完了) |
4️⃣ | 客户端 → 服务器 | ACK(再见) |
💡 连接断开,资源释放。
🎨 九、浏览器渲染页面
收到 HTML 后,浏览器进入渲染阶段:
1️⃣ 解析 HTML → 生成 DOM 树
2️⃣ 解析 CSS → 构建 CSSOM 树
3️⃣ 合并生成 Render Tree
4️⃣ 计算布局 (Layout)
5️⃣ 绘制 (Paint)
6️⃣ 如果遇到 <script>
,执行 JS,可能引起重新布局或重绘
最终,你看到完整页面呈现在屏幕上。
⚡ 十、性能优化要点
阶段 | 优化手段 |
---|---|
DNS 解析 | 使用 DNS 缓存、预解析(<link rel="dns-prefetch"> ) |
TCP 建立 | 开启 HTTP/2 或 HTTP/3(减少握手) |
请求传输 | 启用 Gzip/Brotli 压缩、内容缓存 |
TLS 握手 | 使用会话复用、证书优化 |
响应 | CDN 加速、静态资源分域名 |
渲染 | JS/CSS 异步加载、懒加载图片 |
🧾 总结:HTTP 请求全流程图
[浏览器输入URL]
↓
[DNS解析 → IP地址]
↓
[TCP三次握手]
↓
[TLS握手 (HTTPS)]
↓
[发送HTTP请求报文]
↓
[服务器处理请求]
↓
[返回HTTP响应报文]
↓
[浏览器解析渲染页面]
↓
[TCP四次挥手关闭连接]
发表回复