概述
1.概述
- TCP进行拥塞控制的算法有四种,即
慢开始
、拥塞避免
、快重传
和快恢复
。 - 拥塞控制也叫作
基于窗口
的拥塞控制,为此,发送方维持一个叫做拥塞窗口cwnd(congestion window)
的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且在动态的发生变化,发送方让自己的发送窗口等于拥塞窗口 (注:在这里我们假设接受方总是有足够大的缓存空间,因而发送窗口的大小取决于网络的拥塞程度,实际上真正的窗口值 = min(接收方窗口,拥塞窗口) - 发送方控制
拥塞窗口cwnd
的原则是:只要网络没有出现拥塞,拥塞窗口就可以在增大一些
,以便把更多的分组发送出去。但是只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便环节网络出现的拥塞。 - 发送方又是如何知道网络中出现了拥塞呢? 我们知道,当网络中出现了拥塞时,路由器就要丢弃分组,
因此只要发送方没有及时收到应当到达的确认报文,也就是说只要出现了超时
,就可以猜想网络可能出现了拥塞,(现在通信线路的传输质量一般都很好,因传输出差错而丢弃的概率是很小的(远小于1%)) 因此,判断网络拥塞的依据就是出现了超时
。
下面,我们将讨论拥塞窗口cwnd的大小是怎样变化的
2.慢开始
慢开始算法的思路: 当主机开始发送数据时,由于并不清楚网路的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引发网络发生拥塞。所以最好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到达逐渐增大拥塞窗口值
。
下面的例子说明慢开始算法的原理,(请注意:虽然实际上TCP是用字节数作为窗口大小的单位,但这为了方便期间,使用报文段的个数作为窗口大小的单位,这样可以使用较小的单位来阐述拥塞控制的原理)
慢开始过程
一开始发送方先设置cwnd=1,发送第一个报文段M1。发送方收到对M1的确认后,把cwnd从1 增大到2
,于是发送方接着发送M2和M3两个报文段。发送方每收到一个新报文段的确认 (重传的不算在内) 就使发送方的拥塞窗口加1,因此发送方在收到两个确认后,cwnd就从2增大到4,并可发送M4~M7共4个报文段。因此使用慢开始算法后,每经过一个传输轮次(transmission round),拥塞窗口cwnd就加倍
(1 -> 2 -> 4 -> 8 -> n)
注意:上图只是为了说明慢开始的原理,在TCP的实际运行中,发送方只要收到对一个新报文段的确认,其拥塞窗口cwnd就立即+1,并可以立即发送新的报文段,而不需要等到这个轮次中所有的确认都收到后(如上图)在发送新的报文段。
3.拥塞避免
为了防止拥塞窗口cwnd增长过大引起网络拥塞
,还需要设置一个慢开始门限ssthresh状态变量,sshthresh的用法如下。
- 当cwnd < ssthresh时,使用上述的
慢开始
算法。 - 当cwnd > ssthresh时,
停止使用慢开始算法而改用拥塞避免算法
。 - 当cwnd = ssthresh时,
既可使用慢开始算法,也可使用拥塞避免算法
。
拥塞避免算法
让拥塞窗口cwnd缓慢的增大,每经过一个往返时间RTT就把发送方的拥塞窗口+1
,而不是像慢开始那样成倍的增加
。即加法增大
流程图示
(无3ACK情况出现,关于3ACK见快重传与快恢复)
- 假设初始ssthresh为16,现在开始执行
慢开始
, - 当到
cwnd = 16
时,改为拥塞避免算法
,即加法增大 - 假设当
cwnd = 24
时,出现了网络拥塞,那么执行ssthresh乘法减小
,即ssthresh = cwnd / 2 = 12
, - 重新开始执行
慢开始(cwnd = 1)
,然后cwnd = 12时开始执行拥塞避免
。。。
4.快重传与快恢复
为什么需要快重传
有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞
,如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞
,就导致了上图中重新开始了慢开始,将拥塞窗口cwnd又设置为1,因而降低了传输效率。
快重传执行流程
采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失
。- 快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,
而是要立即发送确认
,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
。
如下图所示,接收方收到了M1和M2后都分别及时发出了确认。现假定接收方没有收到M3但却收到了M4。本来接收方可以什么都不做。但按照快重传算法,接收方必须立即发送对M2的重复确认,以便让发送方尽早知道接收方没有收到报文段M3
。发送方接着发送M5和M6.接收方收到后也仍要再次分别发出对M2的重复确认。
快重传算法规定,发送方只要一连收到3个重复确认,就知道接收方确实没有收到报文段M3,因而应该立即进行重传(即“快重传”)
,这样就不会出现超时 (如果没有快重传,只要发生超时就执行门限ssthresh / 2,然后慢开始) ,发送方也不就会误认为出现了网络拥塞。使用快重传可以使整个网络的吞吐量提高约20%。
快恢复执行过程
- 因此,在下图中的点④,发送方知道现在只是丢失了个别的报文段,于是不启动
慢开始
,而是执行快恢复
算法 - 调整门限值
ssthresh = cwnd / 2 = 16 / 2 = 8,
同时设置cwnd = ssthresh = 8
,开始拥塞避免算法(注意是拥塞避免,非慢开始)。
5.流程图总结
本文参考计算机网络第七版(谢希仁)
最后
以上就是标致咖啡豆为你收集整理的详解TCP拥塞控制(计网)的全部内容,希望文章能够帮你解决详解TCP拥塞控制(计网)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复