HTTP 2.0のヘッダ圧縮(HPACK)

4,248 views

Published on

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,248
On SlideShare
0
From Embeds
0
Number of Embeds
419
Actions
Shares
0
Downloads
23
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

HTTP 2.0のヘッダ圧縮(HPACK)

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

×