<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-bbr-07" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="BBR">BBR Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-07"/>
    <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="November" day="02"/>
    <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.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>
        <t>BBR.StartupFullLossCnt: A constant specifying the minimum number of
Fast Recovery loss events that must occur in a round trip in Startup
for a connection with selective acknowledgments to exit Startup due to loss
(the default is 6).</t>
        <t>BBR.loss_events_in_round: The number of Fast Recovery loss events
in the current loss round trip.</t>
      </section>
      <section anchor="probe-bw-state">
        <name>ProbeBW State</name>
        <t>BBR.is_bw_probe_stopping: A boolean tracking whether the flow has stopped
bandwidth probing but is still receiving ACK feedback from it.</t>
        <t>BBR.check_probe_loss: A boolean tracking whether BBR checks packet losses as
feedback 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.min_rtt_expired: A boolean recording whether the BBR.min_rtt estimate
has expired and is due for a refresh.</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 at most ProbeRTTCwnd(): 200 ms.</t>
          <t>BBR.probe_rtt_done_stamp: The wall clock time at which BBR can exit ProbeRTT
state.</t>
          <t>BBR.probe_rtt_round_done: A boolean recording whether the connection has
completed a round trip in ProbeRTT state.</t>
          <t>BBR.probe_rtt_cwnd: The target congestion window cap for ProbeRTT state (prior
to applying the BBR.MinPipeCwnd floor), computed as 0.5 * estimated_BDP based
on the BBR.min_rtt sample when entering ProbeRTT, before it has expired.</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 1% 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>
        <t>The state machine and associated pseudocode defined in this section through
<xref target="updating-control-parameters"/> define the BBRv3 algorithm and MUST be
included in any BBRv3 implementation. This includes the state machine
described in <xref target="state-transition-diagram"/> to <xref target="probertt"/> and the pseudocode
in <xref target="probebw-algorithm-details"/>, <xref target="updating-network-path-model-parameters"/>,
and <xref target="updating-control-parameters"/>, except where explicitly marked as optional
(MAY) or recommended (SHOULD/RECOMMENDED) or described as outside BBR's scope.
Lower-case descriptive text in those sections is intended as normative
description of required BBRv3 behavior.</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.min_rtt_expired = false
    BBR.probe_rtt_done_stamp = 0
    BBR.probe_rtt_round_done = false
    BBR.probe_rtt_cwnd = Infinity
    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.check_probe_loss = false
    BBR.prev_probe_too_high = false
    BBR.prev_probe_precautionary = false
    BBR.is_bw_probe_stopping = false
    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 BBR.StartupFullLossCnt=6 Fast Recovery loss events
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, because BBR.full_bw_reached is now true,
CheckStartupDone() exits Startup and enters Drain:</t>
            <artwork><![CDATA[
  CheckStartupHighLoss():
    if (BBR.full_bw_reached || !BBR.loss_round_start || !InLossRecovery())
      return
    if (BBR.loss_events_in_round < BBR.StartupFullLossCnt &&
        C.has_selective_acks)
      return
    if (!IsInflightTooHigh())
      return
    BBR.undo_state = Startup
    BBR.full_bw_reached = true
    BBR.inflight_longterm = max(BBR.bdp, BBR.inflight_latest)
]]></artwork>
            <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. These risks
are mitigated by the "precautionary bandwidth probing"
mechanism. It allows flows to persist in ProbeBW_UP only 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>The "precautionary bandwidth probing" mechanism manages this trade-off and
mitigates the risks by maintaining C.inflight at the BBR.inflight_longterm
level for a full round trip only 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.is_bw_probe_stopping = true
    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.is_bw_probe_stopping = false
    StartRound()
    BBR.state = ProbeBW_REFILL

  StartProbeBW_UP():
    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.check_probe_loss = 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.is_bw_probe_stopping && BBR.round_start)
      /* end of samples from bw probing phase */
      BBR.check_probe_loss = false
      BBR.is_bw_probe_stopping = false
      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.MinRTTFilterLen = 10 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>Before expiring the BBR.min_rtt filter and entering ProbeRTT, BBR saves
BBR.probe_rtt_cwnd as 0.5 * estimated_BDP based on the old
BBR.min_rtt. This ensures that during ProbeRTT the flow will
"remember" the BBR.min_rtt value it measured during the previous filter window,
providing a robust BDP estimate for the C.cwnd = 0.5*BDP calculation,
increasing the likelihood of fully draining the bottleneck queue.</t>
            <t>The algorithm for ProbeRTT is as follows:</t>
            <t>Entry conditions: In any state other than ProbeRTT itself, if the
