HTTP Message Format(HTTP 报文格式)
Definition
HTTP Message Format(HTTP 报文格式) 是 HTTP 消息组织控制数据、首部字段和内容的结构规范。在 HTTP/1.1 中,它表现为可读的文本消息语法;HTTP/2 和 HTTP/3 则使用二进制帧承载相同的 HTTP 语义。
它规定 / 它负责:
- 规定请求和响应都由起始部分、首部部分以及可选内容组成;请求与响应的起始部分分别是请求行和状态行。
- 规定通过行首的控制信息标识请求意图(请求行)或处理结果(状态行)。
- 在 HTTP/1.1 文本语法中,通过独占一行的 CRLF (
\r\n) 空行分隔首部部分与消息体。
简单理解:
HTTP/1.1 请求与响应共享“起始行 + 首部字段 + 空行 + 可选消息体”的文本结构;HTTP/2 和 HTTP/3 的物理承载方式不同,但保留相同的 HTTP 语义。
HTTP/1.1 文本语法 / 结构示意
+-------------------------------------------------------------------+
| 1. 起始行 (Start Line) : 请求行 (Request) / 状态行 (Response) + \r\n |
+-------------------------------------------------------------------+
| 2. 首部行 (Header Lines): Header-Name: Header-Value + \r\n (多行) |
+-------------------------------------------------------------------+
| 3. 空行 (Empty Line) : \r\n (CRLF 核心分隔符) |
+-------------------------------------------------------------------+
| 4. 消息体 (Message Body): JSON / HTML / 图像等 Content (可选) |
+-------------------------------------------------------------------+核心内容 / 报文同构对比
在 HTTP/1.1 文本语法中,请求报文与响应报文共享相同的消息结构,二者主要区别在起始行:
| 报文组成 | 请求报文 (Request Message) | 响应报文 (Response Message) | 核心区别 / 说明 |
|---|---|---|---|
| 第一行 (Start Line) | 请求行 (Request Line)<Method> <URL> <Version>\r\n | 状态行 (Status Line)<Version> <Status-Code> <Reason>\r\n | 请求行声明动作与资源路径;状态行返回处理结果状态码。 |
| 首部行 (Header Lines) | <Header-Name>: <Value>\r\n例: Host, User-Agent | <Header-Name>: <Value>\r\n例: Server, Set-Cookie | 格式完全一致,传递环境、连接控制及数据元信息。 |
| 空行 (Empty Line) | \r\n | \r\n | 完全一致。文本字节流中标识首部结束与请求体开始。 |
| 消息体 (Message Body) | <Content Data> | <Content Data> | 可选;请求体承载请求内容,响应体承载响应内容。 |
字段拆解与细节
1. 请求行 (Request Line) vs 状态行 (Status Line)
请求行 (Request Line)
结构规范:<Method> <SP> <Request-Target> <SP> <HTTP-Version> \r\n
- 字段顺序:方法 (Method) → 请求目标 (Request Target) → 协议版本 (Version)。
- 典型示例:
GET /index.html HTTP/1.1\r\n - 常见 Method:
GET(获取)、POST(提交数据)、HEAD(仅获取首部)、PUT(替换/创建)、DELETE(删除)。
状态行 (Status Line)
结构规范:<HTTP-Version> <SP> <Status-Code> <SP> <Reason-Phrase> \r\n
- 字段顺序:协议版本 (Version) → 状态码 (Status-Code) → 原因短语 (Reason-Phrase)。
- 典型示例:
HTTP/1.1 200 OK\r\n - 状态码分类:
1xx:信息提示(Informational)2xx:成功(Success,如200 OK)3xx:重定向(Redirection,如301 Moved Permanently,304 Not Modified)4xx:客户端错误(Client Error,如400 Bad Request,404 Not Found)5xx:服务端错误(Server Error,如500 Internal Server Error,503 Service Unavailable)
2. 首部行 (Header Lines) 与空行 (Empty Line)
Host首部:HTTP/1.1 唯一强制要求的首部,用于多虚拟主机路由。Connection首部:HTTP/1.1 中用于连接管理;HTTP/2 和 HTTP/3 不使用这个逐跳首部。Content-Type&Content-Length:分别描述内容类型和消息体长度;是否存在消息体还要结合方法、状态码和消息分帧规则判断。- 空行分隔符 (
\r\n):ASCII 码0x0D 0x0A。TCP 是字节流,解析器依赖独占一行的 CRLF 识别首部边界。
Summary
HTTP/1.1 用“起始行 + 首部字段 + 空行 + 可选消息体”组织文本消息;HTTP/2 和 HTTP/3 改变了物理分帧方式,但没有改变请求与响应的核心语义。