<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-bbr-03" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="BBR">BBR Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-03"/>
    <author initials="N." surname="Cardwell" fullname="Neal Cardwell" role="editor">
      <organization>Google</organization>
      <address>
        <email>ncardwell@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <author initials="J." surname="Beshay" fullname="Joseph Beshay" role="editor">
      <organization>Meta</organization>
      <address>
        <email>jbeshay@meta.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="16"/>
    <area>IETF</area>
    <workgroup>CCWG</workgroup>
    <keyword>Congestion Control</keyword>
    <abstract>
      <?line 192?>

<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 210?>

<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 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="transport-connection-state">
        <name>Transport Connection State</name>
        <t>C.SMSS: The Sender Maximum Segment Size.</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 (tracked in octets or in packets)
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.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>
      </section>
      <section anchor="per-packet-state">
        <name>Per-Packet State</name>
        <t>P.delivered: C.delivered when the given packet was sent by transport
connection C.</t>
        <t>P.departure_time: The earliest pacing departure time for the given packet.</t>
        <t>P.tx_in_flight: C.inflight at the time of the packet transmission.</t>
      </section>
      <section anchor="per-ack-rate-sample-state">
        <name>Per-ACK Rate Sample State</name>
        <t>RS.delivered: The volume of data delivered between the transmission of the
packet that has just been ACKed and the current time.</t>
        <t>RS.delivery_rate: The delivery rate (aka bandwidth) sample obtained from
the packet that has just been ACKed.</t>
        <t>RS.rtt: The RTT sample calculated based on the most recently-sent segment
of the segments that have just been ACKed.</t>
        <t>RS.newly_acked: The volume of data cumulatively or selectively acknowledged
upon the ACK that was just received. (This quantity is referred to as
"DeliveredData" in <xref target="RFC6937"/>.)</t>
        <t>RS.newly_lost: The volume of data newly marked lost upon the ACK that was
just received.</t>
        <t>RS.tx_in_flight: C.inflight at
the time of the transmission of the packet that has just been ACKed (the
most recently sent segment among segments ACKed by the ACK that was just
received).</t>
        <t>RS.lost: The volume of data that was declared lost between the transmission
and acknowledgment of the packet that has just been ACKed (the most recently
sent segment among segments ACKed by the ACK that was just received).</t>
      </section>
      <section anchor="output-control-parameters">
        <name>Output Control Parameters</name>
        <t>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.next_departure_time: The earliest pacing departure time for the next
packet BBR schedules for transmission.</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.35, 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>
      </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 (TSO/GSO)  and receiver (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: The filter for tracking the maximum recent RS.delivery_rate
sample, 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.MaxBwFilter only needs to track samples from two time slots: the previous
ProbeBW cycle and the current ProbeBW cycle.</t>
      </section>
      <section anchor="estimating-bbrextraacked">
        <name>Estimating BBR.extra_acked</name>
        <t>BBR.extra_acked_interval_start: the start of the time interval for estimating
the excess amount of data acknowledged due to aggregation effects.</t>
        <t>BBR.extra_acked_delivered: the volume of data marked as delivered since
BBR.extra_acked_interval_start.</t>
        <t>BBR.extra_acked_filter: the max filter tracking the recent maximum 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 recetly started looking.</t>
        <t>BBR.full_bw: A recent baseline BBR.max_bw to estimate if BBR has "filled
the pipe" in Startup.</t>
        <t>BBR.full_bw_count: The number of non-app-limited round trips without large
increases in BBR.full_bw.</t>
      </section>
      <section anchor="probertt-and-minrtt-parameters-and-state">
        <name>ProbeRTT and min_rtt Parameters and State</name>
        <section anchor="parameters-for-estimating-bbrminrtt">
          <name>Parameters for Estimating BBR.min_rtt</name>
          <t>BBR.min_rtt_stamp: The wall clock time at which the current BBR.min_rtt sample
was obtained.</t>
          <t>BBR.MinRTTFilterLen: A constant specifying the length of the BBR.min_rtt min
filter window, BBR.MinRTTFilterLen is 10 secs.</t>
        </section>
        <section anchor="parameters-for-scheduling-probertt">
          <name>Parameters for Scheduling ProbeRTT</name>
          <t>BBR.ProbeRTTCwndGain = A constant specifying the gain value for calculating
C.cwnd during ProbeRTT: 0.5 (meaning that ProbeRTT attempts to reduce in-flight
data to 50% of the estimated BDP).</t>
          <t>BBR.ProbeRTTDuration: A constant specifying the minimum duration for which ProbeRTT
state holds C.inflight to BBR.MinPipeCwnd or fewer packets: 200 ms.</t>
          <t>BBR.ProbeRTTInterval: A constant specifying the minimum time interval between
ProbeRTT states: 5 secs.</t>
          <t>BBR.probe_rtt_min_delay: The minimum RTT sample recorded in the last
ProbeRTTInterval.</t>
          <t>BBR.probe_rtt_min_stamp: The wall clock time at which the current
BBR.probe_rtt_min_delay sample was obtained.</t>
          <t>BBR.probe_rtt_expired: A boolean recording whether the BBR.probe_rtt_min_delay
has expired and is due for a refresh with an application idle period or a
transition into ProbeRTT state.</t>
          <t>The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
be interpreted as described in <xref target="RFC2119"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="design-overview">
      <name>Design Overview</name>
      <section anchor="high-level-design-goals">
        <name>High-Level Design Goals</name>
        <t>The high-level goal of BBR is to achieve both:</t>
        <ol spacing="normal" type="1"><li>
            <t>The full throughput (or approximate fair share thereof) available to a flow  </t>
            <ul spacing="normal">
              <li>
                <t>Achieved in a fast and scalable manner
(using bandwidth in O(log(BDP)) time).</t>
              </li>
              <li>
                <t>Achieved with average packet loss rates of up to 1%.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Low queue pressure (low queuing delay and low packet loss).</t>
          </li>
        </ol>
        <t>These goals are in tension: sending faster improves the odds of achieving
(1) but reduces the odds of achieving (2), while sending slower improves
the odds of achieving (2) but reduces the odds of achieving (1). Thus the
algorithm cannot maximize throughput or minimize queue pressure independently,
and must jointly optimize both.</t>
        <t>To try to achieve these goals, and seek an operating point with high throughput
and low delay <xref target="K79"/> <xref target="GK81"/>, BBR aims to adapt its sending process to
match the network delivery process, in two dimensions:</t>
        <ol spacing="normal" type="1"><li>
            <t>data rate: the rate at which the flow sends data should ideally match the
  rate at which the network delivers the flow's data (the available bottleneck
  bandwidth)</t>
          </li>
          <li>
            <t>data volume: the amount of data in flight in the network
  should ideally match the bandwidth-delay product (BDP) of the path</t>
          </li>
        </ol>
        <t>Both the control of the data rate (via the pacing rate) and data volume
