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。