HTTP/3 は、TCP を UDP ベースの QUIC に置き換えることで、head-of-line ブロッキングを解消し、ネットワーク間の接続移行をサポートし、ゼロラウンドトリップタイム (0-RTT) でハンドシェイクのレイテンシを削減します。これらの改善は、Wi-Fi とセルラーネットワークを切り替えるモバイルユーザーや、高レイテンシまたは損失の多い接続環境のクライアントにメリットをもたらします。
MSE クラウドネイティブゲートウェイは、エッジで HTTP/3 を処理します。クライアントは QUIC を介して接続し、ゲートウェイは HTTP/1.1 または HTTP/2 を介してバックエンドサービスにリクエストを転送します。ご利用のバックエンドサービスに変更は必要ありません。エンドツーエンドの HTTP/3 と比較して、このアプローチはリクエスト処理のパフォーマンスを大幅に向上させるものではありませんが、クライアントに対して HTTP/3 のネットワークレベルの利点をいくつか提供します。
HTTP/3 をサポートしていないクライアントは、自動的に HTTP/2 または HTTP/1.1 にフォールバックするため、HTTP/3 を有効にしても既存のトラフィックに影響はありません。
前提条件
開始する前に、以下が準備できていることを確認してください。
V1.2.15 以降を実行している MSE クラウドネイティブゲートウェイ。詳細については、「クラウドネイティブゲートウェイの作成」をご参照ください。
ゲートウェイに設定された HTTPS ドメイン名。HTTP/3 には TLS が必要なためです。詳細については、「クラウドネイティブゲートウェイへのドメイン名の関連付け」をご参照ください。
MSE コンソールでの HTTP/3 の有効化
ステップ 1: EnableHttp3 パラメーターをオンにする
MSE コンソールにログインします。上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択します。[ゲートウェイ] ページで、対象のゲートウェイの名前をクリックします。
左側のナビゲーションウィンドウで、パラメーターの設定 をクリックします。
Gateway Engine Parameters セクションで、[EnableHttp3] パラメーターを見つけ、Actions 列の Edit をクリックします。

