TCP的拥塞控制(Congestion Control)

-- TOC --

当网络拥塞时,TCP能够感知到,并按照协议规则调整发包的频率,避免拥塞继续恶化。网络是个共享空间,TCP的拥塞控制,也是在为此共享空间做贡献,通道畅通,TCP也能顺畅收发。

为了在「发送方」调节所要发送数据的量,有一个叫做拥塞窗口的概念。拥塞窗口cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。没有拥塞,就增大cwnd,有拥塞,就减小cwnd。只要「发送方」没有在规定时间内接收到ACK应答报文,也就是发生了超时重传,就会认为网络出现了拥塞

Standard TCP’s congestion avoidance is based on an algorithm that was designed decades ago. The algorithm starts with the assumption that all loss is a signal of congestion. This assumption oversimplifies what is really happening in the network and forces standard TCP to take the most conservative strategy to deal with packet loss. In reality, most packet losses in today’s networks is not caused by congestion. This is specially true in wireless/mobile networks, where fading channels introduce inevitable packet loss. Standard TCP does not perform well in such environments

慢启动 Slow Start

TCP在刚建立连接完成后,首先是有个慢启动过程,这个慢启动的意思,就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1(表示可以多发一个数据包)。

tcp_manqidong.png

有一个慢启动门限 ssthresh (slow start threshold)状态变量。

拥塞避免(congestion avoidance)

慢启动过程,可发送数据包的数量呈指数增长。当拥塞窗口的大小超过慢启动门限后,这个增加就从指数级降低为线性增长。拥塞窗口还在增长,只是增长速度变慢了。

就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。当触发了重传机制,也就进入了「拥塞发生算法」。

拥塞发生后

有重传就算出现了拥塞。超时重传和快速重传,对应的拥塞发生处理算法略有不同。

当出现超时重传,TCP认为此时拥塞相对严重,此时会降低慢启动门限(ssthresh=cwnd/2),同时将拥塞窗口降为1,重新开启慢启动

slow_start_again.png

一夜回到解放前。

当出现快速重传,TCP认为这种情况的拥塞还不算很严重,因为大部分数据并没丢,只丢了一小部分。此时不会采用重新开始慢启动这样比较激进的方式,而是调整拥塞窗口(减半)和拥塞门限(减半后的拥塞窗口),TCP发送速度还处在线性增长通道上。这也被称为快速恢复

似乎TCP发送速度总是在增长,直到逼近网络出现拥塞的极限,但别忘了,还有流量控制,在限制TCP的发送速度!增长是有上限的。

本文链接:https://cs.pynote.net/net/tcp/202303242/

-- EOF --

-- MORE --