众所周知,TCP协议是一种面向连接的、可靠的传输层协议,那么它的可靠性是通过很多功能来实现的,“拥塞控制”就是其中一种功能。
拥塞控制,简单来说,就是控制传输过程中出现的网络拥堵的问题,例如,两台主机在传输数据包的时候,由于发送发一直没有接收到接受方反馈的确认信号,那么发送方就会认为它发送的数据包丢失了,进而会重新传输这个丢失的数据包。如果重新传输发送的数据包数量过多,就会导致网络的拥堵,从而瘫痪。因此,TCP协议增加了“拥塞控制”这个功能,拥塞控制主要是通过慢开始、拥塞避免、快重传、快恢复四个算法来控制避免产生拥塞。
TCP要通过慢开始、拥塞避免、快重传、快恢复四个算法来实现拥塞控制,发送方就必须先维护一个叫做拥塞窗口(cwnd)的状态变量,拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的还是发送方窗口。
首先,我们来说一下这四个算法的功能:
1、慢开始
在这里,有人会想为什么要慢开始呢?为什么不直接发送窗口的最大值呢?其实是因为如果刚开始就立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况,所以就采用了慢开始算法。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。
发送最初执行慢开始,令 cwnd=1
,发送方只能发送 1
个报文段;当收到确认后,将 cwnd加倍,因此之后发送方能够发送的报文段数量为:2
、4
、8
......
当然,我们也不会让cwnd无限增长下去,否则很快就会造成网络拥塞,因此,我们又引入了第二种算法——拥塞避免。
2、拥塞避免
拥塞避免算法就是专门用来控制慢开始导致的 cwnd增长速度过快,从而使得发送方发送的速度增长过快,出现网络拥塞的的问题。拥塞避免的做法是设置一个慢开始门限ssthresh,当cwnd>=ssthresh 时,则进入拥塞避免,每个轮次只将 cwnd加 1,降低拥塞窗口的增长速度。如果出现了超时,则令 ssthresh=
cwnd/2,然后开始执行快恢复算法。
3、快重传
在执行拥塞避免算法时,很有可能会触发重传机制,如果接收方连续三次都给发送方发去了相同的确认号,那么发送方会立即采用快重传算法,重新传输对方尚未收到的报文段。
4、快恢复
当发送方连续三次收到相同的确认时,就会执行“乘法减小”算法,将当前cwnd的值减半作为新的慢开始门限值ssthresh,由于发送方现在认为网络很可能没有发生拥塞,因此不会执行慢开始算法,而是让cwnd的值等于这个新的门限值ssthresh,随后,进入拥塞避免算法,每个轮次只将 cwnd加 1,使拥塞窗口缓慢地线性增大,这就是快恢复算法。
快恢复算法是配合着快重传算法使用的,快恢复算法是相对于慢开始算法而言的。
使用快恢复算法时,cwnd 从较大值开始,通过拥塞避免算法逐渐线性增大,经过较短时间便能恢复到比较快的传输速度;如果使用慢开始算法,cwnd从1开始,需要较长的时间才能达到较快的传输速度,如果每次都用慢开始算法恢复,就会产生一些没必要的性能开销,从而影响传输效率。
TCP要通过慢开始、拥塞避免、快重传、快恢复四个算法来保证网络通畅和传输效率,最终实现拥塞控制。