当前位置:   article > 正文

TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复_如何根据慢开始,拥塞避免、快重传和快恢复调整拥塞窗口的值

如何根据慢开始,拥塞避免、快重传和快恢复调整拥塞窗口的值

拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。这种现象跟公路网中经常所见的交通拥挤一样,当节假日公路网中车辆大量增加时,各种走向的车流相互干扰,使每辆车到达目的地的时间都相对增加(即延迟增加),甚至有时在某段公路上车辆因堵塞而无法开动(即发生局部死锁)。 — 摘自百度百科

端到端TCP拥塞控制的本质思想是通过调整发送端的发送速率来控制网络的负荷量。具体地说,TCP不断地通过加大发送的速率来对当前网络的实际承载能力进行探测,根据超时或者丢包等现象判断当前网络是否已经"超负荷“,然后迅速减小向网络中发送信息的速率,并在新的起点上继续对网络进行试探。从而达到控制网络请求的目的,避免出现大规模的拥塞以致导致网络不可用

早期的TCP协议只有基于窗口的流量控制(flow control)机制而没有考虑到可能由于网络自己的传输能力不足,而导致整个网络发生崩溃(影响网络的因素实在太多了,传输过程中有很多不可预见的问题)。

1988年V.Jacobson在论文中提出了由“慢启动(Slow Start)”和“拥塞避免(Congestion Avoidance)”组成的TCP的网络拥塞控制。在20多年的发展过程中,后人在此算法基础上又进行了多次的改进和优化

与拥塞控制相关的有四个比较重要的版本:TCP Tahoe、TCP Reno、TCP NewReno和TCP SACK。
TCP Tahoe是早期的TCP版本,它包括了3个最基本的算法-“慢启动”、“拥塞避免”和“快速重传(Fast Retransmit)”。TCP Reno则在TCP Tahoe基础上增加了“快速恢复(Fast Recovery)”算法,针对快速重传作出特殊处理,避免了网络拥塞不严重时采用“慢启动”算法而导致过度减小发送窗口大小的问题。

TCP NewReno的主要改进在于一个窗口内多个报文段丢失的问题。这样可以避免TCP Reno中的多次重传超时。另外,TCP NewReno算法在快速恢复中引入了部分确认(Partial ACK)。它在快速恢复阶段到达并且确认新数据,但它只确认进入快速重传之前发送的一部分数据。

TCP SACK(Selective Acknowledgement)也是对TCP Reno的改进,当检测到拥塞后,不必重传从数据丢失到检测到丢失这段时间发送端发送的所有报文段,而是对这些报文段进行有选择的确认和重传,避免不必要的重传。

基于丢包/超时的拥塞控制

这种算法就是在发送方维护一个拥塞窗口(cwnd),大小等于发送窗口,如果发送方没有在规定的时间间隔内收到接收方的应答,则就可以认为出现了网络拥塞。

Slow Start 慢开始算法

所谓慢启动,也就是在建立好连接的时候,先从较低的发送速率开始,一点点提速,试探一下网络的承受能力,由于一开始的速率较低,所以提升速度可以快一点

慢启动算法:
(1) 连接建立后先初始化拥塞窗口cwnd,其大小为1MSS( Maximum Segment Size 最大报文段长度)
(2) 客户端收到服务端的ack后.就会将cwnd大小*2, 呈指数上升
(3) 当cwnd 达到慢开始门限 (ssthresh, slow start threshold)时,停止慢开始算法,进入“拥塞避免算法”

Congestion Avoidance 拥塞避免算法

拥塞避免算法思路是将增长速率变为线性增长,也就是每经过一个往返RTT时间就把发送方的cwnd加1

过了慢开始门限后,拥塞避免算法可以避免窗口增长速度过快导致窗口拥塞,采用缓慢增加的方式调整到网络的最佳值。

简单来说:

  • 当cwnd < ssthresh ,使用慢开始算法;
  • 当cwnd = ssthresh,可以使用慢开始算法,也可以使用拥塞算法;
  • 当cwnd > ssthresh,使用拥塞算法;

通过上述两个算法可以使得网络传输速率一直增大,直到出现超时,这时候需要将cwnd重新调整到1 MSS开始,使用慢开始算法,同时将慢开始门限ssthresh调整为cwnd超时点的一半 ,然后继续执行慢开始、拥塞避免算法。

Fast retransmit 快重传算法 和 Fast Recovery 快速恢复算法

TCP拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的TCP拥塞控制算法以丢包来判断网络是否进入拥塞状态。对于丢包有两种判定方式,一种是超时重传RTO[Retransmission Timeout],另一个是收到三个重复确认ACK(因为TCP一旦超时就会重新发送数据包)。

重传定时器 :
判断报文段丢失的依据,发送端发送一个报文段同时启动重传定时器,如果重传定时器超时,但发送端还没有收到接收端的ACK,就判断该报文段丢失,重传丢失报文段并重新启动重传定时器。
TCP采用动态重传超时估计,即以往返时间RTT为基础来确定重传超时时间。其中最常用的是设置重传超时时间为往返时间RTT的两倍,即重传超时时间= 2* RTT

Tahoe算法的不足之处在于,收到3个重复ACK或在超时的情况下,Tahoe设置cwnd为1,然后进入慢启动阶段,大大降低了网络的利用率。
而Reno算法针对上述问题进行了改进:
1)对于收到连续3个重复的ACK确认,算法不经过慢启动阶段,而直接进入拥塞避免阶段;
2)增加了快速重传和快速恢复机制

所谓的快速重传就是说如果发送方接收到3个以上的重复ACK,TCP就认为发生了网络拥塞(有报文丢失),需要重传。此时不需要等到重传定时器超时,所以称之为快速重传,而在快速重传后没有使用慢启动算法,而是直接进入拥塞避免算法(将慢开始门限值(ssthresh)和cwnd 调整为此时cwnd的一半),所以这又叫做快速恢复算法。

在这里插入图片描述

其他拥塞控制算法

除了上述基于超时/丢包的拥塞控制,TCP还有很多不同维度的拥塞控制算法

比如:
基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如Reno、Cubic等。
基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如Vegas、FastTCP等。
基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如BBR。
基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如Remy。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号