尽管 TCP 提供了可靠传输,但是它存在这些问题:

  • 协议栈由操作系统控制,应用既无法控制,也无法特制。

  • TCP 一条连接由 ip:port 四元组构成,这就导致网络迁移后需要重新握手。高速移动下这些开销很大。

  • TCP 进行多路复用时存在队头阻塞的问题。

  • 没有集成 TLS,需要先进行 TCP 握手,再进行 TLS 握手。

Quic 实现了基于 UDP 的可靠传输、多路复用和 TLS 1.3 集成,从而改善了这些问题。

基本结构

Quic 在 UDP 的基础上实现了多路复用,从而允许在一条 UDP 链路上建立多条连接。具体而言,其结构如下:

Diagram

Quic 在 stream 的级别上实施可靠传输,其基本原理(滑动窗口、流量控制和拥塞控制)和 TCP 基本一致。

Quic 不仅在 stream 上实施流控,同时允许在 connect 级别上控制整体的流量和 stream 数量。

握手

Diagram

这里需要注意,第三次握手不会阻塞数据发送,因此一共是 1 RTT。

双向认证

TODO

流量控制

流量控制限制了发送端可以发送的数据量。流控分为两个级别:

  • Stream flow control。限制可单个流可以发送的数据量。

  • Connection flow control。限制了链接中所有流可以发送的数据量。

发送端发送的数据量不得超过流控的限制。否则接收端需要关闭连接,并产生FLOW_CONTROL_ERROR

流控的参数由握手时进行协商,之后 发送端 可以主动发送 MAX_STREAM_DATAMAX_DATA 帧来提升限制。

  • MAX_STREAM_DATA 和 MAX_DATA 的值可以小于之前的值,但是没有效果

  • Quic 规范并没有规定 MAX_STREAM_DATA 和 MAX_DATA 的发送策略,而是将这部分内容留给了实现。

Last moify: 2025-01-30 08:48:23
Build time:2025-07-18 09:41:42
Powered By asphinx