Introduction to Computer Networking学习笔记(二十一):拥塞控制-TCP Tahoe

本节对TCP发展历史进行了简短的介绍:

可以看到1986年,由于TCP还未加入拥塞控制,网络开始因为拥塞而频繁出现瘫痪,之后的两年内,Jacobson找到了问题根源,并对拥塞进行了处理,这是非常具有开创性的,而这一个版本的TCP代号为Tahoe。也就是本节重点介绍的内容。

TCP Tahoe中增加了三个重要举措,接下来挨个进行介绍。其实这三个重要举措对应着TCP三个最本质的问题:

  • 什么时候应该发送新数据

  • 什么时候应该数据重传

  • 什么时候接收者应该发送ack

能够解决这三个问题,TCP拥塞问题就会被解决掉。

Congestion window 拥塞窗口(解决什么时候发送新数据的问题)

1. sender window = min( flow window, congestion window)

2. 将拥塞控制分为两种状态:

  • Slow start 慢启动:连接刚刚建立或者packet超时时。

慢启动的实现方式:刚建立连接时,拥塞窗口设置为 1 maximum segment size(MSS 最大分段大小),并发送一个segment;当收到ack时,窗口大小+1,并发送两个包;每收到一个ack再增加1,即两个包的ack都收到时变为4,并发送4个包...如此不断进行下去,可以看到窗口大小是指数增加的。指数增加是很快的,所以看起来慢启动这个称呼很使人迷惑,这是因为跟Tahoe之前的TCP相比,即与将接收端接收窗口大小的数据一股脑一下子全部发送相比还是慢了的。

  • Congestion avoidance 拥塞避免: 稳定传输时,通过AIMD实现。

每个包大小为MSS,拥塞窗口大小除以MSS即为窗口内包的个数(因为窗口大小是以bit为单位的),一次每个ack会使拥塞窗口增加MSS*(MSS/拥塞窗口大小)。那么一个RTT拥塞窗口增加MSS大小,并且是线性增加的。

3. 接下来我们比较关心的是如何在这两种状态之间进行切换,我们依然用有限状态机的概念去解释:

当刚建立连接,处于慢启动状态,此时每接收一个ack,cwnd增加MSS,当cwnd大于ssthresh(slow start threshold慢启动阈值)时进入congestion avoidance状态,使用AIMD策略,即每接收到一个ack,cwnd增加\frac{MSS^{2}}{cwnd},当超时或者接收到3次重复ack(即接收到相同的ack 4次)则跳回慢启动状态,并将ssthresh设置为cwnd/2,cwnd重置为1MSS。实际网络中cwnd变化可能如下图所示,所以可以看到TCP Tahoe并不是完全采用了AIMD策略,而是使用了AIMD的算法思想,慢启动与AIMD相结合。

Timeout estimation 超时预估(解决什么时候数据重传的问题)

由前面慢启动我们知道,当超时时会有拥塞避免状态转换为慢启动状态,因此这个超时时间大小的设置是非常重要的。如果太大了,网络会延迟较高,一直等待ack;如果太小了,就太容易转换到慢启动状态,发送速率降低。因此就有了相对准确的越鼓超时时间的需求。

很容易知道,最佳的超时时间应该设置为比RTT稍微大一点,但是RTT并不是一个常数,而是跟缓冲区排队包的数量有关系的,也就是跟网络的负载有关。在Tahoe之前,TCP持有一个变量r,每收到一个ack都会根据这个包的RTT更新r,也就是说r是数据包指数移动加权平均的一个变量,而超时时间设置为2r。这种方式有什么问题呢:一是当有一个很稳定的网络的时候,比如绝大多数RTT恒定在80-81ms之间,而超时一直为160,那么其实是浪费了一个RTT时间的;二是相反情况下,网络非常不稳定,比如延迟在20-100之间变化,如果计算的2r小于100ms,那么有一些没有丢失的包会进行重传,并进入慢启动状态。

因此Tahoe对此进行了改进。如下图。其中牵扯到多个变量,看似复杂,但其实理解了为什么要这么做也就不难理解了。首先 r 是 RTT estimate,m 是实际测量的 RTT,可以求得估计误差 e = m - r ,此时引入一个经验系数 g ,更新 r = r + g · e ,为了解决上一段所描述的网络状况可能不稳定的情况(也是为了适用不同的网络),计算一个类似于概率统计中方差的值 v ,这个值记录偏差 e 的偏差,每收到一个ack,v 也更新 v = v + g ( |e| - v ) 。最后计算真正的 Timeout = r + βv 。其中 β 也是引入的经验系数,一般取4。

学习了以上理论之后,我们可以看下如下图实际网络中的情况:可以看到在Tahoe之前的TCP中,Timeout与实际RTT之间差值很大,而Tahoe中差值很小,有效改善了RTT Estimation。至此我们解决了什么时候该重传数据的问题。

 

Self-clocking 自计时(解决什么时候接收者发送ack的问题)

发送ack实际上市越迅速越好的,也就是说接收者接收到数据立马返回ack。因此Self-clocking有以下特点:

  • 尽快发送ack,ack是一个重要的信号,告知有数据包离开了网络;
  • 只在有数据包离开网络时(即接收到ack)发送者才放入新数据;
  • 发送者接收到ack,更新自己的 Timeout 。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值