# 数据流

数据流（Streams）在QUIC中提供了一个轻量级、有序的字节流的抽象化。

QUIC中有两种基本的数据流类型：

* 从发起者到对等端（Peer）的单向数据流。
* 双向均可发出数据的双向数据流。

连接端点的任意一方都可以建立这两种数据流，数据流之间可并行、交错地传输，并且可以被取消。

通过QUIC发送数据需要建立一个或多个数据流。

## 流量控制（Flow control）

每个数据流都有独立的流量控制，端点可以通过此实现内存控制和反压（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层完成。
