赞
踩
拥塞是指对网络中某一资源的需求超过了该资源所能提供的可用的部分,从而会使网络的负载增大,性能降低。TCP协议主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、块重传、快恢复。
实现
发送方维护了一个叫做拥塞窗口(cwnd)的状态变量,它的大小取决于网络的拥塞程度,并且在动态的发生变化,它只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
TCP 在刚建立连接完成后,首先是有个慢开始的过程,其体现就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢开始算法过程中数据大致传输呈指数性增长。
指数性增长就体现在开始增长速率慢,所以叫慢开始。但指数性增长后期增长速率极快,为防止增长过快引起,有一个状态变量慢启动门限 ssthresh (slow start threshold)控制其何时停止慢开始算法。
当 cwnd < ssthresh 时,使用慢启“开始算法”。
当 cwnd >= ssthresh 时,使用“拥塞避免算法”。
慢开始每个次都将 cwnd
加倍,这样就会让 cwnd增长速度非常快快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就会随之增高。设置一个慢开始门限 ssthresh
,当 cwnd >= ssthresh
时,每个轮次只将 cwnd
加 1,从而降低拥塞窗口的增长速度。如果出现了超时,就让 ssthresh = cwnd / 2
,从这个值开始继续增长;然后开始执行快恢复。
发送方收到三个相同的 ACK 报文时,会在特定的时间间隔过期之前,重传丢失的报文段。
当发生“快速重传”,TCP 认为这种情况不严重,就会启动快恢复算法,ssthresh 和 cwnd 也会发生变化:
cwnd = cwnd/2 ;
ssthresh = cwnd;
进入“快恢复算法”;
经过快重传算法后,cwnd的值已经减半,并且ssthresh的值等于cwnd的值。由于发送方接收到了对方连续三个确认数据包,它认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,拥塞窗口 cwnd
现在不设置为 1 。而是将cwnd
当前值减半作为新的慢开始门限 ssthresh
值,并让cwnd
的值等于这个新的慢开始门限ssthresh
值。随后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大,拥塞控制的过程如图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。