一、quic協議概述
QUIC是一種提供快速安全的傳輸協議。QUIC 能夠通過支持時延敏感應用程序的可靠傳輸來保證質量,也能夠通過減少延遲和擁塞來提高效率。
QUIC協議實現了TLS及基於UDP的快速可靠傳輸。QUIC中文叫作「不可靠的快速TCP(Quick UDP Internet Connection)」。
QUIC協議優點如下:
- 快速:QUIC使用UDP而不是TCP,無需3次握手連接建立,且數據包加密是在第一次握手時建立的,因此降低了建立和重連的時間開銷。同時QUIC流量控制機制也使用更為高效的算法。
- 安全:QUIC恆定使用TLS1.3,並在UDP上直接使用加密方法。 QUIC確保每個數據包都擁有獨特的標識符,以確保更好的安全性。
- 網絡透明度:QUIC允許客戶端在不向服務器告知的情況下使用自己的IP地址。這可以提高鏈接的效率並避免阻止網絡ISP的干擾。
二、nginxquic介紹
nginxquic是一個用於提供QUIC協議支持的nginx模塊。它基於ngtcp2,在Nginx上實現了QUIC協議的支持。
1、nginxquic的運行機制
nginxquic通過 Nghttp3 在 Nginx 服務端實現了基於QUIC協議的HTTP/3協議支持,提供了一個新的應用層協議棧。其中,Nghttp3是QUIC和 HTTP/3的原始C庫,其在不損失可讀性和簡潔性的情況下提供了與Quiche相似的功能。
nginxquic從管理原始套接字到生成HTTP/3流,以及提供所有HTTP/3服務。具體來說,ngx_quic_module.c
處理QUIC數據包並生成與客戶端關聯的HTTP/3流。 但是,其實現不涉及構建HTTP/3的邏輯,而是委託給自下而上處理的 Nghttp3 庫和實現處理流程的子系統。
簡單的架構圖如下圖所示:
// the brief architecture of nginxquic
+------------+
+-------------+ +--------------+ | |
| HTTP/3 Flow | | ngx_quic_conn |<-------------| QUIC |
| management |-------| 1 | | Logic |
+-------------+ +--------------+ | |
^ ^ +------------+
| |
+----------v---------+ +------v------+
| Nghttp3 Library | | Subsystems |
+-------------------+ +-------------+
2、nginxquic的編譯安裝
從 官網下載最新的nginx.tar.gz文件,解壓到本地:
$ tar -xvzf nginx-quic-xxx.tar.gz
$ cd nginx-quic-xxx/
編譯安裝Nginx:
$ ./configure --with-quic --with-http_v3_module --with-openssl=/path/to/openssl/source --with-debug
$ make
$ make install
其中,--with-quic
開啟了QUIC支持,--with-http_v3_module
開啟HTTP/3支持,--with-openssl=/path/to/openssl/source
是指定 SSL 庫的路徑,--with-debug
開啟調試模式。
三、nginxquic的配置
Nginx在支持基於TLS的HTTP/2協議的同時也支持在與使用SSL模塊生成的連接上運行QUIC的HTTP/3協議。因此,我們需要知道如何在nginx.conf文件中配置基於SSL的HTTP/2的服務器塊以支持quic和http/3。
1、配置SSL證書
首先,UTF-8編碼的SSL證書需要生成,我們可以使用 NSS Tools(Network Security Services Tools)
。生成證書的一個基本範例命令如下:
$ certutil -d sql:$HOME/.pki/nssdb -N
$ certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "mytest" -i mytest.crt
$ certutil -d sql:$HOME/.pki/nssdb -L
其中,mytest.crt
是SSL證書的UTF-8編碼格式的文件路徑,-n "mytest"
是證書名稱。
2、配置HTTP/3 server區域
以下為nginx.conf文件中的server配置區域:
http {
...
server {
listen 443 quic reuseport;
server_name localhost;
ssl on;
ssl_certificate /path/to/ssl/cert;
ssl_certificate_key /path/to/ssl/key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
}
其中,listen 443 quic reuseport;
指定了QUIC協議的端口,這裡為443,在此之前還需要開啟reuseport
,提高負載處理能力。
這個server區域包含了相當簡單的ssl設置,其他server 配置參數請根據實際情況自由調整。
四、nginxquic的測試
您可以在命令行中使用 Curl實用程序來測試您的HTTP/2 + QUIC服務器。這是一個簡單示例,您可以根據實際情況進行調整:
$ curl --http3 -vs https://localhost:443/
如果QUIC服務已正確安裝,您將看到響應包含了HTTP/3主機指示符,響應頭類似:
HTTP/3 200 OK
server: nginx/1.18.0rc1
date: Sun, 26 Apr 2020 08:39:47 GMT
content-type: text/html
content-length: 946
五、總結
總的來說,nginxquic的實現在提供QUIC協議支持的同時,提高了網絡傳輸的效率和安全性,對於一些需要保障網絡傳輸效率和安全性的web應用場景是非常有幫助的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/251988.html