quic协议

2020/12/24 ComputerNetwork 共 1930 字,约 6 分钟

quic协议

QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP、TLS、HTTP/2等协议的可靠性与安全性,可以有效减少连接与传输延迟,更好地应对当前传输层与应用层的挑战。

QUIC协议是一系列协议的集合,主要包括:

  • 传输协议(Transport)
  • 丢包检测与拥塞控制(Recovery)
  • 安全传输协议(TLS)
  • HTTP3协议
  • HTTP头部压缩协议(QPACK)
  • 负载均衡协议(Load Balance)

QUIC是基于UDP协议,实现了类似TCP的可靠传输,并在此基础上,结合HTTP3/QPACK,更好地服务互联网上海量的HTTP Request/Response需求。

QUIC/HTTP3的特点:

  • 有序传输:用stream的概念,确保数据有序。不同的stream或者packet,不保证有序到达。
  • 报文压缩,提高荷载比率:比如QUIC引入了variable-length integer encoding。又比如引入QPACK进行头部压缩
  • 可靠传输:支持丢包检测和重传
  • 安全传输:TLS 1.3安全协议

为什么不用TCP

  • TCP由于基于操作系统内核实现,发展速度极慢,现有的TCP Fast Open实现等等虽然早已存在于标准中但是实际应用情况及其落后,即便除非所有机器的操作系统都更新到最新,否则考虑到兼容性不太可能大范围采用新技术。
  • QUIC直接基于客户端实现,而非基于系统内核(这点有点像最新的.Net Core),可以进行快速迭代更新,不需要操作系统内核层面的更改。

默认加密

  • 把tcp三次握手和tsl交换机制结合起来,更快

连接ID

用id替代 连接四元组,解决重连、中断之痛。

QUIC 是基于 UDP 协议的,任何一条 QUIC 连接不再以 IP 及端口四元组标识,而是以一个 64 位的随机数作为 ID 来标识,这样就算 IP 或者端口发生变化时,只要 ID 不变,这条连接依然维持着,上层业务逻辑感知不到变化,不会中断,也就不需要重连。

每个连接过程都有一组连接标识符,或称连接ID,该ID用以识别该连接。每个端点各自选择连接ID。每个端点选择其对等方使用的连接ID。

这些连接ID的主要功能是确保较低协议层(UDP、IP及其底层协议)的地址更改不会导致QUIC连接的数据包传递到错误的端点。

当用户的地址发生变化时,如 WIFI 切换到 4G 场景,基于 TCP 的 HTTP 协议无法保持连接的存活。QUIC 基于连接 ID 唯一识别连接。当源地址发生改变时,QUIC 仍然可以保证连接存活和数据正常收发。

建连

基于笛福赫尔曼密钥交换, DH算法,离散对数难题,双方交换公钥,根据对方的公钥和私钥,就可以算出一个密钥。

QUIC 由于基于 UDP,无需 TCP 连接,在最好情况下,短连接下 QUIC 可以做到 0RTT 开启数据传输。

握手过程见:https://cloud.tencent.com/developer/article/1802343

拥塞控制

QUIC 使用可插拔的拥塞控制,相较于 TCP,它能提供更丰富的拥塞控制信息。比如对于每一个包,不管是原始包还是重传包,都带有一个新的序列号(seq),这使得 QUIC 能够区分 ACK 是重传包还是原始包,从而避免了 TCP 重传模糊的问题。QUIC 同时还带有收到数据包与发出 ACK 之间的时延信息。这些信息能够帮助更精确的计算 RTT。

QUIC 的传输控制不再依赖内核的拥塞控制算法,而是实现在应用层上,这意味着我们根据不同的业务场景,实现和配置不同的拥塞控制算法以及参数。Google 提出的 BBR 拥塞控制算法与 CUBIC 是思路完全不一样的算法,在弱网和一定丢包场景,BBR 比 CUBIC 更不敏感,性能也更好。在 QUIC 下我们可以根据业务随意指定拥塞控制算法和参数,甚至同一个业务的不同连接也可以使用不同的拥塞控制算法。

无队头阻塞

img

QUIC 使用 Stream ID 来标识当前数据流属于哪个资源请求,这同时也是数据包多路复用传输到接收端后能正常组装的依据。重传的数据包 Packet N+M 和丢失的数据包 Packet N 单靠 Stream ID 的比对一致仍然不能判断两个数据包内容一致,还需要再新增一个字段 Stream Offset,标识当前数据包在当前 Stream ID 中的字节偏移量。

有了 Stream Offset 字段信息,属于同一个 Stream ID 的数据包也可以乱序传输了(HTTP/2 中仅靠 Stream ID 标识,要求同属于一个 Stream ID 的数据帧必须有序传输),通过两个数据包的 Stream ID 与 Stream Offset 都一致,就说明这两个数据包的内容一致。

缺点

  • 运营商对udp限制
  • 运行在用户态,性能不如tcp

参考

Search

    Table of Contents