QUIC 协议和 HTTP3.0 技术研究

QUIC是什么

QUIC(全称Quick UDP Internet Connections)是谷歌公司制定的一种基于 UDP 协议的低时延互联网传输协议,它提供了多项改进,旨在加速HTTP传输并使其更加安全,目标是想最终取代TCP和TLS协议。

QUIC的优势

1.低延迟连接的建立

对于传统的HTTPS来说,对于其传输层的TCP握手就需要3个RTT,如果算上加密部分的话还需要产生额外的RTT,也就是说HTTPS进行一次完全的握手至少需要4个以上的RTT。 然而对于QUIC来说,如果是客户端首次连接到服务器,由于QUIC将传输与加密结合在一起的特性所在,一般来说正常情况下初次握手只需要1个RTT就可以完成握手;但是对于触发版本协商、证书无法解密等问题当然也会导致多个RTT的产生。 而重复连接的情况下握手,如果在证书有效的情况下,客户端发送Hello包并不用等待回复就可以直接发数据加密包,也就是实现了传说中的0RTT。

QUIC 协议和 HTTP3.0 技术研究

2.改进的拥塞控制

TCP 的拥塞控制实际上包含了四个算法:慢启动,拥塞避免,快速重传,快速恢复。 QUIC协议当前默认使用TCP的拥塞控制算法,并在其基础上进行了相应的改进;当然QUIC也支持其他的拥塞控制算法。 主要的改进点有: 1、可插拔设计 2、单调递增的Packet Number 3、不允许Reneging 4、更多的Ack块 5、精确计算RTT时间

3.无队头阻塞的多路复用

HTTP2的最大特性就是多路复用,而HTTP2最大的问题就是队头阻塞。 首先了解下为什么会出现队头阻塞。比如HTTP2在一个TCP连接上同时发送3个Stream,其中第2个Stream丢了一个Packet,TCP为了保证数据可靠性,需要发送端重传丢失的数据包,虽然这时候第3个数据包已经到达接收端,但被阻塞了,这就是所谓的队头阻塞。 而QUIC多路复用可以避免这个问题,因为QUIC的丢包、流控都是基于Stream的,所有Stream是相互独立的,一条Stream上的丢包,不会影响其他Stream的数据传输。

4.前向纠错

QUIC协议的每个数据包除了本身的数据以外,会带有其他数据包的部分数据,在少量丢包的情况下,可以使用其他数据包的冗余数据完成数据组装而无需重传,从而提高数据的传输速度。具体实现类似于RAID5,将N个包的校验和(异或)建立一个单独的数据包发送,这样如果在这N个包中丢了一个包可以直接恢复出来,除此之外还可以用来校验包的正确性。

5.连接迁移

对于TCP协议来说,标识一个TCP连接需要4个参数,既来源IP、来源端口、目的IP和目的端口。其中的任一参数改变,TCP连接就需要重新创建。这对于传统网络来说影响不大,因为来源和目的IP相对固定。但是在无线网络中,情况就大不相同了。设备在移动过程中,可能会因为网络切换(如从WIFI网络切换到4G网络环境),导致TCP连接需要重新创建。 QUIC协议使用了UDP协议,不再需要这四元组参数。同时QUIC协议实现了自己的会话标记方式,称为连接UUID。当设备网络环境切换时,连接UUID不会发生变化,因此无需重新进行握手。

 

 

QUIC 编译运行

首先为了能从外网下载go的各种环境,先把上外网折腾好。

安装一下v二ray,配置好端口后,把需要提速的命令通过proxychains提速。

然后配置go环境。

 ​
 wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
 tar xfz go1.13.4.linux-amd64.tar.gz -C /home/tsuhao
 #配置全局变量
 gedit ~/.bashrc
 export GOROOT=/home/tsuhao/go
 export GOPATH=/home/ubuntu/gocode
 export PATH=$PATH:$GOROOT/bin:/$GOPATH/bin
 ​

QUIC 协议和 HTTP3.0 技术研究

上一篇:maven属性、profile、资源过滤、不同环境构建项目


下一篇:视屏面试传输协议到底是TCP还是UDP