TCP拥塞控制的概念是:每个源端判断当前网络中有多少可用容量,从而知道它可以安全完成传送的分组数。拥塞控制解释防止过多的数据注入网络,避免网络中间设备(路由器、交换机等)过载而发生拥塞。拥塞控制是一个全局性的过程,与流量控制不同,流量控制仅指点对点通信量的控制。
TCP拥塞控制机制包括慢启动、拥塞避免、快重传、快恢复、RED等。
慢启动又称慢开始。发送方维持的拥塞窗口是一个状态变量,网络拥塞程度动态决定cwnd(congestion windows)的值(网络出现拥塞,则cwnd值会调小些;反之则调大些),发送方的发送窗口等于拥塞窗口,考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。
慢启动的策略是:主机一开始发送大量数据,有可能引发网络拥塞,因此较好的方法是先探测一下,由小到大逐步增加拥塞窗口cwnd的大小。通常,在刚开始发送报文段时,可将cwnd设置为一个最大报文段MSS的数值。而在每收到一个对新报文段的确认后,将拥塞窗口增加至多一个报文(严格来说是增加一个MSS大小的字节)。这种方式下,cwnd的值是逐步增加的,下图描述了慢启动的过程:
具体过程如下:
第一步:发送方设置cwnd=1,并发送报文段M1,接收方接收后确认M1;
第二步:依据慢启动算法,发送方每收到一个新的报文确认(不计重传),则cwnd加1。所以发送方接收M1确认后,cwnd由1变为2,并发送报文段M2和M3。接收方接收后发回对M2和M3的确认;
第三步:发送方接收M2和M3的确认后,cwnd由2变为4,并可以发送报文段M4~M7。由此可见,每经过1轮(就是一个往返时间RTT),cwnd值翻倍。
慢启动的“慢”是指初始值小,但其cwnd是成倍增加的。由于cwnd倍增速度过快,因此需要使用一个慢启动门限ssthresh状态变量限制cwnd倍增。
(1)当cwnd (2)当cwnd>ssthresh时,改用拥塞避免算法。拥塞避免算法就是每经过1轮(1个往返时间RTT),cwnd值加1,而不是倍增; (3)当cwnd=ssthresh时,可任选慢启动与拥塞避免算法。 下图为慢启动与拥塞避免示例,描述了控制cwnd的增长、设定sshresh阈值的过程和策略: (1)TCP连接初始化,cwnd设为1。设置cwnd增长的阈值ssthresh=16; (2)当cwnd (3)当cwnd=ssthresh=16时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长; (4)当cwnd=24时,突遇网络拥塞,出现超时。设置拥塞窗口cwnd=1,增长的阈值ssthresh=12(执行"乘法减少”,即出现超时的拥塞窗口值24的一半),并开始执行多轮慢启动算法; (5)当cwnd=ssthresh=12时,执行拥塞避免算法。拥塞窗口cwnd值呈线性增长。 快重传额快恢复是TCP拥塞控制机制中,为进一步提高网络性能而设置的两个算法。 快重传规定:(1)接收方在收到一个失序的报文段后立即发出重复确认,该目的是使发送方及早知道有报文段没有到达对方;(2)发送方只要收到三个连续重复确认,就应当立即重传对方尚未收到的报文段,而无须等待设置的重传计时器的时间到期。 快重传如下所示: 图中,接收方没有收到M3而接收到了M4,出现了失序,因此重复发送三个M2确认;发送方接收到三个确认后,立刻重传报文M3。 快恢复算法是与快重传算法搭配使用的算法。快恢复算法的要点为:当发送方连续收到三个重复的报文段确认时,慢启动阈值ssthresh减半,但之后并不执行慢启动算法,而是执行拥塞避免算法(拥塞窗口cwnd值呈线性增加)。执行过程如下所示: 快重传后使用快恢复的方式为“TCP Reno版本”;而快重传后使用慢启动的方式为“TCP Tahoe版本”,现已废弃不用。 另一种TCP拥塞控制的方法是预防性分组丢弃,即检测到网络拥塞的早起征兆时(路由器的平均队列长度超过了一定的门限值),就用一定的概率丢弃个别分组,从而避免网络全局拥塞,改进网络的性能。 早期路由器采用尾部丢弃策略,但是会出现连个问题:(1)丢失分组必须重传,增加网络负担,导致TCP传输延时明显;(2)全局同步现象。路由器的丢弃数据行为导致发送方吹安超时重传,TCP进入慢启动状态,这样一段时间内,网络通信量急剧下降;又因为许多TCP连接在大约同一时刻进入慢启动,它们将在大约同一时刻脱离慢启动,而这将引起网络通信量的急剧上升。这种情况陈伟TCP的“全局同步”。 为了避免出现”全局同步“现象,路由器采用随机早期检测(Random Early Detection,RED)算法。路由器在输出缓存完全装满之前,就随机丢弃一个或多个分组,避免发生全局性拥塞的现象,使得拥塞控制只是在个别的TCP连接上进行。RED算法中,路由器的队列维持两个参数,即队列长度最小门限和最大门限。RED对每一个到达的数据报都先计算平均队列长度: (1)若<,则将新到达的数据报放入队列进行排队; (2) 若>,则将新到达的数据报丢弃; (3)若<<,则按照某一概率P,将新到达的数据报丢弃。 TCP可靠的一个保证机制就是超时重传,而超时重传的核心是重传超时时间的计算。计算超时重传时间的参数如下: (1)往返时间(Round Trip Time,RTT):发送端发送一个数据包给对端,然后接收端返回一个ACK。发送端计算出这个包来回所需的时间就是RTT。 RTT=链路层的传播时间+端点协议栈的处理时间+中间设备的处理时间 RTT的前两个部分值相对固定,而中间设备处理时间会随着网络拥塞程度的变化而变化,所以RTT的变化在一定程度上反应了网络的拥塞程度。 (2)加权平均往返时间(Smoothed RTT,RTTS):又称平滑往返时间,该时间是通过多次RTT的杨根本多次测量的结果。 RTTS的初始值=计算出来的第一个RTT RTTS的计算公式如下: 新的RTTS=(1-)*(旧的RTTS)+*(新的RTT样本) 根据RFC推荐,值为1/8,这样计算的RTTS更加平滑。 (3)重传超时时间(Retransmission TimeOut,RTO):基于RTT计算出的一个定时器超时时间。RTO的作用是:没发送一个TCP报文段,就开启一个重传计时器。当计时器超时,还没有收到接收方的确认,就重传该报文段。RTO的计算公式为: RTO=RTTS+4*RTTD 式中:RTTD的初始值=1/2*RTT样本值。 RTTD的计算公式为: 新的RTTD=(1-)*(旧的RTTD)+*|RTTS-新的RTT样本| 根据RFC推荐,值为1/4。 2、快重传与快恢复
3、随机早期检测RED
4、TCP协议的重传时间