TCP 慢启动
拥塞避免 快速回复
快速重传
拥塞控制是一种分布式的用于实现多个竞争数据流共享网络资源的算法。其中拥塞则被定义为由于网络资源过载,从而导致网络用户侧观测到的概率性丢包以及时延的状态,而网络资源过载导致了网络的空间以及时间复用的效用降低。
现行的网络的复杂性是当时的网络设计者始料未及的。在TCP/IP协议数据流传输过程中,有统计显示TCP数据流占据了80%的网络流量,这就导致TCP数据遇到网络数据拥塞则是一个常态。
拥塞发生的主要原因是网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间、链路带宽容量和中间节点的处理能力。由于互联网的设计机制(任何人任何时间都能共享网络资源)导致其缺乏“接纳控制”能力,因此在网络资源不足时不能限制用户数量,只能靠降低服务质量来继续为用户服务,
也就是“尽力而为”服务。
TCP的拥塞退避由4个核心的算法组成:慢启动(slow
start)、拥塞避免(Congestion
voidance)、快速重传(Fast
Retransmit)和快速恢复(Fast
Recovery)。
慢启动
该算法的思想主要一开始发送数据的时候,如果把大量的数据注入到网络,就有可能引起网络拥塞,因为一开始并不知道网络的状况。因此,慢启动算法一开始先探测一下,即先发送大小为
cwnd = 1 的报文(一个报文)到网络中,当收到了对该报文的确认后,就把 cwnd 的值扩大一倍,此时
cwnd 的值就变成 2 了。接下来,再发送大小为 cwnd = 2
的报文(两个报文)到网络中,发送方每收到一个确认(不能计算重传报文的
ack,另外我们把累积确认计算为多个确认),cwnd就扩大一倍。
开始 cwnd(congestion
windows)=1经过1个RTT(循环时间)后,cwnd=1*
2=2经过2个RTT后,
cwnd=2
* 2=4经过3个RTT后,cwnd=4*
2=8如果宽带为W,那么经过RTT
* log2W时间就可以占满带宽。
拥塞避免
如果按上述的慢启动的思想如果不加以控制的话,毫无疑问的发生网络拥塞,当cwnd很快增长上来的时候,也很快利用了网络的资源,但是cwnd不能一直这样增长,一定需要某个限制。TCP使用了一个慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动结束,进入拥塞避免阶段。对于大多数的TCP是吸纳来说,ssthresh的值是65535(同样以16bit来计算)。
拥塞避免的思想就是转指数增大变为加法线性增大。这样就可以避免增长过快导致网路拥塞,慢慢的增加调整到网络的最佳值。具体ssthresh的用法如下:
·当cwnd<ssthresh时,使用慢启动算法。
·当cwnd>ssthresh时,改用拥塞避免算法。
·当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
注意:如果当前的cwnd达到慢启动的阈值,则试探性的发送一个segment,如果服务器没有响应,TCP认为网络能力下降,必须降低慢启动阈值,同时为了避免形式继续恶化,有可能将窗口降低为1.
刚刚上面说了,当 cwnd > ssthresh时,转而执行拥塞避免算法。这时候,TCP
发送 cwnd 个报文后,如果接收到了确认,cwnd
的值只是加 1,而不是加倍。这样,拥塞窗口
cwnd
就会按线性规律缓慢增长。无论是在慢启动阶段,还是在拥塞避免阶段,只要发送方判断网络出现拥塞(依据就是没有按照收到确认),就要把
ssthresh 设置为出现拥塞时的 cwnd
值的一半(注意这只是一种策略,实际实现中不一定是这样的。)。
在更新了 ssthresh 后,tcp
Tahoe版本会同时将
cwnd 重新设置为 1,又开始执行慢启动算法。TCP
Reno版本会执行快速回复算法。

快速重传
RTO(tcp
重传计时器)超时重传会导致TCP传输效率较低。目前Linux
TCP实现是采用ACK或者SACK的机制来实现对数据包进行累积确认,预测数据包丢失,实现快速重传。快速重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置重传计时器时间到期。(实际上,目前Linux的TCP快速重传算法,除了经典的三次ACK,还包括ER、FACK,以及最新的基于时间序的RACK的包丢失快速重传算法,做出了很多改良)。
快速恢复
它是快速重传的后续处理。通常认为客户端接收到3个ACK后,就会开始快速重传,但是如果还有更多的重复ACK呢,这个时候就是快速恢复要做的。
1、当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(也即
cwnd=ssthresh/2).但是接下去并不执行慢开始算法;
2、考虑到此时能连续收到3个ACK,说明网络没有拥塞,可以将cwnd=ssthresh,直接进入拥塞避免算法。
本文详细介绍了TCP拥塞控制机制,包括慢启动、拥塞避免、快速重传和快速恢复等核心算法。解释了如何通过这些算法有效避免网络拥塞,并保持数据传输效率。
727

被折叠的 条评论
为什么被折叠?



