拥塞
当数据从一个大的管道(如一个快速局域网)向一个较小的管道(如一个慢速广域网)发送时便会发生拥塞。当多个输入流到达一个路由器,而路由器的输出流小于这些输入流的总和时也会发生拥塞。如下图示例:
上图展示了一个典型的从大管道向小管道发送报文的情况。路由器R1就是“瓶颈”,是拥塞发生的地方。如果按照局域网的带宽不加控制地尽可能地发送报文,而路由器R1向R2的链路却是一条承载不高的小管道,那么对于路由器R1在这种高流入低流出的情况下,R1的缓存就会很快被用尽,引起路由器丢包。
前文说过出现丢包超时时,TCP规定会重传数据。但是,重传会导致网络的负担更重,导致更大的延迟以及更多的丢包。试想一下,如果一个网络内有成千上万的TCP连接都如此行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。
所以,TCP需要一些措施来减轻或者避免上述情况。TCP不是一个自私的协议,当拥塞发生的时候,要做自我牺牲。就像交通阻塞一样,每个车都应该把路让出来,而不要再去抢路了。
TCP的经典拥塞控制措施主要是下面四个算法,这四个算法的发展经历了很多时间,到今天都还在优化中。分别为:
1988年Tahoe 提出的 1)慢启动,2)拥塞避免,3)拥塞发生时的快速重传
1990年Reno 在Tahoe的基础上增加的 4)快速恢复