HTTP/3 est la troisième version majeure du protocole HTTP. Contrairement à HTTP/1.1 et HTTP/2, HTTP/3 n'utilise plus le protocole TCP traditionnel au niveau de la couche transport, mais adopte le protocole Quick UDP Internet Connection (QUIC) basé sur UDP. Cette évolution permet à HTTP/3 d'offrir une latence réduite, une récupération d'erreurs plus robuste et un multiplexage de connexions plus efficace. Cette rubrique explique comment configurer des services basés sur HTTP/3 sur une passerelle ASM.
Contexte
HTTP/3 utilise QUIC sur UDP comme mécanisme de transport et présente donc les avantages suivants par rapport à HTTP/2 :
Réduction de la latence lors de l'établissement de la connexion (handshake) : HTTP/3 exploite la fonctionnalité 0-RTT du protocole QUIC pour finaliser l'établissement de la connexion (RTT signifie « round trip time » ou temps aller-retour). De plus, TLS est intégré directement dans QUIC pour prendre en charge le chiffrement et l'établissement de la connexion simultanément, ce qui réduit considérablement la latence lors de l'initialisation.
Nouveau mécanisme de multiplexage : HTTP/2 souffre du blocage de tête de ligne au niveau TCP. HTTP/3 utilise QUIC pour multiplexer plusieurs flux indépendants sur une même connexion ; ces flux de données sont totalement indépendants les uns des autres. Ainsi, la perte d'un paquet dans un flux n'interrompt pas la transmission des autres flux. Le blocage d'un seul flux n'affecte plus les performances de transmission de l'ensemble de la connexion.
Migration de connexion : HTTP/3 permet de migrer les connexions entre différentes adresses IP, même en cas de changement d'environnement réseau, comme le passage d'un réseau Wi-Fi à un réseau mobile. Cela garantit la continuité et la stabilité des connexions.
Sécurité : HTTP/3 impose l'utilisation de TLS 1.3 pour le chiffrement des transmissions, assurant ainsi un niveau de sécurité et de protection de la confidentialité plus élevé.
Les passerelles ASM prennent en charge HTTP/3. Utilisez HTTP/3 pour accéder aux services exposés via les passerelles ASM afin d'améliorer les performances et la stabilité de vos services.
Prérequis
Un cluster Container Service for Kubernetes (ACK) a été ajouté à votre instance ASM, et la version de votre instance ASM est 1,16 ou ultérieure. Pour plus d'informations, consultez la page Ajouter un cluster à une instance ASM.
Une passerelle d'entrée est déployée. Pour plus d'informations, consultez la page Créer une passerelle d'entrée.
L'application HTTPBin est déployée. Pour plus d'informations, consultez la page Déployer l'application HTTPBin.
Le cluster ACK exécute la version 1.24 ou ultérieure, et Cloud Controller Manager (CCM) est en version 2.6.0 ou ultérieure. Pour plus d'informations, consultez la page Cloud Controller Manager.
Un certificat nommé aliyun.com.cert a été créé pour votre instance ASM. Pour plus d'informations, consultez la page Utiliser la fonction de gestion des certificats d'ASM.
Étape 1 : Activer HTTP/3
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
Dans le coin supérieur droit de la page Base Information, cliquez sur Settings. Dans la barre latérale développée, sélectionnez Enable HTTP/3.
Étape 2 : Activer un écouteur UDP sur la passerelle d'entrée ASM
Le protocole QUIC repose sur UDP. Vous devez donc activer un écouteur UDP sur la passerelle d'entrée ASM.
Dans cet exemple, modifiez la configuration YAML de la passerelle d'entrée ASM pour activer un écouteur UDP sur le port 444.
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 # Enable a UDP listener on port 444.
port: 444
protocol: UDP
targetPort: 444
......
Une passerelle ASM prend en charge les écouteurs TCP et UDP sur le même port. Par exemple, vous pouvez ajouter un écouteur UDP sur le port 443 utilisé pour exposer des services HTTPS. Les deux écouteurs n'entrent pas en conflit.
Étape 3 : Configurer une passerelle Istio
QUIC impose l'utilisation de TLS pour les communications. Vous devez donc configurer un certificat pour la passerelle Istio. Mettez à jour la configuration de la passerelle Istio à l'aide du fichier YAML suivant :
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
Étape 4 : Tester l'accès à la passerelle ASM via HTTP/3
curl est un outil de test HTTP courant. Toutefois, les commandes curl ne prennent pas en charge HTTP/3 par défaut. Exécutez la commande suivante pour vérifier si votre installation de curl prend en charge HTTP/3 :
curl --version | grep http3
Si un résultat similaire à celui ci-dessous s'affiche, cela signifie que les commandes curl de votre environnement actuel prennent en charge 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
Si aucun résultat ne s'affiche, les commandes curl de votre environnement actuel ne prennent pas en charge HTTP/3. Vous devez alors reconstruire curl avec une version compatible HTTP/3. Pour plus d'informations, consultez la page Build with quictls.
Une fois la compilation terminée, exécutez la commande suivante pour tester la prise en charge de HTTP/3 :
curl -k --http3-only -H Host:aliyun.com --resolve aliyun.com:444 :${IP address of the ASM gateway} https://aliyun.com:444/headers -v
Résultat attendu :
......
* 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
Références
Pour comprendre pourquoi le blocage de tête de ligne au niveau TCP de HTTP/2 ne peut être qu'atténué et non entièrement évité, consultez la documentation Hypertext Transfer Protocol Version 2 (HTTP/2).
HTTP/3 introduit un nouveau mécanisme de multiplexage qui résout fondamentalement le problème du blocage de tête de ligne. La documentation officielle explique également comment améliorer les performances de connexion en évitant ce blocage. Pour plus d'informations, consultez la documentation QUIC: A UDP-Based Multiplexed and Secure Transport.