完整一次 HTTP 访问全过程口述

HTTP 是应用层明文超文本传输协议,采用请求响应模型。一次访问先做 DNS 域名解析拿到 IP,通过 TCP 三次握手建立可靠连接,客户端发送由请求头、请求空行、请求体构成的请求报文;服务器处理后返回带状态码、响应头、响应体的应答报文,最后 TCP 四次挥手断开连接。 协议本身无状态、无连接,1.1 支持长连接,2.0 多路复用解决队头阻塞,由于明文不安全,线上使用 HTTPS 基于 TLS 加密传输,依靠 Cookie、Token 解决无状态问题,通过各类状态码标识请求结果。

完整一次 HTTP 访问全过程

1. DNS 解析:域名转 IP

我们输入的是域名(www.baidu.com),计算机只认 IP 地址,所以先做 DNS 递归 + 迭代查询:

本地缓存→hosts 文件→本地 DNS 服务器→根域名服务器→顶级域→权威服务器,最终拿到服务器 IP。

2. TCP 三次握手:建立可靠连接

HTTP 本身无连接、不可靠,靠下层 TCP 保证数据不丢、不乱序、不重复:

  1. 客户端发 SYN 报文(请求连接)
  2. 服务器回 SYN+ACK(同意连接 + 确认收到)
  3. 客户端回 ACK(确认就绪)握手完成,TCP 通道打通,开始传 HTTP 报文。

3. 客户端发送 HTTP 请求报文

请求报文由 4 部分组成:

  1. 请求行:请求方法 + URL + HTTP 版本 例:GET /index.html HTTP/1.1
  2. 请求头 Headers:一堆键值对,描述客户端信息User-Agent(浏览器型号)、Host(域名)、Cookie、Referer、Content-Type 等
  3. 空行:固定分隔符,必须有
  4. 请求体 Body:POST/PUT 才带,放表单、JSON 参数,GET 没有请求体

高频请求方法简单提一下

  • GET:查询资源,参数拼在 URL,可缓存、长度有限
  • POST:提交数据,放请求体,不缓存,用于登录、提交表单
  • PUT:全量更新资源
  • DELETE:删除资源
  • HEAD:只返回响应头,不返回正文,测连通性

4. 服务器处理请求并返回 HTTP 响应报文

服务器 Nginx/Apache 接收报文,路由分发、执行业务代码、查数据库,拼接返回响应,同样 4 部分:

  1. 状态行:版本 + 状态码 + 描述 例:HTTP/1.1 200 OK
  2. 响应头 Headers:服务器信息、缓存策略(Cache-Control)、Set-Cookie、Content-Type、压缩方式等
  3. 空行
  4. 响应体 Body:真正返回的 HTML、CSS、JS、图片、JSON 数据

必背状态码分类(面试官最爱追问)

1xx 信息类:100 继续发送请求

2xx 成功:200 正常返回,201 创建成功

3xx 重定向:301 永久重定向,302 临时重定向,304 协商缓存命中(不返回资源)

4xx 客户端错误:400 参数错误,401 未登录,403 权限不足,404 资源不存在,405 方法不允许

5xx 服务端错误:500 服务器内部异常,502 网关错误,503 服务不可用

5. TCP 四次挥手断开连接

HTTP1.0 默认请求一次就断连,通过四次挥手释放 TCP 连接,释放端口资源:

  1. 客户端发 FIN:不再发数据
  2. 服务器 ACK 确认
  3. 服务器发 FIN:服务端数据发完了
  4. 客户端 ACK 确认,连接彻底关闭
上一篇