<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-bbr-00" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="BBR">BBR Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-00"/>
    <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>IRTF</area>
    <workgroup>CCWG</workgroup>
    <keyword>Congestion Control</keyword>
    <abstract>
      <?line 188?>

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

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

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

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

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

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

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

  BBRStartProbeBW_CRUISE():
    BBR.state = ProbeBW_CRUISE

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

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

    switch (state)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    rs.delivered = C.delivered - rs.prior_delivered

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-romo-iccrg-ccid5-00"/>
        </reference>
        <reference anchor="A15" target="https://www.ietf.org/mail-archive/web/aqm/current/msg01480.html">
          <front>
            <title>TCP ACK suppression</title>
            <author initials="M." surname="Abrahamsson" fullname="Mikael Abrahamsson">
              <organization/>
            </author>
            <date year="2015" month="November"/>
          </front>
          <refcontent>IETF AQM mailing list</refcontent>
        </reference>
        <reference anchor="Jac88" target="http://ee.lbl.gov/papers/congavoid.pdf">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="SIGCOMM 1988, Computer Communication Review, vol. 18, no. 4, pp. 314-329" value=""/>
        </reference>
        <reference anchor="Jac90" target="ftp://ftp.isi.edu/end2end/end2end-interest-1990.mail">
          <front>
            <title>Modified TCP Congestion Avoidance Algorithm</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1990" month="April"/>
          </front>
          <seriesInfo name="end2end-interest mailing list" value=""/>
        </reference>
        <reference anchor="BP95">
          <front>
            <title>TCP Vegas: end-to-end congestion avoidance on a global Internet</title>
            <author initials="L." surname="Brakmo" fullname="Lawrence S. Brakmo">
              <organization/>
            </author>
            <author initials="L." surname="Peterson" fullname="Larry L. Peterson">
              <organization/>
            </author>
            <date year="1995" month="October"/>
          </front>
          <seriesInfo name="IEEE Journal on Selected Areas in Communications 13(8): 1465-1480" value=""/>
        </reference>
        <reference anchor="B15" target="https://docs.google.com/document/d/1o-53jbO_xH-m9g2YCgjaf5bK8vePjWP6Mk0rYiRLK-U/edit">
          <front>
            <title>TCP-NV: An Update to TCP-Vegas</title>
            <author initials="L." surname="Brakmo" fullname="Lawrence S. Brakmo">
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="" value=""/>
        </reference>
        <reference anchor="WS95">
          <front>
            <title>TCP/IP Illustrated, Volume 2: The Implementation</title>
            <author initials="G." surname="Wright" fullname="Gary R. Wright">
              <organization/>
            </author>
            <author initials="W." surname="Stevens" fullname="W. Richard Stevens">
              <organization/>
            </author>
            <date year="1995"/>
          </front>
          <seriesInfo name="Addison-Wesley" value=""/>
        </reference>
        <reference anchor="HRX08">
          <front>
            <title>CUBIC: A New TCP-Friendly High-Speed TCP Variant</title>
            <author initials="S." surname="Ha">
              <organization/>
            </author>
            <author initials="I." surname="Rhee">
              <organization/>
            </author>
            <author initials="L." surname="Xu">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="ACM SIGOPS Operating System Review" value=""/>
        </reference>
        <reference anchor="GK81" target="http://www.lk.cs.ucla.edu/data/files/Gail/power.pdf">
          <front>
            <title>An Invariant Property of Computer Network Power</title>
            <author initials="R." surname="Gail">
              <organization/>
            </author>
            <author initials="L." surname="Kleinrock">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="Proceedings of the International Conference on Communications" value="June, 1981"/>
        </reference>
        <reference anchor="K79">
          <front>
            <title>Power and deterministic rules of thumb for probabilistic problems in computer communications</title>
            <author initials="L." surname="Kleinrock">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="Proceedings of the International Conference on Communications" value="1979"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S9a3Pb6JUu+h2/AiNXl8lukrr40rYSZ7Ys98XTdlux5PSk
