HTTP/1.0 和 HTTP/1.1 是两个不同版本的 HTTP 协议。虽然它们的核心功能都是提供网页数据传输,但 HTTP/1.1 对 HTTP/1.0 做了很多改进,提升了性能和灵活性。以下是它们的主要区别:
1. 持久连接(Persistent Connection)
-
HTTP/1.0:
- 默认情况下,每次请求都会建立一个新的 TCP 连接。服务器在发送完响应后会关闭连接。
- 这意味着每次请求都需要进行三次握手来建立 TCP 连接,增加了网络开销,尤其是当一个网页包含多个资源(图片、CSS、JS 文件)时。
-
HTTP/1.1:
- 支持 持久连接(Persistent Connection),也称为 连接复用,即可以在同一个 TCP 连接上发送多个 HTTP 请求,减少了建立和关闭连接的开销。
- 默认情况下,HTTP/1.1 使用持久连接,除非客户端或服务器通过
Connection: close
头部明确表示要关闭连接。
2. 管道化(Pipelining)
-
HTTP/1.0:
- 不支持请求管道化。客户端必须等待一个请求响应完毕后,才能发送下一个请求。
-
HTTP/1.1:
- 引入了 管道化,允许客户端在收到上一个请求的响应之前发送多个请求,这可以减少网络延迟。但实际应用中,管道化由于队头阻塞(Head-of-line blocking)问题和浏览器兼容性问题,并没有被广泛使用。
3. 缓存控制
-
HTTP/1.0:
- 缓存机制较为简单,使用
Expires
头部字段来标识资源的过期时间。
- 缓存机制较为简单,使用
-
HTTP/1.1:
- 引入了更多的缓存控制头部,如
Cache-Control
,用于指定缓存的行为。Cache-Control
支持诸如no-cache
、no-store
、must-revalidate
、max-age
等指令,提供了更精细的缓存控制。 - 还引入了
ETag
(实体标签),用来标识资源的版本,结合If-Modified-Since
和If-None-Match
头部,进一步优化缓存机制。
- 引入了更多的缓存控制头部,如
4. 带宽优化与传输编码
-
HTTP/1.0:
- 不支持分块传输编码。服务器在发送响应时必须确定内容的长度,并通过
Content-Length
头部发送。
- 不支持分块传输编码。服务器在发送响应时必须确定内容的长度,并通过
-
HTTP/1.1:
- 引入了 分块传输编码(Chunked Transfer Encoding),允许服务器在不知道响应完整长度的情况下,逐块(chunk)传输数据。这在服务器生成动态内容或大文件传输时非常有用。
- 分块传输编码通过
Transfer-Encoding: chunked
头部实现,允许数据边生成边传输,提高了传输效率。
5. 状态码的扩展
-
HTTP/1.0:
- 状态码较为简单,只定义了一些基础的状态码,如 200(OK)、404(Not Found)、500(Internal Server Error)等。
-
HTTP/1.1:
- 引入了更多的状态码,如:
- 100 Continue:客户端发送请求头,服务器确认可以继续发送请求体。
- 206 Partial Content:用于表示部分内容响应,支持范围请求,这对于断点续传很有帮助。
- 409 Conflict 和 410 Gone 等,增加了服务器响应的语义。
- 引入了更多的状态码,如:
6. Host 头的引入
-
HTTP/1.0:
- 不强制要求
Host
头部,意味着在 HTTP/1.0 中,服务器无法根据同一个 IP 地址上的不同域名来区分虚拟主机。因此,每个域名都需要有一个独立的 IP 地址。
- 不强制要求
-
HTTP/1.1:
- 强制要求所有请求都包含
Host
头部,这使得服务器可以在同一个 IP 地址上托管多个虚拟主机(即虚拟主机支持)。这大大降低了对 IP 地址的需求。
- 强制要求所有请求都包含
7. 错误处理改进
-
HTTP/1.0:
- 对错误处理机制较为简单,不能很好地处理长时间传输的错误。
-
HTTP/1.1:
- 改进了对错误的处理,支持更细粒度的错误码和报文。例如,对于客户端发送的大型请求或长时间的上传,如果发生错误,服务器可以立即响应错误码,而无需等待整个请求传输完毕。
8. OPTIONS 方法与其他方法支持
-
HTTP/1.0:
- 支持的请求方法较少,通常包括 GET、POST 和 HEAD。
-
HTTP/1.1:
- 引入了更多的 HTTP 方法,例如:
- OPTIONS:用于请求服务器支持的请求方法。
- PUT:用于向指定资源上传内容。
- DELETE:用于删除指定资源。
- TRACE:用于调试的回声请求。
- 引入了更多的 HTTP 方法,例如:
9. 请求和响应的长度限制
-
HTTP/1.0:
- 对请求头的长度和请求 URI 的长度没有明确的规定,依赖于服务器的实现。
-
HTTP/1.1:
- 对请求头和 URI 的长度做了一定的规定,通常客户端和服务器都会有合理的限制,避免超长的 URI 或请求头导致问题。
10. 代理和中介的支持
- HTTP/1.1:
- 引入了更多关于代理、缓存和网关等中间实体的支持,如
Via
和Upgrade
头部字段,使得客户端和服务器能够更好地协作处理代理和缓存。
- 引入了更多关于代理、缓存和网关等中间实体的支持,如
总结:
- HTTP/1.0 主要设计为单请求单响应的简单通信协议,不支持持久连接、分块传输等优化机制,效率相对较低。
- HTTP/1.1 提供了大量改进,支持持久连接、管道化传输、分块传输编码、更多的状态码和方法、更丰富的缓存控制以及虚拟主机的支持,极大地提升了性能和网络资源的利用效率。
这些改进使得 HTTP/1.1 成为目前最广泛使用的 HTTP 协议版本,尽管现在 HTTP/2 和 HTTP/3 也在逐渐普及。