非常好 👍 阿杰,这里是一份系统、通俗又技术细节兼具的讲解——
“一次完整的 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

请求报文结构

  1. 请求行GET /index.html HTTP/1.1
  2. 请求头:描述客户端信息、数据类型、缓存策略等
  3. 请求体(可选):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>

响应报文结构

  1. 状态行HTTP/1.1 200 OK
  2. 响应头:说明内容类型、长度、缓存控制等
  3. 响应体:实际返回的数据(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四次挥手关闭连接]