WEB PROTOCOL

QUIC(HTTP/3基盤プロトコル)

UDPベースの次世代トランスポートプロトコル。1-RTT/0-RTT接続、ストリーム多重化、接続マイグレーションを可視化

INTERACTIVE VISUALIZATION
Initial
Handshake
1-RTT Data
0-RTT
プロトコル
QUIC
UDP-based
Client
IDLE
クライアント状態
Server
IDLE
サーバー状態
進捗
1 / 9
初期状態
シナリオ
QUICの初回接続。TLSとトランスポートのハンドシェイクを統合し、1 RTTで接続を確立します
ステップ1 / 9
自動再生でQUICプロトコルの通信フローを順番に確認できます
QUICはTLSとトランスポートのハンドシェイクを統合。
TCPでは3ウェイハンドシェイク+TLSハンドシェイクで2-3 RTT必要だが、QUICでは1 RTTで完了する
接続状態
ClientIDLE
待機中
ServerIDLE
待機中
解説

📌
QUICとは

QUICは、UDPの上にTCPの信頼性とTLSの暗号化を統合した次世代トランスポートプロトコルです。HTTP/3の基盤として採用されており、接続の高速化、ストリーム多重化、接続マイグレーションを実現します。高速道路の比喩で考えてみましょう。TCP+TLSでWebサイトにアクセスする場合、まずTCP接続の確立(SYN→SYN-ACK→ACK)で1往復、次にTLS暗号化の確立(ClientHello→ServerHello→...)で1-2往復、合計2-3往復(RTT)が必要です。これは一般道で何度も信号待ちするようなものです。QUICはTLSをトランスポート層に統合することで、たった1往復で接続+暗号化の両方を完了します。まさに高速道路でノンストップで目的地に向かうイメージです。QUICはGoogleが2012年に開発を開始し、自社サービス(YouTube、Google検索、Gmail等)で実運用しながら改良を重ねました。2021年にIETFがRFC 9000として標準化し、HTTP/3の基盤プロトコルとして採用されました。現在ではCloudflare、Fastly、Akamai、Meta(Facebook/Instagram)など主要なインターネット企業が採用しており、世界のWebトラフィックの約30%がQUICで処理されていると推定されています。上のツールで「初回接続(1-RTT)」シナリオを再生すると、クライアントとサーバーの間でInitialパケットとHandshakeパケットが交換される様子が確認できます。TCP+TLSでは2-3 RTT必要な処理が、QUICではわずか1 RTTで完了する点に注目してください。

📌
特徴

  • 🚀TLS統合で1-RTT接続TCPでは3ウェイハンドシェイク(SYN→SYN-ACK→ACK)で1 RTT、続いてTLSハンドシェイク(ClientHello→ServerHello→...)で1-2 RTT、合計2-3 RTTかかります。QUICはトランスポート層にTLS 1.3を統合しており、Initialパケット内にTLS ClientHelloを内包して送信するため、たった1 RTTで接続確立と暗号化の両方が完了します。さらに、以前接続したサーバーへの再接続時は0-RTT(ゼロラウンドトリップ)で、ハンドシェイク完了前にデータ送信を開始できます。上のツールで「0-RTT再接続」シナリオを再生すると、Initialパケットと同時にデータが送信される様子が確認できます。
  • 🔒暗号化がデフォルトTCPではHTTPヘッダー等が平文で送信される可能性がありますが、QUICではすべての通信がTLS 1.3で暗号化されます。HTTPヘッダーやペイロードだけでなく、パケット番号や接続制御情報まで暗号化されるため、中間者攻撃や通信内容の盗聴が極めて困難です。これにより、ISPやネットワーク管理者がQUICトラフィックの内容を解析できなくなるため、プライバシーが向上します。
  • 🔀ストリーム独立HTTP/2はTCPの単一コネクション上で複数のリクエストを多重化しますが、TCPレベルで1つのパケットがロストすると、全リクエストが待たされます(Head-of-Line Blocking)。QUICは各ストリームが独立したバッファとフロー制御を持つため、Stream 1でパケットロスが起きてもStream 2のデータ転送は影響を受けません。Webページの読み込みでは、HTML・CSS・JS・画像がそれぞれ別ストリームで並行ダウンロードされ、1つのリソースの遅延が他に波及しません。上のツールで「ストリーム多重化」シナリオを再生すると、Stream 1のパケットロス時にStream 2が正常に動き続ける様子が確認できます。
  • 📱接続マイグレーションTCPは(送信元IP、送信元ポート、宛先IP、宛先ポート)の4組で接続を識別するため、Wi-Fiからモバイル回線に切り替わるとIPアドレスが変わり、接続が切断されます。QUICはConnection ID(接続識別子)で接続を管理するため、IPアドレスが変わっても同じ接続を維持できます。例えば、電車の中でWi-Fiスポットを通過してモバイル回線に切り替わっても、YouTubeの動画再生やZoomの通話が途切れることなく続行できます。上のツールで「接続マイグレーション」シナリオを再生すると、Wi-Fi→モバイル回線の切り替え時にConnection IDにより接続が維持される様子が確認できます。

