老青菜

HTTP/2.0 Stream Priority

2019-06-13

在上一篇我们了解到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 (*)                       ...
    +---------------------------------------------------------------+
  1. Stream Dependency:表示依赖的流id。
  2. E: Exclusive,独占属性。
  3. Weight:权重。1-256。

PRIORITY Frame

通过PRIORITY Frame(rfc7540#section-6.3)重新排序优先级。PRIORITY Frame帧的Payload格式如下:

    +-+-------------------------------------------------------------+
    |E|                  Stream Dependency (31)                     |
    +-+-------------+-----------------------------------------------+
    |   Weight (8)  |
    +-+-------------+
  1. Stream Dependency:表示依赖的流id。
  2. E: Exclusive,独占属性。
  3. 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。

参考链接

rfc7540
rfc7541

Tags: HTTP
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章