BBR.min_rtt estimate has not been updated (i.e., by getting a
lower RTT measurement) for more than BBR.MinRTTFilterLen = 10 seconds, then BBR
enters ProbeRTT and reduces the BBR.cwnd_gain to BBR.ProbeRTTCwndGain = 0.5.</t>
            <t>Exit conditions: After holding C.inflight to at most ProbeRTTCwnd() 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 1% of a flow's
available bandwidth. It is also designed to spend the vast majority of its
time (at least roughly 98 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 1%, with the average throughput targeted at:</t>
            <artwork><![CDATA[
  throughput = (200ms*0.5*BBR.bw + (10s - 200ms)*BBR.bw) / 10s
             = (.1s + 9.8s)/10s * BBR.bw = 0.99 * BBR.bw
]]></artwork>
            <t>To allow coordination with other BBR flows, each BBR flow MUST use the
standard BBR.MinRTTFilterLen of 10 secs.</t>
            <t>A BBR.MinRTTFilterLen of 10 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.min_rtt filter opportunistically picks up these measurements, and the
BBR.min_rtt estimate refreshes without requiring ProbeRTT. This way, flows
typically need only pay the throughput penalty if there are multiple bulk
flows busy sending over the entire BBR.MinRTTFilterLen window.</t>
            <t>As an optimization, when restarting from idle and finding that the
BBR.min_rtt 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 BBR.min_rtt estimate
and its ProbeRTT scheduling state:</t>
            <artwork><![CDATA[
  UpdateMinRTT():
    BBR.min_rtt_expired =
      Now() > BBR.min_rtt_stamp + BBR.MinRTTFilterLen
    if (BBR.min_rtt_expired)
      BBR.probe_rtt_cwnd = BDPMultiple(BBR.ProbeRTTCwndGain)
    if (RS.rtt >= 0 &&
        (RS.rtt < BBR.min_rtt || BBR.min_rtt_expired))
      BBR.min_rtt       = RS.rtt
      BBR.min_rtt_stamp = Now()
]]></artwork>
            <t>Here BBR.min_rtt_expired is a boolean recording whether the
BBR.min_rtt estimate 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.min_rtt_expired &&
        !BBR.idle_restart)
      SaveCwnd()
      EnterProbeRTT()
      BBR.probe_rtt_done_stamp = 0
      BBR.is_bw_probe_stopping = true
      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.min_rtt_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 inflight 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 the 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 (10 seconds) is long enough to cover a ProbeRTT cycle
(see <xref target="probertt"/>). 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.check_probe_loss = 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
    BBR.loss_events_in_round++

  HandleLostPacket(Packet P):
    NoteLoss()
    if (!BBR.check_probe_loss)
      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
      BBR.loss_events_in_round = 0

  ResetCongestionSignals():
    BBR.is_loss_in_round = false
    BBR.loss_events_in_round = 0
    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
    BBR.loss_events_in_round = 0
    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"/>.