(directly via the congestion window; and indirectly via the pacing
rate) are important. A mismatch in either dimension can cause the sender to
fail to meet its high-level design goals:</t>
        <ol spacing="normal" type="1"><li>
            <t>volume mismatch: If a sender perfectly matches its sending rate to the
  available bandwidth, but its C.inflight exceeds the BDP, then
  the sender can maintain a large standing queue, increasing network latency
  and risking packet loss.</t>
          </li>
          <li>
            <t>rate mismatch: If a sender's C.inflight matches the BDP
  perfectly but its sending rate exceeds the available bottleneck bandwidth
  (e.g. the sender transmits a BDP of data in an unpaced fashion, at the
  sender's link rate), then up to a full BDP of data can burst into the
  bottleneck queue, causing high delay and/or high loss.</t>
          </li>
        </ol>
      </section>
      <section anchor="algorithm-overview">
        <name>Algorithm Overview</name>
        <t>Based on the rationale above, BBR tries to spend most of its time matching
its sending process (data rate and data volume) to the network path's delivery
process. To do this, it explores the 2-dimensional control parameter space
of (1) data rate ("bandwidth" or "throughput") and (2) data volume ("in-flight
data"), with a goal of finding the maximum values of each control parameter
that are consistent with its objective for queue pressure.</t>
        <t>Depending on what signals a given network path manifests at a given time,
the objective for queue pressure is measured in terms of the most strict
among:</t>
        <ul spacing="normal">
          <li>
            <t>the amount of data that is estimated to be queued in the bottleneck buffer
(data_in_flight - estimated_BDP): the objective is to maintain this amount
at or below 1.5 * estimated_BDP</t>
          </li>
          <li>
            <t>the packet loss rate: the objective is a maximum per-round-trip packet loss
rate of BBR.LossThresh=2% (and an average packet loss rate considerably lower)</t>
          </li>
        </ul>
      </section>
      <section anchor="state-machine-overview">
        <name>State Machine Overview</name>
        <t>BBR varies its control parameters with a state machine that aims for high
throughput, low latency, low loss, and an approximately fair sharing of
bandwidth, while maintaining an up-to-date model of the network path.</t>
        <t>A BBR flow starts in the Startup state, and ramps up its sending rate quickly,
to rapidly estimate the maximum available bandwidth (BBR.max_bw). When it
estimates the bottleneck bandwidth has been fully utilized, it enters the
Drain state to drain the estimated queue. In steady state a BBR flow mostly
uses the ProbeBW states, to periodically briefly send faster to probe for
higher capacity and then briefly send slower to try to drain any resulting
queue. If needed, it briefly enters the ProbeRTT state, to lower the sending
rate to probe for lower BBR.min_rtt samples. The detailed behavior for each
state is described below.</t>
      </section>
      <section anchor="network-path-model-overview">
        <name>Network Path Model Overview</name>
        <section anchor="high-level-design-goals-for-the-network-path-model">
          <name>High-Level Design Goals for the Network Path Model</name>
          <t>At a high level, the BBR model is trying to reflect two aspects of the network
path:</t>
          <ul spacing="normal">
            <li>
              <t>Model what's required for achieving full throughput: Estimate the data rate
(BBR.max_bw) and data volume (BBR.max_inflight) required to fully utilize the
fair share of the bottleneck bandwidth available to the flow. This
incorporates estimates of the maximum available bandwidth, the BDP of the
path, and the requirements of any offload features on the end hosts or
mechanisms on the network path that produce aggregation effects.</t>
            </li>
            <li>
              <t>Model what's permitted for achieving low queue pressure: Estimate the maximum
data rate (BBR.bw) and data volume (C.cwnd) consistent with the queue pressure
objective, as measured by the estimated degree of queuing and packet loss.</t>
            </li>
          </ul>
          <t>Note that those two aspects are in tension: the highest throughput is available
to the flow when it sends as fast as possible and occupies as many bottleneck
buffer slots as possible; the lowest queue pressure is achieved by the flow
when it sends as slow as possible and occupies as few bottleneck buffer slots
as possible. To resolve the tension, the algorithm aims to achieve the maximum
throughput achievable while still meeting the queue pressure objective.</t>
        </section>
        <section anchor="time-scales-for-the-network-model">
          <name>Time Scales for the Network Model</name>
          <t>At a high level, the BBR model is trying to reflect the properties of the
network path on two different time scales:</t>
          <section anchor="long-term-model">
            <name>Long-term model</name>
            <t>One goal is for BBR to maintain high average utilization of the fair share
of the available bandwidth, over long time intervals. This requires estimates
of the path's data rate and volume capacities that are robust over long time
intervals. This means being robust to congestion signals that may be noisy
or may reflect short-term congestion that has already abated by the time
an ACK arrives. This also means providing a robust history of the best
recently-achievable performance on the path so that the flow can quickly and
robustly aim to re-probe that level of performance whenever it decides to probe
the capacity of the path.</t>
          </section>
          <section anchor="short-term-model">
            <name>Short-term model</name>
            <t>A second goal of BBR is to react to every congestion signal, including loss,
as if it may indicate a persistent/long-term increase in congestion and/or
decrease in the bandwidth available to the flow, because that may indeed
be the case.</t>
          </section>
          <section anchor="time-scale-strategy">
            <name>Time Scale Strategy</name>
            <t>BBR sequentially alternates between spending most of its time using short-term
models to conservatively respect all congestion signals in case they represent
persistent congestion, but periodically using its long-term model to robustly
probe the limits of the available path capacity in case the congestion has
abated and more capacity is available.</t>
          </section>
        </section>
      </section>
      <section anchor="control-parameter-overview">
        <name>Control Parameter Overview</name>
        <t>BBR uses its model to control the connection's sending behavior. Rather than
using a single control parameter, like the C.cwnd parameter that limits
C.inflight in the Reno and CUBIC congestion control algorithms,
BBR uses three distinct control parameters: C.pacing_race, 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 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 exact octets that were delivered to the
receiver (not lost), and the sender can compute an estimate of a bottleneck
delivery rate over that time interval.</t>
            <t>The amount of data delivered MAY be tracked in units of either octets or
packets. Tracking data in units of octets is more accurate, since packet
sizes can vary. But for some purposes, including congestion control, tracking
data in units of packets may suffice.</t>
            <section anchor="ack-rate">
              <name>ACK Rate</name>
              <t>First, consider the rate at which data is acknowledged by the receiver. In
this algorithm, the computation of the ACK rate models the average slope
of a hypothetical "delivered" curve that tracks the cumulative quantity of
data delivered so far on the Y axis, and time elapsed on the X axis. Since
ACKs arrive in discrete events, this "delivered" curve forms a step function,
where each ACK causes a discrete increase in the "delivered" count that causes
a vertical upward step up in the curve. This "ack_rate" computation is the
average slope of the "delivered" step function, as measured from the "knee"
of the step (ACK) preceding the transmit to the "knee" of the step (ACK)
for packet P.</t>
              <t>Given this model, the ack rate sample "slope" is computed as the ratio between
the amount of data marked as delivered over this time interval, and the time
over which it is marked as delivered:</t>
              <artwork><![CDATA[
  ack_rate = data_acked / ack_elapsed
]]></artwork>
              <t>To calculate the amount of data ACKed over the interval, the sender records in
per-packet state "P.delivered", the amount of data that had been marked
delivered before transmitting packet P, and then records how much data had been
marked delivered by the time the ACK for the packet arrives (in "C.delivered"),
and computes the difference:</t>
              <artwork><![CDATA[
  data_acked = C.delivered - P.delivered
]]></artwork>
              <t>To compute the time interval, "ack_elapsed", one might imagine that it would
be feasible to use the round-trip time (RTT) of the packet. But it is not
safe to simply calculate a bandwidth estimate by using the time between the
transmit of a packet and the acknowledgment of that packet. Transmits and
ACKs can happen out of phase with each other, clocked in separate processes.
In general, transmissions often happen at some point later than the most
recent ACK, due to processing or pacing delays. Because of this effect, drastic
over-estimates can happen if a sender were to attempt to estimate bandwidth
by using the round-trip time.</t>
              <t>The following approach computes "ack_elapsed". The starting time is
"P.delivered_time", the time of the delivery curve "knee" from the ACK
preceding the transmit.  The ending time is "C.delivered_time", the time of the
delivery curve "knee" from the ACK for P. Then we compute "ack_elapsed" as:</t>
              <artwork><![CDATA[
  ack_elapsed = C.delivered_time - P.delivered_time
]]></artwork>
              <t>This yields our equation for computing the ACK rate, as the "slope" from
the "knee" preceding the transmit to the "knee" at ACK:</t>
              <artwork><![CDATA[
  ack_rate = data_acked / ack_elapsed
  ack_rate = (C.delivered - P.delivered) /
             (C.delivered_time - P.delivered_time)
]]></artwork>
            </section>
            <section anchor="compression-and-aggregation">
              <name>Compression and Aggregation</name>
              <t>For computing the delivery_rate, the sender prefers ack_rate, the rate at which
packets were acknowledged, since this usually the most reliable metric.
However, this approach of directly using "ack_rate" faces a challenge when used
with paths featuring aggregation, compression, or ACK decimation, which are
prevalent <xref target="A15"/>.  In such cases, ACK arrivals can temporarily make it appear
as if data packets were delivered much faster than the bottleneck rate. To
filter out such implausible ack_rate samples, we consider the send rate for
each flight of data, as follows.</t>
            </section>
            <section anchor="send-rate">
              <name>Send Rate</name>
              <t>The sender calculates the send rate, "send_rate", for a flight of data as
follows. Define "P.first_sent_time" as the time of the first send in a flight
of data, and "P.sent_time" as the time the final send in that flight of data
(the send that transmits packet "P"). The elapsed time for sending the flight
is:</t>
              <artwork><![CDATA[
  send_elapsed = (P.sent_time - P.first_sent_time)
]]></artwork>
              <t>Then we calculate the send_rate as:</t>
              <artwork><![CDATA[
  send_rate = data_acked / send_elapsed
]]></artwork>
              <t>Using our "delivery" curve model above, the send_rate can be viewed as the
average slope of a "send" curve that traces the amount of data sent on the Y
axis, and the time elapsed on the X axis: the average slope of the transmission
of this flight of data.</t>
            </section>
            <section anchor="delivery-rate">
              <name>Delivery Rate</name>
              <t>Since it is physically impossible to have data delivered faster than it is
sent in a sustained fashion, when the estimator notices that the ack_rate
for a flight is faster than the send rate for the flight, it filters out
the implausible ack_rate by capping the delivery rate sample to be no higher
than the send rate.</t>
              <t>More precisely, over the interval between each transmission and corresponding
ACK, the sender calculates a delivery rate sample, "delivery_rate", using
the minimum of the rate at which packets were acknowledged or the rate at
which they were sent:</t>
              <artwork><![CDATA[
  delivery_rate = min(send_rate, ack_rate)
]]></artwork>
              <t>Since ack_rate and send_rate both have data_acked as a numerator, this can
be computed more efficiently with a single division (instead of two), as
follows:</t>
              <artwork><![CDATA[
  delivery_elapsed = max(ack_elapsed, send_elapsed)
  delivery_rate = data_acked / delivery_elapsed
]]></artwork>
            </section>
          </section>
          <section anchor="tracking-application-limited-phases">
            <name>Tracking application-limited phases</name>
            <t>In application-limited phases the transmission rate is limited by the
sending application rather than the congestion control algorithm. Modern
transport protocol connections are often application-limited, either due
to request/response workloads (e.g., Web traffic, RPC traffic) or because the
sender transmits data in chunks (e.g., adaptive streaming video).</t>
            <t>Knowing whether a delivery rate sample was application-limited is crucial
for congestion control algorithms and applications to use the estimated delivery
rate samples properly. For example, congestion control algorithms likely
do not want to react to a delivery rate that is lower simply because the
sender is application-limited; for congestion control the key metric is the
rate at which the network path can deliver data, and not simply the rate
at which the application happens to be transmitting data at any moment.</t>
            <t>To track this, the estimator marks a bandwidth sample as application-limited
if there was some moment during the sampled flight of data packets when there
was no data ready to send.</t>
            <t>The algorithm detects that an application-limited phase has started when
the sending application requests to send new data, or the connection's
retransmission mechanisms decide to retransmit data, and the connection meets
all of the following conditions:</t>
            <ol spacing="normal" type="1"><li>
                <t>The transport send buffer has less than one C.SMSS of unsent data available
  to send.</t>
              </li>
              <li>
                <t>The sending flow is not currently in the process of transmitting a packet.</t>
              </li>
              <li>
                <t>The amount of data considered in flight is less than the congestion window
  (C.cwnd).</t>
              </li>
              <li>
                <t>All the packets considered lost have been retransmitted.</t>
              </li>
            </ol>
            <t>If these conditions are all met then the sender has run out of data to feed the
network. This would effectively create a "bubble" of idle time in the data
pipeline. This idle time means that any delivery rate sample obtained from this
data packet, and any rate sample from a packet that follows it in the next
round trip, is going to be an application-limited sample that potentially
underestimates the true available bandwidth. Thus, when the algorithm marks a
transport flow as application-limited, it marks all bandwidth samples for the
next round trip as application-limited (at which point, the "bubble" can be
said to have exited the data pipeline).</t>
            <section anchor="considerations-related-to-receiver-flow-control-limits">
              <name>Considerations Related to Receiver Flow Control Limits</name>
              <t>In some cases receiver flow control limits (such as the TCP <xref target="RFC9293"/>
advertised receive window, RCV.WND) are the factor limiting the
delivery rate. This algorithm treats cases where the delivery rate was constrained
by such conditions the same as it treats cases where the delivery rate is
constrained by in-network bottlenecks. That is, it treats receiver bottlenecks
the same as network bottlenecks. This has a conceptual symmetry and has worked
well in practice for congestion control and telemetry purposes.</t>
            </section>
          </section>
        </section>
        <section anchor="detailed-delivery-rate-sampling-algorithm">
          <name>Detailed Delivery Rate Sampling Algorithm</name>
          <section anchor="variables">
            <name>Variables</name>
            <section anchor="per-connection-c-state">
              <name>Per-connection (C) state</name>
              <t>This algorithm requires the following new state variables for each transport
connection:</t>
              <t>C.delivered_time: The wall clock time when C.delivered was last updated.</t>
              <t>C.first_sent_time: If packets are in flight, then this holds the send time of
the packet that was most recently marked as delivered. Else, if the connection
was recently idle, then this holds the send time of most recently sent packet.</t>
              <t>C.app_limited: The index of the last transmitted packet marked as
application-limited, or 0 if the connection is not currently
application-limited.</t>
              <t>We also assume that the transport protocol sender implementation tracks the
following state per connection. If the following state variables are not
tracked by an existing implementation, all the following parameters MUST
be tracked to implement this algorithm:</t>
              <t>C.write_seq: The data sequence number one higher than that of the last octet
queued for transmission in the transport layer write buffer.</t>
              <t>C.pending_transmissions: The number of bytes queued for transmission on the
sending host at layers lower than the transport layer (i.e. network layer,
traffic shaping layer, network device layer).</t>
              <t>C.lost_out: The number of packets in the current outstanding window that
are marked as lost.</t>
              <t>C.retrans_out: The number of packets in the current outstanding window that
are being retransmitted.</t>
              <t>C.min_rtt: The minimum observed RTT over the lifetime 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:</t>
              <t>P.delivered: C.delivered when the packet was sent from transport connection
C.</t>
              <t>P.delivered_time: C.delivered_time when the packet was sent.</t>
              <t>P.first_sent_time: C.first_sent_time when the packet was sent.</t>
              <t>P.is_app_limited: true if C.app_limited was non-zero when the packet was
sent, else false.</t>
              <t>P.sent_time: The time when the packet was sent.</t>
            </section>
            <section anchor="rate-sample-rs-output">
              <name>Rate Sample (rs) Output</name>
              <t>This algorithm provides its output in a RateSample structure rs, containing
the following fields:</t>
              <t>RS.delivery_rate: The delivery rate sample (in most cases RS.delivered /
RS.interval).</t>
              <t>RS.is_app_limited: The P.is_app_limited from the most recent packet delivered;
indicates whether the rate sample is application-limited.</t>
              <t>RS.interval: The length of the sampling interval.</t>
              <t>RS.delivered: The amount of data marked as delivered over the sampling interval.</t>
              <t>RS.prior_delivered: The P.delivered count from the most recent packet delivered.</t>
              <t>RS.prior_time: The P.delivered_time from the most recent packet delivered.</t>
              <t>RS.send_elapsed: Send time interval calculated from the most recent packet
delivered (see the "Send Rate" section above).</t>
              <t>RS.ack_elapsed: ACK time interval calculated from the most recent packet
delivered (see the "ACK Rate" section above).</t>
            </section>
          </section>
          <section anchor="transmitting-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_sent_time  = C.delivered_time = P.sent_time

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

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

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

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

    RS.delivered = C.delivered - RS.prior_delivered

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

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

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

  /* Update rs when a packet is acknowledged. */
  UpdateRateSample(Packet P, RateSample rs):
    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 or IsNewestPacket(P, rs))
      RS.has_data         = true
      RS.prior_delivered  = P.delivered
      RS.prior_time       = P.delivered_time
      RS.is_app_limited   = P.is_app_limited
      RS.send_elapsed     = P.sent_time - P.first_sent_time
      RS.ack_elapsed      = C.delivered_time - P.delivered_time
      RS.last_end_seq     = P.end_seq
      C.first_sent_time   = P.sent_time

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

  /* Is the given Packet the most recently sent packet
   * that has been delivered? */
  IsNewestPacket(Packet P, RateSample rs):
    return (P.sent_time > C.first_sent_time or
            (P.sent_time == C.first_sent_time and
             after(P.end_seq, RS.last_end_seq))
]]></artwork>
          </section>
          <section anchor="detecting-application-limited-phases">
            <name>Detecting application-limited phases</name>
            <t>An application-limited phase starts when the connection decides to send more
