世界を動かす技術を、日本語で。

カーネル向けのQUIC

2025年8月1日原文(lwn.net)

概要

  • LWN購読者の特典 とサイト支援の重要性
  • QUICプロトコル の特徴とLinuxカーネルへの統合状況
  • TCPの課題 とQUICによる解決策
  • カーネル実装の 現状と今後の展望
  • パフォーマンスや対応アプリケーション の現状と課題

LWN購読者の主な特典

  • LWN購読 の最大の意義は、サイト運営の継続支援
  • 購読者は 全コンテンツへの即時アクセス が可能
  • 追加機能 の利用権
  • サイトの発展に 直接貢献

QUICプロトコルの概要とLinuxカーネル対応

  • QUIC は2013年に初登場したトランスポート層プロトコル
  • TCPの遅延や改良困難 など現代インターネットの問題に対応
  • 三者間ハンドシェイク廃止 による高速な接続確立
  • UDP上に構築 され、複数ストリーム伝送やヘッドオブラインブロッキング回避
  • エンドツーエンド暗号化 でメタデータ漏洩やプロトコル硬直化を防止

TCPの課題とQUICの利点

  • TCPは改良困難 で、ミドルボックスによるプロトコル硬直化が深刻
  • マルチパスTCP などの改良も困難
  • QUIC はUDPベースで柔軟な設計
    • TLSによる認証・暗号化 を標準装備
    • ストリームごとの独立性 でパケット損失の影響を最小化

カーネル実装の現状と技術的詳細

  • Xin Long氏 によるLinuxカーネル向けQUICパッチが投稿
  • IPPROTO_QUIC という新しいプロトコル型を追加
  • socket(), bind(), connect(), listen(), accept()など TCP類似のAPI
  • TLSハンドシェイク はユーザ空間で実施
    • libquicやtlshd (ktls-utilsプロジェクト)が利用可能
  • TLSネゴシエーション結果のキャッシュ で再接続高速化

パフォーマンスと課題

  • 現状のカーネル実装は期待ほど高速でない
    • in-kernel TLSと比較しスループットが約1/3
    • TCPとの比較では4倍以上の差
  • 主な要因
    • セグメンテーションオフロード未対応
    • 送信経路での追加データコピー
    • ヘッダー暗号化によるオーバーヘッド
  • 今後の見通し
    • ハードウェアオフロード対応で性能向上期待
    • カーネル実装の最適化進展

アプリケーション対応と今後の展望

  • Sambaサーバ・クライアント 向けQUICサポートのプルリクエストが承認済み(2024年7月17日)
  • SMB・NFSファイルシステム への対応も検討中
  • curl 向けカーネルQUIC対応リポジトリも登場
  • 今後多くのアプリケーションで採用拡大 の見通し
  • 現在は約9,000行の低レベル実装のみ
    • 残りの実装も今後投稿予定
    • レビューやマージには時間がかかる見込み
    • 最短でも2026年以降のメインライン統合 が予想

まとめ

  • QUICのカーネル統合 は着実に進行中
  • パフォーマンスやアプリ対応 は今後の最適化と拡大に期待
  • LWN購読 による情報取得とコミュニティ支援の重要性

Hackerたちの意見

QUICの欠点についての記事を思い出したよ: https://www.reddit.com/r/programming/comments/1g7vv66/quic_i... これがその問題を解決する方向に進んでいるみたいだね。将来的にはハードウェアサポートも受けられるんじゃないかな。

QUICは機械間トラフィックのようなユースケースにはあまり向いていないね。でも、今のインターネットのトラフィックのほとんどはモバイルフォンからサーバーへのもので、そこでQUICとHTTP 3が輝くんだ。他のユースケースではTCPを使い続ければいいと思う。

QUICは速さを目指しているけど、パッチシリーズに含まれているベンチマーク結果は、提案されたカーネル内実装がそれに達していないことを示している。カーネル内QUICとカーネル内TLSの比較では、後者がいくつかのテストでほぼ3倍のスループットを達成している。暗号化を無効にしたQUICと通常のTCPの比較はさらに悪く、TCPが場合によっては4倍以上の差で勝っている。マジでやばいな。ユーザースペースのQUIC実装もこんなに遅いのか知ってる人いる?

