【入門編】QUICにおけるストリーム多重化とHTTP/2のマルチプレクシングの比較 – HTTPプロトコル・通信規格実践ガイド

こんにちは!技術メディア編集長のネットワークアーキテクトです。

日々のWebブラウジング、サクサク快適に楽しめていますか?私たちが何気なく見ているウェブサイトは、裏側で数え切れないほどのデータ(画像、テキスト、動画など)のやり取りを行っています。

さて、この通信を支える主役といえば「HTTP」ですが、現代のウェブを爆速にした「HTTP/2」と、さらにその先を行く次世代の「QUIC(クイック)」というプロトコルについて耳にしたことはありませんか?

「名前は聞いたことがあるけれど、TCPとかパケットロスとか難しそう……」
そんな風に思っているインフラ初心者のあなたへ!今回は、難しい専門用語の壁をうんと低くして、身近な「郵便配達」に例えながら、HTTP/2とQUICの決定的な違いを紐解いていきましょう。一歩ずつ理解していけば、決して怖くありませんよ。それでは、出発進行です!

—

1. まずは「HTTP/2」のマルチプレクシングと、あの有名な弱点を振り返ろう

まずは、現代のウェブの土台を大きく変えたHTTP/2のお話から始めましょう。

HTTP/2の最大の偉業は「マルチプレクシング(多重化)」という技術を導入したことです。これ以前のHTTP/1.1では、1つの通信レーン(TCPコネクション)につき、1つのリクエストとレスポンスしか同時に処理できませんでした。
イメージとしては、「1車線しかない細い道路で、前のトラックが荷物を下ろし終わるまで、後ろの車が1台も進めない状態」です。これでは大渋滞が起きてしまいますよね。

そこでHTTP/2は、その1つの道路の中に「いくつもの仮想的なレーン(ストリーム)」を通しました。これにより、1つの大きな道路を共有しながら、画像やスクリプトなど複数のデータを同時にビュンビュンやり取りできるようになったのです。

HTTP/2に立ちふさがる「TCPヘッドオブラインブロッキング」の壁

「やった!これで渋滞は解決だ!」……と言いたいところなのですが、実はHTTP/2にも隠された弱点がありました。それが、今回主役となる「TCPヘッドオブラインブロッキング(Head-of-Line Blocking)」という現象です。名前が呪文のようですね(笑)。

これを郵便配達に例えてみましょう。

  • あなたの家に、10通の郵便物がまとめて入る大きなバッグ(TCPコネクション)が届きます。
  • そのバッグの中には、HTTP/2の仮想レーン(ストリーム)で仕切られた「手紙A」「手紙B」「手紙C」が入っています。
  • ところが、配達の途中で「手紙A」が雨で少し濡れてしまい、配達員さんが「ちょっと待てよ、このAが読めるようになるまで、次のBもCもみんな一旦ストップね!」と、バッグ全体の動きを止めてしまいました。

……変だと思いませんか? 手紙Bも手紙Cも中身は無傷なのに、手紙Aがトラブルを起こしたせいで、後ろの荷物まで全部足止めを食らってしまうのです。
これが、HTTP/2が抱える「TCPのせいで全体の列が止まってしまう(ヘッドオブラインブロッキング)」という構造的な弱点なんです。

—

2. 次世代の切り札「QUIC」登場!ストリームの完全な独立とは?

「じゃあ、その足止めをどうにかしようよ!」という世界中のエンジニアの願いから生まれたのが、Googleが開発を主導し、現在は標準化された「QUIC」です。

QUICは、HTTP/2の下で頑張っていた「TCP」という古い交通ルールを思い切って捨て、新しく「UDP」という別の交通ルールをベースに作り直したプロトコルです。

QUICがすごいのは、HTTP/2のマルチプレクシングをさらに進化させ、「ストリームごとの完全な独立性」を手に入れたことです。

再び郵便配達の例えに戻りましょう。
QUICの世界では、大きなバッグを1つだけドカンと使うのではなく、「完全に独立した個別のポシェット(QUICストリーム)」をいくつも用意して、それぞれ別のバイクで同時に配達します。

ここで、先ほどと同じように「手紙Aの入ったポシェット」が雨で濡れてモタモタしたとしましょう。QUICの世界ではどうなるでしょうか?

  • 手紙Aのバイクは足止めを食らいます。
  • しかし、手紙Bや手紙Cの入ったポシェットを積んだ別のバイクは、そんなことお構いなしにスイスイとあなたの家に到着し続けます!

