万维网

中优先级
真题练习
经常在选择题中考查 HTTP 协议的几个特性,包含 HTTP 的基本方法和状态码以及几个关键字段。

WWW

WWW,也称为 万维网(World Wide Web),是一个信息系统,在这个系统中,文档和其他资源通过 统一资源标识符(Uniform Resource Identifiers,或 URI,通常为 URL)进行标识和互相链接。用户可以使用 网络浏览器 访问 万维网 上的资源。

组成结构

  1. URL (统一资源定位符):每个网页或资源都有一个唯一的地址,称为 URL,它定义了资源的位置和如何访问它。
  2. HTTP/HTTPS (超文本传输协议/安全超文本传输协议):这是用于从服务器传输网页到浏览器的协议。
  3. HTML (超文本标记语言):大多数网页使用 HTML 编写,它是用于描述和呈现超文本的标准标记语言。

HTTP 协议

HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议。它是一个属于 应用层 的协议,常基于 TCP/IP 协议通信。HTTP 用于 客户端服务器 之间的数据传输,特别是在 万维网(WWW)中,用于传输网页(HTML 文件)以及与其关联的资源(如图片、音频、视频等)。

无状态

HTTP 本身不保持 无状态 信息,每个请求都是独立的,服务器无法识别是不是同一个用户发送的多个请求。这一点在现实中通常通过 CookieSession 技术来弥补。

组成部分

HTTP 组成部分客户端(浏览器)服务器(Web服务器)HTTP 请求HTTP 响应HTTP 方法• GET - 获取资源• POST - 提交数据• PUT - 更新资源• DELETE - 删除资源• HEAD - 获取头部• OPTIONS - 通信选项• PATCH - 部分修改• CONNECT, TRACE...状态码• 200 OK - 请求成功• 404 Not Found - 未找到• 500 Internal Server Error• 1xx - 信息响应• 2xx - 成功响应• 3xx - 重定向• 4xx - 客户端错误• 5xx - 服务器错误头部字段• Content-Type• User-Agent• Authorization• Accept• Content-Length• Cache-Control• Cookie• Set-Cookie消息体请求数据:• JSON 数据• 表单数据• 文件上传响应内容:• HTML 页面• JSON 数据HTTP 请求结构GET /api/users HTTP/1.1Host: example.comUser-Agent: Mozilla/5.0...Accept: application/jsonAuthorization: Bearer token[空行][请求体 - 如果有的话]HTTP 响应结构HTTP/1.1 200 OKContent-Type: application/jsonContent-Length: 1234Set-Cookie: session=abc123Cache-Control: no-cache[空行]{"users": [...]}

上图展示了 HTTP 协议的几个重要组成部分,对于考试而言,重点关注 以下字段:

  1. 请求和响应HTTP 通信通常包括 客户端服务器 发送 请求,然后 服务器 返回 响应 的过程。
  2. 方法HTTP 定义了一组 请求方法,用于表示对资源的不同操作:
    • GET:请求指定资源。
    • POST:提交数据以供处理。
    • PUT:更新指定资源。
    • DELETE:删除指定资源。
    • HEAD:与 GET 相似,但只请求资源的头部信息。
  3. 状态码:响应返回一个 状态码,用于表示请求的结果,例如:
    • 200 OK:请求成功。
    • 404 Not Found:资源未找到。
    • 500 Internal Server Error:服务器内部错误。
    • 以及其他众多 状态码,用于表示不同的响应状态。
  4. 头部字段HTTP 请求响应都包含 头部信息,提供有关请求或响应的元数据,例如 Content-Type(内容类型)或 User-Agent(用户代理)。
    • 消息体请求响应 的主体部分,通常包含要传输的数据。例如,POST 请求的数据或 服务器 返回的网页内容。

关键字段

以下首部字段可能在考试中被考察,需要了解一下:

长连接和短连接
open
close
短连接
open
close
open
close
open
长连接
close

长连接和短连接含义

HTTP 根据首部的 keepalive 选项是否被设置被分为 长连接短连接

  • 长连接持久连接,persistant connection)通过设置 keepalive 选项,可以在一个 TCP 连接 中发送多个 HTTP 请求。
  • 短连接 非持久连接,multiple connection)没有设置 keepalive 选项,那么每一次发送 HTTP 请求都必须单独建立一个 TCP 连接

HTTP 不同版本中的 keepalive

  • HTTP/1.0 中,持久连接 不是默认行为。要在 HTTP/1.0 中启用它,必须在请求头部添加 Connection: keep-alive
  • HTTP/1.1 中及之后,持久连接 是默认行为。如果想关闭它,必须在请求或响应头部添加 Connection: close
流水线和非流水线
open
流水线
close
open
非流水线
close

HTTP 流水线和非流水线含义

  • 流水线HTTP Pipelining):HTTP 客户端在未等待前一个请求的响应的情况下,连续发送多个 HTTP 请求。
  • 非流水线Non-pipelined):HTTP 客户端必须接收到上一个请求的响应,才能发送下一个请求。

HTTP 不同版本中的流水线支持

  • HTTP/1.0 中,流水线 的功能并不支持。
  • HTTP/1.1 中,引入了 HTTP 流水线 的支持,但由于使用中队头阻塞的问题,应用并不广泛。
  • HTTP/2 中,进一步改进了请求处理机制,允许多个请求和响应在同一个连接中并行进行,解决了队头阻塞的问题。
注意

什么是 队头阻塞(了解即可)

当多个请求被排成队列时,如果第一个请求由于某种原因(如延迟、丢包或慢速响应)未能及时处理,那么后续的所有请求都必须等待第一个请求的响应完成才能被处理。

HTTP/2.0 之前,你只有在完成上一个 HTTP 请求后,才能发送下一个请求。但是在 HTTP/2.0 中,你可以并发地发送多个 HTTP 请求,这些请求被并发地处理。

HTTP 协议是 无状态 的,这意味着每个请求都是独立的,服务器 默认情况下无法知道两个请求是否来自同一客户端或用户。Cookie 的引入使得 服务器 能够跨多个请求“识别”和“记住”用户。

HTTP Cookie 工作原理浏览器客户端Cookie 存储服务器Web Server会话数据1. 首次请求(无状态)GET /loginSet-Cookie: sessionId=abc1232. 后续请求(有状态)GET /dashboardCookie: sessionId=abc123200 OK (个性化内容)Cookie 关键特点:• 自动发送:浏览器自动在请求中包含匹配的 Cookie• 状态保持:服务器通过 Cookie 识别用户身份首次请求设置Cookie携带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

HTTP 服务器 接收到带有 Cookie 的请求时,它就可以区分这个请求是来自于那个客户端的了。