HTTP 协议版本的发展总结

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广泛的网络协议之一,它定义了客户端和服务器之间交换信息的格式和规范。

HTTP协议的主要特点

  • 支持客户-服务器模式 - 遵循经典的“客户端-服务端”模型(客户端发送请求,服务器返回响应)。
  • 无状态 - HTTP协议是无状态的协议,但可以通过诸如Cookie、Session等机制在无状态的连接上实现状态的维护。此外,HTTP允许传输任意类型的数据对象,只需在Content-Type头部中正确指示数据类型。
  • 无连接 - 每完成一个请求就断开连接(HTTP/1.1 后默认开启长连接)。
  • 可扩展 - 客户端和服务器都可以通过HTTP头部扩展协议的功能。例如,可以定义新的状态码、请求方法或者自定义头部。
  • 可靠传输 - HTTP协议基于TCP/IP协议,因此继承了TCP的可靠性。客户端和服务器之间的通信基于TCP连接,保证数据的可靠传输。

HTTP/0.9

发布时间

1991年

特点

  • 只有一个命令:GET
  • 没有请求头和元数据,仅支持HTML格式的内容。
  • 服务器发送完数据后,立即关闭TCP连接。

应用

用于最简单的文档检索,由于缺乏扩展性,很快被后续版本替代。

HTTP/1.0

发布时间

1996年5月(RFC 1945)

新增特性

  • 引入了请求方法POSTHEAD
  • 标头(Headers)的添加允许传输元数据(例如Content-Type)。
  • 响应状态代码的引入(200 OK,404 Not Found等)。
  • 支持多种类型的数据传输,不局限于HTML。
  • 每次交互完成后都会关闭连接。

应用

相较于HTTP/0.9,HTTP/1.0具有更好的扩展性和灵活性,可以传输多种类型的数据。但连接无复用,每次请求都需要重新建立连接,效率较低。

HTTP/1.1

发布时间

1997年1月(RFC 2068),有数次后续更新

新增特性

  • 长连接(Connection: keep-alive):支持在一个TCP连接中发送、接收多个HTTP请求/响应,减少了TCP连接的建立和关闭次数。
  • 管线化(Pipelining):允许在响应之前发送多个请求,以减少网络延迟。
  • 增加新的请求方法(OPTIONS、PUT、DELETE等)。
  • 分块传输编码(Chunked transfer encoding)。
  • 缓存控制(Cache-Control)。
  • 错误通知更加详细。
  • Host头的引入,允许一台服务器上托管多个域名(虚拟主机)。

在 HTTP/1.0 中,每个域名绑定了一个唯一的 IP 地址,因此一个服务器只能支持一个域名。但是随着虚拟主机技术的发展,需要实现在一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,这些单独的域名都公用同一个 IP 地址。

因此,HTTP/1.1 的请求头中增加了 Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。

应用

HTTP/1.1是目前使用最广泛的HTTP版本,它大幅提高了Web性能和可靠性。大多数现代Web应用都会利用其特性来提升体验。

HTTP/2.0

发布时间

2015年5月(RFC 7540)

新增特性

  • 二进制格式:HTTP/2采用二进制而非文本格式传输数据,提高了解析效率(头信息和数据体都是二进制)。
  • 多路复用(Multiplexing):在同一个连接中同时并行传输多个请求/响应,提高了带宽的使用效率。
  • 服务器推送(Server Push):服务器可以未经请求发送资源到客户端,提前填充客户端的缓存。
  • 头部压缩(Header Compression):使用HPACK算法减少头部大小,降低延迟。
  • 请求优先级。

应用

HTTP/2建立在HTTP/1.1的基础上,通过优化传输性能和效率,大幅提高网页加载速度。现代浏览器和服务器大多支持HTTP/2。

HTTP/3.0

发布时间

正式作为标准发布在2022年6月,称为RFC 9114。

特性

  • 基于QUIC协议:HTTP/3使用QUIC协议,基于UDP实现类似TCP的传输功能,支持流量控制、传输可靠性以及多路复用,还包括TLS 1.3。

  • 减少连接延迟:因为QUIC协议包含了TLS的握手,所以它减少了握手的次数,这让QUIC比基于TCP的HTTP/2连接快,特别是在建立新连接时。

  • 内置加密:TLS 1.3与QUIC是结合在一起的,使得传输数据更加安全。

  • 多路复用:与HTTP/2类似,但更为先进的多路复用,每个流都是独立的,排队的延迟小封包阻塞不会影响其他大封包。

  • 连接迁移和重新恢复:持久化连接ID允许即使用户的IP地址发生变化,连接仍能继续。

  • 改进的拥塞控制:因为QUIC在针对丢包和网络拥塞的控制方面有其自己的机制,因此HTTP/3包含了更灵活的拥塞控制算法。

  • 降低队头阻塞:即使一个数据流被阻塞,其他独立的流也可以继续发送数据。

