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 保证数据不丢、不乱序、不重复:
- 客户端发 SYN 报文(请求连接)
- 服务器回 SYN+ACK(同意连接 + 确认收到)
- 客户端回 ACK(确认就绪)握手完成,TCP 通道打通,开始传 HTTP 报文。
3. 客户端发送 HTTP 请求报文
请求报文由 4 部分组成:
- 请求行:请求方法 + URL + HTTP 版本 例:
GET /index.html HTTP/1.1 - 请求头 Headers:一堆键值对,描述客户端信息User-Agent(浏览器型号)、Host(域名)、Cookie、Referer、Content-Type 等
- 空行:固定分隔符,必须有
- 请求体 Body:POST/PUT 才带,放表单、JSON 参数,GET 没有请求体
高频请求方法简单提一下
- GET:查询资源,参数拼在 URL,可缓存、长度有限
- POST:提交数据,放请求体,不缓存,用于登录、提交表单
- PUT:全量更新资源
- DELETE:删除资源
- HEAD:只返回响应头,不返回正文,测连通性
4. 服务器处理请求并返回 HTTP 响应报文
服务器 Nginx/Apache 接收报文,路由分发、执行业务代码、查数据库,拼接返回响应,同样 4 部分:
- 状态行:版本 + 状态码 + 描述 例:
HTTP/1.1 200 OK - 响应头 Headers:服务器信息、缓存策略(Cache-Control)、Set-Cookie、Content-Type、压缩方式等
- 空行
- 响应体 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 连接,释放端口资源:
- 客户端发 FIN:不再发数据
- 服务器 ACK 确认
- 服务器发 FIN:服务端数据发完了
- 客户端 ACK 确认,连接彻底关闭