KjUqkIQkxCTBAKBkxfH89rOedXkvACjbmewzp+qk9uyWCeC9v+u+njUej5Pr
w/RBMi9nq2yZH6bzKrtoxkXeXIxns5vL8XRajRdZk9dNMsuawzT/sE7qzXRZ
1HVRrprbNX3z8oezH5N1cZikaVPODtP7TbXJ79O/6ttllV/U4S9l1UQ/NUWz
oCaeP3+bHperS+qHmsWfTVUukoy6z6/5cZJVeUZ9vaW+bi4P0+Pj335K3t8c
9n02pwEfpgd7Bw/H+3vj/cdJtmmuyuowGaf0mB7l86IpKxqPTPrXPFukx1k1
v8kXC/q1rKiDn8rycpHTv/JlViwO09VMX/g/l/xkMiuX2xp8ma3S05u8abY1
VmSrGs+/oK3/KOt8fZU+z+ur7Nbae503mW/tr1N++H+W9Cs3tSqrZdYU1zn2
5O2Px08Pnj7QPw/29p/on98/OHC/7u8/1T8fHRw81j8fHzy1dx89frJvnz19
eGDtPnxgLzx5+uSR/bq3t6d/Pnzw0P58/PTA3n38+PtH7tcH3x8mxeoiHPHx
8U8//8c+j4KOVFZd5nTyrppmfbi7+7dNvskn2Ww5oYXYndOMi8VkdrH892L+
7MHewcH+k4fymRys+3R0wjMyfp7V+bzn0Nznr+yg4O/xltPhn/x5M7varC7T
46t8dalPihUd7uNJ+tNmteKfbB/pt9OGdjJf+WfW0Gl5lReL9B/pz1ldZ3X6
5/wyW+VX0Tt/ojP1H9msnNalfGynfP8xnXL+pc6rIq+xmIfa9dHx6/SPWLHD
9M2s4Zfd+n7fXd+aFniGtbX1XWaX2d+LVV7v0qff7x7sHuwfPDx4wmRh5hd1
ikUNf5jJou6u5xf/f9uN78d7B1t247hcLjergggpTbVOy4u0ucqxR4fpj/mU
P6Y3X7+Wu+hW7UW+rnJ8RJM7ow/Ojk/S19msKutZuS5m6etyni+2LtjrCb3c
XBV19Ot/4NereXZdxKN/uv0s0ejXmyav4mmkb/PrIr8ZpdflYpI+fDpKV+Uk
fTRK1+tJ+vjB+PET2nZsJ239KZ21ZrM+vlnNf8qK1WH7aKT6QjqjN9KU30kz
mn9VXHNn93tP7GXRXG2mIHy7Qk536XjuThfllM5vTSPefVHONst81XAju7X0
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
gDud7GWxWBQ9beBoS6h2bhCueYD+CZTWl40P/7aaiDgedqoxDrsIkuFQT9Lf
JMvHKE3raNQJlxLfNOPyYkzUAhq3i1odyaYf7O0/QTk3HJagayKuLFxniTN8
QpDDmi1E5V0ucy4LwuR9Ntu09JpEnTlVzh2bpUwqi+UMMH+r9S58zQQVPfFy
fHU/3svdo3F0U1Ext8X/lE6GFNL7mb+Ew23lXKMgwvsLiGvST1zTryOup1Ad
khZPrMWEa7k9zm86a0SCipgRdbQbM6RIVQxDytlxr2sGz2FazprcsL+5QLbn
LhItmLgDOsD5oQ1uht4pGkRXA9Z/IzHloSaQhWm9LaHp2uwe0RJbfm2sBftx
vT76M0gtCxVCZlFgWjLkha/opIgi6sJNvEFTigEG3+jLZlGzs+5KwSmBIv1Z
Ki6Q1HsroRQXFom+3lRrIi11aEPuihmj1GykSWcQtsEBIbH6bvdYPddrQq/Z
tdC0cRej35XvrO5hZDdQScl2le2DTcQQRiomYTtd4U38hHFwD2yaU9lEswIZ
NSnh/b66XSMySCAidty+7UhxGd1wkQhFoLajnJL6QUoCR+EkrU0XJmhM6M8p
qVlaYY/PjhlU9fl/8nO7W4xHyaoPBy4gR7DKQc2uOeVJFK3uQCFlM1Ns8nV6
sVmJPqNlvAz6UtxMeM01GxbNxWCilvlMa5YEPkwyVJ6XtRJUFulvs7bPeTDK
tHcyrnSE5JVwfwrBnYj2wjYt7D2eCRdiN1gA53/ceb/K8x21YssXA5rnkF3d
+bwljjdWpUs+SzufJZ6npyd0pK36A1+3udNXTKVU2r7DU9iRop1MVuZSLIuP
eFEaFU56zGXLrHrfso8ZpSnqmNJ4OsZ5EoFPSU3s3aYC05PtRfqMOxbHeLrL
v+t5NHjGMOemZ8i0UCHD8cMLSKyyuyTOnhK5aefEm312Rv02xMwXUNd5JX59
LBYlDHuwTQv8JcZyryKAa2o2CZoNll1pjQDHKwExw05okaD7M6B57QTWK9SH
FdwW3n41Smhq9SxM/wjWPrJ/peP0pGMNw04on+qw9pFcL926nRE7UJes/BI3
u5QcIS02AeCaBHA/wLfQIgeaKRvCsksqGnzcPrBQuD74hxwyVIYFUhPbTKWc
TJCgFZjMHFed3gZ+gajmWCCUiLD9lbLImX4rMVtMN8HyrkifRqiOBHRKGD17
4pkKchjoSJxHwo9rGI8yS6+tWQYkmV1F9VHLMmdJttwHFCNmqRzOhTUIVHcI
/ImaJWhwI3VNWTccjlCZR12cT7TS6jXjuSKekc7QjBjnvMqQEcu3fuzNJMF8
2Xqt149lIyQs+yxMvx+u7kS0M61zoGKNt5T7SAU749H5U7XbBXZqJffwrnN6
184ocefActdMzBJGprTZkXhcw35qPuEhqhHF9Xjc6TH9oh6TqEeOEtO05Zvc
XcNozkRqWwTWGHt0tSXFM7rfYaYbs8rbIl8gng4Q+yRXCASqFB+lfm3iJtKM
jL0Y58HQk4CxfRH3ExDsr2QR0VuDrQRsmO66oKdO2Pi2BQkDoSwWikvmcZzF
PD1CBT0FPPp4b+afcjngzD/9JOmu8eJF8KwRs6JmLhCDYDMLXGNZkwiLNZGX
b1asr1goMptLReEJrJJiJUWUYFXMJsmWAClwPlJ0OThS7mQgPF1kYnfzRWIR
MJmwbZYJG2JMalD3RjGY/FKM0mCd2NmNQwRA6qVLH0c90UzCAzX78+PHo/1H
nz4xHWTNG/YKkj3xrVrlhfaAvJQVlzQV/DE6ZSBHJPzSES0uIuNr0lLZmClf
EF0LqWbLbE9XsHTYAJtGRgO+A0c8HDLuOKoqOpLrGqgZ2GXZTY695kitKDxy
FJeDsON3iu9Uk0EbpsqcXfVlwkY9EXPG37J/IxcKGXZKfSbWZ/oivwDDJmrJ
3spzmJOEeNlND8mXeDS5MzZaKd6gnw09oKa2NCItwKJlLUjFomh0ycDNxzQg
ZbXKondOdoZC843mceOsZBpFZrcCD60ICSWvjKeUg2CkTBRaSxCghgspjmRT
t8wxMfY/t2hZ2Ll5mIUVE+k17ePWlCqJ6lBwlrg7NaHCBuvE/a5Ok8lB6GiT
/b5ztiKKUphESqPtXa/ieNhVbe2kRG4IEyk6scF24NtWrrZpi/VTlQPXV7e1
xv3RbdRwdwcG1FKHwzvOnyc8U7G4SrEteevKA1oEhjLYGsummIWmW7v2SXS3
MLsWPYlvvz+TCs644OgzoizMPgPC4vnc9NajDV213VuqAkpMz6qU8tFV0u2+
Jwa7o0I5yZiJVAxbwNpFpQXYYJVhkbLppUVZ7yBH/nwbYWJWIz60YsWeYD04
sWlmK/NLy8iSkzg75q28i20OlZ+wewWMdjdq5FbcbrycN7cPWAJ//7hWrjts
er/hmkNkG9IsSmOydFOh/DjVnA1nuSGV0AHWMnJqWp0X12qDL4Lo2JsSdkRH
svsm5Uka0KwDoWkUUZ1hz0JEJKrdYFQS6Z63DfaVkxQbNt1dF+DY89ZY3qIb
/XJ1Vysdj5xB9cZ+zOSf82N6E96EY3irVdLjfPK+eXEhifrV639VcyppWRLx
zcXXd10hTqvDGyIrWT3YUfr25Nj+MRQni+hhNj/MxfFAM4gK8JK1xyXQYbWr
myrPONRdKgPT1f9FirI7p3L/Dd3mW2bLUrWZIdJetILtiykhvhGSVKDte9eD
9Z9Ednxa93VeIRaA8WI+KOG4u0OGyrxN5iX7bLh2mMbE8x/tuVrdVnE7qRGh
Z737s5d+l25ZAUzvPREekbTNyrjdw8KB2eDiOrpAeMI0aquVK9QtidoIT7qo
37WygMgopViP7DmTguGSGMiXk4nTqMXnYJSqIzuKnoz+g5E4nCmOz4QpQvoJ
gVOlhXlb/nREXbltJRm0Kw1wkso1HBm3mndARBFU5KqwZndQEQ4nYLMAlJUr
MYL2Uwy5sLX1GdRkMvjWMGiqBevjHIO1VtvR3DxTff3mxi3Rh9BM4PU16Tqs
vGwAnyC/+yLvBsA6GKWWtMA0uRYeUzxXopva3KxY2JGz4OLI0mBp9z2WEUfj
auoeTqFLwzP7uhqPFC4yTPtSq5hrriVbmkokNi8vL/lBt8i0pPTQQLkww1Aa
PlosAsNgHbYKX5swZDavRvhGEDJfWqR5kCHHQQHUpObqRShDWNFq4+x4hpsM
oOkkuMcG2sbg3GItEz8j3Bpsk9yZbqa05Gzu53QmtaMyfZCrUKxzZMtoW/6l
oPIxR0X30exyKvKr2Y+KOo5IZXK8ir/R8uNhgLUKFggKcIEmH5oIxLVA9WpN
O53m266dSaRIo3IoWDArYFXjACsuPNMLjXp2takDQdyHBRuBaiWxbIuJApaz
fAHkzxZRk4iAnqluaY6hT1UihcFViKdtb6IaWZ0VHi4WKZm53Plop4eTwMoU
1aJ9K+gzXBjWfMk/YorHymcYJaFmA1T44Vhha8ZNOTZ35RhrM1YGJbNQqYtJ
NRtVfEjFhcBeSi/ycjqQuAfZrlbATJLN2RkHmVMbcTihb4//NPnt1xcSScFU
jZgxl91ZFmYRSyIRoBNoAyEGN5wH6UM04zsAjoF1aCq5A8gUZHuRv+PKgpiF
cXTdFzRLGmLQqpRgsmSuwELESVNaw9o37RY0eDEJR7GlIUSUZLVh8a8Ru5DW
t0vIE7cuqxgf0jxvci6vTOQYmekaR9MnJeFE5wiEQiPmeZ8kiQ8KQ81SmuNn
o8Ogj8u7ccxJT3SYCwr7E/JdphJ9em1/f3JH/4SOaMAKB8dDddF9vLeOHo1n
UlSwG0kWBFWFrBO8W5py3XrrmwcA9D0Qhw0sxIfCacsmW7T52MA5gWn5XeiE
h1ash4Gn0Pzwpmgj5je0pPUFZOtRQPhTAhbsoloQXszOCI3SiEbMpioZdjs5
ialoaCnnUNCMq5ww9jm31LJ6HSIz3QXSVLln2g6PD+e1XMwD06P4hUPXXeqS
d4IgWbbVdnzFk/SHRZ2Pugn2icAV6pdgjp8ZAlY37o4lICegRAndsmZEtvIP
tiu8NiE6os7FD7qP1wCebK8fHiCWpHo+BiSMFqnnNGWz1EVHpBVr3Ua69EEi
SZhAnwngbnTAXrYlzfZV0fi3xKKGJD2Zi0dzxmfU84iZa9xgkFkJbMwkiEBq
VVoMbzNfwhv6M6eD+DfZGTVMokz8zLIGWb4VS5eJjlkT7R5fTKmLIEF5kbBe
rFpLu8hu4bVEzypQ8zFZi0R8HnlgZVg2kAtaG4gz27pSa6rJ1gjTZcwrdGgq
qJN+2wPimgSOXfBvI4f0XJPixylE/HMQuHcNfsC/DnkWEIzPSYptDzwA3eAj
q6H6SDQEejWbCxQ3G7IcIwm7G4BGuXWVs/9FHQg4e1t2F0SGwwBxtSeBpkWn
w17iyOlkCwk3+m1SuNDdOtZW47kkW+aS+rmEdCTM7Gys1g7LibhsrLacanRL
ZWvNao0gq+5gFdQzzXLY48ffP0KMcuI4RvoZjhFyXqVqg5OY62qA9fpfyXE1
LFDjamrR0Nr4sxa67FZA1oKIwknImSNOZgqCzsVliYou1MNd6SxF7Smz63iH
t7XMX3d4ZYd93v19XM/sUPQg4hwx4plYQ1bjv+dV2dceOzFGgv3BKXDcdjCq
M3Pb3DEYOxBBqhBwGIfpm02DLIWP94JkoXFVj0v+vXssNGlYEvvlJXGwoGVt
mATqzUzSpGo26mmxklZS5AUHI9C+t4uaKkfo04IHXGmobkypCZEkd9GQK0U6
4XbbW4CG2xvjY0DCDB9D4rbmf5cA4XzGSu22nJ1+U6KORAcmY4B/vblykYEm
hgfRvuHUDvssLXeE9G1tcV0VZXXeaje4JhqK+UULErboD2L7zn1NW6H74lD8
4nGYeRCIfkezgWDOgOesvTsvu8emYX+rnpPAjXIoyOX/qo4tTrmn38jZ4m1s
MfsQq1sYQs9eF/dwXFbj+PVxNuZES3m9F6z+M11EDr96RctyVQrcXtLJ9AsS
79KeMEyzmwHHSupa+KYTV5CKDWjhTeIYt5GxYU1mdhRmMORgWm85csj3dTo4
HTI/mZgpUKsjOCVHi6W3FZ2bXIovwF7KCcdxZmlcIstRXBczPu+cCXGcuhpr
UsRMRKCb3DFvJokAqnFBEybhYTQCyaOOg4xtAQZU4ph9NMtekLXbPJikYL5j
gh17SOLOu4GG6WZLYrEEIEU4hzA4SiA5wzXgd6OSiVNtbELsdVL3vc1JEM0C
Oy9WmcEOdeuNkCUd5/VKarN6wx4NBKmfPJJAHIkE9ehkO8TotpaUr0PPK0iH
IL4MTjT8N8ioP/31xeTX/zwDENf/U92XNrdxXdt+71/RoeuVSRkAJdlObDlM
ihps09EUDfa7t16VqgE0yY5ANIMGRNGS/vs7a09nn9MNSE58X+Xpgw0C3Wce
9rD22vj48vHxgSTuHZ6Jv0au1b44MYToOyrdbc/c5T3RhN7LvpMns9IGasgf
FChdGjfPz2QXJ2Pz/DfMsevxdeUwswLYk9rl2L4fV8txGC7lV5SnBAidzFqz
fNOCQu4HOTmSY2FNKC6ymVXe5SiORqyKnsmC81NEiZw+jAYOncLzUfjTKtI0
2WmJa9pZB4aOyyI9SxLPn5PgcjPFZKhlpMhgXOYxDQwF7vERWZGzeA2OTh5X
H5prL7gg2E7iCRs2oWLXq2/XH/hDl6HYYYythRPu+U5p8ixS7bt1itQXtqi4
/cJeypYQnaw6zcNhcJ2k8R1YJE5QDQIwb2TTYAbXgqH+Zd/2xv8pUlJIXoHQ
3HsLAiZeXppHgURdHBfsRMA9xSXjADtrl7VlHWZmQr+lmJvQMXYMMxVmNMrl
zZgeORHTiPAwSzROaoWmGz8XnLiKlLIMsGyYD52nRFaD5OhSQdZj7sgj5dDK
0kMnCwuGJRP9KL+He1EGNpH186CGvmxrLX2M1QrP1FVNfBezdZTr/nIkOR0m
PCB4WqEDHNSF0DPJJ0fSdUQ26MYK6nfDaVOkiFT3715PJZ0h0JT73YGY2gSI
sKdt2dPXge/FQRfJRsr9DaWe5cQ0B47+UPgjkurZ6jEMIxN3fRqQ6lAfUoR4
GQwRI6HZ7IGuqzcUHxw0QZp8jm+Ft4HfPvTrzkb6z6WM9P760jgv06UwvrV9
VUaEs+xwXYp5PZ7kPdcrOVGIUxh9A2SRcdXQ1L+jqq9qJfsOZ82qUxCXP2y4
KXRMUdaXlR26USrNThTZ7v2DxMKLhk4p9LV3oQ9s59CUpybnSs06XhkRUigO
mDBWR/MHVLRwWVNiL3ENuLiOcHDiKOce3/GrAJndz6vuFZvrVuVJ95ieVZGK
zk43Zfas/ksoV/sbvSQJKZVU3HMs9UhBvdiIuA4zyYYeTr+MDyfHnJa8E10c
3/UnYl/O2hrEYe9DHHiF+rv6n1a3/L1drhySIsNcgpvfX82pMYFhuJ/b6l23
ekBQPm6xfFJ8QEXZNGjZ0xtpKDZOvPR46C9jvrCQUoPlKybdeqqy2pCIoWo3
NSk1OlrpIm7ni27nPpNtlCDG/zIwqj51UfiXPH80IJEnSRvoH6lN+zZ/o3yC
DzJZ+j7hoT6KypzrY7thmce7AFVCxmo2xUSYnZEJUBFUQLoWgnwC8Q6HqTXL
zCrpSkDQpZILg1ohxd9MiueUH05YKtKKBOFEgZnN2ZkPqfQwLzh5oDZa2zQq
ybMwEdQXVfWKoxtShhEua744AYYu0ri6zWWrTh16nb4GIJ/IHg/KSOEgtyiT
brKfK2gocOWb4WFaZz4RRKVwK0j79zEyKV6GMkgURPp8cnocx8FybRC7Fn7m
KJGBaZ/W51WYEChYReZdbNYcK6a0rB5G5ge96l47OK/zcPUm8DtWC8JuoAEk
2Zv9cqZSuIJHGosL74OvUIP56yU75kJ5Paefh89Ft524nG6AOw3PT+uzZrmU
2eNYQJ1mq135fumFKJ0JxWmZ+cLUuoRFJgUMIDcu2nlz2ihpGpjY6VSRcE1B
9A+30u0nZhb1TaZZFrPSSiQ4CtstSuFyTkbK8XV4sn3xyjKxSgLWvRNE0SeA
F1L5o/LFw6f2+RkFEEYOFP0+vP3fcHL8wh40YieXH6HvkeJPa9TIQncs01F+
pgh/P7h65BeFBrmTRmnP5sZDsAvnXvBRaaZbo2ck9p5VHQGFBkDLGjUMInDG
pR1b1lPVm7c8yAZqcfozfQL8M0sKNeTO3p49SpJSJL+oLxm5pRLf7zZt81PS
9eykp7rPOao55nIL8Ghuzxjy6MnpKcD25aOIy333WctfjiNY9wMZg6vsVOiD
K5i1AtuAi408QIaQe/H8yaj4IfynrNezCZ+r7cUUcXVmSFFMrgD4CZwuYR8a
16axkwgI1uB/gW0Ryacli0zjwke23MKp9+zBvSePHj14fP/BfbYrUyk5D4LD
ZGSOWt+KJJICzxToBG95wqg3lAmIcadtEO8gf0lAK073DbNNc+a8vdiIPeIG
oaIloit88vVCkwxfUW0m55xcXBIPDx/FrF+GiW3oaxA7gfKFvw5Te3/ABMTg
FvUuzPmaiSYkZSr5js3XlHCI/ZQFRfw4/hWOBxomm0poB8uHbecsnHzKEjfF
ou2G9XHRIJOIKxZUKnEgkIGIewEBZEtAR6WsAJWwK5hYouSWRhfPhnIFE8Ab
kCB2B40Gws+xWiNJDMN8keGIBnbP6dB7E2SOZhV5eS0w6dLS37LFw1dHZ+qW
xZzElnw0GiVqouKU1jDEKCOhwGuOhb4EP7emjZcxB2L1TEegsQXo6BGG1qfs
JHfb+WUqIIv4a9+hHv5QvvK2X9p3fLO8JsgHg8YuBdM+1WhCJjkj9ctH0VVJ
EHS0PJwAwhipzzmwMX6jrrSnNDEGNrkAx8NqZxXbGBYBFXxqrhph/461sFsp
gXuIvc0IkOu5n7bFdSEsghCFd0wKCfGoNw3i6IamCM9SfH/2LAdii3etE6p+
C0SNOSw4LTZyzlBIh4Mdxy3rHRJ5dgcaFsbCWNbUPjbRnJqDeEFNwOySOfPx
dtrmiCQy9RvcTtSQ/YoE1x45osIws5Rv4dg+ZSqBuICz0RulAVdK26Gugacj
i5bVk5DB9Uk6aiq0CUM/39X9EcWH5eD1EWOtPzYc2Ui4XNQxU4abayFb2wjr
to+sCXsEv87OWzg21wmpgA/7HTrGOwr9LPtC6qCri+ikVIoddLLtUYS6SK5B
qYX8VAlrv1ySV+R/9QbUpgdXlJjdUBilx8UWb3ONfrJ7ELrXDaf80KvMqAGH
brNTUoHyHZDO0SSCJ1ziIbp7MNS0j2RDcAyFPjKWR4JYGWQIeeTDwMLyBg89
BbGSqeh99moptd6K44SRrEyB0d5+LiGL1Qx4fyrgwGObe4Sp4ZImnsmEZ9ll
u0mHTS+/+YYvzJpX+T7xXtCmeFYvWyKO8rmYfIwOUs9BIkqKKCPgiZ39CQql
b2o7YKIcDh/o4t2JznQc6sXnerK+kaeHsGKhDFVB8V4xX1Wnawth8KTYj6q3
JSfh9tzs4b9j3mw7RUKO7I3ZGCWx0CcQstNxQISYwrC0t2ybDoRskEbAWkym
o7CA5u1FzAFCqBihMUjvRSOCEuDnqpo3LXOvs9mEyqc4YTJvkBhUUbooj6vg
tJyRv2RN4W8ssnQxiwoQY2/lmTucMXsr4zjJFQx0hUdZ6NsF2DK4Z+lYEDuc
2znwMCk5VZjUdbu6liBPV2Vsl4JryTPVqTTLecFlV5DxQ2BuQVbBtXMVs7ZS
lk9JcrSzBgHgQZuh1FwIKQqTM6+DTHCKGwOjrPd9GoIlRrATiS6GNrEkIlxS
BQmp47MdIzJuVactdPgw+d6d1YpMZsSQI6OwwSFFpYvVdGwu9VCe0ha9AZUJ
tcCmHwt0dOer0hNsoLyBg1PTcFGmbARoVv4LTh8m18Styc3Q6uekBLr3By85
tIXsdICJkupNfvxVGOtqoUI81vTn4gjllGoD8YPEVRmKiqHFHIXRdGJGzOpH
tttTSrUrG9gRGAkzGiyS2GuRK41LUrBzCbrkbmzx/BAbr92WFe1nsySVbsZe
I1ZUyf7lMu6KSbJ+ex5kArYyc4D/NAg7sO4F8TcsOiJ8XnVkU6RbsTtnHB2/
fzCRtVg1FxocPrgmXc2nC8BzY4Iid5h83jnaCKf+SQJeWDExZeFNCnvarGZs
r6BBz3ULmAd72iQJX9lBZ9wGV0HBZA6SerFAGZwmoAXZdt3B+CQ3pHAy67S4
hKTJLjcMXW9UyAx6UVMMwx642ve2rFbEDpCCJfZ5E3XJ5BEzPQ3MAw25mwjR
8fnWw8lGEVLhrGQDuTHUhLt0w5JDtGcP3ElMesA3UkQkN8Taq2I30RDSMygL
pwDLCpVu37CaVgN5Dy0Y3l2LNF8d+OBn2MA0ShQ9XfPdJwuFr65bKIA/3lbq
7lFQnIJ4cR3/xlpoiTsNU6sE3yes3VnOMPF4WFwS7i7qEie1W5nq70iVS4z+
ZjEfDYz2SJqMd5qVvyfijWjpHfnI0/5yEgqfLG6UrBBOXKJQGLTL3Cqyh5Y1
gt2HoqEHJB2ioxswgg8YUevOC0PEVDfg+xuwrHJukEQ/lk32m9JPWERtln3i
X2ZrYUNJQwmP18SrE+7kuLBPyx71ipzKYIj3F0KVUZKTxM8XFMejWNA/5my0
1UwntBniXfAWuzzifL872BZbvjXZ1SSXiiJbR1DaamCEr83zKtn99IZvDU7M
vjvXIMl2mOCPfS2SuSJGK3NE+IhClfzc8feT8i5acVoFKSInFRH1cphBxDRc
NvdMqRTKy8a65LXl0Biq1NEZ1oWrsSXlZ3ClxgNcEi9pMFgqJ6W0Kl6m8QDo
gSMiIWQ0TanI33qUvkV8MW0LFVsMVzHd6Dqd/0TLsVSj4aHxsMpDzjnqGMUv
kNTnYZ4sJPogN4/24Bysgq0tLIFYaMTdK/YeM/g1b2WcjEhuWO7T1svhV0XT
bd1bRm+RErIqhw8jTVRfmo8KRDZx0nLWIrduq4OhtGjSK80bluRK86iyFD0m
qdKk4+/fl3/o4YaSFMz65JFApn4RfSrUzvO6n4JB7B9P6ZEsn7tX/PRoy9OE
lz3KW7vtaVyEVDLpIZy7bduzLEQJOOzINeVhvUyySZsP9YWSM+5ay8YZhraM
w9M7FjUlhJKI5y1lpxKfijeSLhT5GZbjmEbzgNOku4DnJLsqBoX0dE2zyqcT
Z/DJdExOiiRhG/wEimCvdmgXPcZ82Z5yhMMT3jI9hhT56uVTZsJk5EyCBCe6
jvOKA+6mwNhBTpqRqCVnWgKmlrZcbtZmiUJDDnSDzzR5T74I6FkdNuqWZuXC
obttwCcOMZuVyNk6vAguw16kTHjTZh0P06GpTcthViujdqHj4qrlFneLdi1E
ler0zxRvo2aSMzr5NT0rjudvMNBu3ftcg66jX3zRSyvI2aWTvILCfEjHzBjp
gnm3sNDWLMPjPr0gP+1SBdNu0SSDkrx6a5ZBx7INt0nldVx5ptiVMTrlNRBR
lq0qopnHGop+DVkuQCV9jAGMDJ+LdadWo+ICKta0JoOheOdEO8pY0sUwwknC
lbNaJXd0sl813YBYTLWT5KMfwoNqfML1widc36/Kve8RtPUUkdpCULtzzDVH
ChvEUNG/mhdQpp7NdGJZc1VzdbI7NFNgvuZUYUCnXfohX/67z7Klp1cqHdgu
MZGt3kQESVL++EHFWpKE70m6cPYtOE4pOdsco7C5KGjPG/4sqQtnuaQSM/B1
kvdnwq1cK6AU5oqReqDqzNJHa8lRvrFQRW5k8Da9eFFEP3Y5BOPI2OPWnODZ
ek4qPof43/72G+Qm07IxPnFEggT8uLogMldKDe7dEWiFirrmUFzneZiUL2XI
qdi507djR6c5zDilGW2nzVIx+OBnQ4LabBJde+UaHoBSFFvzdpX7Te6CMY+m
y9rF/pf20nABwKsEFVEoxW22DkaG9kMZYwEixmRmobpiV3V/+vI20sXBoeje
2lGhGLbptppDEjsjdxWtVoxNtlaG1wZpvKLFceSVOJEZD53BTxi80rJex3yA
bjdQGiNvvMLqxhaKuBaGGYlxzJoAwxIhvDW4pefXZTJf8QuIsXxDhGnCBJes
Bgj+7GYh3nlBIhlvfk6yqO0QkGj5HGUlZbh47Aj88DkcLcasrlaLpu7SKFBJ
An+XQT9IeeGsOGgaJaW10F2+BYZvMuVoFYuQxh/SQRAuB9okxabr34Q7R0x7
nu0wbGs8lfa5F1dHDw/1WDF4/qAPcknqTGNR5AJ3o0rhfi7XFJbPzIAIZP9U
eYMEh1Hx+7jOYg6VYqfrbKSOs2GvmWRgECI3Tmkc3qawNURMhnE8uybC6DTX
AZB/xF2YOfgTz1vhPW9YIds9b/5OT9aJ5BJ1d+MOP5tee91aQq1MWSs5O2OQ
B/YfRcsq33g6HuovNLTWvJaMXam+Lvcyp1rEc5bZy60SzW6KyP/zaxFS45Jq
fKIX7LfwaqfmAY4B10w8DeV/e7vtxdQRPjngIzhl1/BDHCdCFcZQaz5aR+Wt
mxiyLtog2UlY/mYnIVqTFy9eQ7UzkQYSHjixjEudAACbtTlC4frxjkSM9aAn
MfwQmSbIy63uRCTGVqcieWYyr2K1VM9icnZ/ovsQbjicP8AF0kkYPewRKX/3
/lOjv6WcyOQx9LURBR1yfayrJaDqhKoKDRctgJ2EWzyEYR0HTf964ATK/IS5
H0sPI90CM0IAAybQTrsZFGwkAdoym9v9bnyFQtWQ1s+IK0dUDjgBSFNRdZ2r
nJSPYvzm1g4ZOZMvTg7lNfOKY/TDeOtOXDWIzZBoF7u9aPScZqMKCOIy+OTK
vOa+hxwUOjvvlSI5BMWNQK6TVf2bB5AiFnBaJUBQotGqQpl7S6ShqRZ7SkUN
1HSzIJGLk82WvkkRhOongccJ6v59RihKoRRgRpk0sOYoFXl+lIwMa8STIQoU
z0NYXzNmzjXMrFQc61YmVPSOjfjU28v2khyfvtcj8gNqEs1f6ikRyY+YGB7X
1Qa3X+g1EcGbH+QTRvzTXZTcsVVN3no+8c15vH2h+ru/pJt6vhFWajj+6ugK
FCPESoO0OSIqinyabm1phycZfMKPTHR6zPatFM8PFBr5ByzHfQS1xJvAjEpu
el0KJRiqzpaYRlDOdxUQdtT1Lghe4hK8AC9WLZBwzl2/BOO1JIUI1xUBGJli
NkgVq8zkL9eTUxEobMAMinRGAl5fXKCsZS23hEfjS3hEHfVUvidlkmI5BtmL
BisJeHg13QQlec2SoHzHX4nlKXuuSTMN63Sr+PKmXWxY7xSrC2S2anUN2VqG
RMhv4inIQpCmmH7x/MnhD8+fHJSC49Wsuw+fPRmVPzx7clAQ1WIvXqMbJTky
++k0nOFfYkjuUpfUxFcODctR+WV5g36gCGDKzLq5iImDlP44dPhLCqsHupIM
SQzZ0AzgJMYIeEcEhVullGbEN45K8vMuglLCJDcIhxHux/Rd9pNIwFbEjya0
lDKkYdMje+PQ+9jcXX0xXTBunDAEVwDVhEtTWr9ZJvlZWKoXvIfNkjQ9zNVh
mKpDEa7H0N+18rgC67dhD0pyElp+9AX9LWvPP4GDM19e6iwaWpEGXQtSPGfk
ddCfFALDeLrIF2MJcBxMU3ITFpW5r04zUYcaKyQf1Lppfd1qvsl+GlKfV92f
f9M6z4NKtgicemw8jJrXiE0ERTSISl5BEiMlmWI+jkL53YP6cbeKyGgMrSK8
/ADvHuNVu06OgrAsIHq0be6a1CkHbWFZkhl/5YRD7ay5rB34Oo64KUwFLlU3
d/Vl07VzBqKw0bkimAIfFx2n8R7gw8NyZRosczh6tisHUvTDRYYwc5nHhbW4
Hpt/+aIKl8UaznhNckYoDrDu+HaLrKlhZVMARxi6PSc3xloOCQLoIJZt3oSj
5uHtsKtgvAJSamQwqVF5/8m95yfPKXlQSazhFWT9+XjL8VjgZA0nKP5jZymP
GvR7fmsVDvL5fFFP27dZOr9DsMTgIJiwi67aiA0P6hrFE06v+4PXOga41M7+
uq4vjTxXSEpopuiwELGuGwkJCgFB1yohrgmS7+eicL5+7Pcy3e8DKbIUNuXu
jCG/cWiMSw6pV8XhjfL7BgP3llJm8H6V7W7LW/f8GwNp6UJUqoxIhLJPhBvl
OB/BV/rMK1q57GzWGhwhxpE6RG5YqdrQZ9gSsa7mNOYvb3RbWpuZi9NReeTt
iVX++WigIak3fPhF8D5seyrtrhGR6OODPb9Z7K7vC+KAIZon/k0GEaf10Y73
xgPVJa8iyRh9HtEGOEgGDULOq+nVK7IkxoFh+RMOdq574HTlOhZdPfTKLZrT
cH09xwBtwhXwjw2RZAiw8ZZ4nmUK8w15lPBZ7YAnOEACNxFLPEclMA6Bh8C+
NLgBNSSHG6QAg9i1BFyQ4GMeEZyJol2Ew+MhgrwygAyBnsZEMOfCuzglBvun
SJZm+6qoPKQR7XMbkFjWYdMg/lcLJH9QHaxAeeL2M/QZ5PG2qwfeDOcQgrI7
jZuB8YNIUphdWhoTXeCeYs3sNJy3gwxuwA27Iq/kkYIeAdnUnPK3mL3jVLf1
qsFBylIIt01dhNAONOz+rqHHTmxpgTWaHyEHoN3W46DPdvwIj68txUiRn48G
ciHRb1o24BDlDCHuq6Yaxa7g+86e4suJyObvI2MHm77evRMwhTZjTF6wcTb3
Hw7M+r21q4oF2NFV/FBPrwSZ0tXVyoL/vEdkSDLVvDEIhpkGhfZyUc28D7pI
xdBJeUx5xnBLKZUBS7d+PUAOBpabsgGvyAzGCOUFKVmnjWZWRb413kaEMSFm
kZSff6SsVVpwYyPCWeclSlFMkjGTaMOOJ+VnnwWhxOpiRpr9Zw++P3n4ENQW
L58ejJJY0CzIiIRNoicj6V3lT7JqOxgN7tp6znA7MvGXlHwYtrp2+g92MI7K
iAp3ua56+EIRF4vzqjNycjkUWGoZWMIp8aGqF9xNZIh4+ZT77iMJaUWnQVcE
uUnXSrNmKYmWRiFmKu4ukc5lMk+Pj9cydykVOCRqdI8xz6wCqJX21Xnj5Jxw
l9xvefS1n93mDF2PZl3BLwJt9FcmXgoSPpzBlIdvomxLJ/L8i7b9Mfzfk1n0
f3T8X3phhruSttorMQwnosSPCLOte1WkJGhEts7Xo/nmuN16HbpbNWGc8+9g
Pfj3dnVOaaPA4YRV8RdIGuu3QYx5JaWR7QAX1otzWIiIU217fyLWKB8NyDlM
T0fOZk6BSHRdoFIIgh89nZOwDUMVs+UQKRl9y7chBK2IFwDOrrULQXilrt6t
15VM7YlMLHNEHB056JtrCR31+sv9J7883ldR4EdBlCbj2QymNzZi16iNsyZt
btrCbsaUVCxh+zT2/PJYThHpUbl/c/KntwflFMcRea2GSJ5TpAZPEXPqrCpc
7TPJ4B5O1Xsv757c+7wrUKySiNAJ9aaOXjg2LYVLjLixMn6qSITghJQ8dybx
8jDc5Jtvv/n6wwduJxtqqUDg21lwaChLKIMUcbmZl7rwvD5kL24XOGrBoIHX
PbiYdgHZ9Bn1aGd7uNXrxalgr4WTIOe2SiZa71eXcimJBi6YMULOTauHp52H
iTTza0VBkKMOt3AHblAH+S6SejXXTNtFPBG1PWuyc91CcgPEyxeTxz0smEwh
cmLkm5AaXjizc55Yj6nBBKRBuerD5VcLsCrGlZIBC0NRxLVCzhlyNyRKcDSZ
pZdSGu0Ssy/bJd1xTFx6tFH8gJGekcKL0SfvjU57cdHMyW2g8FlyTql5Um0W
FPwWDtUaF7xwQcD4tyf8MkpXdtnVm3k7a+eSc9FZxg9osFz/6NxAM9vFPLt/
RwVzpBe0rmnh7REbUqj+tHm7p8bCyI4WejASlI5NIcCnpTWZxZStQ4opEB8h
WuYTOmrNvcLoRVqW7IRm179CXtMKAHkj8tkrYfUjz5W796mcw3jpMdA9TqYc
wQ/eXkoKHBEXEc7v827vx+Z+UbpBOwiFh3+9Ykuk8/Ajlr6l6bnDROgx5H6m
+pkfPCzKrDfyDKrcT+osb2STNI5jHJo5eM3t32JTjL+4uWkId7RllxqMgIrG
Cy6g4A/Y5dg2OBlIlj0o6RJnamA+GWXpRlHX8cXb+6xMb2FDLpJHtSpYCxJx
IzRO2TB5xUV5Y1vbtwllkXaW5Gs9KUk54KtE9CkXlxTJoJOT8kiha8m3XiKr
Ihm6K4SW8JEwl4XpklJ4Zd9w20WU7H4JGQGsNST9/rtPE2P73Qrjp8//2Hwf
tAc3/uDGkzmIMz0sFArN+CExAl7JpsdKj6w380YZmUVtSNeurKdPbA+via75
tY4jgr/UnviLyloRAidch+4s+2u0cfqtd9QbpnE5WDZN3I5i47FzZGvBFeUP
hH//PBg6DaTBOiW2Vskk5idk4KbsDU5o445T0Wsa+pjniOXYR+zDYTPHu88g
+47DA+NBI4cmYEAJ9VumfSMKX6fVg6iKFAwUHbf0PlllRuZoHhVekh+ZxH/v
2cuT5w8kICUxv9ERiNyucrXO2ytyD0AwKNjqr1nbYogz66uspzq1eogvgHwr
1WldbL2LTUhRuXtu2sEotSYs2f4QhLB5dYkAlrTNV9VqrrIeFOhcP5+4KGaz
wxR89qtFEYhIKO0qWroQfg7rjOkXR6onLlpS9hOBctFOZFaDxAxVicV3z5KV
mgrFUnLpVlB0z7GrUsCRbA8oz1bVnI1QNBrGtSvGiX7spYwCRz1ZZPUWh268
6HyglXfXurCK1FB0kKFsmH8oNPSOhczj5KpYCyQ+/BExm8a/wGyqf31nbw1F
nLaAna4nnjEMkUlkxYuJMlPHJge3jfJoLjUN5wN2h13hmGhaV3fCdXvLRQkR
0wnGL7Kyxf2ZxwgesPfOLZRPLDObJ1cwsQBJwikx8Ml+hFsxvEAaicwP0Q7p
ioRcz+k3xjElogDNaVFq8hVChNLy37f1Xrq1frAN8FGW/DxbOMr4FfV6ZOr9
jdI/fVC4svXdbMT8u/7pA4OGEObzrJmpFThTZ/rNReIKZBFhgb3HSXzHbnF2
3jykdigtwHO23nkTkpMb1ZsWXWU2CNJz7mXyy6g0ySZdQ1ZINiaukN5oJevF
B9zm1P4Scjsk9B78dqF460jcKtyIy0LdNt4SFbhzwNWKmVfl29wf8168dHy4
P7Z+CEWuJ9/uPbNVb1sETiMYWgH+2361N9NUF94yToa9duli0NMluqtl/bDs
VGEaGEORgShHR9Vo5JdMnvMURN/nMa6mh+C2u4ufO0i9sVH7B2JQFSsqFTGS
+8w5UPtjyCPyJHmRD05FU6Y+hLiSdrcnWUsnnchzd3/ZP0jHoL/kTL+MS+hk
2fi69t1PkEXTn7hHrIGwVEAaquuDwm5UX2UsetQsssrSbSHH8FEZNBBQQFzn
+6Itfah98m5yGA+XkJ7XcMaryjQn9zhfHulEx9A5Eoe0I/2hSZu5/bjcYTCP
d4UVNHSKtjtO0E8u3d+L/pgYmJ1+r3RwtzTOfuZyqbS7v3zfrshJnxYrAIk4
qSPfeWMIL7y//55QwjyNspPz8wthzDhKVuKUlWAr4H7mRBg0WxPPC6FJVjVH
jSndTHz7jufcHxEYSWGRLPm71S9o+H0CerAHvXy+ubigAN9Ta/jdmFFB3d3h
iHzEAN7Ql45fAQut9kbZguBrBpKBTtWxYH4/CMjUTI9rzohExQRttyvPAfoP
YxCWeAwZG+gsjKYkiUmOzhPBcbO+VBOlFCMSL8IINLNOLeEzSH5LjtNI5Zbi
BvePo+/5NpB+k6ucvjDwMlGPXDYzB1Ld4+EhJiLydoflc7+pgmpxkeVOZWB7
Fb6ZSfZj+qxwW/PN7qUDzm90e8wXkozsmEvoPny4U+6RrrvnyM2j8osIib2g
GuJ3wrvSZ/sJy2RvttpQNAkOfXxklNwN4FUwZz8EHZnHiK0DFg6J/eD59WRY
OO6T5wnF3AO6bmchWJU7iyDSqHvVJZdA2hcVo2oSiaTk3TI3cty4UqM8yVB+
gc0p7BR1/MwqgtUiKsOn1pOaUNJa0D+AOV64pW0sW4qy0D3hxesJA4dcAhcD
+PqTw1rZ9HZFv7N4aOjwY8gEbZkrjqfQpzCB/pCU02+c/vti24f+D/av4PVu
/97Lkg8fZPG95+XznpcAnuB5yu+T9/EDllr88B4zyj+ED79XowneYzXSdsOH
25M//Ym+uc0/PD48tg87Wpx+iH//Lq1l5JGrlk4AfLg5+br0rZW79H3UCM+b
3sX9Cc32GuXv0gVvlcu78O3N/6+6wKbEUAEfuuHDrcnN4Vm4Ofnm6xuuH/9J
3RB4lFv6eTf6TfiXevC7tvrlUyndtfr219xqfPgPbDXCn7R0W/U21rSD/8OX
jAPGypn+jIQuJz3Qhf7uM/6L6dCm0xX/ib8gRrYUVevoKgUrqelCqAyx4v4W
ZmyCH1SAmXmmuYm2tV5SZKSQUXOIOxl/hfGKUZVCStGx/F35vFqnMYMXEQFI
nEYS4GTmdCXvhCHdh15xZIHGPHXykAThUFihT5IDAiRp0VxizkEas1kFMdaI
XIxc4O06/l4YZZn5RPkPFsjIqkkqEV57Za9RrkAmkCxPN0umRNLIOpdgXt2s
cM7ltFZelxk2MG6pV5ROQtqPtj0EdVWcgb23t7xSaE6zV4w3SryJ5WG+fnc2
cNsvXyRVqO21TX0SnuM23OTiEGAdRaOF3OgJhgiRre0KM1EtsOKhwAqL2fx6
WV0EIeuMnF/geJ4xj3UMBvRvB4WZ1s0C6cWiuK8emsr8QpqBsWGu/SUqjSCW
/Sm5aYh2u41mGCDFmnVBPSGoeEPUIr5DniToYwmxPkf6Ii5iQP3dO+HfIFPu
SXgvKV9MafTt7W8+fOBEB1YKUbnsdxctggp9qFgpi96AYmxyAnvfr8gZF2mO
oh8u7R0NY7rA0T4+eXBIqkVi2SJKbPEqHmawZVhPwmLcp2b+lVt7p7x10UUD
jT9kjyJocXPJFZGUfKNfh6zGY+qfNNyC7jUDIp2ZsJySNuL8Hb0FWfglVcqC
rISOnsgCc6ixLCNJZkyrvLmsi6HwFHLqUQZk45aQPkZFnA9CyvRATEsFhRwU
Xeuiw7OtNCkptV2keI99sr7KOr4K25f5KrJYMfY7K8Q9c0CzCTjpOve6sI7h
CkHA8ZB3eH8vGxwwu2WM5pSZAl55ul7ybtDi1xhaZrUZzn7aEXC3AJlLMeRJ
zAmFxV2sw5TXK+uH0pOGu65+W882Pr78eZ1sA04ds+1WSB7+JZxxWNL7bo8p
3Jl3gDdZ3Cgp6Gz/1s2bDJLggh5Vq7Nm+bRe4doCGCz8nhh18/X3/j2X/pd8
x3kzb7oR6dIY6IAzQw53LDO7HMRrgyQkIn5J/M3i2+ckOUovRFi9K3L2L2fX
gnpyMkdBAPKEaUPmZmCICKEKAhTcHbeMroHgDsyISpnCSGy69b9cMC0OARjJ
QEhzpnRP5XOYMv/O0s6dXvQ67JAIFJU/ISrib/mTY3qMQ6y6wJnza5JlEI7x
87qad8QevHjTDzs3Zz+JZ/eevhyVj0/uJelK2YcLA+3mcu0tNJyEIRwxGMAx
Uk4hMgq5cz9ydVlOgYfNcvMWNG4HQupipGculLguhPsGdVoeR5U695PMjgdl
WAdML8SQ2C5ymSolwD4DgmOQrcbRD8TiHli6kgFC9CJCBTgNHN/zYvbSFMkO
qjNSgSQhSmsod6BOec8gzFeEMip3SSwTCWjGxZ8ksLHR6wRmYe1JsptFziQx
FB8b7NpIDyhL6ykM9HOiRqDdRcPLGGNF+zRrTazI+TAIE4Pct7wYOVXGyL7m
/TnyuzWuKsXY4ieqpXA5fMkRxLl3yymldo7Dpz58IuGh9hL77kcaXFAyB64u
bAK3cQQiYZSWRnWhOg0FZ7VUcXcehCXmKQ8FcuhDZ2sxZdZlwaqPmSGSiHXo
Jo6IJ0vHc4BFuNosOzkvcXTIyZGQgPcOESQu23abJIVEp1Dy/lHvSL8BsWvb
w+pL8l+Pyj9+Vf7t7vW6dtJa/p7409L3bofKaGOrkEbDsI1KBgGiy0oTcnFC
OModwOz1vWqJrDzJOinBDNkagJ+luSTvFJ7gQ61LeE86tipz5hdMYo+uNJYx
SGphnDZIsUZLLpwpMTcoP4oq+KwK/QW0rBoaj+c/Pnn58H6JSIaLyzV0Iknz
J3s7nPSnQQykZHesx+t9FH3cmgmaErTJd2PWLj6YfT/VOugkhUl9pKdYelpl
0CQ0nMJCKA+rhg2lQwOunOW1cEKeWFRRv8QYqhnhaSmaywme/Tm/UIoHD/BK
UGw52mukrJ+JxKqxeY2GMIXXwsKIvWBWJBYZSfd12cXtVI4wqnT6mRdaVazE
bfd5POAl/yg5HA0OKvyDlMrEp4lAO85WhHRUegiCu3E0Tc/no1xQ1LquAKQW
hNN62pIJhciDSMlO6YP4SK86DYrhoWDuCYyEWqtSTjqjfSABnhUuzZ0RhnFD
wVyfd5oGmJLUFezXwZBgQrgOh5ilOw+3vURooI56PbBpKXTJ39lmrgAPJsI5
YipzVfY5+EZAieLxXaX8rkG9qAjvwKPeS0djC4HezFO7xYSUlPCcpE5jYF/V
Y53wLEWG0Fg51q9yrRQ0G24Jj1s1m7WUiXJxzdJPdGp3ljVR0gSKS87Gwg1e
waotJ34VvyDnglWrBSp795ko3GP8KTABQ4Ky28/TWpI+vWkWQCQObZFSt0hB
nZMtlstknVqc6GlndanWurKOeZ2yicQvrsS8oQtNu27xjODIDV/wRp21l3qS
MyWLHkpKLEDAdG93wKMCU1226QAgBBr0CRLrRaIpSBEpiLxm7tNRv0Te6uZG
zSX0IjculTuMS7k1iQmysfkhylsw/z0lEe67jnGryI+SXUJ/+mDsPv235PTf
XFIoLWGDxFb2CVeLiMH8GmX2vEIKOdDYItqft9O8ZZYiQV3jcOfrNlvbhEOn
FJtd+KZDqpM7PYx2fhiMYswp9qsdzj5vADeDEuPOhJ2bITGnyDc3I9xGvB4c
aoQA6SKXFkIaSBTUCQQcR31yNCQn/pCXfzIghaa0xwPztEyAgzH0uNhm2Agn
/SPR4/adHUONEHp4DaDKBGuYGAlh4wNQoJknBKbYOQ4tOJ1fejoeV48P5BDj
ibwgZgwSmWVjCTeddj7LXJMR2OXRJBB64916t0dr9/EXHjVLZDq4dxUhhc3H
47mtxC+Oyts3IGAPBq+kwUjJzMQmDU2fL+1j4+WBqMlqySCojt5p23BmTUkQ
N9nDX/QYhWxhJGv56KPtjxSDeya6vAprZY9Iz6DosRbCBFuyNdV8kdKTI5GY
ZLOoB2ShhLEzbPjKwGZ68kiitFIyvkyvCvZqzTcxs7Nb6EFmEYfIhnNAoxah
B4tQJYYBFVk4DmU4JH0iGmWU1RnctuH3c0apSno4p8MUxkOoMs/I2NaEinCE
OJYaZBpz0ivMnjHnY+3du+NbX2tqtj3WYmTE+eTXkRZHZRzoNrWAxeaYRh+J
5ck06BgwYVxGUfXyTbNql3wjc76PvvFIBR5NL0NnLeYDG3bB9qx3n2k6GfxK
8V6X9quk7egL4aLztcIDvGjZl5UeB+X+VzGLBDjri6/K/yPatFyG/KZnn5bI
D9Js1iXJm8JWLAInrBiFz0djqd01G4LNLQK2KCEEiDAYeh41dDQDojrnaYzi
zq79oUZb1iziOFEyhegKoOHJtp3l472d5lmL5QsTYMc7ZsvjjrmFBSDrrOy8
emXizyMGepJaITgzIsR6prpBmHt7hKc/bDFIDGOVGEQeJuvr5QoNIIGCrJrn
jfLs8eAJg4JoC8LdS+INybiyzwrjDFc6Hc5eKMSJbJzo6Z/GVFMSy2KzjiF2
07qv32iYkUsTnyZZ2X/24okEGaZ6UalMOCqXVAVjGpk4BOkbeD5v8QKy3FXK
dS68mqzWqtRjbi9WcCIhxBIG60Wk4w1tW1CmO7bbh6HYozcYnU50TI90e+8V
hFWleavs97Ftf5xN3m+slnCak++xtmwhNOsomFuEoc/EXux9AtOagGc/hW3N
moaGMZNXqrayZXTdapIfnQ5yOFIcHxhmg3SE7Lx+iujBcKDMNSi41pBGLTuL
+qv/yXMkwXsxpmyoWc5wCymwg31vVV9WTPGNq0iCecNCd8+y041zGe2Fu6zd
E6aNSly+MG4bI0aVVlrwo0Q5IylXBNlCbo9F+HkhhgY63HX8bdNnI9ul3j2a
xV3bJBWUnywfYEDDD957FrQRnPgiEFHFCLHCCVl+Ud4SEYWqsvlIluBgJXhC
HxiuzZcrafPS3qIH8a8wOkmt4QioG1KvSHuReSySeQS3SuvXjzEDxtWJ1Htj
XpDUd16PV8ggOiddOfY6aV7a62dcZNK1mEBvuH+aolR4UdPANDF4Mf/fYOja
FuAxH3RTicTMrINJGtNcDdTUJ/oSGuC90bzg0/VNlUWTy7TuEe8o6Hp4FCMf
b1wZVHE+piRoQFcl760xYQodMJ6zMOFxPF64I/vrGK/Nh/hSAymI0DadlrD9
FVMolHZkDDyls32rc91aH5XPP5wscbTGXaAdE+XqD0cWUp/4vylWUvYhRTnh
F0dq1ntIvR/xS+UqHVicd/w2x5v8fPr+QUI9MCCMGOpyUA4hywSnjjshydIS
HOvtz6RaiglKqfB3pT4pOPXJiMSMsxZUt1TWPzfN7LWJAJlZJ6c6gq0GcO8i
Q0GSG1HkSa8hORNaTwfydIsc5o9txeeMhED4OzCVshksQEJ86Em8CQvRQqKU
6sZkh0ZgwzTigJrs/NfR9AuBiV9CV3QxDajBEtXlX//BlOJeAVhT6ZfDtgbR
8NNHfcyZnGtabR5tmFoo3CbSdjTLuLbTrqfLe6uUBkvjVgmND67ccqw5OjiD
PWnHxHXZME8oXP1BWZ3Pg/ikfHEqbk9ySGNnWTRKBtbBh4DzTlBSSoZOK945
t2syXHreNbPeVmmqOGV7kMzqapCO+b9y7bEAQ9wbdaiw8yS6VEQo33i/VHMB
hvNQC+c/HLYSJrVLiptBvTXs2s5LlY6fApF81WYNESsMTSFiu51ZYT8vW5dS
j/x7Kb9gkvlgP6Y3XFwX5LeV/IaL6wORC8SuCe4+RliQnyfC/obzde+lPNV7
nlmPvi8kM8CKUiJqCm/y3q8Tjwq74eV+BParc6589Lrnsvc7f4uVdQd+a8sG
C1Ji2qVRb/YO7A6jsumtP/ftZe/f+9j+8ISzzGaVD1a89WrrHT5bz5ihX0Wy
isY6MTcMZwgrg2TSzpvoqmeCCI5wLOU+BHjR2FPEbGGZuWISFWe73wn2DJcD
08eR3nfprXU9DGiMykyRn3qzwvdVNOvCZQMy8n8PMV5uSAJzIH6XdJ6BcnQB
Qio3/yDr3GEnMtIl7sXeWqCTsDbF0YyZRbidJuWTteQuiXzUyfExVCQnDj3X
fBwFzQFTknTIMQg5gE+CuAT3F+DcpVb6tWizoU6Z4rpeF/+AdTdxfXtktwp/
aS9hAazDHI3MoZoZHDQblY4lHuFRHD4oJ0hawOeQs/QVVbHN0td4HCDZR5zY
QcY8Ah+xtRa2vLjcfpMsErNUak/orbu6pp6x8cmhSN59pp1mydIIwNlONY7e
RRg7fa9zycsWrlq47E1CV5vphjdHsRejXPckNFqtWRw0apvoo8HhRRKrbIOS
ebCG4kfpLKsu83h95ag7FscMlc+6hcUx9XWMSM+lx2ilDqw8EMpO6UEhC+pR
6f8NOou21KXXDEC6P9bVfNW2F0xLQTwOnCXZkxHsh8XLrOoNj0EQadUNx6XS
JVRdjtKuKPOCPIOrQJ7p3QQ9aTE8eRCJC4rPypMMIBX+vwFlQer1ppD+TfdB
WIH0VIVauZKlyE9gsbCGmgNblWldPfyFap2UFxSFqpjBMfPsdNUU0GGoSEWj
UsLDlHcyyKfj+0EkXTPCLIVvUqxBVy0Sc6EkSf72q9vqIMkulbzViu3XHksO
FCVZr8IEdhyCdfLgxfdqIjZEaSS1beiPs5UihNFsug1DexBqBqN6XSzNqkJ3
a2OdBkoKpPNvGoiEOayNLm1zoePHa5hV2lXHep2kXkUTwwm6WeF+gbQIwlsk
9YG3Alcv++0vhWo3XBLN6XXBqI6Y2yFyQFG1RlyNRNQUHx9qo8EgbEkz3QT1
XKC2hfn/ZQgr8Z1cbDqmLRemYwRyyH0KJF9YE1UQNGggLISvt8Do/mtWQPAh
vCrUGY7divGIEGrmb5qOS43DTBiGXlHwGNRvw+iHY/1YQT940S2fUbnHUR/R
9A4m2/pK8Y+KWT1btRsWXrFazpaUdyyRquAtUNpfCXwhGAVb8JZhn5AcH4Tk
JUOxoIML3KzSpI+gDn/D4hTi7qBv02nOGTTiWkHTTut6PkXuwFjXRSWYHBsL
kIqv2nUbroggSrTkSMG4hmFlvCE8o62Afmxl9nvNCEvaOLaICk7hdU2xOqF7
exhoOyN001+tyLI4yjSDgZMlnH1vviwNe1JcbqaLZkYmE9pYc8FwG6wex/KN
8nm7QcpL4l9++ezhHT6sb5Tn6/Vld+fw8CwcVJvpZNZeHJ617dmiPpxOV4fT
RTs9fPPl4bMHx/cfPZhczH/ba+HUOmwu33x1uJ5dvgo/TGaFb82d8gd6h797
hCEPt+MdzEXQhWnw6JeHTbjsu/A4hn284L/m4e2nD9/cRmzi8/v8IO7uara+
E5tHUzPhplEr54dhZjYXaOZ4Xr+RCmCQZn0rFPsYmSIhEt++PSpv37z9JY3n
31+e3Bscyq43lrNuMjsPinWzuZi0q7ND/eOwW81oTMIaWc1fwVl5fQiL13lN
P+HjYdiC9WGUa14JbA0Nvv1KvIuz2f/zKs//vZkLUxQu1mt94/eZqCezdUvz
dIvm6RYW/r+ztVjzYoRlQaZyS0sXIcQR9fVv7jxevQsdIbejJq9x4S9oIkMl
h93s4nCBQg/5BzxzGK6acPDNO/5lQl+t6jrdc4QGtMVikzBQ68D4X3RnOvqH
//vmw+n9y/Xiya/t4YOfz14/+8fPP979+/FP/1P7+fdfLM/roIbytv7Klstv
2tb9s042Eh13wCXoF7t3lcYOCk330Hb+H6vqP3kbfx13cYGouBm1BpV4qwzC
4fiXcWqvUYndpGGOxwpin1pf5Qp3Kcm1KNr9hmaJskC7Ggj5cnk7GMNPKSAt
j2UdS80Ao5LMk8QtCfFZzhGruKsOFsS+/uM3t8hjDz3m+PFxf1SaalltGRHL
QCxx6lRANRPEOmVuuWJLmKIiECdwvqL8SMLcXM8RucptuX37jxAK1bl+1ydS
uWjnQZKGhEp80GzcumpWnHgDYuhpAQnfDO4y1qOgEKy4GGRYmiMx+5UkUQuC
HlACkOg6wfKz0UrGX+IaOWi3rAqebyM53jW4lKM1x0ErDLjuChbhqXgPp3Fg
85EgNhgCxDC1gf5N1I9MalD5YN6EA/xOqnEZeueifcO6HV8xIs0SdCG8zKvg
2GzRLEu/+6xKvxHPRrVZn7eiFxC9yOmGAtKRaPxvi7pZBr3tNdl8SMRHm5V7
4LxuV9duuxT9oZyUv/DKCXJxPRU738NqhaiHVfX6ouXsNOGNmr3GUgGpWj/X
ZxVAfHeffotsNxj0x2HS7Wtg+3bvv5EA4KGoVWeUQiaMfa30Iiwu83Qioooa
9nlH+pFkBj/bNHOEq6r3nn0hdRV6HFbfm3rRXl4IrXkcy6t2s5gX1YLMja9l
pVXL1+XfEPRS/lcFcePpqrmuwsr6R5i1n86rUflf7abbvA4H2wY/P9yEF3/s
mqotTk2f0+EHlC605Lvyp7Cry5PrenmGJLI/N8RY8XPVNUH9fDMq74baftmU
VkChBeBa4xLQyXCyr/EfgvvJTEO1RXa8ZMqTwAS2NKyZ/1xT3Yd5efTo1rfh
LMLM00CUAwNxb1I+X9eXMEH/EHS5UfkAyd3vby6qX5E75TESlayr8MXr14iH
a0bF0+qqXpQ/hWvp1+vX6NkqLNBn7fWovF8FhSvUBv01aJ+j8hi54X+uzsP9
EcaxbpdhCrvyb2F1tKidLBWR3y0M+4sNlOt4K40c4f4DpryRTc/3Yfn82YNy
XVcXnQbiNbADmqJJ2AUiq99c4txwY5EOwzMc8EFpfkbDcRWk71HxU3NR/lIF
OS5U+bA9C+2FF/HnGllU5itYMn+kvj8NyzIc2BUylh7PV+F8L/+7Cpf4ugpD
cO98hUukWhY/bpog11ToUlv+dxjwsLZ+apcV2bofhcahRFoAT8I0CQniT5vl
eRsKaRtaD6okF9ynM9lwHXvAVmGtrWAi6aKg7G4VHEfj8bikAv4vQI6evpIw
AgA=

-->

</rfc>
