HTTP/1.X VS HTTP/2 VS HTTP/3

HTTP/2

HTTP/2 协议的主要目的是提高网页性能。

HTTP/2 与 HTTP/1.1 的区别:

  • 头信息(Header)原来是直接传输文本,现在是压缩后传输;
  • 原来是同一个 TCP 链接里面,上一个响应(Response)发送完了,服务器才能发送下一个,如果一个响应返回发生了延迟,那么其后续的响应都会被延迟,直到队头的响应送达。这就是所谓的HTTP队头阻塞。现在可以多个响应同时发送,HTTP/2 废弃了管道化的方式,而是创新性的引入了帧、消息和数据流等概念。客户端和服务器可以把 HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来,因为没有顺序了,所以就不需要阻塞了,就有效的解决了HTTP队头阻塞的问题;
  • HTTP/2 支持服务器推送,也就是服务器主动把各种资源推送给浏览器。比如,浏览器只请求了index.html,但是服务器把 index.html、style.css、example.png 全部发送给浏览器。这样的话,只需要一次 HTTP 通信,浏览器就得到了全部资源,提高了性能。

HTTP/3

HTTP/3 是即将到来的第三个主要版本的 HTTP 协议。与 HTTP/1.1 和 HTTP/2 不同,在 HTTP/3 中将弃用 TCP 协议,改为使用基于 UDP 协议的 QUIC 协议实现。QUIC(快速UDP网络连接)是一种实验性的网络传输协议,由Google 开发,该协议旨在使网页传输更快。

为什么弃用 TCP 协议改为 UDP 协议

TCP 这种可靠传输是靠三次握手实现的,TCP 三次握手的过程客户端和服务器之间需要交互三次,那么也就是说需要消耗 1.5 RTT。如果是 HTTPS 那么消耗的 RTT就更多。又因为很多中间设备比较陈旧,更新换代成本巨大,这就导致 TCP 协议升级或者采用新的协议基本无法实现,而传输层的协议除了 TCP 就是 UDP 了,所以就只能通过 UDP 进行改造了。

HTTP/3 主要为了解决 HTTP/2 中存在的队头阻塞问题。由于 HTTP/2 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。

HTTP 各版本的优化与问题

HTTP/1.1 的管道化持久连接使得同一个 TCP 链接可以被多个 HTTP 使用,但是HTTP/1.1 中规定一个域名可以有 6 个TCP连接。而 HTTP/2 中,同一个域名只使用一个TCP 连接。所以,在HTTP/2中,TCP 队头阻塞造成的影响会更大,因为 HTTP/2 的多路复用技术使得多个请求其实是基于同一个 TCP 连接的,那如果某一个请求造成了TCP 队头阻塞,那么多个请求都会受到影响。
虽然 HTTP/2 解决了 HTTP 队头阻塞问题,但是 HTTP/2 仍然会存在 TCP 队头阻塞的问题,因为 HTTP/2 其实还是依赖 TCP 协议实现的。TCP 传输过程中会把数据拆分为一个个按照顺序排列的数据包,这些数据包通过网络传输到了接收端,接收端再按照顺序将这些数据包组合成原始数据,这样就完成了数据传输。但是如果其中的某一个数据包没有按照顺序到达,接收端会一直保持连接等待数据包返回,这时候就会阻塞后续请求。这就发生了 TCP 队头阻塞。

2019 年 9 月,HTTP/3 支持已添加到 Cloudflare 和 Google Chrome(Canary build)。Firefox Nightly 在 2019 年秋季之后添加支持。

截至 2021 年 6 月,HTTP/3 仍然是草案状态。

参考

  • https://network.51cto.com/art/202012/634943.htm
  • https://zh.wikipedia.org/zh-hans/HTTP/3

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注