HTTP/3 协议:提升网络性能与解决传输层问题
HTTP/3 协议:提升网络性能与解决传输层问题
HTTP/3 由互联网工程任务组 (IETF),在 2022 年 6 月作为 RFC 9114 提议的标准发布
为什么需要新协议
HTTP/2 在数据传输阶段,虽然在应用层多个请求可以同时发送,但是传输层 TCP 协议要求数据包必须按顺序串行传输。
如果其中一个数据包丢失或者延迟,后续的数据包就需要等待重传,或者等待前面数据包传输完成后才能发送,也就是说队头阻塞问题并没有彻底解决。
由此可得,HTTP/2 主要性能瓶颈在传输层 TCP 协议。
TCP 协议解决方案
TCP 协议升级 (×)
为了解决上述问题,有 2 个升级 TCP 协议的方案
- Fast Open:缩短连接建立时间
- BBR 算法:避免拥塞和队头阻塞
但是 TCP 协议被广泛内置于操作系统内核、中间件固件以及硬件实现中,这些系统和设备都需要进行代码更新、测试和部署,才能支持新的 TCP 协议改进版本。
这个过程需要花费大量时间和精力,并且需要保证向后兼容性,以确保老版本的 TCP 协议和新版本 TCP 协议,可以共存于同一个网络中。
TCP 协议更换 UDP 协议 (×)
另一个方案解决是换一种传输层协议,可替换的 UDP 协议是一种无连接,不可靠的协议,不能解决 HTTP 的问题。
QUIC 协议的发布
Google 发布一个基于 UDP 应用层的传输协议,叫做 QUIC 协议 (Quick UDP Internet Connections)
它在用户空间实现类似 TCP 的流量控制、拥塞控制和重传机制等功能,从而提供可靠的数据传输,它的设计目的是替代 TCP,开发一种更灵活、更高性能的传输协议。
HTTP/3 的 QUIC 协议
基于 UDP 协议开发的原因
- 避免重新部署和更新网络设备和系统:UDP 协议已经被广泛部署在现有的网络设备和系统中,可以在不影响现有网络设备和系统的情况下,逐步推广和普及
- UDP 协议速度快,低延迟:由于 UDP 协议非常简单和轻量,它具有很快的速度,可以实现很好的网络性能
HTTP/3 使用 QUIC 协议
HTTP/3 使用 QUIC 协议替代传输层 TCP 协议,它的主要目的是使 HTTP 语法和现有 HTTP/2 功能,与 QUIC 传输协议兼容
HTTP/3 协议特性
- 安全性高:
QUIC 集成 TLS v1.3 安全协议大部分特性,并使其兼容自身的传递机制,在传输层实现高级安全性。
在 HTTP/3 中,加密不是可选的,而是一项内置功能。
QUIC 保留了包含加密密钥的 TLS v1.3 内容层,但用自己的传输功能替换了记录层。
- 建立连接快:
HTTP/2 协议在建立连接阶段,TCP 三次握手,耗费 1 个 RTT,TLS1.2 完全握手耗费 2 个 RTT;使用 TLS1.3 后简化握手需要 1 个 RTT,所以使用 TCP+TLS 建立连接需要 2-3 个 RTT。
QUIC 基于 UDP,同时集成 TLS1.3,只需要 1 个 RTT 就可以完成安全连接的建立。
- 解决队头阻塞:
QUIC 存在 Connection 和 Stream 两个级别的概念,Stream 可以认为就是一条 HTTP 请求,Connection 可以类比一条 TCP 连接。
QUIC 多路复用和 HTTP2 类似,在一条 QUIC Connection 上可以同时发送多个 Stream,但是 QUIC 一个连接上的多个 Stream 之间相互独立没有依赖。
假如其中一个 Stream 丢包,也只会影响该 Stream 的处理,不会影响其他 Stream,这也就在很大程度上缓解,甚至消除队头阻塞的影响。
- 支持连接迁移:
一条 TCP 连接是由四元组标识 (源 IP,源端口,目的 IP,目的端口),在手机使用 WIFI 和 4G 移动网络切换时,IP 肯定会发生变化,就需要重新建立 TCP 连接。
一条 QUCI 连接不再以 IP 及端口四元组标识,而是以一个 64 位的随机数作为 ID 来标识,这样就算 IP 或者端口发生变化时,只要 ID 不变,这条连接依然维持。
- 避免协议僵化:
QUIC 协议是一个基于用户空间的协议,它的实现独立于操作系统内核,可以在应用层进行部署和更新,这使得 QUIC 协议更容易引入新的功能和改进
HTTP/3 弊端
- 网管难度大:由于 QUIC 加密级别高,相比于在报文中带有未加密元数据的 TCP,提供防火墙和网络跟踪服务变得更加困难,目前很多防火墙尚不支持 QUIC。
- UDP 会被网络阻止:UDP 经常被用于不同类型的网络攻击 (例如:DDoS 攻击),因为攻击者可以轻易伪造 IP 地址,发送大量 UDP 数据包,导致目标服务器过载,从而无法正常处理合法请求,因此一些网络会阻止 UDP 协议。
- UDP 丢包处理难度大:UDP 连接出现丢包情况,要交给应用层做重传处理,增大应用层复杂程度。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nero Blog!
评论