data, at a point in time when the connection had previously run out of data.
Some decisions to send more data are triggered by the application writing
more data to the connection, and some are triggered by loss detection (during
ACK processing or upon the triggering of a timer) estimating that some sequence
ranges need to be retransmitted. To detect all such cases, the algorithm
calls CheckIfApplicationLimited() to check for application-limited behavior in
the following situations:</t>
            <ul spacing="normal">
              <li>
                <t>The sending application asks the transport layer to send more data; i.e.,
upon each write from the application, before new application data is enqueued
in the transport send buffer or transmitted.</t>
              </li>
              <li>
                <t>At the beginning of ACK processing, before updating the estimated number
of packets in flight, and before congestion control modifies 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 segments. For example: RTO
timers, TLP timers, RACK reordering timers, or Zero Window Probe timers.</t>
              </li>
            </ul>
            <t>When checking for application-limited behavior, the connection checks all the
conditions previously described in the "Tracking application-limited phases"
section, and if all are met then it marks the connection as
application-limited:</t>
            <artwork><![CDATA[
  CheckIfApplicationLimited():
    if (C.write_seq - SND.NXT < SND.MSS and
        C.pending_transmissions == 0 and
        C.inflight < C.cwnd and
        C.lost_out <= C.retrans_out)
      C.app_limited = (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 be tracked for each packet "aggregate" rather than each
SMSS. For simplicity this document refers to such state as "per-packet",
whether it is per "aggregate" or per C.SMSS.</t>
          </section>
          <section anchor="impact-of-ack-losses">
            <name>Impact of ACK losses</name>
            <t>Delivery rate samples are generated upon receiving each ACK; ACKs may contain
both cumulative and selective acknowledgment information. Losing an ACK results
in losing the delivery rate sample corresponding to that ACK, and generating a
delivery rate sample at later a time (upon the arrival of the next ACK). This
can underestimate the delivery rate due the artificially inflated
"RS.interval". The impact of this effect is mitigated using the BBR.max_bw
filter.</t>
          </section>
          <section anchor="impact-of-packet-reordering">
            <name>Impact of packet reordering</name>
            <t>This algorithm is robust to packet reordering; it makes no assumptions about
the order in which packets are delivered or ACKed. In particular, for a
particular packet P, it does not matter which packets are delivered between the
transmission of P and the ACK of packet P, since C.delivered will be
incremented appropriately in any case.</t>
          </section>
          <section anchor="impact-of-packet-loss-and-retransmissions">
            <name>Impact of packet loss and retransmissions</name>
            <t>There are several possible approaches for handling cases where a delivery
rate sample is based on 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 possibile, 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.departure_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.departure_time
]]></artwork>
      </section>
    </section>
    <section anchor="detailed-algorithm">
      <name>Detailed Algorithm</name>
      <section anchor="state-machine">
        <name>State Machine</name>
        <t>BBR implements a state machine that uses the network path model to guide
its decisions, and the control parameters to enact its decisions.</t>
        <section anchor="state-transition-diagram">
          <name>State Transition Diagram</name>
          <t>The following state transition diagram summarizes the flow of control and
the relationship between the different states:</t>
          <artwork><![CDATA[
             |
             V
    +---> Startup  ------------+
    |        |                 |
    |        V                 |
    |     Drain  --------------+
    |        |                 |
    |        V                 |
    +---> ProbeBW_DOWN  -------+
    | ^      |                 |
    | |      V                 |
    | |   ProbeBW_CRUISE ------+
    | |      |                 |
    | |      V                 |
    | |   ProbeBW_REFILL  -----+
    | |      |                 |
    | |      V                 |
    | |   ProbeBW_UP  ---------+
    | |      |                 |
    | +------+                 |
    |                          |
    +---- ProbeRTT <-----------+
]]></artwork>
        </section>
        <section anchor="state-machine-operation-overview">
          <name>State Machine Operation Overview</name>
          <t>When starting up, BBR probes to try to quickly build a model of the network
path; to adapt to later changes to the path or its traffic, BBR must continue
to probe to update its model. If the available bottleneck bandwidth increases,
BBR must send faster to discover this. Likewise, if the round-trip propagation
delay changes, this changes the BDP, and thus BBR must send slower to get
C.inflight below the new BDP in order to measure the new BBR.min_rtt. Thus,
BBR's state machine runs periodic, sequential experiments, sending faster
to check for BBR.bw increases or sending slower to yield bandwidth, drain
the queue, and check for BBR.min_rtt decreases. The frequency, magnitude,
duration, and structure of these experiments differ depending on what's already
known (startup or steady-state) and application sending behavior (intermittent
or continuous).</t>
          <t>This state machine has several goals:</t>
          <ul spacing="normal">
            <li>
              <t>Achieve high throughput by efficiently utilizing available bandwidth.</t>
            </li>
            <li>
              <t>Achieve low latency and packet loss rates by keeping queues bounded and small.</t>
            </li>
            <li>
              <t>Share bandwidth with other flows in an approximately fair manner.</t>
            </li>
            <li>
              <t>Feed samples to the model estimators to refresh and update the model.</t>
            </li>
          </ul>
        </section>
        <section anchor="state-machine-tactics">
          <name>State Machine Tactics</name>
          <t>In the BBR framework, at any given time the sender can choose one of the
following tactics:</t>
          <ul spacing="normal">
            <li>
              <t>Acceleration: Send faster then the network is delivering data: to probe the
maximum bandwidth available to the flow</t>
            </li>
            <li>
              <t>Deceleration: Send slower than the network is delivering data: to reduce
the amount of data in flight, with a number of overlapping motivations:  </t>
              <ul spacing="normal">
                <li>
                  <t>Reducing queuing delay: to reduce queuing delay, to reduce latency for
request/response cross-traffic (e.g. RPC, web traffic).</t>
                </li>
                <li>
                  <t>Reducing packet loss: to reduce packet loss, to reduce tail latency for
request/response cross-traffic (e.g. RPC, web traffic) and improve
coexistence with Reno/CUBIC.</t>
                </li>
                <li>
                  <t>Probing BBR.min_rtt: to probe the path's BBR.min_rtt</t>
                </li>
                <li>
                  <t>Bandwidth convergence: to aid bandwidth fairness convergence, by leaving
unused capacity in the bottleneck link or bottleneck buffer, to allow other
flows that may have lower sending rates to discover and utilize the unused
capacity</t>
                </li>
                <li>
                  <t>Burst tolerance: to allow bursty arrivals of cross-traffic (e.g. short web
or RPC requests) to be able to share the bottleneck link without causing
excessive queuing delay or packet loss</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Cruising: Send at the same rate the network is delivering data: try to match
the sending rate to the flow's current available bandwidth, to try to achieve
high utilization of the available bandwidth without increasing queue pressure</t>
            </li>
          </ul>
          <t>Throughout the lifetime of a BBR flow, it sequentially cycles through all
three tactics, to measure the network path and try to optimize its operating
point.</t>
          <t>BBR's state machine uses two control mechanisms: the 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[
  BBROnInit():
    InitWindowedMaxFilter(filter=BBR.MaxBwFilter, value=0, time=0)
    BBR.min_rtt = SRTT ? SRTT : Infinity
    BBR.min_rtt_stamp = Now()
    BBR.probe_rtt_done_stamp = 0
    BBR.probe_rtt_round_done = false
    BBR.prior_cwnd = 0
    BBR.idle_restart = false
    BBR.extra_acked_interval_start = Now()
    BBR.extra_acked_delivered = 0
    BBR.full_bw_reached = false
    BBRResetCongestionSignals()
    BBRResetShortTermModel()
    BBRInitRoundCounting()
    BBRResetFullBW()
    BBRInitPacingRate()
    BBREnterStartup()
]]></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[
  BBROnTransmit():
    BBRHandleRestartFromIdle()
]]></artwork>
        </section>
        <section anchor="per-ack-steps">
          <name>Per-ACK Steps</name>
          <t>On every ACK, the BBR algorithm executes the following BBRUpdateOnACK() steps
in order to update its network path model, update its state machine, and
adjust its control parameters to adapt to the updated model:</t>
          <artwork><![CDATA[
  BBRUpdateOnACK():
    GenerateRateSample(RS)
    BBRUpdateModelAndState()
    BBRUpdateControlParameters()

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

  BBRUpdateControlParameters():
    BBRSetPacingRate()
    BBRSetSendQuantum()
    BBRSetCwnd()
]]></artwork>
        </section>
        <section anchor="per-loss-steps">
          <name>Per-Loss Steps</name>
          <t>On every packet loss event, where some sequence range "packet" is marked
