Nginx对Quic和HTTP/3-Nginx支持的技术预览

2020-06-11 10:50:50

我们很高兴地在一个特别的开放源码库中宣布用于Nginx的Quic+HTTP/3的技术预览版。这是预发布软件,基于IETF Quic草案,在开发分支中维护,与稳定分支和主线分支隔离。该版本是最初几个月开发的顶峰,现在已经为互操作性测试、反馈和代码贡献做好了准备。

在这个快节奏的世界里,二十多年来,超文本传输协议(HTTP)一直是一个非常稳定的常量。HTTP/1.1标准于1999年底发布,现已成为Web应用程序和API的无处不在的传输协议。尽管用于传输的应用和服务发生了巨大变化,但该协议在接下来的21年里保持不变。

在这一点上,精明的读者可能会问,“但是HTTP/2呢?”这是一个非常好的问题。HTTP/2标准于2015年底发布,并已稳步采用,目前约45%的面向互联网的网站支持HTTP/2。然而,这一统计数据掩盖了这样一个事实,即与“最后一英里”(运行时基础设施)相比,HTTP在公共互联网上的使用有很大不同。

现代Internet基础设施的现实情况是,HTTP/2很少被端到端部署。它旨在解决在公共Internet上最明显的问题,在公共Internet上,延迟高得无法预测,一个HTTP请求的问题可能会延迟后续请求。在应用程序运行时环境内-例如,公共云或私有数据中心-延迟低,网络可靠性极佳,并且直接检查HTTP/1.1的基于文本的传输流的能力比HTTP/2的二进制传输流的效率更有价值。

HTTP/2大体上改善了浏览器和移动设备上的用户体验,因为它非常适合客户机和运行时基础设施的“边缘”之间的环境。在这一点上,它通常被代理到使用HTTP/1.1的运行时环境中。边缘最有可能是CDN提供商,或者是处理进入运行时环境的流量的反向代理负载均衡器。

这种使用HTTP/2和HTTP/1.1来交付网站和应用程序的混合方法效果很好。那么,为什么还要提出另一个新协议HTTP/3呢?

HTTP/2的主要创新是在使用TCP作为底层传输的单个连接上多路复用多个HTTP请求。不幸的是,TCP有固有的限制,限制了网站和应用程序的性能和用户体验。TCP标准最初发布于1981年左右,作为通用传输协议取得了惊人的成功。但是,当您在同一连接上多路传输多个独立请求时,它们都会受到该连接可靠性的影响。如果只有一个请求的数据包丢失,则所有多路复用的请求都会延迟,直到首先检测到丢失的数据包,然后重新传输。

HTTP/3基于Quic传输协议,该协议专为支持多路复用连接而设计,而不依赖于单个TCP连接。相反,QUIC使用UDP作为在客户端和服务器之间传输数据包的低级传输机制,并实现可靠的连接,在此基础上进行HTTP请求。值得注意的是,Quic还将TLS合并为一个完整的组件,而不是像HTTP/1.1和HTTP/2那样作为一个附加层。

Quic的目标是为HTTP/3提供高性能、高可靠性、高安全性的传输协议(尽管Quic也适用于非HTTP流量)。从语义上讲,Http/3本身与Http/2非常相似。但是,没有明确的Http版本定义-https://www.example.com可能支持Http/1.1、Http/2和Http/3中的一个或多个。客户端(Web浏览器)如何知道要使用哪个版本的Http?

版本控制问题首先出现在HTTP/2的引入中,它通过使用TLS握手来检测客户端和服务器是否能够通过HTTP/2通信来解决这个问题。这样,客户端甚至在建立连接之前就知道如何与服务器通信。然而,Quic使用UDP而不是TCP作为底层传输协议提出了一个新的挑战-客户端如何知道最初请求哪种类型的连接,TCP还是UDP?解决方案是客户端为初始HTTP请求建立TCP连接。来自支持HTTP/3的服务器的响应包括Alt-Svc标头,以指定其侦听HTTP/3流量的UDP端口。此外,浏览器还会记住哪些站点支持Quic,以消除基于Alt-Svc的发现方法的开销。

今天,我们宣布Nginx的官方Quic和HTTP/3实现http_v3_module的初始版本。这是一个技术预览,必须被认为是试验性的-它不是用于生产的。在撰写本文时,Quic标准还没有定稿,这个初始版本是针对当前草案的子集实现的。

经过几个月的设计和开发,http_v3_module已经准备好进行互操作性测试。我们也欢迎一般的反馈和代码贡献。请注意,http_v3_module在主线开发分支中不可用;因为它仍处于实验阶段,所以它位于https://hg.nginx.org/nginx-quic.的专用开发分支中。

注意,这个Quic+HTTP/3实现是全新的,与Cloudflare作为其Quiche项目的一部分提供的补丁无关。

server{Listen 443 SSL;#TCP Listener for HTTP/1.1 Listen 443 Http3 Reuseport;#UDP Listener for Quic+HTTP/3 SSL_Protocol TLSv1.3;#Quic需要TLS 1.3 SSL_Certificate SSL/www.example.com.crt;SSL_Certificate_key SSL/www.example.com.key;add_header Alt-Svc';quic=#34;:443;34;#通告该Quic。

有关从nginx-quic repo构建nginx的更多信息,以及推荐的配置,请参阅自述文件。此外,https://quic.nginx.org/.上还提供了启用了http_v3_module的演示站点。在这里,您可以检查您的浏览器是否已经支持Quic,并将HTTP/3互操作性与您自己的nginx-quic版本进行比较。鉴于Quic的草案状态,您可能需要使用开发版本或常用浏览器的最新版本来启用Quic连接。

感谢您尝试使用nginx-quic,我们期待在评论区或我们的邮件列表中听到您的反馈。