---
title: HTTP 消息
site: 星湖の小窝
category: 后端
tags: [HTTP, 报文, 协议]
date: 2026-08-16
updated: 2026-08-16
id: mdn-61c5d1a0
---

# HTTP 消息

## HTTP 请求

    >

### 起始行

HTTP 请求是由客户端发出的消息，用来使服务器执行动作。*起始行*（start-line）包含三个元素：

1. 一个 *[HTTP 方法](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods)*，一个动词（像 [`GET`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods/GET)、[`PUT`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods/PUT) 或者 [`POST`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods/POST)）或者一个名词（像 [`HEAD`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods/HEAD) 或者 [`OPTIONS`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Methods/OPTIONS)），描述要执行的动作。例如，`GET` 表示要获取资源，`POST` 表示向服务器推送数据（创建或修改资源，或者产生要返回的临时文件）。
2. *请求目标*（request target），通常是一个 [URL](https://developer.mozilla.org/zh-CN/docs/Glossary/URL)，或者是协议、端口和域名的绝对路径，通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是：
  - 一个绝对路径，末尾跟上一个 `'?'` 和查询字符串。这是最常见的形式，称为*原始形式*（origin form），被 `GET`、`POST`、`HEAD` 和 `OPTIONS` 方法所使用。
    `POST / HTTP/1.1`
  - `GET /background.png HTTP/1.0`
  - `HEAD /test.html?query=alibaba HTTP/1.1`
  - `OPTIONS /anypage.html HTTP/1.0`
3. 一个完整的 URL，被称为*绝对形式*（absolute form），主要在使用 `GET` 方法连接到代理时使用。`GET http://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages HTTP/1.1`
4. 由域名和可选端口（以 `':'` 为前缀）组成的 URL 的 authority 部分，称为 *authority form*。仅在使用 `CONNECT` 建立 HTTP 隧道时才使用。`CONNECT developer.mozilla.org:80 HTTP/1.1`
5. *星号形式*（asterisk form），一个简单的星号（`'*'`），配合 `OPTIONS` 方法使用，代表整个服务器。`OPTIONS * HTTP/1.1`
6. *HTTP 版本*（HTTP version），定义了剩余消息的结构，作为对期望的响应版本的指示符。

### 标头（Header）

来自请求的 [HTTP 标头](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers)遵循和 HTTP 标头相同的基本结构：不区分大小写的字符串，紧跟着的冒号（`':'`）和一个结构取决于标头的值。整个标头（包括值）由一行组成，这一行可以相当长。

有许多请求标头可用，它们可以分为几组：

- [通用标头（General header）](https://developer.mozilla.org/zh-CN/docs/Glossary/General_header)，例如 [`Via`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Via)，适用于整个消息。
- [请求标头（Request header）](https://developer.mozilla.org/zh-CN/docs/Glossary/Request_header)，例如 [`User-Agent`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/User-Agent)、`Accept-Type`，通过进一步的定义（例如 [`Accept-Language`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Accept-Language)）、给定上下文（例如 [`Referer`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Referer)）或者进行有条件的限制（例如 `If-None`）来修改请求。
- [表示标头（Representation header）](https://developer.mozilla.org/zh-CN/docs/Glossary/Representation_header)，例如 [`Content-Type`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Type) 描述了消息数据的原始格式和应用的任意编码（仅在消息有主体时才存在）。

### 主体（Body）

请求的最后一部分是它的主体。不是所有的请求都有一个主体：例如获取资源的请求，像 `GET`、`HEAD`、`DELETE` 和 `OPTIONS`，通常它们不需要主体。有些请求将数据发送到服务器以便更新数据：常见的情况是 POST 请求（包含 HTML 表单数据）。

主体大致可分为两类：

- 单一资源（Single-resource）主体，由一个单文件组成。该类型的主体由两个标头定义：[`Content-Type`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Type) 和 [`Content-Length`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Length)。
- [多资源（Multiple-resource）主体](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/MIME_types#multipartform-data)，由多部分主体组成，每一部分包含不同的信息位。通常是和 [HTML 表单](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Extensions/Forms)连系在一起。

## HTTP 响应

    >

### 状态行

HTTP 响应的起始行被称作*状态行*（status line），包含以下信息：

1. *协议版本*，通常为 `HTTP/1.1`。
2. *状态码*（status code），表明请求是成功或失败。常见的状态码是 [`200`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status/200)、[`404`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status/404) 或 [`302`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status/302)。
3. *状态文本*（status text）。一个简短的，纯粹的信息，通过状态码的文本描述，帮助人们理解该 HTTP 消息。

一个典型的状态行看起来像这样：`HTTP/1.1 404 Not Found`。

### 标头（Header）

响应的 [HTTP 标头](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers)遵循和任何其他标头相同的结构：不区分大小写的字符串，紧跟着的冒号（`':'`）和一个结构取决于标头类型的值。整个标头（包括其值）表现为单行形式。

许多不同的标头可能会出现在响应中。这些可以分为几组：

- [通用标头（General header）](https://developer.mozilla.org/zh-CN/docs/Glossary/General_header)，例如 [`Via`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Via)，适用于整个消息。
- [响应标头（Response header）](https://developer.mozilla.org/zh-CN/docs/Glossary/Response_header)，例如 [`Vary`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Vary) 和 [`Accept-Ranges`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Accept-Ranges)，提供有关服务器的其他信息，这些信息不适合状态行。
- [表示标头（Representation header）](https://developer.mozilla.org/zh-CN/docs/Glossary/Representation_header)，例如 [`Content-Type`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Type) 描述了消息数据的原始格式和应用的任意编码（仅在消息有主体时才存在）。

### 主体（Body）

响应的最后一部分是主体。不是所有的响应都有主体：具有状态码（如 [`201`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status/201) 或 [`204`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status/204)）的响应，通常不会有主体。

主体大致可分为三类：

- 单资源（Single-resource）主体，由**已知**长度的单个文件组成。该类型主体由两个标头定义：[`Content-Type`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Type) 和 [`Content-Length`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Length)。
- 单资源（Single-resource）主体，由**未知**长度的单个文件组成。通过将 [`Transfer-Encoding`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Transfer-Encoding) 设置为 `chunked` 来使用分块编码。
- [多资源（Multiple-resource）主体](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/MIME_types#multipartform-data)，由多部分 body 组成，每部分包含不同的信息段。但这是比较少见的。

## HTTP/2 帧

HTTP/1.x 消息有一些性能上的缺点：

- 与主体不同，标头不会被压缩。
- 两个消息之间的标头通常非常相似，但它们仍然在连接中重复传输。
- 无法多路复用。当在同一个服务器打开几个连接时：TCP 热连接比冷连接更加有效。

HTTP/2 引入了一个额外的步骤：它将 HTTP/1.x 消息分成帧并嵌入到流（stream）中。数据帧和报头帧分离，这将允许报头压缩。将多个流组合，这是一个被称为*多路复用*（multiplexing）的过程，它允许更有效的底层 TCP 连接。

HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中，这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧；当浏览器和服务器都可用时，HTTP/2 将被打开并使用。

## 结论

HTTP 消息是使用 HTTP 的关键；它们的结构简单，并且具有高可扩展性。HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层，而没有从根本上修改它，即它是建立在经过验证的机制之上。

---

本文来自 [MDN Web Docs](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages) 的《HTTP 消息》，作者 Mozilla Contributors，按 [CC BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/) 转载，本站仅调整排版并去掉原文插图。
