HTTP/2コネクション上で任意のバイトストリームをやりとりできるようにする「Using HTTP/2 as a Transport for Arbitrary Bytestreams」という仕様がAppleの人らによって提案されている。
IETF103でも議論(資料)になったが、その後 draft-01 が出ているのが現状である。
ユースケースとしては任意のバイトストリームをトンネリングしたり、一つのコネクション上で複数のバイトストリームをやり取りするのにストリームを利用するといった背景があるようだ。
通信の流れ
以前解説したWebsocket over HTTP/2と同じように、HTTP/2コネクションを確立したあとにストリーム上でConnectメソッドを用いる。
asnokaze.hatenablog.com
大まかな流れは以下の通り
- SETTINGSフレームでお互いにこの仕様に対応していることを確認する。「SETTINGS_ENABLE_CONNECT_PROTOCOL」および「SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT」パラメータを1にセットして交換する
- クライアントはCONNECTメソッドで、:protocolヘッダにbytestreamもしくはdatagramを設定する
- サーバ側は問題なければ200を返す
- 以降そのストリームはbytestreamもしくはdatagram通信用となる。データはDATAフレームによって運ばれ、双方向に通信される。
bytestreamとdatagramの違いは、DATAフレーム毎に境界を持つかの違いである。datagramの場合はDATAフレームごとにデータの境界を持ち、アプリケーションに渡される場合にその境界を維持する必要がある。