数据流(Streams)在QUIC中提供了一个轻量级、有序的字节流的抽象化。
QUIC中有两种基本的数据流类型:
-
从发起者到对等端(Peer)的单向数据流。
-
双向均可发出数据的双向数据流。
连接端点的任意一方都可以建立这两种数据流,数据流之间可并行、交错地传输,并且可以被取消。
通过QUIC发送数据需要建立一个或多个数据流。
每个数据流都有独立的流量控制,端点可以通过此实现内存控制和反压(back pressure)。数据流的创建本身也有流量控制,连接双方可以声明最多愿意创建几个流ID。
数据流通过一个无符号的62比特整数标识,也称流ID。流ID的最低2位比特用于识别流的类型(单向或双向)和流的发起者。
流ID的最低1位比特(0x1)用于识别流的发起者。客户端发起双数(最低位置0)流,服务器发起单数(最低位置1)流。
第2个比特(0x2)识别单/双向流。单向流始终置1,双向流则置0。
QUIC允许任意数量的并发流。端点通过闲置最大流ID来控制并发活动的传入流数量。
每个端点指定自己的最大流ID数,并只对对等端端点有效。
端点使用流来收发数据,这是流的最终用途。QUIC数据流是有序的字节流抽象。但是,不同流之间是无序的。
如果正确设置了各流的优先度,流复用机制可以显著提升应用的效率。使用其他多路复用协议(如HTTP/2)的经验表明,有效的优先度划分策略对效率具有显著的正面影响。
QUIC本身没有提供交换优先度信息的报文。接收优先度信息依赖于使用QUIC的应用层。应用层可以定义所有符合其语义的优先度方案。
基于QUIC使用HTTP/3时,优先度信息在HTTP层完成。