2 min read

2026 年 1 月 QUIC 雑記

時雨堂では Media over QUIC Transport (以降 MOQT) の実装を進めており、2026 年は相当 QUIC に触れることがあるので、思い立ったときは雑記を書く用にしようと思う。


クライアント側の QUIC ライブラリは自作せず、既存のライブラリを利用する事にした。自分用に雑にまとめておく。脳内ダンプなので読みづらいと思う。

前提

去年は Python (C/C++) での QUIC を中心に触ってきて MOQT が動くところまで来た。moqt-js というブラウザ向け MOQT ライブラリも公開できた。

現在は Rust から使う QUIC ライブラリを色々試してみている。MOQT 以外でも QUIC はいろいろな場面で使えるからだ。

サーバー側は Erlang/OTP で 1 から QUIC / HTTP/3 / WebTransport / MOQT を実装しているが、これはクローズド。

まとめ

  • クライアントは s2n-quic / msquic / ngtcp2 どれでも使えるようにしておく
    • Rust 製の HTTP/3 や WebTransport の実装を自前でもつ
  • サーバーは Erlang/OTP で 1 から実装し aioquic と msquic や ngtcp2 の Python バインディングとの疎通を確認済み
  • iOS/Android は ngtcp2/nghttp3 を検討

検討

tokio-quiche

Cloudflare の Quiche は Sans I/O で、サンプルが Mio を使っていたが去年 tokio-quiche が公開され、tokio ベースで気軽に使えるようになった。

quiche は HTTP/3 まで実装されていることや、実績もある。ただ依存が多すぎるのと Cloudflare に依存したくないので、テストには使うが採用は見送った。

msquic

MS が開発している C で書かれた QUIC 実装で、なんと I/O 周りがしっかり作り込まれている。さらに Rust 向けに Cargo.toml が用意されているので気軽に利用できる。

とにかく Windows 向けビルドで苦労しないという最大のメリットがある。ただ Linux 向けだと暗号ライブラリがほぼ OpenSSL 一択というのが気になる。Rust の場合暗号ライブラリは aws-lc-rs を使いたいってのがあり、悩ましい。

iOS/Android でも動くが、HTTP/3 と WebTransport 部分が必要なのと、iOS/Android では Multipath QUIC を利用することを考えると msquic はかなりしんどそうという印象。

s2n-quic

AWS が開発している Rust で書かれた QUIC 実装で、tokio 対応済みなので使いやすいが残念ながら iOS/Android では動かない。ただ作り込まれている。

Rust で使うのであれば s2n-quic が良さそうという判断。

その他の Rust 製 QUIC ライブラリ

QuinnNeqo は s2n-quic を超えることはなさそうと判断して採用を見送った。

ngtcp2 と nghttp3

信頼できるライブラリとして C で書かれた ngtcp2 (quic) と nghttp3 (http3/ + webtransport) 実装がある。Rust で利用できるように ngtcp2-sys と nghttp3-sys を作り、この二つをつかって QUIC / HTTP/3 / WebTransport が利用できる ngtcp2 crate を作り、tokio での利用を前提とした tokio-ngtcp2 を作ってみることにした。

ngtcp2 と nghttp3 は可能な限り RFC に準拠しており動作も信頼でき、なにより作者が信頼できる。そのため Rust から気軽に利用できるようにしておくのは大事。Python でも作った。

なので iOS/Android は I/O 周りは自前になる可能性が高いこともあり ngtcp2 + nghttp3 の組み合わせるのが現実的なのでは?と考えている。

現状

HTTP/3 と WebTransport は nghttp3 を参考にピュア Rust で実装することにした。既に動いており shiguredo/http3-rs として Apache-2.0 で OSS として公開予定。

利用する QUIC ライブラリは s2n-quic / msquic / ngtcp2 をどれでも利用できるように、それぞれの crate を用意することにした。

s2n-quic と msquic は自前の http3-rs を使って HTTP/3 と WebTransport に対応した crate を用意。

s2n-quic と自前 HTTP/3 + WebTransport ライブラリで ngtcp2 + nghttp3 と E2E テストが通るようになった。


蛇足

s2n-quic はモバイル向けはない、そもそも msquic もモバイルは正式サポートしていない、そう考えると ngtcp2 と nghttp3 という構成はかなり魅力的な気がしている。