第三章 双向流(Stream)
建立 Session 后,可通过 Session 发送与接收数据。但是有种情况会导致接收端暂时的阻塞,如果某个序号的数据包没有收到或者没有接收完整,不能向上层应用程序交付,该序号之后的数据包暂时也不能交付,即使已经接收完成。因为无法判断后面数据包和当前造成阻塞的数据包之间的关系,如果有依赖关系,阻塞后面数据包的消费是必须的,否则会造成数据无法正确解析。如果没有依赖关系,阻塞后面数据包的消费会造成不必要的传输性能下降。
双向流(Stream)是为解决此问题而设计的,当 Session 进入 READY 状态后,可由客户端发起请求打开一个 Stream,客户端与服务端经过三次握手后成功创建流,并分别向上层应用程序返回 Stream 对象,持有 Stream 对象后可双向发送数据。
双向 Stream 的打开数量是不限制的,上层应用程序中大部分数据交互是独立的,适合通过创建不同的 Stream 发送与接收,避免不必要的阻塞。当数据传输完成时,上层应用程序可以自行决定关闭 Stream 的时机。除非 Stream 的两端主动关闭,Stream 不会自己关闭,占用的资源不会释放。因此,及时关闭 Stream 是上层应用程序的责任。
每个 Stream 由唯一 ID 标识,是客户端生成的一个4字节长无符号整数,后面通过该 Stream 发送的帧都要携带 Stream ID。