拥塞控制原理

TCP拥塞控制原理:

TCP使用的是端到端的拥塞控制而不是网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈。

TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度,来限制其能向连接发送流量的速率。

这种方法有三个问题:
  <1>一个TCP发送方是如何限制向连接发送流量的速率?
  <2>一个TCP发送方是如何感知它到目的地之间的路径上存在拥塞的呢?
  <3>当发送方感知网络拥塞时,采用什么算法来改变其发送速率的?


对于问题<1>:

  TCP连接的每一端都由一个接收缓存,一个发送缓存和几个变量(LastByteRead,rwnd等)组成。TCP拥塞控制机制让连接的每一端都记录一个额外的变量,即拥塞窗口。拥塞窗口表示为cwnd,他能限制一个TCP发送方向网络中发送流量的速率。特别是在一个发送方中从未被确认的数据量不会超过cwnd与rwnd中的最小值,即:

LastByteSent-LastByteAcked <= min{congwin, RcvWindow};

上面约束了发送方中未被确认的数量,因此间接地限制了发送方的发送速率。

拥塞窗口(congestion window)指某一源端数据流在一个RTT内可以最多发送的数据包数。发送端根据网络拥塞程度所预设的一个大小值,这个值就是拥塞窗口。

对于问题<2>:

 定义一个TCP发送方的“丢包事件”为:出现超时;收到来自接收方的3个冗余ACK。

当出现过度拥塞时,这条路径上一台(或多台)路由器的缓存会溢出,导致数据报(包含一个TCP报文段)被丢弃。丢弃的数据报会引起发送方的丢失事件(要么超时,要么收到3个冗余ACK),发送方就此认为在源到目的的路径上出现了拥塞指示。

对于问题<3>:

  TCP拥塞控制算法(TCP congestion control algorithm),包含三个部分:1、慢启动(slow start)。2、拥塞避免。3、快速恢复。

1、慢启动(slow start,SS):
当一个TCP连接开始时cwnd的值初始设置为1一个MSS,这就使得初始发送速率大约为:MSS/RTT。

TCP发送方初始阶段不是线性地增加其发送率,而是以指数的速度增加,即每过一个RTT将cwnd值翻倍。TCP发送方继续以指数速度增加其发送速率,这个被称为慢启动(slow start,SS)的初始化阶段。在慢启动阶段,每过一个RTT,cwnd的值将有效地增加一倍。。何时结束这种指数增长呢?(1)发生一个由超时指示的丢包事件(即拥塞),将ssthresh状态变量设为cwnd值的一半,cwnd将设为1个MSS,并重新开始慢启动。(2)当cwnd的值到达或超过ssthresh时,结束慢启动,TCP转移到拥塞避免模式。(3)若检测到3个冗余ACK,TCP执行一种快速重传,并进入快速恢复状态。

为了防止cwnd增长过大引起网络拥塞,还需设置一个慢启动阈值ssthresh状态变量(拥塞窗口的最大值)。ssthresh的用法如下:

cwnd<ssthresh时,使用慢启动算法。

cwnd>ssthresh时,改用拥塞避免算法。

cwnd=ssthresh时,慢启动与拥塞避免算法任意。

  假设client要发送5120字节到server,慢启动过程如下:
  1.初始状态,cwnd=1,seq=1;client发送第一个segment;
  2.server接收到512字节(一个segment),回应ack=513;
  3.client接收ack(513),cwnd=1+1=2;现在可以一次发送2个数据段而不必等待ack
  4.server接收到2个segment,回应ack=513+512*2=1537
  5.client接收ack(1537),cwnd=2+1;一次发送3个数据段
  6.server接收到3个segment,回应2个ack,分别为ack=1537+1024=2561和ack=2561+512=3073
  7.client接收ack(2561)和ack(3073),cwnd=3+2=5;一次可以发送5个数据段,但是只用4个就满足要求了
  8.server接收到4个segment,回应2个ack,分别为4097,5121
  9.已经发送5120字节,任务完成!

2、拥塞避免

当cwnd<ssthresh的时候,tcp处于慢启动状态,否则,进入拥塞避免阶段。

拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1MSS,即TCP发送方每收到一个新的确认ACK,就将cwnd增加一个MSS/cwnd字节,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。

何时结束拥塞避免的线性增长?(1)出现超时,ssthresh被设置为cwnd的一半,cwnd的值被置为1个MSS,进入慢启动。(2)收到3个冗余ACK,ssthresh被设置为cwnd的一半,cwnd为原来的一半加上3个MSS,进入快速恢复状态。

3、快速恢复

在该状态中,(1)对引起TCP进入快速恢复状态的确实报文段,对收到的每个冗余ACK,cwnd增加1个MSS;(2)最终当对丢失的报文段的一个ACK到达时,TCP在降低cwnd(把cwnd设置为第一步中的ssthresh的值)后进入拥塞避免状态。(3)出现超时,ssthresh被设置为cwnd的一半,cwnd设为1个MSS,进入慢启动状态



对超时事件做出反应:

  TCP拥塞控制对因超时而检测到的丢包事件做出的反应与因受到3个冗余ACK而检测到的丢包事件做出的反应是不同的。收到3个冗余ACK后,TCP将拥塞窗口减小一半,然后先行地增长。但是超时事件发生时TCP发送方进入一个慢启动阶段,即他将拥塞窗口设置为1MSS,然后窗口以指数速度增长。拥塞窗口持续以指数速率增长,直到congwin达到超时事件前窗口值的一半为止。

加性增、乘性减additive-increase multiplicative-decrease,AIMD

  TCP拥塞控制的思想:当出现丢包事件时,让发送方降低其发送速率(通过减小拥塞窗口cwnd的大小)。

(因为:通过该相同的拥塞路由器的其他TCP连接也很可能出现丢包事件,所以他们也可能会减小其cwnd的值来降低发送速率,因此该整体作用是让所有通过这一拥塞路由器路径的源降低他们向网络发送数据的速率,从而减轻了拥塞路由器的拥塞程度)

但是当出现丢包事件后,TCP发送方应将其拥塞窗口减少多少呢?
TCP采用一种“乘性减”的方法,即每发生一次丢包事件,就将当前的cwnd值减半。但是不能降低到低于1个MSS。


那么当网络无拥塞的时候,即对前面的还没有确认的数据有ACK到达时,他应该怎样来扩大其发送速率?

   增大发送速率的基本原理是:如果没有检测到拥塞,则可能有可用(未使用的)宽带可被该TCP连接使用。这种情况下TCP缓慢地增加拥塞窗口的长度,谨慎地探测端到端路径上的额外的可用宽带。TCP发送方是这样做的,即每次它接收到一个确认后就把cwnd增大一点,其目标是在每个RTT内cwnd增加一个MSS。
总而言之,当TCP发送方感受到端到端路径无拥塞时就加性地增加其发送速率,当察觉到路径拥塞时(通过丢包事件)就乘性地减小其发送速率,因此被称为加性增、乘性减算法


TCP拥塞控制协议的线性增长阶段被称为避免拥塞(congestion avoidance)。cwnd值重复地经历一种升降循环,即重复地线性增长,然后又突然降至其当前值的一半(当发生丢包事件时),这种循环使得TCP连接的cwnd变化呈锯齿形状。


             




猜你喜欢

转载自blog.csdn.net/qq_22238021/article/details/80345619