主题
概念卡片:HTTP 协议与报文
一句话机制:HTTP 是在「两点」之间「传输」文字/图片/视频等「超文本」数据的约定和规范,报文 = 起始行 + 头部(key-value)+ 空行 + 实体。它本身无状态,靠 Cookie/Session 补状态;靠状态码五类反馈结果。
报文结构
| 部分 | 请求报文 | 响应报文 |
|---|---|---|
| 起始行 | 请求方法 + URI + HTTP 版本 | 状态行(版本 + 状态码 + 原因短语) |
| 首部 | 请求头(Host/Accept/User-Agent…) | 响应头(Content-Type/Location…) |
| 空行 | 分隔头与体 | 同 |
| 实体 | body(POST 参数等) | body(返回内容) |
常见首部字段
| 字段 | 作用 |
|---|---|
| Host | 指定服务器域名(一台服务器托管多个网站) |
| Content-Length | 本次 body 数据长度(解决 TCP 粘包的 body 边界) |
| Connection | Keep-Alive 长连接 |
| Content-Type / Accept | 返回/接受的数据格式 |
| Content-Encoding / Accept-Encoding | 压缩方式(gzip) |
header 边界靠回车换行符,body 边界靠 Content-Length,二者共同解决 TCP「粘包」。
状态码五类
| 类别 | 含义 | 代表 |
|---|---|---|
| 1xx | 信息提示 | — |
| 2xx | 成功 | 200 OK / 204 No Content / 206 Partial Content(断点续传) |
| 3xx | 重定向 | 301 永久 / 302 临时 / 304 缓存重定向(未修改) |
| 4xx | 客户端错误 | 400 报文错 / 401 未认证 / 403 禁止 / 404 未找到 |
| 5xx | 服务端错误 | 500 内部错 / 502 网关错 / 503 忙 |
GET vs POST
| GET | POST | |
|---|---|---|
| 语义(RFC) | 从服务器获取资源 | 按 body 处理资源(新增/提交) |
| 数据位置 | URL 后(?k=v&…) | 报文 body |
| 长度限制 | 受 URL 长度限制(浏览器/服务器实现,协议无限制) | 理论上无限制 |
| 字符集 | 只支持 ASCII | 支持标准字符集 |
| 安全/幂等 | 安全 + 幂等(只读) | 不安全 + 非幂等 |
| 可缓存 | 可缓存 | 一般不缓存 |
「安全」= 不破坏服务器资源;「幂等」= 多次执行结果相同。这是 RFC 语义,实际实现未必遵守(GET 也能删数据)。
Cookie vs Session(解决无状态)
| Cookie | Session | |
|---|---|---|
| 位置 | 客户端(浏览器) | 服务器端 |
| 大小 | ≤ 4KB | 理论无限制 |
| 安全 | 不安全(明文) | 较安全 |
| 内容 | String | 任意对象 |
| 生命周期 | 可设(最长 50 年) | 默认 20 分钟 |
无状态解决方式:服务器建 Session 记录状态,通过 Cookie 携带 Session ID 跟踪;Cookie 被禁用时用 URL 重写 附加 Session ID。
不变量(必须成立的约束)
- HTTP 无状态,状态由 Cookie/Session 补;Cookie 存客户端、Session 存服务端。
- GET 的「安全/幂等」是 RFC 语义,不是强约束。
- 状态码 301/302 都要在响应头带 Location 指明跳转目标。
常见误解
- 以为「GET 数据上限 1024 字节是协议规定」→ 是浏览器/服务器实现限制。
- 以为「POST 比 GET 安全」→ 只是 body 不显示在地址栏,抓包都是明文,真安全靠 HTTPS。
- 以为「重定向和转发一样」→ 重定向是客户端行为(两次请求、地址变),转发是服务器行为(一次请求、地址不变)。
关联
- 缓存与版本:概念卡片:HTTP缓存与版本演进
- HTTPS:概念卡片:HTTPS与加密机制
- 总览:计算机网络技术栈总览