什么是网络拥塞
计算机网络中的资源是有限的,在某段时间对网络中某一资源的需求超过了该资源所能提供的可用部分,而导致网络性能下降的情况就是拥塞。
若是对于TCP
这种有重传机制的传输协议,当发生数据丢失时,重传数据将延长数据到达的时间;同时,高频率的重传,也将导致网络的拥塞得不到缓解。
什么是拥塞控制
拥塞控制,就是在网络中发生拥塞时,减少向网络中发送数据的速度,防止造成恶性循环;同时在网络空闲时,提高发送数据的速度,最大限度地利用网络资源。说的简单点,就和堵车差不多,路就这么宽,来的车多了,自然过的就慢,所以在必要的时候要限号。
TCP的拥塞控制方法
发送速率控制
首先TCP是通过维护一个滑动窗口来控制数据的发送速率的,所有序号位于这个窗口内的数据段都会被一次性发送,而不需要等待之前发送的数据段被确认。而每当最早发送出去的数据段被确认,窗口就会向前移动,直到移动到第一个没有被确认的序号,这时候又会有新的数据段序号被包含在窗口中,然后被发送出去。所以限制数据发送速率最好的方式就是限制窗口的大小。
滑动窗口被称为cwnd
。在TCP
发送端,所有被发送但是还没收到确认的数据段必须落在这个窗口中,所有,当网络拥塞时,TCP程序将减小cwnd
,而网络通畅时,增大cwnd
,以此来控制数据发送的速率。
拥塞控制算法
拥塞控制算法一般包括慢启动算法、拥塞避免算法、快速重传算法、快速恢复算法四部分。
慢启动:
TCP协议是由小到大逐渐增大发送数据的滑动窗口大小
每个传输轮次后将 cwnd 加倍(*2)。
例如:最开始的窗口大小为1,发送一个报文,这个报文收到确认之后,就将窗口大小设置为2;下次再收到2个报文的确认之后,将窗口大小设置为4,以此类推。这个发送报文的数量是指数增长的,指数增长是很快,所以要有所约束避免网络拥塞。在此引入一个慢启动阈值(ssthresh),只要慢启动算法中窗口大小增长到慢启动阈值之后就不再加倍增长进入拥塞避免算法
拥塞避免:
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每次将cwnd 加 1。但是总会达到最大限度,最终会出现超时事件。当出现超时事件时,我们就认为此时网络出现了拥塞了,则令 ssthresh = cwnd / 2
,然后开始执行快恢复。
快重传:
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。然后使用快恢复算法
快恢复:
当发送端收到连续三个重复的确认时,把慢开始门限 ssthresh
减半。由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd
现在不设置为 1 。而是将cwnd
当前值减半作为新的慢开始门限 ssthresh
值,并让cwnd
的值等于这个新的慢开始门限ssthresh
值。随后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。 这便是快恢复算法。