http3.0

HTTP3 是在保持 QUIC 稳定性的同时使用 UDP 来实现高速度, 同时又不会牺牲 TLS 的安全性.

QUIC 是用来替代 TCP, SSL/TLS 的传输层协议, 在传输层之上还有应用层. 我们熟知的应用层协议有 HTTP, FTP, IMAP 等, 这些协议理论上都可以运行在 QUIC 上, 其中运行在 QUIC 之上的协议被称为 HTTP/3, 这就是 HTTP over QUIC 即 HTTP/3 的含义

  • ​​0RTT(就是数据包一来一回的时间消耗) 建立安全连接 ​​:基于 DH 秘钥交换算法,在第一个包就可以包含有效的应用数据,从而在连接延时有很大优势,可以节约数百毫秒的时间
  • RTT 包括三部分:往返传播时延、网络设备内排队时延、应用程序数据处理时延
  • 连接迁移 ​:http3.0 基于 UDP 实现,不依赖 TCP 五元组,QUIC 使用自己的 connection ID,即使网络五元组变化了,仍然可以维持连接。基于 QUIC 协议之下,我们在日常 wifi 和 4G 切换时,或者不同基站之间切换都不会重连,从而提高更好的体验
  • 队头阻塞问题 ​​:TCP 本身也有队头阻塞问题,QUIC 协议是基于 UDP 协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包影响范围非常小,从而解决队头阻塞问题。通俗来说就是:一个数据包影响了一堆数据包,它不来大家都走不了。
  • 新的拥塞机制 ​​:因为替换成 UDP 了,所以需要提供新实现的基于 UDP 的拥塞控制能力
  • 前向纠错 ​​:QUIC 每发送一组数据就对这组数据进行异或运算,并将结果作为一个 FEC 包发送出去,接收方收到这一组数据后根据数据包和 FEC 包即可进行校验和纠错。
  • 特性热插拔 ​​:因为核心能力都在用户态实现的,不依赖内核,调整拥塞控制算法等行为都变得更为简单
  • 前向安全问题 ​​: 前向安全指的是密钥泄漏也不会让之前加密的数据被泄漏,影响的只有当前数据,对之前的数据无影响。

补充:

  • QUIC 含义:Quick UDP Internet Connections 的缩写,直译为快速 UDP 互联网连接。

Http 2.0 和 http3.0 对比之前的版本, 分别做了哪些改进?

HTTP/2.0 的改进:

  1. 多路复用:HTTP/2.0 可以在一个TCP连接上同时发送多个请求和响应,从而避免了 HTTP/1.x 中的队头阻塞问题,提高了网络吞吐量和页面加载速度。
  2. 头部压缩:HTTP/2.0 使用HPACK算法对 HTTP 头部进行压缩,从而减少了网络传输的开销,提高了网络性能。
  3. 服务器推送:HTTP/2.0 支持服务器推送,即在客户端请求一个资源时,服务器可以主动推送其他相关资源给客户端,从而减少了网络延迟和页面加载时间。

HTTP/3.0 的改进:

  1. 基于 QUIC 协议:HTTP/3.0 使用基于UDP的QUIC协议来传输数据,相比于 TCP 协议,QUIC 协议可以提供更快的连接建立和传输速度,减少了网络延迟和丢包率。
  2. 集成了TLS加密:HTTP/3.0 集成了 TLS 加密,从而保护了网络传输的安全性。
  3. 0-RTT 连接:HTTP/3.0 支持0-RTT连接,即客户端可以在没有建立连接的情况下向服务器发送请求,从而进一步减少了网络延迟和页面加载时间。

HTTP 3.0 基于 udp 的话, 如何保证可靠的传输?

HTTP/3.0 基于 UDP 协议进行传输,相对于 TCP 协议,UDP 协议本身并不能提供可靠的传输,因为 UDP 协议不具备 TCP 协议的重传、拥塞控制等机制。但是 HTTP/3.0 在 UDP 协议的基础上,通过QUIC协议来实现可靠的传输,具体包括以下几个方面:

  1. 前向纠错(Forward Error Correction,FEC):HTTP/3.0 使用 FEC 技术来纠正数据包的丢失,即在发送数据包的同时,发送一些冗余数据,接收方可以利用这些冗余数据来还原丢失的数据包,从而提高数据的可靠性。
  2. 重传机制:HTTP/3.0 在 QUIC 协议中实现了自己的重传机制,即当发生数据包丢失或者损坏时,会进行重传,以确保数据的可靠传输。
  3. 拥塞控制:HTTP/3.0 基于 QUIC 协议实现了自己的拥塞控制机制,可以根据网络情况自适应地调整数据传输的速率,以避免网络拥塞和数据包丢失。

HTTP/3

HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。当这个连接中出现了丢包的情况,那就会导致 HTTP/2 的表现情况反倒不如 HTTP/1 了。

因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。但是对于 HTTP/1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。

Google 开发了一个基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3 上,当然 HTTP/3 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC,接下来我们就来学习关于这个协议的内容。

QUIC

UDP 协议虽然效率很高,但是并不是那么的可靠。QUIC 虽然基于 UDP,但是在原本的基础上新增了很多功能,比如多路复用、0-RTT、使用 TLS1.3 加密、流量控制、有序交付、重传等等功能。这里我们就挑选几个重要的功能学习下这个协议的内容。

多路复用

虽然 HTTP/2 支持了多路复用,但是 TCP 协议终究是没有这个功能的。QUIC 原生就实现了这个功能,并且传输的单个数据流可以保证有序交付且不会影响其他的数据流,这样的技术就解决了之前 TCP 存在的问题。

并且 QUIC 在移动端的表现也会比 TCP 好。因为 TCP 是基于 IP 和端口去识别连接的,这种方式在多变的移动端网络环境下是很脆弱的。但是 QUIC 是通过 ID 的方式去识别一个连接,不管你网络环境如何变化,只要 ID 不变,就能迅速重连上。

0-RTT

通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。

纠错机制

假如说这次我要发送三个包,那么协议会算出这三个包的异或值并单独发出一个校验包,也就是总共发出了四个包。

当出现其中的非校验包丢包的情况时,可以通过另外三个包计算出丢失的数据包的内容。

当然这种技术只能使用在丢失一个包的情况下,如果出现丢失多个包就不能使用纠错机制了,只能使用重传的方式了。

Last Updated:
Contributors: yiliang114