TCP拥塞控制

一、TCP拥塞控制原理

TCP的一个关键部分就是其拥塞控制机制。TCP必须使用端到端拥塞控制而不是使用网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。
TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。那么是如何限制的呢?主要通过拥塞窗口(cwnd)。运行在发送方的TCP拥塞控制机制对拥塞窗口进行跟踪,这个拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制。限制公式如下:
LastByteSent-LastByteAcked<=min{cwnd,rwnd}
LastByteSent:发送的最后一个数据
LastByteAcked:收到确认信息的最后一个数据
LastByteSent-LastByteAcked:可以理解为主机发送到连接中但未被确认的数据量。
cwnd:拥塞窗口
rwnd:接收窗口
公式含义为:在一个发送方中未被确认的数据量不会超过拥塞窗口与接收窗口的最小值。
为了与流量控制形成对比,我们假设TCP接收缓存足够大,这时可以忽略接收窗口的限制,因此这时发送方中未被确认的数据量仅受限于拥塞窗口。
上面的约束限制了发送方中未被确认的数据量,因此间接地限制了发送方的发送速率。大体上,发送速率为:
rate=cwnd/RTT 字节/秒
通过调节cwnd的值,发送方能调整它向连接发送数据的速率。

二、TCP拥塞控制算法

1、TCP感知拥塞的方法

TCP发送方是如何感知在它与目的地之间的路径上出现了拥塞呢?我们将丢包事件定义为发送方出现超时或者收到来自接收方的3个冗余ACK。TCP发送方在丢包事件发生后会降低发送速率。
当感知到拥塞后使用TCP拥塞控制算法来调整发送速率,该算法分为慢启动、拥塞避免和快速恢复三个部分。
这里要注意理解不同的丢包事件,当出现3个重复的ACK导致丢包时表明网络还具有一些数据段的能力;在三个重复的确认之前超时导致的丢包是”更加严重的警告“。

2、慢启动

当一条TCP连接开始时,cwnd的值通常初始置为一个最大报文长度(MSS)的较小值。因此,在慢启动状态,cwnd=1MSS。
例如MSS=500字节且RTT=200ms,那么初始速率为20kbps。
由于对TCP发送方而言,有效带宽将远大于初始发送速率(MSS/RTT),因此TCP发送方希望尽快达到期待的速率然后将以2的指数方式增加速率,直到产生丢包事件,或者达到某个阈值。
在这里插入图片描述
如上图所示,TCP向网络发送第一个报文段并等待一个确认。当该确认到达时,TCP发送方将拥塞控制窗口增加一个MSS,并发送出两个最大长度的报文段。这两个报文段被确认,则发送方对每个确认报文段将拥塞窗口增加一个MSS,使得拥塞窗口变为4个MSS,并这样下去。这一个过程每过一个RTT,发送速率就翻番。因此,TCP发送速率起始慢,但在慢启动阶段以指数增长。
慢启动结束方式有如下几种:
(1)如果存在一个由超时指示的丢包事件即出现拥塞,TCP发送方将cwnd设置为1并重新开始慢启动过程,并且将慢启动阈值置为cwnd值的一半,窗口开始指数增长。
(2)因为当检测到拥塞时阈值设为拥塞窗口的一半,重新开始慢启动,这时当cwnd的值等于阈值时结束慢启动并且TCP转移到拥塞避免模式,这时窗口开始线性增长。
(3)如果检测到3个冗余的ACK,这时TCP执行一种快速重传并进入快速恢复状态,窗口线性增长。

3、拥塞避免

一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,即距离拥塞并不遥远。因此,TCP无法每过一个RTT再将拥塞窗口的值翻番。而是采取了一种较为保守的方法,每个RTT只将拥塞窗口的值增加一个MSS。通用增加方法如下:
对于TCP发送方无论何时到达一个新的确认,就将cwnd的值增加一个MSS(MSS/cwnd)字节。
例如MSS是1460字节并且cwnd的值为14600字节,则在一个RTT内发送10个报文段,每个到达ACK(每个报文段一个ACK)增加1/10MSS的拥塞窗口的长度,因此在收到对所有10个报文段的确认后,cwnd的值将增加了一个MSS。
拥塞避免的结束方式有如下几种:
(1)当出现超时导致的丢包事件时,TCP的拥塞避免算法行为相同。与慢启动的情况一样,cwnd的值被设置为1个MSS,阈值被更新为cwnd的一半,窗口指数增长。
(2)当收到3个冗余的ACK导致丢包时:TCP将cwnd值减半,并且将阈值记录为cwnd值的一半加3MSS或直接为1MSS(由不同版本决定),窗口线性增长。接下来进入快速恢复状态。

