TCP中的拥塞控制

TCP中的拥塞控制

我们知道,TCP必须要自己提供拥塞控制,因为IP并不提供拥塞反馈,那么TCP要如何提供拥塞控制,TCP会提供什么样的拥塞控制呢?

首先,提供拥塞控制肯定跟发送速率有关,因此我们可以提出下面三个问题

  1. TCP发送方如何限制它向其连接的发送速率
  2. TCP如何知道感知沿着该路径由拥塞
  3. TCP发送方应该采用何种算法来改变发送速率

第一个问题,TCP发送方会维护一个叫做拥塞窗口(cwnd)的值,则TCP的发送方中已发送但未被确认的数据应满足

LastByteSent - LastByteAcked <= min(cwnd, rwnd)

因此,假设TCP的接收缓存无穷大,那么发送方的发送速率就取决于拥塞窗口cwnd的值了,发送速率大约未cwnd/RTT

第二个问题,TCP如何感知拥塞?

当发送方出现超时事件或者收到三个冗余的ACK时,发送方就认为在链路上出现了拥塞

最后一个问题,发送方应该采用何种算法来改变发送速率?

首先,我们需要知道的是,什么情况出现时,我们需要改变TCP发送方的发送速率

  1. 收到一个分组的确认ACK,因为我们一开始并不知道应该将速率设置为多少,因此当我们收到一个分组的确认ACK时,是不是可以理解为现在链路容量是比较充裕的,所以这个时候我们可以适当的加大速率
  2. 超时事件和丢包事件出现,当出现这些事件时,说明出现了拥塞,这时候我们就要降低发送速率

因此,我们可以得到该算法的一个基本思想,当收到ACK时,就增大速率,当出现超时和丢包事件时,就降低速率

首先,我们将收到ACK就增大速率的过程称为慢增长


慢增长

我们先将拥塞窗口初始化为一个MMU,也就是链路最小传输单元,然后发送分组,当收到一个分组的ACK时,我们就将拥塞窗口增大一个MSS,注意,是收到一个分组就增大一个MSS,所以慢增长的过程实际上是一个指数增长的过程

慢增长后肯定会出现阻塞,因为速率不可能无限的增长,当出现由超时引起的丢包事件后,TCP发送方将cwnd置为1个MSS并重新开始慢启动,然后将慢启动阈值ssthresh设为cwnd/2,这个阈值的作用是什么呢?

首先,我们知道,这个阈值是出现拥塞后cwnd的一半,所以该值其实是一个预警,如果cwnd等于该阈值后,再继续慢增长可能还会出现拥塞,因此,在这个时候,慢增长就转换到拥塞避免模式


拥塞避免

为什么发送方要从慢启动转换到拥塞避免?因为慢启动再指数增长可能会出现拥塞,但也不能就将速率固定为阈值,因此需要一种比较平缓的增长,线性增长,线性增长就是TCP发送方每经过一个RTT,就将速率增加一个MSS,实现的方法就是每收到一个分组的ACK,就增加MSS/cwnd速率,最后总的一个RTT就是一个MSS,因此,我们知道,拥塞避免模式是一个线性增长的过程,那线性增长也同样会出现拥塞,这时候拥塞避免模式要进行什么样的处理?

如果是由超时事件引起的拥塞,那么拥塞避免的处理方式和慢增长相同,将速率置为一个MSS,并重新开始慢增长,同时将阈值ssthresh设为cwnd的一半

如果是三个冗余ACK引起丢包问题,这时候拥塞避免模式将cwnd置为原来的一半加上收到的三个冗余ACK带来的三个MSS,也就是cwnd/2+3,然后拥塞避免模式转换为快速恢复模式


快速恢复

在快速恢复模式中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值都增加一个MSS,最终,当对丢失报文段的最后一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态

当出现超时事件时,快速恢复的行为跟慢启动一样

当出现三个冗余ACK引起的丢包问题时,cwnd被置为1个MSS.并且ssthresh被置为cwnd的一半


快速恢复是可选的,也就是TCP可以选择有快速恢复模式或者无快速恢复模式

TCP Tahoe是无快速恢复模式的一个早期TCP版本

TCP Reno是有快速恢复模式的一个较新的TCP版本

下图显示出两者的拥塞窗口变化

在这里插入图片描述


其实,从Reno算法中,如果不考虑慢增长的过程,其cwnd窗口的变化是一个锯齿型的,也就是线性增长然后出现拥塞,一下掉到原来的一半,然后再线性增长,所以是加性增、乘性减


公平性

我们前面讨论的都是单条TCP连接的情况,当有多条TCP连接时,因为它们的cwnd变化可能是不一样的,这意味着它们的发送速率也不相同,但是它们对链路的共享是公平的吗?

实际上是公平的

看下图:

在这里插入图片描述

要让两条连接对链路的共享公平,则它们的吞吐量应该在相等带宽份额这条曲线上,假如现在连接1和连接2的吞吐量位置在A处,则有以下过程

  1. A->B->C过程,在该过程中,由于带宽利用率还未完,这时连接1和连接2的吞吐量都会增长,增长到超出带宽利用率时(也就是B位置时),出现丢包事件,根据丢包事件的处理,这时它们的速率会变为原来的一半(也就是C位置)
  2. C->D->…过程,同上

这就是减半的作用所在,因为当两个值差距较大时,会因为都减半而使差距减小,然后又经过线性增长,不断的减少差距,最后趋于相等,因此多条连接对链路的共享实际上是公平的


公平性和UDP

我们知道,UDP并不提供拥塞控制,因此它的速率是恒定的,而TCP提供拥塞控制,所以它会适当的调整速率,这意味着,UDP可能会抢占TCP的带宽资源

参考:

《计算机自顶向下方法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值