そうなんだよね。さらに悪いことに、TCPトラフィックの混雑に直面すると、何もなくなっちゃうのを見たことがある。もしQUICが本当に未来のプロトコルなら、カーネルに移行するのはいいことだと思う。こんなに大きなユーザースペースの実装をあちこちに提供して、なおかつ古き良きTCPに勝てると思ってるのは狂気だよ。NICレイヤーまで最適化が必要になるかもしれないし、ミドルボックスもね。あ、UDPのCPUコストについてはまだ触れてないけど。逆に、TCPはジムでいつもダボダボの服を着てる静かな奴みたいなもので、誰も見てないときにベンチで4プレートやるんだ。過小評価しちゃダメだよ。この教訓を学ぶのに数ヶ月無駄にしたから。

「速い」という主張は単に違うと思う。QUICは以下のようにして速くすることを目指している: - レイテンシの低いハンドシェイク - ユーザーとサーバーの間の悪い「ミドルウェア」ボックスを避ける - ユーザーのIPアドレスが変わったときに接続をリセットしない - ヘッドオブラインブロッキングや多くの接続の立ち上げコストを避ける - 悪い混雑制御アルゴリズムを避ける - おそらく他にもいろいろ これらは、ユーザー(多くはモバイルデバイス)とサーバーの間でよく見られるネットワーク状況でうまく機能するためのものだと思う。QUICはデータ送信時のOSオーバーヘッドを減らすことで速くなることを目指しているわけじゃないし、オペレーティングシステムがこのフローに対してより最適化され、ハードウェアがより多くの作業をオフロードできるようになるまで、一般的には長い間遅くなることを期待すべきだと思う。もしあなたがGoogleなら、そのために特化したネットワークカードやドライバー、ソフトウェアに投資するつもりだろうね。

TCPがどれだけよく設計されているかの興味深い証拠だね。

QUICのパフォーマンスはバッチ処理の使い方に気をつけないといけない。UDPパケットを無造作に使うと、つまりシステムコールごとに1つのQUICパケットを送ると、すごくオーバーヘッドがかかるんだ。カーネルがどのインターフェースを使うか決めて、バッファにキューイングするたびにね。TCPのように使って、たくさんのデータをバッチ処理して1回の「呼び出し」でパケットをキューイングすると、すごく助かる。同様に、カーネルのWireGuard実装はトラフィックをバッチ処理しないから、wireguard-goより遅くなることがある。現代のハードウェアが提供する速度では、効率的にするためにベクタードI/Oを使う必要があるね。

そうだね。msquicは最高のパフォーマンスを誇る実装の一つで、約7Gbpsを達成してる。

TCPの方がQUICよりもベンチマークでずっと良いパフォーマンスを発揮すると思うよ。実際にローミングLTE接続でベンチマークをやって、結果を持ってきてほしいな。実際のベンチマークコードを見ないと、その特定の結果に気を使うべきかどうかも判断しづらいし。もし目的が内部または公共のインターネットでAからBに大量のバイトを送ることなら、TCPを上回るものはほとんどないと思う。数十年かけてTCPを最適化してきたからね。HOLブロッキングが問題でなければ、HTTPをTCPの上で使い続ければいいんじゃないかな。

個人的には、Googleのプロプライエタリなクソみたいなものだから、避ける理由としては十分だと思う。それが実際に良くないっていうのも、さらに説得力のある理由だね。

これは明らかな誤解だと思う。理由は記事自体に書いてあるけど。QUICの魅力は、硬直化に対して免疫があること、プロトコルのパラメータを変更するのにLinuxのメンテナーに頼む必要がないことだよ。

硬直化は「Linuxのメンテナー」の決定から生じるわけじゃない。ミドルボックスを設計、販売、展開している人たちを見ないといけないよ。

Hacker Newsで議論の続きを見る