4、快速恢复

(1)当出现超时导致的丢包事件时,cwnd的值被设置为1个MSS,阈值被更新为cwnd的一半,迁移到慢启动状态,窗口指数增长。
(1)当收到3个冗余的ACK导致丢包时,TCP在降低cwnd后进入拥塞避免状态。
注意,在一种成为TCP Tahoe的TCP早期版本中不管发生超时指示的丢包事件,还是发生3个冗余ACK指示的丢包事件,都无条件地将其拥塞窗口减至一个MSS,并进入慢启动状态。TCP较新版本TCP Reno则综合了快速恢复。
下图为两个版本地拥塞控制窗口地演化情况。
在这里插入图片描述
图中阈值初始为8个MSS。在前8个传输回合,两个版本都采取了相同地动作。拥塞窗口在慢启动阶段以指数速度快速增长,在第4轮传输时达到了阈值,进入拥塞避免状态,然后拥塞窗口以线性速度增长,直到在第8轮传输后出现3个冗余ACK。注意到当该丢包事件发生时,拥塞窗口值为12个MSS,于是阈值被设置为6个MSS。在TCP Reno下拥塞窗口被设置为9MSS,进入到快速恢复状态(注意上图应该是画错了,TCP Reno版本下初始值应该为9,上面的图是6),然后线性增长。在TCP Tahoe下拥塞窗口被设置为1MSS,进入到慢启动状态,然后呈指数增长,直至到达阈值为止,在这个点它开始线性增长。
对于TCP拥塞控制算法的三个过程来说,我们可以简单的概括为:
(1)当cwnd低于阈值,发送方处于慢启动阶段,窗口指数增长。
(2)当cwnd高于阈值,发送方处于拥塞避免阶段,窗口线性增长。
(3)当三个重复的ACK出现时,阈值置为cwnd值的一半,并且cwnd为阈值+3或直接为1(根据不同版本决定)。
(4)当超时发生时,阈值为cwnd值的一半并且cwnd置为1MSS。

5、拥塞控制算法举例

在这里插入图片描述
如上图所示,初始cwnd值为1MSS,慢启动阶段呈指数增长。到达阈值后,进入拥塞避免阶段,cwnd以线性速度增长,当出现网络拥塞时cwnd值为24MSS,阈值置为cwnd的一半即12MSS,将cwnd置为1MSS,进入到慢启动状态。

三、AIMD

我们现在来回顾以下全局,忽略一天连接开始时初始的慢启动阶段,假定丢包由3个冗余的ACK而不是超时所导致,TCP的拥塞控制是:每个RTT内cwnd线性增加1MSS(加性增),然后出现3个冗余ACK事件时cwnd减半(乘性减)。因此,TCP拥塞控制常常被称为加性增、乘性减(AIMD)拥塞控制方式。AIMD拥塞控制方式引发了下图的”锯齿“行为。
在这里插入图片描述

四、TCP平均吞吐量

(1)假设忽略慢启动。
(2)假设在丢失发生时,设W是窗口大小。
如果窗口为W,吞吐量是W/RTT,丢失发生后,窗口降为W/2,吞吐量为W/2RTT。平均吞吐量为0.75/RTT。

五、TCP公平性

在这里插入图片描述
公平目标:如果K个TCP共享带宽为R的瓶颈链路每个应该有R/K的平均速率。
(1)公平性和UDP
多媒体应用常常不用TCP,因为不希望速率被拥塞扼杀,所以用UDP代替TCP:用固定速率发送音/视频,容忍报文丢失。
(2)公平性和并行TCP连接
即使我们能够迫使UDP流量具有公平的行为,但公平性问题仍然没有完全解决。这时因为我们没有什么办法阻止基于TCP的应用使用多个并行连接。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值