万维网
经常在选择题中考查 HTTP 协议的几个特性,包含 HTTP 的基本方法和状态码以及几个关键字段。
WWW
WWW,也称 万维网(World Wide Web),是由互相链接的文档与资源组成的信息系统。资源用 统一资源标识符(URI)标识;URL 是 URI 中强调资源位置与访问方式的一类。用户通过浏览器访问这些资源。
组成结构
- URL (统一资源定位符):每个网页或资源都有一个唯一的地址,称为 URL,它定义了资源的位置和如何访问它。
- HTTP/HTTPS (超文本传输协议/安全超文本传输协议):这是用于从服务器传输网页到浏览器的协议。
- HTML (超文本标记语言):大多数网页使用 HTML 编写,它是用于描述和呈现超文本的标准标记语言。
HTTP 协议
HTTP(超文本传输协议)是应用层协议,用于客户端和服务器之间传输资源与控制信息。HTTP/1.1 和 HTTP/2 通常运行在 TCP 之上;HTTP/3 运行在基于 UDP 的 QUIC 之上,所以不能把所有 HTTP 版本都概括为“基于 TCP”。HTTPS 表示 HTTP 经过 TLS 提供机密性、完整性和服务器认证。
无状态
HTTP 本身是 无状态 的:协议不会自动把不同请求关联为同一应用会话。应用可以借助 Cookie、服务器端 Session、令牌等机制维护状态;这不改变 HTTP 协议本身无状态的性质。
报文组成
上图展示了 HTTP 协议的几个重要组成部分,对于考试而言,重点关注 以下字段:
- 请求和响应:HTTP 通信通常包括 客户端 向 服务器 发送 请求,然后 服务器 返回 响应 的过程。
- 方法:HTTP 定义了一组 请求方法,用于表示对资源的不同操作:
- GET:请求指定资源。
- POST:提交数据以供处理。
- PUT:更新指定资源。
- DELETE:删除指定资源。
- HEAD:与 GET 相似,但只请求资源的头部信息。
- 状态码:响应返回一个 状态码,用于表示请求的结果,例如:
- 200 OK:请求成功。
- 404 Not Found:资源未找到。
- 500 Internal Server Error:服务器内部错误。
- 以及其他众多 状态码,用于表示不同的响应状态。
- 头部字段:HTTP 请求和响应都包含 头部信息,提供有关请求或响应的元数据,例如 Content-Type(内容类型)或 User-Agent(用户代理)。
- 消息体:请求或响应可包含主体,例如 POST 提交的数据或服务器返回的网页内容;并非所有报文都有消息体。
关键机制
以下首部字段可能在考试中被考察,需要了解一下:
持久连接与非持久连接
长连接和短连接含义
HTTP 可使用 持久连接(长连接)或 非持久连接(短连接)。这不是一个名为 keepalive 的独立选项,而由 HTTP 版本默认规则和 Connection 首部等共同决定。
长连接
(persistent connection)可在一个传输连接中处理多个 HTTP 请求,减少重复握手开销。
短连接
(non-persistent connection)通常为每个请求/资源建立单独连接,请求响应完成后关闭。
HTTP 不同版本中的 keepalive
- 在 HTTP/1.0 中,持久连接 不是默认行为。要在 HTTP/1.0 中启用它,必须在请求头部添加
Connection: keep-alive。 - 在 HTTP/1.1 中及之后,持久连接 是默认行为。如果想关闭它,必须在请求或响应头部添加
Connection: close。
流水线、多路复用与队头阻塞
HTTP 流水线和非流水线含义
- 流水线(HTTP Pipelining):HTTP 客户端在未等待前一个请求的响应的情况下,连续发送多个 HTTP 请求。
- 非流水线(Non-pipelined):HTTP 客户端必须接收到上一个请求的响应,才能发送下一个请求。
HTTP 不同版本中的流水线支持
- 在 HTTP/1.0 中,流水线 的功能并不支持。
- 在 HTTP/1.1 中,引入了 HTTP 流水线 的支持,但由于使用中队头阻塞的问题,应用并不广泛。
- 在 HTTP/2 中,请求和响应被拆为带流标识的帧,可在一个连接中多路复用,解决 HTTP/1.1 应用层按响应顺序造成的队头阻塞;但所有流共享一条 TCP 连接,丢失一个 TCP 段时仍会出现传输层队头阻塞。
- HTTP/3 基于 QUIC,让不同流在传输层相互独立,从而进一步缓解跨流队头阻塞。
什么是队头阻塞?
当多个请求被排成队列时,如果第一个请求由于某种原因(如延迟、丢包或慢速响应)未能及时处理,那么后续的所有请求都必须等待第一个请求的响应完成才能被处理。
非流水线 HTTP/1.1 必须等待前一响应后再发下一请求;HTTP/1.1 流水线能连续发送请求,但服务器仍按顺序返回响应。HTTP/2 可交错传输多个流的帧,所以不能简单概括为“HTTP/2 之前绝对不能并发”:浏览器还可建立多条 TCP 连接,只是连接和资源开销更大。
Cookie
HTTP 协议是 无状态 的,这意味着每个请求都是独立的,服务器 默认情况下无法知道两个请求是否来自同一客户端或用户。Cookie 的引入使得 服务器 能够跨多个请求“识别”和“记住”用户。
HTTP 服务器通过 Set-Cookie 首部字段来设置每一个客户端的 Cookie 值,相应的 HTTP 响应的部分内容如下所示:
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Path=/; Secure; HttpOnly
当浏览器接收到带有 Set-Cookie 字段的 HTTP 响应时,就会在存储该 Cookie 字段,并在下次向对应的 服务器 发送 HTTP 请求时自动将 Cookie 字段添加在 HTTP 首部,之后的 HTTP 请求的部分内容如下所示:
GET /dashboard HTTP/1.1
Cookie: sessionId=abc123
服务器收到带 Cookie 的请求后,可把其中的标识映射到应用会话。浏览器只会在 Domain、Path、Secure、SameSite、过期时间等条件匹配时发送 Cookie;Cookie 不是对“真实用户身份”的自动证明,敏感会话还需防范窃取、固定和跨站请求等风险。