HTTP 协议
medium计算机网络HTTP状态码CookieSessionHTTP2
HTTP 基本概念
HTTP(HyperText Transfer Protocol)是应用层最重要的协议,基于请求-响应模型,运行在 TCP 之上。
请求报文结构
GET /index.html HTTP/1.1 ← 请求行(方法 + URL + 版本)
Host: www.example.com ← 请求头
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
← 空行
[请求体] ← GET 通常无请求体
响应报文结构
HTTP/1.1 200 OK ← 状态行(版本 + 状态码 + 描述)
Content-Type: text/html ← 响应头
Content-Length: 1234
Set-Cookie: session=abc123
← 空行
<html>...</html> ← 响应体
HTTP 方法
| 方法 | 作用 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ |
| POST | 提交数据 | ❌ | ❌ |
| PUT | 替换资源 | ✅ | ❌ |
| DELETE | 删除资源 | ✅ | ❌ |
| PATCH | 部分修改 | ❌ | ❌ |
| HEAD | 获取响应头(不要 body) | ✅ | ✅ |
| OPTIONS | 查询支持的方法(CORS 预检) | ✅ | ✅ |
GET vs POST:GET 参数在 URL 中(有长度限制),POST 在请求体中(无限制)。GET 可被缓存和收藏,POST 不行。语义上 GET 用于查询,POST 用于修改。
状态码
| 范围 | 类别 | 常见状态码 |
|---|---|---|
| 1xx | 信息 | 100 Continue |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 重定向 | 301 永久移动, 302 临时移动, 304 未修改 |
| 4xx | 客户端错误 | 400 请求错误, 401 未认证, 403 禁止, 404 未找到 |
| 5xx | 服务端错误 | 500 内部错误, 502 网关错误, 503 服务不可用 |
HTTP 版本演进
| 版本 | 年份 | 关键特性 |
|---|---|---|
| HTTP/1.0 | 1996 | 每次请求需要新建 TCP 连接 |
| HTTP/1.1 | 1997 | 持久连接 (Keep-Alive)、管线化、Host 头 |
| HTTP/2 | 2015 | 多路复用、头部压缩、服务器推送、二进制帧 |
| HTTP/3 | 2022 | 基于 QUIC(UDP),解决队头阻塞 |
HTTP/1.1 的持久连接
HTTP/1.0 每次请求都要三次握手建立 TCP 连接,非常低效。HTTP/1.1 默认开启 Keep-Alive,同一 TCP 连接可以发送多个请求。
但 HTTP/1.1 有队头阻塞问题:同一连接上的请求必须按顺序响应,前一个请求慢了会阻塞后面的。
HTTP/2 的多路复用
HTTP/1.1: 请求1 ──▶ 响应1 ──▶ 请求2 ──▶ 响应2 (串行)
HTTP/2: 请求1 ──▶──┐
请求2 ──▶──┤ 在一个 TCP 连接上
请求3 ──▶──┤ 并行传输多个流
响应2 ◀────┤ (多路复用)
响应1 ◀────┤
响应3 ◀────┘
HTTP/2 将数据拆分为二进制帧,每个帧带有流 ID,不同请求的帧可以交错发送,彻底解决了应用层队头阻塞。
HTTP/3 与 QUIC
HTTP/2 解决了应用层队头阻塞,但 TCP 层仍然存在队头阻塞(一个丢包会阻塞整个 TCP 连接的所有流)。HTTP/3 基于 QUIC 协议(运行在 UDP 上),每个流独立,一个流的丢包不影响其他流。
Cookie 与 Session
HTTP 是无状态协议,Cookie 和 Session 用于维持状态:
Cookie Session
存储位置: 客户端浏览器 存储位置: 服务端内存/数据库
安全性: 较低(可被篡改) 安全性: 较高
大小: 4KB 限制 大小: 无限制
生命周期: 可设置过期时间 生命周期: 服务端控制
工作流程:
1. 首次请求 → 服务端创建 Session,生成 Session ID
2. 响应: Set-Cookie: JSESSIONID=abc123
3. 后续请求: Cookie: JSESSIONID=abc123 → 服务端查找 Session
生产高频题
GET 和 POST 的区别?
GET 参数在 URL 中,可缓存可收藏,幂等;POST 参数在请求体中,不可缓存,非幂等。本质区别是语义不同(查询 vs 修改),不是安全性。
HTTP/1.1、HTTP/2、HTTP/3 的核心区别?
1.1 引入持久连接但有队头阻塞;2.0 通过多路复用解决应用层队头阻塞;3.0 基于 QUIC(UDP)解决传输层队头阻塞,且首次连接只需 1-RTT。