您的位置:首页 > 理论基础 > 计算机网络

TCP之拥塞处理详解

2016-08-15 09:55 239 查看


什么是拥塞控制

   网络拥塞现象是指到达通信网络中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。

    拥塞控制是一种用来调整传输控制协议(TCP)连接上单次发送的分组数量的算法,通过增减单次发送量逐步调整,使之逼近当前网络的承载量。如果单次发送量为1,此协议就退化为停等协议。单次发送量是以字节来做单位的;但是如果假设TCP每次传输都是按照最大报文段(MSS)来发送数据的,那么也可以把数据包个数当作单次发送量的单位,所以有时我们说单次发送量增加1也就是增加相当于1个最大报文段的字节数。


拥塞控制的算法

   拥塞控制假设分组的丢失都是由网络繁忙造成的。拥塞控制有三种动作,分别对应到源主机感受到的情况:

收到一条新确认。表明当前的单次发送量小于网络的承载量。此时可以增加单次发送量。若当前单次发送量小于慢启动阈值(ssthreash),则单次发送量加倍(乘以2),即指数增长;否则单次发送量加1,即线性增长。

收到三条对同一分组的确认,即三条重复的确认。说明网络有一点儿繁忙。此时单次发送量减半,慢启动阈值(ssthreash)约等于单次发送量,进入线性增长阶段。

对某一个分组的确认迟迟未到,即超时。说明网络比上一情况中的更加繁忙。此时慢启动阈值=单次发送量÷2,单次发送量=1,进入慢启动阶段(指数增长阶段)。


拥塞控制的四个阶段


慢启动

   慢启动,是传输控制协议(TCP)使用的一种阻塞控制机制。慢启动也叫做指数增长期。 慢启动算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。

   慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。算法描述如下:

当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。

每收到一个ACK,拥塞窗口就翻倍(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。这是一种指数增长的关系。

发送方取拥塞窗口与通告窗口中的最小值作为发送上限。


拥塞避免

   慢启动算法是在一个连接上发起数据流的方法,其指数级增长很快就会使网络出现拥塞现象,因为某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。拥塞避免算法是一种处理丢失分组的方法。有两种分组丢失的指示:发生超时和接收到重复的确认。发生超时,指源主机在超时定时器溢出时没有收到目的主机对某一分组的ACK;接收到重复确认,指在源主机的超时定时器溢出前,连续收到3个或3个以上收对某一分组的ACK。

   当发现超时或接收到3次重复确认时,则表示有丢包事件,此时网络已发生拥塞现象,要进行相应的拥塞控制。算法描述如下:

将慢启动阈值(ssthreash)设置为当前窗口的一半(cwnd 和通告窗口大小的最小值,但最小为2个报文)。

如果是超时引起的拥塞,则拥塞窗口(cwmd)被置为1,进入慢启动过程。如果是重复确认引起的拥塞,则进入快速重传和快速恢复过程。

进入慢启动阶段后,拥塞窗口会指数级增长,如果拥塞窗口大于慢启动阈值(ssthreash),执行拥塞避免算法。执行拥塞避免算法时,由于慢启动阈值(ssthreash)已经存在,拥塞窗口大小不再翻倍增长,而是线性增加。

   拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。1990年出现的TCPReno版本增加了 “快速重传”算法、”快速恢复”算法,避免了当网络拥塞不够严重时采用”慢启动”算法而造成过大地减小发送窗口尺寸的现象。


快速重传

   目的主机在收到一个失序的报文段时,会立即产生一个ACK(重复的ACK),这个重复的ACK不应该被延迟,目的在于让源主机知道目的主机收到了一个失序的报文段,并告诉源主机自己希望收到的序号。

   由于我们不知道一个重复的ACK是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的ACK到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只可能产生1到2个重复的ACK。如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了,进入快速重传过程,描述如下:

将慢启动阈值(ssthreash)设置为当前拥塞窗口(cwnd)的一半,设置拥塞窗口(cwnd)为慢启动阈值(ssthreash)加上3倍的报文段大小。重传丢失的数据报文段,而无需等待超时定时器溢出。

每次收到另一个重复的ACK时,cwnd增加一个报文段大小并发送1个分组(如果新的cwnd允许发送)。收到另一个重复的ACK,说明网络中传输的一个分组到达了目的主机,网络中可再容纳一个分组,故cwnd增加一个报文段大小并发送一个分组。


快速恢复

   丢失的分组通过快速重传过程发送完,并被目的主机接受后,目的主机就不再发送重复的ACK通知源主机发送丢失的分组了,而是发送确认新数据的ACK通知源主机发送新的分组。这个ACK应该是在进行重传后的一个往返时间内对重传分组的确认,也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。此时为了快速的恢复到较高的传输速度,就会进入快速恢复阶段,算法描述如下:
当确认新数据的ACK到达时,设置拥塞窗口(cwnd)为慢启动阈值(ssthreash)(快速重传时步骤1中设置的值),进入拥塞避免过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  拥塞控制 TCP