Modify Parameters ダイアログボックスで、Value スイッチをオンにし、OK をクリックします。
ステップ 2: HTTPS リスナーの確認
ゲートウェイに関連付けられている Classic Load Balancer (CLB) インスタンスに、ポート 443 で正常なリスナーがあることを確認します。
ゲートウェイの [概要] ページで、CLB インスタンス名をクリックします。
CLB コンソールで、ポート 443 リスナーの [ヘルスチェックステータス] が正常であることを確認します。
ステップ 3: バックエンドサービスとルーティングルールの追加
HTTP/1.1 をサポートするバックエンドサービスを追加します。詳細については、「サービスの追加」および「サービスソースの追加」をご参照ください。
サービスにルーティングルールを追加します。たとえば、
quicという名前のルーティングルールを追加します。詳細については、「ルーティングルールの作成」をご参照ください。
ステップ 4: HTTP/3 接続のテスト
cURL コマンドを実行して、ゲートウェイ経由で HTTP/3 リクエストを送信します。
curl --http3 https://api.alibaba-inc.com/quic \
--resolve api.alibaba-inc.com:443:<IP address of the CLB instance> -kapi.alibaba-inc.com をご利用のドメイン名に、/quic をルーティングルールで定義したパスに、<IP address of the CLB instance> を実際の CLB の IP アドレスに置き換えます。
--http3 フラグには、HTTP/3 をサポートする cURL ビルドが必要です。ソースから HTTP/3 をサポートする cURL をコンパイルするか、代わりに ymuski/curl-http3 Docker イメージを使用できます。
docker run --rm ymuski/curl-http3 \
curl --http3 https://api.alibaba-inc.com/quic \
--resolve api.alibaba-inc.com:443:<IP address of the CLB instance> -kKubernetes Ingress を介した HTTP/3 の有効化
Kubernetes を介してゲートウェイ構成を管理する場合は、MSE Ingress Controller を使用して HTTP/3 を有効にします。
ステップ 1: EnableHttp3 パラメーターをオンにする
コンソールでの方法のステップ 1 と同じ手順に従って、EnableHttp3 パラメーターをオンにします。
ステップ 2: MSE Ingress Controller のインストールと関連付け
ご利用の Container Service for Kubernetes (ACK) クラスターに MSE Ingress Controller をインストールします。詳細については、「MSE Ingress Controller コンポーネントの管理」をご参照ください。
ゲートウェイを MSE Ingress Controller に関連付けます。詳細については、「MseIngressConfig の設定」をご参照ください。
ステップ 3: HTTPS Secret と Ingress の作成
次のマニフェストを適用して、ご利用の ACK クラスターに TLS Secret と Ingress ルーティングルールを作成します。
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: <base64-encoded-certificate> # Base64 エンコードされた TLS 証明書
tls.key: <base64-encoded-private-key> # Base64 エンコードされた秘密鍵
type: kubernetes.io/tls
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
annotations:
# バックエンドサービスが HTTP/2 を使用する場合は HTTP2 に設定
nginx.ingress.kubernetes.io/backend-protocol: HTTP
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
rules:
- host: https-example.foo.com
http:
paths:
- path: /quic
pathType: Prefix
backend:
service:
name: service1 # ご利用のバックエンドサービス名
port:
number: 80プレースホルダーの値を置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<base64-encoded-certificate> | Base64 エンコードされた TLS 証明書 | LS0tLS1CRUdJTi... |
<base64-encoded-private-key> | Base64 エンコードされた秘密鍵 | LS0tLS1CRUdJTi... |
https-example.foo.com | ご利用の HTTPS ドメイン名 | api.example.com |
service1 | ご利用のバックエンドサービス名 | my-web-service |
ステップ 4: HTTP/3 接続のテスト
cURL コマンドを実行して、Ingress 経由で HTTP/3 が機能することを確認します。
curl --http3 https://https-example.foo.com/quic \
--resolve https-example.foo.com:443:<IP address of the CLB instance> -k接続が成功すると、応答には HTTP/3 サポートを通知する alt-svc ヘッダーが含まれます。
--http3 フラグには、HTTP/3 をサポートする cURL ビルドが必要です。ソースから HTTP/3 をサポートする cURL をコンパイルするか、ymuski/curl-http3 Docker イメージを使用できます。
HTTP/3 と以前のバージョンとの違い
HTTP/3 は HTTP/1.1 と HTTP/2 を基盤としていますが、トランスポートレイヤーが変更されています。
HTTP/1.1 の制限事項
HTTP/1.1 は、スペースで区切られたテキストとしてメッセージを転送します。多重化レイヤーがないため、ブラウザは複数の TCP 接続を開いて並列リクエストを処理しますが、これは輻輳制御とネットワーク効率を損ないます。詳細については、「RFC 9112」をご参照ください。
HTTP/2 の改善点と残された課題
HTTP/2 は、トランスポートレイヤーを変更せずにレイテンシを削減するために、バイナリフレーミングと多重化を追加します。ただし、HTTP/2 は TCP 上で実行されるため、1 つのパケットが失われると、回復が完了するまで接続内のすべてのストリームがブロックされます (head-of-line ブロッキング)。詳細については、「RFC 9113」をご参照ください。
HTTP/3 によるこれらの問題の解決方法
HTTP/3 (以前は HTTP-over-QUIC と呼ばれていました) は、TCP を、もともと Google によって開発された UDP ベースのプロトコルである QUIC に置き換えます。IETF は 2018 年に HTTP-over-QUIC を HTTP/3 に改名し、2022 年 6 月 6 日に RFC 9114 で提案標準として公開しました。
QUIC は各ストリームに独自のフロー制御を提供するため、1 つのストリームでパケットが失われても他のストリームはブロックされません。HTTP/3 はまた、HTTP/2 に比べて輻輳制御とヘッダ圧縮を改善します。
HTTP/3 は、Cloudflare、Google Chrome、および Firefox Nightly でサポートされています。詳細な概要については、「HTTP/3 from A to Z: core concepts」をご参照ください。