🌍
実はもう使われている

「聞いたことがない」と感じるかもしれませんが、QUIC は今あなたが使っているブラウザでもう動いています。Chrome、Firefox、Safari、Edge など主要ブラウザはすべて QUIC(HTTP/3)に対応しており、対応サーバーに接続すると自動的に QUIC が使われます。

ユーザーが意識する必要はなく、ブラウザとサーバーが自動的に「QUIC が使えるなら QUIC で、使えなければ TCP で」と切り替えます。

確認してみよう
// Chrome で確認する方法
1. Google.com にアクセス
2. DevTools → Network タブを開く
3. リクエストの Protocol 列を見る
Protocol: h3 ← これが QUIC(HTTP/3)
Protocol: h2 ← これは HTTP/2(TCP)
どれくらい普及しているか
Google(検索, YouTube, Gmail 等)全トラフィックの約30%
Meta(Facebook, Instagram)モバイルアプリで採用
Cloudflare(世界最大級CDN)対応サイトで自動有効化
Akamai / Fastly / AWS CloudFrontHTTP/3 対応済み
Web 全体では: 2024年時点で、全 Web トラフィックの約 30% が HTTP/3(QUIC)で通信されています。特にモバイル環境では回線が不安定なため、QUIC の「接続マイグレーション」や「0-RTT 再接続」が大きな効果を発揮しています。

📌
ユースケース

📺 YouTube(動画配信)
Googleの報告によると、QUICの0-RTT再接続によりGoogle検索の結果表示が約8%高速化されました。YouTubeでは動画のバッファリング(再生開始までの待機時間)がQUICにより大幅に短縮されています。特にモバイル環境では、LTE/5Gの高遅延回線でもRTT削減の効果が顕著に現れます。
🔍 Google検索
検索クエリの送信から結果表示までのレイテンシ(待ち時間)を削減します。モバイル環境ではTCPの3ウェイハンドシェイク+TLSで100-300msかかるところ、QUICの1-RTTで50-100msに短縮できます。再検索時は0-RTTにより、さらに高速にリクエストを送信できます。
☁️ Cloudflare CDN
世界最大級のCDN/セキュリティプロバイダーであるCloudflareは、全トラフィックの約30%をQUIC(HTTP/3)で処理しています。Webサイトの管理者がCloudflareを使っている場合、設定を有効にするだけでHTTP/3対応が完了し、訪問者のブラウザが自動的にQUICで接続します。
📱 Instagram(モバイルアプリ)
Metaが運営するInstagramは、モバイルアプリでQUICを積極的に活用しています。電車移動中やWi-Fi/モバイル切り替え時も、接続マイグレーションによりフィードの読み込みやストーリーの再生が途切れません。不安定なモバイル回線でもストリーム独立性により、1つの画像のロードが遅れても他のコンテンツは正常に表示されます。

