WebSockets over HTTP2 の提案仕様。再び。(RFC8441)

2018/09/19追記
RFC 8441 として標準化されました

2018/03/10追記
WebSockets over HTTP2の更新分について、記事を別途書きました
asnokaze.hatenablog.com

2018/02/06追記
Bootstrapping WebSockets with HTTP/2」はWG Draftになり、この方向で標準化が進む方向です。ただし、下記のプロトコルフローとは異なりHEADERSフレームでWebSocketのアップグレードを処理する手順になっています。

Chromiumにおいても「Add field trial and command line flag for Websockets over HTTP/2.」というコミットが入っており、実装はまだですが進展がありそうです
https://chromium.googlesource.com/chromium/src/+/58b42322d7fd12e6909e95fe4bf63e29e83000da


下記の内容は古く、現在は違うアップグレード手順になっています


先日「Bootstrapping WebSockets with HTTP/2」という仕様が提出されています。

HTTP/2とWebSockets

HTTP/2の上でWebSocketsを通信することは出来ないのが現状です。

しかし根強くWebSockets over HTTP/2の議論は定期的に行われています。


古くはHTTP/2策定中であった2014年に「WebSocket over HTTP/2」という仕様の提案もありました。これはHTTP/2のレイヤにWebSocketsをマッピングする方式でした。ネゴシーエションやフレーミング、ストリーム管理にも言及しています。しかし、この提案仕様は標準化には至りませんでした。


2016年にも「WiSH: A General Purpose Message Framing over Byte-Stream Oriented Wire Protocols (HTTP)」として、WebSockets互換の拡張仕様が提案されています。こちらに関しては、当時の議事録を見ると「この議論をHTTPbis WGでするのは正しい場所ではない」というコメントが残っています。


毎年行われている、ブラウザベンダ, ミドルウェア実装者, CDN事業者, 大手WebサイトといったHTTPの実装者が議論を行うHTTPWorkshopにおいて、今年は「Future of WebSockets?」という発表があり、Chromeの統計情報とWiSHの紹介があったようです。


そこでWebSocketsについての議論があったようです。

Bootstrapping WebSockets with HTTP/2

そして、昨日MozillaのPatrick McManusから「Bootstrapping WebSockets with HTTP/2」という仕様が出ている。文字通り、HTTP/2上でWebSocketsをブートストラップする仕組みの提案仕様である。


HTTP/2ではCONNECTメソッドを使うことでトンネリングする機能があり(一部今回の仕様で変更する)、それを用いて一つのストリーム上でWebSocketsの通信路を開いてWebSocketsのデータをやりとりする。

CONNECTメソッドを用いた通信路の開設

まずサーバはこの仕様に対応している事を示す、ENABLE_CONNECT_PROTOCOL SETTINGSパラメータを送信する。

クライアントとはCONNECTメソッドと、:protocol疑似ヘッダを用いてWebSockets用の通信路を開設する。この時、通常のCONNECTでは使用できないがこの仕様では:path, および:schemeを指定する必要がある。

サーバのレスポンスを持って通信路が開設される。
f:id:ASnoKaze:20171018003037p:plain

WebSocketsの通信を開始する

その後、開設したストリーム上で、DATAフレームでWebSocketsのアップグレード手順を実施する。
サーバからの101ステータスコードが帰ってきた後、WebSocketsのデータのやりときができるようになる。

f:id:ASnoKaze:20171018003417p:plain

議論

HTTPbis WGのメーリングリストでこのドラフトは議論が始まっています。

疑似ヘッダの話や、upgrade手順の議論、クライアントからCONNECTリクエストとDATAフレームを一度に送れるのではないかといったフィードバックが出ています。

標準化が進むのかはわかりませんが、またしばらくWebSocketsの話は続きそうです。