Quick UDP Internet Connections(QUIC)は汎用トランスポート レイヤ プロトコルであり、その高い柔軟性、組み込みのセキュリティ、パフォーマンス問題の低減、普及の促進によって、Transmission Control Protocol(TCP)に代わるものとして設計されました。QUICは、もともとはGoogleによって開発され、クライアントとサーバ間のパケット移動に下位トランスポート メカニズムとしてUser Datagram Protocol(UDP)を使用します。特に、Transport Layer Security(TLS)は、HTTP/1.1やHTTP/2のような追加のレイヤとしてではなく、必須コンポーネントとして組み込まれています。

QUICをベースにしたHTTP/3は、Hypertext Transfer Protocol(HTTP)の3番目のメジャー バージョンであり、2022年にIETF標準として採用されました。QUIC+HTTP/3は、パフォーマンスとユーザー エクスペリエンスを制約するTCP固有の制限を解決するために作成されました。

APIの仕組み

APIはアプリケーションの「公開部分」であり、アプリケーションが実行する機能と提供可能な情報を明らかにし、要求の適切な形式を定義します。開発者がアプリケーションのAPIを作成して公開すると、他のアプリケーションがそのAPIと通信できるようになります。

多くの場合、APIは広く使用されている機能をすぐに利用できるようにするため、開発者の貴重な時間を節約します。開発者は、既存のアプリケーションの機能を複製するのではなく、既存のアプリケーションのAPIを呼び出すことで、その機能をアプリケーションに統合できます。

HTTPを示す図

HTTPトランスポート スタックの概要

QUIC+HTTP/3の基本

QUICが目指すところは、パフォーマンス、信頼性、およびセキュリティに優れたトランスポート プロトコルをHTTP/3に提供することです(QUICは非HTTPトラフィックにも適しています)。

QUICをご存じない場合は、以下の入門ビデオをご覧ください。

UDP、TCP、TLS

UDPは、最初の接続を確立するためにTCPのように複雑な3ウェイ ハンドシェイクを必要としない、シンプルで軽量のプロトコルです。このシンプルさのおかげでUDPは高速でコネクションレスとなっていますが、TCPと比較すると、信頼できる安全な通信に不可欠な機能がないことも意味します。

QUICの特長は、UDPプロトコルとTCPプロトコルの両方のメリットを兼ね備えていることです。コネクションレスであり、下位トランスポート プロトコルにUDPを活用して接続およびトランスポートの遅延を低減する一方で、パケット配信を保証するTCPの接続確立および損失検出機能を再実装することによって、上位レイヤではコネクション型になっています。欠落したデータの特定と再送の実行のタスクを処理して、シームレスなユーザー エクスペリエンスを確保します。

また、QUICには、TLSがHTTP/1.1やHTTP/2のような追加のレイヤとしてではなく、必須コンポーネントとして組み込まれています。この組み込みにより、メッセージがデフォルトで暗号化されます。

QUICネットワークの概要

下の図は、QUICネットワークの基本的な構造を示しています。図のように、HTTP/3のリクエスト、レスポンス、またはアプリケーション データが含まれている論理オブジェクトが、QUICのストリームです。ネットワーク エンドポイント間の送信の場合、QUICのストリームは複数の論理レイヤ内にラップされます。

QUICのネットワーク構造を示す図

QUICのストリームの構造

論理レイヤとオブジェクトは、外側から内側に向かって次のようになっています。

  • UDPデータグラム – 送信元ポートと送信先ポート(長さおよびチェックサム データとともに)を指定するヘッダーが含まれ、その後に1つ以上のQUICパケットが続きます。データグラムは、ネットワークでクライアントからサーバに送信される情報の単位です。
  • QUICパケット – 1つのQUICヘッダーと1つ以上のQUICフレームが含まれています。
  • QUICヘッダー – パケットに関するメタデータが含まれています。以下の2種類のヘッダーがあります。
    • ロング ヘッダーは、接続を確立するときに使用されます。
    • ショート ヘッダーは、接続確立後に使用されます。データの中でも特に、接続ID、パケット番号、およびキー フェーズ(キー ローテーションをサポートして、パケットの暗号化にどのキーが使用されたかを追跡するために使用)が含まれています。パケット番号は、特定の接続およびキー フェーズに一意です(常に増加します)。
  • フレーム – タイプ、ストリームID、オフセット、ストリーム データが含まれています。ストリーム データは複数のフレームにまたがりますが、データのチャンクを正しい順で表示するための接続ID、ストリームID、オフセットを使用して組み立てることができます。
  • ストリーム – 1つのQUIC接続内の一方向または双方向のデータのフロー。各QUIC接続は、それぞれが独自のストリームIDを持つ複数の独立したストリームをサポートできます。いくつかのストリームが含まれているQUICパケットが失われても、欠落しているパケットに含まれていないストリームの進行には影響を与えません(これは、HTTP/2で発生するヘッドオブライン ブロッキングを回避するのに重要です)。ストリームは双方向であり、いずれかのエンドポイントによって作成されます。
TLSハンドシェイクを使用したQUICの仕組み

