一、TCP的问题
学习计算机网络的时候,我们都知道TCP是可靠的,而UDP是不可靠的,主要原因是UDP比较简单,没有TCP那套复杂的可靠性的传输控制机制。所以无论是HTTP/1.1还是HTTPS、HTTP/2,处于可靠性的考虑,都采用TCP进行传输,其中HTTPS和HTTP/2还需要依赖TLS协议来进行安全传输。
但同时TCP也存在一些问题,比较明显的就是队头阻塞。主要原因是 TCP 协议的可靠性机制导致的。TCP使用序列号来标识数据的顺序,必须按照顺序处理,如果前面的数据丢失,后面的数据就算到达了也不会通知应用层来处理,就会造成一定的性能问题。
二、QUIC协议
HTTP/3引入了QUIC协议,?家都知道UDP是不可靠传输的,但基于UDP的QUIC协议 可以实现类似 TCP 的可靠性传输。因为UDP本身没有连接的概念,所以不需要三次握手,优化了连接建立的握手延迟,同时在应用程序层面实现了TCP的可靠性。而且UDP 的传输是不管顺序,也不管丢包的,所以不会出现HTTP/1.1的队头阻塞和HTTP/2的丢包导致全部重传问题。 QUIC相比以往的TCP传输,减少了三次握手和TLS握手时间,改进了拥塞控制,避免了队头阻塞的多路复用,可以迁移连接以及前向冗余纠错。
2.1 连接建立低延时
建立连接消耗的0RTT(往返时延)可以说是QUIC相比HTTP2最大的性能优势。主要还是QUIC是建立在UDP上的,同时又实现了0RTT的安全握手,所以在大部分情况下,只需要0个RTT就能实现数据发送。
2.2 改进的拥塞控制
TCP的拥塞控制实际上包含了四个算法:慢启动,拥塞避免,快速重传,快速恢复。QUIC协议当前默认使用了TCP协议的拥塞控制算法,从算法本身来看,QUIC只是按照TCP协议重新实现了一遍,那么QUIC协议到底改进在哪些方面呢?主要有以下几点:
1:可插拔,能够灵活地处理拥塞控制的算法,可以生效,变更和停止拥塞控制。 2:单调递增的Packet Number,QUIC是一个可靠的协议,使用Packet Number 代替了TCP的Sequence Number,并且每个Packet Number都严格递增,这样的好处就是可以避免重传包的歧义。对于TCP来说,触发重发的Sequence Number和原始包的Sequence Number不变,客户端收到Ack数据无法判断是原始请求的响应还是重传请求的响应。 3:单纯依赖Packet Number还不足以保证顺序性和可靠性,顶多只能算是一个计数,所以QUIC引入了Stream Offset,一个偏移量确认的概念。
2.3 没有队头阻塞的多路复用
QUIC也有多路复用的概念,它的多路复用和HTTP2类似,在一条QUIC连接上可以并发发送多个HTTP请求(Stream),但是 QUIC 的多路复用相比HTTP2有一个很大的优势:
QUIC一个连接上的多个Stream之间没有依赖,这样假如其中的一个请求丢失了其中的一个包,也只会影响当前包的处理,不会影响到改包和其他包之前及之后的处理。
因为QUIC是通过Stream Offset,也就是便宜量的方式去确认,这也就在很大程度上缓解甚至消除了队头阻塞的影响。
2.4 连接迁移
讨论这个可以先思考一个问题,假设手机从WIFI切换到移动流量,这个过程网络会不会断?
对于这个问题,可以先回到TCP本身,一条TCP连接是由四元组(源IP,源端口,目的IP,目的端口)标识的。当其中任何一个元素发生变化时,这条连接依然维持着,能够保持业务逻辑不中断,我们通常就叫连接迁移。因为服务端的IP和端口一般都是固定的,所以我们通常都是看客户端。
从TCP连接的角度来讲,从WIFI切换到移动流量,客户端的IP肯定会发生变化,需要重新建立和服务端的TCP连接,所以这个过程是会断,给到用户的反应就是突然间网络卡了一下。
回到QUIC,QUIC是如何做到连接迁移呢?其实也很好理解,因为QUIC连接不再以四元组标识,而是通过连接ID来标识通信的两个端点,这样即使客户端IP或者端口发生变化时,只要连接ID不变,这条连接依然维持上下文信息,就可以无缝的复用原连接,从而达到连接迁移的功能。
由于连接ID是客户端随机产生的,并且长度有 64 位,所以冲突概率非常低。
三、最后再说说
QUIC其实还有很多其他的优势,比如实现前向冗余纠错,包丢失的时候能还原出握手消息,还能实现证书压缩,减少证书传输量,针对包头进行验证等,可以说QUIC补充了原来UDP传输不可靠的弊端,也解决了TCP可靠性传输的性能问题,是一个很优秀的传输协议。
但QUIC协议目前未大量普及,还面临着一些挑战,依赖于UDP,基本没有什么时延,所以大量的UDP包有时候会被服务商误认为是攻击,从而被丢弃,同时有的对UDP 443端口并不友好,这刚好是QUIC协议的端口,而且无论是路由器还是防火墙目前对QUIC其实也都还没有做好准备,整体也还是处于一个发展阶段。
|