尽管 TCP 提供了可靠传输,但是它存在这些问题:
协议栈由操作系统控制,应用既无法控制,也无法特制。
TCP 一条连接由 ip:port 四元组构成,这就导致网络迁移后需要重新握手。高速移动下这些开销很大。
TCP 进行多路复用时存在队头阻塞的问题。
没有集成 TLS,需要先进行 TCP 握手,再进行 TLS 握手。
Quic 实现了基于 UDP 的可靠传输、多路复用和 TLS 1.3 集成,从而改善了这些问题。
基本结构
Quic 在 UDP 的基础上实现了多路复用,从而允许在一条 UDP 链路上建立多条连接。具体而言,其结构如下:
Quic 在 stream 的级别上实施可靠传输,其基本原理(滑动窗口、流量控制和拥塞控制)和 TCP 基本一致。
Quic 不仅在 stream 上实施流控,同时允许在 connect 级别上控制整体的流量和 stream 数量。
握手
这里需要注意,第三次握手不会阻塞数据发送,因此一共是 1 RTT。
双向认证
TODO
流量控制
流量控制限制了发送端可以发送的数据量。流控分为两个级别:
Stream flow control。限制可单个流可以发送的数据量。
Connection flow control。限制了链接中所有流可以发送的数据量。
发送端发送的数据量不得超过流控的限制。否则接收端需要关闭连接,并产生FLOW_CONTROL_ERROR。
流控的参数由握手时进行协商,之后 发送端 可以主动发送 MAX_STREAM_DATA 或 MAX_DATA 帧来提升限制。
|