TLSハンドシェイクは、クライアントとサーバ間の安全な接続を提供します。QUICで提供される暗号化にはTLS v1.3が必要です。下の図のように、QUICでは暗号化キーを提供するTLSの「コンテンツ レイヤ」は維持されますが、「レコード レイヤ」が独自のトランスポート メカニズムに置き換えられます。

TLSとQUICのレイヤを示す図

QUICでは、認証と、セキュリティやパフォーマンスに不可欠なパラメータのネゴシエーションにもTLSを利用します。厳密な階層化ではなく、2つのプロトコルが連携します。つまり、QUICはTLSハンドシェイクを使用して安全な接続を確立し、TLSはQUICによって提供される信頼性、順序付けられた配信、レコード レイヤを利用します。

大まかに言うと、TLSコンポーネントとQUICコンポーネントの間には主に2つのやり取りがあります。

  • TLSコンポーネントは、QUICコンポーネント経由でメッセージを送受信し、QUICはTLSに信頼できるストリーム抽象化を提供します。
  • TLSコンポーネントは、(a)インストールする新しいパケット保護キー、および(b)ハンドシェイク完了などの状態変更やサーバ証明書を含む、QUICコンポーネントへの一連の更新を提供します。

QUIC TLSのHTTP/3サポート オプション

QUIC TLSは、QUICプロトコル専用に設計されたTLSの一種です。現時点では、QUIC TLSでHTTP/3のサポートを必要としているユーザーには2つの選択肢があります。

  • OpenSSL QUIC実装 – OpenSSLは現在、完全なQUICスタックを独自に実装しようと取り組んでいます。この開発はすべてのQUIC機能を実装内にカプセル化するもので、これにより、HTTP/3ユーザーはQUIC固有の機能について心配することなくOpenSSL TLS APIを簡単に使用できるようになります。
  • BoringSSL QUIC APIをサポートするライブラリ – BoringSSL、quicTLS、LibreSSL(これらはすべてOpenSSLのフォークとして提供が開始されました)などのさまざまなSSLライブラリは現在、BoringSSL QUIC APIを実装することでQUIC TLS機能を提供しています。OpenSSL QUIC TLS実装が実現しない現状では、これがHTTP/3を使いたいユーザーにとっての唯一の選択肢です。
QUIC+HTTP/3のメリット

QUIC+HTTP/3の目標は、レイテンシを低減し、信頼性の低いネットワークを経由したデータ配信を改善することで、Webアプリケーションのパフォーマンスを向上させることにあります。以下のメリットがあります。

  • レイテンシの低減 – TCPのような従来のプロトコルでは、接続セットアップ プロセスによってレイテンシが発生します。QUIC+HTTP/3の多重化機能を使用すると、効率よく接続を確立できるため、接続を確立してデータを送信するためのレイテンシが低減します。
  • 迅速な接続確立 – QUIC+HTTP/3は、TLSハンドシェイクと暗号化セットアップを1つのステップにまとめることにより、安全な接続を確立するために必要なラウンド トリップ数を減らします。
  • 多重化 – QUIC+HTTP/3は、1つの接続内で複数のデータのストリームを処理することによって、ネットワーク リソースをより効率的に利用し、ヘッドオブライン ブロッキングの問題を回避できます。従来のTCP接続では、あるストリームに時間がかかると他のストリームが遅延することがありました。
  • 誤り訂正の改善 – QUICには前方誤り訂正技術が組み込まれており、再送信しなくても損失パケットを復旧できるため、パフォーマンスに対するパケット ロスの影響が軽減されます。
  • パケット ロスの影響の軽減 – UDPはコネクションレスであり、TCPの厳格なエラーチェックなしで迅速に送信できます。これは特に、ネットワーク条件が安定していないシナリオで役立ちます。
  • 適応型輻輳制御 – QUIC+HTTP/3は、TCPの輻輳制御よりも効率的で応答性が向上するように設計されているため、変化するネットワーク環境でパフォーマンスが向上します。
  • 移行サポート – QUIC+HTTP/3は、アプリケーションのパフォーマンスを損なうことなく、さまざまなネットワーク接続間(Wi-Fiから携帯回線への切り換えなど)をシームレスに移行できます。
  • セキュリティの向上 – QUIC+HTTP/3にはデフォルトで暗号化が組み込まれているため、データ送信のセキュリティとプライバシーが向上します。この暗号化により、送信中のデータの盗聴や改ざんを防止します。
  • NATトラバーサル – QUIC+HTTP/3のUDPの使用は、ネットワーク アドレス変換(NAT)トラバーサルに役立ち、従来のTCP接続だと問題に直面する可能性のあるシナリオでも簡単に接続を確立できるようになります。
  • 継続的な発展 – QUIC+HTTP/3は、基になるネットワーク インフラストラクチャを変更するのではなく、ソフトウェアで実装して更新するように設計されているため、変化するネットワーク条件やセキュリティの課題に合わせてすばやく更新し改善できます。
NGINXでのQUIC+HTTP/3の使用に関する詳細

NGINXのQUIC+HTTP/3実装、および迅速かつ効率的に通信するためのその他のQUIC+HTTP/3の使用方法については、以下のリソースを参照してください。