QUIC随笔

说QUIC前,先说说TCP的拥塞控制。在短瘦管道的时代,小并发、窄带宽和短距离传输使传输层不用过多关注传输速率和响应速度,传输层需要做的是保证数据的可靠到达,有一定的带宽探测能力,保证多条连接之间的绅士(拥塞控制)和公平(AIMD),这也是RENO所实现的。随着网络的发展,管道由短变长,带宽由窄变宽,人们开始关注长管道的传输速度,因为管道变长,RENO基于ACK反馈的AIMD特性造成了慢启动速度慢,探测更多带宽的速度慢,为了解决这一问题,用二分法进行带宽探测的BIC诞生。但管道变长RTT增大,而BIC对窗口的调整依赖于ACK,也就是说RTT越大,BIC收敛所需要的时间越长,同时又因为BIC公平性的问题,于是产生了CUBIC,让拥塞控制变得RTT无关。而在中间设备缓存不断增大和BufferBloat的今天,BRR的诞生为拥塞控制提供了一种新思路,其不依赖于丢包的拥塞控制算法,使其在弱网环境下也有较好的性能表现。(关于BBR:https://blog.csdn.net/u013032097/article/details/96212770)

网络环境的不断发展,促使TCP的拥塞控制不断发展。协议的变更,往往是因为不再满足当前网络环境的新要求,而在网速要求更高、响应要求更快、传输内容更加丰富的今天,TCP也遇到了同样的问题。

一、 TCP的问题

1. 协议僵化

终端设备的僵化。传输层协议栈依赖于操作系统,而内核的升级和替换是复杂和低频的,这造成了即使TCP根据现代网络情况不断优化,这些新的优化也无法被及时推广,在实际工作中也发现一些网络设备应用层协议栈仍在使用RENO作为拥塞控制算法。

中间设备的僵化。TCP一些选项和特性的生效,不光需要终端设备的支持,还需要中间网络设备的支持,特别是在代理和四七层负载均衡普遍应用的今天。例如,中间设备不支持时间戳选项和SACK选项,将直接造成RTT测量不够准备,影响SACK依赖拥塞控制算法的使能。

2. 握手延迟大

先来计算下面一组数据:

  • TCP三次握手建立连接的时间为1RTT;
  • TLS1.2完成握手的时间为2RTT;
  • TLS1.2在拥有session ticket情况下握手时间为1RTT;

那么HTTP1.2+TLS1.2+TCP的最大延迟为3RTT,最小延迟为2RTT,即使将安全传输层协议更换为TLS1.3,因为传输层和安全传输层的分离,延迟也将是1RTT-2RTT,这将对多短连接的场景造成影响。

3. 队头阻塞问题

虽然HTTP2试图用多stream解决HTTP多请求的队头阻塞问题,但在传输层使用TCP的情况下,问题并没有被完全解决。因为TCP的滑动窗口机制,只有序列号连续的报文才可能被应用层接收,所以一旦出现丢包或乱序到达的情况,整个TCP连接将被阻塞,但事实上,特别是在HTTP2环境下,被阻塞的已到达的报文可能已构成完整的stream请求,这将影响连接的收发效率。

4. 连接唯一性问题

TCP连接由四元组信息标示其唯一性,但在一些情况下,连接的四元组信息将会发生变化。例如,从WIFI切换到4G网络后,因为用户原IP的变化,将导致原有连接重建。例如,在NAT环境下,因为中间网络设备的连接超时,也将造成同一条连接实际到达服务端的四元组信息发生变化,造成原有连接重建。

5. RTT计算不准确

在重传发生时,因为发送端无法区分ACK确认原有报文或重传报文,所以根据Karn算法,当重传发生时,RTT不再更新。另外,基于同样的问题,在无法通过eifel算法判断伪超时重传和伪快速重传时,只能通过F-RTO进行不完全准确的判断。

因为Delay ACK的存在,即使在正常环境下,也会造成RTT测量值较实际值偏大。

二、QUIC特性

QUIC,基于UDP协议传输,在应用层实现可靠传输、拥塞控制、流量控制等众多TCP特性,HTTP over QUIC被更名为HTTP3。

低延时

QUIC同时兼容了传输层和安全传输层的功能,同时在安全传输层与TLS1.3保持一致,实现在0RTT(首次1RTT)完成传输层+安全传输层的握手,保证连接的快速建立。

多路复用

作为为HTTP传输所创造的协议,QUIC继承了HTTP2多stream的思想,通过传输层多stream,解决TCP队头阻塞的问题,即某个stream的阻塞,不会影响其它stream的正常处理。

序列号单调递增特性

为了解决TCP原始报文和重传报文无法区分的歧义性问题,QUIC使用Packet Number代替TCP序列号的作用,Packet Number单调递增,即使发生重传,重传报文的Packet Number也区别于原始报文。同时,QUIC引入Stream Offset的概念,用于表示报文在stream中的实际偏移量,保证应用数据顺序性。

连接唯一性

QUIC不再使用四元组作为连接唯一表示,其使用一个64位ID作为连接表示,这时即使连接四元组信息发生变化,也不会影响连接唯一性的识别。

灵活性

QUIC的应用层实现,为它的灵活性部署创造了条件。首先,不同的应用程序,可以根据其业务特点,灵活的选择拥塞控制算法,而且由于不依赖于内核,部署成本和难度都将降低。其次,因为QUIC基于UDP实现,所以其部署不依赖中间网络设备的支持。

除此之外,QUIC还有例如前向冗余纠错、优化RTT计算等特性。

三、关于QUIC

QUIC与UDP

QUIC和UDP相辅相成,UDP是暴力(DDOS)、不公平(多流竞争下的公平性)、不可靠的,QUIC的流量控制、拥塞控制等机制为野马套上了缰绳,而QUIC使用UDP为载体,利用其开销小、传输速率高的特性,事实上也是越来越多的业务选择UDP作为传输层基础协议。另外,以UDP为载体,也利于目前防火墙等网络设备对QUIC无法感知的情况下,将QUIC以UDP方式进行放过。

QUIC和传输层

内核为不同的传输场景提供了不同的传输层协议,但网络和网络业务的发展,对传输层有了更细致的要求。点播业务期待更快的首帧响应(握手时间),游戏业务期待低延迟(RTT、BufferBloat),网盘云盘业务期待传输速度尽快到达峰值(慢启动时间),视频会话期待语音优先于图像(流优先级),包括在不同的链路条件下也对传输层有着不同的要求,那么原有内核传输层一套吃遍所有的环境就不再适用,业务对传输层的期待是场景更加丰富、组合更加灵活、插拔更加便捷,同时又满足传输层原有公平、高效的要求。QUIC的诞生是为HTTP服务,HTTP over QUIC也被正式定义为HTTP3,但QUIC对协议的承载不仅限于HTTP,其特性为开发者扩展更优质的传输层API提供了环境和思路。

你可能感兴趣的:(传输层)