计算机网络——拥塞控制

拥塞控制和流量控制虽然采取的动作相似,但拥塞控制与网络的拥堵情况相关联,而流量控制与接收方的缓存状态相关联

一、为何要进行拥塞控制?

为了方便,我们假设主机A和主机B传输数据。

我们知道,两台主机在传输数据包的时候,如果发送方迟迟没有收到接收方的反馈的ACK,那么发送方就会认为它发送的数据包丢失了,进而会重新传输这个丢失的数据包。

先说说什么是ACK:
ACK:全称为Acknowledge character,即为确认字符,表示接收到的字符无误。

接收站对所受到的报文进行检查,若未发现错误,便向发送站发出确认回答ACK,表示信息已被正确接收,并准备好接受下一份报文。该控制字符可由中心结点发送,也可由远地结点发送。

其格式取决于采取的网络协议,当发送方接收到ACK信号时,就可以发送下一个数据。如果发送方没有收到信号,那么发送方可能会重新发当前的数据包,也可能停止传送数据。

TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表示确认信号有效,0表示报文不含确认信息,忽略确认号字段。

然而实际情况有可能此时有太多主机正在使用信道资源,导致网络拥塞了,而A发送的数据包也被堵在了半路,迟迟没有到达B。这个时候A误认为发生了丢包情况,会重新传输这个数据包。

结果是不仅仅浪费了信道资源,还会使网络更加拥塞。因此,我们需要进行拥塞控制


二、如何知道网络的拥塞情况

A与B建立连接之后,就可以向B发送数据了,然而这个时候A并不知道此时的网络情况如何,也就是说,A不知道一次性连续发送几个数据包好,我们也把A一次性连续发送多少个数据包称之为拥塞窗口,用N表示此时的拥塞窗口的大小。

为了探测网络的拥塞情况,我们可以采取以下两种策略

1、先发送一个数据包试探下,如果该数据包没有发生超时事件(也就是没有丢包)。那么下次发送时就发送2个,如果还是没有发生超时事件,下次就发送3个,以此类推:即N = 1,2,3,4,5…

在这里插入图片描述
2、一个一个增加实在是太慢了,所以可以刚开始发送1个,如果没有发生超时间,就发送2个,如果还没有发生超时事件,就发送4个,接着8个
在这里插入图片描述
无论是第一种方法还是第二种方法,最终都会出现瓶颈期。不过这里值得注意的是,第一种情况增长速率确实有点慢,但是第二种以指数型增长,增长速度太快了,可能一下子达到了瓶颈期。

为了解决太快或者太慢的问题,我们可以把第一种方法和第二种方法结合起来。也就是说,我们刚开始可以以指数的速度增长,增长到某一个值的时候,我们就把这个值称之为阈值,用变量ssthresh代替。当增长到阈值时,我们就不再以指数增长了,而是一个个线性增长。

所以最终的策略是:前期指数增长,到达阈值之后,就以一个一个线性的速度来增长。

在这里插入图片描述
我们也把指数增长称之为慢启动,线性增长阶段称之为拥塞避免


三、到了瓶颈值之后怎么办?

无论是指数增长还是一个个增长,最终肯定会出现超时事件,总不可能无限增长吧。当出现超时事件时,我们就认为此时网络出现了拥塞,不能再继续增长了。我们就把这个时候的N的值称之为瓶颈值,用max代替,即为最大值。

当达到了最大值MAX之后,我们该怎么办?

当达到了最大值的时候,我们采取的策略是:
我们就回到最初的状态,也就是从1,2,4,8…开始,不过这个时候我们会把ssthresh调小,调为MAX值的一半,即ssthresh = MAX / 2
在这里插入图片描述
图中的阈值为8,瓶颈值为14;超时事件发生后,阈值为14/2=7


四、超时事件就一定是网络拥塞吗?

超时事件发送就一定是网络拥塞吗?其实也有可能不是出现了网络拥塞,有可能就是因为某个数据包出现了丢失或者损害了,导致了这个数据包超时事件发生了。

为了防止这种情况发生,我们通过冗余ACK来处理的。我们都知道,数据包是有序号的,如果A给B发送M1,M2,M3,M4,M5…N个数据包,如果B收到了M1,M2,M4…却始终没有收到M3,这个时候就会重复M2,意在告诉A,M3还没有收到,可能就是丢失。
在这里插入图片描述
当A连续收到了三个确认的M2的ACK,且M3的超时事件没有发生。A就知道M3可能丢失了,这个时候A就不必等待M3设置的计时器到期了,而是快速重传M3.并且把ssthresh设置为MAX的一半,即ssthresh = MAX/2,但是这个时候并非把控制窗口N设置为1,而是让N = ssthresh,N在一个一个增长。

在这里插入图片描述
我们把这种情况称之为快速恢复。而这种具有快速恢复的TCP版本称之为TCP Reno

还有另外一种TCP版本,无论收到三个相同的ACK还是超时事件,都把拥塞窗口设置为1,从最初状态开始,这种版本的TCP我们称之为TCP Tahoe

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值