BGP over QUICの提案仕様

BGP Over QUIC (BoQ)」という提案仕様が出ている。まだ、議論の呼び水の段階で、提案仕様の細かい部分はとりえる選択肢が書かれている部分もある。。

なお、僕自身はBGPについて詳しいわけではないが、ざっと目を通す。

QUICを使うメリット

RFC9000 で定義されるQUICはUDP上で動作するトランスポートプロトコルであり、TCP+TLSのような通信の信頼性と暗号化機能を提供します。

QUICを使うアプリケーションプロトコルとしては、すでにRFC間近になっているHTTP/3の他に、DNSSSHなどででの利用が検討されています。

QUICをトランスポートプロトコルとして使うことで多くのメリットが得られます

  • TCP + TLSに比べ早いコネクション確立 (TLS1.3と同等のハンドシェイクを行う)
  • IPアドレスが変わってもコネクションが切れない
  • 通信管理単位であるストリームを活用する。ストリーム毎の信頼性となっており、パケロス時に回復を待たずに、後続のパケットをアプリケーションで処理できるようになっている
  • 再送制御の表現力の向上
  • トランスポートプロコル領域も含む暗号化、アンプ攻撃対策、
  • その他いろいろ

詳しくは、古いですが、以前書いた記事などを参照してください

BGP over QUIC

BGP Over QUIC」も上記のメリットを享受できます。QUICを利用するために、仕様では以下のことを定義してます。

  • QUICストリームにどうマッピングするか
  • 1-RTTハンドシェイク及び、0-RTTハンドシェイク時の BGP FSM (ステートマシン)の定義
QUICストリームにどうマッピングするか

トランスポートレイヤのヘッドラインブロッキングを避けるために、QUICのストリームを利用する。
通信をどう、QUICの双方向ストリームにマッピングするかは以下の3つが案として挙げられている。

BGP FSM関連

BGPのセッション確立プロセスはBGP FSMで定義されます。トランスポートレイヤでコネクションの確立をしたあとに、BGPセッションが確立されます。

f:id:ASnoKaze:20210606012848p:plain
(wikimedia: File:BGP FSM.svg より)

この仕様では、BoQ FSMとして新しく定義してます。

BoQ FSMでは、QUIC 1-RTTハンドシェイクではTCPのものを継承します。クライアントからアプリケーションを最初に送信する0-RTTハンドシェイク用のために、新しいイベントを定義を追加します。

0-RTTハンドシェイクでは、クライアントはQUIC InitialパケットともにBGP Open Dataメッセージを送信し、BGP OpenSent 状態になります。それを受け取ったサーバーは QUIC Handshakeパケットを送信後に、BGP Open を送信し、ステータスを BGP OpenConfirmedに変更します。その後、クライアントもBGP OpenConfirmedになります。

このようにBoQ FSMで0-RTTを利用すると、BGP Connect とBGP Active がスキップされます。

その他

なお、BGP over QUICではUDPの179番ポートを使用します。ポート番号でアプリケーションプロトコルを区別するため、この仕様では、ALPN識別子は不要としています。

また、QUICではアプリケーションのエラーでコネクションを切る際に、エラーコードを通知します。そのため、BoQではエラーコードを、新しく定義しています。

  • BOQ_NO_ERROR (0x00)
  • BOQ_INTERNAL_ERROR (0x01)

感想

  • QUICではTLSハンドシェイクを行うのでサーバ証明書が必須。そこを運用でどうするか。BGPSecと似たような感じ?(詳しくない
  • BGPで、QUICのメリットがどれくらい嬉しいのか、実感がない
  • ALPN識別子必須でないけど、一旦定義してもいいのかなとおもったり
  • BGP FSM全然わからない...