HTTP2.0におけるネゴシエーションの仕組み

HTTP1.0とHTTP1.1は同じメッセージ形式をしていたので問題なかったが、HTTP2.0とHTTP1.xではメッセージの形式が異なるため通信を行えない。


そのため、どちらで通信するかネゴシエーションする必要がある。

httpbis wgでは幾つかの方法が提案されている

DNSSRVレコードを用いる方法


SRVレコードはそのドメインで動作してるサービスとそのポートが書かれている。このレコードを参照してHTTP1.xかHTTP2.0を選択する。
この方法だとサーバ側では通信がどちらか知る手段がないので、HTTP1.xとHTTP2.0が別ポートになる...

下のレイヤーでネゴシエーションする(TLS-NPN)


SPDYで利用されている方法。同一ポートで複数のプロトコルから選択できる。
SSL通信を行う際のハンドシェイク時に拡張フィールドを用いてネゴシエーションを行う。
この方法だとSSL通信が必須になってしまう。

TLS-NPN仕様

Alternate-Protocol ヘッダー


SDPYで提案されていた方法。HTTP1.xで最初に通信し、サーバ側から別途使用可能なプロトコルを通知する。

SPDYのAlternate-Protocolの仕様

Upgrade-based ヘッダー


Web Socketで使用されている方法。HTTP1.xで最初に通信し、ブラウザ側からHTTP2.0の使用を要求する。

Upgrade-based の仕様