计算机网络中的资源是有限的,在某段时间对网络中某一资源的需求超过了该资源所能提供的可用部分,而导致网络性能下降的情况就是拥塞。
通俗点说就是发送的数据包太多网络中的设备处理不过来,而导致网络性能下降的情况。
拥塞控制和流量控制的区别在于:
- 流量控制考虑点对点的通信量的控制,主要是通过窗口来进行通信量的限制,考虑到接收方可能的接收性能不如发送方的发送量
- 拥塞控制考虑整个网络,是全局性的考虑,会感知网络是否发生拥塞,以及处理拥塞
如何判断拥塞?如果发送的报文超时则认为是拥塞
拥塞会导致丢包,但丢包不一定触发拥塞。拥塞控制是快速传输的基础。
一个拥塞控制算法一般包括慢启动算法、拥塞避免算法、快速重传算法、快速恢复算法四部分。
慢启动算法:
由小到大逐渐增大发送数据的窗口大小
每个传输轮次后将 cwnd(窗口大小) 加倍。
例如:最开始的窗口大小为1,发送一个报文,这个报文收到确认之后,就将窗口大小加倍,设置为2;下次再收到2个报文的确认之后,将窗口大小设置为4;
发送报文的数量是指数增长的,指数增长的速率非常快,如果不加以控制,很快就会增长到引起网络瘫痪的程度了。
慢启动算法里会有一个慢启动阈值(ssthresh),只要慢启动算法中窗口大小增长到慢启动阈值之后就不再增长,接着会进入拥塞避免算法
拥塞避免算法:
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1。
虽然是一个一个增长,但是总会达到最大限度,最终会出现超时事件。当出现超时事件时,我们就认为此时网络出现了拥塞了,不能再继续增长了。这里用MAX来表示最大值。接着就会进入快重传阶段
快重传:
当到达最大值之后就会从最初的状态(慢启动算法)从新开始,即从1,2,4…开始,同时会把慢启动阈值ssthresh调为MAX值的一半。
快恢复:
超时事件可能并不是出现了网络拥塞,有可能是因为某个数据包出现了丢失或者损害了,导致了这个数据包超时事件发生了
快恢复可以使得接收机接收到一个不按顺序的数据段时,会立即给发送机发送一个重复确认;如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,此时不用等待设置的计时器到期,而是立即重传这些丢失的数据段,并同时把ssthresh = MAX/2,窗口的大小从ssthresh开始再一个一个涨,并不是从1开始涨。