571
社区成员
发帖
与我相关
我的任务
分享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 真正的多路复用:

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.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