http2.0 negotiation&header compression
TRANSCRIPT
ネゴシエーションの話
yuki
自己紹介
・ゆき・社会人4月目
・最弱インフラエンジニア...orz・趣味 一応、プロトコルとかセキュリティとか あと、ウクレレとか
あすのかぜってブログで、HTTP2.0界隈の記事をひっそり書いてます
他の登壇者ガチ勢過ぎて恐ろしいです...
お手柔らかにorz
HTTP2.0の機能
ざっくりと● アップグレードメカニズム(ネゴシエーション)● メッセージの多重化● フロー制御● 優先処理● ヘッダ圧縮● サーバプッシュ
HTTP2.0の機能
ざっくりと
● アップグレードメカニズム(ネゴシエーション)● メッセージの多重化● フロー制御● 優先処理● ヘッダ圧縮● サーバプッシュ
アップグレードメカニズム(ネゴシエーション)
● HTTP1.xはテキストで、HTTP2.0はバイナリでデータの送受信が行われる
● HTTP1.xとHTTP2.0ではセマンティクスは維持されるものの、データの形式が違う
● そのため、それぞれで通信することは出来無い
それぞれで通信できない上、HTTP1.xもHTTP2.0も使用するポート番号は同じ...
→アップグレードメカニズム
アップグレードメカニズム(ネゴシエーション)
3つの方法
仕様の「3 Starting HTTP/2.0」にHTTP2.0の開始方法が述べられている
1. HTTPの場合2. HTTPS(SSLを使用する)場合3. 事前にHTTP2.0に対応してることを知ってる場合
HTTPの場合
HTTP1.xで通信を開始して、Upgradeヘッダを用
いてHTTP2.0に切り替える
GET /default.htm HTTP/1.1 Host: server.example.com Connection: Upgrade, HTTP2-Settings Upgrade: HTTP/2.0 HTTP2-Settings: <base64url encoding of HTTP/2.0 SETTINGS payload>
HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: HTTP/2.0
[ HTTP/2.0 connection ...
HTTPリクエスト
HTTPレスポンス
HTTPSの場合
主に二つの方法が議論されている● TLS-NPN● TLS-ALPN
両方とも、TLSのハンドシェイク中に使用するプロトコルもネゴシエーションしてしまう仕組み。
NPN
サーバから使用可能なプロトコルリストを送信する
ハンドシェイク中なのでその様子を見たりも出来る
ALPN
クライアントから使用可能なプロトコルリストを送信する
NPNとALPN何が違うの
● 使用出来るプロトコルのリストをどちらが提示するか
● 選択できるプロトコルがリストになかった場合の処理が明確化されているか(ALPNは明確)
● Selected Protocolが暗号化されるか
事前に知っている場合
実は、仕様上で詳しくは述べられていないDNSを使う方法が議論はされていたが...
SRVレコード、SVCINFOレコードというレコードに対応しているプロトコルを記述しておき、クライアントはサーバがHTTP2.0に対応しているか分かる
あと、SPDY2で使用されていたAlternate-Protocolヘッダを使用する場合も考えられる
誤って通信を開始してしまった場合
誤って、HTTP2.0に対応してないホストにHTTP2.0で通信を開始してしまった場合...
HTTP1.xは改行をメッセージの終端として使用している。→終端を待ち続ける。コネクションを切断しようとしない
コネクションヘッダ
コネクション(HTTP2.0の通信)を開始する際、コネクションヘッダとして以下の文字列を送信する
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
HTTP1.xのサーバであれば、改行文字が含まれているため、即座に向こうなメッセージとして切断される
ヘッダ圧縮
超概略
ヘッダ圧縮を行う理由
● HTTP1.xでは同じようなヘッダを毎回送る(例えばUserAgentやAcept系のヘッダ)
● HTTP1.xではテキスト形式でデータを送信している● SSLでの圧縮にCRIME攻撃という攻撃手法が見つかって
いる
・ヘッダーテーブルを使って、一般的なヘッダ・一回使ったヘッダはindexを用いて表現する
・ヘッダはReference Setとして管理され、その差分情
報のみ送る
ヘッダ圧縮の仕組み
header table
index header value
0 :scheme http
1 :scheme https
2 :host
3 :path /
4 :method GET
5 accept
6 accept-charset
…
36 via
37 warning
index header 200
0 :status
1 age
2 cache-control
3 content-length
4 content-type
5 date
6 etag
…
33 warning
34 www-authenticate
request header table response header table
index header value
0 :scheme http
1 :scheme https
…
36 via
37 warning
index header value
0 :scheme http
1 :scheme https
…
36 via
37 warning
header table header table
index=3,value=/my-example/index.htmlindex=12,value=my-user-agentname=x-my-header,value=first
:path, /my-example/index.htmluser-agent, my-user-agentx-my-header, first
Reference Set
:path, /my-example/index.htmluser-agent, my-user-agentx-my-header, first
Reference Set
話がかぶった時用
個人的HTTP2.0の追い方
基本的な一次情報源は● GitHub
○ http2.0 spec,compression spec,material(minutes)■ commit■ issue■ wiki
● メーリングリスト○ HTTP1.1に関するものも流れてくる...
個人的HTTP2.0の追い方
議論には、editionalなものとdesignのものがある。
気にしておくと追いやすい。あと、clarifyなどの単語も。
(英語弱いので、commitログを見てから、議論追ったり...orz)
個人的HTTP2.0の追い方
二次情報源 本日登壇者の方々のツイッターやブログなど...
インターネットウォッチ [HTTP 2.0の最新動向]IETF86におけるHTTP/2.0関連トピックス
オライリーHigh Performance Browser Networking
個人的HTTP2.0の追い方
あわせて眺めておきたい● 「SPDY Protocol - Draft 3」の日本語訳。● SPDYメーリングリスト● TLS WGメーリングリスト● 各種実装● 各種OSSのコミットログ
○ chromium,firefox...