HTTP/3具備三大特性:對頭阻塞、串連遷移、O-RTT,尤其對於目前多裝置網路切換、弱網串連具備很明顯的優勢。本文介紹如何在雲原生網關中開啟並使用HTTP/3。
前提條件
建立MSE雲原生網關且網關版本為1.2.15及以上。
背景資訊
HTTP/3的使用不僅需要商務服務自身支援HTTP/3,還需要外部請求的流量是HTTP/3。因為業務自身支援HTTP/3需要做一定的程式改造,所以大部分使用者更傾向於保持自身業務不變,由接入網關完成協議轉換。該方式雖然鏈路請求不如全程選擇HTTP/3提升大,但也可以享受一部分HTTP/3的網路優勢,因此本文以該鏈路為背景說明。
HTTP/1.1
HTTP/1.1使用空格分隔的文字欄位來傳遞HTTP訊息。雖然這些交換是可讀的,但使用空格進行訊息格式化會導致解析複雜和對變體行為的過度容忍。HTTP/1.1不包含多工層,因此經常使用多個TCP串連來平行處理請求。但是這樣對擁塞控制和網路效率有負面影響。更多資訊,請參見HTTP/1.1。
HTTP/2
HTTP/2引入了二進位幀和多工層,在不修改傳輸層的情況下改善了延遲。但由於HTTP/2多工並行特性對TCP的丟失恢複機制不可見,因此丟失或重新排序的資料包會導致所有活動請求都經歷停頓,無論該請求是否直接受到遺失資料包的影響。更多資訊,請參見HTTP/2。
HTTP/3
2022年06月06日,IETF QUIC和HTTP工作群組成員Robin Marx宣布,經過5年的努力,HTTP/3被標準化為RFC 9114。更多資訊,請參見HTTP/3 From A To Z: Core Concepts和RFC 9114。
HTTP/3採用了Google多年探索的基於UDP的QUIC協議,原名HTTP-over-QUIC,2018年被IETF批准更名為HTTP/3。目前,Cloudflare、Google Chrome、Firefox Nightly均表示支援HTTP/3。
為瞭解決HTTP/2中存在的隊頭阻塞問題,HTTP/3不再基於TCP建立,而是基於Google提出了基於UDP實現的開源協議QUIC,使用stream進一步擴充了HTTP/2的多工,並在阻塞控制、頭部壓縮等方面做了提升。更多資訊,請參見隊頭阻塞。
操作流程
操作步驟
通過MSE控制台配置
網關開啟HTTP/3支援。
登入MSE網關管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。
在左側導覽列,單擊参数配置。
在网关引擎参数地區,參數EnableHttp3的操作列,單擊编辑。

在参数修改對話方塊,開啟参数值開關並單擊确定。
檢查網關配置的網域名稱中是否開啟HTTPS。
HTTP/3要求使用HTTPS來保證鏈路安全性,因此需要在網關針對測試網域名稱開啟HTTPS。關於如何在網關中佈建網域名,請參見建立網域名稱。
說明如果網關中配置了HTTPS網域名稱,可以在網關基本概覽頁面,單擊關聯的CLB執行個體。跳轉至CLB控制台查看CLB執行個體443監聽連接埠的健全狀態檢查狀態是否正常。
網關中添加HTTP服務並增加對應的路由配置。
為測試服務添加路由。具體操作,請參見建立路由規則。
例如已經添加了一條名稱為quic的路由規則。
使用如下curl命令發起HTTP/3請求測試。
curl --http3 https://api.alibaba-inc.com/quic --resolve api.alibaba-inc.com:443:<CLB IP地址> -k說明HTTP/3方式需編譯源碼,使用已有curl http3鏡像測試無需編譯,您可按需選擇測試方式。更多資訊,請參見curl-http3。
通過Ingress配置
網關開啟HTTP/3支援。
登入MSE網關管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。
在左側導覽列,單擊参数配置。
在网关引擎参数地區,參數EnableHttp3的操作列,單擊编辑。

在参数修改對話方塊,開啟参数值開關並單擊确定。
在ACK叢集安裝MSE Ingress Controller並關聯MSE雲原生網關。
關於安裝MSE Ingress Controller,請參見管理MSE Ingress Controller組件。
關於關聯MSE雲原生網關,請參見配置MseIngressConfig。
在ACK叢集配置Ingress。
在ACK叢集中建立HTTPS使用的Secret以及HTTPS網域名稱路由,如下所示:
apiVersion: v1 kind: Secret metadata: name: testsecret-tls namespace: default data: tls.crt: base64 # Base64編碼的認證。 tls.key: base64 # Base64編碼的私密金鑰。 type: kubernetes.io/tls --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-example-ingress annotations: nginx.ingress.kubernetes.io/backend-protocol: HTTP # 如果後端是H2配置:HTTP2。 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使用如下curl命令發起HTTP/3請求測試。
curl --http3 https://https-example.foo.com/quic --resolve https-example.foo.com:443:<CLB IP地址> -k