
# 通过ELB部署QUIC协议以提升应用加载速度
QUIC协议是基于UDP的快速互联网连接协议，改善拥塞控制，不依赖内核协议支持，用户使用具有更高的灵活性。
QUIC协议具备低时延、避免队头阻塞的多路复用优势，极佳的弱网性能可以有效解决网络、视频卡顿的问题，提升网络使用体验，同时保障数据传输的安全性。
#### QUIC协议概述
QUIC协议基于UDP协议实现，不需要完成TCP协议的三次握手且可以绕过TCP协议的队头阻塞，在应用层实现流（Stream）级别的多路复用，单个流丢包不用阻塞其他流。相对于传统的TCP协议，QUIC协议拥有更高的灵活性。
**QUIC与HTTP/3的协商**
- HTTP/3是QUIC的标准应用层协议，第一次请求时，服务器通过HTTP/1.1或HTTP/2与浏览器建立连接，并通知浏览器支持QUIC。第二次请求通过竞速机制，QUIC建立连接更快即可升级到QUIC协议，浏览器和服务器默认通过HTTP/3协商QUIC连接。
- 客户端仅支持通过HTTP/3使用QUIC，如果无法建立HTTP/3连接，将会使用HTTP/1.1或HTTP/2。
图1客户端通过ELB访问Web应用   
![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002381147169.png "点击放大")
#### 准备工作
- 已创建独享型ELB实例，且ELB已绑定EIP。具体操作，请参见[购买独享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/elb_lb_000006.html)和[绑定IPv4公网IP](https://support.huaweicloud.com/usermanual-elb/elb_ug_fz_0015.html)。
- 已创建两台ECS，ECS与已创建的ELB实例属于同一个VPC，更多详细设置请参考[快速购买ECS](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7012.html)，本实践方案以ECS安装CentOS系统为例。第一台ECS_client用作客户端发送HTTP请求，第二台ECS_server用作部署Web应用的后端服务器。
- 已购买证书或者上传第三方证书到SSL证书服务，推荐您在云证书与管理服务购买服务器证书，详情请参见[购买SSL证书](https://support.huaweicloud.com/usermanual-ccm/ccm_01_0074.html)。
- 已创建协议类型为**HTTP**协议的后端服务器组，服务器组中添加了ECS_server实例，本实践后端服务器的业务端口为442端口。
 
#### 步骤一：配置客户端支持HTTP/3
对于Web应用，支持QUIC连接的客户端环境需要支持HTTP/3，更多详情您可参考[curl官网文档中HTTP/3和QUIC支持](https://github.com/curl/curl/blob/master/docs/HTTP3.md)。
1. 远程登录客户端ECS_client。 弹性云服务器有多种登录方法，具体请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
2. 执行以下命令安装基础的依赖环境。
   1. 安装启用epel源的软件包并更新缓存。
      ```
      sudo yum install -y epel-release
      sudo yum makecache
      ```
      
   
   2. 安装所需软件包。
      ```
      sudo yum install -y git perl-IPC-cmd autoconf automake libtool libpsl-devel
      ```
      
    
3. 构建支持QUIC和HTTP/3的curl工具。
   单击查看安装参考
   - 安装OpenSSL提供TLS支持，用于QUIC加密通信，必须为3.5或者更新的版本。
     ```
     % git clone --quiet --depth=1 -b openssl-$OPENSSL_VERSION https://github.com/openssl/openssl  
     % cd openssl  
     % ./config --prefix=<somewhere1> --libdir=lib  
     % make  
     % make install
     ```
     
   
   - 安装nghttp3，用于实现HTTP/3和QPACK协议层。
     ```
     % cd ..  
     % git clone -b $NGHTTP3_VERSION https://github.com/ngtcp2/nghttp3  
     % cd nghttp3  
     % git submodule update --init  
     % autoreconf -fi  
     % ./configure --prefix=<somewhere2> --enable-lib-only  
     % make  
     % make install
     ```
     
   
   - 安装实现QUIC协议的核心库ngtcp2。
     ```
     % cd ..
     % git clone -b $NGTCP2_VERSION https://github.com/ngtcp2/ngtcp2
     % cd ngtcp2
     % autoreconf -fi
     % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3> --enable-lib-only --with-openssl
     % make
     % make install
     ```
     
   
   - 安装curl，用于发起支持HTTP/3的请求。
     ```
     % cd ..  
     % git clone https://github.com/curl/curl  
     % cd curl  
     % autoreconf -fi  
     % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-openssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3>  
     % make  
     % make install
     ```
     
     
#### 步骤二：在后端服务器中部署Web应用
1. 远程登录后端服务器ECS_server。
2. 在后端服务器中，新建目录quic_testweb。
   ```
   mkdir quic_testweb
   ```
   
3. 在quic_testweb目录下，新建一个index.html文件。
   1. 新建index.html文件。
      ```
      vi index.html
      ```
      
   
   2. 按**i** 键进入编辑模式，index.html的脚本如下。
      ```
      hello, this is quic!
      ```
      
    
4. 按**Esc** 键退出编辑模式，输入**:wq**保存index.html文件。
 
#### 步骤三：添加QUIC监听器
1. 进入[弹性负载均衡列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/list)。
2. 在目标弹性负载均衡实例的操作列，单击"添加监听器"。
3. 在添加监听器页面，前端协议选择"QUIC"，本实践方案设置442端口。
   图2添加QUIC监听器   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002315117977.png "点击放大") 
4. 单击"下一步：配置后端分配策略"，后端服务器组参数选择"使用已有"。选择已经创建完成的**HTTP**服务器组，完成后单击"下一步：确认配置"。
5. 确认配置参数后，单击"提交"，完成QUIC监听器的创建。
 
#### 步骤四：验证QUIC生效
1. 通过以下curl命令访问ELB绑定的EIP和监听端口：
   ```
   curl --http3-only -k -i https://<EIP>:<PORT>
   ```
   
2. 收到如[图3]所示页面，则表示客户端通过ELB与后端服务之间通过QUIC协商实现了HTTP/3通信。
   图3验证通过QUIC协商实现了HTTP/3通信   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002381943913.png "点击放大") 
 
