TCP
拥塞控制四个主要过程:
慢启动和拥塞避免
慢启动阶段:早期开发的
TCP应用在启动一个连接时会向网络中发送大量的数据包,这样很容易导致路由器缓存空间耗尽,网络发生拥塞,使得TCP连接的吞吐量急剧下降。由于TCP源端无法知道网络资源当前的利用状况,因此新建立的
TCP连接不能一开始就发送大量数据,而只能逐步增加每次发送的数据量,以避免上述现象的发生。具体地说,当建立新的TCP连接时,拥塞窗口(congestion
大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量,这样cwnd就
将随着回路响应时间(Round
2.
拥塞避免阶段:如果TCP源端发现超时或收到3个相同ACK副本时,即认为网络发生了拥塞(主要因为由传输引起的数据包损坏和丢失的概率很小(<<1%))。此时就进入拥塞避免阶段。慢启动阈值(ssthresh
)被设置为当前拥塞窗口大小的一半;如果超时,拥塞窗口被置1。如果cwnd>ssthresh,TCP就执行拥塞避免算法,此时,cwnd在每次收到一个ACK时只增加1/cwnd个数据包,这样,在一个RTT内,cwnd将增加1
,所以在拥塞避免阶段,cwnd不是呈指数增长,而是线性增长。
3.
快速重传和快速恢复阶段:快速重传是当
TCP源端收到到三个相同的ACK副本时,即认为有数据包丢失,则源端重传丢失的数据包,而不必等待
RTO超时。同时将ssthresh设置为当前cwnd值的一半,并且将cwnd减为原先的一半。快速恢复是基于
“管道”模型(pipe
即同一时刻在网络中传输的数据包数量是恒定的,只有当旧”数据包离开网络后,才能发送
“新”数据包进入网络。如果发送方收到一个重复的ACK,则认为已经有一个数据包离开了网络,
于是将拥塞窗口加1。如果“数据包守恒”原则能够得到严格遵守,那么网络中将很少会发生拥塞;本质上,拥塞控制的目的就是找到违反该原则的地方并进行修正。
经过十多年的发展,目前TCP协议主要包含有四个版本:
TCP
”算法。TCP
它避免了之前版本的TCP重传一个窗口内所有数据包的情况,包括那些已经被接收端正确接收的数据包,而只是重传那些被丢弃的数据包。