QuantizationBudget() calculates a "quanta" term that allows enough
in flight to reach high throughput even in
environments using offload mechanisms. It ensures the inflight limit accommodates
the offload budget and the minimum cwnd for pipelining.</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 <xref target="probertt"/>), 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 ProbeRTTCwnd(), which takes the smaller of BDPMultiple(BBR.ProbeRTTCwndGain)
and BBR.probe_rtt_cwnd, and then applies a floor of BBR.MinPipeCwnd, the minimal
value that allows pipelining (see <xref target="minimum-cwnd-for-pipelining"/>):</t>
            <artwork><![CDATA[
  ProbeRTTCwnd():
    probe_rtt_cwnd = BDPMultiple(BBR.ProbeRTTCwndGain)
    probe_rtt_cwnd = min(probe_rtt_cwnd, BBR.probe_rtt_cwnd)
    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="20" month="July" 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-03"/>
        </reference>
      </references>
    </references>
    <?line 3913?>

<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.MinRTTFilterLen</tt> (10 seconds) without updating
<tt>BBR.min_rtt</tt>.</t>
          </li>
          <li>
            <t>Verify the connection enters PROBE_RTT, sets <tt>BBR.cwnd_gain</tt> to
<tt>BBR.ProbeRTTCwndGain</tt> (0.5), and bounds <tt>C.cwnd</tt> to <tt>ProbeRTTCwnd()</tt>.</t>
          </li>
          <li>
            <t>Once <tt>C.inflight &lt;= ProbeRTTCwnd()</tt>, 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, restores <tt>BBR.cwnd_gain</tt> to
<tt>BBR.DefaultCwndGain</tt> (2), 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.MinRTTFilterLen</tt> (10 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.MinRTTFilterLen</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+S9+3bb2JU3+D+eAlGtdJEVkpJ8qbJVcfqzZbvKKV8US051
prtHCyRBCTFJMAAoWXH8rX6F+X/m5fpJZv/25VwAUHal8309a03W6i6ZAM5l
n332/TIej5Oro/RuMi9n62yVH6XzKls04yJvFuPZ7PpiPJ1W44PvklnWHKX5
h01Sb6eroq6Lct3cbOj9F8/Onieb4ihJ06acHaVfN9U2/5r+Vd+sqnxRh7+U
VRP91BTNkoZ48uRtelyuL/K6oWHxZ1OVyySjqfMrfpxkVZ7pXNcXR+nx8c8/
JO+vj/o+S7Jtc1lWR8k4pX/S8Pm8aMqK5pcNvs6zZXqcVfPrfLmkX8uKBvyh
LC+WOf0rX2XF8ihdz/SF/3HBTyazcrVrwBfZOj29zptm12BFtq7x/AvG+n1Z
55vL9EleX2Y3Nt6rvMn8aH+e8sP/saJfeah1Wa2yprjKcQZvnx8/vPPwrv55
5+Dwgf753d077tfDw4f654PDO9/qn/e/fXBo7z68d8cGu3fXRnjw8MF9+/Xg
4ED/vHf3nv357cM79u6333533/169zv/mY179/Bbe/fh3bs2woP7h7SGYr0I
t3R8/MOPvz/kZRKOZdVFTqh42TSbo/39v2zzbT7JZqsJQWp/TiAplpPZYvXP
xfzR3YM7dw4f3JPPBNO+JlwKkWb8JKvzeQ8Wfc1fGSbh7/EO9PFP/rSdXW7X
F+nxZb6+0CfFmrD9eJL+sF2v+Sc7aPrttKGjztf+mQ10Wl7mxTL9W/pjVtdZ
nf4pv8jW+WX0zh8J6X6fzcppXcrH86yhn+nAvx0fHvAvdV4VeQ1gHunUj49f
pX8AxI7SN7OGX3bw/a4L35oAPANsDb6r7CL7a7HO63369Lv9O/t3Du/cu/OA
acTMA3UKoIY/zASo+5v54v9vp/Hd+ODOjtM4Ller7bogykpbrdNykTaXOc7o
KH2eT/ljevPVK7msDmpP802V4yPa3Bl9cHZ8kr7KZlVZz8pNMUtflfN8uRNg
ryb0cnNZ1NGvv8evl/PsqohX/3A3LtHqN9smr+JtpG/zqyK/HqVX5XKS3ns4
StflJL0/SjebSfrt3TFd+vRrHCcd/SnhWrPdHF+v5z9kxfqojRqpvpDO6I00
5XfSjPZfFVc82de9GHtRNJfbKSjjvtDbfULP/emynBL+1rTi/aflbLvK1w0P
sl/LLPsXNP5+ts6WN3VR45tzfXKO+c/xeGII3AfZkA38vQj6j8C4B+Pfb5cR
hE+yGSHL7TCWd/4bgfxZ+P73QHItkHxa0fJugyO/8N8HxTmm//8gDO8cjk/z
Df0kYmVVrspxMZtVFyRcFvP7dGvGTyftX+n1x4f3+/nR9fX1BMKp8qNiOc6q
2SVJCvvX+XQ/+8tqf7atKoLY/qq+ODi89+BgctmsluF5gWA+Pv4prbcboqQs
yu4ml8X7LF+mj6dVdpmt6g6K3B8fHvIv1UzE0/TxH16lWBfwYFnUoAYEmQcP
esWXPJ8sp8vJRXm1v8k2eVXvg2tmV2Uxn7SYZcAVH+N5tp7labaeO7l31xZ2
nM3hwwcPxgcPdlD30xc/HL959YrfGn0RrT98ILT+ntD6u4f3xnfvPFRqT/M/
PIghsGAA0P+fFHUxyefb/Xw9v0P/Z/8dF2uakrY8Pnz48GACmIbwIDZXLAoS
F3CcvcB5vLwoK7phq18OmocH44N7O0DTXl502sbdTh7ej2kEVvlHujkkgODj
phzTf1IvI6WZWzf+kV4QEaC7+gKTrPOmTwJiaeblJH1SZe9XZSTPvMyu6Q7Q
WKfRY//NSU7j2q79V1V103nqYHJ/tzDw9Ytnz56R8rKtiChhA6f5Mp81dDqP
SXGradq2tHN4d/BgSMPe+5aGpVv6tUFu18UnBbWeeAUK/2bKuD/fPyzH9+/+
efrm/MOP49XDizt/Or74c7a4P/3pwVV+8uefT7599f6g+lPx9uVP43f7ULja
JzN+/cej9PE6fbfBZkmPBVKN+bj+MYAP6MXOK/e1geDn0x7k2X9xkr5YLrd1
U9FY81H6x3JJ+0/vHLEQ+GK1WeaOUexc9A+T9OequLhsokX/kNGxv40e6fs/
s1x8la/r6AP6+W0xuyQ+Ej32mLJL/5jPC0Kr8c95vcxvdLs/vv2Xgwfxfo/f
PXlxTCdC/Oqaj+I5jbSeL2/SH2mF49NNrvf+j1lFyvXu20Gn8GMW/vCCVn6Z
562D/JdtdEo7jwj6E1HGNyen6Rui1iKDn94Qp14pMdQ9/fCT6NIdgg/2tXw/
IVTezpYZkz2aNdtfFEvSqkhuICWpvM6rNvUn5HyxvpLdpidVSbM3N1AZHGl+
nTfXZfU+PcHnu+BBh/yD0VG//Z+WebGuytn7AAqLbFnnO8BA88/oBGjzTmsR
OsXIBwmjXC9yuQdl++aTsrFd5yNwFnDOn76LtRtePvO1OYjQqlgTVSWtptoS
gGS27WqaLsoq3VREIqfFUl7Av+gKMK2ZKVB0vbNoAbdc6P/NgPj68OF3D4Eu
P70+f/7i5dmzt/2kj8TEyXuwgSVLPZvtdL+erfaJ6Ww/7MsDvLPflNVVtpzX
8mSCn7B1+s+ymO5fk4BI4FxlHyYzmEeye4vDxUMSTQ7v383v3Hnw7cPpt/cO
Hjy4e2d6P3s4nT6cffftneni2/B0XmLgtIiIDXb+E6mUy5y059dEFspl/XVK
s83pKOcpTUly2oc0+yw3bg/yhZLrDiZu53ZGgueimJ2UywKy+Q7msvQ2pLLY
PzyYHB7eu79/5+Hdew++uzOR/97tXEjhzeOfizlJGyqOAxw6Z2qT7kK5s0n6
fJnNLiPielZOC2KZ/oG+/HqSPt2+f19sCOrRB6/pthRN1nqqXz2epGd59dci
JuCP13Pmy8Ejff8JEcjs4jK7ymLZ4ElG5O4yfuYXFh3MLkOr++BPk0DNSG9R
QGwHvye9prX+99vK/xxS+5gfn15us8L9qu89mwDX/gpzU236un3wrLkkfOo8
DuhneUWo3YLOW/r/9WX8zBvkbucmLGfjNeYdSTIej9NsCj4/a+ifZ5eEUybs
pPUmn0HsrZnYQPEMREg1s/mrNuE3BntPyoaQdp0TYXtCyHJdzOkoQWPfllsI
o1WxAf3cZBdyo5tile8N021N81T5DBOvCF22Fd96RvEsoQWu601ZNZiXxmbB
g5aaL0kbI4ECcsoorfwMGHXE026y2fu8SZdlXfNrCUlc022xnNNTOBlwa2hK
GLKMrq6VvRF+X8q2GljreIkwZ+nbTZkYFKYlbfKyvCZKQEI6jVeTCFHjWDJe
BEYlwlSstitoMBCmaC5+TC9ny2V5XSfETBZLSEVgK+E6MnplfcN7ohuTL9la
DckRmxILaM/RJO5oalI/Z3QINX28LtOPH9UC/+lTSqyNBSD5EQb4T59GvOVy
QdykhgumbkgQKGiRN+klLY9YZnNJoL64JL7HzHHqjrxOrmnCtL7kLRGceRDM
Qgc4L1e84ryWk4mHXjIzZhs7JB0CcHZTJ63hUx5+nucbN/aAlRl8sic/TZdl
1uwN5eBmdMjTPHFchCBFwGVoOpQibGzKGZ0iXceGNXX6tVbEGRuOJfTPdXm9
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
zMTXUdKmsiVbvifTa44OYIdeHoN/IgN3Uz/Tx86UrmGkN6aVI8oe4ORJ2YAu
CrZSU6e8B2fpnTHiTwpRyVyb83ILyR+u50R45+Be+m/fpMv14M4w/Z+P0juT
776D/NuXqvrp0/dmakksSRUOFMaiFuh0z+0kzVt2rFsJNmxzSSInZhKMIKRZ
bTgMgnMsJeLGOV7F0ajWi5YLH7obaTihRgMHel5L+Bk8L6rfdxNMoa5CIpG1
0fiIuWQL/GG635M8nT7iB3fovweT+3IwtCTStJpiBtN0YkEc0Jom3s+Ndcsk
9J1dSRBCEQ8vy2tWajnyNL0oy3kSBKBIxBLsn0yD2cMhAk621DSIK3hE+HRk
c6+y6oI2mlcgpoLyuB6E8fA/ssitWE/X+vDXvbifeNxP27iPS8ki3Y4riWe3
XUiX6/2l1zHGhydPTxCDbKvLejS1gZDNoSFtvsi2y8Zlwf+yayquGolV/swV
VDzE1QtvnE0M4+g79YvNZU0pXwQIs5cchGc3z+fDC7x/IJyvSGVyCZdOZr2Q
J2NnEHUSK8bhv2N2ISZWpujGJ0wex7/lsblIZRTe1jmjDrJkVWnbIbjXab7M
NrXTU6MxOL0aBzAty2Werb0xvmbZsBRzQMmeBCfFh3MkmGMEqZO4vznS5ld8
V1pr1ZlZiZCfAwn+xIvzetDznOiFIQIsshyDv1s9wdiIbDtHimrftsy4USx8
9CP+DgWBAjo1f85WbQQ9El1gxVNCEjGLpJ7zW7IRldh42bTKYM9CL4TCylHy
ZyxdA5GOYRnyWPRU3PPx/aVXAnQSD373Gr8s6/rskhZ/eeuFUjGiIbhwWiXz
fR+6040+4w0gUJIDDEGUXWTTQBwCenPq9M6v7Yo/yZvstmXYRzuiX0FQVtl7
DXkNrjKzlPmWgx2FcLcUXjG4Wdh8ImGynuLTIg8m39kqfySxpirL1a0Ai1eo
BJHWJ2FtdEMY71RgPIfzDm5/5ROBOJEFEv2iynM2T2L2hG8ZD0W4egXPZOhw
QRyFGhj4M4iJuT0M+K/GQCL4E6+xjlMvy6buvstG0qFcCvXVWXwAiqrULi61
DbnD+wa6V8TRik3u7XRMqZH9JOYF+YijDTjxrBbRggUnmEmWEgkJ/pmYc02p
hwTJIHhlDwpFztp0aETYk1jafM6Ggw0yzm6OEpazxHCsd8vlhyIShWvExBfL
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
k6wu9//XBNsQx/uBbrBuPgqGrIpVsmqXwrXFT9DuYSM5zbtVEjDNbcjU6AVb
NTWqegYDCHB2FjKiKPuyblYcWOGHH5N153TU8UPijua0uDi3FHUPTTGL3Jmc
kPC7b7/aI0/kSftWSXutdQZNQNkhz7gSgBVuIRuOiz9+dPK9OrJ9umsgfKnw
j4ulJjBTt3Eduv5QpRp5/sts7v05uFwrP2jKDiOMrbcVaYVpLh5ubc9uRD/e
kEOnXjZsWwohOHXRSVQLU+Sur/L8nIIqdIlwysJCaGjcxVGd32QSrPLgYwEx
GJ9dKdx+sxaoAPc1TAayaqrT9apeSh5w5lMfZAoLCfFcrVHDs1IuICoqkRuW
0g/dniicpoGJ8BWArQ2GO7FaUtoh1cGR3XHkjiaSKEmrmb6thGo9TDOnb6RN
UVyjfFcB6e9AE57oRbN9RvkWV6CE8AChXZXXmrSpKbUXy3oNHTaj3XLh7KN1
GatV1LJy5UhmFDJI2G84d+cEvgOnKM85CW1ajiS9h3pKVg8wPtznWZ9yD5NB
DvHO5I5hr1DXzstyeuqUyvCt7KqQbCQ/F1RgJkB0DRsXVwUz3OecWUnx4Vpi
mX5nyqgzP2pJC60SBDsIjRvUDbnhbdFEexmhh/56CZ/mKLEOOiSLE35v74W0
m2yxPp1VZ/Dg4GBNkWDuc/6dbLyTH9fr5VmJ2cxfHj3hi+pOfrlaLZr97e0L
J6TWp5Oz+mr7oq4vZuX26ely+3RWn26/vbd99Ojg4dNHk6vpZ73lBNZ2tXj7
1fbqbPHK/TA5Mz3Zz3/AG/jTU5pqd1Xu50wGjaJM+uFJ5S79xj1Msz2e8b+m
7t0XT97u5dv5g+OHeI6u8OJstR96hgWZcK/Qwem2W4/1FfVwPC3fcvPk+2Zb
yzX6zGk6cIbu7Y3yvZ29exlNI5GWdc1gk07hWTM5u3TGdLW+mtTLi239x3az
PMNcuG2xnL6iIOrNNvncLkv8RP+57U5duR10m1eSo0e93XslUc+zs//TX7z8
+xfMrYy7Rm/k+V9lfZ6frWoszy6WZzf7ZaeIrSxJI4VL3hPOhyzpkNv2Cw4Z
79aZTo05PZM3dK/PsHruA9vN2dX2jJrc5h/omW13ozj5Nm34lwn+tCzL+Hwh
3VE3iJ/8jo92TPxVc6HTvv3PO09OHy5Ws+d/q7cf/XTx5uivP/344J8O/vyP
OLq/9gY5Lp3hySf4K79FPuMEt8WZHBpINEqN0D9sPkFapfiK/QAdJ/cf9qX/
mSf2a78aVId3ho7QF6yvhUrw+Jdx7IVRNdyruFwB5nQ59arKvQxmwtmNJGfz
R+ict5Bmm6xedhSZGSZLLkhoLgsNaLr5LUOrcQczvt5Zh5KyovmUyiM3fYO1
q6+/+f0u0gTIODl4dtCelaqYFz0zolqUlryjAWa3ciMAK+k1+7c0FYPKHi6X
YOQV3p9ymjkNlok6d/e+IU1PI/oPLInoVT116jGpnWATYpfVdbVkvskCvldS
270nXeaalO4lN0N5X9MpeUaFtNtpbxR1gYIkpQnzNZ3fZiJZOail5KpgUoyx
3p4iZ9PkAjLTr3zG95mmNavlwM3bTB6TOz+SNBFOPuIMvDC+TMc30bA0bJv8
0bRy4no/NqN84tBV/ZYNNr5MvHJYzOll3gUH3mXMCvL7L4r4LxKyKNYrZyGz
sg/IkfM1Kt6fuLvqL7Oymjtj7A38OtDbaU0UxuCyrJc35rhk7amcEFtbAZLJ
aXkq7rwnxZKKOJbFm6tasvHqeclxaPkA7KefyouC8hMfvPiWmF9p0p+5Rfd/
prTFzedPFX6yvooLMKe6uS8VcoR1YF5O6gc69mUDo+eMHXYX62pKJbKSDJBx
hKMs3Ijd7ntbzurFlZBihbm8rtdUSzGDX/GN7LRi/ib/C1Xx5P/i9glRc1U3
hdtZf3Wr9ufLYpT/S71u1m+cYFuT3vFk7V78samKWkvfnJGm009pfK4nf8j/
7E51/vimnF9Q+fxPFcAvfiqaytmUb0f5A/e1n9cdDYBCFy3QIJ1QX9H/Qaoh
rzSQhImNPVryqM5CyPKYS0t2Ia3L06e73zpZRCsfJiKLJ+Jwkh+vygV5PH9w
Btoof7SszvKH66vib8Qr+owoPFeF+8ObN1SZV43yF8V1Ocv/7C6kv928GWUP
nMhwu72+GeUPC2dFua+RUepMylF+cOWG/VNx6W4PN49lPXdL2OR/cbujpq/D
/cDODxqTm/aTNVnM4UoaGbq2RwyDI4eeb8L8+OhRviqLq0ZLAivy9nnrETkR
oDpz1r2TG2Yu4mk4IgHvLOEjTMe1U7BH2Z+rq/znwmlt7pNP6gvXXwoP/lQS
v+h0Sf7KHzH2F25bOoHttpAb8XTp5Hv+r4W7vJ3RP8oPL5d0iRTz7Md15ZSZ
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
Qd6pn7dZn3JuKC7qU4Rq/jdja4TIoMICAA==

-->

</rfc>
