在上一篇我们了解到Streams and Multiplexing特性,针对单个域名只建立一个TCP连接,并且允许无限并发流。那么在流量有限的时候,或者需要优先响应某些资源的时候,就需要一个流优先级(Stream Priority)策略来管理这些流。
调整方式
HTTP/2.0支持两个帧来调整优先级:Header Frame、PRIORITY Frame。
Headers Frame
在Stream打开的时候,通过Header Frame(rfc7540#section-6.2)里初始化优先级。Header Frame帧的Payload格式如下:
+---------------+
|Pad Length? (8)|
+-+-------------+-----------------------------------------------+
|E| Stream Dependency? (31) |
+-+-------------+-----------------------------------------------+
| Weight? (8) |
+-+-------------+-----------------------------------------------+
| Header Block Fragment (*) ...
+---------------------------------------------------------------+
| Padding (*) ...
+---------------------------------------------------------------+
- Stream Dependency:表示依赖的流id。
- E: Exclusive,独占属性。
- Weight:权重。1-256。
PRIORITY Frame
通过PRIORITY Frame(rfc7540#section-6.3)重新排序优先级。PRIORITY Frame帧的Payload格式如下:
+-+-------------------------------------------------------------+
|E| Stream Dependency (31) |
+-+-------------+-----------------------------------------------+
| Weight (8) |
+-+-------------+
- Stream Dependency:表示依赖的流id。
- E: Exclusive,独占属性。
- Weight:权重。1-256。
如何调整
那么具体怎么调整呢?HTTP/2.0支持三种方式:Stream Dependencies、Exclusive、Dependency Weighting,接下来我们一个一个解释(rfc7540#section-5.3)。
Stream Dependencies
流依赖,即每个流可以被赋予对另一个流的显式依赖,依赖于另一个流的流是从属流,被依赖的流是父流。
如上图,流B、C分别依赖A,这时候D也依赖A,最终父流A优先,子流B、C、D其次,没有先后顺序。
Exclusive
独占属性,也就是让一个流变成父流的唯一子流,其他的子流全部依赖于当前流。
如上图,流B、C分别依赖A,这时候D也依赖A,设为独占,最终父流A优先,D作为唯一的子流,依赖A,B、C依赖D。
Dependency Weighting
依赖权重,为相关流分配了1到1之间的整数权重256(含),值越大,分配的资源占比越大。
如上图,流B、C分别依赖A,B的权重是4,C的权重是12,那么当A空闲的时候,B获得的资源
是C的1/3。
参考链接
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章