一、解析 URL
浏览器先把你输入的地址拆开:
- 协议:http 还是 https
- 域名:比如 example.com
- 端口:没写就用默认,HTTP 是 80,HTTPS 是 443
- 路径和参数:比如 /index.html?id=1
这一步决定了“访问谁、用什么协议、请求哪个资源”。
二、DNS 解析域名
浏览器需要把域名变成 IP 地址,否则网络层不知道往哪里发数据。
查找顺序一般是:
- 浏览器 DNS 缓存
- 操作系统缓存 / hosts 文件
- 路由器或本地 DNS 服务器
- 递归查询:本地 DNS → 根域名服务器 → 顶级域名服务器 → 权威域名服务器
- 拿到 IP 后返回给浏览器,并缓存一段时间
比如访问 www.example.com,最终会得到类似 93.184.216.34 这样的 IP。
三、建立 TCP 连接
拿到 IP 后,浏览器要和服务器建立可靠连接。HTTP/1.x 和 HTTP/2 通常基于 TCP。
TCP 三次握手:
- 客户端发 SYN
- 服务器回 SYN + ACK
- 客户端再回 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、图片等
七、浏览器渲染页面
浏览器拿到响应后:
- 解析 HTML,构建 DOM 树
- 加载 CSS,构建 CSSOM 树
- 执行 JavaScript
- 生成渲染树
- 计算布局、绘制页面
- 如果 HTML 里引用了图片、CSS、JS,还会继续发起新的 HTTP 请求
所以一个页面往往不是一次请求就结束,而是多次请求资源后逐步渲染出来。
八、连接关闭或复用
HTTP/1.1 默认使用持久连接,也就是 keep-alive,同一个 TCP 连接可以发送多个请求,减少重复建连开销。
当不需要继续通信时,才会通过 TCP 四次挥手关闭连接。