传输层 TCP 拥塞控制 慢开始、拥塞避免、快重传、快恢复

通信两端的TCP协议在发数据包的时候要感受网络是否畅通,如果网络出现了阻塞,出现了丢包现象,他们会自动的降低发送速度,如果网络畅通了会提高发送速度。

拥塞是一个动态的,比如上下班会出现堵车现象,是大家的车都往路上跑引起的阻塞。

左边的计算机和右边的计算机都要进行通信,通信的流量都过这一条链路,链路的带宽都是有限的,比如1G,千兆带宽,从一边涌入了700M的带宽,从另外一边涌入了600M带宽,都要过这1000M的链路,超过了最大值,肯定有部分数据包就丢掉了。

如果出现丢包了,还是什么都不管,该怎么发怎么发,发了200个,丢了100个再重发100个 ,发的多也没用,还是得重发,干脆大家发慢点,发了100个丢了50个,那么下次发10个,发10个再丢发5个,再不行发1个,收到确认了再发。这样就将速度降下来了,不连着发。这个就是拥塞控制,拥塞避免。

上面可以看到吞吐量就是过链路的流量,吞吐量是两个方向的,两个方向加到一块叫做吞吐量。

最开始发多少,吞吐量就是多少,随着负载增加,这个时候就会出现丢包,之后负载增加就引起轻度阻塞了,还接着往里面增加流量,这个时候丢包就比较严重了,丢了上面-下面的这么多包,吞吐量增加,可能1个包都过不来了,死机了。

随着你往网络当中输入的负载增加, 链路上的吞吐量没有增加,反而降低,这种情况就是拥塞,我们要避免出现这种情况,把拥塞控制在轻度拥塞。

拥塞控制方法 慢开始和拥塞避免


因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)、拥塞避免(Congestion Avoidance)、快重传(Fast Restransmit)和快回复(Fast Recovery),我们假定: 数据单方向传送,另外一个方向只传送确认。 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

慢开始


在通信的时候,b计算机,会告诉a计算机接受窗口是多大,最大的MSS是多少,也就是最大的段是多少,虽然告诉它了,接受窗口是3000,它也不会将发送窗口设置为3000,因为在a这端还有拥塞窗口,一开始发送窗口等于拥塞窗口,拥塞窗口先发一个段,因为a也不知道网络状态怎么样,先发一个试试看,发送一个包收到确认了,一看网络状态还可以,它将发送窗口变为2了,下次发的时候连续发两个段,之后就是2倍数的增加发送速度。

拥塞窗口是2倍的增加,拥塞窗口等于滑动窗口。直到增加到b计算机告诉给她的发送窗口大小。

a发送窗口受到两个控制,一个是拥塞窗口控制还有一个是b计算机的接受窗口控制,它求得哪个窗口最小,就使用哪个窗口作为发送窗口。

可见a的发送窗口是受拥塞窗口控制的。先发1个,然后2 4 8直到和接受窗口一样大。

拥塞避免


左边是拥塞窗口,单位是字节,一个报文段还是按照100个字节来算,慢开始从1开始,先发一个看看是否能够收到,可以看到拥塞窗口都是以倍数增长的,窗口到达1600个字节之后,下一轮不是以指数增长了,而是加1线性增长,到了12轮次的时候出现了网络拥塞丢包了,这个时候慢开始门限除以2变为了1200,它的拥塞窗口从1开始了,1200到达慢开始门限了,然后就+1。

每次增加,开始丢包,慢开始门限开始调整,然后又从1 2 4 8这样开始,这叫做慢开始,这样就可以避免网络的拥塞。

快重传和快恢复


发数据的时候发m1 m2 m3,发现m3丢了,等到超时之后重传,这样的话效率不高,这边没有到立刻发3个重复的确认,告诉对端该发第三个了,这边就不等着超时了,立刻发,立刻将段发过来了。

快重传也就是发现对端发现数据包没有按照顺序到达,发现有丢包就连续发3个包,对这个包确认,另外一边发现有3个,相当于加急,就立刻发丢了包,就不需要等到超时了。 

 快恢复算法而不是慢开始算法

前面和之前一样,慢开始门限了就+1,发现丢包了之后将慢开始门限除2,这就是新的慢开始门限,这个时候就不从1开始了,从新的满开始门限开始了。这就叫做快恢复,不是从下面开始了。

如果到达4000开始丢包,那么就将慢开始门限调整为2000,然后再增加,以此类推。 

 上面可以看到TCP协议可以感知网络情况,自动的调整发送速度。

发送窗口的上限


发送窗口的上限收到两个因素的控制,一个cwnd拥塞窗口,rwnd接受窗口,选取最小值。

如果把本节所讨论的拥塞控制和接收方对发送方的流量控制一起考虑,那么很显然,发送方的窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,也就是说: 发送方窗口的上限值 = Min [rwnd,cwnd] 当rwnd<cwnd时,是接收方的接收能力限制发送方窗口的最大值。 反之,当cwnd<rwnd时,则是网络的拥塞限制发送方窗口的最大值。 也就是说,rwnd和cwnd中较小的一个控制发送方发送数据的速率。

抓包来观察一下,出错之后是不是快恢复,连续发三个确认。

发了三个重复的确认,该给我发28678了, 

快重传来了,这就是演示了丢包之后的快重传。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值