QUIC协议分析与测试

编程菜鸟111 2022-01-16 15:31:30

一、QUIC协议简介

1. QUIC介绍

QUIC 是一种面向连接的协议,它在客户端和服务器之间创建有状态的交互。QUIC 集成了 TLS 握手,使用定制的帧来保护数据包。握手的结构允许尽快交换应用程序数据,这包括客户端立即发送数据的选项 (0-RTT),这需要某种形式的事先通信或配置才能启用。端点通过交换 QUIC 数据包在 QUIC 中进行通信。大多数数据包都包含帧,这些帧在端点之间携带控制信息和应用程序数据。QUIC 对每个数据包的整体进行身份验证,并尽可能多地加密每个数据包。QUIC 数据包在 UDP 数据报中携带,以更好地促进在现有系统和网络中的部署。

应用程序协议通过 QUIC 连接通过流交换信息,流是有序的字节序列。可以创建两种类型的流:双向流,允许两个端点发送数据;和单向流,允许单个端点发送数据。基于信用的方案用于限制流创建并限制可以发送的数据量。

一旦建立,就会为连接终止提供多个选项。应用程序可以管理正常关闭,端点可以协商超时期限,错误可以导致立即连接断开,并且无状态机制提供在一个端点丢失状态后终止连接。

2. QUIC优势

  • 改进的拥塞控制。传统的TCP拥塞控制需要端到端的网络协议栈支持,而QUIC在应用程序层面就能实现不同的拥塞控制算法;此外,应用程序不需要停机就能实现拥塞控制的变更,拥有很大的灵活性。
  • 0RTT连接。目前HTTPS每次建立连接需要TCP三次握手+TLS握手,至少需要3RTT时间,而QUIC由于建立在UDP的基础上,所以只需要0个RTT就能实现数据发送。

img

  • 连接迁移。QUIC 连接并不严格绑定到单个网络路径。连接迁移使用连接标识符来允许连接转移到新的网络路径,连接标识符由一个64位的随机数来确定,即使IP地址或者端口号发生变化也可以不用重新建立连接。这种设计还允许在网络拓扑或地址映射发生变化后继续连接,例如可能由 NAT 重新绑定引起的连接变化。
  • 加密认证的报文。TCP协议头部没有经过加密处理,数据在网络传输中容易被其他设备窃取和篡改。但是QUIC除了个别报文都是经过认证的,报文主体都经过了加密,如果有对报文进行修改的信息接收端都能够及时发现,可以降低网络数据的风险。

img

二、MsQuic编译及测试(Ubuntu)

1. 源码目录结构

  • bin:所有静态库打包到特定平台的二进制文件中
  • core:实现QUIC协议的平台无关代码
  • inc:其他目录使用的头文件
  • mainfest:Windows ETW清单和相关文件
  • platform:操作系统类型、套接字和TLS的平台特定代码
  • test:MsQuic API/协议的测试代码
  • tools:MsQuic的实践工具

2. 构建MsQuic环境

  1. 下载源码
git clone --recursive https://github.com/microsoft/msquic.git
  1. 安装PowerShell
# Download the Microsoft repository GPG keys
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb

# Update the list of products
sudo apt-get update

# Enable the "universe" repositories
sudo add-apt-repository universe

# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
pwsh

如果在安装PowerShell中出现如下错误:

powershell : Depends: libicu55 but it is not installable

你需要首先运行如下代码:

sudo apt-get remove libicu57
wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu55_55.1-7ubuntu0.5_amd64.deb
sudo dpkg -i libicu55_55.1-7ubuntu0.5_amd64.deb
wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.0.0_1.0.2g-1ubuntu4.18_amd64.deb
sudo dpkg -i libssl1.0.0_1.0.2g-1ubuntu4.18_amd64.deb
  1. 安装.NET Core
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-6.0
  1. 安装CMake>3.16,Ubuntu参考链接https://apt.kitware.com/

  2. 重启终端,然后安装对应依赖

./scripts/prepare-machine.ps1 -Configuration Dev
  1. 使用pwsh命令进入PowerShell,在scripts文件夹下运行build.ps1开始构建
./scripts/build.ps1
  1. 测试用例运行
./scripts/test.ps1

运行结果如下:

img

3. 运行样例

  1. 生成证书密钥
openssl req  -nodes -new -x509  -keyout server.key -out server.cert
  1. 进入PowerShell,在PowerShell下进入\msquic/artifacts/bin/linux/x64_Debug_openssl目录运行服务器端
./quicsample -server -cert_file:path/server.cert -key_file path/server.key

其中path需要根据自己电脑的情况进行修改

服务器等待客户连接请求:

img

  1. 运行客户端
./quicsample -client -target:127.0.0.1 4567 -unsecure

此时服务器端运行如下:

img

客户端运行如下:

img


作者:NP359

...全文
672 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