精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

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 的区别(高频考点):

对比项GETPOST
数据位置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+N)×2 RTT + 传输时间
持久非流水线12 RTT (建立连接+HTML) + N×1 RTT + 传输时间
持久流水线12 RTT (建立连接+HTML) + 1 RTT (所有对象一起请求) + 传输时间

HTTP 版本对比 ​

特性HTTP/1.0HTTP/1.1HTTP/2.0HTTP/3.0
连接非持久(默认)持久(默认)持久 + 多路复用基于 QUIC
传输层TCPTCPTCPUDP
请求方式串行流水线(但有队头阻塞)多路复用(真正并行)多路复用
首部压缩无无HPACK 压缩QPACK 压缩
服务器推送无无支持支持

HTTP/2.0 的多路复用解决了 HTTP/1.1 的队头阻塞问题——在同一个 TCP 连接上,多个请求/响应可以交错传输,不用排队等待。

HTTP/3.0 改用 UDP 上的 QUIC 协议,进一步解决了 TCP 层面的队头阻塞问题。

Web 缓存与代理服务器 ​

代理服务器(Web Cache) ​

Web 缓存(也叫代理服务器)是能够代表原始 Web 服务器满足 HTTP 请求的网络实体。它有自己的磁盘存储空间,保存最近请求过的对象的副本。

工作流程:

使用代理服务器的好处:

  • 减少响应时间:客户端到代理通常比到原始服务器更近(延迟更低)
  • 减少流量:机构只需一条到外网的链路,代理缓存可以满足大部分请求
  • 减轻服务器负载:热门资源被代理缓存后,原始服务器的请求量大幅减少

条件 GET ​

缓存中的对象可能已经过期(原始服务器上的对象已更新)。条件 GET 机制用来验证缓存是否仍然有效:

  1. 代理服务器向原始服务器发送一个带 If-Modified-Since 首部的 GET 请求,值为上次获取该对象的时间
  2. 如果对象未修改:服务器返回 304 Not Modified,不携带对象体,代理继续使用缓存
  3. 如果对象已修改:服务器返回 200 OK + 新的对象,代理更新缓存

这就是 304 状态码的实际应用场景——它不是错误,而是一种优化机制,避免重复传输未修改的内容。

Cookie 是服务器发给客户端的一小段数据,客户端在后续请求中自动携带这个 Cookie,服务器通过 Cookie 识别客户端。

工作流程:

  1. 客户端首次请求服务器
  2. 服务器在响应中通过 Set-Cookie 首部设置 Cookie
  3. 客户端保存 Cookie
  4. 客户端后续请求自动在 Cookie 首部中携带这个值
  5. 服务器根据 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 的工作机制

真题练习 ​