客户端可以通过在打开流的HEADERS帧中包含优先次序信息来为一个新流指定优先级。在其它任意时间,可以使用PRIORITY帧来改变流的优先级。
优先次序的目的是允许端点表达希望对端在管理并发流的时候如何分配资源。更重要的是,当发送能力受限的时候,优先级能够用来选择流发送帧。
通过让流依赖其它流的完成,可以为流排列优先级。每个依赖都被分配了一个相对权重,即一个用来决定分配给依赖相同流的各个流的可用资源相对比例的数字。
显式地为一个流设置优先级是对一个优先级处理过程的输入,它不能保证这个流相对于其它流具有任何特定的处理和传输顺序。一个端点不能强迫对端使用优先级按照特定的顺序处理并发的多个流。因此,优先级的表达仅仅是一个建议。
优先级信息可以从消息中省略。如果没有提供优先级,那么就使用默认的优先级。
流依赖
每个流都可以显式地依赖其它流。依赖表达了希望优先分配资源给被依赖的流,而不是依赖其它流的流。
不依赖任何其它流的流被分配了值为0x0的依赖。也就是说,实际上并不存在的“流0”构成了依赖树的树根。
一个依赖其它流的流是“从属流”。一个被其它流依赖的流是“父亲流”。依赖当前树中不存在的流(例如,流的状态是“空闲”)会导致流被赋予默认的优先级。当依赖其它流时,当前的这个流就被添加为父亲流的一个新的依赖。共享相同的父亲流的各个从属流之间并没有固定的排序。例如,如果流B和流C依赖流A,并且,新创建的流D也依赖流A,那么结果就是,流A同时被流B、C和D依赖,但是,流B、C和D之间并没有确定的顺序。过程如下图所示:
A A
/ \