HTTP/3 は、HTTP プロトコルの第 3 世代メジャーバージョンです。HTTP/1.1 および HTTP/2 とは異なり、HTTP/3 はトランスポート層で従来の TCP プロトコルを使用せず、UDP ベースの Quick UDP Internet Connection (QUIC) プロトコルを採用しています。この変更により、HTTP/3 は低レイテンシー、より堅牢なエラー回復、より効率的な接続の多重化を実現します。本トピックでは、ASM Gateway で HTTP/3 ベースのサービスを設定する方法について説明します。
背景情報
HTTP/3 はトランスポートメカニズムとして UDP 上の QUIC を使用するため、HTTP/2 と比較して以下の利点があります。
ハンドシェイクレイテンシーの短縮: HTTP/3 は QUIC プロトコルの 0-RTT 機能を使用して接続確立を完了します (RTT はラウンドトリップタイムの略)。さらに、TLS が QUIC に統合されており、暗号化とハンドシェイクを同時にサポートするため、接続確立時のレイテンシーが大幅に短縮されます。
新しい多重化メカニズム: HTTP/2 は TCP 層でヘッドオブラインブロッキングの影響を受けます。HTTP/3 は QUIC を使用して、同じ接続上で複数の独立したストリームを多重化し、データストリームは互いに独立しています。1 つのデータストリーム内でパケットが失われても、他のデータストリームの送信はブロックされません。これにより、単一のデータフローのブロッキングが接続全体の送信パフォーマンスに影響しなくなります。
コネクションマイグレーション: HTTP/3 は、Wi-Fi ネットワークからモバイルネットワークへの切り替えなど、ネットワーク環境が変化した場合でも、異なる IP アドレス間でのコネクションマイグレーションをサポートします。これにより、接続の継続性と安定性が確保されます。
セキュリティ: HTTP/3 は暗号化通信のために TLS 1.3 の使用を必須としており、より高いセキュリティとプライバシー保護を保証します。
ASM Gateway は HTTP/3 をサポートしています。ASM Gateway で公開されているサービスへのアクセスに HTTP/3 を使用することで、サービスのパフォーマンスと安定性を向上させることができます。
前提条件
Container Service for Kubernetes (ACK) クラスターが ASM インスタンスに追加され、ASM インスタンスのバージョンが 1.16 以降です。 詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
イングレスゲートウェイがデプロイされます。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
HTTPBin アプリケーションがデプロイされています。詳細については、「HTTPBin アプリケーションをデプロイする」をご参照ください。
-
ACK クラスターのバージョンは 1.24 以降で、Cloud Controller Manager (CCM) のバージョンは 2.6.0 以降です。詳細については、「Cloud Controller Manager」をご参照ください。
ASM インスタンスに、「aliyun.com.cert」という名前の証明書が作成されます。詳細については、「ASM の証明書管理機能を使用する」をご参照ください。
ステップ 1: HTTP/3 の有効化
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
Base Information ページの右上隅にある Settings をクリックします。展開されたサイドバーで、Enable HTTP/3 を選択します。
ステップ 2: ASM Ingress Gateway での UDP リスナーの有効化
QUIC プロトコルは UDP ベースであるため、ASM Ingress Gateway で UDP リスナーを有効にする必要があります。
この例では、ASM Ingress Gateway の YAML 設定を変更して、ASM Ingress Gateway のポート 444 で UDP リスナーを有効にします。
apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
labels:
asm-gateway-type: ingress
name: ingressgateway
namespace: istio-system
spec:
......
ports:
- name: http-0
port: 80
protocol: HTTP
targetPort: 80
- name: udp # ポート 444 で UDP リスナーを有効化
port: 444
protocol: UDP
targetPort: 444
......ASM Gateway は同じポートで TCP リスナーと UDP リスナーの両方をサポートします。たとえば、HTTPS サービスを公開するために使用されるポート 443 に UDP リスナーを追加できます。2 つのリスナーは互いに競合しません。
ステップ 3: Istio Gateway の設定
QUIC は TLS 通信を必須としています。そのため、Istio Gateway に証明書を設定する必要があります。以下の YAML ファイルを使用して、Istio Gateway の設定を更新します。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: httpbin
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: test
number: 80
protocol: HTTP
- hosts:
- '*'
port:
name: quic
number: 444
protocol: HTTPS
tls:
credentialName: aliyun.com.cert
mode: SIMPLEステップ 4: HTTP/3 を使用した ASM Gateway へのアクセステスト
curl は一般的な HTTP テストツールです。ただし、curl コマンドはデフォルトでは HTTP/3 をサポートしていません。以下のコマンドを実行して、使用している curl が HTTP/3 をサポートしているかどうかを確認できます。
curl --version | grep http3以下のような出力が表示された場合、現在の環境の curl コマンドは HTTP/3 をサポートしています。
curl 8.9.0-DEV (aarch64-apple-darwin23.5.0) libcurl/8.9.0-DEV quictls/3.1.4 zlib/1.2.12 libidn2/2.3.7 nghttp2/1.59.0 ngtcp2/1.2.0 nghttp3/1.1.0何も出力されない場合、現在の環境の curl コマンドは HTTP/3 をサポートしていません。 HTTP/3 をサポートするバージョンの curl を再ビルドできます。 詳細については、「quictls を使用してビルドする」をご参照ください。
ビルドが完了したら、以下のコマンドを実行して HTTP/3 がサポートされているかどうかをテストできます。
curl -k --http3-only -H Host:aliyun.com --resolve aliyun.com:444: https://aliyun.com:444/headers -v期待される出力:
......
* Connected to aliyun.com (xxx.xx.xx.x) port 444
* using HTTP/3
* [HTTP/3] [0] OPENED stream for https://aliyun.com:444/headers
* [HTTP/3] [0] [:method: GET]
* [HTTP/3] [0] [:scheme: https]
* [HTTP/3] [0] [:authority: aliyun.com]
* [HTTP/3] [0] [:path: /headers]
* [HTTP/3] [0] [user-agent: curl/8.9.0-DEV]
* [HTTP/3] [0] [accept: */*]
> GET /headers HTTP/3
> Host:aliyun.com
> User-Agent: curl/8.9.0-DEV
> Accept: */*
>
* Request completely sent off
* old SSL session ID is stale, removing
< HTTP/3 200
< server: istio-envoy
< date: Wed, 26 Jun 2024 07:40:07 GMT
< content-type: application/json
< content-length: 460
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 1
< alt-svc: h3=":444"; ma=86400
<
{
"headers": {
"Accept": "*/*",
"Host": "aliyun.com",
"Transfer-Encoding": "chunked",
"User-Agent": "curl/8.9.0-DEV",
"X-Envoy-Attempt-Count": "1",
"X-Envoy-External-Address": "xx.xx.xx.xx",
"X-Forwarded-Client-Cert": "xxxxxxx"
}
}
* Connection #0 to host aliyun.com left intact参考情報
HTTP/2 の TCP レイヤーにおけるヘッドオブラインブロッキングが緩和しかできず、完全には回避できない理由の詳細については、「ハイパーテキスト転送プロトコル バージョン 2 (HTTP/2)」をご参照ください。
HTTP/3 で導入された新しい多重化メカニズムは、ヘッドオブラインブロッキングの問題を根本的に解決します。公式ドキュメントでは、ヘッドオブラインブロッキングを回避して接続パフォーマンスを向上させる方法についても言及されています。詳細については、「QUIC: A UDP-Based Multiplexed and Secure Transport」をご参照ください。