<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-bbr-01" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="BBR">BBR Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-01"/>
    <author initials="N." surname="Cardwell" fullname="Neal Cardwell" role="editor">
      <organization>Google</organization>
      <address>
        <email>ncardwell@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <author initials="J." surname="Beshay" fullname="Joseph Beshay" role="editor">
      <organization>Meta</organization>
      <address>
        <email>jbeshay@meta.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>IETF</area>
    <workgroup>CCWG</workgroup>
    <keyword>Congestion Control</keyword>
    <abstract>
      <?line 188?>

<t>This document specifies the BBR congestion control algorithm. BBR ("Bottleneck
Bandwidth and Round-trip propagation time") uses recent measurements of a
transport connection's delivery rate, round-trip time, and packet loss rate
to
build an explicit model of the network path. BBR then uses this model to
control both how fast it sends data and the maximum volume of data it allows
in
flight in the network at any time. Relative to loss-based congestion control
algorithms such as Reno <xref target="RFC5681"/> or CUBIC <xref target="RFC9438"/>, BBR offers
substantially higher throughput for bottlenecks
with shallow buffers or random losses, and substantially lower queueing delays
for bottlenecks with deep buffers (avoiding "bufferbloat"). BBR can be
implemented in any transport protocol that supports packet-delivery
acknowledgment. Thus far, open source implementations are available
for TCP <xref target="RFC9293"/> and QUIC <xref target="RFC9000"/>. This document
specifies version 3 of the BBR algorithm, BBRv3.</t>
    </abstract>
  </front>
  <middle>
    <?line 208?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Internet has traditionally used loss-based congestion control algorithms
like Reno (<xref target="Jac88"/>, <xref target="Jac90"/>, <xref target="WS95"/>  <xref target="RFC5681"/>) and CUBIC (<xref target="HRX08"/>,
<xref target="RFC9438"/>). These algorithms worked well for many years because
they were sufficiently well-matched to the prevalent range of bandwidth-delay
products and degrees of buffering in Internet paths. As the Internet has
evolved, loss-based congestion control is increasingly problematic in several
important scenarios:</t>
      <ol spacing="normal" type="1"><li>
          <t>Shallow buffers: In shallow buffers, packet loss can happen even when a link
  has low utilization. With high-speed, long-haul links employing commodity
  switches with shallow buffers, loss-based congestion control can cause abysmal
  throughput because it overreacts, making large multiplicative decreases in
  sending rate upon packet loss (by 50% in Reno <xref target="RFC5681"/> or 30%
  in CUBIC <xref target="RFC9438"/>), and only slowly growing its sending rate
  thereafter. This can happen even if the packet loss arises from transient
  traffic bursts when the link is mostly idle.</t>
        </li>
        <li>
          <t>Deep buffers: At the edge of today's Internet, loss-based congestion control
  can cause the problem of  "bufferbloat", by repeatedly filling deep buffers
  in last-mile links and causing high queuing delays.</t>
        </li>
        <li>
          <t>Dynamic traffic workloads: With buffers of any depth, dynamic mixes of
  newly-entering flows or flights of data from recently idle flows can cause
  frequent packet loss. In such scenarios loss-based congestion control can
  fail to maintain its fair share of bandwidth, leading to poor application
  performance.</t>
        </li>
      </ol>
      <t>In both the shallow-buffer (1.) or dynamic-traffic (3.) scenarios mentioned
above it is difficult to achieve full throughput with loss-based congestion
control in practice: for CUBIC, sustaining 10Gbps over 100ms RTT needs a
packet
loss rate below 0.000003% (i.e., more than 40 seconds between packet losses),
and over a 100ms RTT path a more feasible loss rate like 1% can only sustain
at
most 3 Mbps <xref target="RFC9438"/>. These limitations apply no matter what
the bottleneck link is capable of or what the connection's fair share
is. Furthermore, failure to reach the fair share can cause poor throughput
and
poor tail latency for latency-sensitive applications.</t>
      <t>The BBR ("Bottleneck Bandwidth and Round-trip propagation time") congestion
control algorithm is a model-based algorithm that takes an approach different
from loss-based congestion control: BBR uses recent measurements of a transport
connection's delivery rate,  round-trip time, and packet loss rate to build
an explicit model of the network path, including its estimated available
bandwidth, bandwidth-delay product, and the maximum volume of data that the
connection can place in-flight in the network without causing excessive queue
pressure. It then uses this model in order to guide its control behavior
in seeking high throughput and low queue pressure.</t>
      <t>This document describes the current version of the BBR algorithm, BBRv3.
The
original version of the algorithm, BBRv1, was described previously at a high
level <xref target="CCGHJ16"/><xref target="CCGHJ17"/>. The implications of BBR
in allowing high utilization of high-speed networks with shallow buffers
have
been discussed in other work <xref target="MM19"/>. Active work on the BBR
algorithm is continuing.</t>
      <t>This document is organized as follows. Section 2 provides various definitions
that will be used throughout this document. Section 3 provides an overview
of the design of the BBR algorithm, and section 4 describes the BBR algorithm
in detail, including BBR's network path model, control parameters, and state
machine. Section 5 describes the implementation status, section 6 describes
security considerations, section 7 notes that there are no IANA considerations,
and section 8 closes with Acknowledgments.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document defines state variables and constants for the BBR algorithm.</t>
      <t>Variables for connection state (C), per-packet state (P), or per-ACK rate
sample (rs) that are not defined below are defined in
<xref target="delivery-rate-samples"/>, "Delivery Rate Samples".</t>
      <section anchor="transport-connection-state">
        <name>Transport Connection State</name>
        <t>C.delivered: The total amount of data (tracked in octets or in packets)
delivered so far over the lifetime of the transport connection C.</t>
        <t>SMSS: The Sender Maximum Segment Size.</t>
        <t>is_cwnd_limited: True if the connection has fully utilized its cwnd at any
point in the last packet-timed round trip.</t>
        <t>InitialCwnd: The initial congestion window set by the transport protocol
implementation for the connection at initialization time.</t>
      </section>
      <section anchor="per-packet-state">
        <name>Per-Packet State</name>
        <t>packet.delivered: C.delivered when the given packet was sent by transport
connection C.</t>
        <t>packet.departure_time: The earliest pacing departure time for the given packet.</t>
        <t>packet.tx_in_flight: The volume of data that was estimated to be in flight
at the time of the transmission of the packet.</t>
      </section>
      <section anchor="per-ack-rate-sample-state">
        <name>Per-ACK Rate Sample State</name>
        <t>rs.delivered: The volume of data delivered between the transmission of the
packet that has just been ACKed and the current time.</t>
        <t>rs.delivery_rate: The delivery rate (aka bandwidth) sample obtained from
the packet that has just been ACKed.</t>
        <t>rs.rtt: The RTT sample calculated based on the most recently-sent segment
of the segments that have just been ACKed.</t>
        <t>rs.newly_acked: The volume of data cumulatively or selectively acknowledged
upon the ACK that was just received. (This quantity is referred to as
"DeliveredData" in <xref target="RFC6937"/>.)</t>
        <t>rs.newly_lost: The volume of data newly marked lost upon the ACK that was
just received.</t>
        <t>rs.tx_in_flight: The volume of data that was estimated to be in flight at
the time of the transmission of the packet that has just been ACKed (the
most recently sent segment among segments ACKed by the ACK that was just
received).</t>
        <t>rs.lost: The volume of data that was declared lost between the transmission
and acknowledgement of the packet that has just been ACKed (the most recently
sent segment among segments ACKed by the ACK that was just received).</t>
      </section>
      <section anchor="output-control-parameters">
        <name>Output Control Parameters</name>
        <t>cwnd: The transport sender's congestion window, which limits the amount of
data in flight.</t>
        <t>BBR.pacing_rate: The current pacing rate for a BBR flow, which controls
inter-packet spacing.</t>
        <t>BBR.send_quantum: The maximum size of a data aggregate scheduled and transmitted
together.</t>
      </section>
      <section anchor="pacing-state-and-parameters">
        <name>Pacing State and Parameters</name>
        <t>BBR.pacing_gain: The dynamic gain factor used to scale BBR.bw to produce
BBR.pacing_rate.</t>
        <t>BBRPacingMarginPercent: The static discount factor of 1% used to scale BBR.bw
to produce BBR.pacing_rate.</t>
        <t>BBR.next_departure_time: The earliest pacing departure time for the next
packet BBR schedules for transmission.</t>
        <t>BBRStartupPacingGain: A constant specifying the minimum gain value for
calculating the pacing rate that will allow the sending rate to double each
round (4 * ln(2) ~= 2.77) <xref target="BBRStartupPacingGain"/>; used in
Startup mode for BBR.pacing_gain.</t>
        <t>BBRDrainPacingGain: A constant specifying the pacing gain value used in
Drain mode, to attempt to drain the estimated queue at the bottleneck link
in
one round-trip or less. As noted in <xref target="BBRDrainPacingGain"/>, any
value at or below 1 / BBRStartupCwndGain = 1 / 2 = 0.5 will theoretically
achieve this. BBR uses the value 0.35, which has been shown to offer good
performance when compared with other alternatives.</t>
      </section>
      <section anchor="cwnd-state-and-parameters">
        <name>cwnd State and Parameters</name>
        <t>BBR.cwnd_gain: The dynamic gain factor used to scale the estimated BDP to
produce a congestion window (cwnd).</t>
        <t>BBRDefaultCwndGain: A constant specifying the minimum gain value that allows
the sending rate to double each round (2) <xref target="BBRStartupCwndGain"/>.
Used by default in most phases for BBR.cwnd_gain.</t>
      </section>
      <section anchor="general-algorithm-state">
        <name>General Algorithm State</name>
        <t>BBR.state: The current state of a BBR flow in the BBR state machine.</t>
        <t>BBR.round_count: Count of packet-timed round trips elapsed so far.</t>
        <t>BBR.round_start: A boolean that BBR sets to true once per packet-timed round
trip, on ACKs that advance BBR.round_count.</t>
        <t>BBR.next_round_delivered: packet.delivered value denoting the end of a
packet-timed round trip.</t>
        <t>BBR.idle_restart: A boolean that is true if and only if a connection is
restarting after being idle.</t>
      </section>
      <section anchor="core-algorithm-design-parameters">
        <name>Core Algorithm Design Parameters</name>
        <t>BBRLossThresh: The maximum tolerated per-round-trip packet loss rate when
probing for bandwidth (the default is 2%).</t>
        <t>BBRBeta: The default multiplicative decrease to make upon each round trip
during which the connection detects packet loss (the value is 0.7).</t>
        <t>BBRHeadroom: The multiplicative factor to apply to BBR.inflight_hi when
calculating a volume of free headroom to try to leave unused in the path
(e.g. free space in the bottleneck buffer or free time slots in the bottleneck
link) that can be used by cross traffic (the value is 0.15).</t>
        <t>BBRMinPipeCwnd: The minimal cwnd value BBR targets, to allow pipelining with
TCP endpoints that follow an "ACK every other packet" delayed-ACK policy:
4 * SMSS.</t>
      </section>
      <section anchor="network-path-model-parameters">
        <name>Network Path Model Parameters</name>
        <section anchor="data-rate-network-path-model-parameters">
          <name>Data Rate Network Path Model Parameters</name>
          <t>The data rate model parameters together estimate both the sending rate required
to reach the full bandwidth available to the flow (BBR.max_bw), and the maximum
pacing rate control parameter that is consistent with the queue pressure
objective (BBR.bw).</t>
          <t>BBR.max_bw: The windowed maximum recent bandwidth sample, obtained using
the
BBR delivery rate sampling algorithm in <xref target="delivery-rate-samples"/>,
measured during the current or previous bandwidth probing cycle (or during
Startup, if the flow is still in that state). (Part of the long-term
model.)</t>
          <t>BBR.bw_lo: The short-term maximum sending bandwidth that the algorithm
estimates is safe for matching the current network path delivery rate, based
on
any loss signals in the current bandwidth probing cycle. This is generally
lower than max_bw (thus the name). (Part of the short-term model.)</t>
          <t>BBR.bw: The maximum sending bandwidth that the algorithm estimates is
appropriate for matching the current network path delivery rate, given all
available signals in the model, at any time scale. It is the min() of max_bw
and bw_lo.</t>
        </section>
        <section anchor="data-volume-network-path-model-parameters">
          <name>Data Volume Network Path Model Parameters</name>
          <t>The data volume model parameters together estimate both the volume of in-flight
data required to reach the full bandwidth available to the flow
(BBR.max_inflight), and the maximum volume of data that is consistent with the
queue pressure objective (cwnd).</t>
          <t>BBR.min_rtt: The windowed minimum round-trip time sample measured over the
last MinRTTFilterLen = 10 seconds. This attempts to estimate the two-way
propagation delay of the network path when all connections sharing a bottleneck
are using BBR, but also allows BBR to estimate the value required for a BBR.bdp
estimate that allows full throughput if there are legacy loss-based Reno
or CUBIC flows sharing the bottleneck.</t>
          <t>BBR.bdp: The estimate of the network path's BDP (Bandwidth-Delay Product),
computed as: BBR.bdp = BBR.bw * BBR.min_rtt.</t>
          <t>BBR.extra_acked: A volume of data that is the estimate of the recent degree
of aggregation in the network path.</t>
          <t>BBR.offload_budget: The estimate of the minimum volume of data necessary
to achieve full throughput when using sender (TSO/GSO)  and receiver (LRO,
GRO) host offload mechanisms.</t>
          <t>BBR.max_inflight: The estimate of the volume of in-flight data required to
fully utilize the bottleneck bandwidth available to the flow, based on the
BDP estimate (BBR.bdp), the aggregation estimate (BBR.extra_acked), the offload
budget (BBR.offload_budget), and BBRMinPipeCwnd.</t>
          <t>BBR.inflight_hi: The long-term maximum volume of in-flight data that the
algorithm estimates will produce acceptable queue pressure, based on signals
in
the current or previous bandwidth probing cycle, as measured by loss. That
is,
if a flow is probing for bandwidth, and observes that sending a particular
volume of in-flight data causes a loss rate higher than the loss rate
objective, it sets inflight_hi to that volume of data. (Part of the long-term
model.)</t>
          <t>BBR.inflight_lo: Analogous to BBR.bw_lo, the short-term maximum volume of
in-flight data that the algorithm estimates is safe for matching the current
network path delivery process, based on any loss signals in the current
bandwidth probing cycle. This is generally lower than max_inflight or
inflight_hi (thus the name). (Part of the short-term model.)</t>
        </section>
      </section>
      <section anchor="state-for-responding-to-congestion">
        <name>State for Responding to Congestion</name>
        <t>BBR.bw_latest: a 1-round-trip max of delivered bandwidth (rs.delivery_rate).</t>
        <t>BBR.inflight_latest: a 1-round-trip max of delivered volume of data
(rs.delivered).</t>
      </section>
      <section anchor="estimating-bbrmaxbw">
        <name>Estimating BBR.max_bw</name>
        <t>BBR.MaxBwFilter: The filter for tracking the maximum recent rs.delivery_rate
sample, for estimating BBR.max_bw.</t>
        <t>MaxBwFilterLen: The filter window length for BBR.MaxBwFilter = 2 (representing
up to 2 ProbeBW cycles, the current cycle and the previous full cycle).</t>
        <t>BBR.cycle_count: The virtual time used by the BBR.max_bw filter window. Note
that BBR.cycle_count only needs to be tracked with a single bit, since the
BBR.MaxBwFilter only needs to track samples from two time slots: the previous
ProbeBW cycle and the current ProbeBW cycle.</t>
      </section>
      <section anchor="estimating-bbrextraacked">
        <name>Estimating BBR.extra_acked</name>
        <t>BBR.extra_acked_interval_start: the start of the time interval for estimating
the excess amount of data acknowledged due to aggregation effects.</t>
        <t>BBR.extra_acked_delivered: the volume of data marked as delivered since
BBR.extra_acked_interval_start.</t>
        <t>BBR.ExtraACKedFilter: the max filter tracking the recent maximum degree of
aggregation in the path.</t>
        <t>BBRExtraAckedFilterLen = The window length of the BBR.ExtraACKedFilter max
filter window in steady-state: 10 (in units of packet-timed round trips).</t>
      </section>
      <section anchor="startup-parameters-and-state">
        <name>Startup Parameters and State</name>
        <t>BBR.full_bw_reached: A boolean that records whether BBR estimates that it
has ever fully utilized its available bandwidth over the lifetime of the
connection.</t>
        <t>BBR.full_bw_now: A boolean that records whether BBR estimates that it has
fully utilized its available bandwidth since it most recetly started looking.</t>
        <t>BBR.full_bw: A recent baseline BBR.max_bw to estimate if BBR has "filled
the pipe" in Startup.</t>
        <t>BBR.full_bw_count: The number of non-app-limited round trips without large
increases in BBR.full_bw.</t>
      </section>
      <section anchor="probertt-and-minrtt-parameters-and-state">
        <name>ProbeRTT and min_rtt Parameters and State</name>
        <section anchor="parameters-for-estimating-bbrminrtt">
          <name>Parameters for Estimating BBR.min_rtt</name>
          <t>BBR.min_rtt_stamp: The wall clock time at which the current BBR.min_rtt sample
was obtained.</t>
          <t>MinRTTFilterLen: A constant specifying the length of the BBR.min_rtt min
filter window, MinRTTFilterLen is 10 secs.</t>
        </section>
        <section anchor="parameters-for-scheduling-probertt">
          <name>Parameters for Scheduling ProbeRTT</name>
          <t>BBRProbeRTTCwndGain = A constant specifying the gain value for calculating the
cwnd during ProbeRTT: 0.5 (meaning that ProbeRTT attempts to reduce in-flight
data to 50% of the estimated BDP).</t>
          <t>ProbeRTTDuration: A constant specifying the minimum duration for which ProbeRTT
state holds inflight to BBRMinPipeCwnd or fewer packets: 200 ms.</t>
          <t>ProbeRTTInterval: A constant specifying the minimum time interval between
ProbeRTT states: 5 secs.</t>
          <t>BBR.probe_rtt_min_delay: The minimum RTT sample recorded in the last
ProbeRTTInterval.</t>
          <t>BBR.probe_rtt_min_stamp: The wall clock time at which the current
BBR.probe_rtt_min_delay sample was obtained.</t>
          <t>BBR.probe_rtt_expired: A boolean recording whether the BBR.probe_rtt_min_delay
has expired and is due for a refresh with an application idle period or a
transition into ProbeRTT state.</t>
          <t>The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
be interpreted as described in <xref target="RFC2119"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="design-overview">
      <name>Design Overview</name>
      <section anchor="high-level-design-goals">
        <name>High-Level Design Goals</name>
        <t>The high-level goal of BBR is to achieve both:</t>
        <ol spacing="normal" type="1"><li>
            <t>The full throughput (or approximate fair share thereof) available to a flow  </t>
            <ul spacing="normal">
              <li>
                <t>Achieved in a fast and scalable manner
(using bandwidth in O(log(BDP)) time).</t>
              </li>
              <li>
                <t>Achieved with average packet loss rates of up to 1%.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Low queue pressure (low queuing delay and low packet loss).</t>
          </li>
        </ol>
        <t>These goals are in tension: sending faster improves the odds of achieving
(1) but reduces the odds of achieving (2), while sending slower improves
the odds of achieving (2) but reduces the odds of achieving (1). Thus the
algorithm cannot maximize throughput or minimize queue pressure independently,
and must jointly optimize both.</t>
        <t>To try to achieve these goals, and seek an operating point with high throughput
and low delay <xref target="K79"/> <xref target="GK81"/>, BBR aims to adapt its sending process to
match the network delivery process, in two dimensions:</t>
        <ol spacing="normal" type="1"><li>
            <t>data rate: the rate at which the flow sends data should ideally match the
  rate at which the network delivers the flow's data (the available bottleneck
  bandwidth)</t>
          </li>
          <li>
            <t>data volume: the amount of unacknowledged data in flight in the network
  should ideally match the bandwidth-delay product (BDP) of the path</t>
          </li>
        </ol>
        <t>Both the control of the data rate (via the pacing rate) and data volume
