目录
一、概述
拥塞:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。
拥塞控制:为了防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载。 拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到 所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且在动态的发生变化,发送方让自己的发送窗口等于拥塞窗口 (假设接受方总是有足够大的缓存空间,因而发送窗口的大小取决于网络的拥塞程度,实际上真正的窗口值 = min(接收方窗口,拥塞窗口)。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以增大一些,以便把更多的分组发送出去。但是只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便环节网络出现的拥塞。
二、拥塞控制的四个算法
TCP通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
1.慢开始
慢开始算法的思路: 当主机开始发送数据时,由于并不清楚网路的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引发网络发生拥塞。所以最好的方法是先探测一下,由小到大逐渐增大发送窗口。
2.拥塞避免
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量,sshthresh的用法如下:
- 当cwnd < ssthresh时,使用慢开始算法。
- 当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1,降低拥塞窗口的增长速度。如果出现了超时,则令 ssthresh = cwnd / 2 ,然后开始执行快恢复。
3.快重传
在接收方,每次接收到报文段都应该对最后一个已收到的有序报文段进行确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
为什么需要快重传:个别报文段会在网络中丢失,但实际上未发生网络拥塞,如果发送方迟迟收不到确认,就会产生超时误认为网络发生拥塞,就导致重新开始了慢开始,因而降低了传输效率。
4.快恢复
快恢复算法:由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1 ,而是将 cwnd 当前值减半作为新的慢开始门限 ssthresh 值,并让 cwnd 的值等于这个新的慢开始门限 ssthresh 值。随后开始执行拥塞避免算法“加法增大”,使拥塞窗口缓慢地线性增大。