如何玩转 HTTP 3?( 二 )


比TCP协议更安全,TCP 协议的头部没有加密和认证,在传输过程中很容易被篡改,注入和窃听 。而 QUIC 除了个别报文比如 PUBLIC_RESET 和 CHLO,所有报文头部都是经过认证的,报文 Body 都是经过加密的 。
能够连接迁移,什么是连接迁移?比如使用手机从无线网切换到移动5G,这时客户端的IP会改变,需要重新建立和服务端的 TCP 连接 。而QUIC实现了任何一条 QUIC 连接不再以 IP 及端口进行标识,而是以一个 64 位的随机数作为 ID 来标识,这样当网络变化,IP和端口改变,只要 ID 不变,这条连接依然维持着,上层业务逻辑感知不到变化,不会中断,也就不需要重连 。且由于这个ID是随机的,产生冲突的概率非常小 。
更科学的流量控制器,TCP 为了保证可靠性,窗口左边沿向右滑动时的长度取决于已经确认的字节数 。如果中间出现丢包,就算接收到了更大序号的 Segment,窗口也无法超过这个序列号 。而QUIC 基于流和连接级别的流量控制,类似HTTP/2,通过window_update帧告诉对端自己可以接收的字节数,这样发送方就不会发送超过这个数量的数据 。通过BlockFrame告诉对端由于流量控制被阻塞了,无法发送数据 。就算此前有些数据包没有接收到,它的滑动只取决于接收到的最大偏移字节数 。
 
2 如何使用 HTTP/3? 
好了,介绍了HTTP/3,那么我们怎么才能够使用HTTP/3呢?事实上,现在很多云厂商都实现了 HTTP/3,比如腾讯云的负载均衡器、阿里云的CDN服务、CloudFlare等等 。那么如果你是使用类似Nginx这样的Web服务器如何使用HTTP/3呢?
以Nginx 为例,实际上,Nginx 在 2019 年 3 月 21 日公布了 1.17.x 版本的路线图,其中谈到了支持 QUIC 和 HTTP/3 的计划 。但是至今,Nginx 已经发布了 1.17.8 的版本,在最新的1.17.8的 CHANGES 中也没有发现HTTP/3的身影 。估计如果希望原生的 Nginx 支持 HTTP/3 还需要继续等待 。
可喜的是边缘计算厂商 CloudFlare 开源了 QUIC 的实现 quiche,使得 Nginx 提前支持 HTTP/3,quiche 项目地址: https://github.com/cloudflare/quiche/tree/master/extras/nginx。
CloudFlare 已经成功在其CDN业务中实现了QUIC的部署,基于HTTP3 Quic的实现靠的就是他们开发的Quiche实现 。
根据 quiche 的文档,需要下载源码和 Nginx 一同编译,而因为需要 BoringSSL 以及 quiche 开发语言的不同,在编译 Nginx 所需要的环境基础上,还需要 cmake、rust、cargo、golang 等一系列工具的支持 。
安装步骤
1.下载的nginx并解压,注意,这个补丁只支持1.16.x 。
curl -O https://nginx.org/download/nginx-1.16.1.tar.gztar xzvf nginx-1.16.1.tar.gz2.克隆quiche:
git clone --recursive https://github.com/cloudflare/quiche3.使用patch将补丁引入:
cd nginx-1.16.1patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch4.构建nginx,使其支持 HTTP/3:
./configure                                        --prefix=$PWD                                  --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)"        --with-http_ssl_module                         --with-http_v2_module                          --with-http_v3_module                          --with-openssl=../quiche/deps/boringssl        --with-quiche=../quiche5.执行make:
make6.然后配置nginx的vhost,一个HTTP/3的配置如下:
server {  listen       80;  # Enable HTTP/2 (optional).  listen       443 ssl http2;  # Enable QUIC and HTTP/3.  listen 443 quic reuseport;  server_name  www.awen.me;  root   /vdata/www/default;  index  index.html;  ssl_certificate /usr/local/nginx/ssl/awen.me.crt;  ssl_certificate_key /usr/local/nginx/ssl/awen.me.key;  ssl_protocols TLSv1.2 TLSv1.3;  ssl_ciphers ……  # Add Alt-Svc header to negotiate HTTP/3.  add_header alt-svc 'h3-23=":443"; ma=86400';  ……}


推荐阅读