TCP的拥塞控制

拥塞窗口(cwnd)与慢启动门限(ssthresh)

拥塞窗口用来标记当前网络最大能够承受的的数据包数量。它会随着时间变化随时尝试增加,以达到最大化利用网络带宽的目的。

慢启动门限用来标记拥塞窗口从指数级增长到线性增长的拐点,并且慢启动门限由拥塞窗口的值设置,一般发生拥塞的时候,被设置成发生拥塞的时候拥塞窗口大小的一半。这个值的默认值是65535。

拥塞避免、慢启动、快重传、快恢复

慢启动:拥塞窗口从1增长的过程被叫做慢启动。这发生在连接建立之初,或者由于丢包造成的拥塞避免阶段。

快重传:接收端连续发送3次ack就默认这个包丢失,重新发送数据包而不是等待超时之后再发送。快重传的时候有如下操作:

  // 连续三次接收端发送同一个ACK,这个包在路上走的有点久
  ssthresh = cwnd / 2;
  cwnd = ssthrest;

快恢复:快恢复和快重传差不太多,只是增加了收到更多ACK,和收到更新ACK的时候的操作

  // 收到三次ACK
  ssthresh = cwnd / 2 + 3;
  cwnd = ssthresh;
  resend(missAckPackage);  // 重新发送收到三次ack所对应的包

  // 收到第四次ACK
  cwnd = 1;

  // 收到更新的ACK(说明重传的包已经收到了)
  cwnd = ssthresh;

主要是名字起得不好,才不好记住:

  1. 慢启动一点都不慢,是指数级增长。
  2. 拥塞窗口在描述中一点都不像窗口,反倒是慢启动门限更有窗口的感觉。
  3. 快重传是Tahoe版方案,快恢复则是Reno版TCP拥塞算法方案,基本都用快恢复的算法,因为更加合理。

常规拥塞算法会产生一些问题,主要原因是,标准TCP拥塞算法假设网络中的丢包都是由于拥塞导致的,并且错误丢包率是发送窗口的平方反比。但是这两个假设在当前网络环境当中都有可能是不满足的。

  • 首先,移动互联网的使用越来越多,无线局域网丢包的可能性很高,并不一定是由于拥塞导致。
  • 其次,随着宽带互联网的服务范围增加,长肥管道(延迟高宽带大的网络)也越来越多,在这些网络当中,标准TCP会收敛到一个很小的发送窗口,造成客户端和服务器都有大带宽,但是下载速度却很慢的窘境。
  • 最后,标准TCP倾向于填满buffer,填满buffer之后导致的丢包,标准TCP也按照发生拥塞丢包进行计算。

实际上,使用带宽和延迟的乘积作为发送窗口大小,才是BBR算法采用的方式。但是带宽和延迟是无法同时测量的,因为带宽填满的时候,延迟肯定会会由于缓冲区内部有数据包,被应用层带走产生一定的延迟,导致测不准。所以TCP BBR算法采用的是,交替测量带宽和延迟,其中测量带宽的时候更多,因为带宽波动相对而言更频繁。

TCP连接测量延迟和普通的ping是不一样的,有tcpping工具可以用于测量tcp的延迟,其实现方式是使用了tcp的timeStamp(时间戳)

具体的BBR算法参见 https://www.zhihu.com/question/53559433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值