今日刷题总结17
拥塞控制方法
(1)慢开始和拥塞避免
发送方维持一个拥塞窗口cwnd的状态变量,开始时cwnd的大小为一个最大报文段长度MSS。发送方发送完窗口内所有报文段后,每收到一个新的对已发送报文段的确认,就把cwnd增加至多一个MSS。以下说明了慢开始与拥塞避免的原理,其中cwnd的大小用MSS的个数来衡量。
最初发送方设置cwnd=1,发送第一个报文段M1,收到对M1的确认后,cwnd从1增大为2,然后发送方接着发送cwnd中的M2和M3两个报文段,接收方接收后对M2和M3确认。发送方每接收到一个对已发送报文段(不包括重传)的确认,cwnd的大小就会加1。因此,收到对M2和M3的确认后cwnd从2变为4。紧接着又会发送cwnd中的M4~M7这4个报文段。综上可知,在慢开始阶段,每过一个传输轮次,拥塞窗口就要加倍。其中传输轮次是指把拥塞窗口cwnd允许发送的所有报文段都连续发送出去,并收到对所有报文段的确认所经历的时间。
为了防止拥塞窗口增长过大引起网络拥塞,又设置了一个慢开始门限ssthresh状态变量,当cwnd<ssthresh时,继续慢开始算法。当cwnd>ssthresh时,结束慢开始算法,开始拥塞避免算法。当cwnd=ssthresh,可以继续使用慢开始算法或改为拥塞避免算法。在拥塞避免阶段,每经过一个传输轮次就把发送方的拥塞窗口cwnd加1,这种线性增长的增长速率比慢开始阶段的加倍增长慢得多。
不管是在慢开始还是拥塞避免阶段,只要发送方发现网络出现拥塞(即没有按时收到对已发送报文段的确认),就设置慢开始门限ssthresh=cwnd/2(ssthresh≥2),然后重新设置拥塞窗口cwnd=1,并开始执行慢开始算法。如此可以迅速减少主机发送到网络中的分组,使发生拥塞的路由器有足够的时间把队列中积压的分组处理掉。
以下为慢开始和拥塞避免的举例说明:
a)当发送方和接收方之间建立tcp连接后,开始时cwnd=1,ssthresh=16,两个状态变量的大小用MSS的个数来衡量。
b)在慢开始阶段,发送方每接收到对一个报文段的确认,cwnd就要加1,一个传输轮次后cwnd大小加倍。可以看到cwnd的大小按指数规律增长。当cwnd=ssthresh时,进入拥塞避免阶段,cwnd改为线性增长。
c)当cwnd增加到24时,网络发生拥塞。ssthresh被更新为发生拥塞时cwnd大小的一半,即12,然后重置cwnd=1,并执行慢开始算法。当cwnd=ssthresh=12时,改为执行拥塞避免算法。
(2)快重传和快恢复
快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认而不是等到自己要发送数据时才捎带确认。如下图所示,接收方收到M1和M2后后分别发出了确认。现在又收到了M4但是没有收到M3。所以M4是失序报文段。按照快重传算法,接收方应立即发送对M2的重复确认,这样可使发送方及时知道M3没有及时到达接收方。发送方接着发送M5和M6,这两个报文段同样被认为是失序报文段,因此接收方又发送了2个对M2的重复确认。此时发送方已经接收到了3个重复确认,按照快重传算法规定,一旦发送方一连接收到3个重复确认,就必须立即重传对方尚未收到的报文段M3,而不必等待为M3设置的超时计时器到期。
执行完快重传算法后就执行快恢复算法,其过程如下:
a)当发送方一连接收到3个重复确认时,就设置慢开始门限ssthresh=cwnd/2。
b)由于发送方现在认为网络很可能没有发生拥塞(如果发生严重的拥塞,就不会有一连好几个报文段连续到达接收方并导致其连续发送重复确认),因此这里不像慢开始那样设置cwnd=1,而是cwnd=ssthresh,然后执行拥塞避免算法,使得拥塞窗口缓慢地线性增大。
下图为快重传与快恢复(TCP Reno 版本)以及慢开始和拥塞避免(TCP Tahoe 版本)示意图。
(3)发送窗口上限
发送窗口上限=min(rwnd,cwnd)。其中rwnd和cwnd分别为接收窗口和拥塞窗口。
posted on 2017-08-23 16:34 yifangzhuhou 阅读(146) 评论(0) 编辑 收藏 举报