TCP拥塞控制

1、TCP拥塞控制的意义

早期开发的TCP在启动一个连接的时会向网络发送大量数据包,可能会导致路由器或链路负载过量,产生网络拥塞,使得TCP连接的吞吐量急剧下降。由于TCP源端无法知道网络资源当前的使用情况,因此新建立的TCP连接不能一开始就发送大量数据,只能逐步增加每次发送的数据量,以避免上述现象的发生。

网络提供的资源包括缓存空间、链路带宽容量和中间节点的处理能力,由于互联网的设计机制导致其缺乏“接纳控制”能力,因此在网络资源不足时不能限制用户数量,而只能靠降低服务质量来继续为用户服务也就是“尽力而为”的服务。拥塞其实是一个动态的问题,我们没办法用一个静态的方案去解决,从这个意义上来说,拥塞是不可避免的。

2、TCP拥塞控制算法

慢启动、拥塞避免、快速重传和快速恢复

1)慢启动

当新建立TCP连接时,拥塞窗口cwnd初始化为1,表示一个数据包大小,源端按cwnd发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量,这样在一个RTT内,cwnd就会增加一倍,即cwnd会随着RTT(传输轮次)呈指数增长。

2)拥塞避免

如果安装慢启动的过程一直增大cwnd,肯定会出现网络拥塞的情况,因此设置了慢启动阈值ssthresh(slow start thresh),当cwnd达到ssthresh时,就会进入拥塞避免阶段。在此阶段中,发送方每收到一个ACK确认,cwnd就增加1/cwnd,那么在RTT内,就会增加1,cwnd随着RTT呈线性增长。

如果出现了由超时指示的丢包事件,就将ssthresh更新为cwnd的1/2,并且cwnd重置为1,开始慢启动过程。这样做可以迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间将队列中挤压的分组处理完毕,缓解网络拥塞。

TCP拥塞控制

3)快速重传和快速恢复

当发送方收到3个或者3个以上的重复ACK确认时,说明有可能有数据包丢失,于是需要立刻重传该丢失的数据包,这就是快速重传。更新ssthresh为当前cwnd的1/2,然后将cwnd变为原来的1/2,开始拥塞避免阶段,即随着RTT呈线性增长,这个过程就是快速恢复阶段。

TCP拥塞控制

3、算法总结

1)当TCP建立新连接时,发送方将cwnd初始化为1,每收到一个ACK确认,cwnd增加1,即随着RTT呈指数增长,这是慢启动过程。当cwnd=ssthresh,就进入拥塞避免阶段,每收到一个ACK确认,cwnd增加1/cwnd,随着RTT呈线性增长,如果出现超时导致的丢包现象,就更新ssthresh为cwnd的1/2,cwnd重置为1,开始慢启动过程。

2)当采用快速重传机制时,当发送方收到连续的3个或3个以上的ACK确认,就认为该数据包可能丢失,就立刻重传该数据包,并且更新ssthresh为cwnd的1/2,cwnd减半,进入拥塞避免阶段。

4、为什么收到3个ACK之后进入拥塞避免,而不是慢启动?

如果收到3个ACK确认,代表可能存在数据包丢失,需要立刻重传,并且只有对方收到了数据包才会发送ACK,因此整个过程中,收发双方一直在进行数据传输,如果进入慢启动阶段,会减小数据流,影响数据传输,而进入拥塞避免可以缓解该情况。

5、基础知识

拥塞:对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

流量控制:指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。

参考:https://www.cnblogs.com/losbyday/p/5847041.html

https://blog.csdn.net/zxx910509/article/details/51321266