应用

HTTP/3提供了通过网络进行通信的改进方式,特别在移动环境和恶劣的网络条件下表现优越,它现在被越来越多的浏览器和在线服务支持。尤其是在无线网络、网络切换场景下,HTTP/3可以提供更加顺滑的用户体验。

局限性

  • 新协议支持:要充分利用HTTP/3的好处,网络设备如路由器、防火墙和负载平衡器需要更新以支持QUIC协议。

  • 软件生态:尽管支持HTTP/2的设备需要调整来适应HTTP/3,很多现有的网络工具和库也需要更新来支持新协议。

  • 资源利用:QUIC基于UDP,虽然减少了延迟,但也引入了如何精确控制拥塞和流量的新挑战,这可能导致资源使用不如TCP时高效。

随着HTTP/3的逐步推广,我们可以预期这些问题会逐渐得到解决,它将为互联网用户带来更快、更可靠的通信体验。

HTTP/1.1的缺点

虽然HTTP/1.1为 Web 通信引入了多项改进,如持久连接和分块传输等,但它仍然存在一些限制和缺点,这些问题随着 Web 技术的发展成为了性能瓶颈。以下是HTTP/1.1的一些主要缺点:

对头阻塞(Head-of-Line Blocking)

HTTP/1.1的持久连接虽然减少了TCP握手,但每个连接一次只能处理一个请求。如果当前的请求未完成,后续请求必须等待,这被称为队头阻塞。这意味着即便有可用的宽带,浏览器也不能同时下载多个资源。

不成熟的 HTTP 管线化

HTTP/1.1 中试图通过管线化的技术来解决队头阻塞的问题。HTTP/1.1 中的管线化是指将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。

FireFox、Chrome 都做过管线化的试验,但是由于各种原因,它们最终都放弃了管线化技术。

请求/响应头部无压缩

HTTP/1.1在每次请求和响应中发送文本形式的头部信息,这些信息通常在许多请求中重复,并且都未被压缩,从而导致不必要的数据传输和延迟。

限制的并发能力

为了避免对服务器造成过大的负载,浏览器通常会对同一主机并发的TCP连接数量做限制。因此,尽管用户的宽带容许更多的并发下载,但HTTP/1.1的并发能力受到这一限制的影响。

TCP慢启动

HTTP/1.1依赖于TCP来建立连接,并受其慢启动机制(Slow Start)的影响。新建立的连接在开始时无法充分利用可用宽带,因此响应时间随之增加。

不足的安全性能(非HTTP本身的问题)

在HTTP/1.1的原生规范中,并没有提供加密支持。虽然可以通过TLS/SSL(即为HTTPS)包装HTTP通信来提供安全性,但这又增加了握手阶段的时延。

为了解决以上问题,并提高网络通信的性能,HTTP/2被开发出来,引入了包括二进制传输、多路复用、头部压缩、服务器推送和请求优先级等新特性。随着技术的进步,HTTP/3基于全新的QUIC协议进一步提高了传输效率,解决了TCP协议的线头阻塞问题并减少了握手时延。

HTTP/2.0的缺点

需要更高的资源消耗

HTTP/2的二进制协议和多路复用机制虽然提高了性能,但它们也增加了服务器端处理请求的复杂性,相比HTTP/1.1,服务器需要更多的计算资源来管理流、优先级和并发资源。

安全性强制

虽然HTTP/2本身不要求加密,但大多数浏览器实现HTTP/2时,会要求使用TLS(通过HTTPS)。TLS加密带来了更好的安全性,但同时引入了额外的性能开销,尤其是对于低功耗设备和网络性能敏感的应用。

TCP队头阻塞问题依然存在

尽管HTTP/2对于同一域下的多个请求可以在单个TCP连接中多路复用,但如果底层TCP连接受到网络质量问题影响,整个HTTP/2连接上的所有流仍然会受到队头阻塞的影响。

加密协商和握手延迟

TLS加密需要独立的握手过程,在SSL/TLS协议层中存在非trivial的延迟。对于一些低延迟的应用场景,这可能成为性能瓶颈。

虽然HTTP/2已经成为当前Web通信的标准,但它在实现上述优化的同时,仍然在某些方面存在局限。继续演进的HTTP/3通过引入基于UDP的QUIC协议来克服其中的一些限制,特别是队头阻塞问题。

> cd ..