HTTP/2をバイトストリームトランスポートとして利用する提案仕様

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

大まかな流れは以下の通り
f:id:ASnoKaze:20190313111855p:plain

  • SETTINGSフレームでお互いにこの仕様に対応していることを確認する。「SETTINGS_ENABLE_CONNECT_PROTOCOL」および「SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT」パラメータを1にセットして交換する
  • クライアントはCONNECTメソッドで、:protocolヘッダにbytestreamもしくはdatagramを設定する
  • サーバ側は問題なければ200を返す
  • 以降そのストリームはbytestreamもしくはdatagram通信用となる。データはDATAフレームによって運ばれ、双方向に通信される。

bytestreamとdatagramの違いは、DATAフレーム毎に境界を持つかの違いである。datagramの場合はDATAフレームごとにデータの境界を持ち、アプリケーションに渡される場合にその境界を維持する必要がある。