Appearance
HTTP 协议
考情分析
HTTP 协议在 408 中主要以选择题形式考查。常见考点包括 HTTP 请求方法的区别、状态码的含义、持久连接与非持久连接的区别。偶尔大题会结合传输层一起考查一个完整的网页请求过程需要多少个 RTT。
考频:★★★
HTTP 的基本特点
HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 的核心协议,定义了浏览器和 Web 服务器之间如何交换数据。
HTTP 使用 TCP 端口 80(HTTPS 使用端口 443)。
无状态
HTTP 是无状态协议。服务器不记得之前和客户端的交互历史——每个请求都是独立的。上一秒你刚登录,下一秒你再发请求,服务器不知道你登录过。
无状态的好处是服务器实现简单,坏处是很多场景需要状态信息。解决方案就是 Cookie 和 Session(后面会说)。
请求-响应模型
HTTP 采用请求-响应模式。客户端发送请求,服务器返回响应。服务器不会主动给客户端推送数据(WebSocket 可以,但那不是标准 HTTP)。
请求方法
HTTP 定义了多种请求方法,408 常考的有以下几种:
| 方法 | 作用 | 是否有请求体 | 是否幂等 |
|---|---|---|---|
| GET | 获取资源 | 无 | 是 |
| POST | 提交数据(如表单) | 有 | 否 |
| PUT | 上传/替换资源 | 有 | 是 |
| DELETE | 删除资源 | 无 | 是 |
| HEAD | 同 GET,但只返回首部(不返回实体) | 无 | 是 |
GET 和 POST 的区别(高频考点):
| 对比项 | GET | POST |
|---|---|---|
| 数据位置 | URL 的查询字符串中 | 请求体中 |
| 数据量限制 | URL 长度有限 | 理论上无限制 |
| 安全性 | 参数暴露在 URL 中 | 相对更安全(参数不在 URL 中) |
| 幂等性 | 幂等(多次请求结果相同) | 不幂等(多次提交可能重复创建) |
| 缓存 | 可以被缓存 | 一般不缓存 |
报文格式
请求报文
请求行: 方法 URL HTTP版本
首部行: 首部字段名: 值
首部字段名: 值
...
空行: \r\n
实体主体: (POST 等方法的数据)示例:
GET /index.html HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0
Accept: text/html响应报文
状态行: HTTP版本 状态码 短语
首部行: 首部字段名: 值
...
空行: \r\n
实体主体: (响应数据)示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>...</html>状态码
HTTP 状态码分为五类,每类的第一个数字表示类别。
1xx 信息性
| 状态码 | 含义 |
|---|---|
| 100 Continue | 服务器收到请求的初始部分,客户端可以继续发送 |
2xx 成功
| 状态码 | 含义 |
|---|---|
| 200 OK | 请求成功 |
| 201 Created | 资源创建成功 |
3xx 重定向
| 状态码 | 含义 |
|---|---|
| 301 Moved Permanently | 永久重定向,资源已移到新 URL |
| 302 Found | 临时重定向 |
| 304 Not Modified | 资源未修改,可以使用缓存 |
4xx 客户端错误
| 状态码 | 含义 |
|---|---|
| 400 Bad Request | 请求语法错误 |
| 403 Forbidden | 服务器拒绝请求(没有权限) |
| 404 Not Found | 请求的资源不存在 |
5xx 服务器错误
| 状态码 | 含义 |
|---|---|
| 500 Internal Server Error | 服务器内部错误 |
| 502 Bad Gateway | 网关/代理收到无效响应 |
| 503 Service Unavailable | 服务器暂时过载或维护 |
408 重点记忆加粗的状态码:200、301、302、304、400、403、404、500。
非持久连接与持久连接
HTTP/1.0 非持久连接
HTTP/1.0 默认使用非持久连接。每请求一个对象就建立一个 TCP 连接,收到响应后立刻关闭。
请求一个包含 10 个图片的网页:需要 1(HTML)+ 10(图片)= 11 个 TCP 连接。
每个 TCP 连接的时间开销 = 建立连接(1 RTT)+ 请求和接收(1 RTT)= 2 RTT。
HTTP/1.1 持久连接
HTTP/1.1 默认使用持久连接(Keep-Alive)。TCP 连接建立后不立刻关闭,后续的请求-响应可以复用同一个 TCP 连接。
持久连接又分两种模式:
非流水线方式: 客户端发送一个请求,等到收到响应后才发送下一个请求。 流水线方式(Pipelining): 客户端可以连续发送多个请求,不必等前一个响应到达。
HTTP/1.1 默认使用持久连接 + 流水线方式。
RTT 计算对比
假设请求一个 HTML 文件 + N 个引用对象:
| 方式 | TCP 连接数 | 总时间 |
|---|---|---|
| 非持久连接 | 1 + N | |
| 持久非流水线 | 1 | |
| 持久流水线 | 1 |
HTTP 版本对比
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|---|---|
| 连接 | 非持久(默认) | 持久(默认) | 持久 + 多路复用 | 基于 QUIC |
| 传输层 | TCP | TCP | TCP | UDP |
| 请求方式 | 串行 | 流水线(但有队头阻塞) | 多路复用(真正并行) | 多路复用 |
| 首部压缩 | 无 | 无 | HPACK 压缩 | QPACK 压缩 |
| 服务器推送 | 无 | 无 | 支持 | 支持 |
HTTP/2.0 的多路复用解决了 HTTP/1.1 的队头阻塞问题——在同一个 TCP 连接上,多个请求/响应可以交错传输,不用排队等待。
HTTP/3.0 改用 UDP 上的 QUIC 协议,进一步解决了 TCP 层面的队头阻塞问题。
Web 缓存与代理服务器
代理服务器(Web Cache)
Web 缓存(也叫代理服务器)是能够代表原始 Web 服务器满足 HTTP 请求的网络实体。它有自己的磁盘存储空间,保存最近请求过的对象的副本。
工作流程:
使用代理服务器的好处:
- 减少响应时间:客户端到代理通常比到原始服务器更近(延迟更低)
- 减少流量:机构只需一条到外网的链路,代理缓存可以满足大部分请求
- 减轻服务器负载:热门资源被代理缓存后,原始服务器的请求量大幅减少
条件 GET
缓存中的对象可能已经过期(原始服务器上的对象已更新)。条件 GET 机制用来验证缓存是否仍然有效:
- 代理服务器向原始服务器发送一个带
If-Modified-Since首部的 GET 请求,值为上次获取该对象的时间 - 如果对象未修改:服务器返回 304 Not Modified,不携带对象体,代理继续使用缓存
- 如果对象已修改:服务器返回 200 OK + 新的对象,代理更新缓存
这就是 304 状态码的实际应用场景——它不是错误,而是一种优化机制,避免重复传输未修改的内容。
Cookie 和 Session
Cookie
Cookie 是服务器发给客户端的一小段数据,客户端在后续请求中自动携带这个 Cookie,服务器通过 Cookie 识别客户端。
工作流程:
- 客户端首次请求服务器
- 服务器在响应中通过
Set-Cookie首部设置 Cookie - 客户端保存 Cookie
- 客户端后续请求自动在
Cookie首部中携带这个值 - 服务器根据 Cookie 识别客户端
Session
Session 是服务器端保存的会话信息。服务器为每个会话分配一个 Session ID,通过 Cookie 把 Session ID 发给客户端。客户端后续请求携带 Session ID,服务器据此找到对应的会话状态。
Cookie 保存在客户端,Session 保存在服务器端。
易错点
1. HTTP 是无状态的,不是无连接的
HTTP/1.1 是持久连接的(有连接),但无状态(不记住之前的请求)。
2. 301 和 302 的区别
301 是永久重定向(搜索引擎会更新索引),302 是临时重定向(下次还访问原地址)。
3. 304 不是错误
304 表示资源没有修改,客户端可以使用本地缓存。这是一个优化,不是出错了。
4. 非持久连接每个对象需要 2 RTT
1 RTT 建立 TCP 连接 + 1 RTT 请求和接收对象。如果计算总时间,别忘了最初获取 HTML 文件也需要 2 RTT。
高频考点清单
- HTTP 无状态的含义
- GET 和 POST 的区别
- HTTP 报文格式(请求行/状态行 + 首部行 + 空行 + 实体主体)
- 常见状态码的含义(200/301/302/304/400/403/404/500)
- 非持久连接 vs 持久连接的区别和 RTT 计算
- HTTP/1.0 vs 1.1 vs 2.0 的主要区别
- Cookie 的工作机制