QUIC はじめました

ここ最近は WebRTC やりつつ Erlang/OTP で QUIC を実装しています。

理由は単純で WebRTC が UDP 上で利用しているプロトコルである SRTP over DTLS や SCTP over DTLS を QUIC に置き換えていくという流れがきているからです。

時雨堂の WebRTC SFU Sora はライブラリを利用せずフルスクラッチで実装しているため、QUIC 対応が必要になったタイミングで実装が必要になるので、今のうちに実装しておこう考えた次第です。

実は最近まで WebRTC DataChannel で実装していて、SCTP over DTLS が動くところまできたのですが、そのうち捨てられていく古い実装を頑張るよりも QUIC 頑張ったほうが良いだろうと判断し、既存の実装は塩漬けにして QUIC に投資することにしました。

ずっと UDP な人生だったので、特に QUIC に対してネガティブはありません、むしろやるぞという気持ちです。

また kazuho さんtatsuhiro-t さんといった日本人の OSS QUIC 実装者がいるのはとても心強いです。 QUIC の資料としてゆきさんが色々公開してくれてるのもありがたいです。

実装

実装に関しては先駆者の実装を参考にしつつ、Erlang/OTP の ssl モジュールライクな感じで実装しています。

テストには ngtcp2 を利用していく予定です。

以前大津さんから「QUIC やるならまず TLS 1.3 から」という話を伺っていたのでそれを信じて TLS 1.3 から実装しています。

残念ながら Erlang/OTP では TLS 1.3 は現在絶賛実装中なのでそちらを参考に TLS 1.3 の実装を進めています。TLS 1.3 のみの実装にすることで、コード量を大幅に減らしています。目標は kazuho さんの picotls みたいなものです。

暗号の対応や署名の対応も最小限におさえて実装中です。将来的には色々対応してきたいと思いますが、まずは動くものをということで。

TLS 1.3 のライブラリが最低限できてきたら TLS 1.3 over TCP のテストをしつつ 1-RTT まで実装を進めていく予定です。

0-RTT はいろいろめんどくさそうなので TLS 1.3 0-RTT は QUIC の 1-RTT が動いてから手をつける予定です。

QUIC は IETF QUIC で勧めています。draft-16 を参考に実装中です。

WebRTC で利用する前提なので、あくまでライブラリとして実装しています、ただ最初は動くものがあったほうが良いだろうということで QUIC サーバとして利用可能なものを実装しています。

当面の目標は quic.shiguredo.jp:4433 として QUIC サーバを公開することです。早く公開できるようにがんばります。

HTTP/3 の実装はもともとが WebRTC で利用する目的なので QUIC の実装が終わるまでは意識しつつ実装はしていかないよう頑張っています。

まずはメディアやデータのリアルタイムなトランスポート層としての QUIC をやっていきます。そのへんで頑張っていれば最終的には Media over QUIC に WebRTC がたどり着くはずです。

とりあえず 11 月中に TLS 1.3 over TCP で 1-RTT が最低限動くところまでもっていきたいです。その後 QUIC 1-RTT を年内中にはという感じです。

ただ QUIC を実装するに当たり、今回は SO_REUSEPORT を Erlang/OTP で利用していこうと考えているため、今までの自分がやってきた実装とことなることから、少し手間取りそうです。ただ同一 UDP ポートで複数の接続を受け付けられるようになるため、企業にとって優しい世界がまっていると考えています。

QUIC は WebRTC の世界に大きな変革をもたらしてくれると思います。そのためにもまずは動くものを持ち、先駆者たちに追いつければと考えています。

QUIC 実装が一段落したら QUIC 用の負荷試験ツールを作ろうと考えています。

負荷試験ツールを作り始めると、気が変わって HTTP/3 の実装を始めるために qpack の RFC を読みやじめてるかもしれません。せっかくですし HTTP/3 の負荷試験をしてみたいですし。

いつか https://http3.shiguredo.jp/ が実装される日が来るかもしれません。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store