HTTP/1.1、HTTP/2、HTTP/3 报文示例
HTTP/1.1 vs HTTP/2 vs HTTP/3 的报文/帧示例对比(HTTP/2/3 以逻辑表示说明)。
#type / concept
#status / growing
#resource / http
#tech / network
#protocol / http
[!info] related notes
- 所属 MOC: http-and-frontend-networking-moc
- 语义总览: http
- 版本对比: http1-http2, HTTP/3
HTTP/1.1、HTTP/2、HTTP/3 报文示例
下面分别给出 HTTP/1.1、HTTP/2、HTTP/3 的“标准报文示例”。
先说一个关键点:
- HTTP/1.1:报文是纯文本,可以直接看到请求行、响应行、头部、空行、消息体。
- HTTP/2 / HTTP/3:不是文本报文,而是二进制帧传输;因此实际“线上的报文”不能像 HTTP/1.1 那样直接写成纯文本。通常我们会写它们的逻辑头字段表示(如
:method、:path),再说明它们会被编码进帧里。
1. HTTP/1.1 标准报文示例
1) 请求报文示例
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/8.0.1
Accept: text/html
Connection: keep-alive
结构说明:
GET /index.html HTTP/1.1:请求行Host、User-Agent、Accept:请求头- 空行:头部结束
- GET 一般没有消息体
2) 响应报文示例
HTTP/1.1 200 OK
Date: Fri, 13 Mar 2026 10:00:00 GMT
Server: nginx/1.24.0
Content-Type: text/html; charset=utf-8
Content-Length: 125
<html>
<head><title>Example</title></head>
<body>Hello HTTP/1.1</body>
</html>
结构说明:
HTTP/1.1 200 OK:状态行- 后面是响应头
- 空行后是响应体
2. HTTP/2 标准报文示例
HTTP/2 在线上传输时不是下面这种纯文本,而是:
- HEADERS 帧
- DATA 帧
- 以及其他控制帧(SETTINGS、WINDOW_UPDATE 等)
所以通常写成“逻辑上的请求/响应头”。
1) 请求报文示例(逻辑表示)
:method: GET
:scheme: https
:authority: www.example.com
:path: /index.html
user-agent: curl/8.0.1
accept: text/html
这在 HTTP/2 中会被编码到 HEADERS 帧 里。
注意:
- HTTP/2 没有
Host请求头作为核心路由字段,改为伪首部:authority - HTTP/2 必须先出现伪首部字段:
:method:scheme:authority:path
2) 响应报文示例(逻辑表示)
:status: 200
date: Fri, 13 Mar 2026 10:00:00 GMT
server: nginx/1.24.0
content-type: text/html; charset=utf-8
content-length: 125
后续响应体会放在 DATA 帧 中,例如逻辑上相当于:
<html>
<head><title>Example</title></head>
<body>Hello HTTP/2</body>
</html>
3) HTTP/2 更接近实际传输的示意
HEADERS frame
:method = GET
:scheme = https
:authority = www.example.com
:path = /index.html
user-agent = curl/8.0.1
accept = text/html
DATA frame
(empty for GET)
响应:
HEADERS frame
:status = 200
date = Fri, 13 Mar 2026 10:00:00 GMT
content-type = text/html; charset=utf-8
DATA frame
<html>...</html>
3. HTTP/3 标准报文示例
HTTP/3 的语义和 HTTP/2 很像,但底层不再是 TCP,而是 QUIC。
因此 HTTP/3 也不是文本报文,而是:
- 运行在 QUIC 流之上
- 头部仍然是伪首部字段
- 头部压缩从 HTTP/2 的 HPACK 变成了 QPACK
1) 请求报文示例(逻辑表示)
:method: GET
:scheme: https
:authority: www.example.com
:path: /index.html
user-agent: curl/8.0.1
accept: text/html
2) 响应报文示例(逻辑表示)
:status: 200
date: Fri, 13 Mar 2026 10:00:00 GMT
server: nginx/1.24.0
content-type: text/html; charset=utf-8
content-length: 125
响应体逻辑上仍然类似:
<html>
<head><title>Example</title></head>
<body>Hello HTTP/3</body>
</html>
3) HTTP/3 更接近实际传输的示意
QUIC stream
HEADERS frame
:method = GET
:scheme = https
:authority = www.example.com
:path = /index.html
user-agent = curl/8.0.1
accept = text/html
响应:
QUIC stream
HEADERS frame
:status = 200
date = Fri, 13 Mar 2026 10:00:00 GMT
content-type = text/html; charset=utf-8
DATA frame
<html>...</html>
三者对比总结
HTTP/1.1
能直接写成完整原始报文:
GET /index.html HTTP/1.1
Host: www.example.com
HTTP/2
实际是二进制帧,通常写逻辑头:
:method: GET
:scheme: https
:authority: www.example.com
:path: /index.html
HTTP/3
也是二进制传输,只是底层换成 QUIC,逻辑头形式与 HTTP/2 很接近:
:method: GET
:scheme: https
:authority: www.example.com
:path: /index.html
一句最容易考的区别
- HTTP/1.1:文本报文,基于 TCP
- HTTP/2:二进制分帧,基于 TCP
- HTTP/3:二进制分帧,基于 QUIC(UDP)
如果你愿意,我可以接着给你整理一版 “HTTP/1.1 / 2 / 3 报文格式对比表”,适合背诵和考试。