Cloudflare准备了一个模块,以提供对NGINX中HTTP / 3协议的支持。 模块完成 以乳蛋饼库中的快照形式 由Cloudflare开发,并实现了QUIC和HTTP / 3传输协议。 乳蛋饼代码是用Rust编写的,但是NGINX的模块是用C编写的,并通过动态链接访问该库。 根据BSD许可,营业时间为开放时间。
在客户端软件中, HTTP / 3支持已添加到Chrome Canary实验版本中 和curl工具。 在服务器端,到目前为止,要求使用功能有限的隔离测试实现。 在Nginx中处理HTTP / 3的能力 将大大简化具有HTTP / 3支持的服务器的部署 它将使新协议的测试实现更容易访问。
HTTP / 3标准化了QUIC协议的使用 作为HTTP / 2的传输方式。 Google开发了QUIC协议,替代了网络上的TCP + TLS,从而 旨在解决TCP中安装和协调化合物时间长的问题 并延迟消除数据传输过程中的分组丢失。 QUIC是UDP协议的插件,它支持多个连接的多路复用,并提供与TLS / SSL等效的加密方法。
QUIC突出的关键特征包括:
- 类似于TLS的高安全性(实际上,QUIC提供了在UDP上使用TLS的能力)。
- 流完整性控制,可防止数据包丢失。
- 能够立即建立连接的能力(0-RTT,在大约75%的情况下,可以在发送连接设置数据包后立即传输数据),并确保发送请求和接收响应之间的最小延迟(RTT,往返时间) 。
- 重传数据包时不使用相同的序列号,这避免了确定接收到的数据包时的歧义并消除了超时。
- 丢失数据包只会影响与其关联的流的传递,并且不会停止通过当前连接并行传输的流中数据的传递。
- 纠错工具可最大程度地减少因丢失数据包的重传而造成的延迟。 使用特殊的数据包级纠错码可以减少需要重新传输丢失的数据包数据的情况。
- 密码块边界与QUIC数据包边界对齐,减少了数据包丢失对后续数据包内容解码的影响
- 阻止TCP队列没有问题
- 支持连接标识符,从而减少了为移动客户端建立重新连接的时间
- 能够连接高级机制以控制连接过载
- 使用预测每个方向上的带宽的技术来确保发送数据包的最佳强度,从而防止其达到观察到数据包丢失的拥塞状态
- 通过TCP获得显着的性能和性能提升。 对于YouTube之类的视频服务,QUIC在观看视频时将重新缓冲操作减少了30%。
如何在NGINX中实现支持HTTP / 3的模块?
对于那些对能够在其服务器上实现此模块感兴趣的人, 他们可以按照我们下面分享的说明进行操作。
要编译它, 他们只需要下载Nginx 1.16的补丁 和乳蛋饼库代码。
curl -O https://nginx.org/download/nginx-1.16.1.tar.gz tar xzvf nginx-1.16.1.tar.gz git clone --recursive https://github.com/cloudflare/quiche cd nginx-1.16.1 patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
我们编译了启用了HTTP / 3支持的NGINX:
./configure \ --prefix=$PWD \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_v3_module \ --with-openssl=../quiche/deps/boringssl \ --with-quiche=../quiche make
在编译期间,TLS支持必须基于BoringSSL库(“ –with-openssl = .. / quiche / deps / boringssl”),尚不支持使用OpenSSL。
要接受配置中的连接,他们将需要在侦听器指令中添加“ quic”标志。