これが、QUICにおける「パケットロス時の影響の局所化」です。
通信の途中でデータの塊(パケット)が1つや2つ消えたり遅れたりしても、影響を受けるのはそのトラブルが起きた特定のストリーム(データのレーン)だけで、他の無関係なデータは一切影響を受けずにスムーズに画面に表示され続けます。

—

3. わかりやすい比較まとめ

ここまでの内容を、表でスッキリ整理してみましょう。

| 項目 | HTTP/2 (over TCP) | QUIC (over UDP) |
| :— | :— | :— |
| ベースとなる交通ルール | TCP(確実だけど融通が利かない) | UDP(自由度が高く、自分で制御する) |
| データの流れの単位 | ストリーム(ただし大元のTCPで繋がっている) | 完全に独立したストリーム |
| パケットロスが起きたら? | 全体の列車がストップ!(TCP HoLブロッキング) | トラブルのあった車両だけが止まる!(影響が局所化) |
| 実環境での体感 | 電波が不安定な場所で読み込みがカクつきやすい | 地下鉄や移動中でもパッパと表示されやすい |

どうでしょう? こうして見ると、QUICがなぜこれからのインフラの主役に推されているのか、その理由が直感的にわかりますよね。

—

4. 実務の現場から:私たちエンジニアはどう向き合うべき?

「なるほど、QUICってすごいんだな。じゃあ明日からコードを書き換えるぞ!」……と言いたいところですが、実務の現場では少し違ったアプローチが必要です。

実は、現代のWebアプリケーション(NginxやApacheなどのWebサーバー、そしてCloudflareなどのCDN)では、私たちが特別な設定をしなくても、ブラウザとサーバーが勝手にネゴシエーション(お見合い)を行って、使えるなら自動的にQUIC(HTTP/3)に切り替えてくれるようになっています。

例えば、NginxでHTTP/3(QUICのHTTP版)を有効にする設定は、驚くほどシンプルです。

NginxにおけるHTTP/3 (QUIC) 有効化のサンプル設定
server {
# 443番ポートでHTTPSを待ち受けつつ、UDP通信(QUIC)も同時に受け付ける設定にします
listen 443 ssl;
listen 443 quic reuseport;

# SSL証明書の設定(QUICには強固な暗号化が必須です)
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

# ブラウザに対して「ウチのサーバー、QUICも喋れるよ!」とこっそり教える魔法のヘッダー
add_header Alt-Svc ‘h3=”:443″; ma=86400’;

location / {
root /var/www/html;
index index.html;
}
}

(※上記はイメージを掴むための簡略化した設定例です。実際に本番環境で構築する際は、利用するサーバーのバージョンやモジュールの依存関係を公式ドキュメントで必ず確認してくださいね!)

このように、インフラエンジニアの仕事は「パケットロスが起きた時にどうやって個別のストリームを守るか」という難しい制御を自分でゼロから書くことではなく、「ブラウザとサーバーが安全にQUICのレーンを使えるような道(ネットワーク経路とセキュリティ設定)を綺麗に整備してあげること」にシフトしています。

—

おわりに

今回は、HTTP/2のマルチプレクシングとQUICのストリーム多重化の違いについて、郵便配達のストーリーを交えながら解説しました。

  • HTTP/2は1つの大きな道路の中で複数のレーンを作ったけれど、大元のルール(TCP)のせいで、一部の事故が全体を止めてしまう弱点があった。
  • QUICは、完全に独立した個別のポシェット(ストリーム)を用意し、UDPベースで動くことで、トラブルの影響をその場限りに閉じ込める(局所化する)ことに成功した。

ネットワークの世界は、一見すると難解な暗号やアルゴリズムの塊に見えますが、私たちが普段暮らしている現実世界の「物流」や「コミュニケーション」の仕組みと照らし合わせてみると、すごく理にかなっていて面白いものです。

「インフラって、なんだか奥が深くてちょっとワクワクするかも……」
そう感じてもらえたなら、筆者としてこれ以上の喜びはありません。

それでは、また次回の技術解説でお会いしましょう!快適なネットワークライフを!

コメント

タイトルとURLをコピーしました