QUIC协议分析(基于aioquic)

cheungwaichun 2022-01-18 22:17:29

1.QUIC协议简介

        QUIC是一个通用的传输层网络协议,全称quick udp internet connection(快速 UDP 互联网连接),最初由Google的Jim Roskind设计,在2013年公开发布。它是一个使用udp进行多路并发传输的协议。根据资料,在从Chrome浏览器到Google服务器的所有连接中,超过一半的连接都使用了QUIC,而且Microsoft Edge、Firefox和Safari等都提供了对QUIC的支持。

1.1 QUIC的优势

       基于TCP和TLS的HTTPS(1.1&2.0)协议,存在完整握手流程过长(首次连接≥3-RTT,握手缓存后2-RTT);在弱网环境中存在TCP和TLS双重阻塞,无法实现真正多路复用等问题。QUIC基于UDP实现, 缩短了握手流程,实现了真正的多路复用,并具有改进的拥塞控制机制、前向冗余纠错等优良特性。

1.2 QUIC协议栈:

1.3 握手流程对比:

1.4 真正的多路复用:

 

2. aioquic的部署

       aioquic是一个用python实现的QUIC网络库。

实验环境:

操作系统:ubuntu 20.04

Python版本:3.8.10

步骤:

安装ubuntu的libssl-dev库

$ sudo apt install libssl-dev python3-dev

安装python的aioquic库

$ pip install aioquic

获取aioquic例程源码

$ git clone https://github.com/aiortc/aioquic.git

运行示例服务器

$ python examples/http3_server.py --certificate tests/ssl_cert.pem --private-key tests/ssl_key.pem

运行示例客户端,发出HTTP/3请求:

$ python examples/http3_client.py --ca-certs tests/pycacert.pem https://localhost:4433/

也可以执行HTTP/0.9请求

$ python examples/http3_client.py --ca-certs tests/pycacert.pem --legacy-http https://localhost:4433/

或者通过websocket连接

$ python examples/http3_client.py --ca-certs tests/pycacert.pem wss://localhost:4433/ws

 

3. 源码分析

3.1 服务端http3_server.py

3.1.1 HttpRequestHandler类

       负责处理收到的请求。receive方法从队列取出一个请求,send方法向client发出响应。

3.1.2 WebSocketHandler类

       用于在建立了websocket连接的情况下处理请求;若仍未建立websocket连接,则暂不处理,将event请求加入队列。

3.1.3 HttpServerProtocol类

       根据不同的协议建立连接。同时支持HTTP/0.9和HTTP/3协议,上面的部署部分曾分别用这两种协议与server建立了连接。

3.1.4 SessionTicketStore类

        缓存连接状态,便于连接中断后的快速恢复。

 

3.2 客户端http3_client.py

3.2.1 HttpClient类

        请求方式有get和post两种,除此之外,还提供了通过websocket进行连接的支持。QuicEvent是转到http层进行处理的。

 

3.3 aioquic库的src代码

       packet(包)内包括头部(Header)和若干Frame(帧)。Header结构:

Frame(帧)的可选类型:

通过QuicPacketBuilder类中的方法,将若干个Frame组装起来,最后加上Header信息组成一个完整的QUIC包:

QUIC的Stream(流)结构,具有send part 和 receive part。不同的流通过id区分:

connection.py则是QUIC连接层面的操作的实现代码,实现了建立连接(通过handshake frame)、维护连接状态、通过连接传送数据、流量控制等功能。

 

 

作者:NP554

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

571

社区成员

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

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