HTTP/3是HTTP协议的第三个主要版本,与HTTP/1.1和HTTP/2不同,HTTP/3协议不再使用传统的基于TCP的传输层协议,改为采用基于UDP协议的QUIC(Quick UDP Internet Connection)协议,这一变化使HTTP/3具备了更低的延迟、更加健壮的错误恢复以及更加高效的连接复用等特点。本文介绍如何在ASM网关上配置基于HTTP/3协议的服务。
背景信息
HTTP/3基于QUIC协议,由于其底层基于UDP协议,相比于HTTP/2有以下优点:
减少握手延迟:HTTP/3通过QUIC协议的0-RTT特性完成连接建立,同时将TLS集成到协议中,支持了加密和握手同时进行,大幅减少了连接建立时的延迟。
新的多路复用机制:HTTP/2存在TCP连接级别的队头阻塞(Head-of-Line Blocking),HTTP/3使用QUIC协议在同一个连接上多路复用多个独立的流,每个数据流是独立的,即使一个数据流中的某个包丢失,其他数据流的传输不会被阻塞。这样,单一数据流的阻塞不再会影响整个连接的传输性能。
连接迁移:HTTP/3支持连接在不同 IP 地址之间迁移,即使用户网络环境发生变化(比如从Wi-Fi网络切换至移动网络),确保了连接的持续性和稳定性。
安全:HTTP/3强制要求使用TLS1.3进行加密传输,确保了更高的安全性和隐私保护。
ASM网关已经支持了HTTP/3协议,用户可以直接通过HTTP/3协议访问ASM网关上暴露的服务,进一步提升业务的性能和稳定性。
前提条件
已添加集群到ASM实例,且ASM实例版本在1.16及以上版本。具体操作,请参见添加集群到ASM实例。
已部署入口网关。具体操作,请参见创建入口网关。
已部署httpbin应用。具体操作,请参见部署httpbin应用。
ACK 集群版本为1.24及以上版本,CCM 组件版本为2.6.0及以上版本。更多信息,请参见Cloud Controller Manager。
已为ASM创建了一个名称为aliyun.com.cert的证书。具体操作,请参见使用ASM证书管理。
步骤一:启用HTTP3协议支持
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在基本信息页面右上方单击功能设置,在展开的功能设置更新侧边栏中勾选是否启用HTTP/3支持。
步骤二:在ASM网关上启用UDP监听
QUIC协议基于UDP协议,因此需要在ASM网关上开启UDP监听。
这里直接修改ASM网关的YAML配置,在网关的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网关支持在同一个端口上同时开启TCP监听和UDP监听,例如:您可以在已经暴露了HTTPS服务的443端口上再开启UDP监听,两者并不冲突。
步骤三:配置网关规则
QUIC强制要求使用TLS通信,因此必须为网关规则配置证书。使用以下YAML内容,更新网关规则。
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
步骤四:测试
curl是一个常见的HTTP协议测试工具,但是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的版本。具体操作,请参见Build curl with quictls。
构建完成之后,您可以使用如下命令进行测试。
curl -k --http3-only -H Host:aliyun.com --resolve aliyun.com:444:${ASM网关IP} 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连接级别的队头阻塞(Head-of-Line Blocking, HOL Blocking)的情况只能尽量减轻但不能完全避免的原因,请参见Hypertext Transfer Protocol Version 2 (HTTP/2)。
HTTP/3引入了新的多路复用机制,从根本上解决了HOL阻塞的情况发生。官方文档中也提及了如何通过避免HOL阻塞来提高连接性能。具体信息,请参见QUIC: A UDP-Based Multiplexed and Secure Transport。