📌
用語解説

Connection ID
= 接続識別子
QUICの接続を一意に識別するためのID。TCPではIPアドレスの変更=接続の切断ですが、QUICではConnection IDが変わらない限り同じ接続として扱われます。クライアントとサーバーがそれぞれ独立したConnection IDを持ち、パケットヘッダーに含めて送信します。これにより、Wi-Fi→モバイル回線の切り替え、VPN接続の開始/終了、ネットワーク障害からの復帰でも接続が維持されます。
ClientCID: 0x1a2bServer
Stream
= データフロー
1つのQUIC接続内で独立して動作するデータチャネル。HTTPの各リクエスト/レスポンスは個別のストリームで処理されます。ストリームIDは奇数がクライアント始動、偶数がサーバー始動と決まっています(例: Stream 1, 3, 5はクライアント、Stream 2, 4はサーバー)。各ストリームは独立した送信バッファと受信バッファを持つため、1つのストリームの遅延が他に影響しません。
Stream 1Stream 2Stream 3
Initial Packet
= 初期パケット
QUICの最初のパケットで、TLS ClientHelloを内包しています。UDPデータグラムとして送信されますが、最小1200バイトにパディングされます。これは経路上のMTU(Maximum Transmission Unit)問題を早期に検出するためです。
Initial
Handshake Packet
= ハンドシェイクパケット
サーバーがTLS ServerHello、暗号鍵、証明書を返すパケットです。このパケットを受信すると、クライアントは1-RTTの暗号鍵を導出でき、以降のデータは暗号化して送受信できます。
Handshake
0-RTT
= ゼロラウンドトリップ再接続
以前の接続で取得したPSK(Pre-Shared Key)を使い、Initialパケットと同時にアプリケーションデータを送信する仕組みです。サーバーはハンドシェイク完了前にこのデータを処理開始できるため、応答が高速化されます。ただしリプレイ攻撃のリスクがあり、攻撃者が0-RTTデータを記録・再送する可能性があるため、GETリクエストなど冪等な操作にのみ使用すべきです。決済処理やデータ更新には使うべきではありません。
Initial + 0-RTT DataS
Path Validation
= パス検証
新しいネットワークパスの有効性を検証するプロセスです。クライアントがPATH_CHALLENGEフレーム(ランダムな8バイトデータ)を送信し、サーバーが同じデータをPATH_RESPONSEで返すことで、パスが有効であることを確認します。これにより、攻撃者がIPアドレスを偽装して接続をハイジャックする攻撃を防ぎます。
Wi-FiMobileServer

📌
接続確立の手順(1-RTT)

1
Initial送信
クライアントがInitialパケットを送信します。このパケットにはTLS ClientHelloが内包されており、暗号化に使用するアルゴリズムの候補やDiffie-Hellmanの公開鍵パラメータが含まれます。UDPデータグラムとして送信され、最小1200バイトにパディングされることで経路上のMTU問題を早期に検出します。
2
Handshake応答
サーバーがHandshakeパケットで応答します。TLS ServerHello、選択された暗号化アルゴリズム、サーバー証明書、暗号鍵パラメータが含まれます。クライアントはこのパケットを受信すると1-RTTの暗号鍵を導出でき、サーバーの身元確認(証明書検証)も完了します。
3
接続確立
クライアントがHandshake Completeを送信し、1-RTTで暗号化通信が開始可能になります。TCPでは3ウェイハンドシェイク(1 RTT)+TLSハンドシェイク(1-2 RTT)で最低2-3 RTTかかるため、QUICは接続確立の時間を大幅に短縮できます。この差はモバイル回線のような高遅延環境で特に顕著です。
TCP+TLSSYNSYN-ACKACKClientHelloServerHelloFinishedQUICInitialHandshakeComplete3 RTT1 RTT3 RTT vs 1 RTT
上のツールで「初回接続(1-RTT)」シナリオを再生し、TCPの3ウェイハンドシェイク+TLSと比較してみてください。

📌
TCP+HTTP/2 vs QUIC

