路由器因无法处理高速率达到的流量而被迫丢弃数据信息的现象称为拥塞,当路由器出现上述问题时,我们就说出现了拥塞。
拥塞控制防止网络因为大规模的通信负载而瘫痪。其基本方法是当有理由认为网络即将进入拥塞状态(或者已经由于拥塞而造成丢包情况)时减缓TCP传输。TCP拥塞控制的难点在于怎样准确地判断何时需要减缓且如何减缓TCP传输,以及何时恢复其原有速度。
TCP的拥塞控制主要处理两种现象:包丢失和超时重传
这种由一个ACK到达(称作ACK时钟)触发一个新数据包传输的关系成为自同步(self-clocking),TCP的两个核心算法:慢启动和拥塞避免。这两个算法是基于包守恒和ACK时钟原理。
一、慢启动
当一个新的TCP连接建立或检测到由重传超时(RTO)导致的丢包时,需要执行慢启动。慢启动的目的是使TCP在用拥塞避免算法之前得到cwnd值(congestion window,拥塞窗口)。
慢启动:一条TCP连接开始,cwnd设置为一个报文段,一次只能发送一个;当收到这一个确认之后,cwnd值加一,一次一次能够发送两个;当着两个的确认来后,cwnd加倍变为4个;依次类推,可以看出这是指数型的增长。
cwnd的值不能无限增长,当超过ssthresh时,就会使用拥塞避免。
二、拥塞避免
为了得到更多的传输资源而不致影响其他连接传输,TCP实现了拥塞避免算法,随时间线性增长。每收到一个确认后,cwnd增加1/cwnd。
三、慢启动和拥塞避免的选择
慢启动阈值觉得使用慢启动还是拥塞避免。当cwnd<ssthresh,使用慢启动算法;当cwnd>ssthresh,需要执行拥塞避免;当二者相等时,任何一种算法都可以使用。慢启动阈值并不是不变的,而是随时间改变的。如果出现重传情况,这时慢启动阈值将减少至当前窗口大小的一半。
四、快速恢复算法
传统算法当丢包需要重传时,将sshresh设为cwnd/2,将cwnd设为1,重新开始慢启动,这会造成网络卡顿。
快速重传算法会发送三个ACK,于是发送端就会快速重传。而快速恢复算法当丢包需要重传时将cwnd减半为cwnd/2,然后sshthresh=cwnd,当三个包返回时,cwnd=sshthresh+3,还处在比较高的值,没有一夜回到解放前。
五、TCP BBR拥塞算法
TCP BBR是由Google设计,于2016年发布的拥塞算法。以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR则基于模型主动探测。该算法使用网络最近出站数据分组当时的最大带宽和往返时间来创建网络的显示模型。数据包传输的每个累计或选择性确认用于生成记录在数据包传输过程和确认返回期间的时间内所传送数据量的采样率。该算法认为随着网络接口控制器逐渐进入千兆速度时,分组丢失不应该被认为是识别拥塞的主要决定因素,所以基于模型的拥塞控制算法能有更高的吞吐量和更低的延迟,可以用BBR来替代其他流行的拥塞算法,例如CUBIC。Google在YouTube上应用该算法,将全球平均的YouTube网络吞吐量提高了4%,在一些国家超过了14%。
七、TCP保活机制
TCP是无感知的虚拟连接,中间断开两端不会立即得到通知。一般在使用长连接的环境下,需要心跳保活机制可以勉强感知其存活。业务层面有心跳机制,TCP协议也提供了心跳保活机制。