http 2.0のヘッダ圧縮(hpack)

17
HTTP 2.0のヘッダ圧縮(HPACK20131017藤沢 淳 [email protected]

Upload: jun-fujisawa

Post on 28-Nov-2014

2.575 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: HTTP 2.0のヘッダ圧縮(HPACK)

HTTP 2.0のヘッダ圧縮(HPACK)

2013年10月17日

藤沢 淳 [email protected]

Page 2: 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)

Page 3: HTTP 2.0のヘッダ圧縮(HPACK)

HTTP 2.0の標準化 p 複雑化への懸念

n  テキストベースのプロトコルとしてのシンプルさが失われる?

n  HTTPクライアント・サーバを簡単に実装できなくなる? n  HTTPがステートフルなプロトコルになってしまう?

p 発表のゴール n  HTTPヘッダ圧縮のベースになったEXIを簡単に説明 n  SPDYヘッダのEXI圧縮からHPACKに至る経緯を紹介 n  HTTP 2.0への期待と不安を共有

ご意見・フィードバックを歓迎します

Page 4: HTTP 2.0のヘッダ圧縮(HPACK)

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 ビルトインの規則で符号化

* *    

Page 5: HTTP 2.0のヘッダ圧縮(HPACK)

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型で符号化

Page 6: HTTP 2.0のヘッダ圧縮(HPACK)

EXI圧縮のメカニズム p イベントのチャネル分割 p 圧縮ストリームの生成

XMLデータ構成要素の種類でチャネル分割 ブロック単位で整列化した後にGZIP圧縮

Page 7: HTTP 2.0のヘッダ圧縮(HPACK)

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圧縮

Page 8: HTTP 2.0のヘッダ圧縮(HPACK)

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サーバのレスポンスは同一のヘッダ項目から構成されていることが多い

Page 9: HTTP 2.0のヘッダ圧縮(HPACK)

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

リクエスト名前テーブル レスポンス名前テーブル

Page 10: HTTP 2.0のヘッダ圧縮(HPACK)

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

リテラル

リテラル

リテラル

デルタ

インデックス

リテラル

Page 11: HTTP 2.0のヘッダ圧縮(HPACK)

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ビットの場合の例

Page 12: HTTP 2.0のヘッダ圧縮(HPACK)

Header Diffの評価結果 p GZIP圧縮を用いずにSPDYに迫る圧縮効果を実現

n  GZIP圧縮と組み合わせること更に高圧縮が可能 n  4KB程度のテーブルサイズでも十分な効果を発揮

Page 13: HTTP 2.0のヘッダ圧縮(HPACK)

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

リクエストヘッダテーブル レスポンスヘッダテーブル

Page 14: HTTP 2.0のヘッダ圧縮(HPACK)

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

リテラル

リテラル

リテラル

リテラル

インデックス

リテラル

Page 15: HTTP 2.0のヘッダ圧縮(HPACK)

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種類のヘッダ表現形式(インデックス、テーブル追加・追加なし・置換のリテラル)を判別

Page 16: HTTP 2.0のヘッダ圧縮(HPACK)

今後の検討課題 p ヘッダ圧縮機能の課題

n  ヘッダテーブルのサイズ制限の決定方法 n  ヘッダテーブルに登録するヘッダ項目の決定方法 n  あらかじめ登録するヘッダ項目の選択と優先度の決定 n  クライアントとサーバ間でのテーブル不整合への対応? n  HTTPのバージョンアップや新しいヘッダ項目への対応?

p 複雑化への懸念 n  HTTPのヘッダ圧縮機能は必ずしも難しくない?

Page 17: HTTP 2.0のヘッダ圧縮(HPACK)

参考資料 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