HOL Blocking問題
TCP+HTTP/2
TCPは「信頼性のある順序付きバイトストリーム」を提供します。つまり、パケット3が失われた場合、パケット4以降のデータはアプリケーションに渡せません(パケット3の再送・到着を待つ必要がある)。HTTP/2は1つのTCP接続上で複数のHTTPリクエストを多重化しますが、TCPレベルのパケットロスが全リクエストをブロックしてしまいます。
QUIC
QUICでは各ストリームが独立したバッファを持つため、Stream 1のパケットロスはStream 1だけに影響し、Stream 2, 3のデータは正常にアプリケーションに渡されます。Webページの読み込みでは、HTML・CSS・JS・画像が別々のストリームで処理されるため、1つのリソースの遅延が他に波及しません。
上のツールで「ストリーム多重化」シナリオを再生すると、Stream 1のパケットロス時にStream 2が影響を受けないことが確認できます。
0-RTTの仕組み
初回接続でサーバーからNew Session Ticketメッセージを受け取り、PSK(Pre-Shared Key)としてローカルに保存します。このチケットには暗号鍵の導出に必要な情報が含まれています。
再接続時、保存されたPSKで暗号化したデータ(例: GET /search?q=hello)をInitialパケットと同時に送信します。ハンドシェイクの完了を待たずにアプリケーションデータを送れるため、1 RTT分の待ち時間を削減できます。
サーバーはPSKを検証し、有効であればハンドシェイク完了前にリクエストを処理開始します。検索クエリの実行やページの生成を先行して行うことで、応答時間が大幅に短縮されます。
注意:0-RTTデータはリプレイ攻撃のリスクがあります。攻撃者が0-RTTデータを記録・再送する可能性があるため、GETリクエストなど冪等(何度実行しても同じ結果になる)な操作にのみ使用すべきです。決済処理やデータ更新など副作用のあるリクエストには使うべきではありません。
上のツールで「0-RTT再接続」シナリオを再生すると、Initialパケットと同時にデータが送信される様子が確認できます。
接続マイグレーション
Wi-Fi接続でデータ通信中(Connection ID: 0x1a2b)。TCPであればこの接続は(送信元IP:192.168.1.10, 送信元ポート:54321, 宛先IP:203.0.113.1, 宛先ポート:443)の4組で識別されています。
Wi-Fi切断 → モバイル回線に切替。IPアドレスが192.168.1.10から100.64.0.5に変わります。TCPではこの時点で接続が完全に切断され、再接続には3ウェイハンドシェイク+TLSハンドシェイクが必要です。
同じConnection ID (0x1a2b) で新しいネットワークパスからPATH_CHALLENGEフレーム(ランダムな8バイトデータ)を送信します。サーバーはConnection IDによりこれが既存の接続であることを認識します。
サーバーがPATH_RESPONSEで同じ8バイトデータを返し、パスの有効性を確認。以降は新しいパス(モバイル回線)経由でシームレスに通信が継続されます。ユーザーはネットワーク切り替えをまったく意識しません。
上のツールで「接続マイグレーション」シナリオを再生すると、Wi-Fiからモバイル回線への切り替えが確認できます。

関連コンテンツ

HTTP通信

HTTP通信

ブラウザとサーバー間のHTTPリクエスト/レスポンスの仕組みを可視化

TLSハンドシェイク

TLSハンドシェイク

HTTPSで安全に通信するためのTLSハンドシェイクの仕組みを可視化

DNS名前解決

DNS名前解決

ドメイン名からIPアドレスへの階層的な問い合わせの流れを可視化

HTTP/1.1 vs HTTP/2

HTTP/1.1 vs HTTP/2

直列リクエストと多重化の違いをウォーターフォールチャートで比較

JWTの作り方

JWTの作り方

ヘッダー.ペイロード.署名の構造と検証の仕組みを可視化

OAuth 2.0のフロー

OAuth 2.0のフロー

認可コードフロー、トークン交換の往復を可視化