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 ライブラリ
Quinn や Neqo は 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 という構成はかなり魅力的な気がしている。