拥塞控制原理

698 阅读5分钟

非常感谢中科大-郑烇老师的细心讲解,这边先粗略将老师讲授的内容做了一个记录,后面有时间进行详细的整理

名次解释:

RTT:(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。一般认为单向时延=传输时延t1+传播时延t2+排队时延t3

RTO:Retransmition Time Out 重传超时时间

SS:slow start 慢启动

CA:congestion avoid 冲突避免

FR:快速恢复

RACK:Recovery ACK

探知可用带宽的一种方式(阶梯式,波浪式):

反复拥塞降低窗口,带宽利用率不高。拥塞避免是探知网络可用带宽的一种方式。

image-20210924171149540

1. Tahoa

  • 慢启动(指数增大)

  • 拥塞避免(下一次指数增大超过阈值,从阈值开始加法增大)

    • 出现三个冗余ACK(中间缺少某个ack,但是收到了后面三个ack)
    • 出现超时重传

    快速重传丢失数据包 并进入慢启动阶段

  • 阈值减少到当前cw的一半,从1mss开始继续慢启动

注:Tahoa算法的问题是,三个冗余ack超时重传的处理方式是一样的,但是出现三个冗余ACK并不代表网络出现很大的网络拥塞,网络还有一定的通信能力,因为还能收到冗余ack,直接从1mss开始慢启动,似乎惩罚过于严重

所以Reno算法在此基础上进行了改进,引入了快速恢复阶段。

image-20210924164636760

2. Reno

  • 慢启动
  • 拥塞避免
    • 出现三个冗余ACK(中间缺少某个ack,但是收到了后面三个ack) ,进入快速恢复阶段
    • 出现超时重传,进入慢启动状态
  • 快速恢复阶段
    • 快速恢复阶段,在ss和ca阶段出现三个冗余ack时都会进入
    • 在快速恢复阶段出现了超时重传的情况,转换进入ss慢启动阶段
    • 在快速恢复阶段收到了新的ack后,进入ca拥塞避免阶段
image-20210924170635793

注意:Reno算法适合单个段丢失,如果多个段连续丢失,因为只收到了一个冗余确认,并没有收到下一个丢失的确认就进入拥塞避免阶段,很容易由于超时重传再次进入慢启动阶段。

所以New Reno在快速恢复阶段做了改进,加入了多个冗余ack的快速重传

3. New Reno

image-20210924172255972

​ RACK 是指:当所有 拥塞时候的段 都得到确认后才能够叫做RACK

image-20210924173611345

基于延迟的拥塞控制:Vegas

解决痛点:reno不敏感,调整粗暴(造成网络震荡,网络带宽利用率不高)

image-20210924174153133

Vegas使用延迟的变化(细颗粒度,先超时,后三个冗余ack)来感知网络中的拥塞,可以更早感知,调节窗口的方式也更加的温和。

RTO:Retransmition Time Out 超时重传事件

​ 是基于500ms计时颗粒度(粗粒度)计算的,平均往返时间,加上四倍的标准差就是超时时间。Reno先收到三个冗余ack,后超时。

image-20210924175024551

减少1/8,波动性不大。

image-20210926103419537

BaseRTT 维护的是最小RTT,

image-20210926103843249

image-20210926104450137

image-20210926104537275

如果是协同的话,抢不到太多的带宽(调整温和),敏感且懂礼貌的人容易吃亏。

SACK

针对New Reno算法在连续段丢失情况下,一个RTT只能恢复一个丢失段效率不高的问题提出改进。 发送方收到SACK知道接收方收到段的情况,通过选项知道接收方缺失的段。将这些段维持在scoreboard中,只要pipe小于cwnd,发送方就可以先发计分板中的丢失段;在发送完毕老的丢失段后,pipe如仍小于cwnd,发送方发送新段,每发送一个段,pipe+1。 发送方收到确认 从pipe当中减去1或者2,将管道中丢失的走出去的段从pipe中减去。 将(pipe小于cwnd)发送条件和发什么解耦。

image-20210926120127425

image-20210926120225622

image-20210926120341047

image-20210926120623926

image-20210926120846176

image-20210926120908382

image-20210926121101049

CUBIC算法(CA阶段使用立方体的方式,之前加法增大过于保守)

image-20210926105156819

image-20210926105346520

image-20210926111456099

image-20210926111144414

BBR拥塞控制算法

解决痛点:

image-20210924211622228

image-20210924211750288

BBR是基于模型的。把其他主机对的通信看成是带宽的变化和往返延迟的变化。

往返延迟RTT * 瓶颈链路的带宽 = BDP

1. 通信模型(拥塞变化的点)

image-20210924211822079

  • 瓶颈链路的带宽

image-20210924212125980

  • 往返延迟

image-20210924212408248

排队会造成排队延迟,增加延迟。

BBR思路:摸清瓶颈链路,摸清往返延迟,算出带宽延迟级,

​ 使得发送速率不要超过瓶颈流量带宽,

​ inflight的不要超过带宽延迟积

由于主机对会改变,瓶颈链路的带宽会发生变化,水管变粗变细

一般路由不变,往返延迟不变发生变化。但是有些环境中设计到路由的变化,也需要监测,走不同的水管

长期来看动态,短期是静态。需要经常测量上面两个量

image-20210924213309751

  1. 应用受限

image-20210924213958417

  1. 带宽受限

image-20210924214412869

  1. 缓冲buffer受限

    image-20210924214437465

超过带宽延迟积,进入第二个阶段,延迟会增加,但是不会造成传输吞吐量变小。

丢失因为buffer扩大,时机会比较迟,效果很差。

image-20210924214717765

因为早期buffer比较小,丢失基本意味着拥塞,但随着路由交换设备buffer的扩大,造成以前算法拥塞控制时机很迟,效果很差,网络延迟变大。而且矫枉过正,造成网络震荡。

过了优化运行点只有坏处,没有好处,带宽受限阶段,瓶颈带宽不变,网络延迟增大,buffer受限时,出现丢包,RTT极大。

2. 控制原理

image-20210924220344468

image-20210924220325101

谷歌B4网络

image-20210924220420979

  • 运行在应用受限阶段,测量RTT
  • 运行在带宽受限阶段,测量链路带宽

image-20210924220645895

1. 测量RTprop往返延迟

image-20210924221028677

image-20210924221436929

2. 测量瓶颈链路带宽

image-20210924221550185

连续三个注入inflight后,RTT增加交付速率不增加25%,则判断进入带宽受限阶段,最大值可以当作链路带宽。

image-20210924222111534

image-20210924224608117

image-20210924231553668

pacing_time 节拍时间

image-20210925001343529

image-20210925001721999

image-20210925002214705

image-20210925002227359

image-20210925003521801

image-20210925003607183

image-20210925003725292

3. 算法与应用

image-20210925165546164

![image-20210925170718338](../Library/Application Support/typora-user-images/image-20210925170718338.png)

image-20210925183913972

image-20210925183938492

image-20210925184003390

image-20210925184035671

image-20210925184224236

image-20210925184526109

image-20210925184556996

image-20210925184927704

image-20210925184945002

image-20210925185112991

image-20210925185220921

image-20210925185647932

image-20210925185704651