はじめに
QUIC(Quick UDP Internet Connections)は、HTTP/3の通信基盤となっている新しい通信プロトコルです。UDP をベースにしつつ、TCP に劣らない信頼性とTLS 1.3 のセキュアさを兼ね備え、さらに高速という特長があります。
本記事では以下のような疑問をやさしく解説していきます:
- なぜHTTP/3は TCP ではなく UDP を選んだのか?
- UDP って送信したら終わりじゃなかった?
- QUIC はなにをどうやって信頼性を保っているの?
- 移動環境で強いってほんと?
- インフラ側ではどんな制約がある?
✅ 本記事のスタンス:
本記事は、Webエンジニア・インフラ初学者・ブラウザ開発者ではない方を主な対象に、QUICとHTTP/3の概念・狙い・技術的特徴をわかりやすく紹介することを目的としています。
触れる内容
- TCP/UDP の違いと、QUIC が UDP を採用した理由
- QUIC がどのようにして信頼性や多重化・TLS統合を実現しているか
- 移動環境(携帯通信やStarlink)における利点
- QUIC の実用例や導入の進展
- インフラ環境での課題(NAT テーブル、プロキシ、WAF など)
本記事では触れない内容(別記事での掘り下げ予定)
- QUIC のパケット構造の詳細
- TLS 1.3 のハンドシェイクや鍵交換の細部(Diffie-Hellman の内部動作など)
- QUIC のフレーム形式、再送アルゴリズムのコードレベル
- IPv6 特有の挙動や、QUIC におけるNAT非依存の動作の技術仕様
目的は 「これから QUIC という言葉を聞いたときに、自信をもって話せるようになる」 ことです!
TCP と UDP の簡単なおさらい
TCP とは?
TCP はコネクション型のプロトコルで、再送制御・順序制御・輻輳制御を内蔵しています。通信の信頼性をカーネル空間 で管理し、確実に届く設計がされています。
UDPとは?
一方、UDP は「送ったら終わり」のプロトコルで、信頼性制御は一切しません。
その代わり、オーバーヘッドが小さくて高速です。リアルタイム性が重要な DNS や動画通話、ゲームなどで活用されています。
なぜ HTTP/3 は UDP ベースの QUIC を使うの?
HTTP/2 までは TCP 上に構築されていましたが、以下の課題がありました:
- TCP のコネクション確立に複数ラウンドトリップが必要(遅延)
- HOL(Head of Line)ブロッキング問題(一つのストリームが詰まると他も止まること)
- 接続先が変わると TLS の再ネゴシエーションが必要
QUIC はこれらの課題を解決するために、UDP上に「信頼性をアプリケーション層で実装する」 という逆転ともいえる発想で登場しました。
QUIC は UDP でどうやって信頼性を保っている?
QUIC は以下をすべて自前で実装しています:
- ストリームの多重化
- パケットの再送・順序管理
- 輻輳制御(Bbrなど)
- 暗号化と鍵交換(TLS 1.3)
つまり、QUIC はユーザー空間で動作するアプリケーション層で実装された “TCP の進化版” のような振る舞いをします。
項目 | TCP | QUIC |
---|---|---|
ステート管理 | カーネル空間 | ユーザー空間 |
再送制御 | 内蔵 | 自前実装 |
暗号化 | TLS(別レイヤ) | TLS 1.3と統合 |
多重化 | HTTP/2以降のみ | 標準で実装 |
実際の通信の流れ
QUIC では TLS 1.3 を統合しており、接続の確立が最短1往復で完了します。0-RTT 再接続も可能です。
※ 0-RTT 再接続 とは、以前のセッション情報を使ってTLSの再交渉なしに即座にデータを送れる仕組みです。
Webアプリ(たとえば Next.js)開発者は何か変えないといけない?
いいえ、大丈夫です。
- Next.js は、HTTPレベルのリクエストだけを意識しており、QUIC かどうかには無関心です。
- OSI参照モデルの原則に則り、通信層は抽象化されています。
- Caddy などのリバースプロキシを挟むことで、Next.js 側のコード修正なしに QUIC に対応可能です。
QUIC を支える ブラウザ と 中継サーバー のがんばり
Caddy を挟んだ構成図(例)
サーバー側(例:Caddy)
- UDP443 ポートでリッスン
- HTTP/3 と TLS1.3 のサポート
- ストリーム ID や再送制御、暗号化処理なども担う
クライアント側(例:Chrome などのモダンブラウザ)
昔のブラウザ
- TCP 接続:OS 任せ(カーネルが管理)
- HTTP リクエスト:アプリケーション(ブラウザ)側で構築
- HTML/CSS/JS:実装は分離され、比較的単純だった
QUIC 対応の現代ブラウザ
- QUIC(UDP上)接続とTLS1.3ハンドシェイク
- 再送・順序制御・輻輳制御なども自前で実装
- ストリーム優先度制御、ネットワーク状況に応じた最適化
- タブごとのサンドボックス化とキャッシュ管理
💡 現代のブラウザは、超知的な全自動マネージャーです。
QUIC は移動通信時に真価を発揮!
QUIC の大きな利点の一つは、モバイル通信などで IP アドレスや接続先が変わっても通信が切れにくいという点です。
これは次のような場面で活きます:
- スマホで基地局をまたいで移動(新幹線など)
- Starlink などの衛星通信
- 無線 LAN から LTE に切り替わったとき
TCP では再接続が必要になる場面でも、QUIC はコネクション ID により接続継続が可能です。
実は、我々の多くは QUIC をすでに使っている。
Google や Facebook、Cloudflare などの大手はすでに QUIC(HTTP/3)を導入済みです。
curl -I --http3 https://cloudflare-quic.com
HTTP/3 200
...略...
alt-svc: h3=":443"; ma=86400 # これでブラウザは「HTTP/3いけるな」と判断 → 次回はUDPで接続を試すようになる
このようにして、自分の環境でも HTTP/3 が有効かどうかを確かめることができます。
また、DNSには HTTPS
レコードも登場し始めており、QUIC に対応したサーバーを名前解決の段階で判断できるようになっています。
一方で、QUIC が使えないインフラ事情も...
QUIC は万能ではありません。たとえば:
- UDP を通さない WAF・ファイアウォール
- 企業ネットワークで HTTP プロキシを必須とする環境(HTTP/2 すら通らない場合も)
- TCP 前提の通信ログ・監視・NAT装置
- UDP セッション数が多いと、NATテーブルが枯渇して通信障害を起こす
そのため、QUIC の導入にはインフラレイヤーの事前検証と対策が必須です。
IPv6 ではどうなの?
本記事は IPv4 前提で構成していますが、IPv6 環境では一部の動作や構成が異なる可能性があります。
特に NAT やルーティング、セッション確立周りは IPv6 では異なる挙動となるため、別途の検証が必要です。
なお、IPv6 における QUIC や NAT テーブルの考え方は IPv4 とは大きく異なるため、別記事で掘り下げる予定です。
おわりに
QUIC は、TCP の限界を超えるために「UDP上にTCP+TLS+多重化」をアプリ層で実現した、非常にユニークなプロトコルです。
セキュリティ的にも通信設計的にも、今後のインターネット通信を支える鍵になる技術のひとつです。
まだまだ発展途上ですが、あなたのスマホやブラウザでも、すでにQUICは使われているかもしれません。
「TCPの限界」を知ることが、QUICの価値を理解する第一歩!
ここまで読んでいただき、ありがとうございました!