lost, the BBR algorithm executes the following BBRUpdateOnLoss() steps in
order to update its network path model</t>
          <artwork><![CDATA[
  BBRUpdateOnLoss(packet):
    BBRHandleLostPacket(packet)
]]></artwork>
        </section>
      </section>
      <section anchor="state-machine-operation">
        <name>State Machine Operation</name>
        <section anchor="startup">
          <name>Startup</name>
          <section anchor="startup-dynamics">
            <name>Startup Dynamics</name>
            <t>When a BBR flow starts up, it performs its first (and most rapid) sequential
probe/drain process in the Startup and Drain states. Network link bandwidths
currently span a range of at least 11 orders of magnitude, from a few bps
to hundreds of Gbps. To quickly learn BBR.max_bw, given this huge range to
explore, BBR's Startup state does an exponential search of the rate space,
doubling the sending rate each round. This finds BBR.max_bw in O(log_2(BDP))
round trips.</t>
            <t>To achieve this rapid probing smoothly, in Startup BBR uses the minimum gain
values that will allow the sending rate to double each round: in Startup BBR
sets BBR.pacing_gain to 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 BBREnterStartup() steps:</t>
            <artwork><![CDATA[
  BBREnterStartup():
    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[
  BBRCheckStartupDone():
    BBRCheckStartupHighLoss()
    if (BBR.state == Startup and BBR.full_bw_reached)
      BBREnterDrain()
]]></artwork>
          </section>
          <section anchor="exiting-acceleration-based-on-bandwidth-plateau">
            <name>Exiting Acceleration Based on Bandwidth Plateau</name>
            <t>In phases where BBR is accelerating to probe the available bandwidth -
Startup and ProbeBW_UP - BBR runs a state machine to estimate whether an
accelerating sending rate has saturated the available per-flow bandwidth
("filled the pipe") by looking for a plateau in the measured
RS.delivery_rate.</t>
            <t>BBR tracks the status of the current full-pipe estimation process in the
boolean BBR.full_bw_now, and uses BBR.full_bw_now to exit ProbeBW_UP. BBR
records in the boolean BBR.full_bw_reached whether BBR estimates that it
has ever fully utilized its available bandwidth (over the lifetime of the
connection), and uses BBR.full_bw_reached to decide when to exit Startup
and enter Drain.</t>
            <t>The full pipe estimator works as follows: if BBR counts several (three)
non-application-limited rounds where attempts to significantly increase the
delivery rate actually result in little increase (less than 25 percent),
then it estimates that it has fully utilized the per-flow available bandwidth,
and sets both BBR.full_bw_now and BBR.full_bw_reached to true.</t>
            <t>Upon starting a full pipe detection process (either on startup or when probing
for an increase in bandwidth), the following steps are taken:</t>
            <artwork><![CDATA[
  BBRResetFullBW():
    BBR.full_bw = 0
    BBR.full_bw_count = 0
    BBR.full_bw_now = 0
]]></artwork>
            <t>While running the full pipe detection process, upon an ACK that acknowledges
new data, and when the delivery rate sample is not application-limited
(see <xref target="delivery-rate-samples"/>), BBR runs the "full pipe" estimator:</t>
            <artwork><![CDATA[
  BBRCheckFullBWReached():
    if (BBR.full_bw_now or !BBR.round_start or RS.is_app_limited)
      return  /* no need to check for a full pipe now */
    if (RS.delivery_rate >= BBR.full_bw * 1.25)
      BBRResetFullBW()       /* bw is still growing, so reset */
      BBR.full_bw = RS.delivery_rate  /* record new baseline bw */
      return
    BBR.full_bw_count++   /* another round w/o much growth */
    BBR.full_bw_now = (BBR.full_bw_count >= 3)
    if (BBR.full_bw_now)
      BBR.full_bw_reached = true
]]></artwork>
            <t>BBR waits three packet-timed round trips to have reasonable evidence that the
sender is not detecting a delivery-rate plateau that was temporarily imposed by
congestion or receive-window auto-tuning. This three-round threshold was
validated by experimental data to allow the receiver the chance to grow its
receive window.</t>
          </section>
          <section anchor="exiting-startup-based-on-packet-loss">
            <name>Exiting Startup Based on Packet Loss</name>
            <t>A second method BBR uses for estimating the bottleneck is full in Startup
is by looking at packet losses. Specifically, BBRCheckStartupHighLoss() checks
whether all of the following criteria are all met:</t>
            <ul spacing="normal">
              <li>
                <t>The connection has been in fast recovery for at least one full packet-timed
round trip.</t>
              </li>
              <li>
                <t>The loss rate over the time scale of a single full round trip exceeds
BBR.LossThresh (2%).</t>
              </li>
              <li>
                <t>There are at least BBRStartupFullLossCnt=6 discontiguous sequence ranges
lost in that round trip.</t>
              </li>
            </ul>
            <t>If these criteria are all met, then BBRCheckStartupHighLoss() takes the
following steps. First, it sets BBR.full_bw_reached = true. Then it sets
BBR.inflight_longterm to its estimate of a safe level of in-flight data suggested
by these losses, which is max(BBR.bdp, BBR.inflight_latest), where
BBR.inflight_latest is the max delivered volume of data (RS.delivered) over
the last round trip. Finally, it exits Startup and enters Drain.</t>
            <t>The algorithm waits until all three criteria are met to filter out noise
from burst losses, and to try to ensure the bottleneck is fully utilized
on a sustained basis, and the full bottleneck bandwidth has been measured,
before attempting to drain the level of in-flight data to the estimated BDP.</t>
          </section>
        </section>
        <section anchor="drain">
          <name>Drain</name>
          <t>Upon exiting Startup, BBR enters its Drain state. In Drain, BBR aims to quickly
drain any queue at the bottleneck link that was created in Startup by switching
to a pacing_gain well below 1.0, until any estimated queue has been drained. It
uses a pacing_gain of BBR.DrainPacingGain = 0.35, chosen via analysis
<xref target="BBRDrainPacingGain"/> and experimentation to try to drain the queue in less
than one round-trip:</t>
          <artwork><![CDATA[
  BBREnterDrain():
    BBR.state = Drain
    BBR.pacing_gain = BBR.DrainPacingGain    /* pace slowly */
    BBR.cwnd_gain = BBR.DefaultCwndGain      /* maintain cwnd */
]]></artwork>
          <t>In Drain, when the amount of data in flight is less than or equal to the
estimated BDP, meaning BBR estimates that the queue at the bottleneck link
has been fully drained, then BBR exits Drain and enters ProbeBW. To implement
this, upon every ACK BBR executes:</t>
          <artwork><![CDATA[
  BBRCheckDrainDone():
    if (BBR.state == Drain and C.inflight <= BBRInflight(1.0))
      BBREnterProbeBW()  /* BBR estimates the queue was drained */
]]></artwork>
        </section>
        <section anchor="probebw">
          <name>ProbeBW</name>
          <t>Long-lived BBR flows tend to spend the vast majority of their time in the
ProbeBW states. In the ProbeBW states, a BBR flow sequentially accelerates,
decelerates, and cruises, to measure the network path, improve its operating
point (increase throughput and reduce queue pressure), and converge toward a
more fair allocation of bottleneck bandwidth. To do this, the flow sequentially
cycles through all three tactics: trying to send faster than, slower than, and
at the same rate as the network delivery process. To achieve this, a BBR flow
in ProbeBW mode cycles through the four Probe bw states (DOWN, CRUISE, REFILL,
and UP) described below in turn.</t>
          <section anchor="probebwdown">
            <name>ProbeBW_DOWN</name>
            <t>In the ProbeBW_DOWN phase of the cycle, a BBR flow pursues the deceleration
tactic, to try to send slower than the network is delivering data, to reduce
the amount of data in flight, with all of the standard motivations for the
deceleration tactic (discussed in "State Machine Tactics" in
<xref target="state-machine-tactics"/>). It does this by switching to a
BBR.pacing_gain of 0.90, sending at 90% of BBR.bw. The pacing_gain value
of 0.90 is derived based on the ProbeBW_UP pacing gain of 1.25, as the minimum
pacing_gain value that allows bandwidth-based convergence to approximate
fairness, and validated through experiments.</t>
            <t>Exit conditions: The flow exits the ProbeBW_DOWN phase and enters CRUISE
when the flow estimates that both of the following conditions have been
met:</t>
            <ul spacing="normal">
              <li>
                <t>There is free headroom: If 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 conservative short-term BBR.bw_shortterm and
BBR.inflight_shortterm parameters 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>
            <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 encounters that limit, it then
gradually increases the upper volume bound (BBR.inflight_longterm) using the
following approach:</t>
            <ul spacing="normal">
              <li>
                <t>BBR.inflight_longterm: The flow raises BBR.inflight_longterm in ProbeBW_UP in a manner
that is slow and cautious at first, but increasingly rapid and bold over time.
The initial caution is motivated by the fact that a given BBR flow may be sharing
a shallow buffer with thousands of other flows, so that the buffer space
available to the flow may be quite tight (even just a single packet or
less). The increasingly rapid growth over time is motivated by the fact that
in a high-speed WAN the increase in available bandwidth (and thus the estimated
BDP) may require the flow to grow 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 exponentially doubles each round trip;
in each successive round trip, BBR.inflight_longterm grows by 1, 2, 4, 8, 16,
etc, with the increases spread uniformly across the entire round trip.
This helps allow BBR to utilize a larger BDP in O(log(BDP)) round trips,
meeting the design goal for scalable utilization of newly-available bandwidth.</t>
              </li>
            </ul>
            <t>Exit conditions: The BBR flow ends ProbeBW_UP bandwidth probing and
transitions to ProbeBW_DOWN to try to drain the bottleneck queue when either
of the following conditions are met:</t>
            <ol spacing="normal" type="1"><li>
                <t>Bandwidth saturation: BBRIsTimeToGoDown() (see below) uses the "full pipe"
  estimator (see <xref target="exiting-acceleration-based-on-bandwidth-plateau"/>) to
  estimate whether the flow has saturated the available per-flow bandwidth
  ("filled the pipe"), by looking for a plateau in the measured
  RS.delivery_rate. If, during this process, 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 BBRResetFullBW().</t>
              </li>
              <li>
                <t>Loss: The current loss rate, over the time scale of the last round trip,
  exceeds BBR.LossThresh (2%).</t>
              </li>
            </ol>
          </section>
          <section anchor="time-scale-for-bandwidth-probing-">
            <name>Time Scale for Bandwidth Probing</name>
            <t>Choosing the time scale for probing bandwidth is tied to the question of
how to coexist with legacy Reno/CUBIC flows, since probing for bandwidth
runs a significant risk of causing packet loss, and causing packet loss can
significantly limit the throughput of such legacy Reno/CUBIC flows.</t>
            <section anchor="bandwidth-probing-and-coexistence-with-renocubic">
              <name>Bandwidth Probing and Coexistence with Reno/CUBIC</name>
              <t>BBR has an explicit strategy for coexistence with Reno/CUBIC: to try to behave
in a manner so that  Reno/CUBIC flows coexisting with BBR can continue to
work well in the primary contexts where they do today:</t>
              <ul spacing="normal">
                <li>
                  <t>Intra-datacenter/LAN traffic: the goal is to allow Reno/CUBIC to be able
to perform well in 100M through 40G enterprise and datacenter Ethernet:  </t>
                  <ul spacing="normal">
                    <li>
                      <t>BDP = 40 Gbps * 20 us / (1514 bytes) ~= 66 packets</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Public Internet last mile traffic: the goal is to allow Reno/CUBIC to be
able to support up to 25Mbps (for 4K Video) at an RTT of 30ms, typical
parameters for common CDNs for large video services:  </t>
                  <ul spacing="normal">
                    <li>
                      <t>BDP = 25Mbps * 30 ms / (1514 bytes) ~= 62 packets</t>
                    </li>
                  </ul>
                </li>
              </ul>
              <t>The challenge in meeting these goals is that Reno/CUBIC need long periods
of no loss to utilize large BDPs. The good news is that in the environments
where Reno/CUBIC work well today (mentioned above), the BDPs are small, roughly
~100 packets or less.</t>
            </section>
            <section anchor="a-dual-time-scale-approach-for-coexistence">
              <name>A Dual-Time-Scale Approach for Coexistence</name>
              <t>The BBR strategy has several aspects:</t>
              <ol spacing="normal" type="1"><li>
                  <t>The highest priority is to estimate the bandwidth available to the BBR flow
  in question.</t>
                </li>
                <li>
                  <t>Secondarily, a given BBR flow adapts (within bounds) the frequency at which
  it probes bandwidth and knowingly risks packet loss, to allow Reno/CUBIC
  to reach a bandwidth at least as high as that given BBR flow.</t>
                </li>
              </ol>
              <t>To adapt the frequency of bandwidth probing, BBR considers two time scales:
a BBR-native time scale, and a bounded Reno-conscious time scale:</t>
              <ul spacing="normal">
                <li>
                  <t>T_bbr: BBR-native time-scale  </t>
                  <ul spacing="normal">
                    <li>
                      <t>T_bbr = uniformly randomly distributed between 2 and 3 secs</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>T_reno: Reno-coexistence time scale  </t>
                  <ul spacing="normal">
                    <li>
                      <t>T_reno_bound = pick_randomly_either({62, 63})</t>
                    </li>
                    <li>
                      <t>reno_bdp = min(BBR.bdp, 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? */
  BBRIsTimeToProbeBW():
    if (BBRHasElapsedInPhase(BBR.bw_probe_wait) ||
        BBRIsRenoCoexistenceProbeTime())
      BBRStartProbeBW_REFILL()
      return true
    return false

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

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

  /* How much data do we want in flight?
   * Our estimated BDP, unless congestion cut C.cwnd. */
  BBRTargetInflight()
    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[
  BBREnterProbeBW():
    BBR.cwnd_gain = BBR.DefaultCwndGain
    BBRStartProbeBW_DOWN()
]]></artwork>
            <t>The core logic for entering each state:</t>
            <artwork><![CDATA[
  BBRStartProbeBW_DOWN():
    BBRResetCongestionSignals()
    BBR.probe_up_cnt = Infinity /* not growing BBR.inflight_longterm */
    BBRPickProbeWait()
    BBR.cycle_stamp = Now()  /* start wall clock */
    BBR.ack_phase  = ACKS_PROBE_STOPPING
    BBRStartRound()
    BBR.state = ProbeBW_DOWN

  BBRStartProbeBW_CRUISE():
    BBR.state = ProbeBW_CRUISE

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

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

    switch (state)

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

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

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

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

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

  /* Time to transition from UP to DOWN? */
  BBRIsTimeToGoDown():
    if (C.is_cwnd_limited and C.cwnd >= BBR.inflight_longterm)
      BBRResetFullBW()   /* 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

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

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

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

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

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

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

    if (!IsInflightTooHigh())
      /* Loss rate is safe. Adjust upper bounds upward. */
      if (BBR.inflight_longterm == Infinity)
        return /* 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)
        BBRProbeInflightLongtermUpward()
]]></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 ProbeRTTInterval = 5 seconds, the flow enters ProbeRTT, decelerating
by setting its cwnd_gain to BBR.ProbeRTTCwndGain = 0.5 to reduce
C.inflight to half of its estimated BDP, to try to measure the unloaded
two-way propagation delay.</t>
            <t>There are two main motivations for making the MinRTTFilterLen roughly twice
the ProbeRTTInterval. First, this ensures that during a ProbeRTT episode
the flow will "remember" the BBR.min_rtt value it measured during the previous
ProbeRTT episode, providing a robust BDP estimate for the C.cwnd = 0.5*BDP
calculation, increasing the likelihood of fully draining the bottleneck
queue. Second, this allows the flow's BBR.min_rtt filter window to generally
include RTT samples from two ProbeTT episodes, providing a more robust
estimate.</t>
            <t>The algorithm for ProbeRTT is as follows:</t>
            <t>Entry conditions: In any state other than ProbeRTT itself, if the
BBR.probe_rtt_min_delay estimate has not been updated (i.e., by getting a
lower RTT measurement) for more than ProbeRTTInterval = 5 seconds, then BBR
enters ProbeRTT and reduces the BBR.cwnd_gain to BBR.ProbeRTTCwndGain = 0.5.</t>
            <t>Exit conditions: After maintaining C.inflight at
BBR.ProbeRTTCwndGain*BBR.bdp for at least BBR.ProbeRTTDuration (200 ms) and at
least one packet-timed round trip, BBR leaves ProbeRTT and transitions to
ProbeBW if it estimates the pipe was filled already, or Startup otherwise.</t>
          </section>
          <section anchor="probertt-design-rationale">
            <name>ProbeRTT Design Rationale</name>
            <t>BBR is designed to have ProbeRTT sacrifice no more than roughly 2% of a flow's
available bandwidth. It is also designed to spend the vast majority of its
time (at least roughly 96 percent) in ProbeBW and the rest in ProbeRTT, based
on a set of tradeoffs. ProbeRTT lasts long enough (at least BBR.ProbeRTTDuration
= 200 ms) to allow diverse flows (e.g., flows with different RTTs or lower
rates and thus longer inter-packet gaps) to have overlapping ProbeRTT states,
while still being short enough to bound the throughput penalty of ProbeRTT's
cwnd capping to roughly 2%, with the average throughput targeted at:</t>
            <artwork><![CDATA[
  throughput = (200ms*0.5*BBR.bw + (5s - 200ms)*BBR.bw) / 5s
             = (.1s + 4.8s)/5s * BBR.bw = 0.98 * BBR.bw
]]></artwork>
            <t>As discussed above, BBR's BBR.min_rtt filter window, BBR.MinRTTFilterLen, and
time interval between ProbeRTT states, ProbeRTTInterval, work in concert.
BBR uses a BBR.MinRTTFilterLen equal to or longer than BBR.ProbeRTTInterval to allow
the filter window to include at least one ProbeRTT.</t>
            <t>To allow coordination with other BBR flows, each BBR flow MUST use the
standard BBR.ProbeRTTInterval of 5 secs.</t>
            <t>A BBR.ProbeRTTInterval of 5 secs is short enough to allow quick convergence if
traffic levels or routes change, but long enough so that interactive
applications (e.g., Web, remote procedure calls, video chunks) often have
natural silences or low-rate periods within the window where the flow's rate
is low enough for long enough to drain its queue in the bottleneck. Then the
BBR.probe_rtt_min_delay filter opportunistically picks up these measurements,
and the BBR.probe_rtt_min_delay estimate refreshes without requiring
ProbeRTT. This way, flows typically need only pay the 2 percent throughput
penalty if there are multiple bulk flows busy sending over the entire
BBR.ProbeRTTInterval window.</t>
            <t>As an optimization, when restarting from idle and finding that the
BBR.probe_rtt_min_delay has expired, BBR does not enter ProbeRTT; the idleness
is deemed a sufficient attempt to coordinate to drain the queue.</t>
          </section>
          <section anchor="probertt-logic">
            <name>ProbeRTT Logic</name>
            <t>On every ACK BBR executes BBRUpdateMinRTT() to update its ProbeRTT scheduling
state (BBR.probe_rtt_min_delay and BBR.probe_rtt_min_stamp) and its BBR.min_rtt
estimate:</t>
            <artwork><![CDATA[
  BBRUpdateMinRTT()
    BBR.probe_rtt_expired =
      Now() > BBR.probe_rtt_min_stamp + ProbeRTTInterval
    if (RS.rtt >= 0 and
        (RS.rtt < BBR.probe_rtt_min_delay or
         BBR.probe_rtt_expired))
       BBR.probe_rtt_min_delay = RS.rtt
       BBR.probe_rtt_min_stamp = Now()

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

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

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

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

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

  BBRStartRound():
    BBR.next_round_delivered = C.delivered
]]></artwork>
        </section>
        <section anchor="bbrmaxbw-estimated-maximum-bandwidth">
          <name>BBR.max_bw: Estimated Maximum Bandwidth</name>
          <t>BBR.max_bw is BBR's estimate of the maximum bottleneck bandwidth available to
data transmissions for the transport flow. At any time, a transport
connection's data transmissions experience some slowest link or bottleneck. The
bottleneck's delivery rate determines the connection's maximum data-delivery
rate. BBR tries to closely match its sending rate to this bottleneck delivery
rate to help seek "rate balance", where the flow's packet arrival rate at the
bottleneck equals the departure rate. The bottleneck rate varies over the life
of a connection, so BBR continually estimates BBR.max_bw using recent signals.</t>
        </section>
        <section anchor="bbrmaxbw-max-filter">
          <name>BBR.max_bw Max Filter</name>
          <t>Delivery rate samples are often below the typical bottleneck bandwidth
available to the flow, due to "noise" introduced by random variation in
physical transmission processes (e.g. radio link layer noise) or queues or
along the network path.  To filter these effects BBR uses a max filter: BBR
estimates BBR.max_bw using the windowed maximum recent delivery rate sample
seen by the connection over recent history.</t>
          <t>The BBR.max_bw max filter window covers a time period extending over the
past two ProbeBW cycles. The BBR.max_bw max filter window length is driven
by trade-offs among several considerations:</t>
          <ul spacing="normal">
            <li>
              <t>It is long enough to cover at least one entire ProbeBW cycle (see the
"ProbeBW" section). This ensures that the window contains at least some
delivery rate samples that are the result of data transmitted with a
super-unity pacing_gain (a pacing_gain larger than 1.0). Such super-unity
delivery rate samples are instrumental in revealing the path's underlying
available bandwidth even when there is noise from delivery rate shortfalls
due to aggregation delays, queuing delays from variable cross-traffic, lossy
link layers with uncorrected losses, or short-term buffer exhaustion (e.g.,
brief coincident bursts in a shallow buffer).</t>
            </li>
            <li>
              <t>It aims to be long enough to cover short-term fluctuations in the network's
delivery rate due to the aforementioned sources of noise. In particular, the
delivery rate for radio link layers (e.g., wifi and cellular technologies)
can be highly variable, and the filter window needs to be long enough to
remember "good" delivery rate samples in order to be robust to such
variations.</t>
            </li>
            <li>
              <t>It aims to be short enough to respond in a timely manner to sustained
reductions in the bandwidth available to a flow, whether this is because
other flows are using a larger share of the bottleneck, or the bottleneck
link service rate has reduced due to layer 1 or layer 2 changes, policy
changes, or routing changes. In any of these cases, existing BBR flows
traversing the bottleneck should, in a timely manner, reduce their BBR.max_bw
estimates and thus pacing rate and in-flight data, in order to match the
sending behavior to the new available bandwidth.</t>
            </li>
          </ul>
        </section>
        <section anchor="bbrmaxbw-and-application-limited-delivery-rate-samples">
          <name>BBR.max_bw and Application-limited Delivery Rate Samples</name>
          <t>Transmissions can be application-limited, meaning the transmission rate is
limited by the application rather than the congestion control algorithm.  This
is quite common because of request/response traffic. When there is a
transmission opportunity but no data to send, the delivery rate sampler marks
the corresponding bandwidth sample(s) as application-limited
<xref target="delivery-rate-samples"/>.  The BBR.max_bw estimator carefully decides which
samples to include in the bandwidth model to ensure that BBR.max_bw reflects
network limits, not application limits. By default, the estimator discards
application-limited samples, since by definition they reflect application
limits. However, the estimator does use application-limited samples if the
measured delivery rate happens to be larger than the current BBR.max_bw
estimate, since this indicates the current BBR.Max_bw estimate is too low.</t>
        </section>
        <section anchor="updating-the-bbrmaxbw-max-filter">
          <name>Updating the BBR.max_bw Max Filter</name>
          <t>For every ACK that acknowledges some data packets as delivered, BBR invokes
BBRUpdateMaxBw() to update the BBR.max_bw estimator as follows:</t>
          <artwork><![CDATA[
  BBRUpdateMaxBw()
    BBRUpdateRound()
    if (RS.delivery_rate >= BBR.max_bw || !RS.is_app_limited)
        BBR.max_bw = UpdateWindowedMaxFilter(
                      filter=BBR.MaxBwFilter,
                      value=RS.delivery_rate,
                      time=BBR.cycle_count,
                      window_length=MaxBwFilterLen)
]]></artwork>
        </section>
        <section anchor="tracking-time-for-the-bbrmaxbw-max-filter">
          <name>Tracking Time for the BBR.max_bw Max Filter</name>
          <t>BBR tracks time for the BBR.max_bw filter window using a virtual
(non-wall-clock) time tracked by counting the cyclical progression through
ProbeBW cycles.  Each time through the Probe bw cycle, one round trip after
exiting ProbeBW_UP (the point at which the flow has its best chance to measure
the highest throughput of the cycle), BBR increments BBR.cycle_count, the
virtual time used by the BBR.max_bw filter window. Note that BBR.cycle_count
only needs to be tracked with a single bit, since the BBR.max_bw filter only
needs to track samples from two time slots: the previous ProbeBW cycle and the
current ProbeBW cycle:</t>
          <artwork><![CDATA[
  BBRAdvanceMaxBwFilter():
    BBR.cycle_count++
]]></artwork>
        </section>
        <section anchor="bbrminrtt-estimated-minimum-round-trip-time">
          <name>BBR.min_rtt: Estimated Minimum Round-Trip Time</name>
          <t>BBR.min_rtt is BBR's estimate of the round-trip propagation delay of the path
over which a transport connection is sending. The path's round-trip propagation
delay determines the minimum amount of time over which the connection must be
willing to sustain transmissions at the BBR.bw rate, and thus the minimum
amount of data needed in flight, for the connection to reach full utilization
(a "Full Pipe"). The round-trip propagation delay can vary over the life of a
connection, so BBR continually estimates BBR.min_rtt using recent round-trip
delay samples.</t>
          <section anchor="round-trip-time-samples-for-estimating-bbrminrtt">
            <name>Round-Trip Time Samples for Estimating BBR.min_rtt</name>
            <t>For every data packet a connection sends, BBR calculates an RTT sample that
measures the time interval from sending a data packet until that packet is
acknowledged.</t>
            <t>The only divergence from RTT estimation for retransmission timeouts is in the
case where a given acknowledgment ACKs more than one data packet. In order to
be conservative and schedule long timeouts to avoid spurious retransmissions,
the maximum among such potential RTT samples is typically used for computing
retransmission timeouts; i.e., SRTT is typically calculated using the data
packet with the earliest transmission time. By contrast, in order for BBR to
try to reach the minimum amount of data in flight to fill the pipe, BBR uses
the minimum among such potential RTT samples; i.e., BBR calculates the RTT
using the data packet with the latest transmission time.</t>
          </section>
          <section anchor="bbrminrtt-min-filter">
            <name>BBR.min_rtt Min Filter</name>
            <t>RTT samples tend to be above the round-trip propagation delay of the path,
due to "noise" introduced by random variation in physical transmission processes
(e.g. radio link layer noise), queues along the network path, the receiver's
delayed ack strategy, ack aggregation, etc. Thus to filter out these effects
BBR uses a min filter: BBR estimates BBR.min_rtt using the minimum recent
RTT sample seen by the connection over that past BBR.MinRTTFilterLen seconds.
(Many of the same network effects that can decrease delivery rate measurements
can increase RTT samples, which is why BBR's min-filtering approach for RTTs
is the complement of its max-filtering approach for delivery rates.)</t>
            <t>The length of the BBR.min_rtt min filter window is BBR.MinRTTFilterLen = 10 secs.
This is driven by trade-offs among several considerations:</t>
            <ul spacing="normal">
              <li>
                <t>The BBR.MinRTTFilterLen is longer than BBR.ProbeRTTInterval, so that it covers an
entire ProbeRTT cycle (see the "ProbeRTT" section below). This helps ensure
that the window can contain RTT samples that are the result of data
transmitted with C.inflight below the estimated BDP of the flow. Such RTT
samples are important for helping to reveal the path's underlying two-way
propagation delay even when the aforementioned "noise" effects can often
obscure it.</t>
              </li>
              <li>
                <t>The BBR.MinRTTFilterLen aims to be long enough to avoid needing to reduce in-flight
data and throughput often. Measuring two-way propagation delay requires in-flight
data to be at or below the BDP, which risks  some amount of underutilization, so BBR
uses a filter window long enough that such underutilization events can be
rare.</t>
              </li>
              <li>
                <t>The BBR.MinRTTFilterLen aims to be long enough that many applications have a
"natural" moment of silence or low utilization that can reduce in-flight data below
the BDP and naturally serve to refresh the BBR.min_rtt, without requiring BBR to
force an artificial reduction in in-flight data. This applies to many popular
applications, including Web, RPC, or chunked audio/video traffic.</t>
              </li>
              <li>
                <t>The BBR.MinRTTFilterLen aims to be short enough to respond in a timely manner to
real increases in the two-way propagation delay of the path, e.g. due to
route changes, which are expected to typically happen on longer time scales.</t>
              </li>
            </ul>
            <t>A BBR implementation MAY use a generic windowed min filter to track BBR.min_rtt.
However, a significant savings in space and improvement in freshness can
be achieved by integrating the BBR.min_rtt estimation into the ProbeRTT state
machine, so this document discusses that approach in the ProbeRTT section.</t>
          </section>
        </section>
        <section anchor="bbroffloadbudget">
          <name>BBR.offload_budget</name>
          <t>BBR.offload_budget is the estimate of the minimum volume of data necessary
to achieve full throughput using sender (TSO/GSO) and receiver (LRO, GRO)
host offload mechanisms.  This varies based on the transport protocol and
operating environment.</t>
          <t>For TCP, offload_budget can be computed as follows:</t>
          <artwork><![CDATA[
    BBRUpdateOffloadBudget():
      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="bbrextraacked">
          <name>BBR.extra_acked</name>
          <t>BBR.extra_acked is a volume of data that is the estimate of the recent degree
of aggregation in the network path. For each ACK, the algorithm computes
a sample of the estimated extra ACKed data beyond the amount of data that
the sender expected to be ACKed over the timescale of a round-trip, given
the BBR.bw. Then it computes BBR.extra_acked as the windowed maximum sample
over the last BBRExtraAckedFilterLen=10 packet-timed round-trips. If the
ACK rate falls below the expected bandwidth, then the algorithm estimates
an aggregation episode has terminated, and resets the sampling interval to
start from the current time.</t>
          <t>The BBR.extra_acked thus reflects the recently-measured magnitude of data
and ACK aggregation effects such as batching and slotting at shared-medium
L2 hops (wifi, cellular, DOCSIS), as well as end-host offload mechanisms
(TSO, GSO, LRO, GRO), and end host or middlebox ACK decimation/thinning.</t>
          <t>BBR augments 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[
  BBRUpdateACKAggregation():
    /* Find excess ACKed beyond expected amount over this interval */
    interval = (Now() - BBR.extra_acked_interval_start)
    expected_delivered = BBR.bw * interval
    /* Reset interval if ACK rate is below expected rate: */
    if (BBR.extra_acked_delivered <= expected_delivered)
        BBR.extra_acked_delivered = 0
        BBR.extra_acked_interval_start = Now()
        expected_delivered = 0
    BBR.extra_acked_delivered += RS.newly_acked
    extra = BBR.extra_acked_delivered - expected_delivered
    extra = min(extra, C.cwnd)
    if (BBR.full_bw_reached)
      filter_len = BBRExtraAckedFilterLen
    else
      filter_len = 1  /* in Startup, just remember 1 round */
    BBR.extra_acked =
      UpdateWindowedMaxFilter(
        filter=BBR.ExtraACKedFilter,
        value=extra,
        time=BBR.round_count,
        window_length=filter_len)
]]></artwork>
        </section>
        <section anchor="updating-the-model-upon-packet-loss">
          <name>Updating the Model Upon Packet Loss</name>
          <t>In every state, BBR responds to (filtered) congestion signals, including
loss. The response to those congestion signals depends on the flow's current
state, since the information that the flow can infer depends on what the
flow was doing when the flow experienced the signal.</t>
          <section anchor="probing-for-bandwidth-in-startup">
            <name>Probing for Bandwidth In Startup</name>
            <t>In Startup, if the congestion signals meet the Startup exit criteria, the flow
exits Startup and enters Drain (see <xref target="exiting-startup-based-on-packet-loss"/>).</t>
          </section>
          <section anchor="probing-for-bandwidth-in-probebw">
            <name>Probing for Bandwidth In ProbeBW</name>
            <t>BBR searches for the maximum volume of data that can be sensibly placed
in flight in the network. A key precondition is that the flow is actually
trying robustly to find that operating point. To implement this, when a flow is
in ProbeBW, and an ACK covers data sent in one of the accelerating phases
(REFILL or UP), and the ACK indicates that the loss rate over the past round
trip exceeds the queue pressure objective, and the flow is not application
limited, and has not yet responded to congestion signals from the most recent
REFILL or UP phase, then the flow estimates that the volume of data it allowed
in flight exceeded what matches the current delivery process on the path, and
reduces BBR.inflight_longterm:</t>
            <artwork><![CDATA[
  /* Do loss signals suggest C.inflight is too high? */
  IsInflightTooHigh():
    return (RS.lost > RS.tx_in_flight * BBR.LossThresh)

  BBRHandleInflightTooHigh():
    BBR.bw_probe_samples = 0;  /* only react once per bw probe */
    if (!RS.is_app_limited)
      BBR.inflight_longterm = max(RS.tx_in_flight,
                            BBRTargetInflight() * BBR.Beta))
    If (BBR.state == ProbeBW_UP)
      BBRStartProbeBW_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 TSO/GSO offload burst (represented as a "packet" in
the pseudocode in this document). To estimate this threshold volume of data,
we can solve for "lost_prefix" in the following way, where inflight_prev
represents 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[
  BBRNoteLoss()
    if (!BBR.loss_in_round)   /* first loss in this round trip? */
      BBR.loss_round_delivered = C.delivered
    BBR.loss_in_round = 1

  BBRHandleLostPacket(packet):
    BBRNoteLoss()
    if (!BBR.bw_probe_samples)
      return /* not a packet sent while probing bandwidth */
    RS.tx_in_flight = 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 = BBRInflightLongtermFromLostPacket(rs, packet)
      BBRHandleInflightTooHigh()

  /* At what prefix of packet did losses exceed BBR.LossThresh? */
  BBRInflightLongtermFromLostPacket(rs, packet):
    size = packet.size
    /* What was in flight before this packet? */
    inflight_prev = RS.tx_in_flight - size
    /* What was lost before this packet? */
    lost_prev = RS.lost - size
    lost_prefix = (BBR.LossThresh * inflight_prev - lost_prev) /
                  (1 - BB.RLossThresh)
    /* 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: */
  BBRUpdateLatestDeliverySignals():
    BBR.loss_round_start = 0
    BBR.bw_latest       = max(BBR.bw_latest,       RS.delivery_rate)
    BBR.inflight_latest = max(BBR.inflight_latest, RS.delivered)
    if (RS.prior_delivered >= BBR.loss_round_delivered)
      BBR.loss_round_delivered = C.delivered
      BBR.loss_round_start = 1

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

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

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

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

  /* Handle the first congestion episode in this cycle */
  BBRInitLowerBounds():
    if (BBR.bw_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 */
  BBRLossLowerBounds()
    BBR.bw_shortterm       = max(BBR.bw_latest,
                          BBR.Beta * BBR.bw_shortterm)
    BBR.inflight_shortterm = max(BBR.inflight_latest,
                          BBR.Beta * BBR.inflight_shortterm)

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

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

]]></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
BBRBoundBWForModel(), and C.cwnd in BBRBoundCwndForModel():</t>
          <artwork><![CDATA[
---------------+--------+--------+------+--------------+-----------------
State          | Tactic | Pacing | Cwnd | Rate         | Volume
               |        | Gain   | Gain | Cap          | Cap
---------------+--------+--------+------+--------------+-----------------
Startup        | accel  | 2.77   | 2    | N/A          | N/A
               |        |        |      |              |
---------------+--------+--------+------+--------------+-----------------
Drain          | decel  | 0.5    | 2    | bw_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 (BBR.next_departure_time) as a function
of the most recent packet size and the current pacing rate, as follows:</t>
          <artwork><![CDATA[
  BBR.next_departure_time = max(Now(), BBR.next_departure_time)
  P.departure_time = BBR.next_departure_time
  pacing_delay = packet.size / C.pacing_rate
  BBR.next_departure_time = BBR.next_departure_time + pacing_delay
]]></artwork>
          <t>To adapt to the bottleneck, in general BBR sets the pacing rate to be
proportional to bw, with a dynamic gain, or scaling factor of proportionality,
called pacing_gain.</t>
          <t>When a BBR flow starts it has no bw estimate (bw is 0). So in this case it
sets an initial pacing rate based on the transport sender implementation's
initial congestion window ("C.InitialCwnd", e.g. from <xref target="RFC6928"/>), the
initial SRTT (smoothed round-trip time) after the first non-zero RTT
sample, and the initial pacing_gain:</t>
          <artwork><![CDATA[
  BBRInitPacingRate():
    nominal_bandwidth = C.InitialCwnd / (SRTT ? 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 BBRSetPacingRate() step as follows:</t>
          <artwork><![CDATA[
  BBRSetPacingRateWithGain(pacing_gain):
    rate = pacing_gain * bw * (100 - BBR.PacingMarginPercent) / 100
    if (BBR.full_bw_reached || rate > C.pacing_rate)
      C.pacing_rate = rate

  BBRSetPacingRate():
    BBRSetPacingRateWithGain(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 BBRSetSendQuantum() to update C.send_quantum  as
follows:</t>
          <artwork><![CDATA[
  BBRSetSendQuantum():
    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="RFC6298"/> for TCP).</t>
          </section>
          <section anchor="computing-bbrmaxinflight">
            <name>Computing BBR.max_inflight</name>
            <t>The BBR BBR.max_inflight is the upper bound on the volume of data BBR allows in
flight. This bound is always in place, and dominates when all other
considerations have been satisfied: the flow is not in loss recovery, does not
need to probe BBR.min_rtt, and has accumulated confidence in its model
parameters by receiving enough ACKs to gradually grow the current C.cwnd to meet
the BBR.max_inflight.</t>
            <t>On each ACK, BBR calculates the BBR.max_inflight in BBRUpdateMaxInflight()
as follows:</t>
            <artwork><![CDATA[
  BBRBDPMultiple(gain):
    if (BBR.min_rtt == Infinity)
      return C.InitialCwnd /* no valid RTT samples yet */
    BBR.bdp = BBR.bw * BBR.min_rtt
    return gain * BBR.bdp

  BBRQuantizationBudget(inflight_cap)
    BBRUpdateOffloadBudget()
    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

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

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

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

  BBRBoundCwndForProbeRTT():
    if (BBR.state == ProbeRTT)
      C.cwnd = min(C.cwnd, BBRProbeRTTCwnd())
]]></artwork>
          </section>
          <section anchor="cwnd-adjustment-mechanism">
            <name>cwnd Adjustment Mechanism</name>
            <t>The network path and traffic traveling over it can make sudden dramatic
changes.  To adapt to these changes smoothly and robustly, and reduce packet
losses in such cases, BBR uses a conservative strategy. When 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 BBRSetCwnd() steps to update C.cwnd:</t>
            <artwork><![CDATA[
  BBRSetCwnd():
    BBRUpdateMaxInflight()
    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)
    BBRBoundCwndForProbeRTT()
    BBRBoundCwndForModel()
]]></artwork>
            <t>There are several considerations embodied in the logic above. If BBR has
measured enough samples to achieve confidence that it has filled the pipe
(see the description of BBR.full_bw_reached in the "Startup" section below), then
it increases C.cwnd based on the number of packets 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[
  BBRBoundCwndForModel():
    cap = Infinity
    if (IsInAProbeBWState() and
        BBR.state != ProbeBW_CRUISE)
      cap = BBR.inflight_longterm
    else if (BBR.state == ProbeRTT or
             BBR.state == ProbeBW_CRUISE)
      cap = BBRInflightWithHeadroom()

    /* 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="RFC6298">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC5681">
          <front>
            <title>TCP Congestion Control</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines TCP's four intertwined congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. In addition, the document specifies how TCP should begin transmission after a relatively long idle period, as well as discussing various acknowledgment generation methods. This document obsoletes RFC 2581. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5681"/>
          <seriesInfo name="DOI" value="10.17487/RFC5681"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="RFC9438">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>CUBIC is a standard TCP congestion control algorithm that uses a cubic function instead of a linear congestion window increase function to improve scalability and stability over fast and long-distance networks. CUBIC has been adopted as the default TCP congestion control algorithm by the Linux, Windows, and Apple stacks.</t>
              <t>This document updates the specification of CUBIC to include algorithmic improvements based on these implementations and recent academic work. Based on the extensive deployment experience with CUBIC, this document also moves the specification to the Standards Track and obsoletes RFC 8312. This document also updates RFC 5681, to allow for CUBIC's occasionally more aggressive sending behavior.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
        <reference anchor="RFC8985">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC4340">
          <front>
            <title>Datagram Congestion Control Protocol (DCCP)</title>
            <author fullname="E. Kohler" initials="E." surname="Kohler"/>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <date month="March" year="2006"/>
            <abstract>
              <t>The Datagram Congestion Control Protocol (DCCP) is a transport protocol that provides bidirectional unicast connections of congestion-controlled unreliable datagrams. DCCP is suitable for applications that transfer fairly large amounts of data and that can benefit from control over the tradeoff between timeliness and reliability. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4340"/>
          <seriesInfo name="DOI" value="10.17487/RFC4340"/>
        </reference>
        <reference anchor="RFC6928">
          <front>
            <title>Increasing TCP's Initial Window</title>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document proposes an experiment to increase the permitted TCP initial window (IW) from between 2 and 4 segments, as specified in RFC 3390, to 10 segments with a fallback to the existing recommendation when performance issues are detected. It discusses the motivation behind the increase, the advantages and disadvantages of the higher initial window, and presents results from several large-scale experiments showing that the higher initial window improves the overall performance of many web services without resulting in a congestion collapse. The document closes with a discussion of usage and deployment for further experimental purposes recommended by the IETF TCP Maintenance and Minor Extensions (TCPM) working group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6928"/>
          <seriesInfo name="DOI" value="10.17487/RFC6928"/>
        </reference>
        <reference anchor="RFC6675">
          <front>
            <title>A Conservative Loss Recovery Algorithm Based on Selective Acknowledgment (SACK) for TCP</title>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="L. Wang" initials="L." surname="Wang"/>
            <author fullname="I. Jarvinen" initials="I." surname="Jarvinen"/>
            <author fullname="M. Kojo" initials="M." surname="Kojo"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="August" year="2012"/>
            <abstract>
              <t>This document presents a conservative loss recovery algorithm for TCP that is based on the use of the selective acknowledgment (SACK) TCP option. The algorithm presented in this document conforms to the spirit of the current congestion control specification (RFC 5681), but allows TCP senders to recover more effectively when multiple segments are lost from a single flight of data. This document obsoletes RFC 3517 and describes changes from it. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6675"/>
          <seriesInfo name="DOI" value="10.17487/RFC6675"/>
        </reference>
        <reference anchor="RFC6937">
          <front>
            <title>Proportional Rate Reduction for TCP</title>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <date month="May" year="2013"/>
            <abstract>
              <t>This document describes an experimental Proportional Rate Reduction (PRR) algorithm as an alternative to the widely deployed Fast Recovery and Rate-Halving algorithms. These algorithms determine the amount of data sent by TCP during loss recovery. PRR minimizes excess window adjustments, and the actual window size at the end of recovery will be as close as possible to the ssthresh, as determined by the congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6937"/>
          <seriesInfo name="DOI" value="10.17487/RFC6937"/>
        </reference>
        <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="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>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S9aXPb2Jko/P38CkRdXSa7SWqz3bY6Tq4su91Oe9FYcnry
VmpUIAlKiEmAAUDJiuP57fdZz3kOAMrumdw7t+rtqpnIBHDWZ1/H47G7PkoO
3bycFekqO0rmVbpoxnnWLMaz2c3leDqtxnuHbpY2R0n2ce3qzXSV13VeFs3t
Gt5/+fz8J7fOj1ySNOXsKLnXVJvsHvyrvl1V2aK2v5RVE/3U5M0Shnj69F1y
UhaXWd3AsPhnU5VLl8LU2TU9dmmVpTLXzeVRcnLy6wv34eao77N52sCYB3sH
98f7e+P9hy7dNFdldeTGCTyGR9k8b8oK1sMbfpOly+QkreY32XIJv5YVTPCi
LC+XGfwrW6X58igpZvLC/7qkJ5NZudo24Mu0SM5usqbZNlieFjU+/4qx/lTW
2foqeZrVV+mtjvc6a9Iw2t+m9PB/reBXGqooq1Xa5NcZ3sm7n04eHzw+lD8P
9vYfyZ8/HB74X/f3H8ufj/YPHsqfDw8e67sPHj7a188e3z/Qce8f6guPHj96
oL/u7e3Jn/cP7+ufDx8f6LsPH/7wwP96+EP4TMc93H+o7z4+PNQRHj3YhzXk
xcLu7uTkxc9/2qcVA/il1WUGUHrVNOuj3d2/b7JNNklnqwkc2u4cTidfTmaL
1R/z+ZPDvYOD/Uf3+TMGwnsAZhaexk/TOpv3ANg9+kqBCv8eb4Gk8OQvm9nV
prhMTq6y4lKe5AUgwskkebEpCvpJ7xx+O2vg1rMiPNOBzsqrLF8m/0x+Tus6
rZO/ZJdpkV1F7/wZ4O9P6ayc1iV/rBix/xAwgn6psyrPajzMI5n6+OR18m94
YkfJ21lDL/vz/aF7vjUc8AzPVs93lV6m/8iLrN6FT3/YPdg92D+4f/CIyMcs
HOoUD9X+MOND3V3PF/9/u40fxnsHW27jpFytNkUORBe2WiflImmuMryjo+Sn
bEofw5uvXzPe+lN7lq2rDD+CzZ3DB+cnp8nrdFaV9axc57PkdTnPllsP7PUE
Xm6u8jr69U/469U8vc7j1T/eDkuw+vWmyap4G8m77DrPbkbJdbmcJPcfj5Ki
nCQPRsl6PUkeHo4B6ZN7eJ1w9WcAa81mfXJTzF+keXHUBo1EXkhm8EaS0DtJ
Cvuv8mua7F4vxF7mzdVmikRyl0nvLoDn7nRZTgF+a1jx7rNytlllRUOD7NY8
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
gq+aC1lQORQvjU/oazmw01yKkf6ahuK5u9SqA6sEsZbTEZpoSlzOkU0wZUZy
QdTtQk81eaLHQENhCeUL0V0He6Nkf/gjTreH17qvg4X5EYVkDUaduGMN0WX6
uQ+S73V+7LtuVoAhlJh+SYuYTPZJBIbx3Bdv/0guE5R24aCU1HlO6TE+tZOB
wL/gdX7+BY0HQwsU24/xD09kFAGZn9Ejr5E+aGW+wWxQjuTluf/IUPJ2UyWt
lNtNsRSd03dK3ahyPfGg0b8TXmevecNWUdNUwlAanlsJ1iHuKLQPHHNHwfqz
djHQr0PuP2d4ZrbklFZMIou2CZ6NS593s61btOErUqP1vQjLkRj50nFMFykx
6RLVlLIKy2K3Ogqf0Vp6BvML+lIdcKl2vllfzKjMksZ3cxWgxldX7Pc9BnRp
YX84D8yxiSuxE9CxHmgw0WAeiBQXnKgDnxyf/HJ2cfru7dPnF2fnb09PX755
ER0i1Sk3E2rCuz0P13NOTPn7UuXjN/q+VbIcn/K2auqBksApe/zd631M9ens
w3AWchQ89289Bf6qby/vT+0ZdKbTkz9+d/6FOXsrw99RpmnrWt+f+iHRKqJk
45UA3dkSMNiji0XQlt789I7C2oJdpoOD61QBS0IVMMqyuU61pGiUnK4VESPp
w2NxXDQx4LQMceRp5NalBrnjd+ZA23UoTfEuitf1jecjldULqOTWCSh3jKZ7
POA2+NK0L+uXxbGsTIqtt6btzBqn79N0R8IME8kfptZzoKzwbxZdj2RwkbU6
kphObqeXrnaSjDTvdlP1lb9ao1LrocwOuo1SxAvlX/9PLTWaipFXp4IRjn2c
M8tmoNxIsrzQ1fennf3aMnDRXgP90R51oBpuPQwkF/Hq3p9uOQQN/Nl+sh3G
BxgGCgs6wBlTGlNU42swrwdSGeKExHhyYyWQga+wEYVMSfcz/a/zkqgOX3pN
rAFfeu396VDEsfO7VBb4neftKioKyIFemHCiP9gqIb+CHKRh/B1UJmVCub8Y
53wKsyn5t70GyVNTM93WIzHaC200HiESLAUF7jiN92QUxzPpnoQCXnQSNTVr
0ZqHtq601CrsSQTxUNsuV+hLFYZ4qrslpK9ihhme/B0FAtsHeJOZOLfs3nWm
iVToWKM081DxsK0q0nFJ0E2QYBUjDFsOlZBbIBy9cze0974qEN+rTGt3nHhZ
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
zDmnWPBp0cJWZHIwBrNx7hsOqSskHgvnSyYqZaT7lBX2QFxWysUluDgXY6DR
9yjUGrl/KipJZo9tgoKmpFASonYlKiMGFrUU70ghg04oaFVnrIoPih/L6hIj
o6vWiAmZ0QKFfFuGrBaBmK2npuXT5IBE8gYvSkYuHuo14I6VoIcYS0Uilc8Q
SIlJtS7W0zdSMghrd4Z6tZhvJngIvSvTkv0cU8hvs0A44U8ixRLwvS8NPNPd
1lyPoZ03DRel3Hu7qDH/Bu0wYjhln5nxH0GjvuaQjAnObtsGur8rFEUw9wfu
g5p4WZkUViwCosumbA2axjOTIZ6Sn9QJDuQ4zRLOJzCmCDbQfOIUJhpTWsfj
EQEGa/TnB0G8bxoNNbulv5F3hkWyTeaCniTyeZZzV6gMuIHxvEOop2q4dvK1
YTa4s/MRXiR/gFtITaf0T3/4/caN4n1bvc2LDu9NRZANDIdh43MJYIothzJ0
WwdBn9HuZ9dUYkvta9jvk1vW9TSr3Kcs06f1wt9QdvcN6+SG7otE8K2kNe1Z
ByiqWtpMzvhGAOrI+fEx+5cXKMYuVhJRIEfggLK5CCEKWvripcMnBl8PBb3j
HNSRl9KEjNEHNiSlANFXdkV8xPTwGnaywHAJIkkPEmWc2YD6YNDdgvtSi/zm
YaIAJfbb7pj7J/C4IysvNPS1nKm92UfihmYQCFy8qOX571xVE5B4bHE8+LCr
IMEF9uPT+q3L0CzXgm9pwLP2ptkNof9/KB74VvuuQ6u8fz3r/gagIfwWT7ok
Lc+BfZ+BSjtqN0OOP49o47wrBsZ+cjVnbOmtz2HZqiFJ3zAg9LNy+ebU2GWP
F4un7O3IhrV/7vKztQMZ8R1JXCAIIk21/o7Gj8GFBBo4St1J/U2xNvBpeb9T
3ra6I9Dqw5Wy4wmrttWweVUmgI/ehsPetOX2QSDXhlZYuEDffMUnk7KSY4Oz
EoWeA6UvX9HGfiRrof/qjm94hyKLIcid/XbVXaIfvj7tqTMOr8qPHrRWuW0f
ti177uvpyHn+bHXtnrpz4r5b7nvFH4sj2M99ycGdm0rJrpy76hVRcmWPssDZ
T/e10U4VfoGdimpNuZYbZvVJm0C6leGjcvyzBLRVzIOfU5IrXxHaTl34gIXw
MSGtjc6M7uwb5CfFLgTco+VSMgFh+Ubt6xh/Me33moGD0byLzFpKuoiyNYca
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
I06xh4ZaTu0oKXPU5IWu3YrSoexHfmw+l0fFq+RKKENq/HMJdzE8YN7Ibchp
XAci+3ZPA4w5W75pRT11aXU76XJ3MXis1ze82ZAxKnKhJeY2G8MelaBI4vlq
JWmLXfIx0qNzXIi1N00f62qRxL5tUHmSWgrbLUteLN+DCoOtICLKgcd0QDMx
2KZcTtrQx04ubVVcyQWVQsaphpp8py3xlQat1Dm+khoRKE/ZmjfXqLGSMdA1
mdtreLWa2zXhxBqaZ0kV584IPSEiQoZc5Bhrr2Yb/9azZDIrY5mnoALa8AnZ
+iY9J2FZ71d6MFNERAV3KQhJ53VmnTaxHLEzqp7fNG+qNkQEPdJOJLD+1aZV
ugFfk5SjxovEYNMDjmUmK7XXSFU///whrgx98iEPavVKVBioXagz0pAy+8eD
+FAmTIk2OvRD8o88Ow/z1m56Gu8eKpl5psiAtOlZllxes3by0DXlaTVPHNnm
jiFSMzWVbFo95oqhbBaYcWXzMhI8IIFCNpSdilkqUaiXgnIZROv9nhBnLwkr
QHkavU8HB4VZIsS5w+cBxfaEXK0rHqPVWNLYc0Y5g68j+wo9N/AgW7Q4kj09
JJAwzn1K6S4ZKqSJsCIC51pSrV+giQhlk3HleALoFtDcXmm2QoPc7emeEsOm
JPd2q4AOJhk37pYmMto24qPi+2blTnJXYiBnrxd8ddyF2F7SIV9gFuyI8OvW
hOUEK4cK6QbIM4P8tFm1R+KfEzRFqu6KdB70WEx+Tc6KPq4bx4cc+3n/fse2
yY7txLgJ1wvaLeiYGaKTkncLC0r1HEOcnI2Tn3YOStotaukUv/lGU6cjI1/k
bBEeRxo2eKtTyJXIjmzIEHW4vwYmXMkNktIZ50Bg/1isOzPUSDafgMgrQd5p
zoLUiCrWCMYnSOaIJJG1VB0y34Xw2hgCbmAHi2tFgvXwOY/DblnsIGli8YKy
5vLAbB1zlGJvyL3vjZPkfQu/zDgpU59YJ2PVMgGRVIUg2fmaUyEdOy0rVBnP
tPx3n2RLT4VDOrAre2loqze59L0/MQHdEZTQQNYRquBIL+gsUQmJpzENd6Yt
H2Fovi6i/ufDSL5B6K9zUInBj04mipXn8F0qkrhFoous6xgu1DHMQEQ+RzBq
h+3b6q3KnPUgALWOtQDvA9dk0jBVZQsXnDsC+0kZnyjnsIYJsLVVm2AJwNrF
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

-->

</rfc>
