2022年8月追記: この記事は古くなっています。仕様自体は RFC 9298として標準化さました。
RFC 9298: Proxying UDP in HTTP
2022年7月追記: この記事は古くなっています。現在の最新仕様では、拡張CONNECTメソッドを使うことになってます
asnokaze.hatenablog.com
MASQUEプロトコルの標準化の流れで、GoogleのDavid Schinazi氏から「The CONNECT-UDP HTTP Method」という提案仕様が提出されている。
MASQUEは、HTTP/3でプロキシサーバに接続した後にそのコネクションをトンネルとして使用し、VPNのように任意のデータをやりとりするプロトコルです。通信を観測する第三者からは、ただのHTTP通信を行っているようにしか見えません。
このMASQUEは現在IETFでワーキンググループを作成している最中であり、まだまだ議論が始まったばかりの仕様になります。
CONNECT-UDP HTTPメソッド
CONNECT-UDP HTTPメソッドは、HTTPの接続をUDPでプロキシするのに使用されるメソッドです。
クライアントは以下のようなリクエストを送信します (HTTP/2以降は疑似ヘッダで表現される)
:method CONNECT-UDP :authority server.example.com:443 Datagram-Flow-Id 2
(Datagram-Flow-Idヘッダについては後述する)
このリクエストを受け取ったプロキシは接続先のサーバに対してUDPソケットを開き、クライアントに200番台のレスポンスを返す。それ以降プロキシはう受け取ったデータをUDPでターゲットサーバに転送します
なお、HTTP/3を使用している場合は「HTTP/3 DATAGRAM Frame」を使用できます。HTTP通信は同一ストリーム上ではデータは送った順番通りに処理される必要があります。HTTP/3 DATAGRAM Frameは、パケットが欠損したりパケットの順番が入れ替わっても届いた順番で処理していいデータを運ぶ用のフレームです。
以前解説した、QUICレイヤのDATAGRAM Frameとは異なり、HTTP/3レイヤで送信されるフレームです。
asnokaze.hatenablog.com
フォーマットも微妙に異なっており、Flow Identifierという識別子を持ちます。CONNECT-UDPリクエストを送信する際に、Datagram-Flow-Idヘッダを送信しますが、利用するHTTP/3 DATAGRAM FrameのFlow Identifierと同じ値を入れて、紐付けを行います。
これによりHead-of-line blockingを防ぐことができます。
例
そのた
(間違ってる箇所があったらすみません)