http 各版本的差异
HTTP(HyperText Transfer Protocol)是一种应用层协议,用于在客户端和服务器之间传输超文本(如 HTML 页面)。HTTP 协议经历了多个版本的演进,每个版本都有其特点和改进。以下是 HTTP 各个版本的详细描述及其报文结构:
1. HTTP/0.9
1.1 概述
- HTTP/0.9 是 HTTP 协议的第一个版本,发布于 1991 年。
- 它非常简单,只支持
GET方法,并且没有头部字段。
1.2 报文结构
-
请求报文:
GET /index.html- 只有一行,包含
GET方法和请求的资源路径。
- 只有一行,包含
-
响应报文:
<HTML> <HEAD>...</HEAD> <BODY>...</BODY> </HTML>- 响应报文只包含 HTML 内容,没有状态码和头部字段。
1.3 特点
- 简单:只支持
GET方法,没有头部字段。 - 无状态:每次请求都是独立的,服务器不保存客户端的状态。
2. HTTP/1.0
2.1 概述
- HTTP/1.0 发布于 1996 年,是 HTTP/0.9 的扩展版本。
- 它引入了头部字段、状态码、多种请求方法(如
POST、HEAD)和内容类型(如Content-Type)。
2.2 报文结构
-
请求报文:
GET /index.html HTTP/1.0 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html- 请求行:包含方法、资源路径和协议版本。
- 头部字段:包含
Host、User-Agent、Accept等信息。
-
响应报文:
HTTP/1.0 200 OK Content-Type: text/html Content-Length: 1234 <HTML>...</HTML>- 状态行:包含协议版本、状态码和状态描述。
- 头部字段:包含
Content-Type、Content-Length等信息。 - 响应体:包含实际的 HTML 内容。
2.3 特点
- 头部字段:引入了头部字段,支持更多的元数据。
- 状态码:引入了状态码,如
200 OK、404 Not Found。 - 内容类型:支持多种内容类型,如
text/html、image/jpeg。
3. HTTP/1.1
3.1 概述
- HTTP/1.1 发布于 1999 年,是 HTTP/1.0 的改进版本。
- 它引入了持久连接、分块传输编码、缓存控制等特性。
3.2 报文结构
-
请求报文:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html Connection: keep-alive- 请求行:包含方法、资源路径和协议版本。
- 头部字段:包含
Host、User-Agent、Accept、Connection等信息。
-
响应报文:
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1234 Connection: keep-alive <HTML>...</HTML>- 状态行:包含协议版本、状态码和状态描述。
- 头部字段:包含
Content-Type、Content-Length、Connection等信息。 - 响应体:包含实际的 HTML 内容。
3.3 特点
- 持久连接:默认使用持久连接,减少连接建立和关闭的开销。
- 分块传输编码:支持分块传输编码,允许服务器逐步发送数据。
- 缓存控制:引入了
Cache-Control头部字段,支持更灵活的缓存策略。
4. HTTP/2
4.1 概述
- HTTP/2 发布于 2015 年,是 HTTP/1.1 的改进版本。
- 它引入了二进制分帧、多路复用、头部压缩等特性,提高了性能和效率。
4.2 报文结构
-
请求报文:
:method: GET :scheme: https :authority: www.example.com :path: /index.html user-agent: Mozilla/5.0 accept: text/html- 请求行被替换为伪头部字段,如
:method、:scheme、:authority、:path。 - 头部字段使用 HPACK 压缩算法进行压缩。
- 请求行被替换为伪头部字段,如
-
响应报文:
:status: 200 content-type: text/html content-length: 1234- 状态行被替换为伪头部字段
:status。 - 头部字段使用 HPACK 压缩算法进行压缩。
- 状态行被替换为伪头部字段
4.3 特点
- 二进制分帧:将报文分解为二进制帧,提高传输效率。
- 多路复用:允许在同一个连接上并行传输多个请求和响应。
- 头部压缩:使用 HPACK 压缩算法减少头部字段的大小。
- 服务器推送:允许服务器主动向客户端推送资源。
5. HTTP/3
5.1 概述
- HTTP/3 发布于 2022 年,是 HTTP/2 的改进版本。
- 它基于 QUIC 协议,使用 UDP 代替 TCP,进一步提高了性能和安全性。
5.2 报文结构
-
请求报文:
:method: GET :scheme: https :authority: www.example.com :path: /index.html user-agent: Mozilla/5.0 accept: text/html- 请求行被替换为伪头部字段,如
:method、:scheme、:authority、:path。 - 头部字段使用 QPACK 压缩算法进行压缩。
- 请求行被替换为伪头部字段,如
-
响应报文:
:status: 200 content-type: text/html content-length: 1234- 状态行被替换为伪头部字段
:status。 - 头部字段使用 QPACK 压缩算法进行压缩。
- 状态行被替换为伪头部字段
5.3 特点
- 基于 QUIC:使用 UDP 代替 TCP,减少连接建立和重传的开销。
- 多路复用:允许在同一个连接上并行传输多个请求和响应。
- 头部压缩:使用 QPACK 压缩算法减少头部字段的大小。
- 安全性:默认使用 TLS 1.3 加密,提高安全性。
6. 总结
| 版本 | 特点 | 报文结构 |
|---|---|---|
| HTTP/0.9 | 简单,只支持 GET 方法,没有头部字段 | 请求:GET /index.html响应:HTML 内容 |
| HTTP/1.0 | 引入头部字段、状态码、多种请求方法、内容类型 | 请求:请求行 + 头部字段 响应:状态行 + 头部字段 + 响应体 |
| HTTP/1.1 | 持久连接、分块传输编码、缓存控制 | 请求:请求行 + 头部字段 响应:状态行 + 头部字段 + 响应体 |
| HTTP/2 | 二进制分帧、多路复用、头部压缩、服务器推送 | 请求:伪头部字段 + 压缩头部 响应:伪头部字段 + 压缩头部 |
| HTTP/3 | 基于 QUIC,使用 UDP,多路复用,头部压缩,默认使用 TLS 1.3 | 请求:伪头部字段 + 压缩头部 响应:伪头部字段 + 压缩头部 |
HTTP 协议的演进不断提高了性能、效率和安全性,HTTP/3 是目前最新的版本,基于 QUIC 协议,进一步优化了传输性能。