TCP 的拥塞控制

前言

之前提到了TCP的流量控制,我们知道了发送方与接收方两点之间如何控制通信的流量。流量控制有助于防止 A发送的数据超过了B的缓冲区。但是网络环境中,发送方和接收方中间可能要经过很多的路由器等复杂的环境,并不是简简单单的两点通信。网络中的带宽的数据又很复杂, 所以呀引进了网络堵塞的概念,然后TCP又要防止在网络中堵塞,所以引进了拥塞控制的概念。

拥塞

计算机网络中有许多帮助连接的资源(链路容量(带宽)、交换节点中的缓存、交换机)等。 每个通信都要消耗一部分资源,当对某个资源的需求量大于提供量时,网络就会发生堵塞,也就是网络性能变坏
在这里插入图片描述
拥塞控制 就是防止堵塞网络而设计的。但是网络如此复杂,我们怎么知道发生了堵塞呢? 堵塞时,网络条件恶化,势必发生丢包重传等问题,当重传发生时,我们认为发生了堵塞,并且做出处理。

如果从大方向来看如何对待堵塞,可以分为 开环控制和闭环控制两方面。
1、开环控制:事先考虑到所有因素,设计好系统运行后不再调整
2、闭环控制:系统运行有堵塞发生则定位发生地点并解决

今天我们讨论的是TCP的堵塞控制,更具体的介绍。

TCP的拥塞控制方法

主要有四种

  • 慢开始(slow-start)
  • 拥塞避免(congestion avoidance)
  • 快重传(fast retransmit)
  • 快恢复(fast recovery)

慢开始

发送方维护一个叫做拥塞窗口(congestion window)的状态变量。随着网络拥塞的程度进行动态变化。这里要分清,之前流量控制时的窗口有发送窗口(swnd) 和接收窗口(rwnd),发送窗口近似于接收窗口。但是!! 有了拥塞窗口后,此时的发送窗口就变为:

swnd = min (rwnd , cwnd)

拥塞窗口怎么控制呢? 两种情况。

  • 网络无堵塞,增大
  • 网络堵塞,减小

如何判断是否堵塞就是上面说的是否有超时现象发生。

慢开始原理如图
在这里插入图片描述

为了防止cwnd增长过快阻塞网络,还要设置一个慢开始门槛(ssthresh)状态变量,慢开始门限ssthresh用法如下:

  • cwnd < ssthresh 时,使用慢开始算法
  • cwnd > ssthresh 时, 改用拥塞避免算法
  • swnd = ssthresh 时,都能用

拥塞避免算法

上面提到cwnd大于ssthresh时就使用拥塞避免算法。拥塞避免就是cwnd线性增长的算法,每收到一个确认报文cwnd就+1 。

我们来看下面这个例子。
在这里插入图片描述
初始化使 cwnd = 1,主要关注图中五个记号处发生了什么。
(1)记号1之前一直在慢启动,到达记号1时 cwnd = ssthresh
(2)记号1到记号2改用拥塞避免算法
(3)记号2处遇到了超时,说明网络堵塞,此时调整ssthresh = cwnd/2
(4)cwnd回到1 重新慢开始,经历慢启动和拥塞避免
(5)记号4时连续收到3个同样的ACK,下面会涉及到快重传的知识
(6)记号5时涉及快恢复的知识

快重传

上述连续三个 ACK情况可以解释为:发送方发送的报文丢失,因此接收方连续发送了三个对上个报文的ACK给发送方。
下面是快重传示意图
在这里插入图片描述
快重传就是为了让发送方知道是自己的报文丢失了,并不是网络堵塞,就不必重新使 cwnd 回到 1 然后开启慢启动。

快恢复

既然 cwnd 不回到 1,就需要快恢复算法。
如上面例子的记号5处,重新设 ssthresh = cwnd/2 ,以及将 cwnd 设为 ssthresh 。
也有的实现是 cwnd = ssthresh + 3 MSS(最大报文段长度) ,因为接收方传了 3 个 ACK,说明这三个分组在对方缓存中 。

整体归纳一下,流程如下图
在这里插入图片描述

小片尾(主动队列管理AQM)

这是网络层的策略,主要发生在路由器。
为了避免 全局同步 现象,当路由器等待队列数达到某个数值时,主动放弃尾部数据,提醒发送方降低发送速度。

参考书籍
《计算机网络》 谢希仁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值