0%

TCP拥塞控制

拥塞概念

  • 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)
  • 若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降
  • 出现拥塞的原因:∑ 对资源需求 > 可用资源,这里的资源包括很多方面,比如路由器的缓存、路由器的处理速度、通信线路的容量等等
  • 拥塞的现象和堵车的现象有点相似,比如出现堵车有一个原因就是道路不够宽,我们红绿灯的交替速度不够快等等诸多方面元素

既然拥塞是因为可用资源不足,那么增加资源是否可以解决拥塞现象?

  • 不可以
  • 这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏
  • 如增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,会进一步的加剧拥塞,解决不了网络拥塞
  • 如果一个路由器没有足够的缓存空间,它就会丢弃一些新到的分组,但当分组被丢弃时,发送这一分组的源点就会重传这一分组,甚至可能还要重传多次。这样会引起更多的分组流入网络和被网络中的路由器丢弃
  • 如提高处理机处理的速率会会将瓶颈转移到其他地方,只提高某一方面是不可能提高整体效率的,那么限制堵车的办法不是多修路,而是限制车到路上

拥塞控制与流量控制的区别:

拥塞控制的一般原理

  • 对理想的拥塞控制在达到资源上限之前,网络的吞吐量是平稳上升的,而达到最高点之后,整个网络的吞吐量可在最高点延续,这个时候哪怕有更多的分组注入网络,也能够以最高的吞吐量进行发送和接收数据
  • 实际的拥塞控制不可能达到理想拥塞控制的效果,随着注入网络的分组增加,吞吐量会逐渐增加,但达不到上限
  • 在设计拥塞算法时,由于拥塞都是动态的,每一时刻的可用资源和需求资源都是动态变化的,所以无法明确的确定一个边界,由于拥塞控制是一个全局问题,而发送方的一点无法获取到全局的网络状况,所以这使得拥塞控制的设计极为复杂

拥塞控制的方法

  • TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法(反馈)
  • TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)
  • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量
  • 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:真正的发送窗口值 = Min {接收方窗口值,拥塞窗口值}

控制拥塞窗口的原则:

  • 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率
  • 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞

拥塞的判断:

  • 重传定时器超时:现在通信线路的传输质量一般都很好,因传输岀差错而丟弃分组的概率是很小的(远小于1%)。只要出现了超时,就可以猜想网络可能出现了拥塞
  • 收到三个相同(重复)的ACK:个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞

TCP拥塞控制算法分为四种,分别用于数据传输的不同阶段:

  1. 慢开始 (slow-start)
  2. 拥塞避免 (congestion avoidance)
  3. 快重传 (fast retransmit)
  4. 快恢复 (fast recovery)

慢开始 (Slow start)

  • 目的:用来确定网络的负载能力或拥塞程度
  • 算法的思路:由小到大逐渐增大拥塞窗口数值
  • 初始拥塞窗口cwnd设置:旧的规定在刚刚开始发送报文段时,先把初始拥塞窗口cwnd设置为1至2个发送方的最大报文段SMSS( Sender Maximum Segment Size)的数值,新的RFC5681把初始拥塞窗口cwnd设置为不超过2至4个SMSS的数值
  • 慢开始门限 ssthresh(状态变量):防止拥塞窗口cwnd增长过大引起网络拥塞,当我们发送的报文段数量达到慢开始门限后,就会从慢开始阶段转换为拥塞避免阶段

慢开始门限 ssthresh 的用法如下:

  • 当 cwnd < ssthresh 时,使用慢开始算法

  • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法

  • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法

  • 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值,拥塞窗口 cwnd 每次的增加量 = min{N, SMSS},即在N和SMSS之中取一个最小值,其中** N 是原先未被确认的,但现在是被刚收到的确认报文段所确认的字节数**,不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理

传输轮次:

  • 使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍

  • 一个传输轮次所经历的时间其实就是往返时间 RTT

  • "传输轮次"更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认

  • 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间

拥塞避免算法

首先要提出一点,拥塞避免算法并不是完全避免拥塞,而是让拥塞来的更慢一些

  • 思路:让拥塞窗口cwnd缓慢地增大,即毎经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长
  • 因此在拥塞避免阶段就有“加法增大”( Additive Increase)的特点。这表明在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥基窗口增长速率缓慢得多

当网络出现拥塞时:

  • 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时)
  • ssthresh = max (cwnd/2,2)
  • cwnd = 1
  • 执行慢开始算法,也就是说当进入了拥塞状态,会重新调整ssthresh和cwnd 大小并重新进入慢开始阶段
  • 目的:迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕

慢开始和拥塞避免算法的实现举例:

  1. 在执行慢开始算法时,拥塞窗口 cwnd=1,发送第一个报文段
  2. 发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横坐标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长
  3. 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(图中的点❶ ,此时拥塞窗口 cwnd = 16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长
  4. 当拥塞窗口 cwnd = 24 时,网络出现了超时(图中的点❷ ),发送方判断为网络拥塞。于是调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段
  5. 按照慢开始算法,发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1 当拥塞窗口 cwnd = ssthresh = 12 时(图中的点❸,这是新的 ssthresh 值),改为执行拥塞避免算法,拥塞窗口按线性规律增大
  6. 当拥塞窗口 cwnd = 16 时(图中的点❹),出现了一个新的情况,就是发送方一连收到 3 个对同一个报文段的重复确认(图中记为 3-ACK)。发送方改为执行快重传和快恢复算法

注意:

"拥塞避免"并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的 "拥塞避免"是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞

快重传算法

  • 快重传和快恢复的目的,是为了防止因为报文段丢失重新进入到慢启动的过程,通过收到3-ACK(接收3次对同一报文的确认)判断
  • 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞
  • 采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失
  • 快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认

  1. 发送方发送M3时传输过程中M3丢失,但是接收方接收到了M4报文段,那么接收方必须对M2进行重复的确认
  2. 当发送方接收到连续3个对M2的确认后,发送方就知道了接收方没有接收到M3,应当立即重传M3,这也就是快重传的由来
  3. 这样也不会出现超时,发送方也不会认为这是网络拥塞

快恢复算法

当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法

  • 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2
  • 新拥塞窗口 cwnd = 慢开始门限 ssthresh
  • 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大

加法增大,乘法减小 (AIMD)

  • 可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大” AI (Additive Increase)
  • 当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD (Multiplicative Decrease)
  • 二者合在一起就是所谓的 AIMD 算法

拥塞控制流程图

发送窗口的上限值

  • 发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:发送窗口的上限值 = Min {rwnd, cwnd}
  • 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
  • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
  • 也就是说,rwnd 和 cwnd 中数值较小的一个,控制了发送方发送数据的速率

文章参考