拥塞控制是TCP传输中很重要的一环,TCP拥塞控制使用一个拥塞窗口以及拥塞策略来进行拥塞控制。在前面的流量控制中提到发送端的发送窗口取决于接收窗口,实际上,发送方的窗口大小是接收窗口与拥塞窗口中的较小值。拥塞窗口的大小又取决于网络的拥塞状况。而具体确定拥塞窗口大小则需要拥塞策略来决定。
拥塞策略包括慢开始
、拥塞避免
、拥塞检测
。TCP的一般是从一个比较小的传输速率开始,然后迅速增大到阈值,到达阈值后以一个比较小的速率继续传输,如果传输过程中遇到了网络拥塞就执行拥塞避免或者拥塞检测算法传输数据,直到网络恢复正常。
慢开始算法
TCP从一个MSS(最大报文长度)报文开始,每次收到接收端的一个ACK后,就在原来MSS的基础上增加一个MSS(拥塞窗口cwnd变为2),这样当返回一个ACK的时候变为2个MSS长度的报文了,这两个报文发送出去后如果再收到一个ACK,每个MSS报文又变为2个MSS的报文(拥塞窗口cwnd变为4)。所以经过两次确认后,发送端可发送的报文为4个。以此类推,可以发现,可发送报文的长度是按照指数增长的。
拥塞避免
拥塞避免是一种按照加法增大的算法,如果一直采用慢开始算法,那么很快就会到达阈值,为了在网络发生拥塞之前避免它,可以采用加法增大的算法,即每次cwnd只在原来的基础增加1,直到网络发生拥塞为止。
拥塞检测
既然叫检测,那么就是要让发送方知道网络发生了拥塞,那么如何让发送方知道网络发生了拥塞呢?TCP中使用重传机制让发送方知道网络发生了拥塞。而在TCP中发生重传有两种情况:RTO超时或者发送方连续收到三个重复的ACK确认。不管哪种情况,在拥塞检测算法中,当传输速率到达ssthresh阈值的时候,都会把阈值较小为原来的一半,所以也叫乘法减小算法。
对于RTO超时,可以认为有比较大可能网络发生了拥塞,所以早RTO超时的情况下,TCP采用的策略如下:
- ssthresh减小为原来的一半
- 把cwnd重新设为一个报文段大小
- 执行慢开始算法
对于收到三次重复的ACK确认,TCP认为发生拥塞的可能性不是特别大,于是采用如下策略:
- ssthresh减小为原来的一半
- 把cwnd的值设为ssthresh的值
- 执行拥塞避免算法
拥塞控制小结
由于刚开始不清楚网络的拥塞情况,所以会首先采用慢开始算法,开始阶段,窗口大小由1指数增大,直到窗口大小到达门限值。窗口大小到达门限值后,就开始执行拥塞避免算法,之后窗口值按照线性规律增大,直到出现超时或者到达最大的窗口大小值。这个时候,会开始执行拥塞拥塞算法,也就是把门限值变为窗口大小的一半,之后继续执行拥塞避免算法,窗口大小按照线性规律增大。