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

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:请求行
  • HostUser-AgentAccept:请求头
  • 空行:头部结束
  • 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 报文格式对比表”,适合背诵和考试。

创建于 2026/3/13 更新于 2026/5/27