
2026/03/20 3:17
Noq:n0がRustで実装した新しいQUIC
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
noq(「番号 0 QUIC」)は、Quinn をベースに構築されたオープンソースの QUIC 実装で、QUIC マルチパス仕様と NAT トラバーサルへの完全な対応を追加し、プライバシー強化型公開 IP 発見用 QAD(QUIC アドレスディスカバリ)も備えています。2024 年に Quinn から派生し、パス切替、各パスの輻輳状態、NAT 処理など Quinn が公開していなかった機能を露出させることで、noq は広範な Quinn ユーザー基盤に影響を与えることなく深く変更できます。iroh v0.96 を動かすのは既に数十万台のデバイスで、picoquic との相互運用性テストも行われています。主な追加機能として、新しい
WeakConnectionHandle 型(軽量接続参照)とマルチパス固有イベントを含む拡張 qlog サポート、およびプロトタイプビューアがあります。今後の作業では NAT トラバーサルの改善、マルチパス性能の向上、QUIC WG および Quinn 開発者との協力強化が予定されています。このプロジェクトは Discord や GitHub の Issue を通じて貢献を歓迎しています。本文
本日、私たちは noq(“number 0 QUIC”)を発表できることを大変嬉しく思います。これはマルチパスとNATトラバーサルに対応した当社独自の汎用 QUIC 実装です。i‑roh の v0.96 以降で動作しているトランスポートレイヤーですが、i‑roh 固有の用途に限定されるものではありません。
ソフトフォークからハードフォークへ
i‑roh の開発を追ってきた方なら、2024 年に Quinn をフォークした理由をご存知かもしれません。簡潔に言うと、i‑roh は QUIC 周辺で多くの重い処理―リレーとダイレクトパスの切り替え、NATトラバーサルの管理、輻輳状態の調整―を行っていましたが、QUIC 自体はその全てを把握しておらず、その不一致が外部から修正できない問題を生み出しました。
フォークは小さく始めました。Quinn の上流変更を追いかけつつ貢献し、差分を最小限に抑えることが当時の適切な判断でした。しかし、QUIC マルチパス、NATトラバーサル、そして独自のリレー‑アズ‑ア‑パス構成へと進むにつれ、両プロジェクトの開発速度は一致しなくなりました。頻繁に行われる変更は Quinn のメンテナに対して過度なレビュー負担をもたらしました。
n0 チームは QUIC 実装により深い構造的変更を試みたく、これらの影響をすべて Quinn ユーザーに押し付けることは不公平だと判断しました。協力関係を継続しつつハードフォークする方が全体として合理的です。こうして決断しました。
Quinn のマルチパス課題スレッドで私たちの考えを説明しています。これは Quinn を否定するものではなく、解決すべき問題が十分に特異であるため、別々のコードベースで協力し合うことが正しい道だと認めるものです。
noq の主な特徴
ヘッドラインは QUIC マルチパス仕様を完全実装した点です。ここで Quinn / noq 内外に大きなアーキテクチャの転換が起こりました。
- マルチパス以前、i‑roh はリレー・ダイレクト IPv4・IPv6 など複数パスを QUIC レイヤー下で扱っていました。
- Quinn は単一 IP アドレス経由とみなしていたのに対し、i‑roh は最適なパスへパケットを振り分けていました――Quinn の上に i‑roh 独自の小規模 NAT を置いているようなものです。
- マルチパスでこれらは QUIC のファーストクラス概念となります。
- リレーパスは QUIC パス。
- ダイレクト UDP パスも QUIC パス。
- QUIC はすべてを知り、各パスごとの輻輳状態を保持し、どれを使うか判断できます。
これにより、輻輳コントローラのリセットでハックしていたレイテンシ改善が正しく体系的に処理されます。マルチパス実装は汎用的で i‑roh だけではなく、任意の用途向けに QUIC マルチパス仕様を完全に実装することを目指しています。ただし実装はまだ若く、追加 API が必要な場合は遠慮なくご相談ください。
また、私たちは QUIC NAT トラバーサルドラフトを独自解釈して実装しました。現時点で本格的かつ堅牢にこれを行ったのは初めてです。NATトラバーサルは非常に微妙で、野外で遭遇する様々な NAT 動作を網羅するのは困難ですが、i‑roh を稼働させている数十万台のデバイスで実際にテストし続けています。まだ仕様が確定していないため、継続的に改善していきます。
NAT トラバーサル・ホールパンチングを QUIC レベルの操作として直接表現することで、QUIC 輻輳コントローラがそれを認識し、損失検知も向上します。
- i‑roh はバージョン 0.32 以降 QUIC Address Discovery (QAD) を利用しています。
- QAD は QUIC 接続を通じてクライアントのパブリック IP を学習し、従来 STUN で行っていた処理を置き換えます。
- QUIC による暗号化はラウンドトリップ数を削減しつつプロトコルの硬直化を防ぎ、ユーザプライバシーも向上します。
Qlog は QUIC 接続に関する膨大な情報をログするドラフト仕様です。デバッグツールとして優秀で、qvis のような可視化ツールがパケットフローを表示できます。noq では Qlog サポートを拡張し、メインの qlog ロギングスキーマと QUIC イベント定義から多くのイベントを追加しました。またマルチパス用のイベントも導入しています。複数パスでのパケットフローを表示できるビューワープロトタイプもあります。
API の大部分はマルチパス対応ですが、WeakConnectionHandle という新型も追加しました。これは接続自体を保持せず、まだドロップされていない場合にフルの Connection にアップグレードできる型です。
std::sync::Weak のように振る舞いますが Arc を必要としません。接続マネージャー構築などで役立ちます。i‑roh 内部でも使用しており、他にも有用なユースケースは多数存在します。
既に本番稼働
noq は i‑roh v0.96 とともにリリースされて以降、本番環境で稼働しています。最新バージョンの i‑roh を使用していれば、すでに noq が使われています。noq のマルチパス実装を自己テストしただけでなく、picoquic(QUIC ワーキンググループの相互運用イベントで採用される参照実装)の相互運用テストも実施しています。
今後の展望
noq を長期的基盤として捉えています。NAT トラバーサルのさらなる改善や、マルチパスによって可能になる性能最適化などを継続して行います。また QUIC ワーキンググループと協力し、Quinn チームとも共通関心領域で連携していきます。
QUIC 実装、P2P トランスポート、あるいは多様なネットワーク条件下で動作するアプリケーションを開発中の方はぜひご相談ください。Discord でお会いできるか、GitHub に issue を立てていただければ幸いです。
Rust で書かれた QUIC マルチパス実装に挑戦したい方は、マルチパス noq Connection のドキュメントを参照してください。
Iroh は「どのデバイスでもすぐに接続できる」ネットワーキングライブラリです。既存プロトコルのエコシステムから必要な機能を組み合わせるか、単純パイプ上で完全カスタムな抽象化を構築するか選べます。Iroh はオープンソースであり、数十万台のデバイスで本番稼働しています。始め方はドキュメントを確認したり、コードに直接飛び込んだり、Discord チャンネルでチャットしたりしてください。