<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-bbr-06" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="BBR">BBR Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-06"/>
    <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="2026" month="July" day="06"/>
    <area>IETF</area>
    <workgroup>CCWG</workgroup>
    <keyword>Congestion Control</keyword>
    <abstract>
      <?line 227?>

<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>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Congestion Control Working Group Working Group mailing list (ccwg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/ietf-wg-ccwg/draft-cardwell-ccwg-bbr"/>.</t>
    </note>
  </front>
  <middle>
    <?line 245?>

<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 used by the BBR algorithm.</t>
      <t>Constant values have CamelCase names and are used by BBR throughout
its operation for a given connection. Variables have snake_case names.
All names are prefixed with the context they
belong to: (C) for connection state, (P) for per-packet state, (RS) for
per-ack rate sample, or (BBR) for the algorithm's internal state.
Variables that are not defined below are defined in
<xref target="delivery-rate-samples"/>, "Delivery Rate Samples".</t>
      <t>In the pseudocode in this document, all functions have implicit access to the
(C) connection state and (BBR) congestion control algorithm state for that
connection. All functions involved in ACK processing additionally have implicit
access to the (RS) rate sample populated while processing that ACK.</t>
      <t>In this document, the unit of all volumes of data is bytes, the unit of
all times is seconds, and the unit of all data rates is bytes per second.
Implementations MAY use other units, such as bits and bits per second,
or packets and packets per second, as long as the implementation applies
conversions as appropriate. However, since packet sizes can vary
due to changes in MTU or application message sizes, data rates
computed in packets per second can be inaccurate, and thus it is
RECOMMENDED that BBR implementations use bytes and bytes per second.</t>
      <t>In this document, "acknowledged" or "delivered" data means any transmitted
data that the remote transport endpoint has confirmed that it has received,
e.g., via a QUIC ACK Range <xref target="RFC9000"/>, TCP cumulative acknowledgment
<xref target="RFC9293"/>, or TCP SACK ("Selective Acknowledgment") block <xref target="RFC2018"/>.</t>
      <section anchor="delivery-rate-sampling-state">
        <name>Delivery Rate Sampling State</name>
        <t>Connection and per-packet state used in the delivery rate sampling algorithm
is defined in Section [Delivery Rate Sampling State Variables]
(#delivery-rate-sampling-state-variables).</t>
      </section>
      <section anchor="transport-connection-state">
        <name>Transport Connection State</name>
        <t>C.SMSS: The Sender Maximum Send Size in bytes. The maximum
size of a single transmission, including the portion
of the packet that the transport protocol implementation tracks for
congestion control purposes. C.SMSS MUST include transport protocol
payload data. C.SMSS MAY include only the transport protocol payload
data; for example, for TCP BBR implementations the C.SMSS SHOULD be
the Eff.snd.MSS defined in <xref section="3.7.1" sectionFormat="comma" target="RFC9293"/>, which includes
only the TCP transport protocol payload data, but not TCP or IP headers.
C.SMSS MAY include the transport protocol payload data plus the
transport protocol headers; for example, for QUIC BBR implementations
the C.SMSS SHOULD be the QUIC "maximum datagram size"
<xref section="14" sectionFormat="comma" target="RFC9000"/>, which includes the QUIC payload data plus
the QUIC headers, but not UDP or IP headers. In addition to including
transport protocol payload and headers, implementations MAY include
in C.SMSS the size of other headers, such as network-layer or
link-layer headers.</t>
        <t>C.has_selective_acks: True if the connection has the capability to receive
selective acknowledgments and thus is able to detect more than one
packet loss per round trip in fast recovery. For example, this is true
for all QUIC connections by virtue of the QUIC ACK Range <xref target="RFC9000"/>
mechanism, and is true for TCP connections that have negotiated support
for the TCP SACK ("Selective Acknowledgment") <xref target="RFC2018"/> mechanism.</t>
        <t>C.InitialCwnd: The initial congestion window set by the transport protocol
implementation for the connection at initialization time.</t>
        <t>C.delivered: The total amount of data
delivered so far over the lifetime of the transport connection C.
This MUST NOT include pure ACK packets. It SHOULD include spurious
retransmissions that have been acknowledged as delivered.</t>
        <t>C.lost: The total amount of data
marked as lost so far over the lifetime of the transport connection C.</t>
        <t>C.inflight: The connection's best estimate of the number of bytes
outstanding in the network. This includes the number of bytes that
have been sent and have not been acknowledged or
marked as lost since their last transmission
(e.g. "pipe" from <xref target="RFC6675"/> or "bytes_in_flight" from <xref target="RFC9002"/>).
This MUST NOT include pure ACK packets.</t>
        <t>C.is_cwnd_limited: True if the connection has fully utilized C.cwnd at any
point in the last packet-timed round trip.</t>
        <t>C.next_send_time: The earliest pacing departure time another packet can be
sent.</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 packet
of the packets 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: C.inflight at
the time of the transmission of the packet that has just been ACKed (the
most recently sent packet among packets ACKed by the ACK that was just
received).</t>
        <t>RS.lost: The volume of data that was declared lost between the transmission
and acknowledgment of the packet that has just been ACKed (the most recently
sent packet among packets ACKed by the ACK that was just received).</t>
      </section>
      <section anchor="output-control-parameters">
        <name>Output Control Parameters</name>
        <t>C.cwnd: The transport sender's congestion window. When transmitting data,
the sending connection ensures that C.inflight does not exceed C.cwnd.</t>
        <t>C.pacing_rate: The current pacing rate for a BBR flow, which controls
inter-packet spacing.</t>
        <t>C.send_quantum: The maximum size of a data aggregate scheduled and transmitted
together as a unit, e.g., to amortize per-packet transmission overheads.</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
C.pacing_rate.</t>
        <t>BBR.StartupPacingGain: 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>BBR.DrainPacingGain: 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.5, which has been shown to offer good
performance when compared with other alternatives.</t>
        <t>BBR.PacingMarginPercent: The static discount factor of 1% used to scale BBR.bw
to produce C.pacing_rate.</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 (C.cwnd).</t>
        <t>BBR.DefaultCwndGain: 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: P.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>
        <t>BBR.drain_start_round: The value of round_count when Drain state started.</t>
      </section>
      <section anchor="core-algorithm-design-parameters">
        <name>Core Algorithm Design Parameters</name>
        <t>BBR.LossThresh: A constant specifying the maximum tolerated per-round-trip
packet loss rate when probing for bandwidth (the default is 2%).</t>
        <t>BBR.Beta: A constant specifying the default multiplicative decrease to
make upon each round trip during which the connection detects packet
loss (the value is 0.7).</t>
        <t>BBR.Headroom: A constant specifying the multiplicative factor to
apply to BBR.inflight_longterm 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>BBR.MinPipeCwnd: The minimal C.cwnd value BBR targets, to allow pipelining with
endpoints that follow an "ACK every other packet" delayed-ACK policy:
4 * C.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_shortterm: 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. (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_shortterm.</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 inflight
required to reach the full bandwidth available to the flow
(BBR.max_inflight), and the maximum inflight that is consistent with the
queue pressure objective (C.cwnd).</t>
          <t>BBR.min_rtt: The windowed minimum round-trip time sample measured over the
last BBR.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 (e.g., TSO/GSO) and
receiver (e.g., LRO, GRO) host offload mechanisms.</t>
          <t>BBR.max_inflight: The estimate of C.inflight 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 BBR.MinPipeCwnd.</t>
          <t>BBR.inflight_longterm: The long-term maximum inflight 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
inflight causes a loss rate higher than the loss rate
threshold, it sets inflight_longterm to that volume of data. (Part of the long-term
model.)</t>
          <t>BBR.inflight_shortterm: Analogous to BBR.bw_shortterm, the short-term maximum
inflight 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_longterm. (Part of the short-term model.)</t>
        </section>
      </section>
      <section anchor="state-for-responding-to-congestion">
        <name>State for Responding to Congestion</name>
        <t>RS: The rate sample calculated from the most recent acknowledgment.</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>
      </section>
      <section anchor="estimating-bbrmaxbw">
        <name>Estimating BBR.max_bw</name>
        <t>BBR.max_bw_filter: A windowed max filter for RS.delivery_rate
samples, for estimating BBR.max_bw.</t>
        <t>BBR.MaxBwFilterLen: A constant specifying the filter window length for
BBR.max_bw_filter = 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.max_bw_filter 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.extra_acked_filter: A windowed max filter for tracking the degree of
aggregation in the path.</t>
        <t>BBR.ExtraAckedFilterLen: A constant specifying the window length of
the BBR.extra_acked_filter 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 recently 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="probe-bw-state">
        <name>ProbeBW State</name>
        <t>BBR.ack_phase: The current phase in a state machine that tracks the meaning of
the ACK feedback the connection is receiving, with respect to the bandwidth
probing. The phases are as follows:</t>
        <artwork><![CDATA[
  ACKS_INIT: not probing bandwidth; not getting probe feedback
  ACKS_REFILLING: sending at estimated bandwidth to fill pipe
  ACKS_PROBE_STARTING: inflight rising to probe bandwidth
  ACKS_PROBE_FEEDBACK: getting feedback from bandwidth probing
  ACKS_PROBE_STOPPING: stopped bandwidth probing; still getting feedback
]]></artwork>
        <t>BBR.is_bw_probe_sample: A boolean tracking whether the connection is receiving rate samples from a bandwidth-probing phase.</t>
        <t>BBR.is_loss_in_round: A boolean tracking whether there was a packet loss
detected in the current round trip.</t>
        <t>BBR.bw_probe_up_acked: The volume of data ACKed since increasing BBR.inflight_longterm.</t>
        <t>BBR.probe_up_acked_per_inc: The volume of data that must be ACKed before BBR.inflight_longterm is increased by C.SMSS.</t>
        <t>BBR.bw_probe_up_rounds: The number of round trips over which BBR.inflight_longterm has been grown in the current ProbeBW_UP episode.</t>
        <t>BBR.rounds_since_probe_up: The number of round trips elapsed since the last ProbeBW_UP bandwidth probe phase.</t>
        <t>BBR.bw_probe_wait: The maximum wall clock time duration BBR waits before probing bandwidth again.</t>
        <t>BBR.cycle_stamp: The wall clock time at which the current ProbeBW cycle started.</t>
        <t>BBR.prev_probe_too_high: A boolean recording whether the most recent bandwidth probe went too high (i.e., experienced a packet loss rate exceeding BBR.LossThresh). See "Precautionary Bandwidth Probing" in <xref target="bandwidth-probing-caution"/> for how this is used.</t>
        <t>BBR.prev_probe_precautionary: A boolean recording whether the most recent ProbeBW_UP phase was stopped early because it reached the BBR.inflight_longterm threshold from the previous probe that went too high. See "Precautionary Bandwidth Probing" in <xref target="bandwidth-probing-caution"/> for how this is used.</t>
      </section>
      <section anchor="undo-state">
        <name>Undo State</name>
        <t>BBR.undo_state: the value of BBR.state saved upon a loss-induced state transition, to later restore if the loss recovery is detected to be spurious.</t>
        <t>BBR.undo_bw_shortterm: the value of BBR.bw_shortterm saved at the start of loss recovery, to later restore if the loss recovery is detected to be spurious.</t>
        <t>BBR.undo_inflight_shortterm: the value of BBR.inflight_shortterm saved at the start of loss recovery, to later restore if the loss recovery is detected to be spurious.</t>
        <t>BBR.undo_inflight_longterm: the value of BBR.inflight_longterm saved at the start of loss recovery, to later restore if the loss recovery is detected to be spurious.</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>BBR.MinRTTFilterLen: A constant specifying the length of the BBR.min_rtt min
filter window, BBR.MinRTTFilterLen is 10 secs.</t>
        </section>
        <section anchor="parameters-for-scheduling-probertt">
          <name>Parameters for Scheduling ProbeRTT</name>
          <t>BBR.ProbeRTTCwndGain: A constant specifying the gain value for calculating
C.cwnd during ProbeRTT: 0.5 (meaning that ProbeRTT attempts to reduce in-flight
data to 50% of the estimated BDP).</t>
          <t>BBR.ProbeRTTDuration: A constant specifying the minimum duration for which ProbeRTT
state holds C.inflight to BBR.MinPipeCwnd or fewer packets: 200 ms.</t>
          <t>BBR.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
BBR.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 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; 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 C.inflight 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 C.inflight 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 BBR.LossThresh=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 (C.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 C.cwnd parameter that limits
C.inflight in the Reno and CUBIC congestion control algorithms,
BBR uses three distinct control parameters: C.pacing_rate, C.send_quantum,
and C.cwnd, defined in (<xref target="output-control-parameters"/>):</t>
      </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 anchor="ecn">
        <name>ECN</name>
        <t>This experimental version of BBR does not specify a specific response to
Classic <xref target="RFC3168"/>, Alternative Backoff with ECN (ABE) <xref target="RFC8511"/> or
L4S <xref target="RFC9330"/> style ECN. However, if the connection claims ECN support
by marking packets using either the ECT(0) or ECT(1) code point,
the congestion controller response MUST treat any CE marks as congestion.</t>
        <t><xref section="4.1" sectionFormat="comma" target="RFC8311"/> relaxes the requirement from RFC3168 that the
congestion response to CE marks be identical to packet loss.
The congestion response requirements of L4S are detailed in
<xref section="4.3" sectionFormat="comma" target="RFC9330"/>.</t>
      </section>
      <section anchor="experimental-status">
        <name>Experimental Status</name>
        <t>This draft is experimental because there are some known aspects of BBR
for which the community is encouraged to conduct experiments and develop
algorithm improvements, as described below.</t>
        <t>As noted above in <xref target="ecn"/>, BBR as described in this draft does not
specify a specific response to ECN, and instead leaves it as an area for
future work.</t>
        <t>The design of ProbeRTT in <xref target="probertt-design-rationale"/> specifies a ProbeRTT
interval that sacrifices no more than roughly 2% of a flow's available
bandwidth. The impact of using a different interval or making adjustments
for triggering ProbeRTT on specific link types is a subject of
further experimentation.</t>
        <t>The delivery rate sampling algorithm in <xref target="delivery-rate-samples"/>
has an ability to over-estimate delivery rate, as described in
<xref target="compression-and-aggregation"/>. When combined with BBR's windowed
maximum bandwidth filter, this can cause BBR to send too quickly.
BBR mitigates this by limiting any bandwidth sample by the sending rate,
but that still might be higher than the available bandwidth,
particularly in Startup.</t>
        <t>BBR does not deal well with persistently application limited traffic
<xref target="detecting-application-limited-phases"/> , such as low latency audio or
video flows.  When unable to fill the pipe for a full round trip,
BBR will not be able to measure the full link bandwidth, and will mark
a bandwidth sample as app-limited. In cases where an application enters
a phase where all bandwidth samples are app-limited, BBR will not
discard old max bandwidth samples that were not app-limited.</t>
      </section>
    </section>
    <section anchor="input-signals">
      <name>Input Signals</name>
      <t>BBR uses estimated delivery rate and RTT as two critical inputs.</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 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 amount of data that was delivered to the
receiver (not lost), and the sender can compute an estimate of a bottleneck
delivery rate over that time interval.</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_send_time" as the time of the first send in a flight
of data, and "P.send_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.send_time - P.first_send_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 time when congestion control
would have allowed data packets to be sent, and yet there was no data to send.</t>
            <t>More specifically, 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 the following conditions: the congestion window and
pacing rate would have allowed the connection to send data, and yet the
connection is not currently sending data and has no data to send
(i.e., no unsent data or retransmissions of previously sent data).
The precise determination of this condition depends on how the
connection uses mechanisms to implement pacing, batching, GSO/TSO/offload,
etc.</t>
            <t>If these conditions are met, then the sender has run out of data to feed the
network. This effectively creates a gap, a “bubble” of idle time, within the data
pipeline, analogous to an empty segment in a pipe carrying liquid. 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 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, the idle gap, 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="delivery-rate-sampling-state-variables">
            <name>Delivery Rate Sampling State 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_time: The wall clock time when C.delivered was last updated.</t>
              <t>C.first_send_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.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 amount of data in the current outstanding window that
is marked as lost.</t>
              <t>C.retrans_out: The amount of data in the current outstanding window that
are being retransmitted.</t>
              <t>C.min_rtt: The minimum observed RTT over the lifetime of the connection.</t>
              <t>C.srtt: The smoothed RTT, an exponentially weighted moving average of the
observed RTT of the connection.</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 has not been acknowledged. As noted in the
<xref target="offload-mechanisms">Offload Mechanisms</xref> section, if a connection uses an
offload mechanism then it is RECOMMENDED that the packet state be tracked
for each packet "aggregate" rather than each individual packet.  For simplicity this
document refers to such state as "per-packet", whether it is per "aggregate" or
per IP packet.</t>
              <t>P.delivered: C.delivered when the packet was sent from transport connection
C.</t>
              <t>P.lost: C.lost 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_send_time: C.first_send_time when the packet was sent.</t>
              <t>P.send_time: The pacing departure time selected when the packet was scheduled
to be 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.tx_in_flight: C.inflight immediately after the transmission of packet P.</t>
              <t>P.packet_id: A monotonically increasing unique identifier of packet P.
This is protocol specific. E.g., for TCP this is the ending sequence
number of the packet, and for QUIC it is the packet number.</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 recently delivered packet;
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 recently delivered packet.</t>
              <t>RS.prior_time: The P.delivered_time from the most recently delivered packet.</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>
              <t>RS.last_acked_packet_id: The packet identifier of the most recently delivered packet.</t>
            </section>
          </section>
          <section anchor="transmitting-a-data-packet">
            <name>Transmitting a data packet</name>
            <t>Upon transmitting 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 data.
If there is no data 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 that data 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[
  OnPacketSent(Packet P):
    if (C.inflight == 0)
      C.first_send_time  = C.delivered_time = P.send_time

    P.first_send_time = C.first_send_time
    P.delivered_time  = C.delivered_time
    P.delivered       = C.delivered
    P.is_app_limited  = (C.app_limited != 0)
    P.tx_in_flight    = C.inflight    /* includes data in P */
    P.lost            = C.lost
]]></artwork>
          </section>
          <section anchor="upon-receiving-an-ack">
            <name>Upon receiving an ACK</name>
            <t>When an ACK arrives, the connection first calls InitRateSample() to initialize
the per-ACK RateSample RS:</t>
            <artwork><![CDATA[
  /* Initialize the rate sample
   * generated using the ACK being processed. */
  InitRateSample():
    RS.rtt           = -1
    RS.has_data      = false
    RS.prior_time    = 0
    RS.interval      = 0
    RS.delivery_rate = 0
]]></artwork>
            <t>Next, for each newly acknowledged packet, the connection calls
UpdateRateSample() to update the per-ACK rate sample based on a snapshot of
connection delivery information from the time at which the packet was
transmitted. The connection invokes UpdateRateSample() multiple times when a
stretched ACK acknowledges multiple data packets. The connection uses the
information from the most recently sent packet to update the rate sample:</t>
            <artwork><![CDATA[
  /* Update RS when a packet is acknowledged. */
  UpdateRateSample(Packet P):
    if (P.delivered_time == 0)
      return /* P already acknowledged */

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

    /* Update info using the newest packet: */
    if (!RS.has_data || IsNewestPacket(P))
      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.send_time - P.first_send_time
      RS.ack_elapsed      = C.delivered_time - P.delivered_time
      RS.last_acked_packet_id = P.packet_id
      C.first_send_time   = P.send_time

    /* Mark the packet as delivered once it's acknowleged. */
    P.delivered_time = 0

  /* Is the given Packet the most recently sent packet
   * that has been delivered? */
  IsNewestPacket(Packet P):
    return (P.send_time > C.first_send_time ||
            (P.send_time == C.first_send_time &&
             P.packet_id > RS.last_acked_packet_id))
]]></artwork>
            <t>Finally, after the connection has processed all newly acknowledged packets for this
ACK by calling UpdateRateSample() for each packet, the connection invokes
GenerateRateSample() to finish populating the rate sample, RS:</t>
            <artwork><![CDATA[
  /* Upon receiving ACK, fill in delivery rate sample RS. */
  GenerateRateSample():
    /* Clear app-limited field if bubble is ACKed and gone. */
    if (C.app_limited && C.delivered > C.app_limited)
      C.app_limited = 0

    if (RS.prior_time == 0)
      return /* 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 <  C.min_rtt)
      return  /* no reliable rate sample */

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

    return    /* filled in RS with a rate sample */
]]></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
amount of data in flight, and before congestion control modifies C.cwnd or
C.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 packets. 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 (NoUnsentData() &&
        C.pending_transmissions == 0 &&
        C.inflight < C.cwnd &&
        C.lost_out <= C.retrans_out)
      MarkConnectionAppLimited()

  MarkConnectionAppLimited():
    C.app_limited = max(C.delivered + C.inflight, 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 C.SMSS of data into a single packet "aggregate"
for the purposes of scheduling transmissions, then it is RECOMMENDED that the
per-packet state described in Section <xref target="per-packet-p-state">Per-packet (P) state</xref> be
tracked for each packet "aggregate" rather than each IP packet.</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-changing-ack-frequency">
            <name>Impact of changing ACK frequency</name>
            <t>Some transport protocol extensions allow the sender to control how
frequently the receiver sends acknowledgments. Examples include the QUIC
ACK-FREQUENCY extension (<xref target="I-D.draft-ietf-quic-ack-frequency"/>) and the
TCP ACK Rate Request (TARR) option
(<xref target="I-D.draft-ietf-tcpm-ack-rate-request"/>). These extensions enable a
BBR sender to tune the trade-off between the overhead of sending
acknowledgments (e.g., reverse-path bandwidth, receiver CPU and battery
cost) and the fidelity of feedback that BBR's measurement and control
loops rely on.</t>
            <t>When the receiver acknowledges packets less frequently than the default
behavior, fewer delivery rate samples are generated per round trip.
Similar to the case of ACK losses (see <xref target="impact-of-ack-losses"/>), reduced
ACK frequency can produce distortions in delivery rate samples,
particularly when the actual delivery rate changes between two
consecutive ACKs. If the
delivery rate increases between samples, the bandwidth estimate may
underestimate the delivery rate; if it decreases, the estimate may
overestimate. The BBR.max_bw windowed maximum filter (see <xref target="bbr-max-bw"/>)
mitigates the underestimation case by retaining the highest recent sample.</t>
            <t>Additionally, reduced ACK frequency can affect the timeliness of
BBR's round-trip counting (see <xref target="bbr-round-count"/>).
Since BBR detects round-trip boundaries upon receiving ACKs, fewer ACKs
may delay the detection of round-trip completions, which in turn can delay
BBR state machine transitions that are gated on round-trip progress (e.g.,
exiting Startup, transitioning from ProbeBW_REFILL to ProbeBW_UP).</t>
            <t>Reduced ACK frequency can also cause the sender to exhaust its
congestion window more often, leading to underutilization.
This effect is particularly significant when the bottleneck has a
relatively shallow buffer or AQM, such that C.cwnd is only marginally
higher than the path BDP. If a sender that has requested reduced ACK
frequency observes that it frequently exhausts C.cwnd before the next
ACK arrives, it SHOULD increase the requested ACK frequency.</t>
            <t>A BBR sender that has the ability to control ACK frequency SHOULD
adjust it based on the current BBR phase, requesting more frequent
acknowledgments when timely feedback is most beneficial and less
frequent acknowledgments to reduce overhead in steady-state phases.
The following per-phase guidance applies:</t>
            <ul spacing="normal">
              <li>
                <t>Startup, ProbeBW_REFILL, and ProbeBW_UP: The sender SHOULD request
frequent acknowledgments to ensure that delivery rate samples are
generated often enough for timely full-pipe detection and accurate
bandwidth probing. The sender SHOULD request parameters that yield
at least 4 acknowledgments per round trip. Before or upon entering
ProbeBW_REFILL, the sender SHOULD increase acknowledgment frequency
if it was previously reduced during ProbeBW_DOWN or ProbeBW_CRUISE.</t>
              </li>
              <li>
                <t>ProbeBW_DOWN and ProbeBW_CRUISE: The sender MAY request less frequent
ACKs to lower overhead, since these phases do not rely on rapid
feedback for probing. The sender MAY request an ACK delay of up to
0.5 * C.srtt and an ACK threshold of up to roughly a quarter
of the current congestion window. Keeping these values moderate
ensures that loss detection is not excessively delayed by infrequent
ACKs.</t>
              </li>
              <li>
                <t>ProbeRTT: During ProbeRTT, the sender SHOULD solicit a prompt
acknowledgment (e.g., via a QUIC IMMEDIATE_ACK frame or a TCP TARR
option with R=0) on the last packet of each flight of data, to obtain
a timely and accurate BBR.min_rtt sample while the queue is drained.
Implementations MAY also request a short ACK delay during ProbeRTT,
though this is often unnecessary since few packets are sent during
this brief phase.</t>
              </li>
            </ul>
            <t>When available, the QUIC Receive Timestamps extension
(<xref target="I-D.draft-ietf-quic-receive-ts"/>) can improve the fidelity of
delivery rate estimation under reduced ACK frequency. Receive timestamps
allow the sender to compute more accurate inter-packet arrival times at
the receiver, providing finer-grained bandwidth measurement even when
ACKs are infrequent. A sender MAY use receive timestamps to refine its
"ack_rate" calculation by substituting receiver-side timing information
for ACK arrival times.</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 a retransmitted packet.</t>
            <t>If the transport protocol supports unambiguous ACKs for retransmitted data
(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 anchor="connections-without-sack">
              <name>TCP Connections without SACK</name>
              <t>Whenever possible, TCP connections using BBR as a congestion controller SHOULD
use both SACK and timestamps. Failure to do so will cause BBR's RTT and
bandwidth measurements to be much less accurate.</t>
              <t>When using TCP without SACK (i.e., either or both ends of the connections do
not accept SACK), 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>
      <section anchor="rtt-samples">
        <name>RTT Samples</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 P.send_time (see "Pacing Rate: C.pacing_rate" in
<xref target="pacing-rate-bbrpacingrate"/> for how this is calculated).</t>
        <t>For every ACK that newly acknowledges data, 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. QUIC or TCP with
timestamps <xref target="RFC7323"/>), then the sender calculates an RTT sample, RS.rtt,
as follows:</t>
        <artwork><![CDATA[
  RS.rtt = Now() - P.send_time
]]></artwork>
      </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
C.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 than 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 BBR.pacing_gain and the
C.cwnd. Primarily, it uses BBR.pacing_gain (see the "Pacing Rate" section), which
controls how fast packets are sent relative to BBR.bw. A BBR.pacing_gain &gt; 1
decreases inter-packet time and increases C.inflight. A BBR.pacing_gain &lt; 1 has the
opposite effect, increasing inter-packet time and while aiming to decrease
C.inflight. C.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 C.inflight to a particular absolute value, it uses
C.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[
  OnInit():
    InitWindowedMaxFilter(filter=BBR.max_bw_filter, value=0, time=0)
    BBR.min_rtt = C.srtt ? C.srtt : Infinity
    BBR.min_rtt_stamp = Now()
    BBR.probe_rtt_done_stamp = 0
    BBR.probe_rtt_round_done = false
    BBR.prior_cwnd = 0
    BBR.undo_state = None
    BBR.undo_bw_shortterm = 0
    BBR.undo_inflight_shortterm = 0
    BBR.undo_inflight_longterm = 0
    BBR.idle_restart = false
    BBR.extra_acked_interval_start = Now()
    BBR.extra_acked_delivered = 0
    BBR.full_bw_reached = false
    BBR.inflight_longterm = Infinity
    BBR.probe_up_acked_per_inc = Infinity
    BBR.bw_probe_up_acked = 0
    BBR.bw_probe_up_rounds = 0
    BBR.rounds_since_probe_up = 0
    BBR.is_bw_probe_sample = false
    BBR.prev_probe_too_high = false
    BBR.prev_probe_precautionary = false
    BBR.ack_phase = ACKS_INIT
    BBR.cycle_stamp = 0
    BBR.bw_probe_wait = 0
    ResetCongestionSignals()
    ResetShortTermModel()
    InitRoundCounting()
    ResetFullBW()
    InitPacingRate()
    EnterStartup()
]]></artwork>
        </section>
        <section anchor="per-transmit-steps">
          <name>Per-Transmit Steps</name>
          <t>Before transmitting, BBR merely needs to check for the case where the flow
is restarting from idle:</t>
          <artwork><![CDATA[
  OnTransmit():
    HandleRestartFromIdle()
]]></artwork>
        </section>
        <section anchor="per-ack-steps">
          <name>Per-ACK Steps</name>
          <t>On every ACK, the BBR algorithm executes the following UpdateOnACK() 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[
  UpdateOnACK():
    GenerateRateSample()
    UpdateModelAndState()
    UpdateControlParameters()

  UpdateModelAndState():
    UpdateLatestDeliverySignals()
    UpdateCongestionSignals()
    UpdateACKAggregation()
    CheckFullBWReached()
    CheckStartupDone()
    CheckDrainDone()
    UpdateProbeBWCyclePhase()
    UpdateMinRTT()
    CheckProbeRTT()
    AdvanceLatestDeliverySignals()
    BoundBWForModel()

  UpdateControlParameters():
    SetPacingRate()
    SetSendQuantum()
    SetCwnd()
]]></artwork>
        </section>
        <section anchor="per-loss-steps">
          <name>Per-Loss Steps</name>
          <t>On every packet loss event where the transport protocol marks some packet P as
lost, the BBR algorithm calls HandleLostPacket(P) to update its network path
model (see <xref target="probing-for-bandwidth-in-probebw"/>).</t>
        </section>
        <section anchor="spurious-loss-steps">
          <name>Spurious Loss Recovery Steps</name>
          <t>If the transport protocol detects that a loss recovery episode was spurious,
BBR calls HandleSpuriousLossDetection() to update its network path model
(see <xref target="updating-the-model-upon-spurious-packet-loss"/>).</t>
        </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 BBR.StartupPacingGain (2.77) <xref target="BBRStartupPacingGain"/>
and BBR.cwnd_gain to BBR.DefaultCwndGain (2) <xref target="BBRStartupCwndGain"/>.</t>
            <t>When initializing a connection, or upon any later entry into Startup mode,
BBR executes the following EnterStartup() steps:</t>
            <artwork><![CDATA[
  EnterStartup():
    BBR.state = Startup
    BBR.pacing_gain = BBR.StartupPacingGain
    BBR.cwnd_gain = BBR.DefaultCwndGain
]]></artwork>
            <t>As BBR grows its sending rate rapidly, it obtains higher delivery rate
samples, BBR.max_bw increases, and the C.pacing_rate and C.cwnd both adapt by
smoothly growing in proportion. Once the pipe is full, a queue typically
forms, but the BBR.cwnd_gain bounds any queue to (BBR.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[
  CheckStartupDone():
    CheckStartupHighLoss()
    if (BBR.state == Startup && BBR.full_bw_reached)
      EnterDrain()
]]></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[
  ResetFullBW():
    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[
  CheckFullBWReached():
    if (BBR.full_bw_now || !BBR.round_start || RS.is_app_limited)
      return  /* no need to check for a full pipe now */
    if (RS.delivery_rate >= BBR.full_bw * 1.25)
      ResetFullBW()       /* bw is still growing, so reset */
      BBR.full_bw = RS.delivery_rate  /* record new baseline bw */
      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.</t>
            <t>For connections that can detect more than one packet loss per round trip
(i.e., a connection where C.has_selective_acks is true),
CheckStartupHighLoss() exits Startup based on packet loss if 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
BBR.LossThresh (2%).</t>
              </li>
              <li>
                <t>There are at least BBRStartupFullLossCnt=6 discontiguous sequence ranges
lost in that round trip.</t>
              </li>
            </ul>
            <t>For connections for which C.has_selective_acks is false and thus the connection
can only detect one packet loss per round trip, CheckStartupHighLoss() exits
Startup based on packet loss if any packet loss is detected during fast
recovery.</t>
            <t>If CheckStartupHighLoss() exits Startup based on packet loss, it takes the
following steps. First, it sets BBR.undo_state = Startup (to enable an
undo of this step if the loss recovery is later detected to be spurious).
Second, it sets BBR.full_bw_reached = true. Then it sets
BBR.inflight_longterm 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 BBR.DrainPacingGain = 0.5, chosen via analysis
<xref target="BBRDrainPacingGain"/> and experimentation to try to drain the queue in less
than one round-trip:</t>
          <artwork><![CDATA[
  EnterDrain():
    BBR.state = Drain
    BBR.pacing_gain = BBR.DrainPacingGain    /* pace slowly */
    BBR.cwnd_gain = BBR.DefaultCwndGain      /* maintain cwnd */
    BBR.drain_start_round = BBR.round_count
]]></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. Normally, this
condition should be met within one round-trip of entering the drain state.
However, it could take longer if the bandwidth was overestimated during Startup
due to interactions with competing flows. In that case, BBR enters ProbeBW
after 3 round-trips, allowing the bandwidth max filter to advance during the
next probing cycle. To implement this, upon every ACK BBR executes:</t>
          <artwork><![CDATA[
  CheckDrainDone():
    if (BBR.state == Drain &&
        (C.inflight <= Inflight(1.0) ||
         BBR.round_count > BBR.drain_start_round + 3))
      EnterProbeBW()
]]></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 ProbeBW 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 BBR.inflight_longterm is set, then BBR remains in
ProbeBW_DOWN at least until inflight is less than or
equal to a target calculated based on (1 - BBR.Headroom)*BBR.inflight_longterm.
The goal of this constraint is to ensure that in cases where loss signals
suggest an upper limit on C.inflight, 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>C.inflight 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_shortterm and BBR.inflight_shortterm, because these signals suggest that
the available bandwidth and deliverable inflight 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 BBR.bw_shortterm and
BBR.inflight_shortterm, 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 short-term model that incorporates packet
losses caused by cross-traffic and beginning to robustly probe the bottleneck's
long-term available bandwidth. During this time the estimated bandwidth and
BBR.inflight_longterm, 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. BBR.inflight_longterm)
to significantly underestimate. In particular, if the flow were to transition
directly from ProbeBW_CRUISE to ProbeBW_UP, C.inflight
(at the time the first accelerating packets were sent) may often be still very
close to the C.inflight maintained in CRUISE, which may be
only (1 - BBR.Headroom)*BBR.inflight_longterm.</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 BBR.inflight_longterm
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>
          </section>
          <section anchor="bandwidth-probing-accel">
            <name>Accelerating to Probe for Bandwidth</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 BBR.cwnd_gain to 2.25, to ensure that the flow
can send faster than it had been, even if C.cwnd was previously limiting the
sending process.</t>
            <t>If the flow has not set BBR.inflight_longterm, it implicitly tries to raise
C.inflight to at least BBR.pacing_gain * BBR.bdp = 1.25 *
BBR.bdp.</t>
            <t>If the flow has set BBR.inflight_longterm and C.inflight encounters that limit,
the flow raises BBR.inflight_longterm in ProbeBW_UP in a manner that is slow and
cautious at first, but increasingly rapid over time.  The caution is motivated
by the fact that a given BBR flow may be sharing a buffer with many other
flows, and the buffer space available to the flow may be limited. 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 C.inflight by up to O(1,000,000) packets; even a
high-speed WAN BDP like 10Gbps * 100ms is around 83,000 packets (with a
1500-byte MTU). The additive increase to BBR.inflight_longterm doubles each
round trip; in each successive round trip, BBR.inflight_longterm grows (in units
of C.SMSS) by 1, 2, 4, 8, 16, etc, with the increases spread uniformly across the
entire round trip. This allows BBR to utilize a larger BDP in O(log(BDP)) round
trips, meeting the design goal for scalable utilization of newly-available
bandwidth.</t>
          </section>
          <section anchor="bandwidth-probing-caution">
            <name>Precautionary Bandwidth Probing</name>
            <t>Increasing a flow's sending rate is essential for ensuring proper bandwidth
utilization, but raises risks for excessive queuing or packet loss. To mitigate
these risks, ProbeBW_UP uses a "precautionary bandwidth probing"
mechanism. With this mechanism, flows only persist in ProbeBW_UP if the most
recent ProbeBW_UP phase did not result in excess loss. If ProbeBW_UP exits due
to excess loss, then the following ProbeBW_UP phase is a brief "precautionary
bandwidth probing" phase that lasts only until C.inflight reaches
BBR.inflight_longterm. If the "precautionary bandwidth probing" phase succeeds
(there is no excess loss) then the flow immediately returns to ProbeBW_REFILL
and then ProbeBW_UP, and persists in ProbeBW_UP.</t>
            <t>The "precautionary bandwidth probing" mechanism is motivated by the fact that a
full round trip is required to receive feedback indicating the level of queuing
delay and/or packet loss associated with a given level of
C.inflight. Furthermore, BBR.inflight_longterm is designed to remember the
lowest level of C.inflight that was associated with excess loss. Thus
maintaining C.inflight at BBR.inflight_longterm for a full round trip, while
necessary to safely raise BBR.inflight_longterm, runs a significant risk of
holding a bottleneck buffer at full or near-full for that entire round trip.</t>
            <t>To manage this trade-off and mitigate the risks, the "precautionary bandwidth
probing" mechanism ensures the flow only maintains C.inflight at the
BBR.inflight_longterm level for a full round trip when this has recently been
measured to be "safe" (in the sense of not causing excess loss). To do this, it
uses the following two aspects:</t>
            <ul spacing="normal">
              <li>
                <t>Precautionary Bandwidth Probing: Deceleration: after
BBR.inflight_longterm is set due to observing excess loss in bandwidth
probing (setting BBR.prev_probe_too_high to true), when the flow next
probes for bandwidth, it takes a cautious approach: rather than
maintaining C.inflight at BBR.inflight_longterm for the full round trip,
BBR transitions to ProbeBW_DOWN as soon as C.inflight reaches this risky
level of BBR.inflight_longterm (recording this by setting
BBR.prev_probe_precautionary to true).</t>
              </li>
              <li>
                <t>Precautionary Bandwidth Probing: Acceleration: If a round-trip elapses
and the flow finishes receiving at least a full round trip of ACK
feedback from bandwidth probing without detecting excess packet loss
(meaning BBR.prev_probe_too_high remains false), then the flow
immediately returns to ProbeBW_REFILL to probe for bandwidth again
(bypassing the usual cruise phase), this time allowing itself to maintain
C.inflight at BBR.inflight_longterm without precautionary deceleration.</t>
              </li>
            </ul>
          </section>
          <section anchor="exit-conditions-for-bandwidth-probing-">
            <name>Exit Conditions for Bandwidth Probing</name>
            <t>The BBR flow ends ProbeBW_UP bandwidth probing and
transitions to ProbeBW_DOWN to try to drain the bottleneck queue when any
of the following conditions are met:</t>
            <ol spacing="normal" type="1"><li>
                <t>Bandwidth saturation: IsTimeToGoDown() (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, C.inflight is constrained
  by BBR.inflight_longterm (the flow becomes cwnd-limited while cwnd is limited by
  BBR.inflight_longterm), then the flow cannot fully explore the available bandwidth,
  and so it resets the "full pipe" estimator by calling ResetFullBW().</t>
              </li>
              <li>
                <t>Loss: The current loss rate, over the time scale of the last round trip,
  exceeds BBR.LossThresh (2%).</t>
              </li>
              <li>
                <t>Precautionary Bandwidth Probing: Deceleration: If the previous
  ProbeBW_UP resulted in excess loss (BBR.prev_probe_too_high is true), and
  C.inflight reaches the risky BBR.inflight_longterm level established
  during that previous ProbeBW_UP, then the flow stops the bandwidth probe
  early (setting BBR.prev_probe_precautionary to true) and transitions to
  ProbeBW_DOWN, to reduce the risks of causing excessive queuing delay
  and/or loss.</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, C.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 C.cwnd would give the flow Reno-equivalent throughput.
At any given moment, choose the C.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 C.cwnd from roughly BDP to 2*BDP,
one C.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 C.cwnd
(back to BBR.inflight_longterm) 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? */
  IsTimeToProbeBW():
    if (HasElapsedInPhase(BBR.bw_probe_wait) ||
        IsRenoCoexistenceProbeTime())
      StartProbeBW_REFILL()
      return true
    return false

  /* Randomized decision about how long to wait until
   * probing for bandwidth, using round count and wall clock.
   */
  PickProbeWait():
    /* Decide random round-trip bound for wait: */
    BBR.rounds_since_probe_up =
      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 */

  IsRenoCoexistenceProbeTime():
    reno_rounds = TargetInflight()
    rounds = min(reno_rounds, 63)
    return BBR.rounds_since_probe_up >= rounds

  /* How much data do we want in flight?
   * Our estimated BDP, unless congestion cut C.cwnd. */
  TargetInflight()
    return min(BBR.bdp, C.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[
  EnterProbeBW():
    BBR.cwnd_gain = BBR.DefaultCwndGain
    StartProbeBW_DOWN()
]]></artwork>
            <t>The core logic for entering each state:</t>
            <artwork><![CDATA[
  StartProbeBW_DOWN():
    ResetCongestionSignals()
    BBR.probe_up_acked_per_inc = Infinity /* not growing BBR.inflight_longterm */
    PickProbeWait()
    BBR.cycle_stamp = Now()  /* start wall clock */
    BBR.ack_phase  = ACKS_PROBE_STOPPING
    StartRound()
    BBR.state = ProbeBW_DOWN

  StartProbeBW_CRUISE():
    BBR.state = ProbeBW_CRUISE

  StartProbeBW_REFILL():
    ResetShortTermModel()
    BBR.bw_probe_up_rounds = 0
    BBR.bw_probe_up_acked = 0
    BBR.prev_probe_precautionary = false
    BBR.ack_phase = ACKS_REFILLING
    StartRound()
    BBR.state = ProbeBW_REFILL

  StartProbeBW_UP():
    BBR.ack_phase = ACKS_PROBE_STARTING
    StartRound()
    ResetFullBW()
    BBR.full_bw = RS.delivery_rate
    BBR.state = ProbeBW_UP
    RaiseInflightLongtermSlope()
]]></artwork>
            <t>BBR executes the following UpdateProbeBWCyclePhase() logic on each ACK
that acknowledges new data, to advance the ProbeBW state machine:</t>
            <artwork><![CDATA[
  /* The core state machine logic for ProbeBW: */
  UpdateProbeBWCyclePhase():
    if (!BBR.full_bw_reached)
      return  /* only handling steady-state behavior here */
    if (AdaptLongTermModel())
      return  /* already decided state transition */
    if (!IsInAProbeBWState())
      return /* only handling ProbeBW states here: */

    switch (state)

    ProbeBW_DOWN:
      if (IsTimeToProbeBW())
        return /* already decided state transition */
      if (IsTimeToCruise())
        StartProbeBW_CRUISE()

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

    ProbeBW_REFILL:
      /* After one round of REFILL, start UP */
      if (BBR.round_start)
        BBR.is_bw_probe_sample = true
        StartProbeBW_UP()

    ProbeBW_UP:
      if (IsTimeToGoDown())
        BBR.prev_probe_too_high = false  /* no high loss (yet) */
        StartProbeBW_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? */
  IsTimeToCruise():
    if (C.inflight > InflightWithHeadroom())
      return false /* not enough headroom */
    if (C.inflight > Inflight(BBR.max_bw, 1.0))
      return false /* C.inflight > estimated BDP */
    return true

  /* Time to transition from UP to DOWN? */
  IsTimeToGoDown():
    /* Precautionary Bandwidth Probing: Deceleration */
    if (BBR.prev_probe_too_high && C.inflight >= BBR.inflight_longterm)
      BBR.prev_probe_precautionary = true
      return true
    if (C.is_cwnd_limited && C.cwnd >= BBR.inflight_longterm)
      ResetFullBW()   /* bw is limited by BBR.inflight_longterm */
      BBR.full_bw = RS.delivery_rate
    else if (BBR.full_bw_now)
      return true  /* we estimate we've fully used path bw */
    return false

  IsProbingBW():
    return (BBR.state == Startup or
            BBR.state == ProbeBW_REFILL or
            BBR.state == ProbeBW_UP)

  HasElapsedInPhase(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 */
  InflightWithHeadroom():
    if (BBR.inflight_longterm == Infinity)
      return Infinity
    headroom = max(1*C.SMSS, BBR.Headroom * BBR.inflight_longterm)
    return max(BBR.inflight_longterm - headroom,
               BBR.MinPipeCwnd)

  /* Raise BBR.inflight_longterm slope if appropriate. */
  RaiseInflightLongtermSlope():
    growth_this_round = 1 << BBR.bw_probe_up_rounds
    BBR.bw_probe_up_rounds = min(BBR.bw_probe_up_rounds + 1, 30)
    BBR.probe_up_acked_per_inc = max(C.cwnd / growth_this_round, C.SMSS)

  /* Increase BBR.inflight_longterm if appropriate. */
  ProbeInflightLongtermUpward():
    if (!C.is_cwnd_limited || C.cwnd < BBR.inflight_longterm)
      return  /* not fully using BBR.inflight_longterm, so don't grow it */
    BBR.bw_probe_up_acked += RS.newly_acked
    if (BBR.bw_probe_up_acked >= BBR.probe_up_acked_per_inc)
      delta = BBR.bw_probe_up_acked / BBR.probe_up_acked_per_inc
      BBR.bw_probe_up_acked -= delta * BBR.probe_up_acked_per_inc
      BBR.inflight_longterm += delta * C.SMSS
    if (BBR.round_start)
      RaiseInflightLongtermSlope()

  /* Track ACK state and update BBR.max_bw window and
   * BBR.inflight_longterm.
   * Returns true if it decided a state transition, false otherwise. */
  AdaptLongTermModel():
    if (BBR.ack_phase == ACKS_PROBE_STARTING && BBR.round_start)
      /* starting to get bw probing samples */
      BBR.ack_phase = ACKS_PROBE_FEEDBACK
    if (BBR.ack_phase == ACKS_PROBE_STOPPING && BBR.round_start)
      /* end of samples from bw probing phase */
      BBR.is_bw_probe_sample = false
      BBR.ack_phase = ACKS_INIT
      if (IsInAProbeBWState() && !RS.is_app_limited)
        AdvanceMaxBwFilter()
      /* Precautionary Bandwidth Probing: Acceleration */
      if (IsInAProbeBWState() &&
          BBR.prev_probe_precautionary &&
          !BBR.prev_probe_too_high)
        StartProbeBW_REFILL()
        return true

    if (!IsInflightTooHigh())
      /* Loss rate is safe. Adjust upper bounds upward. */
      if (BBR.inflight_longterm == Infinity)
        return false /* no upper bounds to raise */
      if (RS.tx_in_flight > BBR.inflight_longterm)
        BBR.inflight_longterm = RS.tx_in_flight
      if (BBR.state == ProbeBW_UP)
        ProbeInflightLongtermUpward()
    return false
]]></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 C.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 BBR.ProbeRTTInterval = 5 seconds, the flow enters ProbeRTT, decelerating
by setting its cwnd_gain to BBR.ProbeRTTCwndGain = 0.5 to reduce
C.inflight 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 BBR.MinRTTFilterLen roughly twice
the BBR.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 C.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 ProbeRTT 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 BBR.ProbeRTTInterval = 5 seconds, then BBR
enters ProbeRTT and reduces the BBR.cwnd_gain to BBR.ProbeRTTCwndGain = 0.5.</t>
            <t>Exit conditions: After maintaining C.inflight at
BBR.ProbeRTTCwndGain*BBR.bdp for at least BBR.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 BBR.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, BBR.MinRTTFilterLen, and
time interval between ProbeRTT states, BBR.ProbeRTTInterval, work in concert.
BBR uses a BBR.MinRTTFilterLen equal to or longer than BBR.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 BBR.ProbeRTTInterval of 5 secs.</t>
            <t>A BBR.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
BBR.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>
            <t>The frequency of triggering ProbeRTT involves a tradeoff between the speed of
convergence and the throughput penalty of applying a cwnd cap during ProbeRTT.
The interval between ProbeRTTs is a subject of further experimentation.
A longer duration between ProbeRTT would reduce the throughput penalty for bulk
flows or flows on lower BDP links that are less likely to have silences or
low-rate periods, at the cost of slower convergence. Furthermore, some types
of links can switch between paths of significantly different base
RTT (e.g. LEO satellite or cellular handoff). If these path changes can be
predicted or detected, initiating a ProbeRTT immediately could conceivably
speed up the convergence to an accurate BBR.min_rtt, especially when it
has increased.</t>
          </section>
          <section anchor="probertt-logic">
            <name>ProbeRTT Logic</name>
            <t>On every ACK BBR executes UpdateMinRTT() 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[
  UpdateMinRTT()
    BBR.probe_rtt_expired =
      Now() > BBR.probe_rtt_min_stamp + BBR.ProbeRTTInterval
    if (RS.rtt >= 0 &&
        (RS.rtt < BBR.probe_rtt_min_delay ||
         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 + BBR.MinRTTFilterLen
    if (BBR.probe_rtt_min_delay < BBR.min_rtt ||
        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 CheckProbeRTT() to handle the steps related
to the ProbeRTT state as follows:</t>
            <artwork><![CDATA[
  CheckProbeRTT():
    if (BBR.state != ProbeRTT &&
        BBR.probe_rtt_expired &&
        !BBR.idle_restart)
      EnterProbeRTT()
      SaveCwnd()
      BBR.probe_rtt_done_stamp = 0
      BBR.ack_phase = ACKS_PROBE_STOPPING
      StartRound()
    if (BBR.state == ProbeRTT)
      HandleProbeRTT()
    if (RS.delivered > 0)
      BBR.idle_restart = false

  EnterProbeRTT():
    BBR.state = ProbeRTT
    BBR.pacing_gain = 1
    BBR.cwnd_gain = BBR.ProbeRTTCwndGain  /* 0.5 */

  HandleProbeRTT():
    /* Ignore low rate samples during ProbeRTT: */
    MarkConnectionAppLimited()
    if (BBR.probe_rtt_done_stamp == 0 &&
        C.inflight <= ProbeRTTCwnd())
      /* Wait for at least BBR.ProbeRTTDuration to elapse: */
      BBR.probe_rtt_done_stamp =
        Now() + BBR.ProbeRTTDuration
      /* Wait for at least one round to elapse: */
      BBR.probe_rtt_round_done = false
      StartRound()
    else if (BBR.probe_rtt_done_stamp != 0)
      if (BBR.round_start)
        BBR.probe_rtt_round_done = true
      if (BBR.probe_rtt_round_done)
        CheckProbeRTTDone()

  CheckProbeRTTDone():
    if (BBR.probe_rtt_done_stamp != 0 &&
        Now() > BBR.probe_rtt_done_stamp)
      /* schedule next ProbeRTT: */
      BBR.probe_rtt_min_stamp = Now()
      RestoreCwnd()
      ExitProbeRTT()
]]></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 ResetShortTermModel() to reset
the short-term model, since any congestion encountered in ProbeRTT may have pulled
it far below the capacity of the path.</t>
            <t>But the algorithm is cautious in timing the next bandwidth probe: raising
C.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[
  ExitProbeRTT():
    ResetShortTermModel()
    if (BBR.full_bw_reached)
      StartProbeBW_DOWN()
      StartProbeBW_CRUISE()
    else
      EnterStartup()
]]></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 C.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 C.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 C.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
HandleRestartFromIdle() before sending a packet for a flow:</t>
          <artwork><![CDATA[
  HandleRestartFromIdle():
    if (C.inflight == 0 && C.app_limited)
      BBR.idle_restart = true
      BBR.extra_acked_interval_start = Now()
      if (IsInAProbeBWState())
        SetPacingRateWithGain(1)
      else if (BBR.state == ProbeRTT)
        CheckProbeRTTDone()
]]></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 appropriate data rate</t>
          </li>
          <li>
            <t>parameters to model the appropriate inflight</t>
          </li>
        </ul>
        <section anchor="bbr-round-count">
          <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 packet, and then end
at the acknowledgment of that packet. 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[
  InitRoundCounting():
    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[
  P.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 += P.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[
  UpdateRound():
    if (P.delivered >= BBR.next_round_delivered)
      StartRound()
      BBR.round_count++
      BBR.rounds_since_probe_up++
      BBR.round_start = true
    else
      BBR.round_start = false

  StartRound():
    BBR.next_round_delivered = C.delivered
]]></artwork>
        </section>
        <section anchor="bbr-max-bw">
          <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>
        <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
UpdateMaxBw() to update the BBR.max_bw estimator as follows:</t>
          <artwork><![CDATA[
  UpdateMaxBw()
    UpdateRound()
    if (RS.delivery_rate > 0 &&
        (RS.delivery_rate >= BBR.max_bw || !RS.is_app_limited))
        BBR.max_bw = UpdateWindowedMaxFilter(
                      filter=BBR.max_bw_filter,
                      value=RS.delivery_rate,
                      time=BBR.cycle_count,
                      window_length=BBR.MaxBwFilterLen)
]]></artwork>
          <t>UpdateWindowedMaxFilter() can be implemented using Kathleen Nichols' algorithm
for tracking the minimum/maximum value of a data stream over some measurement
window. The description of the algorithm and a sample implementation are
available in Linux <xref target="KN_FILTER"/>.</t>
        </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 ProbeBW 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[
  AdvanceMaxBwFilter():
    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>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., C.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 BBR.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 BBR.MinRTTFilterLen = 10 secs.
This is driven by trade-offs among several considerations:</t>
            <ul spacing="normal">
              <li>
                <t>The BBR.MinRTTFilterLen is longer than BBR.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 C.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 BBR.MinRTTFilterLen aims to be long enough to avoid needing to reduce in-flight
data and throughput often. Measuring two-way propagation delay requires in-flight
data to be at or below the 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 BBR.MinRTTFilterLen aims to be long enough that many applications have a
"natural" moment of silence or low utilization that can reduce in-flight data below
the BDP and naturally serve to refresh the BBR.min_rtt, without requiring BBR to
force an artificial reduction in in-flight data. This applies to many popular
applications, including Web, RPC, or chunked audio/video traffic.</t>
              </li>
              <li>
                <t>The BBR.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="bbr-offload-budget">
          <name>BBR.offload_budget</name>
          <t>BBR.offload_budget is the estimate of the minimum volume of data necessary
to achieve full throughput when send and/or receive offload is in use.
This varies based on the transport protocol and operating environment.</t>
          <section anchor="tcp-offload-budget">
            <name>TCP Offload Budget</name>
            <t>For TCP, senders commonly use TSO or GSO and receivers use LRO or GRO.</t>
            <t>For TCP, offload_budget can be computed as follows:</t>
            <artwork><![CDATA[
    UpdateOffloadBudget():
      BBR.offload_budget = 3 * C.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="quic-offload-budget">
            <name>QUIC Offload Budget</name>
            <t>For QUIC, in the simplest case, offload_budget is equal to the send quantum:</t>
            <artwork><![CDATA[
    UpdateOffloadBudget():
      BBR.offload_budget = C.send_quantum
]]></artwork>
            <t>In addition, QUIC senders might have pacing offload available, allowing them to
schedule packets for transmission in the future. In this case, the offload
budget SHOULD be increased to include the amount of data that can be scheduled
for future transmissions by the pacing offload mechanism.</t>
            <t>Furthermore, QUIC receivers might acknowledge packets less often than
<xref section="13.2" sectionFormat="comma" target="RFC9000"/>, such as when using the ACK-FREQUENCY
(<xref target="I-D.draft-ietf-quic-ack-frequency"/>) extension. The offload budget can be
increased by min(Ack-Eliciting Threshold, Requested Max Ack Delay * BBR.max_bw)
to account for delayed acknowledgements.</t>
          </section>
        </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. It then computes BBR.extra_acked as the windowed maximum over 1
round trip during STARTUP and 10 round trips after exiting STARTUP. 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>Note that when the sender has requested reduced ACK frequency (see
<xref target="impact-of-changing-ack-frequency"/>), the resulting infrequent ACKs can
produce bursty ACK arrivals that resemble ACK aggregation. The
BBR.extra_acked estimator will account for this by increasing C.cwnd to
allow the sender to continue transmitting during inter-ACK gaps.</t>
          <t>BBR augments C.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[
  UpdateACKAggregation():
    /* 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, C.cwnd)
    if (BBR.full_bw_reached)
      filter_len = BBR.ExtraAckedFilterLen
    else
      filter_len = 1  /* in Startup, just remember 1 round */
    BBR.extra_acked =
      UpdateWindowedMaxFilter(
        filter=BBR.extra_acked_filter,
        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_longterm:</t>
            <artwork><![CDATA[
  /* Do loss signals suggest C.inflight was too high? */
  IsInflightTooHigh():
    return ((RS.lost > RS.tx_in_flight * BBR.LossThresh) ||
            (RS.lost > 0 && !C.has_selective_acks))

  HandleInflightTooHigh():
    BBR.prev_probe_too_high = true
    BBR.is_bw_probe_sample = false  /* only react once per bw probe */
    if (!RS.is_app_limited)
      BBR.inflight_longterm = max(RS.tx_in_flight,
                            TargetInflight() * BBR.Beta)
    if (BBR.state == ProbeBW_UP)
      BBR.undo_state = ProbeBW_UP
      StartProbeBW_DOWN()
]]></artwork>
            <t>Here RS.tx_in_flight is the C.inflight value
when the most recently ACKed packet was sent. And the BBR.Beta (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 RACK <xref target="RFC8985"/> or QUIC loss
detection <xref target="RFC9002"/>, delay loss marking to wait for potential
reordering, so packets can be declared 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_longterm to be
significantly underestimated. To avoid such issues, BBR processes each loss
detection event to more precisely estimate C.inflight at
which loss rates cross BBR.LossThresh, noting that this may have happened
mid-way through some 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 C.inflight 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 / C.inflight >= BBR.LossThresh
]]></artwork>
            <t>Expanding this, we get:</t>
            <artwork><![CDATA[
  (lost_prev + lost_prefix) /    >= BBR.LossThresh
  (inflight_prev + lost_prefix)
]]></artwork>
            <t>Solving for lost_prefix, we arrive at:</t>
            <artwork><![CDATA[
  lost_prefix >= (BBR.LossThresh * inflight_prev - lost_prev) /
                    (1 - BBR.LossThresh)
]]></artwork>
            <t>In pseudocode:</t>
            <artwork><![CDATA[
  NoteLoss()
    if (!BBR.is_loss_in_round)   /* first loss in this round trip? */
      BBR.loss_round_delivered = C.delivered
      SaveStateUponLoss()
    BBR.is_loss_in_round = true

  HandleLostPacket(Packet P):
    NoteLoss()
    if (!BBR.is_bw_probe_sample)
      return /* not a packet sent while probing bandwidth */
    RS.tx_in_flight = P.tx_in_flight /* C.inflight at transmit */
    RS.lost = C.lost - P.lost /* data lost since transmit */
    RS.is_app_limited = P.is_app_limited
    if (IsInflightTooHigh())
      RS.tx_in_flight = InflightAtLoss(P)
      HandleInflightTooHigh()

  /* At what prefix of "packet" P did losses exceed BBR.LossThresh?
     We perform this computation because P may be an offload burst
     containing many packets, and it's important to estimate which
     fraction of that burst fits safely in the network path.
   */
  InflightAtLoss(Packet P):
    size = P.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 = (BBR.LossThresh * inflight_prev - lost_prev) /
                  (1 - BBR.LossThresh)
    /* At what C.inflight value did losses cross BBR.LossThresh? */
    inflight_at_loss = inflight_prev + lost_prefix
    return inflight_at_loss
]]></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
C.inflight 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_shortterm and
BBR.inflight_shortterm.</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 (BBR.bw_shortterm and BBR.inflight_shortterm) as follows:</t>
            <artwork><![CDATA[
      bw_shortterm = max(       bw_latest, BBR.Beta *       BBR.bw_shortterm )
inflight_shortterm = max( inflight_latest, BBR.Beta * BBR.inflight_shortterm )
]]></artwork>
            <t>This logic can be represented as follows:</t>
            <artwork><![CDATA[
  /* Near start of ACK processing: */
  UpdateLatestDeliverySignals():
    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: */
  AdvanceLatestDeliverySignals():
    if (BBR.loss_round_start)
      BBR.bw_latest       = RS.delivery_rate
      BBR.inflight_latest = RS.delivered

  ResetCongestionSignals():
    BBR.is_loss_in_round = false
    BBR.bw_latest = 0
    BBR.inflight_latest = 0

  /* Update congestion state on every ACK */
  UpdateCongestionSignals():
    UpdateMaxBw()
    if (!BBR.loss_round_start)
      return  /* wait until end of round trip */
    AdaptLowerBoundsFromCongestion()  /* once per round, adapt */
    BBR.is_loss_in_round = false

  /* Once per round-trip respond to congestion */
  AdaptLowerBoundsFromCongestion():
    if (IsProbingBW())
      return
    if (BBR.is_loss_in_round)
      InitLowerBounds()
      LossLowerBounds()

  /* Handle the first congestion episode in this cycle */
  InitLowerBounds():
    if (BBR.bw_shortterm == Infinity)
      BBR.bw_shortterm = BBR.max_bw
    if (BBR.inflight_shortterm == Infinity)
      BBR.inflight_shortterm = C.cwnd

  /* Adjust model once per round based on loss */
  LossLowerBounds()
    BBR.bw_shortterm       = max(BBR.bw_latest,
                          BBR.Beta * BBR.bw_shortterm)
    BBR.inflight_shortterm = max(BBR.inflight_latest,
                          BBR.Beta * BBR.inflight_shortterm)

  ResetShortTermModel():
    BBR.bw_shortterm       = Infinity
    BBR.inflight_shortterm = Infinity

  BoundBWForModel():
    BBR.bw = min(BBR.max_bw, BBR.bw_shortterm)

]]></artwork>
          </section>
        </section>
        <section anchor="updating-the-model-upon-spurious-packet-loss">
          <name>Updating the Model Upon Detecting a Spurious Loss Recovery</name>
          <t>In some cases a transport protocol detects that a loss recovery episode was
spurious, i.e., the connection previously concluded that one or more packets
were lost (using fast recovery or RTO recovery) but later concludes that
no packets marked lost in that loss recovery episode were actually lost.</t>
          <t>In order to handle such cases, when a loss recovery episode starts, BBR saves
information about its current state. If the transport protocol later declares
the loss recovery episode to be spurious, then BBR restores aspects of its
state to their previously saved values. This greatly reduces the performance
impact of spurious loss recovery episodes.</t>
          <section anchor="saving-state-on-loss-recovery">
            <name>Saving State Upon Loss Recovery</name>
            <t>If a connection's transport protocol starts a loss recovery episode that may
later be declared spurious (including possibly fast recovery or RTO recovery,
depending on the transport protocol), BBR saves information about its current
state. It saves the current congestion window, the short-term and long-term
model parameters, and initializes the undo state to indicate no state restoration
is yet needed:</t>
            <artwork><![CDATA[
  /* Save state in case a loss episode is later declared spurious */
  SaveStateUponLoss():
    SaveCwnd()
    BBR.undo_state              = None
    BBR.undo_bw_shortterm       = BBR.bw_shortterm
    BBR.undo_inflight_shortterm = BBR.inflight_shortterm
    BBR.undo_inflight_longterm  = BBR.inflight_longterm
]]></artwork>
          </section>
          <section anchor="handling-spurious-loss-recovery">
            <name>Handling a Spurious Loss Recovery</name>
            <t>If a loss recovery episode is declared spurious, BBR restores aspects of its
state to their previously saved values. It restores the congestion window,
resets the loss round state and the full bandwidth detector, and restores
the short-term and long-term model parameters to be at least the values
saved before the loss episode.</t>
            <t>Furthermore, if the connection transitioned out of Startup or ProbeBW_UP
due to the loss recovery episode, and the connection is not currently in
ProbeRTT, BBR returns to the state it was in before the loss recovery
episode (returning to Startup, or returning to ProbeBW by starting a refill
phase to restart the bandwidth probe):</t>
            <artwork><![CDATA[
  /* Handle a declaration of a spurious loss episode */
  HandleSpuriousLossDetection():
    RestoreCwnd()
    BBR.is_loss_in_round = false
    ResetFullBW()
    BBR.bw_shortterm       = max(BBR.bw_shortterm,
                                 BBR.undo_bw_shortterm)
    BBR.inflight_shortterm = max(BBR.inflight_shortterm,
                                 BBR.undo_inflight_shortterm)
    BBR.inflight_longterm  = max(BBR.inflight_longterm,
                                 BBR.undo_inflight_longterm)
    /* If flow was probing bandwidth, return to that state: */
    if (BBR.undo_state == Startup &&
        BBR.state != Startup)
      BBR.full_bw_reached = false
      if (BBR.state != ProbeRTT)
        EnterStartup()
    else if (BBR.undo_state == ProbeBW_UP &&
             BBR.state != ProbeBW_UP)
      if (BBR.state != ProbeRTT)
        StartProbeBW_REFILL()
    BBR.undo_state = None
]]></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.</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 C.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
BoundBWForModel(), and C.cwnd in BoundCwndForModel():</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_shortterm | inflight_longterm,
               |        |        |      |              | inflight_shortterm
---------------+--------+--------+------+--------------+-----------------
ProbeBW_DOWN   | decel  | 0.90   | 2    | bw_shortterm | inflight_longterm,
               |        |        |      |              | inflight_shortterm
---------------+--------+--------+------+--------------+-----------------
ProbeBW_CRUISE | cruise | 1.0    | 2    | bw_shortterm | 0.85*inflight_longterm
               |        |        |      |              | inflight_shortterm
---------------+--------+--------+------+--------------+-----------------
ProbeBW_REFILL | accel  | 1.0    | 2    |              | inflight_longterm
               |        |        |      |              |
---------------+--------+--------+------+--------------+-----------------
ProbeBW_UP     | accel  | 1.25   | 2.25 |              | inflight_longterm
               |        |        |      |              |
---------------+--------+--------+------+--------------+-----------------
ProbeRTT       | decel  | 1.0    | 0.5  | bw_shortterm | 0.85*inflight_longterm
               |        |        |      |              | inflight_shortterm
---------------+--------+--------+------+--------------+-----------------
]]></artwork>
        </section>
        <section anchor="pacing-rate-bbrpacingrate">
          <name>Pacing Rate: C.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 (C.next_send_time) as a function
of the most recent packet size and the current pacing rate, as follows:</t>
          <artwork><![CDATA[
  C.next_send_time = max(Now(), C.next_send_time)
  P.send_time = C.next_send_time
  pacing_delay = packet.size / C.pacing_rate
  C.next_send_time = C.next_send_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 ("C.InitialCwnd", e.g. from <xref target="RFC6928"/>), the
initial C.srtt after the first non-zero RTT sample, and the initial pacing_gain:</t>
          <artwork><![CDATA[
  InitPacingRate():
    nominal_bandwidth = C.InitialCwnd / (C.srtt ? C.srtt : 1ms)
    C.pacing_rate =  BBR.StartupPacingGain * 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 SetPacingRate() step as follows:</t>
          <artwork><![CDATA[
  SetPacingRateWithGain(pacing_gain):
    rate = pacing_gain * bw * (100 - BBR.PacingMarginPercent) / 100
    if (BBR.full_bw_reached || rate > C.pacing_rate)
      C.pacing_rate = rate

  SetPacingRate():
    SetPacingRateWithGain(C.pacing_gain)
]]></artwork>
          <t>To help drive the network toward lower queues and low latency while maintaining
high utilization, the BBR.PacingMarginPercent 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: C.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 C.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 SetSendQuantum() to update C.send_quantum  as
follows:</t>
          <artwork><![CDATA[
  SetSendQuantum():
    C.send_quantum = C.pacing_rate * 1ms
    C.send_quantum = min(C.send_quantum, 64 KBytes)
    C.send_quantum = max(C.send_quantum, 2 * C.SMSS)
]]></artwork>
          <t>A BBR implementation MAY use alternate approaches to select a C.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 (C.cwnd) controls the maximum C.inflight.
It is the maximum C.inflight
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 C.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 C.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 C.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 C.cwnd accordingly. The following sections describe the various
considerations that impact C.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="RFC6928"/> 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 C.cwnd to meet
the BBR.max_inflight.</t>
            <t>On each ACK, BBR calculates the BBR.max_inflight in UpdateMaxInflight()
as follows:</t>
            <artwork><![CDATA[
  BDPMultiple(gain):
    if (BBR.min_rtt == Infinity)
      return C.InitialCwnd /* no valid RTT samples yet */
    BBR.bdp = BBR.bw * BBR.min_rtt
    return gain * BBR.bdp

  QuantizationBudget(inflight_cap)
    UpdateOffloadBudget()
    inflight_cap = max(inflight_cap, BBR.offload_budget)
    inflight_cap = max(inflight_cap, BBR.MinPipeCwnd)
    if (BBR.state == ProbeBW_UP)
      inflight_cap += 2*C.SMSS
    return inflight_cap

  Inflight(gain):
    inflight_cap = BDPMultiple(gain)
    return QuantizationBudget(inflight_cap)

  UpdateMaxInflight():
    inflight_cap = BDPMultiple(BBR.cwnd_gain)
    inflight_cap += BBR.extra_acked
    BBR.max_inflight = QuantizationBudget(inflight_cap)
]]></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 BBR.MinPipeCwnd (4 packets, i.e.
4 * C.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 C.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 C.cwnd to a
value that will allow 1 C.SMSS to be transmitted. Then BBR gradually increases
C.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 C.cwnd to the "last known good"
value that C.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 C.cwnd in loss recovery is as follows:</t>
            <t>Upon retransmission timeout (RTO):</t>
            <artwork><![CDATA[
  OnEnterRTO():
    SaveCwnd()
    SaveStateUponLoss()
    C.cwnd = C.inflight + 1
]]></artwork>
            <t>Upon entering Fast Recovery:</t>
            <artwork><![CDATA[
  OnEnterFastRecovery():
    SaveCwnd()
    SaveStateUponLoss()
]]></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[
  RestoreCwnd()
]]></artwork>
            <t>Note that exiting loss recovery happens during ACK processing, and at the
end of ACK processing BoundCwndForModel() 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 SaveCwnd() and RestoreCwnd() helpers help remember and restore
the last-known good C.cwnd (the latest C.cwnd unmodulated by loss recovery or
ProbeRTT), and is defined as follows:</t>
            <artwork><![CDATA[
  SaveCwnd():
    if (!InLossRecovery() && BBR.state != ProbeRTT)
      BBR.prior_cwnd = C.cwnd
    else
      BBR.prior_cwnd = max(BBR.prior_cwnd, C.cwnd)

  RestoreCwnd():
    C.cwnd = max(C.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 C.inflight and drain
the bottleneck queue, thereby allowing measurement of BBR.min_rtt. To implement
this mode, BBR bounds C.cwnd to BBR.MinPipeCwnd, the minimal value that
allows pipelining (see the "Minimum cwnd for Pipelining" section, above):</t>
            <artwork><![CDATA[
  ProbeRTTCwnd():
    probe_rtt_cwnd = BDPMultiple(BBR.bw, BBR.ProbeRTTCwndGain)
    probe_rtt_cwnd = max(probe_rtt_cwnd, BBR.MinPipeCwnd)
    return probe_rtt_cwnd

  BoundCwndForProbeRTT():
    if (BBR.state == ProbeRTT)
      C.cwnd = min(C.cwnd, ProbeRTTCwnd())
]]></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 C.cwnd is above the
BBR.max_inflight derived from BBR's path model, BBR cuts C.cwnd immediately
to the BBR.max_inflight. When C.cwnd is below BBR.max_inflight, BBR raises
C.cwnd gradually and cautiously, increasing C.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
acknowledged, BBR runs the following SetCwnd() steps to update C.cwnd:</t>
            <artwork><![CDATA[
  SetCwnd():
    UpdateMaxInflight()
    if (BBR.full_bw_reached)
      C.cwnd = min(C.cwnd + RS.newly_acked, BBR.max_inflight)
    else if (C.cwnd < BBR.max_inflight || C.delivered < C.InitialCwnd)
      C.cwnd = C.cwnd + RS.newly_acked
    C.cwnd = max(C.cwnd, BBR.MinPipeCwnd)
    BoundCwndForProbeRTT()
    BoundCwndForModel()
]]></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 C.cwnd based on the data delivered, while bounding
C.cwnd to be no larger than the BBR.max_inflight adapted to the estimated
BDP. Otherwise, if C.cwnd is below the BBR.max_inflight, or the sender
has marked so little data delivered (less than C.InitialCwnd) that it does not
yet judge its BBR.max_bw estimate and BBR.max_inflight as useful, then it increases
C.cwnd without bounding it to be below BBR.max_inflight. Finally, BBR imposes
a floor of BBR.MinPipeCwnd 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 C.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[
  BoundCwndForModel():
    cap = Infinity
    if (IsInAProbeBWState() &&
        BBR.state != ProbeBW_CRUISE)
      cap = BBR.inflight_longterm
    else if (BBR.state == ProbeRTT ||
             BBR.state == ProbeBW_CRUISE)
      cap = InflightWithHeadroom()

    /* apply BBR.inflight_shortterm (possibly infinite): */
    cap = min(cap, BBR.inflight_shortterm)
    cap = max(cap, BBR.MinPipeCwnd)
    C.cwnd = min(C.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="RFC8126"/>, 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,
Pouria Mousavizadeh Tehrani, Amanda Baber, Frédéric Lécaille,
and Tatsuhiro Tsujikawa
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="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </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>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="RFC3168">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC9330">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
        <reference anchor="RFC8511">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </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>
        <reference anchor="KN_FILTER" target="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/lib/win_minmax.c?id=a4f1f9ac8153e22869b6408832b5a9bb9c762bf6">
          <front>
            <title>Linux implementation of Kathleen Nichols' windowed min/max algorithm</title>
            <author initials="K." surname="Nichols" fullname="Kathleen Nichols">
              <organization/>
            </author>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="TrafficPolicing" target="https://dl.acm.org/doi/10.1145/2934872.2934873">
          <front>
            <title>An Internet-Wide Analysis of Traffic Policing</title>
            <author initials="T." surname="Flach" fullname="Tobias Flach">
              <organization/>
            </author>
            <author initials="N." surname="Dukkipati" fullname="Nandita Dukkipati">
              <organization/>
            </author>
            <author initials="A." surname="Terzis" fullname="Andreas Terzis">
              <organization/>
            </author>
            <author initials="B." surname="Raghavan" fullname="Barath Raghavan">
              <organization/>
            </author>
            <author initials="N." surname="Cardwell" fullname="Neal Cardwell">
              <organization/>
            </author>
            <author initials="Y." surname="Cheng" fullname="Yuchung Cheng">
              <organization/>
            </author>
            <author initials="A." surname="Jain" fullname="Ankur Jain">
              <organization/>
            </author>
            <author initials="S." surname="Hao" fullname="Shuai Hao">
              <organization/>
            </author>
            <author initials="E." surname="Katz-Bassett" fullname="Ethan Katz-Bassett">
              <organization/>
            </author>
            <author initials="R." surname="Govindan" fullname="Ramesh Govindan">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="ACM SIGCOMM 2016" value=""/>
        </reference>
        <reference anchor="RFC8311">
          <front>
            <title>Relaxing Restrictions on Explicit Congestion Notification (ECN) Experimentation</title>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="January" year="2018"/>
            <abstract>
              <t>This memo updates RFC 3168, which specifies Explicit Congestion Notification (ECN) as an alternative to packet drops for indicating network congestion to endpoints. It relaxes restrictions in RFC 3168 that hinder experimentation towards benefits beyond just removal of loss. This memo summarizes the anticipated areas of experimentation and updates RFC 3168 to enable experimentation in these areas. An Experimental RFC in the IETF document stream is required to take advantage of any of these enabling updates. In addition, this memo makes related updates to the ECN specifications for RTP in RFC 6679 and for the Datagram Congestion Control Protocol (DCCP) in RFCs 4341, 4342, and 5622. This memo also records the conclusion of the ECN nonce experiment in RFC 3540 and provides the rationale for reclassification of RFC 3540 from Experimental to Historic; this reclassification enables new experimental use of the ECT(1) codepoint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8311"/>
          <seriesInfo name="DOI" value="10.17487/RFC8311"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-ack-frequency">
          <front>
            <title>QUIC Acknowledgment Frequency</title>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <date day="5" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies an extension to QUIC that enables an endpoint
   to request its peer change its behavior when sending or delaying
   acknowledgments.

Note to Readers

   Discussion of this draft takes place on the QUIC working group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/search/?email_list=quic.  Source
   code and issues list for this draft can be found at
   https://github.com/quicwg/ack-frequency.

   Working Group information can be found at https://github.com/quicwg.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-ack-frequency-14"/>
        </reference>
        <reference anchor="I-D.draft-ietf-tcpm-ack-rate-request">
          <front>
            <title>TCP ACK Rate Request Option</title>
            <author fullname="Carles Gomez" initials="C." surname="Gomez">
              <organization>UPC</organization>
            </author>
            <author fullname="Jon Crowcroft" initials="J." surname="Crowcroft">
              <organization>University of Cambridge</organization>
            </author>
            <author fullname="Michael Tüxen" initials="M." surname="Tüxen">
              <organization>Muenster University of Applied Sciences</organization>
            </author>
            <date day="4" month="July" year="2026"/>
            <abstract>
              <t>   TCP Delayed Acknowledgments (ACKs) is a widely deployed mechanism
   that allows reducing protocol overhead in many scenarios.  However,
   Delayed ACKs may also contribute to suboptimal performance.  When a
   relatively large congestion window (cwnd) can be used, less frequent
   ACKs may be desirable.  On the other hand, in relatively small cwnd
   scenarios, eliciting an immediate ACK may avoid unnecessary delays
   that may be incurred by the Delayed ACKs mechanism.  This document
   specifies the TCP ACK Rate Request (TARR) option.  This option allows
   a sender to request the ACK rate to be used by a receiver, and it
   also allows to request immediate ACKs from a receiver.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-ack-rate-request-12"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-receive-ts">
          <front>
            <title>QUIC Extended Acknowledgement for Reporting Packet Receive Timestamps</title>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Joseph Beshay" initials="J." surname="Beshay">
              <organization>Meta Platforms, Inc.</organization>
            </author>
            <date day="16" month="March" year="2026"/>
            <abstract>
              <t>   This document defines an extension to the QUIC transport protocol
   which supports reporting multiple packet receive timestamps for post-
   handshake packets.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-receive-ts-02"/>
        </reference>
      </references>
    </references>
    <?line 3903?>

<section anchor="bbr-example-test-cases">
      <name>BBR Example Test Cases</name>
      <t>This section describes some test cases to ensure BBR implementations perform
as expected. When they are important to the test case, variables from the
pseudocode are referenced. Most test cases focus on state transitions, since
those are critical to BBR's overall behavior.</t>
      <t>The examples have checks to ensure the Bandwidth Estimator and pacer
are meeting BBR's needs, but there are no standalone tests for either.</t>
      <t>Unless otherwise mentioned, each test case is configured to create a single
BBR connection traveling over a controlled path with a bottleneck bandwidth
and two-way propagation delay that are fixed for the entire duration of the
test. The tests can use network emulation, network simulation,
or a controlled network path such as a laboratory environment.</t>
      <t>In order to cover the wide set of real-world use cases, test cases can be
run with a variety of RTTs (e.g., &lt; 1 ms to 1 s) and bandwidths (e.g., 64 kbit/s to 10 Gbit/s).</t>
      <t>To ensure internal state variables, including the Bandwidth Estimator,
are initialized correctly, when a test case says it starts in a phase
after STARTUP, test cases expect the connection to be driven with enough
data so that it exits STARTUP and naturally gets to the specified phase.</t>
      <section anchor="exiting-startup-on-bandwidth-plateau">
        <name>Exiting STARTUP on Bandwidth Plateau</name>
        <ol spacing="normal" type="1"><li>
            <t>Start a flow in the STARTUP phase.</t>
          </li>
          <li>
            <t>Ensure the sender has enough data to send and is not application-limited.</t>
          </li>
          <li>
            <t>Verify that BBR measures delivery rate samples (RS.delivery_rate) that plateau,
and ensure the estimated bandwidth (BBR.max_bw) is close (i.e., within 2%) to
the simulated bandwidth.</t>
          </li>
          <li>
            <t>Verify that after 3 consecutive rounds where the delivery rate grows by less
than 25% (i.e., when BBR.full_bw_count reaches 3), <tt>BBR.full_bw_now</tt> and <tt>BBR.full_bw_reached</tt> are set to <tt>true</tt>.</t>
          </li>
          <li>
            <t>Verify the connection transitions from STARTUP to DRAIN.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-startup-on-loss-when-application-limited">
        <name>Exiting STARTUP on Loss When Application-Limited</name>
        <ol spacing="normal" type="1"><li>
            <t>Start a flow in the STARTUP phase.</t>
          </li>
          <li>
            <t>Limit the application sending rate so bandwidth samples are application-limited.</t>
          </li>
          <li>
            <t>Introduce packet loss exceeding <tt>BBR.LossThresh</tt> (2%) and sequence range
criteria over the time scale of a single full round trip.</t>
          </li>
          <li>
            <t>Verify that <tt>BBRCheckStartupHighLoss()</tt> observes the high loss rate.</t>
          </li>
          <li>
            <t>Verify the connection sets <tt>BBR.full_bw_now</tt> and <tt>BBR.full_bw_reached</tt> to <tt>true</tt>, exits STARTUP,
and transitions to DRAIN, demonstrating that loss triggers the end of STARTUP
even when bandwidth samples are application-limited.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-drain-based-on-inflight">
        <name>Exiting DRAIN Based on Inflight</name>
        <ol spacing="normal" type="1"><li>
            <t>Start a flow and transition it from STARTUP to DRAIN.</t>
          </li>
          <li>
            <t>Verify <tt>BBR.pacing_gain</tt> is set to <tt>BBR.DrainPacingGain</tt> (0.5).</t>
          </li>
          <li>
            <t>Allow the connection to send, tracking <tt>C.inflight</tt> and the estimated BDP
(<tt>BBRInflight(1.0)</tt>).</t>
          </li>
          <li>
            <t>Verify that when <tt>C.inflight</tt> drops below or equal to <tt>BBRInflight(1.0)</tt>, the
connection exits DRAIN and transitions to PROBE_BW.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-drain-based-on-time">
        <name>Exiting DRAIN Based on Time</name>
        <ol spacing="normal" type="1"><li>
            <t>Start a flow and transition it from STARTUP to DRAIN.</t>
          </li>
          <li>
            <t>Decrease the available bandwidth by 10% upon entering DRAIN to simulate
an over-estimation of the available bandwidth.</t>
          </li>
          <li>
            <t>Ensure <tt>C.inflight</tt> remains higher than <tt>BBRInflight(1.0)</tt> for several
round trips.</t>
          </li>
          <li>
            <t>Track <tt>BBR.drain_start_round</tt> and current <tt>BBR.round_count</tt>.</t>
          </li>
          <li>
            <t>Verify that after 3 round trips in DRAIN, the connection exits DRAIN and
transitions to PROBE_BW even though <tt>C.inflight</tt> has not reached the target
BDP.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-probeup-on-bandwidth-plateau">
        <name>Exiting PROBE_UP on Bandwidth Plateau</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection is in the PROBE_UP phase of PROBE_BW.</t>
          </li>
          <li>
            <t>Ensure the connection is fully utilizing <tt>BBR.inflight_longterm</tt> or cwnd
without packet loss.</t>
          </li>
          <li>
            <t>Observe that the delivery rate plateaus.</t>
          </li>
          <li>
            <t>Verify that <tt>BBRIsTimeToGoDown()</tt> triggers when <tt>BBR.full_bw_now</tt> is set to
<tt>true</tt> after 3 consecutive rounds where the delivery rate grows by less than 25%
(i.e., when BBR.full_bw_count reaches 3).</t>
          </li>
          <li>
            <t>Verify the connection transitions to PROBE_DOWN.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-probeup-on-loss-when-application-limited">
        <name>Exiting PROBE_UP on Loss When Application-Limited</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection is in the PROBE_UP phase of PROBE_BW.</t>
          </li>
          <li>
            <t>Limit the application sending rate so bandwidth samples are application-limited.</t>
          </li>
          <li>
            <t>Introduce packet loss exceeding <tt>BBR.LossThresh</tt> (2%) over the last round
trip.</t>
          </li>
          <li>
            <t>Verify that the loss is detected and <tt>BBRIsTimeToGoDown()</tt> is triggered due
to the high loss rate.</t>
          </li>
          <li>
            <t>Verify the connection transitions to PROBE_DOWN and <tt>BBR.inflight_longterm</tt>
is updated appropriately, regardless of the application-limited state.</t>
          </li>
        </ol>
      </section>
      <section anchor="never-exiting-probeup-or-startup-when-application-limited-with-no-loss">
        <name>Never Exiting PROBE_UP (or STARTUP) When Application-Limited With No Loss</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_UP (or STARTUP).</t>
          </li>
          <li>
            <t>Limit the application sending rate so bandwidth samples are application-limited.</t>
          </li>
          <li>
            <t>Verify that as long as there is no loss and the rounds are application-limited,
the connection stays in PROBE_UP (or STARTUP) indefinitely.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-probedown-on-inflight">
        <name>Exiting PROBE_DOWN on Inflight</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_DOWN.</t>
          </li>
          <li>
            <t>Verify that <tt>BBR.pacing_gain</tt> is set to <tt>BBR.ProbeDownPacingGain</tt> (0.90).</t>
          </li>
          <li>
            <t>Track <tt>C.inflight</tt> and <tt>BBRInflightWithHeadroom()</tt>.</t>
          </li>
          <li>
            <t>Wait for the queue to drain and <tt>C.inflight</tt> to fall below or equal to
both <tt>BBRInflightWithHeadroom()</tt> and <tt>BBRInflight(1.0)</tt>.</t>
          </li>
          <li>
            <t>Verify the connection transitions to PROBE_CRUISE.</t>
          </li>
        </ol>
      </section>
      <section anchor="exiting-probedown-after-max-time">
        <name>Exiting PROBE_DOWN After Max Time</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_DOWN.</t>
          </li>
          <li>
            <t>Prevent <tt>C.inflight</tt> from dropping below <tt>BBRInflightWithHeadroom()</tt> by
decreasing the available bandwidth by 10% upon entering PROBE_DOWN.</t>
          </li>
          <li>
            <t>Verify that after <tt>BBR.bw_probe_wait</tt> time elapses, <tt>BBRIsTimeToProbeBW()</tt>
returns <tt>true</tt>.</t>
          </li>
          <li>
            <t>Verify the connection transitions directly to PROBE_REFILL, bypassing
PROBE_CRUISE.</t>
          </li>
        </ol>
      </section>
      <section anchor="entering-and-exiting-probertt">
        <name>Entering and Exiting PROBE_RTT</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Wait for <tt>BBR.ProbeRTTInterval</tt> (5 seconds) without updating
<tt>BBR.probe_rtt_min_delay</tt>.</t>
          </li>
          <li>
            <t>Verify the connection enters PROBE_RTT and sets <tt>BBR.cwnd_gain</tt> to
<tt>BBR.ProbeRTTCwndGain</tt> (0.5).</t>
          </li>
          <li>
            <t>Wait for at least <tt>BBR.ProbeRTTDuration</tt> (200 ms) and one round trip.</t>
          </li>
          <li>
            <t>Verify the connection correctly exits PROBE_RTT, transitions back to PROBE_BW
(since <tt>BBR.full_bw_reached</tt> is <tt>true</tt>), and resumes sending.</t>
          </li>
        </ol>
      </section>
      <section anchor="skipping-probertt-due-to-application-limited-sending">
        <name>Skipping PROBE_RTT Due to Application-Limited Sending</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Pause the application from sending data for a period, making the connection
idle and causing <tt>C.inflight</tt> to drop to 0.</t>
          </li>
          <li>
            <t>Allow <tt>BBR.ProbeRTTInterval</tt> (5 seconds) to elapse during this idle period.</t>
          </li>
          <li>
            <t>Verify that upon sending new data, <tt>BBRHandleRestartFromIdle()</tt> sets
<tt>BBR.idle_restart</tt> to <tt>true</tt>.</t>
          </li>
          <li>
            <t>Verify the connection skips entering PROBE_RTT because <tt>BBR.idle_restart</tt> is
<tt>true</tt> and idleness is deemed a sufficient attempt to drain the queue.</t>
          </li>
        </ol>
      </section>
      <section anchor="achieving-expected-startup-bandwidth-on-a-link-with-aggregation">
        <name>Achieving Expected STARTUP Bandwidth on a Link With Aggregation</name>
        <ol spacing="normal" type="1"><li>
            <t>Simulate a network path with significant ACK aggregation or L2 batching
(e.g., cellular link).</t>
          </li>
          <li>
            <t>Start a flow in STARTUP.</t>
          </li>
          <li>
            <t>Verify that <tt>BBR.extra_acked</tt> is calculated correctly from the bursty ACK
arrivals and that <tt>C.cwnd</tt> &gt; 2 * BDP.</t>
          </li>
          <li>
            <t>Ensure that the delivery rate sampler handles the aggregated ACKs properly
(capping by send rate if necessary) and the connection still successfully
doubles its sending rate to discover the full bottleneck bandwidth.</t>
          </li>
        </ol>
      </section>
      <section anchor="achieving-expected-cruise-bandwidth-on-a-link-with-aggregation">
        <name>Achieving Expected Cruise Bandwidth on a Link With Aggregation</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_CRUISE.</t>
          </li>
          <li>
            <t>Simulate significant ACK aggregation on the path.</t>
          </li>
          <li>
            <t>Verify that <tt>BBR.extra_acked</tt> updates correctly using the max filter over the
last <tt>BBR.ExtraAckedFilterLen</tt> round trips.</t>
          </li>
          <li>
            <t>Verify that <tt>C.cwnd</tt> is augmented by <tt>BBR.extra_acked</tt>, preventing the
connection from stalling during inter-ACK silences and maintaining full
utilization.</t>
          </li>
        </ol>
      </section>
      <section anchor="correctly-managing-sub-packet-bdps">
        <name>Correctly Managing Sub-Packet BDPs</name>
        <ol spacing="normal" type="1"><li>
            <t>Configure a bottleneck with a very low BDP (e.g., &lt; 1 packet).</t>
          </li>
          <li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Verify that <tt>BBR.MinPipeCwnd</tt> (4 packets) acts as a floor for <tt>C.cwnd</tt>.</t>
          </li>
          <li>
            <t>Ensure the pacing rate correctly matches the low bandwidth, while the
4-packet cwnd allows for delayed ACKs without stalling the pipeline.</t>
          </li>
        </ol>
      </section>
      <section anchor="increasing-bandwidth-10x-and-ensuring-full-bandwidth-is-reached">
        <name>Increasing Bandwidth 10x and Ensuring Full Bandwidth is Reached</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Suddenly increase the bottleneck bandwidth by 10x (e.g., from 10 Mbit/s to 100 Mbit/s).</t>
          </li>
          <li>
            <t>Verify that during PROBE_UP, the step size added to <tt>BBR.inflight_longterm</tt>
doubles each round trip (resulting in exponential growth).</t>
          </li>
          <li>
            <t>Ensure the connection discovers the full 100 Mbit/s bandwidth within a
reasonable number of round trips (O(log(BDP))).</t>
          </li>
        </ol>
      </section>
      <section anchor="decreasing-bandwidth-10x-and-ensuring-max-bandwidth-adapts-down">
        <name>Decreasing Bandwidth 10x and Ensuring Max Bandwidth Adapts Down</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Suddenly decrease the bottleneck bandwidth by 10x (e.g., from 100 Mbit/s to 10 Mbit/s).</t>
          </li>
          <li>
            <t>Verify that <tt>BBR.bw_shortterm</tt> rapidly adapts downwards due to the resulting
packet loss.</t>
          </li>
          <li>
            <t>Verify that after the <tt>BBR.max_bw</tt> window expires (2 PROBE_BW cycles, or <tt>BBR.MaxBwFilterLen</tt>),
<tt>BBR.max_bw</tt> drops to the new 10 Mbit/s limit, matching the path's delivery
rate.</t>
          </li>
        </ol>
      </section>
      <section anchor="handling-token-bucket-policers">
        <name>Handling Token Bucket Policers</name>
        <ol spacing="normal" type="1"><li>
            <t>Configure the path with a token bucket policer (e.g., rate limit with a
specific initial burst size and no additional buffering beyond the bucket).
See <xref target="TrafficPolicing"/> for more details.</t>
          </li>
          <li>
            <t>Wait until the connection transitions to PROBE_BW.</t>
          </li>
          <li>
            <t>Verify that when the burst size is exhausted and the policer drops packets,
BBR reacts to the loss by adapting <tt>BBR.inflight_shortterm</tt> and
<tt>BBR.bw_shortterm</tt>.</t>
          </li>
          <li>
            <t>Ensure BBR eventually reaches a stable operating point that conforms to the
token rate without excessive continuous packet loss.</t>
          </li>
        </ol>
      </section>
      <section anchor="handling-spurious-fast-recovery">
        <name>Handling Spurious Fast Recovery</name>
        <ol spacing="normal" type="1"><li>
            <t>Introduce packet reordering on the network path that triggers a spurious Fast
Recovery.</t>
          </li>
          <li>
            <t>Verify <tt>BBRSaveStateUponLoss()</tt> saves the current <tt>BBR.state</tt>,
<tt>BBR.bw_shortterm</tt>, <tt>BBR.inflight_shortterm</tt> (to <tt>BBR.undo_inflight_shortterm</tt>), and <tt>BBR.inflight_longterm</tt> (to <tt>BBR.undo_inflight_longterm</tt>).</t>
          </li>
          <li>
            <t>Once the transport protocol detects the loss was spurious (e.g., via TCP DSACK or QUIC packet numbers indicating the original packet was delivered and the retransmission was spurious), verify
<tt>BBRHandleSpuriousLossDetection()</tt> restores the saved parameters.</t>
          </li>
          <li>
            <t>Ensure the connection seamlessly returns to its previous state (e.g.,
PROBE_UP).</t>
          </li>
        </ol>
      </section>
      <section anchor="handling-spurious-rto-recovery">
        <name>Handling Spurious RTO Recovery</name>
        <ol spacing="normal" type="1"><li>
            <t>Introduce packet reordering on the network path that triggers a spurious RTO
Recovery.</t>
          </li>
          <li>
            <t>Verify <tt>BBRSaveStateUponLoss()</tt> saves the current <tt>BBR.state</tt>,
<tt>BBR.bw_shortterm</tt>, <tt>BBR.inflight_shortterm</tt> (to <tt>BBR.undo_inflight_shortterm</tt>), and <tt>BBR.inflight_longterm</tt> (to <tt>BBR.undo_inflight_longterm</tt>).</t>
          </li>
          <li>
            <t>Once the transport protocol detects the loss was spurious (e.g., via TCP DSACK or QUIC packet numbers indicating the original packet was delivered and the retransmission was spurious), verify
<tt>BBRHandleSpuriousLossDetection()</tt> restores the saved parameters.</t>
          </li>
          <li>
            <t>Ensure the connection seamlessly returns to its previous state (e.g.,
PROBE_UP).</t>
          </li>
        </ol>
      </section>
      <section anchor="entering-and-exiting-probertt-during-startup">
        <name>Entering and Exiting PROBE_RTT During STARTUP</name>
        <ol spacing="normal" type="1"><li>
            <t>Start a flow and artificially trigger PROBE_RTT before <tt>BBR.full_bw_reached</tt>
becomes <tt>true</tt> (e.g., by ensuring <tt>BBR.ProbeRTTInterval</tt> expires during an
extended, slow STARTUP phase).</t>
          </li>
          <li>
            <t>Allow the PROBE_RTT duration to elapse.</t>
          </li>
          <li>
            <t>Verify that upon exiting PROBE_RTT, the connection correctly transitions back
to STARTUP rather than PROBE_BW, allowing it to continue searching for the
max bandwidth.</t>
          </li>
        </ol>
      </section>
      <section anchor="handling-loss-during-probeup-after-inflightlongterm-is-set">
        <name>Handling Loss During PROBE_UP After inflight_longterm is Set</name>
        <ol spacing="normal" type="1"><li>
            <t>Ensure the connection is in PROBE_BW and has an established
<tt>BBR.inflight_longterm</tt>.</t>
          </li>
          <li>
            <t>Transition the connection into PROBE_UP.</t>
          </li>
          <li>
            <t>Introduce packet loss before <tt>BBRIsTimeToGoDown()</tt> triggers on a bandwidth
plateau.</t>
          </li>
          <li>
            <t>Verify that the loss causes <tt>BBRHandleInflightTooHigh()</tt> to execute, scaling
down <tt>BBR.inflight_longterm</tt> based on <tt>BBR.Beta</tt>.</t>
          </li>
          <li>
            <t>Verify the connection aborts PROBE_UP and immediately transitions to
PROBE_DOWN.</t>
          </li>
        </ol>
      </section>
      <section anchor="handling-application-limited-sending-during-proberefill">
        <name>Handling Application-Limited Sending During PROBE_REFILL</name>
        <ol spacing="normal" type="1"><li>
            <t>Wait for the connection to transition to PROBE_REFILL.</t>
          </li>
          <li>
            <t>Immediately pause the application from sending data, causing the connection
to become application-limited for the duration of the PROBE_REFILL round
trip.</t>
          </li>
          <li>
            <t>Verify that because the bandwidth samples during this round are marked as
application-limited and are lower than <tt>BBR.max_bw</tt> (<tt>RS.delivery_rate</tt> &lt; <tt>BBR.max_bw</tt>), BBR does not update its max bandwidth
estimate with these artificially low values.</t>
          </li>
          <li>
            <t>Verify the connection transitions to PROBE_UP after the PROBE_REFILL round
trip, and correctly handles subsequent probing.</t>
          </li>
        </ol>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S9aXPc2JUo+P3+CjQV1UqWM5OLpCqJZdmPopaiSwtNUq72
dPcwkJlIElYmkAaQpGiVXvRfmO8zf65/yZz13nMBJKVy+72eiHFEd1EJ4C7n
nnv2ZTQaueuD5IGbldMiXWYHyaxK580oz5r5aDq9uRxNJtVo9zs3TZuDJPu4
cvV6sszrOi+L5nYF7x+/OH/pVvmBS5KmnB4k95tqnd2Hf9W3yyqb1/aXsmqi
n5q8WcAQz56dJkdlcZnVDQyLfzZVuXApTJ1d02OXVlkqc91cHiRHRz+/ch9u
Dvo+c+m6uSqrAzdK4J8wfDbLm7KC+XmDb7N0kRyl1ewmWyzg17KCAV+V5eUi
g39lyzRfHCTFVF74H5f0ZDwtl5sGPE6L5Owma5pNg+VpUePzrxjrD2Wdra6S
Z1l9ld7qeG+yJg2j/WVCD//HEn6loYqyWqZNfp3hGZy+PHqy/+SB/Lm/u/dY
/vz+wb7/dW/vifz5eG//O/nz0XeP9/TdJw/3dbCHD3SEx08eP9Jfd3d35c+H
Dx7qn9892dd3v/vu+0f+1wffh8903Ad73+m7Tx480BEeP9qDNeTF3G7p6OjV
j3/Yo2UCjqXVZQaoeNU0q4Odnb+us3U2TqfLMUBqZwYgyRfj6Xz5+3z29MHu
/v7e44f8GWPafcAlizSjZ2mdzXqw6D59pZiEf482oE948uf19GpdXCZHV1lx
KU/yArD9aJy8WhcF/aQHDb+dNXDUWRGe6UBn5VWWL5Jfkh/Tuk7r5M/ZZVpk
V9E7fwKk+0M6LSd1yR/P0gZ+hgP/brS3S7/UWZVnNQLzQKY+PHqT/BEhdpC8
mzb0sofv91341gDgKcJW4btML9O/5UVW78Cn3+/s7+zv7T/cf0w0YhqAOkGg
2h+mDNSd1Wz+/7fT+H60u7/hNI7K5XJd5EBZYat1Us6T5irDMzpIXmYT+hje
fPOGL6uH2vNsVWX4EWzuHD44PzpJ3qTTqqyn5SqfJm/KWbbYCLA3Y3i5ucrr
6Nc/4K9Xs/Q6j1f/ZDMuwepX6yar4m0kp9l1nt0Mk+tyMU4ePhkmRTlOHg2T
1WqcfPdgBJc+uY/HCUd/BrjWrFdHN8XsVZoXB23USOSFZApvJAm9k6Sw/yq/
psnu92LsZd5crSdIGXeY3u4Aeu5MFuUE8LeGFe88L6frZVY0NMhOzbPsXML4
O2mRLm7rvMZvLuTJBc5/gY/HisB9kLVs4O9F0H8Exj0e/WG9iCB8kk4BWe6G
Mb/z3wjkL8L3vweSBUPyeQXLuwuO9MJ/HxRnOP3/B2G4vzc6y1bwE4uVVbks
R/l0Wl2CcJnPHsGtGT0ft3+F1w/3HvXzo5ubmzEKp8KP8sUoraZXICns3GST
nfSvy53puqoAYjvL+nJ37+Hj3fFVs1zY80KCeXj0U1KvV0BJSZTdTC7zD2m2
SA4nVXqVLusOijwa7e3RL9WUxdPk8I9vElwX4sEir5EaAGQeP+4VX7JsvJgs
xpfl9c4qXWVVvYNcM70u89m4xSwNVzzE52kxzZK0mHm5d9MWNpzN3pPHj0e7
jzdQ97PjV0fv3ryht4ZfRev3HjOtf8i0/sHew9GD/SdC7WH+J7sxBOYEAPj/
47zOx9lsvZMVs334P/3vKC9gStjyaO/Jk90xwtTCA9hcPs9BXMDj7AXO4eKy
rOCGLX89aJ7sjnYfbgBNe3nRaSt3O3nyKKYRuMo/wc0BAQQ/bsoR/CcJMlKS
+nXjP5JLIAJwV49xkiJr+iQgkmZej5NnVfphWUbyzOv0Bu4AjHUWPQ7fnGQw
ru46fFVVt52nHiaPNgsD949fvHgBysu6AqKEGzjLFtm0gdM5BMWthmnb0s7e
g8HjbRj24XcwLNzS+wq5TRcfFNR6HBQo/DdRxp3Zzl45evTgL5N3Fx9/HC2f
XO7/+ejyL+n80eSnx9fZyV9+PvnuzYfd6s/56eufRu93UOFqn8zo7Z8OksMi
eb/CzYIei0g1ouP6xwDe0IuNV+6+guDnsx7k2Tk+SY4Xi3XdVDDWbJj8qVzA
/pP9AxICj5erReYZxcZFvxonP1f55VUTLfpVCsd+Gj2S938mufg6K+roA/j5
NJ9eAR+JHgdM2aR/zGY5oNXo56xeZLey3R9P/2X3cbzfo/fPjo/gRIBf3dBR
vISRitniNvkRVjg6W2Vy7/+UVqBcb74dcAo/pvaHY1j5VZa1DvJf1tEpbTwi
1J+AMr47OUveAbVmGfzsFjj1Uoih7OnVT6xLdwg+sq/FhzGg8nq6SInswazp
zjxfgFYFcgMoSeVNVrWpPyDncXHNu01OqhJmb25RZfCk+W3W3JTVh+QEP98E
DzjkV0pHw/Z/WmR5UZXTDwYK83RRZxvAAPNP4QRg815rYTpFyIcSRlnMM74H
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
lYWqcAvZcJj46OnZd+oz9tmfgXOkwj+uFprPS93Gdej6Q4Vb5GQvs5l3neBy
rfygKVmKEKXeVaQVpqlpuLU9wQ79eEu+k3rRsE0nrNTURSdRLSiPu77Ky0uK
X9AlwhH8uTChuIujurzNOL0jQG0FRFt8dqlw8M1KKufd1zAZSDKpzlfOGJe0
2MxnAsgUFhJNma5Q0rJUOhqqsZAblrLx3J4onKaBifAFca0NhjuxWlAWHpWF
kd1x4o4mcgpJqxm/q4TvO0wzZzOkTVEIoXxfAdfuQPN/6EWzfQb5FhdkBE88
YTuVN5rDqBmmV4t6BR02o91yNQMvfKRWUctK1yKJQkioYBfdzJ0TmOVOUZ5x
TpazvyXbhXpKVg8gL9znWZ9yD5OxDfHODINhr1DXLstyfO6UyvCtbFpIco6f
C6q3Eti1ho2LacE06zknGlK4tJbsH78zZdSZH7VkSVYJXhuExi3KaNzwtmii
vYzQQ3+zgPtwkFgHHZLFCb93D0IWSjZfnU+qCzhHcLDGyLf2KfBONt7LT+vV
4qLEbOavTp7xRXUvv14u583+9vaVE1Kr89FFPd2+quurSbl9fr7YPp/U59vv
HmyfPD148vzpaDr+rLecwNqu5u++2l5ezF+7H0YXpif7+fd4A396TlPtrsr9
nBmJ4QiiH55V7tJv3MM028MJ/2vs3j1+9m4v384fnz7Bc3SFFxfL/dAzLMiI
e4UOjrfdeqym1MPhuHzHzZObmW0t1+gLp+nA77i3N8j3dvYeZDSNxJvVNYNN
OoUXzeji2hnT1Wo6qhdX2/qP7WZxgblw22Ixfk3xytttcmddl/iJ/nPbnbpy
O+g2ryVljXq791oCjBcX/19/8fqXL5hbGXeN3srzv8n6vLxY1lieXSzPbvbr
ThFbWZJVCe+3Zz0PScMh1etXHDLerROdGnN6Rm/pXp9g9dwHtpuL6faEmtzm
H+iZbXejOPk2bviXEf60KMv4fCH7TzeIn/yOj3ZM/LS50mnf/p87z86fzJeT
l/+ot5/+ePX25O8//vD4Xw7++s84ur/1BjktneHJJ/grv0U+4wS3xZkcGkg0
ykLQP2w+QVq0J2xJHSf3n/al/54n9qFfDSpLu0BH6AvW10IVafzLMPbCqBru
VVwuiHK6nHpV5V4GOd7kVnKV+SN0zlu4qk1WLzpqrgyZIufnN9eFxg7d/Jah
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
kdutwAIA

-->

</rfc>
