HTTP2に導入された dependency-based stream prioritization

HTTP2 draft11

4/3にHTTP2のdraft11が公開された。


ALTSVCフレームの追加や、"connection header"から"connection preface"への名称変更などが含まれている。


なかでもストリームのpriorityについて大きな変更が入った。

HTTP/2のpriority

HTTP2ではクライアントからサーバにリソースを要求する際priority(優先度)を伝えることが出来る。


これは、一般的にWebサイトを表示する際、早くレスポンスが欲しいものとそうでないものがあるためである。


例えば、レンダリングを開始するのにCSSファイルは必要だが、画像ファイルは遅くてもかまわない。もしくは、アクティブでないタブの場合は優先度を下げるといった事も出来るかもしれない。


(もちろんサーバ側はクライアントからの優先度に従うことが必須ではない。)

dependency-based stream prioritization

draft11では、priorityに"Priority Group"と"Stream Dependencies"という概念が加わった。


HEADERSとPRIORITYフレームは以下の値をオプションで持つように変更された。

  • Priority Group Identifier
  • Weight
  • Stream Dependency


あんまり正しく理解出来てる自信ないけど、ざっと以下の様な感じ

Priority Group

すべてのストリームはPriority Groupに属する。各Priority Groupは31bitの識別子を持っており、それぞれ1〜256のWeightを持つ。


このWeightによって、もってるリソースを割り当てるようになる。


weight 4のPriority Groupには、weight 12のPriority Groupの1/3のリソースが理想的には割り当てられるようになる。


明示的に指定しない場合は、ストリームIDと同一のPriority Groupに属することになる。なお、そのときのWeightは16である。

Stream Dependency

トームには依存するストリームを一つ指定することが出来き、依存関係のtreeを構成する。その場合、そのストリームと同じPriority Groupに属することになる。


Aに、BとCが依存してるときにDを追加すると以下のようなツリーになる。


Exclusive Flagを設定でき、それを有効にしてDを追加することで、間に入れ込むことができる。


同一のPriority Group内の各dependency treeは同じリソースが割り当てられるべきであるとしている。


dependency treeの中ではcloseされていたり処理が進められないといったようなストリームに依存しているストリームのみリソースが割り当てられるべきである。

(たぶんこう言う感じ)


また、その時はBとCには同じ量のリソースが割り当てられるべきである。


なおストリームは自分自身に依存することは出来無い(エラーとして扱う)。

Reprioritization

以前同様PRIORITYフレームを用いることでストリームのpriorityを変更できる。
Priority Groupを移したり、依存するストリームを変更することが出来る。


変更したストリームに依存するストリームも合わせて移動される。