Download - HTTP 2.0のヘッダ圧縮(HPACK)
自己紹介 p W3C SVG WG(2000年~)
n HTML5を構成するW3C標準の Webベクトルグラフィック
p W3C EXI WG(2008年~)
n テキストXMLと相互変換可能な W3C標準のバイナリXML
p IETF HTTPbis WG(2013年~)
n HTTP 2.0のヘッダ圧縮仕様案 (Header Diff/Reference Set/HPACK)
HTTP 2.0の標準化 p 複雑化への懸念
n テキストベースのプロトコルとしてのシンプルさが失われる?
n HTTPクライアント・サーバを簡単に実装できなくなる? n HTTPがステートフルなプロトコルになってしまう?
p 発表のゴール n HTTPヘッダ圧縮のベースになったEXIを簡単に説明 n SPDYヘッダのEXI圧縮からHPACKに至る経緯を紹介 n HTTP 2.0への期待と不安を共有
ご意見・フィードバックを歓迎します
EXIのトークン符号化 p 要素・属性を学習して最少ビットで符号化
<company> <person id = "0001"> </person> <person id = "0002"> </person>
符号化ビット
EE AT SE CH
AT SE EE AT SE CH
XMLの構造
符号化ビット
9 1 0 6 9 a 1 d 1 0 2 person 0 1 id
0 0 0 1 0 2 0 3
0 1 2 0 2 1 2 2 2 3
<company> <person id = "0001"> </person> <person id = "0002"> </person>
9 1 0 6 9 a 1 d 1 0 2 person 0 1 id d 1 0
テキストXML
テキストXML
バイナリXML
バイナリXML
ビルトインの符号化規則
STEP 3 学習した規則で符号化
STEP 2 符号化規則を学習
学習した符号化規則
XMLの構造
id person * *
STEP 1 ビルトインの規則で符号化
* *
EXIのデータ型適合コーデック p 11種類のビルトインデータ型を提供
p 整数と浮動小数のエンコード
<data> <count>65536</count> <count>12345</count> <value>0.12345</value> <value>-1.234</value>
91 06 9a 1d 1d 1c 0e 7b cb dd dd dd cb 9b cc
cb 9b cb 05 cb cc 8c fc 03 0b
テキストXML
Float型で 符号化
バイナリXML
XMLでは すべての データが 文字列
Integer型で 符号化
"1 2 3 4 5 " (5バイト) "0 . 1 2 3 4 5" (7バイト)
10111001 01100000 (2バイト) 10111001 01100000 11111011 (3バイト)
テキストXML バイナリXML
Integer型 整数サイズに応じて可変長で符号化
Float型 指数部と化数部に分けてそれぞれ 可変長のInteger型で符号化
EXI圧縮のメカニズム p イベントのチャネル分割 p 圧縮ストリームの生成
XMLデータ構成要素の種類でチャネル分割 ブロック単位で整列化した後にGZIP圧縮
SPDYヘッダのEXI圧縮 p SPDYヘッダフォーマット
p HTTPヘッダのEXI表現
+------------------------------------+ | Number of Name/Value pairs (int32) | +------------------------------------+ | Length of name (int32) | +------------------------------------+ | Name (string) | +------------------------------------+ | Length of value (int32) | +------------------------------------+ | Value (string) | +------------------------------------+ | (repeats) |
<url>index.html </url> <user-agent>my-agent </user-agent> <x-my-header>first </x-my-header>
91 06 9a 1d 1d
1c 0e 7b cb dd
dd dd cb 9b cc
cb 9b cb 05 cb
cc 8c fc 03 0b
url: index.html user-agent: my-agent x-my-header: first
テキストXML バイナリXML HTTPヘッダ
ヘッダ項目数
ヘッダの値
ヘッダの名前 全体を GZIP圧縮
HTTPヘッダの冗長性 p 共通ヘッダ項目のインデックス化が有効
Google Response #1 Similarity Google Response #2
Status 200 OK SAME Status 200 OK
Version HTTP/1.1 SAME Version HTTP/1.1
Server Chunked Update Server SAME Server Chunked Update Server
Cache-Control public,max-age=172800 SAME Cache-Control public,max-age=172800
X-XSS-Protection 1; mode=block SAME X-XSS-Protection 1; mode=block
Date 22 Feb 2011 09:38:55 GMT DIFF Date 22 Feb 2011 09:38:17 GMT
Age 12 DIFF Age 51
Content-Length 765 DIFF Content-Length 7907
HTTPサーバのレスポンスは同一のヘッダ項目から構成されていることが多い
Header Diffの誕生 p ヘッダテーブルと名前テーブルを定義
n リクエストヘッダとレスポンスヘッダのテーブルは独立
n ヘッダテーブルにはヘッダ名とヘッダ値のペアを登録 n 名前テーブルにはヘッダ名を登録(ヘッダ名のインデックス化) n よく使うヘッダ名を名前テーブルの先頭にあらかじめ定義
Index Header Name
0 accept
1 accept-charset
2 accept-encoding
3 accept-language
4 cookie
… …
36 warning
Index Header Name
0 age
1 cache-control
2 content-length
3 content-type
4 date
… …
35 www-authenticate
リクエスト名前テーブル レスポンス名前テーブル
Header Diffのインデックス処理 p ヘッダテーブルの内容との差分情報を送信
n 新規のヘッダ項目はリテラル表現(ヘッダテーブルに追加) n 既出のヘッダ項目はインデックス表現(ヘッダテーブルは不変) n 値が異なるヘッダ項目はデルタ表現(ヘッダテーブルを更新)
Index Header Name Value
0 url index.html
1 user-agent my-agent
2 x-my-header first
…
Index Header Name Value
0 url script.js
1 user-agent my-agent
2 x-my-header first
3 x-my-header second
リクエスト①処理後のヘッダテーブル
[リクエスト①] url: index.html user-agent: myagent x-my-header: first
リクエスト②処理後のヘッダテーブル
[リクエスト②] url: script.js user-agent: myagent x-my-header: second
リテラル
リテラル
リテラル
デルタ
インデックス
リテラル
Header Diffのフォーマット p 基本データ型のエンコーディング
n 文字列は文字列長と UTF-8文字列で表現
n 整数はプレフィクス 付きの可変長表現
p ヘッダフレームのエンコーディング Pattern Representation
1 0 Short Indexed Header (<64)
1 1 Long Indexed Header (>=64)
0 0 0 Literal Header without Indexing
0 0 1 Literal Header with Indexing
0 1 0 Delta Header without Indexing
0 1 1 Delta Header with Indexing
先頭ビットパターンとヘッダ表現形式
6種類のヘッダ表現形式(リテラル・インデックス・デルタ、テーブル追加の有無)を先頭ビット
パターンで判別
10 I=10 1337 I=1337
xxx01010 I<31 xxx11111 I>=31 10011010 00001010
プレフィクスが5ビットの場合の例
Header Diffの評価結果 p GZIP圧縮を用いずにSPDYに迫る圧縮効果を実現
n GZIP圧縮と組み合わせること更に高圧縮が可能 n 4KB程度のテーブルサイズでも十分な効果を発揮
HPACKへの進化 p ヘッダテーブルに加えてリファレンスセットを導入
n リクエストヘッダとレスポンスヘッダのテーブルは独立
n よく使うヘッダ項目をヘッダテーブルの先頭にあらかじめ登録 n リファレンスセットには直前に利用したヘッダ項目を保持 n ヘッダ項目が前回と同一の場合は差分情報は不要
Index Header Name Value
0 :scheme http
1 :scheme https
2 :host
3 :path /
4 :method GET
… …
29 via
Index Header Name Value
0 :status 200
1 age
2 cache-control
3 content-length
4 content-type
… …
29 www-authenticate
リクエストヘッダテーブル レスポンスヘッダテーブル
HPACKのインデックス処理 p リファレンスセットの内容との差分情報を送信
n 新規のヘッダ項目はリテラル表現(ヘッダテーブルに追加) n 既出のヘッダ項目はインデックス表現(ヘッダテーブルは不変) n 値が異なるヘッダ項目もリテラル表現(ヘッダテーブルを更新)
Index Header Name Value
…
38 :path index.html
39 user-agent my-agent
40 x-my-header first
Index Header Name Value
38 :path script.js
39 user-agent my-agent
40 x-my-header first
41 x-my-header second
リクエスト①処理後のヘッダテーブル
[リクエスト①] :path: index.html user-agent: myagent x-my-header: first
リクエスト②処理後のヘッダテーブル
[リクエスト②] :path: script.js user-agent: myagent x-my-header: second
リテラル
リテラル
リテラル
リテラル
インデックス
リテラル
HPACKのフォーマット p 基本データ型のエンコーディング
n ヘッダの名前は文字列長とASCII文字列で表現 n ヘッダの値は文字列長とUTF-8文字列で表現 n 整数はプレフィクス付きの可変長表現 n 日付型の専用エンコーディングの可能性も検討中
p ヘッダフレームのエンコーディング Pattern Representation
1 Indexed Header
0 1 1 Literal Header without Indexing
0 1 0 Literal Header with Incremental Indexing
0 0 Literal Header with Substitution Indexing
先頭ビットパターンとヘッダ表現形式
4種類のヘッダ表現形式(インデックス、テーブル追加・追加なし・置換のリテラル)を判別
今後の検討課題 p ヘッダ圧縮機能の課題
n ヘッダテーブルのサイズ制限の決定方法 n ヘッダテーブルに登録するヘッダ項目の決定方法 n あらかじめ登録するヘッダ項目の選択と優先度の決定 n クライアントとサーバ間でのテーブル不整合への対応? n HTTPのバージョンアップや新しいヘッダ項目への対応?
p 複雑化への懸念 n HTTPのヘッダ圧縮機能は必ずしも難しくない?
参考資料 p Header Diff: A compact HTTP header
representation for HTTP/2.0 n tools.ietf.org/id/draft-ruellan-headerdiff-00.txt
p HTTP/2.0: Header Reference Set Definition n tools.ietf.org/id/draft-ruellan-reference-set-
definition-00.txt
p HPACK - Header Compression for HTTP/2.0 n tools.ietf.org/id/draft-ietf-httpbis-header-
compression-03.txt