TCP的拥塞控制
TCP的拥塞控制与流量控制不同,前者是全局性的控制,而后者是针对点对点通信量的控制。
网络上有很多计算机,可能当前的网络状态已经比较拥堵了。此时贸然发送大量数据,会造成大量丢包。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
TCP的拥塞控制便是用于防止网络出现拥塞的。
TCP的拥塞判断
TCP的判断网络是否发生拥塞有两种方法:
1、是否发生超时 如果过了超时重传时间发送方仍未收到确认报文,那么TCP就会认为当前网络已经发生拥塞。采用慢开始算法进行处理。
2、收到连续3个重复的ACK报文 如果发送方收到了连续3个重复的ACK报文,那么TCP也会认为当前网络发生了拥塞。采用快恢复算法进行处理。
TCP拥塞控制的方法
TCP的拥塞控制方法一共有4种:
1、慢开始 2、拥塞避免 3、快重传 4、快恢复
基于窗口的拥塞控制
拥塞窗口
TCP连接中发送方会维护一个叫拥塞窗口(cwnd)的状态变量。
拥塞窗口的大小取决于网络的拥塞程度,并动态地变化着,发送方会使自己的发送窗口等于拥塞窗口。
慢开始
慢开始算法的思路是先发送少量数据探探路,然后慢慢地增大拥塞窗口的大小。
假如拥塞窗口cwnd初始值为1,之后每收到1个ACK,拥塞窗口+1。
慢启动只是初始时发送速度慢,但实际上慢启动的数据发送速度增长是非常地快的。
在慢启动算法中,每经过一个传播轮次,拥塞窗口就会加倍。
为了不让拥塞窗口增长过快,TCP引入了慢启动门限(ssthresh),当拥塞窗口大小超过这个门限时,就不再按慢开始的算法增大拥塞窗口的大小了,而是改用拥塞避免算法。
拥塞避免
每经过一个往返时间RTT,就把发送方的拥塞窗口+1。
即拥塞窗口按线性规律缓慢增大,这要比慢开始算法的拥塞窗口增长速率缓慢很多。
快重传
快重传算法可以让发送方尽早知道发生了个别数据段的丢失。
按照快重传算法,假如接收方收到了M1数据段和M2数据段,然后没有收到M3数据段就收到了M4数据段,那么接收方会重复发送M2确认报文,提醒发送方M3数据段已丢失。
在快重传算法中,发送方一旦收到连续3个重复的确认报文,就会立即重新发送丢失数据段。
快恢复
当发送方连续收到3个重复的确认报文时,发送方就知道当前发生了个别数据段的丢失,但网络很可能还没有发生拥塞,若采用慢开始算法速率下降过于严重,因此采用快恢复算法以缓解当前网络状态。
快恢复算法具体流程: 1、慢开始门限值改为当前拥塞窗口/2。
2、新拥塞窗口=慢开始门限。
3、开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
TCP拥塞控制总体流程图
TCP拥塞控制综合例子
下图是非常经典的TCP拥塞控制例子,运用到了4种拥塞控制算法,可以说掌握了下图,就基本掌握了TCP的4种拥塞控制方法。 一开始时,TCP采用慢开始算法逐渐增大拥塞窗口的大小。
到第1个点时,拥塞窗口达到慢开始门限值,开始采用拥塞避免算法继续增大拥塞窗口的大小。
到第2个点时,发生了超时,此时TCP认为网络已经发生了拥塞,开始采用慢开始算法重新缓慢增大拥塞窗口。
到第3个点时,拥塞窗口达到慢开始门限值,开始采用拥塞避免算法继续增大拥塞窗口的大小。
到第4个点时,发送方收到了连续3个重复的ACK确认报文,TCP采用快恢复算法进行处理。
|