quic测评

本文详细介绍了QUIC协议,包括其优势如0RTT连接、连接迁移和改进的拥塞控制。通过使用quic-go,进行了抓包实验和源代码分析,展示了QUIC如何实现在应用层解决队头阻塞问题并实现灵活升级。
摘要由CSDN通过智能技术生成

1. QUIC协议概述

QUIC是由谷歌设计的一种基于UDP的传输层网络协议,并且已经成为IETF草案。HTTP/3就是基于QUIC协议的。QUIC只是一个协议,可以通过多种方法来实现,目前常见的实现有Google的quiche,微软的msquic,mozilla的neqo,以及基于go语言的quic-go等。 由于go语言的简洁性以及编译的便捷性,本文将选用quic-go进行quic协议的分析,该库是完全基于go语言实现,可以用于构建客户端或服务端。
image.png

QUIC的优势(参考
  • 0RTT快速连接

TCP最少需要花费1RTT的时间来建立连接。下图列分别描述了TLS1.2、TLS1.3和QUIC建立连接的成本。每1列分为上下两个图,上图表示首次建立连接所需成本,下图表示再次建立连接所需成本。
image.png
可以看到,TLS1.2下,首次建立连接,首先需要1次RTT建立连接(蓝色线),2次RTT交换密钥和加密策略(黑色线),然后开始通信。再次建立连接时,由于已缓存了密钥,因此少1次RTT。 TLS1.3和QUIC都采用了Diffie-Hellman密钥交换算法来交换密钥。该算法的优点是交换密钥只需要1次RTT。在QUIC下,只有首次建立连接交换密钥时消耗1RTT时间,再次连接时就是0RTT了。这已最大限度的减少握手延迟带来的影响。这个特性在连接延迟较大的移动网络上有较好的性能提升。

  • 连接迁移

TCP下一个连接是以四元组标识的,即(SrcIp,SrcPort,DstIp,DstPort)。而QUIC连接是以客户端产生的一个64位随机数作为连接标识。当网络、端口发生改变或中断时,只要连接标识不改变,连接就不会中断。

  • 改进拥塞控制
    1. QUIC在应用层即可实现不同的拥塞控制算法,不需要改操作系统和内核。
    2. 单个程序的不同连接也能支持配置不同的拥塞控制。这样我们就可以给不同的用户提供更好的拥塞控制。
    3. 应用程序变更拥塞控制,甚至不需要停机和升级。
    4. QUIC还有带宽预测,RTT监控,发送速率调整等高级算法支持。
  • 双级别流控

TCP通过滑动窗口机制来保证可靠性以及进行流量控制。QUIC更新了其滑动窗口机制,并在Connection和Stream两个级别分别进行流控。
image.png
用公式表示就是: connection可用窗口 = stream1可用窗口 + stream2可用窗口 + streamN可用窗口

  • 没有队头阻塞的多路复用

image.png
SDPY和HTTP2协议的多路复用,是让所有请求在一个TCP连接上传输。前面说过,TCP协议有队头阻塞问题,如果某个资源的某个包丢失了,由于TCP是保证时序的,就会在接收端形成队头阻塞。TCP协议无法区分各个资源的包是否关联,因此会停止处理所有资源,直到丢包恢复。
image.png
QUIC是基于UDP的,UDP不需要保证包的时序,因而不存在等待丢包恢复,不存在队头阻塞问题。如果某个资源的某个包丢失了,只会影响单个资源,其他资源会继续传输。

  • 实现与升级更灵活

TCP协议栈是写在操作系统内核以及中间设备固件上的,对其更新升级,耗费的时间是以年为周期。 基于UDP协议栈的QUIC协议在应用层实现。应用软件的更新较为轻量,因此协议新特性的升级迭代周期是以月或周来计算。

2. 基于quic-go抓包

实验环境
  • MacOS10.13.6
  • go version go1.16.6 darwin/amd64
  • Wireshark Version 3.6.1
  • FireFox 96.0.1 (64 位)
项目下载配置

git clone [https://github.com/lucas-clemente/quic-go.git](https://github.com/lucas-clemente/quic-go.git)下载项目
cd example打开实例文件夹

服务器端

go build main.go
image.png
./main -qlog -v -tcp运行服务器
image.png

客户端

cd example/client打开客户端文件夹
go build main.go编译
./main -v -insecure -keylog ssl.log [https://quic.rocks:4433/](https://quic.rocks:4433/)客户端访问
image.png

浏览器访问

配置火狐浏览器
image.png
浏览器访问[https://localhost:6121/demo/tile](https://localhost:6121/demo/tile)
image.png

抓包

wireshark配置
image.png
使用wireshark对loopback抓包,可以看到抓包信息与服务器获取信息是相匹配的。
image.png

3. QUIC源代码分析

echo

echo程序实现了一个简单的回显功能。
image.png

服务器端

echoServer()方法启动一个服务器,回显客户端的所有数据。

// Start a server that echos all data on the first stream opened by the client
func echoServer() error {
   
	listener, err := quic.ListenAddr(addr, generateTLSConfig(), nil)
	if err != nil {
   
		return err
	}
	sess, err := listener.Accept(context.Background())
	if err 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值