(directly via the congestion window or cwnd; and indirectly via the pacing
rate) are important. A mismatch in either dimension can cause the sender to
fail to meet its high-level design goals:</t>
        <ol spacing="normal" type="1"><li>
            <t>volume mismatch: If a sender perfectly matches its sending rate to the
  available bandwidth, but its volume of in-flight data exceeds the BDP, then
  the sender can maintain a large standing queue, increasing network latency
  and risking packet loss.</t>
          </li>
          <li>
            <t>rate mismatch: If a sender's volume of in-flight data matches the BDP
  perfectly but its sending rate exceeds the available bottleneck bandwidth
  (e.g. the sender transmits a BDP of data in an unpaced fashion, at the
  sender's link rate), then up to a full BDP of data can burst into the
  bottleneck queue, causing high delay and/or high loss.</t>
          </li>
        </ol>
      </section>
      <section anchor="algorithm-overview">
        <name>Algorithm Overview</name>
        <t>Based on the rationale above, BBR tries to spend most of its time matching
its sending process (data rate and data volume) to the network path's delivery
process. To do this, it explores the 2-dimensional control parameter space
of (1) data rate ("bandwidth" or "throughput") and (2) data volume ("in-flight
data"), with a goal of finding the maximum values of each control parameter
that are consistent with its objective for queue pressure.</t>
        <t>Depending on what signals a given network path manifests at a given time,
the objective for queue pressure is measured in terms of the most strict
among:</t>
        <ul spacing="normal">
          <li>
            <t>the amount of data that is estimated to be queued in the bottleneck buffer
(data_in_flight - estimated_BDP): the objective is to maintain this amount
at or below 1.5 * estimated_BDP</t>
          </li>
          <li>
            <t>the packet loss rate: the objective is a maximum per-round-trip packet loss
rate of BBRLossThresh=2% (and an average packet loss rate considerably lower)</t>
          </li>
        </ul>
      </section>
      <section anchor="state-machine-overview">
        <name>State Machine Overview</name>
        <t>BBR varies its control parameters with a state machine that aims for high
throughput, low latency, low loss, and an approximately fair sharing of
bandwidth, while maintaining an up-to-date model of the network path.</t>
        <t>A BBR flow starts in the Startup state, and ramps up its sending rate quickly,
to rapidly estimate the maximum available bandwidth (BBR.max_bw). When it
estimates the bottleneck bandwidth has been fully utilized, it enters the
Drain state to drain the estimated queue. In steady state a BBR flow mostly
uses the ProbeBW states, to periodically briefly send faster to probe for
higher capacity and then briefly send slower to try to drain any resulting
queue. If needed, it briefly enters the ProbeRTT state, to lower the sending
rate to probe for lower BBR.min_rtt samples. The detailed behavior for each
state is described below.</t>
      </section>
      <section anchor="network-path-model-overview">
        <name>Network Path Model Overview</name>
        <section anchor="high-level-design-goals-for-the-network-path-model">
          <name>High-Level Design Goals for the Network Path Model</name>
          <t>At a high level, the BBR model is trying to reflect two aspects of the network
path:</t>
          <ul spacing="normal">
            <li>
              <t>Model what's required for achieving full throughput: Estimate the data rate
(BBR.max_bw) and data volume (BBR.max_inflight) required to fully utilize the
fair share of the bottleneck bandwidth available to the flow. This
incorporates estimates of the maximum available bandwidth, the BDP of the
path, and the requirements of any offload features on the end hosts or
mechanisms on the network path that produce aggregation effects.</t>
            </li>
            <li>
              <t>Model what's permitted for achieving low queue pressure: Estimate the maximum
data rate (BBR.bw) and data volume (cwnd) consistent with the queue pressure
objective, as measured by the estimated degree of queuing and packet loss.</t>
            </li>
          </ul>
          <t>Note that those two aspects are in tension: the highest throughput is available
to the flow when it sends as fast as possible and occupies as many bottleneck
buffer slots as possible; the lowest queue pressure is achieved by the flow
when it sends as slow as possible and occupies as few bottleneck buffer slots
as possible. To resolve the tension, the algorithm aims to achieve the maximum
throughput achievable while still meeting the queue pressure objective.</t>
        </section>
        <section anchor="time-scales-for-the-network-model">
          <name>Time Scales for the Network Model</name>
          <t>At a high level, the BBR model is trying to reflect the properties of the
network path on two different time scales:</t>
          <section anchor="long-term-model">
            <name>Long-term model</name>
            <t>One goal is for BBR to maintain high average utilization of the fair share
of the available bandwidth, over long time intervals. This requires estimates
of the path's data rate and volume capacities that are robust over long time
intervals. This means being robust to congestion signals that may be noisy
or may reflect short-term congestion that has already abated by the time
an ACK arrives. This also means providing a robust history of the best
recently-achievable performance on the path so that the flow can quickly and
robustly aim to re-probe that level of performance whenever it decides to probe
the capacity of the path.</t>
          </section>
          <section anchor="short-term-model">
            <name>Short-term model</name>
            <t>A second goal of BBR is to react to every congestion signal, including loss,
as if it may indicate a persistent/long-term increase in congestion and/or
decrease in the bandwidth available to the flow, because that may indeed
be the case.</t>
          </section>
          <section anchor="time-scale-strategy">
            <name>Time Scale Strategy</name>
            <t>BBR sequentially alternates between spending most of its time using short-term
models to conservatively respect all congestion signals in case they represent
persistent congestion, but periodically using its long-term model to robustly
probe the limits of the available path capacity in case the congestion has
abated and more capacity is available.</t>
          </section>
        </section>
      </section>
      <section anchor="control-parameter-overview">
        <name>Control Parameter Overview</name>
        <t>BBR uses its model to control the connection's sending behavior. Rather than
using a single control parameter, like the cwnd parameter that limits the
volume of in-flight data in the Reno and CUBIC congestion control algorithms,
BBR uses three distinct control parameters:</t>
        <ol spacing="normal" type="1"><li>
            <t>pacing rate: the maximum rate at which BBR sends data.</t>
          </li>
          <li>
            <t>send quantum: the maximum size of any aggregate that the transport sender
  implementation may need to transmit as a unit to amortize per-packet
  transmission overheads.</t>
          </li>
          <li>
            <t>cwnd: the maximum volume of data BBR allows in-flight in the network at any
  time.</t>
          </li>
        </ol>
      </section>
      <section anchor="environment-and-usage">
        <name>Environment and Usage</name>
        <t>BBR is a congestion control algorithm that is agnostic to transport-layer
and link-layer technologies, requires only sender-side changes, and does
not require changes in the network. Open source implementations of BBR are
available for the TCP <xref target="RFC9293"/> and QUIC <xref target="RFC9000"/> transport
protocols, and these implementations have been used in production
for a large volume of Internet traffic. An open source implementation of
BBR is also available for DCCP <xref target="RFC4340"/>  <xref target="draft-romo-iccrg-ccid5"/>.</t>
      </section>
    </section>
    <section anchor="detailed-algorithm">
      <name>Detailed Algorithm</name>
      <section anchor="state-machine">
        <name>State Machine</name>
        <t>BBR implements a state machine that uses the network path model to guide
its decisions, and the control parameters to enact its decisions.</t>
        <section anchor="state-transition-diagram">
          <name>State Transition Diagram</name>
          <t>The following state transition diagram summarizes the flow of control and
the relationship between the different states:</t>
          <artwork><![CDATA[
             |
             V
    +---> Startup  ------------+
    |        |                 |
    |        V                 |
    |     Drain  --------------+
    |        |                 |
    |        V                 |
    +---> ProbeBW_DOWN  -------+
    | ^      |                 |
    | |      V                 |
    | |   ProbeBW_CRUISE ------+
    | |      |                 |
    | |      V                 |
    | |   ProbeBW_REFILL  -----+
    | |      |                 |
    | |      V                 |
    | |   ProbeBW_UP  ---------+
    | |      |                 |
    | +------+                 |
    |                          |
    +---- ProbeRTT <-----------+
]]></artwork>
        </section>
        <section anchor="state-machine-operation-overview">
          <name>State Machine Operation Overview</name>
          <t>When starting up, BBR probes to try to quickly build a model of the network
path; to adapt to later changes to the path or its traffic, BBR must continue
to probe to update its model. If the available bottleneck bandwidth increases,
BBR must send faster to discover this. Likewise, if the round-trip propagation
delay changes, this changes the BDP, and thus BBR must send slower to get
inflight below the new BDP in order to measure the new BBR.min_rtt. Thus,
BBR's state machine runs periodic, sequential experiments, sending faster
to check for BBR.bw increases or sending slower to yield bandwidth, drain
the queue, and check for BBR.min_rtt decreases. The frequency, magnitude,
duration, and structure of these experiments differ depending on what's already
known (startup or steady-state) and application sending behavior (intermittent
or continuous).</t>
          <t>This state machine has several goals:</t>
          <ul spacing="normal">
            <li>
              <t>Achieve high throughput by efficiently utilizing available bandwidth.</t>
            </li>
            <li>
              <t>Achieve low latency and packet loss rates by keeping queues bounded and small.</t>
            </li>
            <li>
              <t>Share bandwidth with other flows in an approximately fair manner.</t>
            </li>
            <li>
              <t>Feed samples to the model estimators to refresh and update the model.</t>
            </li>
          </ul>
        </section>
        <section anchor="state-machine-tactics">
          <name>State Machine Tactics</name>
          <t>In the BBR framework, at any given time the sender can choose one of the
following tactics:</t>
          <ul spacing="normal">
            <li>
              <t>Acceleration: Send faster then the network is delivering data: to probe the
maximum bandwidth available to the flow</t>
            </li>
            <li>
              <t>Deceleration: Send slower than the network is delivering data: to reduce
the amount of data in flight, with a number of overlapping motivations:  </t>
              <ul spacing="normal">
                <li>
                  <t>Reducing queuing delay: to reduce queuing delay, to reduce latency for
request/response cross-traffic (e.g. RPC, web traffic).</t>
                </li>
                <li>
                  <t>Reducing packet loss: to reduce packet loss, to reduce tail latency for
request/response cross-traffic (e.g. RPC, web traffic) and improve
coexistence with Reno/CUBIC.</t>
                </li>
                <li>
                  <t>Probing BBR.min_rtt: to probe the path's BBR.min_rtt</t>
                </li>
                <li>
                  <t>Bandwidth convergence: to aid bandwidth fairness convergence, by leaving
unused capacity in the bottleneck link or bottleneck buffer, to allow other
flows that may have lower sending rates to discover and utilize the unused
capacity</t>
                </li>
                <li>
                  <t>Burst tolerance: to allow bursty arrivals of cross-traffic (e.g. short web
or RPC requests) to be able to share the bottleneck link without causing
excessive queuing delay or packet loss</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Cruising: Send at the same rate the network is delivering data: try to match
the sending rate to the flow's current available bandwidth, to try to achieve
high utilization of the available bandwidth without increasing queue pressure</t>
            </li>
          </ul>
          <t>Throughout the lifetime of a BBR flow, it sequentially cycles through all
three tactics, to measure the network path and try to optimize its operating
point.</t>
          <t>BBR's state machine uses two control mechanisms: the pacing_gain and the
cwnd. Primarily, it uses the pacing_gain (see the "Pacing Rate" section), which
controls how fast packets are sent relative to BBR.bw. A pacing_gain &gt; 1
decreases inter-packet time and increases inflight. A pacing_gain &lt; 1 has the
opposite effect, increasing inter-packet time and while aiming to decrease
inflight. The cwnd is sufficiently larger than the BDP to allow the higher
pacing gain to accumulate more packets in flight. Only if the state machine
needs to quickly reduce inflight to a particular absolute value, it uses the
cwnd.</t>
        </section>
      </section>
      <section anchor="algorithm-organization">
        <name>Algorithm Organization</name>
        <t>The BBR algorithm is an event-driven algorithm that executes steps upon the
following events: connection initialization, upon each ACK, upon the
transmission of each quantum, and upon loss detection events. All of the
sub-steps invoked referenced below are described below.</t>
        <section anchor="initialization">
          <name>Initialization</name>
          <t>Upon transport connection initialization, BBR executes its initialization
steps:</t>
          <artwork><![CDATA[
  BBROnInit():
    InitWindowedMaxFilter(filter=BBR.MaxBwFilter, value=0, time=0)
    BBR.min_rtt = SRTT ? SRTT : Infinity
    BBR.min_rtt_stamp = Now()
    BBR.probe_rtt_done_stamp = 0
    BBR.probe_rtt_round_done = false
    BBR.prior_cwnd = 0
    BBR.idle_restart = false
    BBR.extra_acked_interval_start = Now()
    BBR.extra_acked_delivered = 0
    BBR.full_bw_reached = false
    BBRResetCongestionSignals()
    BBRResetLowerBounds()
    BBRInitRoundCounting()
    BBRResetFullBW()
    BBRInitPacingRate()
    BBREnterStartup()
]]></artwork>
        </section>
        <section anchor="per-transmit-steps">
          <name>Per-Transmit Steps</name>
          <t>When transmitting, BBR merely needs to check for the case where the flow
is restarting from idle:</t>
          <artwork><![CDATA[
  BBROnTransmit():
    BBRHandleRestartFromIdle()
]]></artwork>
        </section>
        <section anchor="per-ack-steps">
          <name>Per-ACK Steps</name>
          <t>On every ACK, the BBR algorithm executes the following BBRUpdateOnACK() steps
in order to update its network path model, update its state machine, and
adjust its control parameters to adapt to the updated model:</t>
          <artwork><![CDATA[
  BBRUpdateOnACK():
    BBRUpdateModelAndState()
    BBRUpdateControlParameters()

  BBRUpdateModelAndState():
    BBRUpdateLatestDeliverySignals()
    BBRUpdateCongestionSignals()
    BBRUpdateACKAggregation()
    BBRCheckFullBWReached()
    BBRCheckStartupDone()
    BBRCheckDrainDone()
    BBRUpdateProbeBWCyclePhase()
    BBRUpdateMinRTT()
    BBRCheckProbeRTT()
    BBRAdvanceLatestDeliverySignals()
    BBRBoundBWForModel()

  BBRUpdateControlParameters():
    BBRSetPacingRate()
    BBRSetSendQuantum()
    BBRSetCwnd()
]]></artwork>
        </section>
        <section anchor="per-loss-steps">
          <name>Per-Loss Steps</name>
          <t>On every packet loss event, where some sequence range "packet" is marked
lost, the BBR algorithm executes the following BBRUpdateOnLoss() steps in
order to update its network path model</t>
          <artwork><![CDATA[
  BBRUpdateOnLoss(packet):
    BBRHandleLostPacket(packet)
]]></artwork>
        </section>
      </section>
      <section anchor="state-machine-operation">
        <name>State Machine Operation</name>
        <section anchor="startup">
          <name>Startup</name>
          <section anchor="startup-dynamics">
            <name>Startup Dynamics</name>
            <t>When a BBR flow starts up, it performs its first (and most rapid) sequential
probe/drain process in the Startup and Drain states. Network link bandwidths
currently span a range of at least 11 orders of magnitude, from a few bps
to
hundreds of Gbps. To quickly learn BBR.max_bw, given this huge range to
explore, BBR's Startup state does an exponential search of the rate space,
doubling the sending rate each round. This finds BBR.max_bw in O(log_2(BDP))
round trips.</t>
            <t>To achieve this rapid probing smoothly, in Startup BBR uses the minimum gain
values that will allow the sending rate to double each round: in Startup BBR
sets BBR.pacing_gain to BBRStartupPacingGain (2.77) <xref target="BBRStartupPacingGain"/>
and BBR.cwnd_gain to BBRDefaultCwndGain (2) <xref target="BBRStartupCwndGain"/>.</t>
            <t>When initializing a connection, or upon any later entry into Startup mode,
BBR executes the following BBREnterStartup() steps:</t>
            <artwork><![CDATA[
  BBREnterStartup():
    BBR.state = Startup
    BBR.pacing_gain = BBRStartupPacingGain
    BBR.cwnd_gain = BBRDefaultCwndGain
]]></artwork>
            <t>As BBR grows its sending rate rapidly, it obtains higher delivery rate
samples, BBR.max_bw increases, and the pacing rate and cwnd both adapt by
smoothly growing in proportion. Once the pipe is full, a queue typically
forms,
but the cwnd_gain bounds any queue to (cwnd_gain - 1) * estimated_BDP, which
is
approximately (2 - 1) * estimated_BDP = estimated_BDP. The immediately
following Drain state is designed to quickly drain that queue.</t>
            <t>During Startup, BBR estimates whether the pipe is full using two estimators.
The first looks for a plateau in the BBR.max_bw estimate. The second looks
for packet loss. The following subsections discuss these estimators.</t>
            <artwork><![CDATA[
  BBRCheckStartupDone():
    BBRCheckStartupHighLoss()
    if (BBR.state == Startup and BBR.full_bw_reached)
      BBREnterDrain()
]]></artwork>
          </section>
          <section anchor="exiting-acceleration-based-on-bandwidth-plateau">
            <name>Exiting Acceleration Based on Bandwidth Plateau</name>
            <t>In phases where BBR is accelerating to probe the available bandwidth -
Startup and ProbeBW_UP - BBR runs a state machine to estimate whether an
accelerating sending rate has saturated the available per-flow bandwidth
("filled the pipe") by looking for a plateau in the measured
rs.delivery_rate.</t>
            <t>BBR tracks the status of the current full-pipe estimation process in the
boolean BBR.full_bw_now, and uses BBR.full_bw_now to exit ProbeBW_UP. BBR
records in the boolean BBR.full_bw_reached whether BBR estimates that it
has
ever fully utilized its available bandwidth (over the lifetime of the
connection), and uses BBR.full_bw_reached to decide when to exit Startup
and
enter Drain.</t>
            <t>The full pipe estimator works as follows: if BBR counts several (three)
non-application-limited rounds where attempts to significantly increase the
delivery rate actually result in little increase (less than 25 percent),
then
it estimates that it has fully utilized the per-flow available bandwidth,
and
sets both BBR.full_bw_now and BBR.full_bw_reached to true.</t>
            <t>Upon starting a full pipe detection process (either on startup or when probing
for an increase in bandwidth), the following steps are taken:</t>
            <artwork><![CDATA[
  BBRResetFullBW():
    BBR.full_bw = 0
    BBR.full_bw_count = 0
    BBR.full_bw_now = 0
]]></artwork>
            <t>While running the full pipe detection process, upon an ACK that acknowledges
new data, and when the delivery rate sample is not application-limited
(see <xref target="delivery-rate-samples"/>), BBR runs the "full pipe" estimator:</t>
            <artwork><![CDATA[
  BBRCheckFullBWReached():
    if (BBR.full_bw_now or rs.is_app_limited)
      return  /* no need to check for a full pipe now */
    if (rs.delivery_rate >= BBR.full_bw * 1.25)
      BBRResetFullBW()       /* bw is still growing, so reset */
      BBR.full_bw = rs.delivery_rate  /* record new baseline bw */
      return
    if (!BBR.round_start)
      return
    BBR.full_bw_count++   /* another round w/o much growth */
    BBR.full_bw_now = (BBR.full_bw_count >= 3)
    if (BBR.full_bw_now)
      BBR.full_bw_reached = true
]]></artwork>
            <t>BBR waits three packet-timed round trips to have reasonable evidence that the
sender is not detecting a delivery-rate plateau that was temporarily imposed by
congestion or receive-window auto-tuning. This three-round threshold was
validated by experimental data to allow the receiver the chance to grow its
receive window.</t>
          </section>
          <section anchor="exiting-startup-based-on-packet-loss">
            <name>Exiting Startup Based on Packet Loss</name>
            <t>A second method BBR uses for estimating the bottleneck is full in Startup
is
by looking at packet losses. Specifically, BBRCheckStartupHighLoss() checks
whether all of the following criteria are all met:</t>
            <ul spacing="normal">
              <li>
                <t>The connection has been in fast recovery for at least one full packet-timed
round trip.</t>
              </li>
              <li>
                <t>The loss rate over the time scale of a single full round trip exceeds
BBRLossThresh (2%).</t>
              </li>
              <li>
                <t>There are at least BBRStartupFullLossCnt=6 discontiguous sequence ranges
lost in that round trip.</t>
              </li>
            </ul>
            <t>If these criteria are all met, then BBRCheckStartupHighLoss() takes the
following steps. First, it sets BBR.full_bw_reached = true. Then it sets
BBR.inflight_hi to its estimate of a safe level of in-flight data suggested
by
these losses, which is max(BBR.bdp, BBR.inflight_latest), where
BBR.inflight_latest is the max delivered volume of data (rs.delivered) over
the
last round trip. Finally, it exits Startup and enters Drain.</t>
            <t>The algorithm waits until all three criteria are met to filter out noise
from burst losses, and to try to ensure the bottleneck is fully utilized
on a sustained basis, and the full bottleneck bandwidth has been measured,
before attempting to drain the level of in-flight data to the estimated BDP.</t>
          </section>
        </section>
        <section anchor="drain">
          <name>Drain</name>
          <t>Upon exiting Startup, BBR enters its Drain state. In Drain, BBR aims to quickly
drain any queue at the bottleneck link that was created in Startup by switching
to a pacing_gain well below 1.0, until any estimated queue has been drained. It
uses a pacing_gain of BBRDrainPacingGain = 0.35, chosen via analysis
<xref target="BBRDrainPacingGain"/> and experimentation to try to drain the queue in less
than one round-trip:</t>
          <artwork><![CDATA[
  BBREnterDrain():
    BBR.state = Drain
    BBR.pacing_gain = BBRDrainPacingGain    /* pace slowly */
    BBR.cwnd_gain = BBRDefaultCwndGain      /* maintain cwnd */
]]></artwork>
          <t>In Drain, when the amount of data in flight is less than or equal to the
estimated BDP, meaning BBR estimates that the queue at the bottleneck link
has
been fully drained, then BBR exits Drain and enters ProbeBW. To implement
this,
upon every ACK BBR executes:</t>
          <artwork><![CDATA[
  BBRCheckDrainDone():
    if (BBR.state == Drain and C.pipe <= BBRInflight(1.0))
      BBREnterProbeBW()  /* BBR estimates the queue was drained */
]]></artwork>
        </section>
        <section anchor="probebw">
          <name>ProbeBW</name>
          <t>Long-lived BBR flows tend to spend the vast majority of their time in the
ProbeBW states. In the ProbeBW states, a BBR flow sequentially accelerates,
decelerates, and cruises, to measure the network path, improve its operating
point (increase throughput and reduce queue pressure), and converge toward a
more fair allocation of bottleneck bandwidth. To do this, the flow sequentially
cycles through all three tactics: trying to send faster than, slower than, and
at the same rate as the network delivery process. To achieve this, a BBR flow
in ProbeBW mode cycles through the four Probe bw states (DOWN, CRUISE, REFILL,
and UP) described below in turn.</t>
          <section anchor="probebwdown">
            <name>ProbeBW_DOWN</name>
            <t>In the ProbeBW_DOWN phase of the cycle, a BBR flow pursues the deceleration
tactic, to try to send slower than the network is delivering data, to reduce
the amount of data in flight, with all of the standard motivations for the
deceleration tactic (discussed in "State Machine Tactics" in
<xref target="state-machine-tactics"/>). It does this by switching to a
BBR.pacing_gain of 0.90, sending at 90% of BBR.bw. The pacing_gain value
of
0.90 is derived based on the ProbeBW_UP pacing gain of 1.25, as the minimum
pacing_gain value that allows bandwidth-based convergence to approximate
fairness, and validated through experiments.</t>
            <t>Exit conditions: The flow exits the ProbeBW_DOWN phase and enters CRUISE
when the flow estimates that both of the following conditions have been
met:</t>
            <ul spacing="normal">
              <li>
                <t>There is free headroom: If inflight_hi is set, then BBR remains in
ProbeBW_DOWN at least until the volume of in-flight data is less than or
equal
to a target calculated based on (1 - BBRHeadroom)*BBR.inflight_hi. The goal
of
this constraint is to ensure that in cases where loss signals suggest an
upper
limit on the volume of in-flight data, then the flow attempts to leave some
free headroom in the path (e.g. free space in the bottleneck buffer or free
time slots in the bottleneck link) that can be used by cross traffic (both
for
convergence of bandwidth shares and for burst tolerance).</t>
              </li>
              <li>
                <t>The volume of in-flight data is less than or equal to BBR.bdp, i.e. the flow
estimates that it has drained any queue at the bottleneck.</t>
              </li>
            </ul>
          </section>
          <section anchor="probebwcruise">
            <name>ProbeBW_CRUISE</name>
            <t>In the ProbeBW_CRUISE phase of the cycle, a BBR flow pursues the "cruising"
tactic (discussed in "State Machine Tactics" in
<xref target="state-machine-tactics"/>), attempting to send at the same rate the
network is delivering data. It tries to match the sending rate to the flow's
current available bandwidth, to try to achieve high utilization of the
available bandwidth without increasing queue pressure. It does this by
switching to a pacing_gain of 1.0, sending at 100% of BBR.bw. Notably, while
in
this state it responds to concrete congestion signals (loss) by reducing
BBR.bw_lo and BBR.inflight_lo, because these signals suggest that the available
bandwidth and deliverable volume of in-flight data have likely reduced, and
the
flow needs to change to adapt, slowing down to match the latest delivery
process.</t>
            <t>Exit conditions: The connection adaptively holds this state until it decides
that it is time to probe for bandwidth (see "Time Scale for Bandwidth Probing",
in <xref target="time-scale-for-bandwidth-probing-"/>), at which time it enters
ProbeBW_REFILL.</t>
          </section>
          <section anchor="probebwrefill">
            <name>ProbeBW_REFILL</name>
            <t>The goal of the ProbeBW_REFILL state is to "refill the pipe", to try to fully
utilize the network bottleneck without creating any significant queue pressure.</t>
            <t>To do this, BBR first resets the short-term model parameters bw_lo and
inflight_lo, setting both to "Infinity". This is the key moment in the BBR
time
scale strategy (see "Time Scale Strategy", <xref target="time-scale-strategy"/>)
where the flow pivots, discarding its
conservative short-term bw_lo and inflight_lo parameters and beginning to
robustly probe the bottleneck's long-term available bandwidth. During this
time
the estimated bandwidth and inflight_hi, if set, constrain the connection.</t>
            <t>During ProbeBW_REFILL BBR uses a BBR.pacing_gain of 1.0, to send at a rate
that matches the current estimated available bandwidth, for one packet-timed
round trip. The goal is to fully utilize the bottleneck link before
transitioning into ProbeBW_UP and significantly increasing the chances of
causing loss. The motivating insight is that, as soon as a flow starts
acceleration, sending faster than the available bandwidth, it will start
building a queue at the bottleneck. And if the buffer is shallow enough,
then
the flow can cause loss signals very shortly after the first accelerating
packets arrive at the bottleneck. If the flow were to neglect to fill the
pipe
before it causes this loss signal, then these very quick signals of excess
queue could cause the flow's estimate of the path's capacity (i.e. inflight_hi)
to significantly underestimate. In particular, if the flow were to transition
directly from ProbeBW_CRUISE to ProbeBW_UP, the volume of in-flight data
(at
the time the first accelerating packets were sent) may often be still very
close to the volume of in-flight data maintained in CRUISE, which may be
only
(1 - BBRHeadroom)*inflight_hi.</t>
            <t>Exit conditions: The flow exits ProbeBW_REFILL after one packet-timed round
trip, and enters ProbeBW_UP. This is because after one full round trip of
sending in ProbeBW_REFILL the flow (if not application-limited) has had an
opportunity to place as many packets in flight as its BBR.bw and inflight_hi
permit. Correspondingly, at this point the flow starts to see bandwidth samples
reflecting its ProbeBW_REFILL behavior, which may be putting too much data
in
flight.</t>
          </section>
          <section anchor="probebwup">
            <name>ProbeBW_UP</name>
            <t>After ProbeBW_REFILL refills the pipe, ProbeBW_UP probes for possible
increases in available bandwidth by raising the sending rate, using a
BBR.pacing_gain of 1.25, to send faster than the current estimated available
bandwidth. It also raises the cwnd_gain to 2.25, to ensure that the flow
can
send faster than it had been, even if cwnd was previously limiting the sending
process.</t>
            <t>If the flow has not set BBR.inflight_hi, it implicitly tries to raise the
volume of in-flight data to at least BBR.pacing_gain * BBR.bdp = 1.25 *
BBR.bdp.</t>
            <t>If the flow has set BBR.inflight_hi and encounters that limit, it then
gradually increases the upper volume bound (BBR.inflight_hi) using the
following approach:</t>
            <ul spacing="normal">
              <li>
                <t>inflight_hi: The flow raises inflight_hi in ProbeBW_UP in a manner that is
slow and cautious at first, but increasingly rapid and bold over time. The
initial caution is motivated by the fact that a given BBR flow may be sharing
a
shallow buffer with thousands of other flows, so that the buffer space
available to the flow may be quite tight (even just a single packet or
less). The increasingly rapid growth over time is motivated by the fact that
in
a high-speed WAN the increase in available bandwidth (and thus the estimated
BDP) may require the flow to grow the volume of its inflight data by up to
O(1,000,000) packets; even a quite typical high-speed WAN BDP like 10Gbps
*
100ms is around 83,000 packets (with a 1500-byte MTU). BBR takes an approach
where the additive increase to BBR.inflight_hi exponentially doubles each
round
trip; in each successive round trip, inflight_hi grows by 1, 2, 4, 8, 16,
etc,
with the increases spread uniformly across the entire round trip. This helps
allow BBR to utilize a larger BDP in O(log(BDP)) round trips, meeting the
design goal for scalable utilization of newly-available bandwidth.</t>
              </li>
            </ul>
            <t>Exit conditions: The BBR flow ends ProbeBW_UP bandwidth probing and
transitions to ProbeBW_DOWN to try to drain the bottleneck queue when either
of
the following conditions are met:</t>
            <ol spacing="normal" type="1"><li>
                <t>Bandwidth saturation: BBRIsTimeToGoDown() (see below) uses the "full pipe"
  estimator (see <xref target="exiting-acceleration-based-on-bandwidth-plateau"/>) to
  estimate whether the flow has saturated the available per-flow bandwidth
  ("filled the pipe"), by looking for a plateau in the measured
  rs.delivery_rate. If, during this process, the volume of data is constrained
  by BBR.inflight_hi (the flow becomes cwnd-limited while cwnd is limited by
  BBR.inflight_hi), then the flow cannot fully explore the available bandwidth,
  and so it resets the "full pipe" estimator by calling BBRResetFullBW().</t>
              </li>
              <li>
                <t>Loss: The current loss rate, over the time scale of the last round trip,
  exceeds BBRLossThresh (2%).</t>
              </li>
            </ol>
          </section>
          <section anchor="time-scale-for-bandwidth-probing-">
            <name>Time Scale for Bandwidth Probing</name>
            <t>Choosing the time scale for probing bandwidth is tied to the question of
how to coexist with legacy Reno/CUBIC flows, since probing for bandwidth
runs a significant risk of causing packet loss, and causing packet loss can
significantly limit the throughput of such legacy Reno/CUBIC flows.</t>
            <section anchor="bandwidth-probing-and-coexistence-with-renocubic">
              <name>Bandwidth Probing and Coexistence with Reno/CUBIC</name>
              <t>BBR has an explicit strategy for coexistence with Reno/CUBIC: to try to behave
in a manner so that  Reno/CUBIC flows coexisting with BBR can continue to
work well in the primary contexts where they do today:</t>
              <ul spacing="normal">
                <li>
                  <t>Intra-datacenter/LAN traffic: the goal is to allow Reno/CUBIC to be able
to
perform well in 100M through 40G enterprise and datacenter Ethernet:  </t>
                  <ul spacing="normal">
                    <li>
                      <t>BDP = 40 Gbps * 20 us / (1514 bytes) ~= 66 packets</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Public Internet last mile traffic: the goal is to allow Reno/CUBIC to be
able to support up to 25Mbps (for 4K Video) at an RTT of 30ms, typical
parameters for common CDNs for large video services:  </t>
                  <ul spacing="normal">
                    <li>
                      <t>BDP = 25Mbps * 30 ms / (1514 bytes) ~= 62 packets</t>
                    </li>
                  </ul>
                </li>
              </ul>
              <t>The challenge in meeting these goals is that Reno/CUBIC need long periods
of no loss to utilize large BDPs. The good news is that in the environments
where Reno/CUBIC work well today (mentioned above), the BDPs are small, roughly
~100 packets or less.</t>
            </section>
            <section anchor="a-dual-time-scale-approach-for-coexistence">
              <name>A Dual-Time-Scale Approach for Coexistence</name>
              <t>The BBR strategy has several aspects:</t>
              <ol spacing="normal" type="1"><li>
                  <t>The highest priority is to estimate the bandwidth available to the BBR flow
  in question.</t>
                </li>
                <li>
                  <t>Secondarily, a given BBR flow adapts (within bounds) the frequency at which
  it probes bandwidth and knowingly risks packet loss, to allow Reno/CUBIC
  to reach a bandwidth at least as high as that given BBR flow.</t>
                </li>
              </ol>
              <t>To adapt the frequency of bandwidth probing, BBR considers two time scales:
a BBR-native time scale, and a bounded Reno-conscious time scale:</t>
              <ul spacing="normal">
                <li>
                  <t>T_bbr: BBR-native time-scale  </t>
                  <ul spacing="normal">
                    <li>
                      <t>T_bbr = uniformly randomly distributed between 2 and 3 secs</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>T_reno: Reno-coexistence time scale  </t>
                  <ul spacing="normal">
                    <li>
                      <t>T_reno_bound = pick_randomly_either({62, 63})</t>
                    </li>
                    <li>
                      <t>reno_bdp = min(BBR.bdp, cwnd)</t>
                    </li>
                    <li>
                      <t>T_reno = min(reno_bdp, T_reno_bound) round trips</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>T_probe: The time between bandwidth probe UP phases:  </t>
                  <ul spacing="normal">
                    <li>
                      <t>T_probe = min(T_bbr, T_reno)</t>
                    </li>
                  </ul>
                </li>
              </ul>
              <t>This dual-time-scale approach is similar to that used by CUBIC, which has
a CUBIC-native time scale given by a cubic curve, and a "Reno emulation"
module that estimates what cwnd would give the flow Reno-equivalent throughput.
At any given moment, CUBIC choose the cwnd implied by the more aggressive
strategy.</t>
              <t>We randomize both the T_bbr and T_reno parameters, for better mixing and
fairness convergence.</t>
            </section>
            <section anchor="design-considerations-for-choosing-constant-parameters">
              <name>Design Considerations for Choosing Constant Parameters</name>
              <t>We design the maximum wall-clock bounds of BBR-native inter-bandwidth-probe
wall clock time, T_bbr, to be:</t>
              <ul spacing="normal">
                <li>
                  <t>Higher than 2 sec to try to avoid causing loss for a long enough time to
allow Reno flow with RTT=30ms to get 25Mbps (4K video) throughput. For this
workload, given the Reno sawtooth that raises cwnd from roughly BDP to 2*BDP,
one SMSS per round trip,  the inter-bandwidth-probe time must be at least:
BDP * RTT = 25Mbps * .030 sec / (1514 bytes) * 0.030 sec = 1.9secs</t>
                </li>
                <li>
                  <t>Lower than 3 sec to ensure flows can start probing in a reasonable amount
of time to discover unutilized bw on human-scale interactive  time-scales
(e.g. perhaps traffic from a competing web page download is now complete).</t>
                </li>
              </ul>
              <t>The maximum round-trip bounds of the Reno-coexistence time scale, T_reno,
are chosen to be 62-63 with the following considerations in mind:</t>
              <ul spacing="normal">
                <li>
                  <t>Choosing a value smaller than roughly 60 would imply that when BBR flows
coexisted with Reno/CUBIC flows on public Internet broadband links, the
Reno/CUBIC flows would not be able to achieve enough bandwidth to show 4K
video.</t>
                </li>
                <li>
                  <t>Choosing a value that is too large would prevent BBR from reaching its goal
of tolerating 1% loss per round trip.
Given that the steady-state (non-bandwidth-probing) BBR response to
a non-application-limited round trip with X% packet loss is to
reduce the sending rate by X% (see "Updating the Model Upon Packet
Loss" in <xref target="updating-the-model-upon-packet-loss"/>), this means that the
BBR sending rate after N rounds of packet loss at a rate loss_rate
is reduced to (1 - loss_rate)^N.
A simplified model predicts that for a flow that encounters 1% loss
in N=137 round trips of ProbeBW_CRUISE, and then doubles its cwnd
(back to BBR.inflight_hi) in ProbeBW_REFILL and ProbeBW_UP, we
expect that it will be able to restore and reprobe its original
sending rate, since: (1 - loss_rate)^N * 2^2 = (1 - .01)^137 * 2^2
~= 1.01.
That is, we expect the flow will be able to fully respond to packet
loss signals in ProbeBW_CRUISE while also fully re-measuring its
maximum achievable throughput in ProbeBW_UP.
However, with a larger number of round trips of ProbeBW_CRUISE, the
flow would not be able to sustain its achievable throughput.</t>
                </li>
              </ul>
              <t>The resulting behavior is that for BBR flows with small BDPs, the bandwidth
probing will be on roughly the same time scale as Reno/CUBIC; flows with
large BDPs will intentionally probe more rapidly/frequently than Reno/CUBIC
would (roughly every 62 round trips for low-RTT flows, or 2-3 secs for high-RTT
flows).</t>
              <t>The considerations above for timing bandwidth probing can be implemented
as follows:</t>
              <artwork><![CDATA[
  /* Is it time to transition from DOWN or CRUISE to REFILL? */
  BBRIsTimeToProbeBW():
    if (BBRHasElapsedInPhase(BBR.bw_probe_wait) ||
        BBRIsRenoCoexistenceProbeTime())
      BBRStartProbeBW_REFILL()
      return true
    return false

  /* Randomized decision about how long to wait until
   * probing for bandwidth, using round count and wall clock.
   */
  BBRPickProbeWait():
    /* Decide random round-trip bound for wait: */
    BBR.rounds_since_bw_probe =
      random_int_between(0, 1); /* 0 or 1 */
    /* Decide the random wall clock bound for wait: */
    BBR.bw_probe_wait =
      2 + random_float_between(0.0, 1.0) /* 0..1 sec */

  BBRIsRenoCoexistenceProbeTime():
    reno_rounds = BBRTargetInflight()
    rounds = min(reno_rounds, 63)
    return BBR.rounds_since_bw_probe >= rounds

  /* How much data do we want in flight?
   * Our estimated BDP, unless congestion cut cwnd. */
  BBRTargetInflight()
    return min(BBR.bdp, cwnd)
]]></artwork>
            </section>
          </section>
          <section anchor="probebw-algorithm-details">
            <name>ProbeBW Algorithm Details</name>
            <t>BBR's ProbeBW algorithm operates as follows.</t>
            <t>Upon entering ProbeBW, BBR executes:</t>
            <artwork><![CDATA[
  BBREnterProbeBW():
    BBR.cwnd_gain = BBRDefaultCwndGain
    BBRStartProbeBW_DOWN()
]]></artwork>
            <t>The core logic for entering each state:</t>
            <artwork><![CDATA[
  BBRStartProbeBW_DOWN():
    BBRResetCongestionSignals()
    BBR.probe_up_cnt = Infinity /* not growing inflight_hi */
    BBRPickProbeWait()
    BBR.cycle_stamp = Now()  /* start wall clock */
    BBR.ack_phase  = ACKS_PROBE_STOPPING
    BBRStartRound()
    BBR.state = ProbeBW_DOWN

  BBRStartProbeBW_CRUISE():
    BBR.state = ProbeBW_CRUISE

  BBRStartProbeBW_REFILL():
    BBRResetLowerBounds()
    BBR.bw_probe_up_rounds = 0
    BBR.bw_probe_up_acks = 0
    BBR.ack_phase = ACKS_REFILLING
    BBRStartRound()
    BBR.state = ProbeBW_REFILL

  BBRStartProbeBW_UP():
    BBR.ack_phase = ACKS_PROBE_STARTING
    BBRStartRound()
    BBRResetFullBW()
    BBR.full_bw = rs.delivery_rate
    BBR.state = ProbeBW_UP
    BBRRaiseInflightHiSlope()
]]></artwork>
            <t>BBR executes the following BBRUpdateProbeBWCyclePhase() logic on each ACK
that ACKs or SACKs new data, to advance the ProbeBW state machine:</t>
            <artwork><![CDATA[
  /* The core state machine logic for ProbeBW: */
  BBRUpdateProbeBWCyclePhase():
    if (!BBR.full_bw_reached)
      return  /* only handling steady-state behavior here */
    BBRAdaptUpperBounds()
    if (!IsInAProbeBWState())
      return /* only handling ProbeBW states here: */

    switch (state)

    ProbeBW_DOWN:
      if (BBRIsTimeToProbeBW())
        return /* already decided state transition */
      if (BBRIsTimeToCruise())
        BBRStartProbeBW_CRUISE()

    ProbeBW_CRUISE:
      if (BBRIsTimeToProbeBW())
        return /* already decided state transition */

    ProbeBW_REFILL:
      /* After one round of REFILL, start UP */
      if (BBR.round_start)
        BBR.bw_probe_samples = 1
        BBRStartProbeBW_UP()

    ProbeBW_UP:
      if (BBRIsTimeToGoDown())
        BBRStartProbeBW_DOWN()
]]></artwork>
            <t>The ancillary logic to implement the ProbeBW state machine:</t>
            <artwork><![CDATA[
  IsInAProbeBWState()
    state = BBR.state
    return (state == ProbeBW_DOWN or
            state == ProbeBW_CRUISE or
            state == ProbeBW_REFILL or
            state == ProbeBW_UP)

  /* Time to transition from DOWN to CRUISE? */
  BBRIsTimeToCruise():
    if (inflight > BBRInflightWithHeadroom())
      return false /* not enough headroom */
    if (inflight <= BBRInflight(BBR.max_bw, 1.0))
      return true  /* inflight <= estimated BDP */

  /* Time to transition from UP to DOWN? */
  BBRIsTimeToGoDown():
    if (is_cwnd_limited and cwnd >= BBR.inflight_hi)
      BBRResetFullBW()   /* bw is limited by inflight_hi */
      BBR.full_bw = rs.delivery_rate
    else if (BBR.full_bw_now)
      return true  /* we estimate we've fully used path bw */
    return false

  BBRHasElapsedInPhase(interval):
    return Now() > BBR.cycle_stamp + interval

  /* Return a volume of data that tries to leave free
   * headroom in the bottleneck buffer or link for
   * other flows, for fairness convergence and lower
   * RTTs and loss */
  BBRInflightWithHeadroom():
    if (BBR.inflight_hi == Infinity)
      return Infinity
    headroom = max(1*SMSS, BBRHeadroom * BBR.inflight_hi)
    return max(BBR.inflight_hi - headroom,
               BBRMinPipeCwnd)

  /* Raise inflight_hi slope if appropriate. */
  BBRRaiseInflightHiSlope():
    growth_this_round = 1*SMSS << BBR.bw_probe_up_rounds
    BBR.bw_probe_up_rounds = min(BBR.bw_probe_up_rounds + 1, 30)
    BBR.probe_up_cnt = max(cwnd / growth_this_round, 1)

  /* Increase inflight_hi if appropriate. */
  BBRProbeInflightHiUpward():
    if (!is_cwnd_limited or cwnd < BBR.inflight_hi)
      return  /* not fully using inflight_hi, so don't grow it */
   BBR.bw_probe_up_acks += rs.newly_acked
   if (BBR.bw_probe_up_acks >= BBR.probe_up_cnt)
     delta = BBR.bw_probe_up_acks / BBR.probe_up_cnt
     BBR.bw_probe_up_acks -= delta * BBR.bw_probe_up_cnt
     BBR.inflight_hi += delta
   if (BBR.round_start)
     BBRRaiseInflightHiSlope()

  /* Track ACK state and update BBR.max_bw window and
   * BBR.inflight_hi. */
  BBRAdaptUpperBounds():
    if (BBR.ack_phase == ACKS_PROBE_STARTING and BBR.round_start)
      /* starting to get bw probing samples */
      BBR.ack_phase = ACKS_PROBE_FEEDBACK
    if (BBR.ack_phase == ACKS_PROBE_STOPPING and BBR.round_start)
      /* end of samples from bw probing phase */
      if (IsInAProbeBWState() and !rs.is_app_limited)
        BBRAdvanceMaxBwFilter()

    if (!IsInflightTooHigh())
      /* Loss rate is safe. Adjust upper bounds upward. */
      if (BBR.inflight_hi == Infinity)
        return /* no upper bounds to raise */
      if (rs.tx_in_flight > BBR.inflight_hi)
        BBR.inflight_hi = rs.tx_in_flight
      if (BBR.state == ProbeBW_UP)
        BBRProbeInflightHiUpward()
]]></artwork>
          </section>
        </section>
        <section anchor="probertt">
          <name>ProbeRTT</name>
          <section anchor="probertt-overview">
            <name>ProbeRTT Overview</name>
            <t>To help probe for BBR.min_rtt, on an as-needed basis BBR flows enter the
ProbeRTT state to try to cooperate to periodically drain the bottleneck queue,
and thus improve their BBR.min_rtt estimate of the unloaded two-way propagation
delay.</t>
            <t>A critical point is that before BBR raises its BBR.min_rtt
estimate (which would in turn raise its maximum permissible cwnd), it first
enters ProbeRTT to try to make a concerted and coordinated effort to drain
the
bottleneck queue and make a robust BBR.min_rtt measurement. This allows the
BBR.min_rtt estimates of ensembles of BBR flows to converge, avoiding feedback
loops of ever-increasing queues and RTT samples.</t>
            <t>The ProbeRTT state works in concert with BBR.min_rtt estimation. Up to once
every ProbeRTTInterval = 5 seconds, the flow enters ProbeRTT, decelerating
by
setting its cwnd_gain to BBRProbeRTTCwndGain = 0.5 to reduce its volume of
inflight data to half of its estimated BDP, to try to measure the unloaded
two-way propagation delay.</t>
            <t>There are two main motivations for making the MinRTTFilterLen roughly twice
the ProbeRTTInterval. First, this ensures that during a ProbeRTT episode
the
flow will "remember" the BBR.min_rtt value it measured during the previous
ProbeRTT episode, providing a robust BDP estimate for the cwnd = 0.5*BDP
calculation, increasing the likelihood of fully draining the bottleneck
queue. Second, this allows the flow's BBR.min_rtt filter window to generally
include RTT samples from two ProbeTT episodes, providing a more robust
estimate.</t>
            <t>The algorithm for ProbeRTT is as follows:</t>
            <t>Entry conditions: In any state other than ProbeRTT itself, if the
BBR.probe_rtt_min_delay estimate has not been updated (i.e., by getting a
lower
RTT measurement) for more than ProbeRTTInterval = 5 seconds, then BBR enters
ProbeRTT and reduces the BBR.cwnd_gain to BBRProbeRTTCwndGain = 0.5.</t>
            <t>Exit conditions: After maintaining the volume of in-flight data at
BBRProbeRTTCwndGain*BBR.bdp for at least ProbeRTTDuration (200 ms) and at
least
one packet-timed round trip, BBR leaves ProbeRTT and transitions to ProbeBW
if
it estimates the pipe was filled already, or Startup otherwise.</t>
          </section>
          <section anchor="probertt-design-rationale">
            <name>ProbeRTT Design Rationale</name>
            <t>BBR is designed to have ProbeRTT sacrifice no more than roughly 2% of a flow's
available bandwidth. It is also designed to spend the vast majority of its
time (at least roughly 96 percent) in ProbeBW and the rest in ProbeRTT, based
on a set of tradeoffs. ProbeRTT lasts long enough (at least ProbeRTTDuration
= 200 ms) to allow diverse flows (e.g., flows with different RTTs or lower
rates and thus longer inter-packet gaps) to have overlapping ProbeRTT states,
while still being short enough to bound the throughput penalty of ProbeRTT's
cwnd capping to roughly 2%, with the average throughput targeted at:</t>
            <artwork><![CDATA[
  throughput = (200ms*0.5*BBR.bw + (5s - 200ms)*BBR.bw) / 5s
             = (.1s + 4.8s)/5s * BBR.bw = 0.98 * BBR.bw
]]></artwork>
            <t>As discussed above, BBR's BBR.min_rtt filter window, MinRTTFilterLen, and
time interval between ProbeRTT states, ProbeRTTInterval, work in concert.
BBR uses a MinRTTFilterLen equal to or longer than ProbeRTTInterval to allow
the filter window to include at least one ProbeRTT.</t>
            <t>To allow coordination with other BBR flows, each BBR flow MUST use the
standard ProbeRTTInterval of 5 secs.</t>
            <t>A ProbeRTTInterval of 5 secs is short enough to allow quick convergence if
traffic levels or routes change, but long enough so that interactive
applications (e.g., Web, remote procedure calls, video chunks) often have
natural silences or low-rate periods within the window where the flow's rate
is
low enough for long enough to drain its queue in the bottleneck. Then the
BBR.probe_rtt_min_delay filter opportunistically picks up these measurements,
and the BBR.probe_rtt_min_delay estimate refreshes without requiring
ProbeRTT. This way, flows typically need only pay the 2 percent throughput
penalty if there are multiple bulk flows busy sending over the entire
ProbeRTTInterval window.</t>
            <t>As an optimization, when restarting from idle and finding that the
BBR.probe_rtt_min_delay has expired, BBR does not enter ProbeRTT; the idleness
is deemed a sufficient attempt to coordinate to drain the queue.</t>
          </section>
          <section anchor="calculating-the-rsrtt-rtt-sample">
            <name>Calculating the rs.rtt RTT Sample</name>
            <t>Upon transmitting each packet, BBR (or the associated transport protocol)
stores in per-packet data the wall-clock scheduled transmission time of the
packet in packet.departure_time (see "Pacing Rate: BBR.pacing_rate" in
<xref target="pacing-rate-bbrpacingrate"/> for how this is calculated).</t>
            <t>For every ACK that newly acknowledges some data (whether cumulatively or
selectively), the sender's BBR implementation (or the associated transport
protocol implementation) attempts to calculate an RTT sample. The sender MUST
consider any potential retransmission ambiguities that can arise in some
transport protocols. If some of the acknowledged data was not retransmitted, or
some of the data was retransmitted but the sender can still unambiguously
determine the RTT of the data (e.g. if the transport supports <xref target="RFC7323"/> TCP
timestamps or an equivalent mechanism), then the sender calculates an RTT
sample, rs.rtt, as follows:</t>
            <artwork><![CDATA[
  rs.rtt = Now() - packet.departure_time
]]></artwork>
          </section>
          <section anchor="probertt-logic">
            <name>ProbeRTT Logic</name>
            <t>On every ACK BBR executes BBRUpdateMinRTT() to update its ProbeRTT scheduling
state (BBR.probe_rtt_min_delay and BBR.probe_rtt_min_stamp) and its BBR.min_rtt
estimate:</t>
            <artwork><![CDATA[
  BBRUpdateMinRTT()
    BBR.probe_rtt_expired =
      Now() > BBR.probe_rtt_min_stamp + ProbeRTTInterval
    if (rs.rtt >= 0 and
        (rs.rtt < BBR.probe_rtt_min_delay or
         BBR.probe_rtt_expired))
       BBR.probe_rtt_min_delay = rs.rtt
       BBR.probe_rtt_min_stamp = Now()

    min_rtt_expired =
      Now() > BBR.min_rtt_stamp + MinRTTFilterLen
    if (BBR.probe_rtt_min_delay < BBR.min_rtt or
        min_rtt_expired)
      BBR.min_rtt       = BBR.probe_rtt_min_delay
      BBR.min_rtt_stamp = BBR.probe_rtt_min_stamp
]]></artwork>
            <t>Here BBR.probe_rtt_expired is a boolean recording whether the
BBR.probe_rtt_min_delay has expired and is due for a refresh, via either an
application idle period or a transition into ProbeRTT state.</t>
            <t>On every ACK BBR executes BBRCheckProbeRTT() to handle the steps related
to the ProbeRTT state as follows:</t>
            <artwork><![CDATA[
  BBRCheckProbeRTT():
    if (BBR.state != ProbeRTT and
        BBR.probe_rtt_expired and
        not BBR.idle_restart)
      BBREnterProbeRTT()
      BBRSaveCwnd()
      BBR.probe_rtt_done_stamp = 0
      BBR.ack_phase = ACKS_PROBE_STOPPING
      BBRStartRound()
    if (BBR.state == ProbeRTT)
      BBRHandleProbeRTT()
    if (rs.delivered > 0)
      BBR.idle_restart = false

  BBREnterProbeRTT():
    BBR.state = ProbeRTT
    BBR.pacing_gain = 1
    BBR.cwnd_gain = BBRProbeRTTCwndGain  /* 0.5 */

  BBRHandleProbeRTT():
    /* Ignore low rate samples during ProbeRTT: */
    MarkConnectionAppLimited()
    if (BBR.probe_rtt_done_stamp == 0 and
        C.pipe <= BBRProbeRTTCwnd())
      /* Wait for at least ProbeRTTDuration to elapse: */
      BBR.probe_rtt_done_stamp =
        Now() + ProbeRTTDuration
      /* Wait for at least one round to elapse: */
      BBR.probe_rtt_round_done = false
      BBRStartRound()
    else if (BBR.probe_rtt_done_stamp != 0)
      if (BBR.round_start)
        BBR.probe_rtt_round_done = true
      if (BBR.probe_rtt_round_done)
        BBRCheckProbeRTTDone()

  BBRCheckProbeRTTDone():
    if (BBR.probe_rtt_done_stamp != 0 and
        Now() > BBR.probe_rtt_done_stamp)
      /* schedule next ProbeRTT: */
      BBR.probe_rtt_min_stamp = Now()
      BBRRestoreCwnd()
      BBRExitProbeRTT()

  MarkConnectionAppLimited():
    C.app_limited =
      (C.delivered + C.pipe) ? : 1
]]></artwork>
          </section>
          <section anchor="exiting-probertt">
            <name>Exiting ProbeRTT</name>
            <t>When exiting ProbeRTT, BBR transitions to ProbeBW if it estimates the pipe
was filled already, or Startup otherwise.</t>
            <t>When transitioning out of ProbeRTT, BBR calls BBRResetLowerBounds() to reset
the lower bounds, since any congestion encountered in ProbeRTT may have pulled
the short-term model far below the capacity of the path.</t>
            <t>But the algorithm is cautious in timing the next bandwidth probe: raising
inflight after ProbeRTT may cause loss, so the algorithm resets the
bandwidth-probing clock by starting the cycle at ProbeBW_DOWN(). But then as an
optimization, since the connection is exiting ProbeRTT, we know that infligh is
already below the estimated BDP, so the connection can proceed immediately to
ProbeBW_CRUISE.</t>
            <t>To summarize, the logic for exiting ProbeRTT is as follows:</t>
            <artwork><![CDATA[
  BBRExitProbeRTT():
    BBRResetLowerBounds()
    if (BBR.full_bw_reached)
      BBRStartProbeBW_DOWN()
      BBRStartProbeBW_CRUISE()
    else
      BBREnterStartup()
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="restarting-from-idle">
        <name>Restarting From Idle</name>
        <section anchor="actions-when-restarting-from-idle">
          <name>Actions when Restarting from Idle</name>
          <t>When restarting from idle in ProbeBW states, BBR leaves its cwnd as-is and
paces packets at exactly BBR.bw, aiming to return as quickly as possible
to its
target operating point of rate balance and a full pipe. Specifically, if
the
flow's BBR.state is ProbeBW, and the flow is application-limited, and there
are
no packets in flight currently, then before the flow sends one or more packets
BBR sets BBR.pacing_rate to exactly BBR.bw.</t>
          <t>Also, when restarting from idle BBR checks to see if the connection is in
ProbeRTT and has met the exit conditions for ProbeRTT. If a connection goes
idle during ProbeRTT then often it will have met those exit conditions by
the
time it restarts, so that the connection can restore the cwnd to its full
value
before it starts transmitting a new flight of data.</t>
          <t>More precisely, the BBR algorithm takes the following steps in
BBRHandleRestartFromIdle() before sending a packet for a flow:</t>
          <artwork><![CDATA[
  BBRHandleRestartFromIdle():
    if (C.pipe == 0 and C.app_limited)
      BBR.idle_restart = true
      BBR.extra_acked_interval_start = Now()
      if (IsInAProbeBWState())
        BBRSetPacingRateWithGain(1)
      else if (BBR.state == ProbeRTT)
        BBRCheckProbeRTTDone()
]]></artwork>
        </section>
        <section anchor="previous-idle-restart">
          <name>Comparison with Previous Approaches</name>
          <t>The "Restarting Idle Connections" section of <xref target="RFC5681"/> suggests restarting
from idle by slow-starting from the initial window. However, this approach was
assuming a congestion control algorithm that had no estimate of the bottleneck
bandwidth and no pacing, and thus resorted to relying on slow-starting driven
by an ACK clock. The long (log_2(BDP)*RTT) delays required to reach full
utilization with that "slow start after idle" approach caused many large
deployments to disable this mechanism, resulting in a "BDP-scale line-rate
burst" approach instead. Instead of these two approaches, BBR restarts by
pacing at BBR.bw, typically achieving approximate rate balance and a full pipe
after only one BBR.min_rtt has elapsed.</t>
        </section>
      </section>
      <section anchor="updating-network-path-model-parameters">
        <name>Updating Network Path Model Parameters</name>
        <t>BBR is a model-based congestion control algorithm: it is based on an explicit
model of the network path over which a transport flow travels. The following
is a summary of each parameter, including its meaning and how the algorithm
calculates and uses its value. We can group the parameter into three groups:</t>
        <ul spacing="normal">
          <li>
            <t>core state machine parameters</t>
          </li>
          <li>
            <t>parameters to model the data rate</t>
          </li>
          <li>
            <t>parameters to model the volume of in-flight data</t>
          </li>
        </ul>
        <section anchor="bbrroundcount-tracking-packet-timed-round-trips">
          <name>BBR.round_count: Tracking Packet-Timed Round Trips</name>
          <t>Several aspects of BBR depend on counting the progress of "packet-timed"
round trips, which start at the transmission of some segment, and then end
at
the acknowledgement of that segment. BBR.round_count is a count of the number
of these "packet-timed" round trips elapsed so far. BBR uses this virtual
BBR.round_count because it is more robust than using wall clock time. In
particular, arbitrary intervals of wall clock time can elapse due to
application idleness, variations in RTTs, or timer delays for retransmission
timeouts, causing wall-clock-timed model parameter estimates to "time out"
or
to be "forgotten" too quickly to provide robustness.</t>
          <t>BBR counts packet-timed round trips by recording state about a sentinel packet,
and waiting for an ACK of any data packet that was sent after that sentinel
packet, using the following pseudocode:</t>
          <t>Upon connection initialization:</t>
          <artwork><![CDATA[
  BBRInitRoundCounting():
    BBR.next_round_delivered = 0
    BBR.round_start = false
    BBR.round_count = 0
]]></artwork>
          <t>Upon sending each packet, the rate estimation algorithm in
<xref target="delivery-rate-samples"/> records the amount of data thus far
acknowledged as delivered:</t>
          <artwork><![CDATA[
  packet.delivered = C.delivered
]]></artwork>
          <t>Upon receiving an ACK for a given data packet, the rate estimation algorithm
in <xref target="delivery-rate-samples"/> updates the amount of data thus far
acknowledged as delivered:</t>
          <artwork><![CDATA[
    C.delivered += packet.size
]]></artwork>
          <t>Upon receiving an ACK for a given data packet, the BBR algorithm first executes
the following logic to see if a round trip has elapsed, and if so, increment
the count of such round trips elapsed:</t>
          <artwork><![CDATA[
  BBRUpdateRound():
    if (packet.delivered >= BBR.next_round_delivered)
      BBRStartRound()
      BBR.round_count++
      BBR.rounds_since_bw_probe++
      BBR.round_start = true
    else
      BBR.round_start = false

  BBRStartRound():
    BBR.next_round_delivered = C.delivered
]]></artwork>
        </section>
        <section anchor="bbrmaxbw-estimated-maximum-bandwidth">
          <name>BBR.max_bw: Estimated Maximum Bandwidth</name>
          <t>BBR.max_bw is BBR's estimate of the maximum bottleneck bandwidth available to
data transmissions for the transport flow. At any time, a transport
connection's data transmissions experience some slowest link or bottleneck. The
bottleneck's delivery rate determines the connection's maximum data-delivery
rate. BBR tries to closely match its sending rate to this bottleneck delivery
rate to help seek "rate balance", where the flow's packet arrival rate at the
bottleneck equals the departure rate. The bottleneck rate varies over the life
of a connection, so BBR continually estimates BBR.max_bw using recent signals.</t>
          <section anchor="delivery-rate-samples">
            <name>Delivery Rate Samples</name>
            <t>This section describes a generic algorithm for a transport protocol sender to
estimate the current delivery rate of its data on the fly. This technique is
used by BBR to get fresh, reliable, and inexpensive delivery rate information.</t>
            <t>At a high level, the algorithm estimates the rate at which the network
delivered the most recent flight of outbound data packets for a single flow. In
addition, it tracks whether the rate sample was application-limited, meaning
the transmission rate was limited by the sending application rather than the
congestion control algorithm.</t>
            <t>Each acknowledgment that cumulatively or selectively acknowledges that the
network has delivered new data produces a rate sample which records the amount
of data delivered over the time interval between the transmission of a data
packet and the acknowledgment of that packet. The samples reflect the recent
goodput through some bottleneck, which may reside either in the network or
on the end hosts (sender or receiver).</t>
          </section>
          <section anchor="delivery-rate-sampling-algorithm-overview">
            <name>Delivery Rate Sampling Algorithm Overview</name>
            <section anchor="requirements">
              <name>Requirements</name>
              <t>This algorithm can be implemented in any transport protocol that supports
packet-delivery acknowledgment (so far, implementations are available for TCP
<xref target="RFC9293"/> and QUIC <xref target="RFC9000"/>). This algorithm requires a small amount of
added logic on the sender, and requires that the sender maintain a small amount
of additional per-packet state for packets sent but not yet delivered. In the
most general case it requires high-precision (microsecond-granularity or
better) timestamps on the sender (though millisecond-granularity may suffice
for lower bandwidths).  It does not require any receiver or network
changes. While selective acknowledgments for out-of-order data (e.g.,
<xref target="RFC2018"/>) are not required, such a mechanism is highly recommended for
accurate estimation during reordering and loss recovery phases.</t>
            </section>
            <section anchor="estimating-delivery-rate">
              <name>Estimating Delivery Rate</name>
              <t>A delivery rate sample records the estimated rate at which the network delivered
packets for a single flow, calculated over the time interval between the
transmission of a data packet and the acknowledgment of that packet. Since
the rate samples only include packets actually cumulatively and/or selectively
acknowledged, the sender knows the exact octets that were delivered to the
receiver (not lost), and the sender can compute an estimate of a bottleneck
delivery rate over that time interval.</t>
              <t>The amount of data delivered MAY be tracked in units of either octets or
packets. Tracking data in units of octets is more accurate, since packet
sizes can vary. But for some purposes, including congestion control, tracking
data in units of packets may suffice.</t>
              <section anchor="ack-rate">
                <name>ACK Rate</name>
                <t>First, consider the rate at which data is acknowledged by the receiver. In
this algorithm, the computation of the ACK rate models the average slope
of a hypothetical "delivered" curve that tracks the cumulative quantity of
data delivered so far on the Y axis, and time elapsed on the X axis. Since
ACKs arrive in discrete events, this "delivered" curve forms a step function,
where each ACK causes a discrete increase in the "delivered" count that causes
a vertical upward step up in the curve. This "ack_rate" computation is the
average slope of the "delivered" step function, as measured from the "knee"
of the step (ACK) preceding the transmit to the "knee" of the step (ACK)
for packet P.</t>
                <t>Given this model, the ack rate sample "slope" is computed as the ratio between
the amount of data marked as delivered over this time interval, and the time
over which it is marked as delivered:</t>
                <artwork><![CDATA[
  ack_rate = data_acked / ack_elapsed
]]></artwork>
                <t>To calculate the amount of data ACKed over the interval, the sender records in
per-packet state "P.delivered", the amount of data that had been marked
delivered before transmitting packet P, and then records how much data had been
marked delivered by the time the ACK for the packet arrives (in "C.delivered"),
and computes the difference:</t>
                <artwork><![CDATA[
  data_acked = C.delivered - P.delivered
]]></artwork>
                <t>To compute the time interval, "ack_elapsed", one might imagine that it would
be feasible to use the round-trip time (RTT) of the packet. But it is not
safe to simply calculate a bandwidth estimate by using the time between the
transmit of a packet and the acknowledgment of that packet. Transmits and
ACKs can happen out of phase with each other, clocked in separate processes.
In general, transmissions often happen at some point later than the most
recent ACK, due to processing or pacing delays. Because of this effect, drastic
over-estimates can happen if a sender were to attempt to estimate bandwidth
by using the round-trip time.</t>
                <t>The following approach computes "ack_elapsed". The starting time is
"P.delivered_time", the time of the delivery curve "knee" from the ACK
preceding the transmit.  The ending time is "C.delivered_time", the time of the
delivery curve "knee" from the ACK for P. Then we compute "ack_elapsed" as:</t>
                <artwork><![CDATA[
  ack_elapsed = C.delivered_time - P.delivered_time
]]></artwork>
                <t>This yields our equation for computing the ACK rate, as the "slope" from
the "knee" preceding the transmit to the "knee" at ACK:</t>
                <artwork><![CDATA[
  ack_rate = data_acked / ack_elapsed
  ack_rate = (C.delivered - P.delivered) /
             (C.delivered_time - P.delivered_time)
]]></artwork>
              </section>
              <section anchor="compression-and-aggregation">
                <name>Compression and Aggregation</name>
                <t>For computing the delivery_rate, the sender prefers ack_rate, the rate at which
packets were acknowledged, since this usually the most reliable metric.
However, this approach of directly using "ack_rate" faces a challenge when used
with paths featuring aggregation, compression, or ACK decimation, which are
prevalent <xref target="A15"/>.  In such cases, ACK arrivals can temporarily make it appear
as if data packets were delivered much faster than the bottleneck rate. To
filter out such implausible ack_rate samples, we consider the send rate for
each flight of data, as follows.</t>
              </section>
              <section anchor="send-rate">
                <name>Send Rate</name>
                <t>The sender calculates the send rate, "send_rate", for a flight of data as
follows. Define "P.first_sent_time" as the time of the first send in a flight
of data, and "P.sent_time" as the time the final send in that flight of data
(the send that transmits packet "P"). The elapsed time for sending the flight
is:</t>
                <artwork><![CDATA[
  send_elapsed = (P.sent_time - P.first_sent_time)
]]></artwork>
                <t>Then we calculate the send_rate as:</t>
                <artwork><![CDATA[
  send_rate = data_acked / send_elapsed
]]></artwork>
                <t>Using our "delivery" curve model above, the send_rate can be viewed as the
average slope of a "send" curve that traces the amount of data sent on the Y
axis, and the time elapsed on the X axis: the average slope of the transmission
of this flight of data.</t>
              </section>
              <section anchor="delivery-rate">
                <name>Delivery Rate</name>
                <t>Since it is physically impossible to have data delivered faster than it is
sent in a sustained fashion, when the estimator notices that the ack_rate
for a flight is faster than the send rate for the flight, it filters out
the implausible ack_rate by capping the delivery rate sample to be no higher
than the send rate.</t>
                <t>More precisely, over the interval between each transmission and corresponding
ACK, the sender calculates a delivery rate sample, "delivery_rate", using
the minimum of the rate at which packets were acknowledged or the rate at
which they were sent:</t>
                <artwork><![CDATA[
  delivery_rate = min(send_rate, ack_rate)
]]></artwork>
                <t>Since ack_rate and send_rate both have data_acked as a numerator, this can
be computed more efficiently with a single division (instead of two), as
follows:</t>
                <artwork><![CDATA[
  delivery_elapsed = max(ack_elapsed, send_elapsed)
  delivery_rate = data_acked / delivery_elapsed
]]></artwork>
              </section>
            </section>
            <section anchor="tracking-application-limited-phases">
              <name>Tracking application-limited phases</name>
              <t>In application-limited phases the transmission rate is limited by the
sending application rather than the congestion control algorithm. Modern
transport protocol connections are often application-limited, either due
to
request/response workloads (e.g., Web traffic, RPC traffic) or because the
sender transmits data in chunks (e.g., adaptive streaming video).</t>
              <t>Knowing whether a delivery rate sample was application-limited is crucial
for congestion control algorithms and applications to use the estimated delivery
rate samples properly. For example, congestion control algorithms likely
do not want to react to a delivery rate that is lower simply because the
sender is application-limited; for congestion control the key metric is the
rate at which the network path can deliver data, and not simply the rate
at which the application happens to be transmitting data at any moment.</t>
              <t>To track this, the estimator marks a bandwidth sample as application-limited
if there was some moment during the sampled flight of data packets when there
was no data ready to send.</t>
              <t>The algorithm detects that an application-limited phase has started when
the
sending application requests to send new data, or the connection's
retransmission mechanisms decide to retransmit data, and the connection meets
all of the following conditions:</t>
              <ol spacing="normal" type="1"><li>
                  <t>The transport send buffer has less than one SMSS of unsent data available
  to send.</t>
                </li>
                <li>
                  <t>The sending flow is not currently in the process of transmitting a packet.</t>
                </li>
                <li>
                  <t>The amount of data considered in flight is less than the congestion window
  (cwnd).</t>
                </li>
                <li>
                  <t>All the packets considered lost have been retransmitted.</t>
                </li>
              </ol>
              <t>If these conditions are all met then the sender has run out of data to feed the
network. This would effectively create a "bubble" of idle time in the data
pipeline. This idle time means that any delivery rate sample obtained from this
data packet, and any rate sample from a packet that follows it in the next
round trip, is going to be an application-limited sample that potentially
underestimates the true available bandwidth. Thus, when the algorithm marks a
transport flow as application-limited, it marks all bandwidth samples for the
next round trip as application-limited (at which point, the "bubble" can be
said to have exited the data pipeline).</t>
              <section anchor="considerations-related-to-receiver-flow-control-limits">
                <name>Considerations Related to Receiver Flow Control Limits</name>
                <t>In some cases receiver flow control limits (such as the TCP <xref target="RFC9293"/>
advertised receive window, RCV.WND) are the factor limiting the
delivery
rate. This algorithm treats cases where the delivery rate was constrained
by such conditions the same as it treats cases where the delivery rate is
constrained by in-network bottlenecks. That is, it treats receiver bottlenecks
the same as network bottlenecks. This has a conceptual symmetry and has worked
well in practice for congestion control and telemetry purposes.</t>
              </section>
            </section>
          </section>
          <section anchor="detailed-delivery-rate-sampling-algorithm">
            <name>Detailed Delivery Rate Sampling Algorithm</name>
            <section anchor="variables">
              <name>Variables</name>
              <section anchor="per-connection-c-state">
                <name>Per-connection (C) state</name>
                <t>This algorithm requires the following new state variables for each transport
connection:</t>
                <t>C.delivered: The total amount of data (measured in octets or in packets)
delivered so far over the lifetime of the transport connection. This does
not include pure ACK packets.</t>
                <t>C.delivered_time: The wall clock time when C.delivered was last updated.</t>
                <t>C.first_sent_time: If packets are in flight, then this holds the send time of
the packet that was most recently marked as delivered. Else, if the connection
was recently idle, then this holds the send time of most recently sent packet.</t>
                <t>C.app_limited: The index of the last transmitted packet marked as
application-limited, or 0 if the connection is not currently
application-limited.</t>
                <t>We also assume that the transport protocol sender implementation tracks the
following state per connection. If the following state variables are not
tracked by an existing implementation, all the following parameters MUST
be tracked to implement this algorithm:</t>
                <t>C.write_seq: The data sequence number one higher than that of the last octet
queued for transmission in the transport layer write buffer.</t>
                <t>C.pending_transmissions: The number of bytes queued for transmission on the
sending host at layers lower than the transport layer (i.e. network layer,
traffic shaping layer, network device layer).</t>
                <t>C.lost_out: The number of packets in the current outstanding window that
are marked as lost.</t>
                <t>C.retrans_out: The number of packets in the current outstanding window that
are being retransmitted.</t>
                <t>C.pipe: The sender's estimate of the amount of data outstanding in the network
(measured in octets or packets). This includes data packets in the current
outstanding window that are being transmitted or retransmitted and have not
been SACKed or marked lost (e.g. "pipe" from <xref target="RFC6675"/>).
This does not include pure ACK packets.</t>
              </section>
              <section anchor="per-packet-p-state">
                <name>Per-packet (P) state</name>
                <t>This algorithm requires the following new state variables for each packet
that has been transmitted but not yet ACKed or SACKed:</t>
                <t>P.delivered: C.delivered when the packet was sent from transport connection
C.</t>
                <t>P.delivered_time: C.delivered_time when the packet was sent.</t>
                <t>P.first_sent_time: C.first_sent_time when the packet was sent.</t>
                <t>P.is_app_limited: true if C.app_limited was non-zero when the packet was
sent, else false.</t>
                <t>P.sent_time: The time when the packet was sent.</t>
              </section>
              <section anchor="rate-sample-rs-output">
                <name>Rate Sample (rs) Output</name>
                <t>This algorithm provides its output in a RateSample structure rs, containing
the following fields:</t>
                <t>rs.delivery_rate: The delivery rate sample (in most cases rs.delivered /
rs.interval).</t>
                <t>rs.is_app_limited: The P.is_app_limited from the most recent packet delivered;
indicates whether the rate sample is application-limited.</t>
                <t>rs.interval: The length of the sampling interval.</t>
                <t>rs.delivered: The amount of data marked as delivered over the sampling interval.</t>
                <t>rs.prior_delivered: The P.delivered count from the most recent packet delivered.</t>
                <t>rs.prior_time: The P.delivered_time from the most recent packet delivered.</t>
                <t>rs.send_elapsed: Send time interval calculated from the most recent packet
delivered (see the "Send Rate" section above).</t>
                <t>rs.ack_elapsed: ACK time interval calculated from the most recent packet
delivered (see the "ACK Rate" section above).</t>
              </section>
            </section>
            <section anchor="transmitting-or-retransmitting-a-data-packet">
              <name>Transmitting or retransmitting a data packet</name>
              <t>Upon transmitting or retransmitting a data packet, the sender snapshots the
current delivery information in per-packet state. This will allow the sender
to generate a rate sample later, in the UpdateRateSample() step, when the
packet is (S)ACKed.</t>
              <t>If there are packets already in flight, then we need to start delivery rate
samples from the time we received the most recent ACK, to try to ensure that
we include the full time the network needs to deliver all in-flight packets.
If there are no packets in flight yet, then we can start the delivery rate
interval at the current time, since we know that any ACKs after now indicate
that the network was able to deliver those  packets completely in the sampling
interval between now and the next ACK.</t>
              <t>After each packet transmission, the sender executes the following steps:</t>
              <artwork><![CDATA[
  SendPacket(Packet P):
    if (SND.NXT == SND.UNA)  /* no packets in flight yet? */
      C.first_sent_time  = C.delivered_time = P.sent_time

    P.first_sent_time = C.first_sent_time
    P.delivered_time  = C.delivered_time
    P.delivered       = C.delivered
    P.is_app_limited  = (C.app_limited != 0)
]]></artwork>
            </section>
            <section anchor="upon-receiving-an-ack">
              <name>Upon receiving an ACK</name>
              <t>When an ACK arrives, the sender invokes GenerateRateSample() to fill in a
rate sample. For each  packet that was newly SACKed or ACKed, UpdateRateSample()
updates the rate sample based on a snapshot of connection delivery information
from the time at which the packet was last transmitted. UpdateRateSample()
is invoked multiple times when a stretched ACK acknowledges multiple data
packets. In this case we use the information from the most recently sent
packet, i.e., the packet with the highest "P.delivered" value.</t>
              <artwork><![CDATA[
  /* Upon receiving ACK, fill in delivery rate sample rs. */
  GenerateRateSample(RateSample rs):
    for each newly SACKed or ACKed packet P
      UpdateRateSample(P, rs)

    /* Clear app-limited field if bubble is ACKed and gone. */
    if (C.app_limited and C.delivered > C.app_limited)
      C.app_limited = 0

    if (rs.prior_time == 0)
      return false  /* nothing delivered on this ACK */

    /* Use the longer of the send_elapsed and ack_elapsed */
    rs.interval = max(rs.send_elapsed, rs.ack_elapsed)

    rs.delivered = C.delivered - rs.prior_delivered

    /* Normally we expect interval >= MinRTT.
     * Note that rate may still be overestimated when a spuriously
     * retransmitted skb was first (s)acked because "interval"
     * is under-estimated (up to an RTT). However, continuously
     * measuring the delivery rate during loss recovery is crucial
     * for connections that suffer heavy or prolonged losses.
     */
    if (rs.interval <  MinRTT(tp))
      rs.interval = -1
      return false  /* no reliable sample */

    if (rs.interval != 0)
      rs.delivery_rate = rs.delivered / rs.interval

    return true;  /* we filled in rs with a rate sample */

  /* Update rs when a packet is SACKed or ACKed. */
  UpdateRateSample(Packet P, RateSample rs):
    if (P.delivered_time == 0)
      return /* P already SACKed */

    C.delivered += P.data_length
    C.delivered_time = Now()

    /* Update info using the newest packet: */
    if (!rs.has_data or IsNewestPacket(P, rs))
      rs.has_data         = true
      rs.prior_delivered  = P.delivered
      rs.prior_time       = P.delivered_time
      rs.is_app_limited   = P.is_app_limited
      rs.send_elapsed     = P.sent_time - P.first_sent_time
      rs.ack_elapsed      = C.delivered_time - P.delivered_time
      rs.last_end_seq     = P.end_seq
      C.first_sent_time   = P.sent_time

    /* Mark the packet as delivered once it's SACKed to
     * avoid being used again when it's cumulatively acked.
     */
    P.delivered_time = 0

  /* Is the given Packet the most recently sent packet
   * that has been delivered? */
  IsNewestPacket(Packet P, RateSample rs):
    return (P.sent_time > C.first_sent_time or
            (P.sent_time == C.first_sent_time and
             after(P.end_seq, rs.last_end_seq))
]]></artwork>
            </section>
            <section anchor="detecting-application-limited-phases">
              <name>Detecting application-limited phases</name>
              <t>An application-limited phase starts when the connection decides to send more
data, at a point in time when the connection had previously run out of data.
Some decisions to send more data are triggered by the application writing
more
data to the connection, and some are triggered by loss detection (during
ACK
processing or upon the triggering of a timer) estimating that some sequence
ranges need to be retransmitted. To detect all such cases, the algorithm
calls
CheckIfApplicationLimited() to check for application-limited behavior in
the
following situations:</t>
              <ul spacing="normal">
                <li>
                  <t>The sending application asks the transport layer to send more data; i.e.,
upon each write from the application, before new application data is enqueued
in the transport send buffer or transmitted.</t>
                </li>
                <li>
                  <t>At the beginning of ACK processing, before updating the estimated number
of packets in flight, and before congestion control modifies the cwnd or
pacing rate.</t>
                </li>
                <li>
                  <t>At the beginning of connection timer processing, for all timers that might
result in the transmission of one or more data segments. For example: RTO
timers, TLP timers, RACK reordering timers, or Zero Window Probe timers.</t>
                </li>
              </ul>
              <t>When checking for application-limited behavior, the connection checks all the
conditions previously described in the "Tracking application-limited phases"
section, and if all are met then it marks the connection as
application-limited:</t>
              <artwork><![CDATA[
  CheckIfApplicationLimited():
    if (C.write_seq - SND.NXT < SND.MSS and
        C.pending_transmissions == 0 and
        C.pipe < cwnd and
        C.lost_out <= C.retrans_out)
      C.app_limited = (C.delivered + C.pipe) ? : 1
]]></artwork>
            </section>
          </section>
          <section anchor="delivery-rate-sampling-discussion">
            <name>Delivery Rate Sampling Discussion</name>
            <section anchor="offload-mechanisms">
              <name>Offload Mechanisms</name>
              <t>If a transport sender implementation uses an offload mechanism (such as TSO,
GSO, etc.) to combine multiple SMSS of data into a single packet "aggregate"
for the purposes of scheduling transmissions, then it is RECOMMENDED that
the per-packet state be tracked for each packet "aggregate" rather than each
SMSS. For simplicity this document refers to such state as "per-packet",
whether it is per "aggregate" or per SMSS.</t>
            </section>
            <section anchor="impact-of-ack-losses">
              <name>Impact of ACK losses</name>
              <t>Delivery rate samples are generated upon receiving each ACK; ACKs may contain
both cumulative and selective acknowledgment information. Losing an ACK results
in losing the delivery rate sample corresponding to that ACK, and generating a
delivery rate sample at later a time (upon the arrival of the next ACK). This
can underestimate the delivery rate due the artificially inflated
"rs.interval". The impact of this effect is mitigated using the BBR.max_bw
filter.</t>
            </section>
            <section anchor="impact-of-packet-reordering">
              <name>Impact of packet reordering</name>
              <t>This algorithm is robust to packet reordering; it makes no assumptions about
the order in which packets are delivered or ACKed. In particular, for a
particular packet P, it does not matter which packets are delivered between the
transmission of P and the ACK of packet P, since C.delivered will be
incremented appropriately in any case.</t>
            </section>
            <section anchor="impact-of-packet-loss-and-retransmissions">
              <name>Impact of packet loss and retransmissions</name>
              <t>There are several possible approaches for handling cases where a delivery
rate sample is based on an ACK or SACK for a retransmitted packet.</t>
              <t>If the transport protocol supports unambiguous ACKs for retransmitted data
sequence ranges (as in QUIC <xref target="RFC9000"/>) then the algorithm is perfectly robust
to retransmissions, because the starting packet, P, for the sample can be
unambiguously retrieved.</t>
              <t>If the transport protocol, like TCP <xref target="RFC9293"/>, has ambiguous ACKs for
retransmitted sequence ranges, then the following approaches MAY be used:</t>
              <ol spacing="normal" type="1"><li>
                  <t>The sender MAY choose to filter out implausible delivery rate samples, as
  described in the GenerateRateSample() step in the "Upon receiving an ACK"
  section, by discarding samples whose rs.interval is lower than the minimum
  RTT seen on the connection.</t>
                </li>
                <li>
                  <t>The sender MAY choose to skip the generation of a delivery rate sample for
  a retransmitted sequence range.</t>
                </li>
              </ol>
            </section>
            <section anchor="connections-without-sack-support">
              <name>Connections without SACK support</name>
              <t>If the transport connection does not use SACK (i.e., either or both ends of the
connections do not accept SACK), then this algorithm can be extended to
estimate approximate delivery rates using duplicate ACKs (much like Reno and
<xref target="RFC5681"/> estimates that each duplicate ACK indicates that a data packet has
been delivered).</t>
            </section>
          </section>
        </section>
        <section anchor="bbrmaxbw-max-filter">
          <name>BBR.max_bw Max Filter</name>
          <t>Delivery rate samples are often below the typical bottleneck bandwidth
available to the flow, due to "noise" introduced by random variation in
physical transmission processes (e.g. radio link layer noise) or queues or
along the network path.  To filter these effects BBR uses a max filter: BBR
estimates BBR.max_bw using the windowed maximum recent delivery rate sample
seen by the connection over recent history.</t>
          <t>The BBR.max_bw max filter window covers a time period extending over the
past two ProbeBW cycles. The BBR.max_bw max filter window length is driven
by trade-offs among several considerations:</t>
          <ul spacing="normal">
            <li>
              <t>It is long enough to cover at least one entire ProbeBW cycle (see the
"ProbeBW" section). This ensures that the window contains at least some
delivery rate samples that are the result of data transmitted with a
super-unity pacing_gain (a pacing_gain larger than 1.0). Such super-unity
delivery rate samples are instrumental in revealing the path's underlying
available bandwidth even when there is noise from delivery rate shortfalls
due to aggregation delays, queuing delays from variable cross-traffic, lossy
link layers with uncorrected losses, or short-term buffer exhaustion (e.g.,
brief coincident bursts in a shallow buffer).</t>
            </li>
            <li>
              <t>It aims to be long enough to cover short-term fluctuations in the network's
delivery rate due to the aforementioned sources of noise. In particular, the
delivery rate for radio link layers (e.g., wifi and cellular technologies)
can be highly variable, and the filter window needs to be long enough to
remember "good" delivery rate samples in order to be robust to such
variations.</t>
            </li>
            <li>
              <t>It aims to be short enough to respond in a timely manner to sustained
reductions in the bandwidth available to a flow, whether this is because
other flows are using a larger share of the bottleneck, or the bottleneck
link service rate has reduced due to layer 1 or layer 2 changes, policy
changes, or routing changes. In any of these cases, existing BBR flows
traversing the bottleneck should, in a timely manner, reduce their BBR.max_bw
estimates and thus pacing rate and in-flight data, in order to match the
sending behavior to the new available bandwidth.</t>
            </li>
          </ul>
        </section>
        <section anchor="bbrmaxbw-and-application-limited-delivery-rate-samples">
          <name>BBR.max_bw and Application-limited Delivery Rate Samples</name>
          <t>Transmissions can be application-limited, meaning the transmission rate is
limited by the application rather than the congestion control algorithm.  This
is quite common because of request/response traffic. When there is a
transmission opportunity but no data to send, the delivery rate sampler marks
the corresponding bandwidth sample(s) as application-limited
<xref target="delivery-rate-samples"/>.  The BBR.max_bw estimator carefully decides which
samples to include in the bandwidth model to ensure that BBR.max_bw reflects
network limits, not application limits. By default, the estimator discards
application-limited samples, since by definition they reflect application
limits. However, the estimator does use application-limited samples if the
measured delivery rate happens to be larger than the current BBR.max_bw
estimate, since this indicates the current BBR.Max_bw estimate is too low.</t>
        </section>
        <section anchor="updating-the-bbrmaxbw-max-filter">
          <name>Updating the BBR.max_bw Max Filter</name>
          <t>For every ACK that acknowledges some data packets as delivered, BBR invokes
BBRUpdateMaxBw() to update the BBR.max_bw estimator as follows (here
rs.delivery_rate is the delivery rate sample obtained from the ACK that is
being processed, as specified in <xref target="delivery-rate-samples"/>):</t>
          <artwork><![CDATA[
  BBRUpdateMaxBw()
    BBRUpdateRound()
    if (rs.delivery_rate >= BBR.max_bw || !rs.is_app_limited)
        BBR.max_bw = UpdateWindowedMaxFilter(
                      filter=BBR.MaxBwFilter,
                      value=rs.delivery_rate,
                      time=BBR.cycle_count,
                      window_length=MaxBwFilterLen)
]]></artwork>
        </section>
        <section anchor="tracking-time-for-the-bbrmaxbw-max-filter">
          <name>Tracking Time for the BBR.max_bw Max Filter</name>
          <t>BBR tracks time for the BBR.max_bw filter window using a virtual
(non-wall-clock) time tracked by counting the cyclical progression through
ProbeBW cycles.  Each time through the Probe bw cycle, one round trip after
exiting ProbeBW_UP (the point at which the flow has its best chance to measure
the highest throughput of the cycle), BBR increments BBR.cycle_count, the
virtual time used by the BBR.max_bw filter window. Note that BBR.cycle_count
only needs to be tracked with a single bit, since the BBR.max_bw filter only
needs to track samples from two time slots: the previous ProbeBW cycle and the
current ProbeBW cycle:</t>
          <artwork><![CDATA[
  BBRAdvanceMaxBwFilter():
    BBR.cycle_count++
]]></artwork>
        </section>
        <section anchor="bbrminrtt-estimated-minimum-round-trip-time">
          <name>BBR.min_rtt: Estimated Minimum Round-Trip Time</name>
          <t>BBR.min_rtt is BBR's estimate of the round-trip propagation delay of the path
over which a transport connection is sending. The path's round-trip propagation
delay determines the minimum amount of time over which the connection must be
willing to sustain transmissions at the BBR.bw rate, and thus the minimum
amount of data needed in-flight, for the connection to reach full utilization
(a "Full Pipe"). The round-trip propagation delay can vary over the life of a
connection, so BBR continually estimates BBR.min_rtt using recent round-trip
delay samples.</t>
          <section anchor="round-trip-time-samples-for-estimating-bbrminrtt">
            <name>Round-Trip Time Samples for Estimating BBR.min_rtt</name>
            <t>For every data packet a connection sends, BBR calculates an RTT sample that
measures the time interval from sending a data packet until that packet is
acknowledged.</t>
            <t>For the most part, the same considerations and mechanisms that apply to RTT
estimation for the purposes of retransmission timeout calculations <xref target="RFC6298"/>
apply to BBR RTT samples. Namely, BBR does not use RTT samples based on the
transmission time of retransmitted packets, since these are ambiguous, and thus
unreliable. Also, BBR calculates RTT samples using both cumulative and
selective acknowledgments (if the transport supports <xref target="RFC2018"/> SACK options
or an equivalent mechanism), or transport-layer timestamps (if the transport
supports <xref target="RFC7323"/> TCP timestamps or an equivalent mechanism).</t>
            <t>The only divergence from RTT estimation for retransmission timeouts is in the
case where a given acknowledgment ACKs more than one data packet. In order to
be conservative and schedule long timeouts to avoid spurious retransmissions,
the maximum among such potential RTT samples is typically used for computing
retransmission timeouts; i.e., SRTT is typically calculated using the data
packet with the earliest transmission time. By contrast, in order for BBR to
try to reach the minimum amount of data in flight to fill the pipe, BBR uses
the minimum among such potential RTT samples; i.e., BBR calculates the RTT
using the data packet with the latest transmission time.</t>
          </section>
          <section anchor="bbrminrtt-min-filter">
            <name>BBR.min_rtt Min Filter</name>
            <t>RTT samples tend to be above the round-trip propagation delay of the path,
due to "noise" introduced by random variation in physical transmission processes
(e.g. radio link layer noise), queues along the network path, the receiver's
delayed ack strategy, ack aggregation, etc. Thus to filter out these effects
BBR uses a min filter: BBR estimates BBR.min_rtt using the minimum recent
RTT sample seen by the connection over that past MinRTTFilterLen seconds.
(Many of the same network effects that can decrease delivery rate measurements
can increase RTT samples, which is why BBR's min-filtering approach for RTTs
is the complement of its max-filtering approach for delivery rates.)</t>
            <t>The length of the BBR.min_rtt min filter window is MinRTTFilterLen = 10 secs.
This is driven by trade-offs among several considerations:</t>
            <ul spacing="normal">
              <li>
                <t>The MinRTTFilterLen is longer than ProbeRTTInterval, so that it covers an
entire ProbeRTT cycle (see the "ProbeRTT" section below). This helps ensure
that the window can contain RTT samples that are the result of data
transmitted with inflight below the estimated BDP of the flow. Such RTT
samples are important for helping to reveal the path's underlying two-way
propagation delay even when the aforementioned "noise" effects can often
obscure it.</t>
              </li>
              <li>
                <t>The MinRTTFilterLen aims to be long enough to avoid needing to cut in-flight
and throughput often. Measuring two-way propagation delay requires in-flight
to be at or below BDP, which risks  some amount of underutilization, so BBR
uses a filter window long enough that such underutilization events can be
rare.</t>
              </li>
              <li>
                <t>The MinRTTFilterLen aims to be long enough that many applications have a
"natural" moment of silence or low utilization that can cut in-flight below
BDP and naturally serve to refresh the BBR.min_rtt, without requiring BBR to
force an artificial cut in in-flight. This applies to many popular
applications, including Web, RPC, chunked audio or video traffic.</t>
              </li>
              <li>
                <t>The MinRTTFilterLen aims to be short enough to respond in a timely manner to
real increases in the two-way propagation delay of the path, e.g. due to
route changes, which are expected to typically happen on longer time scales.</t>
              </li>
            </ul>
            <t>A BBR implementation MAY use a generic windowed min filter to track BBR.min_rtt.
However, a significant savings in space and improvement in freshness can
be achieved by integrating the BBR.min_rtt estimation into the ProbeRTT state
machine, so this document discusses that approach in the ProbeRTT section.</t>
          </section>
        </section>
        <section anchor="bbroffloadbudget">
          <name>BBR.offload_budget</name>
          <t>BBR.offload_budget is the estimate of the minimum volume of data necessary
to achieve full throughput using sender (TSO/GSO)  and receiver (LRO, GRO)
host offload mechanisms, computed as follows:</t>
          <artwork><![CDATA[
    BBRUpdateOffloadBudget():
      BBR.offload_budget = 3 * BBR.send_quantum
]]></artwork>
          <t>The factor of 3 is chosen to allow maintaining at least:</t>
          <ul spacing="normal">
            <li>
              <t>1 quantum in the sending host's queuing discipline layer</t>
            </li>
            <li>
              <t>1 quantum being segmented in the sending host TSO/GSO engine</t>
            </li>
            <li>
              <t>1 quantum being reassembled or otherwise remaining unacknowledged due to
the receiver host's LRO/GRO/delayed-ACK engine</t>
            </li>
          </ul>
        </section>
        <section anchor="bbrextraacked">
          <name>BBR.extra_acked</name>
          <t>BBR.extra_acked is a volume of data that is the estimate of the recent degree
of aggregation in the network path. For each ACK, the algorithm computes
a sample of the estimated extra ACKed data beyond the amount of data that
the sender expected to be ACKed over the timescale of a round-trip, given
the BBR.bw. Then it computes BBR.extra_acked as the windowed maximum sample
over the last BBRExtraAckedFilterLen=10 packet-timed round-trips. If the
ACK rate falls below the expected bandwidth, then the algorithm estimates
an aggregation episode has terminated, and resets the sampling interval to
start from the current time.</t>
          <t>The BBR.extra_acked thus reflects the recently-measured magnitude of data
and ACK aggregation effects such as batching and slotting at shared-medium
L2 hops (wifi, cellular, DOCSIS), as well as end-host offload mechanisms
(TSO, GSO, LRO, GRO), and end host or middlebox ACK decimation/thinning.</t>
          <t>BBR augments its cwnd by BBR.extra_acked to allow the connection to keep
sending during inter-ACK silences, to an extent that matches the recently
measured degree of aggregation.</t>
          <t>More precisely, this is computed as:</t>
          <artwork><![CDATA[
  BBRUpdateACKAggregation():
    /* Find excess ACKed beyond expected amount over this interval */
    interval = (Now() - BBR.extra_acked_interval_start)
    expected_delivered = BBR.bw * interval
    /* Reset interval if ACK rate is below expected rate: */
    if (BBR.extra_acked_delivered <= expected_delivered)
        BBR.extra_acked_delivered = 0
        BBR.extra_acked_interval_start = Now()
        expected_delivered = 0
    BBR.extra_acked_delivered += rs.newly_acked
    extra = BBR.extra_acked_delivered - expected_delivered
    extra = min(extra, cwnd)
    if (BBR.full_bw_reached)
      filter_len = BBRExtraAckedFilterLen
    else
      filter_len = 1  /* in Startup, just remember 1 round */
    BBR.extra_acked =
      UpdateWindowedMaxFilter(
        filter=BBR.ExtraACKedFilter,
        value=extra,
        time=BBR.round_count,
        window_length=filter_len)
]]></artwork>
        </section>
        <section anchor="updating-the-model-upon-packet-loss">
          <name>Updating the Model Upon Packet Loss</name>
          <t>In every state, BBR responds to (filtered) congestion signals, including
loss. The response to those congestion signals depends on the flow's current
state, since the information that the flow can infer depends on what the
flow was doing when the flow experienced the signal.</t>
          <section anchor="probing-for-bandwidth-in-startup">
            <name>Probing for Bandwidth In Startup</name>
            <t>In Startup, if the congestion signals meet the Startup exit criteria, the flow
exits Startup and enters Drain (see <xref target="exiting-startup-based-on-packet-loss"/>).</t>
          </section>
          <section anchor="probing-for-bandwidth-in-probebw">
            <name>Probing for Bandwidth In ProbeBW</name>
            <t>BBR searches for the maximum volume of data that can be sensibly placed
in-flight in the network. A key precondition is that the flow is actually
trying robustly to find that operating point. To implement this, when a flow is
in ProbeBW, and an ACK covers data sent in one of the accelerating phases
(REFILL or UP), and the ACK indicates that the loss rate over the past round
trip exceeds the queue pressure objective, and the flow is not application
limited, and has not yet responded to congestion signals from the most recent
REFILL or UP phase, then the flow estimates that the volume of data it allowed
in flight exceeded what matches the current delivery process on the path, and
reduces BBR.inflight_hi:</t>
            <artwork><![CDATA[
  /* Do loss signals suggest inflight is too high?
   * If so, react. */
  IsInflightTooHigh():
    if (IsInflightTooHigh(rs))
      if (BBR.bw_probe_samples)
        BBRHandleInflightTooHigh()
      return true  /* inflight too high */
    else
      return false /* inflight not too high */

  IsInflightTooHigh():
    return (rs.lost > rs.tx_in_flight * BBRLossThresh)

  BBRHandleInflightTooHigh():
    BBR.bw_probe_samples = 0;  /* only react once per bw probe */
    if (!rs.is_app_limited)
      BBR.inflight_hi = max(rs.tx_in_flight,
                            BBRTargetInflight() * BBRBeta))
    If (BBR.state == ProbeBW_UP)
      BBRStartProbeBW_DOWN()
]]></artwork>
            <t>Here rs.tx_in_flight is the amount of data that was estimated to be in flight
when the most recently ACKed packet was sent. And the BBRBeta (0.7x) bound
is to try to ensure that BBR does not react more dramatically than CUBIC's
0.7x multiplicative decrease factor.</t>
            <t>Some loss detection algorithms, including algorithms like RACK
<xref target="RFC8985"/> that delay loss marking while waiting for potential
reordering to resolve, may mark packets as lost long after the loss itself
happened. In such cases, the tx_in_flight for the delivered sequence range
that
allowed the loss to be detected may be considerably smaller than the
tx_in_flight of the lost packet itself. In such cases using the former
tx_in_flight rather than the latter can cause BBR.inflight_hi to be
significantly underestimated. To avoid such issues, BBR processes each loss
detection event to more precisely estimate the volume of in-flight data at
which loss rates cross BBRLossThresh, noting that this may have happened
mid-way through some TSO/GSO offload burst (represented as a "packet" in
the
pseudocode in this document). To estimate this threshold volume of data,
we can
solve for "lost_prefix" in the following way, where inflight_prev represents
the volume of in-flight data preceding this packet, and lost_prev represents
the data lost among that previous in-flight data.</t>
            <t>First we start with:</t>
            <artwork><![CDATA[
  lost / inflight >= BBRLossThresh
]]></artwork>
            <t>Expanding this, we get:</t>
            <artwork><![CDATA[
  (lost_prev + lost_prefix) /    >= BBRLossThresh
  (inflight_prev + lost_prefix)
]]></artwork>
            <t>Solving for lost_prefix, we arrive at:</t>
            <artwork><![CDATA[
  lost_prefix >= (BBRLossThresh * inflight_prev - lost_prev) /
                    (1 - BBRLossThresh)
]]></artwork>
            <t>In pseudocode:</t>
            <artwork><![CDATA[
  BBRNoteLoss()
    if (!BBR.loss_in_round)   /* first loss in this round trip? */
      BBR.loss_round_delivered = C.delivered
    BBR.loss_in_round = 1

  BBRHandleLostPacket(packet):
    BBRNoteLoss()
    if (!BBR.bw_probe_samples)
      return /* not a packet sent while probing bandwidth */
    rs.tx_in_flight = packet.tx_in_flight /* inflight at transmit */
    rs.lost = C.lost - packet.lost /* data lost since transmit */
    rs.is_app_limited = packet.is_app_limited;
    if (IsInflightTooHigh(rs))
      rs.tx_in_flight = BBRInflightHiFromLostPacket(rs, packet)
      BBRHandleInflightTooHigh(rs)

  /* At what prefix of packet did losses exceed BBRLossThresh? */
  BBRInflightHiFromLostPacket(rs, packet):
    size = packet.size
    /* What was in flight before this packet? */
    inflight_prev = rs.tx_in_flight - size
    /* What was lost before this packet? */
    lost_prev = rs.lost - size
    lost_prefix = (BBRLossThresh * inflight_prev - lost_prev) /
                  (1 - BBRLossThresh)
    /* At what inflight value did losses cross BBRLossThresh? */
    inflight = inflight_prev + lost_prefix
    return inflight
]]></artwork>
          </section>
          <section anchor="when-not-probing-for-bandwidth">
            <name>When not Probing for Bandwidth</name>
            <t>When not explicitly accelerating to probe for bandwidth (Drain, ProbeRTT,
ProbeBW_DOWN, ProbeBW_CRUISE), BBR  responds to loss by slowing down to some
extent. This is because loss suggests that the available bandwidth and safe
volume of in-flight data may have decreased recently, and the flow needs
to adapt, slowing down toward the latest delivery process. BBR flows implement
this response by reducing the short-term model parameters, BBR.bw_lo and
BBR.inflight_lo.</t>
            <t>When encountering packet loss when the flow is not probing for bandwidth,
the strategy is to gradually adapt to the current measured delivery process
(the rate and volume of data that is delivered through the network path over
the last round trip). This applies generally: whether in fast recovery, RTO
recovery, TLP recovery; whether application-limited or not.</t>
            <t>There are two key parameters the algorithm tracks, to measure the current
delivery process:</t>
            <t>BBR.bw_latest: a 1-round-trip max of delivered bandwidth (rs.delivery_rate).</t>
            <t>BBR.inflight_latest: a 1-round-trip max of delivered volume of data
(rs.delivered).</t>
            <t>Upon the ACK at the end of each round that encountered a newly-marked loss,
the flow updates its model (bw_lo and inflight_lo) as follows:</t>
            <artwork><![CDATA[
      bw_lo = max(       bw_latest, BBRBeta *       bw_lo )
inflight_lo = max( inflight_latest, BBRBeta * inflight_lo )
]]></artwork>
            <t>This logic can be represented as follows:</t>
            <artwork><![CDATA[
  /* Near start of ACK processing: */
  BBRUpdateLatestDeliverySignals():
    BBR.loss_round_start = 0
    BBR.bw_latest       = max(BBR.bw_latest,       rs.delivery_rate)
    BBR.inflight_latest = max(BBR.inflight_latest, rs.delivered)
    if (rs.prior_delivered >= BBR.loss_round_delivered)
      BBR.loss_round_delivered = C.delivered
      BBR.loss_round_start = 1

  /* Near end of ACK processing: */
  BBRAdvanceLatestDeliverySignals():
    if (BBR.loss_round_start)
      BBR.bw_latest       = rs.delivery_rate
      BBR.inflight_latest = rs.delivered

  BBRResetCongestionSignals():
    BBR.loss_in_round = 0
    BBR.bw_latest = 0
    BBR.inflight_latest = 0

  /* Update congestion state on every ACK */
  BBRUpdateCongestionSignals():
    BBRUpdateMaxBw()
    if (!BBR.loss_round_start)
      return  /* wait until end of round trip */
    BBRAdaptLowerBoundsFromCongestion()  /* once per round, adapt */
    BBR.loss_in_round = 0

  /* Once per round-trip respond to congestion */
  BBRAdaptLowerBoundsFromCongestion():
    if (BBRIsProbingBW())
      return
    if (BBR.loss_in_round)
      BBRInitLowerBounds()
      BBRLossLowerBounds()

  /* Handle the first congestion episode in this cycle */
  BBRInitLowerBounds():
    if (BBR.bw_lo == Infinity)
      BBR.bw_lo = BBR.max_bw
    if (BBR.inflight_lo == Infinity)
      BBR.inflight_lo = cwnd

  /* Adjust model once per round based on loss */
  BBRLossLowerBounds()
    BBR.bw_lo       = max(BBR.bw_latest,
                          BBRBeta * BBR.bw_lo)
    BBR.inflight_lo = max(BBR.inflight_latest,
                          BBRBeta * BBR.inflight_lo)

  BBRResetLowerBounds():
    BBR.bw_lo       = Infinity
    BBR.inflight_lo = Infinity

  BBRBoundBWForModel():
    BBR.bw = min(BBR.max_bw, BBR.bw_lo)

]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="updating-control-parameters">
        <name>Updating Control Parameters</name>
        <t>BBR uses three distinct but interrelated control parameters: pacing rate,
send quantum, and congestion window (cwnd).</t>
        <section anchor="summary-of-control-behavior-in-the-state-machine">
          <name>Summary of Control Behavior in the State Machine</name>
          <t>The following table summarizes how BBR modulates the control parameters in
each state. In the table below, the semantics of the columns are as follows:</t>
          <ul spacing="normal">
            <li>
              <t>State: the state in the BBR state machine, as depicted in the "State
Transition Diagram" section above.</t>
            </li>
            <li>
              <t>Tactic: The tactic chosen from the "State Machine Tactics" in
<xref target="state-machine-tactics"/>: "accel" refers to acceleration, "decel" to
deceleration, and "cruise" to cruising.</t>
            </li>
            <li>
              <t>Pacing Gain: the value used for BBR.pacing_gain in the given state.</t>
            </li>
            <li>
              <t>Cwnd Gain: the value used for BBR.cwnd_gain in the given state.</t>
            </li>
            <li>
              <t>Rate Cap: the rate values applied as bounds on the BBR.max_bw value applied
to compute BBR.bw.</t>
            </li>
            <li>
              <t>Volume Cap: the volume values applied as bounds on the BBR.max_inflight value
to compute cwnd.</t>
            </li>
          </ul>
          <t>The control behavior can be summarized as follows. Upon processing each ACK,
BBR uses the values in the table below to compute BBR.bw in
BBRBoundBWForModel(), and the cwnd in BBRBoundCwndForModel():</t>
          <artwork><![CDATA[
---------------+--------+--------+------+--------+-----------------
State          | Tactic | Pacing | Cwnd | Rate   | Volume
               |        | Gain   | Gain | Cap    | Cap
---------------+--------+--------+------+--------+-----------------
Startup        | accel  | 2.77   | 2    | N/A    | N/A
               |        |        |      |        |
---------------+--------+--------+------+--------+-----------------
Drain          | decel  | 0.5    | 2    | bw_lo  | inflight_hi,
               |        |        |      |        | inflight_lo
---------------+--------+--------+------+--------+-----------------
ProbeBW_DOWN   | decel  | 0.90   | 2    | bw_lo  | inflight_hi,
               |        |        |      |        | inflight_lo
---------------+--------+--------+------+--------+-----------------
ProbeBW_CRUISE | cruise | 1.0    | 2    | bw_lo  | 0.85*inflight_hi
               |        |        |      |        | inflight_lo
---------------+--------+--------+------+--------+-----------------
ProbeBW_REFILL | accel  | 1.0    | 2    |        | inflight_hi
               |        |        |      |        |
---------------+--------+--------+------+--------+-----------------
ProbeBW_UP     | accel  | 1.25   | 2.25 |        | inflight_hi
               |        |        |      |        |
---------------+--------+--------+------+--------+-----------------
ProbeRTT       | decel  | 1.0    | 0.5  | bw_lo  | 0.85*inflight_hi
               |        |        |      |        | inflight_lo
---------------+--------+--------+------+--------+-----------------
]]></artwork>
        </section>
        <section anchor="pacing-rate-bbrpacingrate">
          <name>Pacing Rate: BBR.pacing_rate</name>
          <t>To help match the packet-arrival rate to the bottleneck bandwidth available
to the flow, BBR paces data packets. Pacing enforces a maximum rate at which
BBR schedules quanta of packets for transmission.</t>
          <t>The sending host implements pacing by maintaining inter-quantum spacing at
the time each packet is scheduled for departure, calculating the next departure
time for a packet for a given flow (BBR.next_departure_time) as a function
of the most recent packet size and the current pacing rate, as follows:</t>
          <artwork><![CDATA[
  BBR.next_departure_time = max(Now(), BBR.next_departure_time)
  packet.departure_time = BBR.next_departure_time
  pacing_delay = packet.size / BBR.pacing_rate
  BBR.next_departure_time = BBR.next_departure_time + pacing_delay
]]></artwork>
          <t>To adapt to the bottleneck, in general BBR sets the pacing rate to be
proportional to bw, with a dynamic gain, or scaling factor of proportionality,
called pacing_gain.</t>
          <t>When a BBR flow starts it has no bw estimate (bw is 0). So in this case it
sets an initial pacing rate based on the transport sender implementation's
initial congestion window ("InitialCwnd", e.g. from <xref target="RFC6928"/>), the
initial SRTT (smoothed round-trip time) after the first non-zero RTT
sample, and the initial pacing_gain:</t>
          <artwork><![CDATA[
  BBRInitPacingRate():
    nominal_bandwidth = InitialCwnd / (SRTT ? SRTT : 1ms)
    BBR.pacing_rate =  BBRStartupPacingGain * nominal_bandwidth
]]></artwork>
          <t>After initialization, on each data ACK BBR updates its pacing rate to be
proportional to bw, as long as it estimates that it has filled the pipe
(BBR.full_bw_reached is true; see the "Startup" section for details), or
doing
so increases the pacing rate. Limiting the pacing rate updates in this way
helps the connection probe robustly for bandwidth until it estimates it has
reached its full available bandwidth ("filled the pipe"). In particular,
this
prevents the pacing rate from being reduced when the connection has only
seen
application-limited bandwidth samples. BBR updates the pacing rate on each
ACK
by executing the BBRSetPacingRate() step as follows:</t>
          <artwork><![CDATA[
  BBRSetPacingRateWithGain(pacing_gain):
    rate = pacing_gain * bw * (100 - BBRPacingMarginPercent) / 100
    if (BBR.full_bw_reached || rate > BBR.pacing_rate)
      BBR.pacing_rate = rate

  BBRSetPacingRate():
    BBRSetPacingRateWithGain(BBR.pacing_gain)
]]></artwork>
          <t>To help drive the network toward lower queues and low latency while maintaining
high utilization, the BBRPacingMarginPercent constant of 1 aims to cause
BBR to pace at 1% below the bw, on average.</t>
        </section>
        <section anchor="send-quantum-bbrsendquantum">
          <name>Send Quantum: BBR.send_quantum</name>
          <t>In order to amortize per-packet overheads involved in the sending process (host
CPU, NIC processing, and interrupt processing delays), high-performance
transport sender implementations (e.g., Linux TCP) often schedule an aggregate
containing multiple packets (multiple SMSS) worth of data as a single quantum
(using TSO, GSO, or other offload mechanisms). The BBR congestion control
algorithm makes this control decision explicitly, dynamically calculating a
quantum control parameter that specifies the maximum size of these transmission
aggregates. This decision is based on a trade-off:</t>
          <ul spacing="normal">
            <li>
              <t>A smaller quantum is preferred at lower data rates because it results in
shorter packet bursts, shorter queues, lower queueing delays, and lower rates
of packet loss.</t>
            </li>
            <li>
              <t>A bigger quantum can be required at higher data rates because it results
in lower CPU overheads at the sending and receiving hosts, who can ship larger
amounts of data with a single trip through the networking stack.</t>
            </li>
          </ul>
          <t>On each ACK, BBR runs BBRSetSendQuantum() to update BBR.send_quantum  as
follows:</t>
          <artwork><![CDATA[
  BBRSetSendQuantum():
    BBR.send_quantum = BBR.pacing_rate * 1ms
    BBR.send_quantum = min(BBR.send_quantum, 64 KBytes)
    BBR.send_quantum = max(BBR.send_quantum, 2 * SMSS)
]]></artwork>
          <t>A BBR implementation MAY use alternate approaches to select a BBR.send_quantum,
as appropriate for the CPU overheads anticipated for senders and receivers,
and buffering considerations anticipated in the network path. However, for
the sake of the network and other users, a BBR implementation SHOULD attempt
to use the smallest feasible quanta.</t>
        </section>
        <section anchor="congestion-window">
          <name>Congestion Window</name>
          <t>The congestion window, or cwnd, controls the maximum volume of data BBR allows
in flight in the network at any time. It is the maximum volume of in-flight
data that the algorithm estimates is appropriate for matching the current
network path delivery process, given all available signals in the model,
at any time scale. BBR adapts the cwnd based on its model of the network
path and the state machine's decisions about how to probe that path.</t>
          <t>By default, BBR grows its cwnd to meet its BBR.max_inflight, which models
what's required for achieving full throughput, and as such is scaled to adapt
to the estimated BDP computed from its path model. But BBR's selection of cwnd
is designed to explicitly trade off among competing considerations that
dynamically adapt to various conditions. So in loss recovery BBR more
conservatively adjusts its sending behavior based on more recent delivery
samples, and if BBR needs to re-probe the current BBR.min_rtt of the path then
it cuts its cwnd accordingly. The following sections describe the various
considerations that impact cwnd.</t>
          <section anchor="initial-cwnd">
            <name>Initial cwnd</name>
            <t>BBR generally uses measurements to build a model of the network path and
then adapts control decisions to the path based on that model. As such, the
selection of the initial cwnd is considered to be outside the scope of the
BBR algorithm, since at initialization there are no measurements yet upon
which BBR can operate. Thus, at initialization, BBR uses the transport sender
implementation's initial congestion window (e.g. from <xref target="RFC6298"/> for TCP).</t>
          </section>
          <section anchor="computing-bbrmaxinflight">
            <name>Computing BBR.max_inflight</name>
            <t>The BBR BBR.max_inflight is the upper bound on the volume of data BBR allows in
flight. This bound is always in place, and dominates when all other
considerations have been satisfied: the flow is not in loss recovery, does not
need to probe BBR.min_rtt, and has accumulated confidence in its model
parameters by receiving enough ACKs to gradually grow the current cwnd to meet
the BBR.max_inflight.</t>
            <t>On each ACK, BBR calculates the BBR.max_inflight in BBRUpdateMaxInflight()
as follows:</t>
            <artwork><![CDATA[
  BBRBDPMultiple(gain):
    if (BBR.min_rtt == Infinity)
      return InitialCwnd /* no valid RTT samples yet */
    BBR.bdp = BBR.bw * BBR.min_rtt
    return gain * BBR.bdp

  BBRQuantizationBudget(inflight)
    BBRUpdateOffloadBudget()
    inflight = max(inflight, BBR.offload_budget)
    inflight = max(inflight, BBRMinPipeCwnd)
      if (BBR.state == ProbeBW_UP)
      inflight += 2*SMSS
    return inflight

  BBRInflight(gain):
    inflight = BBRBDPMultiple(gain)
    return BBRQuantizationBudget(inflight)

  BBRUpdateMaxInflight():
    BBRUpdateAggregationBudget()
    inflight = BBRBDPMultiple(BBR.cwnd_gain)
    inflight += BBR.extra_acked
    BBR.max_inflight = BBRQuantizationBudget(inflight)
]]></artwork>
            <t>The "estimated_bdp" term tries to allow enough packets in flight to fully
utilize the estimated BDP of the path, by allowing the flow to send at BBR.bw
for a duration of BBR.min_rtt. Scaling up the BDP by BBR.cwnd_gain bounds
in-flight data to a small multiple of the BDP, to handle common network and
receiver behavior, such as delayed, stretched, or aggregated ACKs <xref target="A15"/>.
The "quanta" term allows enough quanta in flight on the sending and
receiving hosts to reach high throughput even in environments using
offload mechanisms.</t>
          </section>
          <section anchor="minimum-cwnd-for-pipelining">
            <name>Minimum cwnd for Pipelining</name>
            <t>For BBR.max_inflight, BBR imposes a floor of BBRMinPipeCwnd (4 packets, i.e.
4 * SMSS). This floor helps ensure that even at very low BDPs, and with
a transport like TCP where a receiver may ACK only every alternate SMSS of
data, there are enough packets in flight to maintain full pipelining. In
particular BBR tries to allow at least 2 data packets in flight and ACKs
for at least 2 data packets on the path from receiver to sender.</t>
          </section>
          <section anchor="modulating-cwnd-in-loss-recovery">
            <name>Modulating cwnd in Loss Recovery</name>
            <t>BBR interprets loss as a hint that there may be recent changes in path behavior
that are not yet fully reflected in its model of the path, and thus it needs
to be more conservative.</t>
            <t>Upon a retransmission timeout (RTO), BBR conservatively reduces cwnd to a
value that will allow 1 SMSS to be transmitted. Then BBR gradually increases
cwnd using the normal approach outlined below in "cwnd Adjustment Mechanism"
in <xref target="cwnd-adjustment-mechanism"/>.</t>
            <t>When a BBR sender is in Fast Recovery it uses the response described in
"Updating the Model Upon Packet Loss" in
<xref target="updating-the-model-upon-packet-loss"/>.</t>
            <t>When BBR exits loss recovery it restores the cwnd to the "last known good"
value that cwnd held before entering recovery. This applies equally whether
the flow exits loss recovery because it finishes repairing all losses or
because it executes an "undo" event after inferring that a loss recovery
event was spurious.</t>
            <t>The high-level design for updating cwnd in loss recovery is as follows:</t>
            <t>Upon retransmission timeout (RTO):</t>
            <artwork><![CDATA[
  BBROnEnterRTO():
    BBRSaveCwnd()
    cwnd = C.pipe + 1
]]></artwork>
            <t>Upon entering Fast Recovery:</t>
            <artwork><![CDATA[
  BBROnEnterFastRecovery():
    BBRSaveCwnd()
]]></artwork>
            <t>Upon exiting loss recovery (RTO recovery or Fast Recovery), either by repairing
all losses or undoing recovery, BBR restores the best-known cwnd value we
had upon entering loss recovery:</t>
            <artwork><![CDATA[
  BBRRestoreCwnd()
]]></artwork>
            <t>Note that exiting loss recovery happens during ACK processing, and at the
end of ACK processing BBRBoundCwndForModel() will bound the cwnd based on
the current model parameters. Thus the cwnd and pacing rate after loss recovery
will generally be smaller than the values entering loss recovery.</t>
            <t>The BBRSaveCwnd() and BBRRestoreCwnd() helpers help remember and restore
the last-known good cwnd (the latest cwnd unmodulated by loss recovery or
ProbeRTT), and is defined as follows:</t>
            <artwork><![CDATA[
  BBRSaveCwnd():
    if (!InLossRecovery() and BBR.state != ProbeRTT)
      BBR.prior_cwnd = cwnd
    else
      BBR.prior_cwnd = max(BBR.prior_cwnd, cwnd)

  BBRRestoreCwnd():
    cwnd = max(cwnd, BBR.prior_cwnd)
]]></artwork>
          </section>
          <section anchor="modulating-cwnd-in-probertt">
            <name>Modulating cwnd in ProbeRTT</name>
            <t>If BBR decides it needs to enter the ProbeRTT state (see the "ProbeRTT" section
below), its goal is to quickly reduce the volume of in-flight data and drain
the bottleneck queue, thereby allowing measurement of BBR.min_rtt. To implement
this mode, BBR bounds the cwnd to BBRMinPipeCwnd, the minimal value that
allows pipelining (see the "Minimum cwnd for Pipelining" section, above):</t>
            <artwork><![CDATA[
  BBRProbeRTTCwnd():
    probe_rtt_cwnd = BBRBDPMultiple(BBR.bw, BBRProbeRTTCwndGain)
    probe_rtt_cwnd = max(probe_rtt_cwnd, BBRMinPipeCwnd)
    return probe_rtt_cwnd

  BBRBoundCwndForProbeRTT():
    if (BBR.state == ProbeRTT)
      cwnd = min(cwnd, BBRProbeRTTCwnd())
]]></artwork>
          </section>
          <section anchor="cwnd-adjustment-mechanism">
            <name>cwnd Adjustment Mechanism</name>
            <t>The network path and traffic traveling over it can make sudden dramatic
changes.  To adapt to these changes smoothly and robustly, and reduce packet
losses in such cases, BBR uses a conservative strategy. When cwnd is above the
BBR.max_inflight derived from BBR's path model, BBR cuts the cwnd immediately
to the BBR.max_inflight.  When cwnd is below BBR.max_inflight, BBR raises the
cwnd gradually and cautiously, increasing cwnd by no more than the amount of
data acknowledged (cumulatively or selectively) upon each ACK.</t>
            <t>Specifically, on each ACK that acknowledges "rs.newly_acked" packets as newly
ACKed or SACKed, BBR runs the following BBRSetCwnd() steps to update cwnd:</t>
            <artwork><![CDATA[
  BBRSetCwnd():
    BBRUpdateMaxInflight()
    if (BBR.full_bw_reached)
      cwnd = min(cwnd + rs.newly_acked, BBR.max_inflight)
    else if (cwnd < BBR.max_inflight || C.delivered < InitialCwnd)
      cwnd = cwnd + rs.newly_acked
    cwnd = max(cwnd, BBRMinPipeCwnd)
    BBRBoundCwndForProbeRTT()
    BBRBoundCwndForModel()
]]></artwork>
            <t>There are several considerations embodied in the logic above. If BBR has
measured enough samples to achieve confidence that it has filled the pipe
(see
the description of BBR.full_bw_reached in the "Startup" section below), then
it
increases its cwnd based on the number of packets delivered, while bounding
its
cwnd to be no larger than the BBR.max_inflight adapted to the estimated
BDP. Otherwise, if the cwnd is below the BBR.max_inflight, or the sender
has
marked so little data delivered (less than InitialCwnd) that it does not
yet
judge its BBR.max_bw estimate and BBR.max_inflight as useful, then it increases
cwnd without bounding it to be below BBR.max_inflight. Finally, BBR imposes
a
floor of BBRMinPipeCwnd in order to allow pipelining even with small BDPs
(see
the "Minimum cwnd for Pipelining" section, above).</t>
          </section>
          <section anchor="bounding-cwnd-based-on-recent-congestion">
            <name>Bounding cwnd Based on Recent Congestion</name>
            <t>Finally, BBR bounds the cwnd based on recent congestion, as outlined in the
"Volume Cap" column of the table in the "Summary of Control Behavior in the
State Machine" section:</t>
            <artwork><![CDATA[
  BBRBoundCwndForModel():
    cap = Infinity
    if (IsInAProbeBWState() and
        BBR.state != ProbeBW_CRUISE)
      cap = BBR.inflight_hi
    else if (BBR.state == ProbeRTT or
             BBR.state == ProbeBW_CRUISE)
      cap = BBRInflightWithHeadroom()

    /* apply inflight_lo (possibly infinite): */
    cap = min(cap, BBR.inflight_lo)
    cap = max(cap, BBRMinPipeCwnd)
    cwnd = min(cwnd, cap)
]]></artwork>
          </section>
        </section>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations of the algorithm
defined by this specification at the time of posting of this Internet-Draft,
and is based on a proposal described in <xref target="RFC7942"/>.
The description of implementations in this section is intended to assist
the IETF in its decision processes in progressing drafts to RFCs. Please
note that the listing of any individual implementation here does not imply
endorsement by the IETF. Furthermore, no effort has been spent to verify
the information presented here that was supplied by IETF contributors. This
is not intended as, and must not be construed to be, a catalog of available
implementations or their features.  Readers are advised to note that other
implementations may exist.</t>
      <t>According to <xref target="RFC7942"/>, "this will allow reviewers and working groups to
assign due consideration to documents that have the benefit of running code,
which may serve as evidence of valuable experimentation and feedback that have
made the implemented protocols more mature.  It is up to the individual working
groups to use this information as they see fit".</t>
      <t>As of the time of writing, the following implementations of BBRv3 have been
publicly released:</t>
      <ul spacing="normal">
        <li>
          <t>Linux TCP  </t>
          <ul spacing="normal">
            <li>
              <t>Source code URL:      </t>
              <ul spacing="normal">
                <li>
                  <t>https://github.com/google/bbr/blob/v3/README.md</t>
                </li>
                <li>
                  <t>https://github.com/google/bbr/blob/v3/net/ipv4/tcp_bbr.c</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Source: Google</t>
            </li>
            <li>
              <t>Maturity: production</t>
            </li>
            <li>
              <t>License: dual-licensed: GPLv2 / BSD</t>
            </li>
            <li>
              <t>Contact: https://groups.google.com/d/forum/bbr-dev</t>
            </li>
            <li>
              <t>Last updated: November 22, 2023</t>
            </li>
          </ul>
        </li>
        <li>
          <t>QUIC  </t>
          <ul spacing="normal">
            <li>
              <t>Source code URLs:      </t>
              <ul spacing="normal">
                <li>
                  <t>https://cs.chromium.org/chromium/src/net/third_party/quiche/src/quic/core/congestion_control/bbr2_sender.cc</t>
                </li>
                <li>
                  <t>https://cs.chromium.org/chromium/src/net/third_party/quiche/src/quic/core/congestion_control/bbr2_sender.h</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Source: Google</t>
            </li>
            <li>
              <t>Maturity: production</t>
            </li>
            <li>
              <t>License: BSD-style</t>
            </li>
            <li>
              <t>Contact: https://groups.google.com/d/forum/bbr-dev</t>
            </li>
            <li>
              <t>Last updated: October 21, 2021</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>As of the time of writing, the following implementations of the delivery
rate sampling algorithm have been publicly released:</t>
      <ul spacing="normal">
        <li>
          <t>Linux TCP  </t>
          <ul spacing="normal">
            <li>
              <t>Source code URL:      </t>
              <ul spacing="normal">
                <li>
                  <t>GPLv2 license: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/ipv4/tcp_rate.c</t>
                </li>
                <li>
                  <t>BSD-style license: https://groups.google.com/d/msg/bbr-dev/X0LbDptlOzo/EVgkRjVHBQAJ</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Source: Google</t>
            </li>
            <li>
              <t>Maturity: production</t>
            </li>
            <li>
              <t>License: dual-licensed: GPLv2 / BSD-style</t>
            </li>
            <li>
              <t>Contact: https://groups.google.com/d/forum/bbr-dev</t>
            </li>
            <li>
              <t>Last updated: September 24, 2021</t>
            </li>
          </ul>
        </li>
        <li>
          <t>QUIC  </t>
          <ul spacing="normal">
            <li>
              <t>Source code URLs:      </t>
              <ul spacing="normal">
                <li>
                  <t>https://github.com/google/quiche/blob/main/quiche/quic/core/congestion_control/bandwidth_sampler.cc</t>
                </li>
                <li>
                  <t>https://github.com/google/quiche/blob/main/quiche/quic/core/congestion_control/bandwidth_sampler.h</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Source: Google</t>
            </li>
            <li>
              <t>Maturity: production</t>
            </li>
            <li>
              <t>License: BSD-style</t>
            </li>
            <li>
              <t>Contact: https://groups.google.com/d/forum/bbr-dev</t>
            </li>
            <li>
              <t>Last updated: October 5, 2021</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This proposal makes no changes to the underlying security of transport protocols
or congestion control algorithms. BBR shares the same security considerations
as the existing standard congestion control algorithm <xref target="RFC5681"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. Here we are using that phrase, suggested
by <xref target="RFC5226"/>, because BBR does not modify or extend the wire format of
any network protocol,
nor does it add new dependencies on assigned numbers. BBR involves only a
change to the congestion control algorithm of a transport sender, and does
not involve changes in the network, the receiver, or any network protocol.</t>
      <t>Note to RFC Editor: this section may be removed on publication as an RFC.</t>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors are grateful to Len Kleinrock for his work on the theory underlying
congestion control. We are indebted to Larry Brakmo for pioneering work on
the Vegas <xref target="BP95"/> and New Vegas <xref target="B15"/> congestion control algorithms,
which presaged many elements of BBR, and for
Larry's advice and guidance during BBR's early development. The authors would
also like to thank Kevin Yang, Priyaranjan Jha, Yousuk Seung, Luke Hsiao
for their work on TCP BBR; Jana Iyengar, Victor Vasiliev, Bin Wu for their
work on QUIC BBR; and Matt Mathis for his research work on the BBR algorithm
and its implications <xref target="MM19"/>. We would also like to thank C. Stephen
Gunn, Eric Dumazet, Nandita Dukkipati,
Pawel Jurczyk, Biren Roy, David Wetherall, Amin Vahdat, Leonidas Kontothanassis,
and the YouTube, google.com, Bandwidth Enforcer, and Google SRE teams for
their invaluable help and support. We would like to thank Randall R. Stewart,
Jim Warner, Loganaden Velvindron, Hiren Panchasara, Adrian Zapletal, Christian
Huitema, Bao Zheng, Jonathan Morton, Matt Olson, Junho Choi, Carsten Bormann,
and Pouria Mousavizadeh Tehrani for feedback, suggestions, and edits on earlier
versions of this document.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9293">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
        <reference anchor="RFC2018">
          <front>
            <title>TCP Selective Acknowledgment Options</title>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="J. Mahdavi" initials="J." surname="Mahdavi"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Romanow" initials="A." surname="Romanow"/>
            <date month="October" year="1996"/>
            <abstract>
              <t>This memo proposes an implementation of SACK and discusses its performance and related issues. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2018"/>
          <seriesInfo name="DOI" value="10.17487/RFC2018"/>
        </reference>
        <reference anchor="RFC7323">
          <front>
            <title>TCP Extensions for High Performance</title>
            <author fullname="D. Borman" initials="D." surname="Borman"/>
            <author fullname="B. Braden" initials="B." surname="Braden"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="R. Scheffenegger" initials="R." role="editor" surname="Scheffenegger"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>This document specifies a set of TCP extensions to improve performance over paths with a large bandwidth * delay product and to provide reliable operation over very high-speed paths. It defines the TCP Window Scale (WS) option and the TCP Timestamps (TS) option and their semantics. The Window Scale option is used to support larger receive windows, while the Timestamps option can be used for at least two distinct mechanisms, Protection Against Wrapped Sequences (PAWS) and Round-Trip Time Measurement (RTTM), that are also described herein.</t>
              <t>This document obsoletes RFC 1323 and describes changes from it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7323"/>
          <seriesInfo name="DOI" value="10.17487/RFC7323"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC5226">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <author fullname="H. Alvestrand" initials="H." surname="Alvestrand"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>Many protocols make use of identifiers consisting of constants and other well-known values. Even after a protocol has been defined and deployment has begun, new values may need to be assigned (e.g., for a new option type in DHCP, or a new encryption or authentication transform for IPsec). To ensure that such quantities have consistent values and interpretations across all implementations, their assignment must be administered by a central authority. For IETF protocols, that role is provided by the Internet Assigned Numbers Authority (IANA).</t>
              <t>In order for IANA to manage a given namespace prudently, it needs guidelines describing the conditions under which new values can be assigned or when modifications to existing values can be made. If IANA is expected to play a role in the management of a namespace, IANA must be given clear and concise instructions describing that role. This document discusses issues that should be considered in formulating a policy for assigning values to a namespace and provides guidelines for authors on the specific text that must be included in documents that place demands on IANA.</t>
              <t>This document obsoletes RFC 2434. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5226"/>
          <seriesInfo name="DOI" value="10.17487/RFC5226"/>
        </reference>
        <reference anchor="RFC6298">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC5681">
          <front>
            <title>TCP Congestion Control</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines TCP's four intertwined congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. In addition, the document specifies how TCP should begin transmission after a relatively long idle period, as well as discussing various acknowledgment generation methods. This document obsoletes RFC 2581. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5681"/>
          <seriesInfo name="DOI" value="10.17487/RFC5681"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="RFC9438">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>CUBIC is a standard TCP congestion control algorithm that uses a cubic function instead of a linear congestion window increase function to improve scalability and stability over fast and long-distance networks. CUBIC has been adopted as the default TCP congestion control algorithm by the Linux, Windows, and Apple stacks.</t>
              <t>This document updates the specification of CUBIC to include algorithmic improvements based on these implementations and recent academic work. Based on the extensive deployment experience with CUBIC, this document also moves the specification to the Standards Track and obsoletes RFC 8312. This document also updates RFC 5681, to allow for CUBIC's occasionally more aggressive sending behavior.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
        <reference anchor="RFC8985">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC4340">
          <front>
            <title>Datagram Congestion Control Protocol (DCCP)</title>
            <author fullname="E. Kohler" initials="E." surname="Kohler"/>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <date month="March" year="2006"/>
            <abstract>
              <t>The Datagram Congestion Control Protocol (DCCP) is a transport protocol that provides bidirectional unicast connections of congestion-controlled unreliable datagrams. DCCP is suitable for applications that transfer fairly large amounts of data and that can benefit from control over the tradeoff between timeliness and reliability. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4340"/>
          <seriesInfo name="DOI" value="10.17487/RFC4340"/>
        </reference>
        <reference anchor="RFC6928">
          <front>
            <title>Increasing TCP's Initial Window</title>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document proposes an experiment to increase the permitted TCP initial window (IW) from between 2 and 4 segments, as specified in RFC 3390, to 10 segments with a fallback to the existing recommendation when performance issues are detected. It discusses the motivation behind the increase, the advantages and disadvantages of the higher initial window, and presents results from several large-scale experiments showing that the higher initial window improves the overall performance of many web services without resulting in a congestion collapse. The document closes with a discussion of usage and deployment for further experimental purposes recommended by the IETF TCP Maintenance and Minor Extensions (TCPM) working group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6928"/>
          <seriesInfo name="DOI" value="10.17487/RFC6928"/>
        </reference>
        <reference anchor="RFC6675">
          <front>
            <title>A Conservative Loss Recovery Algorithm Based on Selective Acknowledgment (SACK) for TCP</title>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="L. Wang" initials="L." surname="Wang"/>
            <author fullname="I. Jarvinen" initials="I." surname="Jarvinen"/>
            <author fullname="M. Kojo" initials="M." surname="Kojo"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="August" year="2012"/>
            <abstract>
              <t>This document presents a conservative loss recovery algorithm for TCP that is based on the use of the selective acknowledgment (SACK) TCP option. The algorithm presented in this document conforms to the spirit of the current congestion control specification (RFC 5681), but allows TCP senders to recover more effectively when multiple segments are lost from a single flight of data. This document obsoletes RFC 3517 and describes changes from it. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6675"/>
          <seriesInfo name="DOI" value="10.17487/RFC6675"/>
        </reference>
        <reference anchor="RFC6937">
          <front>
            <title>Proportional Rate Reduction for TCP</title>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <date month="May" year="2013"/>
            <abstract>
              <t>This document describes an experimental Proportional Rate Reduction (PRR) algorithm as an alternative to the widely deployed Fast Recovery and Rate-Halving algorithms. These algorithms determine the amount of data sent by TCP during loss recovery. PRR minimizes excess window adjustments, and the actual window size at the end of recovery will be as close as possible to the ssthresh, as determined by the congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6937"/>
          <seriesInfo name="DOI" value="10.17487/RFC6937"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CCGHJ16" target="http://queue.acm.org/detail.cfm?id=3022184">
          <front>
            <title>BBR: Congestion-Based Congestion Control</title>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="C." surname="Gunn" fullname="C. Stephen Gunn">
              <organization/>
            </author>
            <author initials="S." surname="Hassas Yeganeh" fullname="Soheil Hassas Yeganeh">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="2016" month="October"/>
          </front>
          <seriesInfo name="ACM Queue" value="Oct 2016"/>
        </reference>
        <reference anchor="CCGHJ17" target="https://cacm.acm.org/magazines/2017/2/212428-bbr-congestion-based-congestion-control/pdf">
          <front>
            <title>BBR: Congestion-Based Congestion Control</title>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="C." surname="Gunn" fullname="C. Stephen Gunn">
              <organization/>
            </author>
            <author initials="S." surname="Hassas Yeganeh" fullname="Soheil Hassas Yeganeh">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="2017" month="February"/>
          </front>
          <seriesInfo name="Communications of the ACM" value="Feb 2017"/>
        </reference>
        <reference anchor="MM19">
          <front>
            <title>Deprecating The TCP Macroscopic Model</title>
            <author initials="M." surname="Mathis" fullname="M. Mathis">
              <organization/>
            </author>
            <author initials="J." surname="Mahdavi" fullname="J. Mahdavi">
              <organization/>
            </author>
            <date year="2019" month="October"/>
          </front>
          <seriesInfo name="Computer Communication Review, vol. 49, no. 5, pp. 63-68" value=""/>
        </reference>
        <reference anchor="BBRStartupCwndGain" target="https://github.com/google/bbr/blob/master/Documentation/startup/gain/analysis/bbr_startup_cwnd_gain.pdf">
          <front>
            <title>BBR Startup cwnd  Gain: a Derivation</title>
            <author initials="I." surname="Swett" fullname="Ian Swett">
              <organization/>
            </author>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="S." surname="Hassas Yeganeh" fullname="Soheil Hassas Yeganeh">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="2018" month="July"/>
          </front>
        </reference>
        <reference anchor="BBRStartupPacingGain" target="https://github.com/google/bbr/blob/master/Documentation/startup/gain/analysis/bbr_startup_gain.pdf">
          <front>
            <title>BBR Startup Pacing Gain: a Derivation</title>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="S." surname="Hassas Yeganeh" fullname="Soheil Hassas Yeganeh">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="2018" month="June"/>
          </front>
        </reference>
        <reference anchor="BBRDrainPacingGain" target="https://github.com/google/bbr/blob/master/Documentation/startup/gain/analysis/bbr_drain_gain.pdf">
          <front>
            <title>BBR Drain Pacing Gain: a Derivation</title>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="S." surname="Hassas Yeganeh" fullname="Soheil Hassas Yeganeh">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="2021" month="September"/>
          </front>
        </reference>
        <reference anchor="draft-romo-iccrg-ccid5">
          <front>
            <title>Profile for Datagram Congestion Control Protocol (DCCP) Congestion Control ID 5</title>
            <author fullname="Nathalie Romo Moreno" initials="N. R." surname="Moreno">
              <organization>Deutsche Telekom</organization>
            </author>
            <author fullname="Juhoon Kim" initials="J." surname="Kim">
              <organization>Deutsche Telekom</organization>
            </author>
            <author fullname="Markus Amend" initials="M." surname="Amend">
              <organization>Deutsche Telekom</organization>
            </author>
            <date day="25" month="October" year="2021"/>
            <abstract>
              <t>   This document contains the profile for Congestion Control Identifier
   5 (CCID 5), BBR-like Congestion Control, in the Datagram Congestion
   Control Protocol (DCCP).  CCID 5 is meant to be used by senders who
   have a strong demand on low latency and require a steady throughput
   behavior.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-romo-iccrg-ccid5-00"/>
        </reference>
        <reference anchor="A15" target="https://www.ietf.org/mail-archive/web/aqm/current/msg01480.html">
          <front>
            <title>TCP ACK suppression</title>
            <author initials="M." surname="Abrahamsson" fullname="Mikael Abrahamsson">
              <organization/>
            </author>
            <date year="2015" month="November"/>
          </front>
          <refcontent>IETF AQM mailing list</refcontent>
        </reference>
        <reference anchor="Jac88" target="http://ee.lbl.gov/papers/congavoid.pdf">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="SIGCOMM 1988, Computer Communication Review, vol. 18, no. 4, pp. 314-329" value=""/>
        </reference>
        <reference anchor="Jac90" target="ftp://ftp.isi.edu/end2end/end2end-interest-1990.mail">
          <front>
            <title>Modified TCP Congestion Avoidance Algorithm</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1990" month="April"/>
          </front>
          <seriesInfo name="end2end-interest mailing list" value=""/>
        </reference>
        <reference anchor="BP95">
          <front>
            <title>TCP Vegas: end-to-end congestion avoidance on a global Internet</title>
            <author initials="L." surname="Brakmo" fullname="Lawrence S. Brakmo">
              <organization/>
            </author>
            <author initials="L." surname="Peterson" fullname="Larry L. Peterson">
              <organization/>
            </author>
            <date year="1995" month="October"/>
          </front>
          <seriesInfo name="IEEE Journal on Selected Areas in Communications 13(8): 1465-1480" value=""/>
        </reference>
        <reference anchor="B15" target="https://docs.google.com/document/d/1o-53jbO_xH-m9g2YCgjaf5bK8vePjWP6Mk0rYiRLK-U/edit">
          <front>
            <title>TCP-NV: An Update to TCP-Vegas</title>
            <author initials="L." surname="Brakmo" fullname="Lawrence S. Brakmo">
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="" value=""/>
        </reference>
        <reference anchor="WS95">
          <front>
            <title>TCP/IP Illustrated, Volume 2: The Implementation</title>
            <author initials="G." surname="Wright" fullname="Gary R. Wright">
              <organization/>
            </author>
            <author initials="W." surname="Stevens" fullname="W. Richard Stevens">
              <organization/>
            </author>
            <date year="1995"/>
          </front>
          <seriesInfo name="Addison-Wesley" value=""/>
        </reference>
        <reference anchor="HRX08">
          <front>
            <title>CUBIC: A New TCP-Friendly High-Speed TCP Variant</title>
            <author initials="S." surname="Ha">
              <organization/>
            </author>
            <author initials="I." surname="Rhee">
              <organization/>
            </author>
            <author initials="L." surname="Xu">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="ACM SIGOPS Operating System Review" value=""/>
        </reference>
        <reference anchor="GK81" target="http://www.lk.cs.ucla.edu/data/files/Gail/power.pdf">
          <front>
            <title>An Invariant Property of Computer Network Power</title>
            <author initials="R." surname="Gail">
              <organization/>
            </author>
            <author initials="L." surname="Kleinrock">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="Proceedings of the International Conference on Communications" value="June, 1981"/>
        </reference>
        <reference anchor="K79">
          <front>
            <title>Power and deterministic rules of thumb for probabilistic problems in computer communications</title>
            <author initials="L." surname="Kleinrock">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="Proceedings of the International Conference on Communications" value="1979"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S9eXPbSJYv+n9+CowcFUW6SGrxUraq3XNluRZP2WW1JZen
IzpGAZKQhDYJsAFQMtvt+ezvrJknAVCye/q+eRGv4s5tmQByPXnyrL8zHo/d
9WHywM3LWZEus8NkXqUXzTjPmovxbHZzOZ5Oq/EibbK6cbO0OUyyjytXr6fL
vK7zsmg2K/jm5Y9nP7lVfuiSpClnh8m3TbXOvoV/1ZtllV3U9peyaqKfmrxZ
QBPPn79NjsviEvqBZvHPpioXLoXus2t67NIqS6Wvm8vD5Pj4/c/uw81h32dz
GPBhcrB38HC8vzfef+zSdXNVVodunMBjeJTN86asYDw86d+ydJEcp9X8Jlss
4Neygg5+LsvLRQb/ypZpvjhMipm88H8u6clkVi63NfgyLZLTm6xptjWWp0WN
z7+grf8o62x1lTzP6qt0o+29zpo0tPbXKT38P0v4lZoqymqZNvl1hnvy9qfj
pwdPH8ifB3v7T+TP7x8c+F/395/Kn48ODh7Ln48Pnuq7jx4/2dfPnj480HYf
PtAXnjx98kh/3dvbkz8fPniofz5+eqDvPn78/SP/64PvD11eXNgRHx///Mt/
7NMogKTS6jIDyrtqmtXh7u7f1tk6m6Sz5QQWYncOM84Xk9nF8t/z+bMHewcH
+08e8mdMWN8C6VgaGT9P62zeQzTf0ldKKPj3eAt1hCd/Xs+u1sVlcnyVFZfy
JC+AuI8nyc/roqCfdB/ht9MGdjIrwjNt6LS8yvJF8o/kl7Su0zr5c3aZFtlV
9M7vQFP/kc7KaV3yx0rl+4+ByumXOqvyrMbFPJSuj45fJ3/CFTtM3swaetmv
7/fd9a1hgWe4trq+y/Qy/XteZPUufPr97sHuwf7Bw4MnxBZmYVGnuKj2hxkv
6u5qfvH/t934frx3sGU3jsvlcl3kwEhhqnVSXiTNVYZ7dJj8lE3pY3jz9Ws+
i37VXmSrKsOPYHJn8MHZ8UnyOp1VZT0rV/kseV3Os8XWBXs9gZebq7yOfv0P
/PVqnl7n8eifbqclGP1q3WRVPI3kbXadZzej5LpcTJKHT0dJUU6SR6NktZok
jx+MHz+BbcfthK0/BVpr1qvjm2L+c5oXh23SSOSFZAZvJAm9k6Qw/yq/ps6+
7aXYy7y5Wk+R8e0yO90F8tydLsop0G8NI959Uc7Wy6xoqJHdmnvZvYT2d9Mi
XWzqvMZvzuXJOfZ/jo8nSsB9K2u5/D9LoP8Kinsy/o/1Ilrhk3QGxHL7GvM7
/4uLfOf6/u+sZMEr+aKC4d22jvTC/94qzrH7/w+u4cH++DRbwU8sSVblshzn
s1l1CfJkPn8Ep2b8YtL+FV4/2n/Ufx/d3NxMUB6V+yhfjNNqdgWSwu5NNt1N
/7bcna2rClZsd1lf7u0/fLI3uWqWC7tfyDCPjn9N6vUKOClJrtvZZf4hzRbJ
0bRKr9Jl3SGRR+P9ffqlmrE0mhz96XWC40I6WOQ1cgNYmSdPesWXLJsspovJ
ZXm9u0pXWVXv4q2ZXpf5fNK6LM2teITP02KWJWkx92Lutils2Zv9p0+ejPee
bOHupy9/Pn7z+jW9NfoiXr//hHn9Q+b1D/Yfjh8cPBVuD/0/3YtX4IIWAP7/
SV7nk2y+3s2K+QH8n/7vOC+gS5jyeP/p070JrqldD7jm8oscxAXczt7FOVpc
lhWcsOXXL83TvfHewy1L0x5etNt6u508fRTzCBzl73ByQADBj5tyDP+TBBkp
Sf248R/JJTABOKsvsZMia/okIJJmXk2S51X6YVlG8syr9AbOALR1Gj0O35xk
0K7OOnxVVZvOU78mj7YLA9++/PHHH0E3WVfAlHACp9kimzWwO0egp9XQbVva
2X8weDKEZh8+hmbhlH6rK7ft4INOWk+CfoT/Js64O9/dL8ePHvx1+ub84y/j
5dPLgz8fX/41vXg0/fXJdXby1/cnj19/2Kv+nL999ev43S7qU+2dGf/2+2Fy
VCTvVjhZUFuRqMa0Xf+ahTf8YuuR+1aX4P1pD/HsvjxJXi4W67qpoK35KPm9
XMD8k4NDEgJfLleLzF8UWwf98yR5X+WXV0006J9T2Pa30SN5/z3JxddZUUcf
wM9v89kV3CPR40Ap2/SP+TwHshq/z+pFtpHp/vL2P/eexPM9fvf85THsCNxX
N7QVP0FLxXyxSX6BEY5PV5mc+9/TCnTn7acDduGX1P7wEkZ+lWWtjfzPdbRL
W7cI9SfgjG9OTpM3wK1ZBj/dwE29FGYoc/r5V9aPOwwfr6/FhwmQ8nq2SInt
Qa/p7kW+AK0K5AZQksqbrGpzfyDOl8U1zzY5qUrovdmgyuBZ829Zc1NWH5IT
/HzbesAm/6x8NEz/10WWF1U5+2BW4SJd1NmWZYD+Z7ADMHmvtTCfIuJDCaMs
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

-->

</rfc>
