httpbis interim とhttp2.0相互接続試験の話
TRANSCRIPT
httpbis interim とHTTP/2.0 相互接続試験の話
HTTP/2.0 勉強会@IIJ2013 年8月14日
IIJ 大津 繁樹
自己紹介• 株式会社インターネットイニシアティブ(II
J)• プロダクト本部戦略的開発部• twitter: @jovi0608• github: https://github.com/shigeki/• ブログ: http://d.hatena.ne.jp/jovi0608/• Node とか、 HTML5 とか、 HTTP/2.0 とか、流行
そうな技術の評価検証してます。• 最近、 HTTP/2.0 仕様修正や Node.js の HTTP/2.0
モジュールの開発をしています。(実装の詳細に関しては来週の Node 学園祭で発表予定)
内容1. httpbis interim( 中間会議) で議論した大
きめなトピックについて解説1. HTTP-draft-05/2.0 の話2. HPAC ( Header-Compression 改名)の話
2. HTTP/2.0 相互接続試験の話3. 今後の HTTP/2.0 仕様化のロードマップ
~ HTTP/2.0 の仕様作成作業 ~github を使ってます。
editorial fix → Pull Request OK, design issue -> issue 登録後、 ML に出す。github 上のコメントで議論が白熱 → ML に出せと怒られる
第3回 httpbis interim@ ハンブルグ
第87回 IETF Mtg@ ベルリンの翌週 8/5( 月 ) ~ 8/7( 水) Adobe@ ハンブルグで開催
httpbis interim アジェンダ• 1日目– Implementation Feedback– Issue 議論・整理
• 2日目– 相互接続試験
• 3日目(半日)– Issue 議論・整理– 次のロードマップ
draft-04 を元に各自が HTTP/2.0 の実装を持ち寄り、初めて接続試験を行った記念すべき会議
大きめの議論トピックス(その1)やっぱ ALPN じゃなくて NPN がいい。• “Hitting some limit which causes bugs. ALPN can just
cause timeouts” by Patric, Mozilla– 256 バイト以上の Hello でバグる実装があるみたい。(某L
B)– だから ALPN でクライアントから送るデータが増えるのヤダ。– やっぱクライアント側でコントロールしたいね。
• ALPN のプロトコル選択は平文で見えちゃう。– プライバシーの問題がないかい?
• NPN と ALPN の併用が結構大変よね。移行どうするねん。 (by G)
• ALPN 仕様、実は exp-HTTP/2.0 という名称にしないと・・・httpbis で議論したらアカン。 TLS WG に行ってくれ。
大きめの議論トピックス(その2)CONTINUEフラグはアカン、使えん!
HEADERS +END_HEADERS flag
HEADERS +CONT flag
HEADERS +END_HEADERS
flag
HEADERS +CONT flag
ストリーム生成開
始
続きの2個目だ
よ1個目だ
よ終りだよ
draft-04 では、ストリーム生成開
始
大きめの議論のトピックス(その2)CONTINUATION フレームの新設
HEADERS CONTINUEATION+ END_HEADERS
CONTINUATION
続きの2個目だ
よ1個目だ
よ
続きの終りだ
よ
draft-05 では、
ストリーム生成
大きめの議論のトピックス(その3)
Server Push を完全に禁止したい
draft-04 では、
SETTINGSMAX_CONCURRENT_STREAMS: 0
PUSH_PROMISE
でも PUSH PROMISE は送れちゃうもんね。
1. 同時オープン0は仕様で PUSHを禁止させる?2. RSTする?3. 新たに PUSH 禁止設定を導入する?
大きめの議論のトピックス(その3)Server Push を完全に禁止したい
draft-05 では、2を採用
PUSH_PROMISE
RST_STREAM でみんな撃墜してやる!
RST_STREAM 迎撃
大きめの議論のトピックス(その4)Header-Compression-01 あかんじゃん!
working setfoo0, bar0, index0foo1, bar1, index1
Header Table (request)
0, :scheme, http1, :scheme,https2, :host,3, :path, /4, :method, GET5, accept,index0, foo0, bar0index1, foo1, bar1・・・36, via, 37, warning,
reference set
foo0,bar0foo1, bar1
name,value
index
デコード時 workng_set に問題が!
インデックスをなめる
ので O(N^2)の計算量が
要
でかいヘッダが送られて来たらメモリ枯渇し
ちゃう
eviction 時にインデック
スがずれちゃう
でかいリテラルヘッダ
大きめの議論のトピックス(その4)HPAC 誕生!
Header Table (request)
0, :scheme, http1, :scheme,https2, :host,3, :path, /4, :method, GET5, accept,index0, foo0, bar0index1, foo1, bar1index5, foo5,・・・36, via, 37, warning,38, foo5, bar5
reference set
foo0,bar0foo1, bar1
0 1 0 index5bar5 length
bar5 string
header set
foo5emitted
emit
Literal + Increment
working set を作らず、 emit による逐次処理に変更。メモリ制限も対応、ストリームとして扱うことも可能に。
draft-04 実装リストhttps://github.com/http2/http2-spec/wiki/Implementations
名称 実装言語 Client,Server, Intermidate ニゴシエーション
1 nghttp2 C S, C, I NPN, Upgrade, Direct
2 http2-katana C# S, C Upgrade, ALPN
3 node-http2 Node.js S, C direct
4 Mozilla Firefox C++ C ALPN, NPN
5 http2-perl Perl S, C NPN
6 iij-http2 Node.js S, C NPN, Client Upgrade, Direct
7 Akamai Ghost C++ I NPN
8 Chromium C++ C ALPN, NPN
9 Google Front End C++ I ALPN, NPN
10 Twitter Java S, C ALPN, NPN
Node.js によるフルスクラッチ実装 iij-http2 を開発
世界初の HTTP/2.0 相互接続試験やりました
HTTP/2.0 接続成功!
iij-http2 <-> HTTP/2.0 Chrome
iij-http2 の相互接続試験結果
名称1 nghttp2 成功。バク発見していただきました。2 http2-katana Upgrade のバグ修正が完了せず。帰国後成功3 node-http2 成功。先方のバグ発見。修正済。4 Mozilla Firefox 成功。 closed state 仕様のバグ発見、仕様改訂済5 http2-perl 未試験(試験準備できなかった)6 iij-http2 N/A7 Akamai Ghost 成功。 Proxy対応へコードを改良が必要だった。8 Chromium 成功。 PING で不具合有。 Chrome 側が修正。9 Google Front End 未試験(間に合わなかったみたい)10 Twitter 未試験(間に合わなかったみたい)
この先のロードマップ• Second Implementation Drafts -06 :21 August 2013 • Header Compression Interop Harness :10 September 2013 • Interop Dashboard : September 2013 • 9-11 October 2013 Interim : Seattle(?) US hosted by MS• November 2013 89th IETF : Vancouver CA • January 22-24 2014 Interim : Zurich CH hosted by Cisco
• HPAC はやっぱり心配だからちゃんとテストしよう。• QAチームも一緒にやりたいね。• interim 前にバーチャル相互試験をやろう。