HTTP协议工作流程 · clubsk

HTTP协议工作流程

一、解析 URL

浏览器先把你输入的地址拆开:

  • 协议:http 还是 https
  • 域名:比如 example.com
  • 端口:没写就用默认,HTTP 是 80,HTTPS 是 443
  • 路径和参数:比如 /index.html?id=1

这一步决定了“访问谁、用什么协议、请求哪个资源”。

二、DNS 解析域名

浏览器需要把域名变成 IP 地址,否则网络层不知道往哪里发数据。

查找顺序一般是:

  1. 浏览器 DNS 缓存
  2. 操作系统缓存 / hosts 文件
  3. 路由器或本地 DNS 服务器
  4. 递归查询:本地 DNS → 根域名服务器 → 顶级域名服务器 → 权威域名服务器
  5. 拿到 IP 后返回给浏览器,并缓存一段时间

比如访问 www.example.com,最终会得到类似 93.184.216.34 这样的 IP。

三、建立 TCP 连接

拿到 IP 后,浏览器要和服务器建立可靠连接。HTTP/1.x 和 HTTP/2 通常基于 TCP。

TCP 三次握手:

  1. 客户端发 SYN
  2. 服务器回 SYN + ACK
  3. 客户端再回 ACK

连接建立后,数据才能可靠传输。

如果是 HTTPS,还会在 TCP 之后进行 TLS 握手,完成证书验证和密钥协商。

四、 发送 HTTP 请求

连接建立后,浏览器发送 HTTP 请求报文。

例如:

GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: sid=abc

例如:

POST /api/login HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 45
Authorization: Bearer token123

{"username":"admin","password":"123456"}

请求报文包括:

  • 请求行:方法、路径、协议版本
  • 请求头:Host、Cookie、Accept、User-Agent 等
  • 空行
  • 请求体:POST/PUT 等请求才会携带

五、 服务器处理请求

服务器收到请求后,通常会经过:

  • 负载均衡 / 反向代理,如 Nginx
  • Web 服务器或应用服务器
  • 业务逻辑处理
  • 查询数据库或缓存
  • 生成 HTML、JSON 或其他响应数据

如果是静态资源,可能直接返回文件;如果是动态页面,就需要后端程序生成内容。

六、返回 HTTP 响应

服务器把处理结果封装成 HTTP 响应报文返回:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Set-Cookie: sid=abc; Path=/

<html>...</html>
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 55
Set-Cookie: sid=abc123; Path=/; HttpOnly

{"code":0,"msg":"success","data":{"id":10086}}

响应报文包括:

  • 状态行:协议版本、状态码、原因短语
  • 响应头:Content-Type、Cache-Control、Set-Cookie 等
  • 空行
  • 响应体:HTML、JSON、图片等

七、浏览器渲染页面

浏览器拿到响应后:

  1. 解析 HTML,构建 DOM 树
  2. 加载 CSS,构建 CSSOM 树
  3. 执行 JavaScript
  4. 生成渲染树
  5. 计算布局、绘制页面
  6. 如果 HTML 里引用了图片、CSS、JS,还会继续发起新的 HTTP 请求

所以一个页面往往不是一次请求就结束,而是多次请求资源后逐步渲染出来。

八、连接关闭或复用

HTTP/1.1 默认使用持久连接,也就是 keep-alive,同一个 TCP 连接可以发送多个请求,减少重复建连开销。

当不需要继续通信时,才会通过 TCP 四次挥手关闭连接。