SlideShare a Scribd company logo
HTTP 2.0のヘッダ圧縮(HPACK)	
2013年10月17日	
	
	
藤沢 淳	
fujisawa.jun@canon.co.jp
自己紹介
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)
HTTP 2.0の標準化
p  複雑化への懸念	

テキストベースのプロトコルとしてのシンプルさが失われる?	
n  HTTPクライアント・サーバを簡単に実装できなくなる?
n  HTTPがステートフルなプロトコルになってしまう?
n 

p  発表のゴール

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

ご意見・フィードバックを歓迎します
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

学習した符号化規則
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
EXI圧縮のメカニズム
p  イベントのチャネル分割	

XMLデータ構成要素の種類でチャネル分割
	

p  圧縮ストリームの生成	

ブロック単位で整列化した後にGZIP圧縮
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
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	

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	

リクエスト名前テーブル

レスポンス名前テーブル
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	

リクエスト①処理後のヘッダテーブル

リクエスト②処理後のヘッダテーブル
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	

先頭ビットパターンとヘッダ表現形式
Header Diffの評価結果
p  GZIP圧縮を用いずにSPDYに迫る圧縮効果を実現

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

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

レスポンスヘッダテーブル
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	

リクエスト①処理後のヘッダテーブル

リクエスト②処理後のヘッダテーブル
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	

先頭ビットパターンとヘッダ表現形式
今後の検討課題
p  ヘッダ圧縮機能の課題	

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

	

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:
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

More Related Content

HTTP 2.0のヘッダ圧縮(HPACK)