TCP协议的拥塞控制
一、引言
在某一段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,进而避免网络中的路由器或链路负载过多。
此时发送方需要维护一个叫做拥塞窗口( cwnd )的状态变量,来决定发送方可以同时发送多少数据包。数据包的数量多与少,将决定网络中产生拥塞的可能性大与小。
二、TCP协议的拥塞控制
TCP来进行拥塞控制的四个算法:
慢开始:慢开始就是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因此先探测一下,由小到大逐渐增大拥塞窗口数值。发送的最初执行慢开始,令cwnd = 1,发送方只能发送1个报文段;当收到确认后,将cwnd加倍,因此之后发送方能够发送的报文段数量为:2、4、8...
拥塞避免:慢开始每轮都会使拥塞窗口加倍,因此会增加网络拥塞的可能,在这会设置一个慢开始门限ssthresh,当拥塞窗口大于等于门限值,进入拥塞避免,每轮次拥塞窗口加1
快重传:在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
快恢复:当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口cwnd现在不设置为1。而是将cwnd当前值减半作为新的慢开始门限「ssthresh值,并让cwnd的值等于这个新的慢开始门限ssthresh值。随后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。这便是快恢复算法。
三、小结
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度 。
拥塞控制整体大致流程如下:
- 在 TCP 连接建立完毕后,会先使用慢开始算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。
- 当拥塞窗口达到慢启动门限 ssthresh时,会使用“拥塞避免算法”,线性逐渐增大拥塞窗口。(+1 +1 +1…)
- 当发生超时重传或快速重传时:发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢开始算法;发生快重传,使用快恢复算法,然后进入拥塞避免阶段。