Skip to content

HTTP 快速指南

超文本传输协议(HTTP)是一个应用层协议,对于分布式、协作式、超媒体信息系统至关重要。自万维网早期以来,它一直是数据通信的基石。HTTP 是一个多功能、无状态的协议,可以通过其请求方法、状态码和头字段进行扩展,用于各种目的。

本质上,HTTP 是一个用于获取资源的协议,例如 HTML 文档。它是 Web 上任何数据交换的基础,并且是一个客户端-服务器协议,这意味着请求由接收方(通常是 Web 浏览器)发起。完整的文档由获取到的不同子文档(例如文本、布局描述、图像、视频、脚本等)重建而成。

客户端和服务器之间的通信通过交换独立的消息进行(而非数据流)。客户端(通常是 Web 浏览器)发送的消息称为 请求 (requests),服务器作为回应发送的消息称为 响应 (responses)。

虽然 HTTP 传统上在 TCP/IP 上通过端口 80 工作,但现代 Web 通信绝大多数使用 HTTPS(安全超文本传输协议,HTTP Secure),它使用 TLS(传输层安全,Transport Layer Security)加密 HTTP 消息,通常在端口 443 上运行。HTTP 本身也在不断发展,HTTP/1.1、HTTP/2 和 HTTP/3 等版本提供了显著的性能改进(例如连接复用、多路复用、头字段压缩以及 HTTP/3 使用的 QUIC)。

  • **HTTP 是面向连接的(但有时看似无连接):**在 HTTP/1.0 中,每个请求/响应对通常使用单独的 TCP 连接。HTTP/1.1 引入了持久连接(persistent connections),允许在单个连接上进行多个请求/响应。HTTP/2 通过多路复用(multiplexing)进一步增强了这一点。虽然连接是管理的,但协议的请求-响应性质使其在每个事务上给人一种“无连接”的感觉。
  • **HTTP 是媒体无关的:**任何类型的数据(文本、图像、视频、JSON、XML 等)都可以通过 HTTP 发送,只要客户端和服务器都了解如何处理这些数据即可。Content-Type 头字段使用 MIME 类型指定数据格式。
  • **HTTP 是无状态的:**客户端到服务器的每个 HTTP 请求都是独立处理的。服务器不会存储同一客户端之前请求的任何信息。这简化了服务器设计。为了在多个请求之间维持状态(例如用于用户会话或购物车),会采用 Cookies、头字段中的令牌或服务器端会话等技术。

HTTP/1.1 实现了连接复用(持久连接)。HTTP/2 允许在单个 TCP 连接上多路复用请求,而 HTTP/3 使用 QUIC(基于 UDP)提供更好的性能,尤其在有损网络下。

HTTP 在客户端-服务器模型下运行。客户端(例如,Web 浏览器、移动应用、像 cURL 这样的命令行工具)向服务器发送 HTTP 请求。服务器(例如,Apache、Nginx、Kestrel)处理请求并返回 HTTP 响应。这种交换可以直接发生,也可以通过代理(proxies)或网关(gateways)等中介进行。

概念流程:

  1. 客户端发起连接: 通常是通过 TCP/IP 连接到服务器的相应端口(HTTP 为 80,HTTPS 为 443)。对于 HTTPS,首先会进行 TLS 握手。

  2. 客户端发送 HTTP 请求: 该消息包含请求行(例如,GET /index.html HTTP/1.1)、头字段(例如,Host: example.com、User-Agent: browser-info)以及可选的消息体(用于 POST 等方法)。

  3. 服务器处理请求: 服务器解析请求,定位资源或执行操作,并准备响应。

  4. 服务器发送 HTTP 响应: 该消息包含状态行(例如,HTTP/1.1 200 OK)、头字段(例如,Content-Type: text/html、Content-Length: 1234)以及通常包含请求资源或状态信息的消息体。

  5. 客户端接收并处理响应: 客户端(例如浏览器)解析响应,渲染内容或采取适当行动。

  6. 连接管理: 根据 HTTP 版本和头字段(例如,Connection: close),连接可能会被关闭或保持活动状态以供后续请求使用。

HTTP 客户端(用户代理,user agent)构建并发送 HTTP 请求。这包括指定所需的 HTTP 方法(例如 GET、POST)、目标资源的 URI、HTTP 协议版本、提供上下文的各种头字段(如可接受的内容类型或认证凭据),以及有时包含消息体(有效载荷,payload)。

HTTP 服务器在特定的网络端口监听传入的请求。接收到请求后,它会解析请求,执行所请求的操作(例如,获取文件、查询数据库、执行业务逻辑),然后发回 HTTP 响应。响应包含指示结果的状态码、带有响应元数据的头字段,以及通常包含资源表示的消息体。