一、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应用场景是非常有帮助的。