对于开发人员来说 Google/BBR 算法,只需要关心以下几个部分:
1、bbr_pacing_rate
/*
" BBR.pacing_rate: The current pacing rate for a BBR flow, which
" controls inter-packet spacing.
*/
即:BBR发送起搏速率,指示间隔多少微妙,脉冲发送 cwnd 大小限制的数据
1000000 分之一秒(单位)
2、bbr_cwnd
The maximum allowed number of bytes in flight.
即:BBR最大飞行大小,指示起搏飞行的最大字节数限制。
3、flight
即:BBR正在飞行的大小,UNA未确认的字节数
4、在每次 ack 之后,重新计算 pacing_rate、cwnd,recovery_window、及RTT(需要丢失字节数 lost_bytes)
Based on Google/BbrSender::UpdateBandwidthAndMinRt,但需注意:BBR需要控制协议,提供采样数据,在每次ACK时记录帧的传送TX、ACK_TIME。
重点:
在BBR之中,ACK分为三个过程:
1、ACK前置阶段
标记进入ACK处理状态,且在 ack_state 初始化本次采样的容器及正在飞行的字节数(in_flight/send_una)、早前累积确认的字节数(total_bytes_acked_before)、确认时间等
BBR是一个关注实际传送字节的算法,而不会考虑丢失字节时降低 ssthresh 扩展窗口边缘的算法,因为BBR算法认为,网络产生丢包现象,这并不意味着发生了宽频拥塞。
2、ACK处理阶段
计算本次的采样数据信息,但注意:ACK处理阶段,或会在同一个帧事件之中处理多个连续帧(即:早前已到达对端 rwnd 窗口并缓存的数据)。
BBR算法并不关心,控制协议如何处理丢包的问题,它只关心人们何时输入正确的采样样本,而样本必须在ACK的阶段之中,为它进行输入。
3、ACK后置阶段
BBR算法的RTT、BtlBw、RTProp 更新,BtlBw 表示 Pipe 的实时宽频大小,RTProp 表示物理的传送延迟。
易于理解:BtlBw = 管道宽度,RTProp = 管道长度。
宽度 = Bw 宽频大小,长度 = 往返延迟(RTT)。
在BBR算法之中,不关心是否产生网络丢包,不关心管道的断开、打开状态等,它根据内部的状态机(四个状态)来决定,所以:对于已经到达中断报文,控制协议开发人员需要认为进行控制在中断报文以后的 cwnd 大小的控制,而不是仍旧使用BBR算法提供的 cwnd 大小,并产生更多的网络流量。