在 HTTP 通信中,客户端和服务器通过 HTTP 报文进行交互。HTTP 报文主要分为请求报文(Request Message)和响应报文(Response Message)。它们都由三部分组成:
-
起始行(Start Line):描述报文的基本信息
- 请求报文:包含请求方法(如 GET、POST)、URI 和 HTTP 版本(如 HTTP/1.1、HTTP/2)
- 响应报文:包含 HTTP 版本、状态码(如 200、404)和状态描述(如 OK、Not Found)
-
首部(Headers):提供额外信息,如缓存控制、内容类型等
-
消息主体(Body):实际传输的数据内容(可选)
HTTP 协议经历了多个版本的演进(HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3),每个版本对首部字段的支持和处理方式有所不同。不同版本间的主要区别包括连接管理、缓存控制、压缩方式和多路复用等特性。
HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部为客户端和服务端处理请求和响应提供所需的信息,对于普通用户来说,这些信息大部分无需关注。
在 HTTP(Hypertext Transfer Protocol)中,通用首部字段(General Header Fields) 是指既可以出现在请求报文,也可以出现在响应报文中的首部字段,它们提供关于报文的通用信息,而不是特定于请求或响应的内容。
HTTP 报文由方法、URI、HTTP 首部字段等部分构成。在这些组成部分中,HTTP 首部字段包含的信息最为丰富,同时存在于请求和响应报文内,涵盖了 HTTP 报文相关的各种重要信息。
下面是 HTTP 中常见的通用首部字段的详细讲解:
1. Cache-Control(缓存控制)
用于指定请求和响应的缓存机制,控制缓存的行为。
常见指令
指令 | 作用 |
---|---|
no-cache | 强制请求直接从服务器获取,而不使用缓存。 |
no-store | 禁止存储任何缓存,适用于敏感信息(如银行交易)。 |
max-age=N | 设置缓存的最大存活时间(单位:秒)。 |
s-maxage=N | 仅适用于代理服务器缓存,与 max-age 类似。 |
public | 允许任何缓存(包括代理服务器)存储响应内容。 |
private | 只能由单个用户缓存,代理服务器不能缓存。 |
must-revalidate | 过期后必须向服务器重新验证缓存。 |
proxy-revalidate | 代理必须重新验证缓存。 |
no-transform | 代理服务器不能对响应进行转换(如压缩)。 |
📌 示例
Cache-Control: no-cache, no-store, must-revalidate
表示不使用缓存、不存储缓存,并且必须重新验证。
2. Connection(连接控制)
用于指定当前连接的控制选项,决定是否保持 TCP 连接。
常见取值
值 | 作用 |
---|---|
keep-alive | 维持 TCP 连接,避免每次请求都重新建立连接,提高性能。 |
close | 关闭连接,每次请求都需要重新建立连接。 |
📌 示例
Connection: keep-alive
表示请求后保持连接,以减少 TCP 连接的开销。
3. Date(日期)
指示消息的发送时间,采用 GMT 格式。
📌 示例
Date: Sun, 16 Mar 2025 12:34:56 GMT
表示响应发送的时间。
4. Pragma(旧版缓存控制)
用于向后兼容 HTTP/1.0,主要用于缓存控制,功能类似 Cache-Control
,但仅适用于请求报文。
📌 示例
Pragma: no-cache
表示不使用缓存(但 Cache-Control
在 HTTP/1.1 中更推荐使用)。
5. Trailer(用于分块传输)
用于指定在 chunked
传输编码中,哪些首部字段会出现在报文的 Trailer
部分(即数据体之后)。
📌 示例
Trailer: Expires
表示**Expires
首部会出现在数据体之后**。
6. Transfer-Encoding(传输编码)
用于指定报文的数据传输方式,常用于 分块传输(chunked transfer encoding)。
常见取值
值 | 作用 |
---|---|
chunked | 采用分块传输,数据被分成多个块,每个块包含长度前缀。 |
compress | 使用 compress 压缩数据。 |
deflate | 使用 deflate 压缩数据。 |
gzip | 使用 gzip 压缩数据。 |
📌 示例
Transfer-Encoding: chunked
表示使用分块传输,适用于无法预先知道响应大小的情况。
7. Upgrade(协议升级)
用于升级连接到更高版本的协议,如 WebSocket 或 HTTP/2。
📌 示例
Upgrade: websocket
表示升级到 WebSocket 协议。
8. Via(代理服务器信息)
用于跟踪代理或网关的信息,通常由代理服务器添加,表明请求经过的服务器路径。
📌 示例
Via: 1.1 proxy1, 1.0 proxy2
表示请求经过了 proxy1(HTTP/1.1)和 proxy2(HTTP/1.0) 两个代理。
9. Warning(警告信息)
提供额外的警告信息,通常与缓存相关。
常见格式
Warning: <warn-code> <warn-agent> "<warn-text>" [date]
warn-code | 作用 |
---|---|
110 | 响应可能已过期 |
111 | 重新验证失败 |
112 | 代理服务器检测到网络拥塞 |
199 | 其它警告 |
📌 示例
Warning: 110 Response is stale
表示响应可能已过期。
10. Content-Encoding(内容编码)
用于指示响应内容的编码方式,常用于数据压缩。
常见取值
值 | 作用 |
---|---|
gzip | 使用 GZIP 压缩。 |
deflate | 使用 DEFLATE 压缩。 |
br | 使用 Brotli 压缩(HTTP/2 支持)。 |
📌 示例
Content-Encoding: gzip
表示响应数据经过 GZIP 压缩。
11. Content-Language(内容语言)
指定响应正文的语言,有助于多语言支持。
📌 示例
Content-Language: en-US
表示内容是美式英语。
12. Content-Length(内容长度)
用于指示消息体的字节长度(单位:字节)。
📌 示例
Content-Length: 348
表示正文长度为 348 字节。
13. Content-Type(内容类型)
用于指明响应的 MIME 类型。
📌 示例
Content-Type: text/html; charset=UTF-8
表示返回 HTML 内容,使用 UTF-8 编码。
14. Content-Location(内容地址)
指定资源的可替代位置,与 Location
不同,它不会重定向。
📌 示例
Content-Location: /backup/index.html
表示备选资源路径。
15. Content-Range(内容范围)
用于部分内容传输(如断点续传)。
📌 示例
Content-Range: bytes 200-1000/67589
表示返回的内容是第 200-1000 字节,文件总大小为 67589 字节。
总结
首部字段 | 作用 |
---|---|
Cache-Control | 控制缓存 |
Connection | 连接管理 |
Date | 报文发送时间 |
Pragma | 兼容旧版缓存控制 |
Trailer | 指定 chunked 传输的尾部字段 |
Transfer-Encoding | 传输编码 |
Upgrade | 连接升级(如 WebSocket) |
Via | 代理服务器信息 |
Warning | 警告信息 |
Content-Encoding | 响应内容编码 |
Content-Language | 内容语言 |
Content-Length | 正文长度 |
Content-Type | 正文 MIME 类型 |
Content-Location | 资源的替代位置 |
Content-Range | 部分内容范围 |
这些通用首部字段适用于HTTP 请求和响应,用于控制连接、缓存、编码、内容信息等。