<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-iccrg-pacing-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Pacing in Transport Protocols">Pacing in Transport Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-iccrg-pacing-04"/>
    <author initials="M." surname="Welzl" fullname="Michael Welzl">
      <organization>University of Oslo</organization>
      <address>
        <postal>
          <street>PO Box 1080 Blindern</street>
          <city>0316  Oslo</city>
          <country>Norway</country>
        </postal>
        <email>michawe@ifi.uio.no</email>
        <uri>http://welzl.at/</uri>
      </address>
    </author>
    <author initials="W." surname="Eddy" fullname="Wesley Eddy">
      <organization>Aalyria Technologies</organization>
      <address>
        <postal>
          <city>Avon, OH 44011</city>
          <country>United States of America</country>
        </postal>
        <email>wes@aalyria.com</email>
      </address>
    </author>
    <author initials="V." surname="Goel" fullname="Vidhi Goel">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>vidhi_goel@apple.com</email>
      </address>
    </author>
    <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
      <organization>Münster University of Applied Sciences</organization>
      <address>
        <postal>
          <street>Stegerwaldstrasse 39</street>
          <city>48565 Steinfurt</city>
          <country>Germany</country>
        </postal>
        <email>tuexen@fh-muenster.de</email>
      </address>
    </author>
    <date year="2026" month="September" day="16"/>
    <area>IRTF</area>
    <workgroup>Internet Congestion Control</workgroup>
    <keyword>pacing</keyword>
    <keyword>congestion control</keyword>
    <abstract>
      <?line 187?>

<t>Applications or congestion control mechanisms can produce bursty traffic, which can cause unnecessary queuing and packet loss. To reduce the burstiness of traffic, the concept of evenly spacing out the traffic from a data sender over a round-trip time known as "pacing" has been used in many transport protocol implementations. This document gives an overview of pacing and how some known pacing implementations work.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mwelzl.github.io/draft-iccrg-pacing/draft-irtf-iccrg-pacing.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-irtf-iccrg-pacing/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Internet Congestion Control Research Group mailing list (<eref target="mailto:iccrg@irtf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/iccrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/iccrg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mwelzl/draft-iccrg-pacing"/>.</t>
    </note>
  </front>
  <middle>
    <?line 192?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Applications commonly generate either bulk data (e.g., files) or bursts of data (e.g., segments of media) that transport protocols deliver into the network based on congestion control algorithms.</t>
      <t>RFCs describing congestion control generally refer to a congestion window (cwnd) state variable as an upper limit for either the number of unacknowledged packets or bytes that a sender is allowed to emit. This limits the sender's transmission rate at the granularity of a round-trip time (RTT). If the sender transmits the entire cwnd sized data in an instant, this can result in unnecessarily high queuing and eventually packet losses at the bottleneck. Such consequences are detrimental to users' applications in terms of both responsiveness and goodput. To solve this problem, the concept of pacing was introduced. Pacing allows a sender to send a cwnd of data, but to spread transmission more evenly across a round-trip time.</t>
      <t>Congestion control specifications always allow to send less than the cwnd, or temporarily emit packets at a lower rate. Accordingly, it is in line with these specifications to pace packets. Pacing is known to have advantages -- if some packets arrive at a bottleneck as a burst (all packets sent back-to-back), loss can be more likely than in a case where there are time gaps between packets (e.g., when they are spread over the RTT). It also means that pacing is less likely to cause any sudden, ephemeral increases in queuing delay. Since keeping the queues short reduces packet losses, pacing can also yield higher goodput by reducing the time lost in loss recovery.</t>
      <t>Because of its known advantages, pacing has become common in implementations of congestion controlled transports. It is also an integral element of the "BBR" congestion control mechanism <xref target="I-D.ietf-ccwg-bbr"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="motivations-for-pacing">
      <name>Motivations for Pacing</name>
      <t>Pacing is an old idea that did not see much deployment for decades. This may be
due to the need for efficient fine-grain timers, which were not previously available
in software. Also, at least one early analysis has documented disadvantages of
pacing, primarily in terms of throughput <xref target="UnderstandingPacing"/>. At the time of
writing, this article has become 25 years old; it is limited to Reno congestion control,
and defines a pacing method that is not in line with any of the implementations that
we document in <xref target="implementation"/>. A part of the critical analysis in the article
includes an example of a double back-off after slow start (fig. 8); the authors
attribute the performance drop to synchronization, but it may instead be
caused by the back-off factor beta being too large, as described in <xref target="backoff"/>.
In the latter case, it is not a problem with pacing per se.</t>
      <t>There are several potential benefits to pacing, both for the end-host protocol stacks
and within the network.  This section provides a short summary of the
motivations for performing pacing, with specific examples worked through in the
following (<xref target="considerations"/>).</t>
      <section anchor="network-benefits">
        <name>Network Benefits</name>
        <t>Senders generating large bursts create challenges for network queue management
to maintain low latencies, low loss rates, and low correlated bursts of loss.
This is described in more detail in <xref target="losstypes"/>, with examples.</t>
        <t>A number of causes within the network may lead to "ACK compression", where the
spacing of incoming packets (with new ACKs) becomes bunched.  This could happen
due to many factors, such as congestion at a bottleneck, packet send
aggregation in the MAC layer or device drivers, etc.  ACKs can also be aggregated such that instead
of acknowledging one or two packets of data, a received ACK may cover many packets,
and cause a large change in the congestion window, allowing many packets to be
released in a burst (if pacing is not used).  This can happen due to coalescing of
ACKs or ACK "thinning" within the network, or as a means to deal with highly
asymmetric connectivity.  In any case, a sender that performs pacing is not
susceptible to ACK compression, aggregation, or thinning causing its own
sending patterns to become bursty in turn, which allows the network more latitude
in how ACKs are handled.</t>
      </section>
      <section anchor="end-host-benefits">
        <name>End Host Benefits</name>
        <t>Pacing enables good operation with shorter queues, and can create an incentive
to reduce the size of queues being configured within the network, leading to
lower maximum latency for end host applications. When applications use pacing
to limit the rate, this can also reduce latency irrespective of the
size of the queues available in the network (see <xref target="appcontrol"/>).</t>
        <t>Improved RTT measurements can result from pacing, since samples are spread out
further across time rather than clumped in time, as explained in <xref target="rtt"/>.</t>
        <t>At a receiver, processing of the received packets is impacted by pacing, since
it will result in a more steady workload, rather than large incoming bursts of
data.  For some applications, pacing can therefore be beneficial in avoiding long periods
where the system is busy devoted to processing incoming data, and unable to
perform other work.  However, some systems are designed such that incoming
bursts are more efficient to process than a steadily paced stream, so benefits
may differ.</t>
      </section>
      <section anchor="other-motivations">
        <name>Other Motivations</name>
        <t>In some special situations, outside general Internet usage, the path properties may
be well-known in advance (e.g., due to scheduling of capacity, etc.).  In this
case, senders should pace packets at the scheduled rates in order to
efficiently utilize that capacity.  In some of these cases, the rates may be
very high, and any sender burstiness might require large expensive buffers
within the network to accommodate bursts without losses.  Situations where this
applies may include supercomputing grids, private datacenter interconnection,
and space mission communications <xref target="I-D.draft-many-tiptop-usecase"/>.</t>
      </section>
    </section>
    <section anchor="considerations">
      <name>Pacing: general considerations and consequences</name>
      <t>This section explores pacing scenarios in more detail, explains considerations
important for using and tuning pacing, and the resulting consequences.</t>
      <section anchor="losstypes">
        <name>More likely to saturate a bottleneck</name>
        <t>Two reasons for packet losses that are due to congestion at a bottleneck with a DropTail (FIFO) queue can be distinguished:</t>
        <ol spacing="normal" type="1"><li>
            <t>A flight of N packets arrives. The amount of data in this flight exceeds the amount of data that can be transmitted by the bottleneck during the flight's arrival plus the queue length, i.e. some data do not fit into the queue.</t>
          </li>
          <li>
            <t>The bottleneck is fully saturated. The queue is full, and packets drain from it more slowly than new packets arrive.</t>
          </li>
        </ol>
        <t>The second type of loss matches the typical expectation of a congestion control algorithm: the cwnd value when loss happens is indicative of the bottleneck being fully saturated. When the first type of loss happens, however, a sender's cwnd can be much smaller than the Bandwidth-Delay Product (BDP) of the path (the amount of data that can be in flight, ignoring the queue). In the absence of other traffic, the probability for the first type of loss depends on the queue length and the ratio between the departure and the arrival rate during the flight's arrival. By introducing time gaps between the packets of a burst, this ratio is increased, i.e. the difference between the departure and the arrival rate becomes smaller, and the second type of loss is more likely.</t>
        <t>For example, consider a network path with a bottleneck capacity of 50 Mbit/s, a queue length of 15000 bytes (or 10 packets of size 1500 bytes) and an RTT of 30 ms. Assume that all packets emitted by the sender have a size of 1500 bytes. Then, the BDP equals 125 packets. The bottleneck of this network path is fully saturated when a (BDP + queue length) amount of bytes are in flight: 135 packets.</t>
        <t>In this network, the first type of loss can happen as follows: say, N=40 packets arrive at this bottleneck at a rate of 100 Mbit/s. In an otherwise empty network and assuming an initial window of 10 packets and no delayed ACKs, this occurs in the third round of slow start without pacing, provided that the capacities of all links before the bottleneck are at least 100 Mbit/s.
In this case, an overshoot will occur: packets are forwarded with half their arrival rate, i.e. less than 20 packets can be forwarded during the burst's arrival. The remaining 20 (or more) packets cannot fit into the 10-packet queue. A cwnd of 40 packets is much smaller than the (BDP + queue) limit of 135 packets, and the bottleneck is not fully saturated.</t>
        <t>Let us now assume that the flight of 40 packets is instead paced, such that the arrival rate only mildly exceeds the departure rate -- e.g., they arrive at a rate of 60 Mbit/s. When the last packet of this flight arrives at the bottleneck, the bottleneck should already have forwarded 5/6 * 39 = 32.5 packets. Since only complete packets can be sent, the bottleneck has really forwarded 32 packets, and the remaining 40-32 = 8 packets fit in the queue. No loss occurs.</t>
        <t>This example explains how pacing can enable a rate increase to last longer than without pacing. This makes it more likely that a bottleneck is saturated, such that cwnd reflects the BDP plus the queue length (loss type 2).</t>
        <section anchor="backoff">
          <name>Backing off after the increase</name>
          <t>The two loss types explained in <xref target="losstypes"/> require a different back-off factor to allow the queue to drain and congestion to dissipate. Specifically, in the single-sender single-bottleneck example above, when a slow start overshoot occurs as loss type 2, a back-off function such as: ssthresh = cwnd * beta with beta &gt;= 0.5 is guaranteed to cause a second loss after the end of loss recovery. This is because, when cwnd exceeds a fully saturated bottleneck (i.e., cwnd &gt; BDP + queue length), cwnd will have grown further by another (BDP + queue length) by the time the sender learns about the loss. In this case, beta = 0.5 will cause ssthresh to exceed (BDP + queue length) again.</t>
          <t>Since pacing makes loss type 2 more likely, beta &lt; 0.5 may be a better choice after slow start overshoot when pacing is used.</t>
          <t>The following example illustrates this: consider a TCP sender that transmits data across a single bottleneck router that uses a FIFO queue towards a TCP receiver; assume that the sender is paced well, and only loss type 2 happens. For simplicity, we consider the congestion window in units of segments rather than bytes. The initial window (IW) is 10 segments, and the path's capacity limit (the BDP plus the bottleneck queue length) equals 30 segments. In slow start, after receiving ACKs for the first 10 segments, the sender will have transmitted 20 more segments and the value of cwnd will be 20. After receiving ACKs for these 20 segments, the sender will have transmitted 40 more segments and the value of cwnd will be 40. The first 30 of the 40 newly transmitted segments will pass through the bottleneck, but the remaining 10 segments will be dropped. The ACKs that are caused by the first 30 segments then cause the sender to transmit another 60 segments, and cwnd will be increased to 70. When the first of these 60 segments arrive at the receiver, they cause DupACKs; when these DupACKs arrive the sender, backing off with beta=0.5 yields ssthresh = 35, which is more than the path's capacity limit, and another loss will occur.</t>
        </section>
        <section anchor="able-to-work-with-smaller-queues">
          <name>Able to work with smaller queues</name>
          <t>The probability of loss type 1 in <xref target="losstypes"/> is indirectly proportional to the queue length. Pacing therefore enables a rate increase to continue with a smaller queue at the bottleneck than in the case without pacing.</t>
        </section>
      </section>
      <section anchor="queue-dynamics">
        <name>Queue dynamics</name>
        <t>When it enters the queue at a network bottleneck, unpaced traffic causes more sudden, drastic delay growth than paced traffic, and has a higher risk of packet loss, as discussed in <xref target="losstypes"/>. Paced traffic, on the other hand, can cause a bottleneck queue to grow more slowly and steadily, incurring delay growth over a longer time interval. Aside from the direct problems that delay can cause, such sustained queue and delay growth is also more likely to provoke an Active Queue Management (AQM) algorithm <xref target="RFC7567"/> to drop packets or mark them using Explicit Congestion Notification (ECN) <xref target="RFC8087"/>. This is because AQM algorithms are commonly designed to allow short, transient traffic bursts to pass unharmed, but react upon longer-term average queue growth.</t>
      </section>
      <section anchor="rtt">
        <name>Getting good RTT estimates</name>
        <t>Since pacing algorithms generally attempt to spread out packets evenly across an RTT, it is important to have a good RTT estimate. Especially in the beginning of a transfer, when sending the initial window, the only RTT estimate available may be from the connection establishment handshake. Being based on only one sample, this is a very unreliable estimate. Moreover, a new transport connection may be preceded by a longer period of quiescence on the path between two endpoints than there  might normally occur when a connection is active. Such a silence period can provoke behavior of lower layers that increases the RTT. For example, idle periods commonly cause a handshake procedure on 5G links before communication can continue, inflating the RTT.</t>
        <t>Thus, using this sample to pace the initial window can cause the pacing rate to become unnecessarily low. Accordingly, the Linux TCP implementation does not pace the first 10 packets (see <xref target="linux"/>). As a possible improvement, the initial RTT estimate could also be based on a previous connection (temporal sharing) or on another ongoing connection (ensemble sharing) <xref target="RFC9040"/>.</t>
        <t>Since having an accurate RTT estimate is important for pacing also after the initial round trip, delayed ACKs can be detrimental to pacing in two ways: first, by potentially reducing the number of ACKs, they can reduce the sampling frequency. Second, by adding delay to the transmission of ACKs, they can worsen the quality of the signal. Here, QUIC has a benefit over TCP: since a host reports the local delay between data reception and generation of the corresponding ACK, QUIC's RTT calculation can be more precise <xref target="RFC9000"/>.</t>
      </section>
      <section anchor="mini-bursts-and-their-trade-offs">
        <name>Mini-bursts and their trade-offs</name>
        <t>Generally, hardware can perform better on large blocks of data than on multiple
small data blocks (fewer copy operations). Hardware offload capabilities such
as TCP Segment Offload (TSO) and Generic Segmentation Offload (GSO) are
popularly used in cases with high data rates or volumes (e.g., datacenters,
hyperscaler servers, etc.) and important to efficiency in compute and power
budgets.  When using TSO and GSO efficiently, there will be large writes
between software and hardware.  Since the hardware itself does not typically
perform pacing, this results in burstiness, or if the sending software is
trying to perform pacing, it could defeat the goal of efficiently using the
offload hardware.  A strategy to work with this is to avoid pacing every single
packet, but instead pace such that a pause is introduced between batches of
some packets that are sent as a mini-burst. Such a strategy is implemented in
Linux, for example.</t>
        <t>At the receiving side, offload techniques like Large Receive Offload (LRO),
Generic Receive Offload (GRO), interrupt coalescing, and other features may
also be impacted by pacing.  Paced packets reduce the ability to group
together incoming packets for upper layer processing, but
end systems may be tuned to handle incoming mini-bursts and maintain some efficiency.</t>
        <t>Clearly, the size of mini-bursts embeds some trade-offs. Even mini-bursts that are very short in terms of time when they leave the sender may cause significant delay further away on an Internet path, where the link capacity is smaller. For example, consider a server that is connected to a 100 Gbps link, serving a client that is behind a 15 Mbps bottleneck link. If that server emits bursts that are 50 kbyte long, the duration of these bursts at the server-side link is negligible (4.1 microseconds). When they reach the bottleneck, however, their duration becomes as large as 27.3 milliseconds. This is an argument for minimizing the size of mini-bursts. On the other hand, wireless link layers such as WiFi or 5G can benefit from having more than one packet available at the local send buffer, to make use of frame aggregation methods. This can significantly reduce overhead, and allow a wireless sender to make better use of its transmission opportunity; eliminating these benefits with pacing may in some cases be counter-productive. This is an argument for making the size of mini-bursts larger.</t>
        <t>Without pacing, increasing cwnd by the number of acknowledged bytes in slow start can cause large mini-bursts when a single ACK acknowledges multiple segments worth of data. This increase is therefore recommended to be upper-bound with one SMSS in <xref target="RFC5681"/>. With pacing, the earlier discussed trade-offs for mini-bursts apply, and such a slow start limitation may not be necessary. Accordingly, HyStart++ <xref target="RFC9406"/>, which CUBIC implementations should use according to <xref target="RFC9406"/>, specifies that no such limit should be applied ("L=infinity").</t>
      </section>
      <section anchor="appcontrol">
        <name>Application control</name>
        <t>When an application produces data at a certain (known) bitrate, it can be beneficial to make use of pacing to
limit the transport bitrate on this basis such that it is not exceedingly large. The Linux, FreeBSD, and Apple OS
applications allow the application to set an upper limit.</t>
        <t>For example, frame based video transmission typically generates data chunks at a varying size at regular intervals.
Such an application could request a data chunk to be transmitted at a lower rate, taking up a larger fraction of
such an interval. This would
allow a more sustained data transmission at a lower rate than a transport protocol's congestion control
might choose, rather than using a shorter time period within the interval with a high rate. This has
the benefit that queue growth is less likely, i.e. this form of pacing can reduce latency.</t>
        <t>Spreading over the interval from one video chunk to the next needs to be done with some caution;
"ideally" spreading data across the
entire interval risks that some of data will not arrive in time, e.g., when delays are introduced
by other traffic. SCReAM and SAMMY pace packets at a somewhat higher rate (50% in case of SCReAM)
to reduce this risk <xref target="I-D.draft-johansson-ccwg-rfc8298bis-screamv2-03"/>, <xref target="Sammy"/>.</t>
      </section>
    </section>
    <section anchor="implementation">
      <name>Implementation examples</name>
      <section anchor="linux">
        <name>Linux TCP</name>
        <t>Pacing was first implemented in Linux kernel version 3.12 in 2013. The following description is based on Linux kernel version 6.12.</t>
        <t>There are two ways to enable pacing in Linux: 1) via a socket option, 2) by configuring the FQ queue discipline. We describe case 1.</t>
        <t>Independent of the value of the Initial Window (IW), the first 10 (hardcoded) packets are not paced. Later, 10 packets will generally be sent without pacing every 2^32 packets.</t>
        <t>Every time an ACK arrives, a pacing rate is calculated, as: factor * MSS * cwnd / SRTT, where "factor" is a configurable value that, by default, is 2 in slow start and 1.2 in congestion avoidance. MSS is the sender maximum segment size <xref target="RFC5681"/>, and SRTT is the smoothed round-trip time <xref target="RFC6298"/>.
The sender transmits data in line with the calculated pacing rate; this is approximated by calculating the rate per millisecond, and generally sending the resulting amount of data per millisecond as a small burst, every millisecond. As an exception, the per-millisecond amount of data can be a little larger when the peer is very close, depending on a configurable value (per default, when the minimum RTT is less than 3 milliseconds).</t>
        <t>If the pacing rate is smaller than 2 packets per millisecond, these bursts will become 2 packets in size, and they will not be sent every millisecond but with a varying time delay (depending on the pacing rate).
If the pacing rate is larger than 64 Kbyte per millisecond, these bursts will be 64 Kbyte in size, and they will not be sent every millisecond but with a varying time delay (depending on the pacing rate).
Bursts can always be smaller than described above, or be "nothing", if a limiting factor such as the receiver window (rwnd) <xref target="RFC5681"/> or the current cwnd disallows transmission.
If the previous packet was not sent when expected by the pacing logic, but more than half of a pacing gap ago (e.g., due to a cwnd limitation), the pacing gap is halved.</t>
        <t>This description is based on the longer Linux pacing analysis text in <xref target="LinuxPacing"/>.</t>
      </section>
      <section anchor="apple-oses">
        <name>Apple OSes</name>
        <t>Starting with iOS 27 and macOS 27, an application can enable pacing on a TCP connection, and set the maximum pacing rate, through two equivalent APIs.</t>
        <t>The Network.framework public API has the following C function:</t>
        <artwork><![CDATA[
int nw_tcp_set_max_pacing_rate(nw_protocol_metadata_t metadata,
                               uint64_t max_pacing_rate);
]]></artwork>
        <t>and a corresponding Swift overlay on <tt>NWProtocolTCP.Metadata</tt>:</t>
        <artwork><![CDATA[
func setMaximumPacingRateBytesPerSecond(_ maximumPacingRateBytesPerSecond: UInt64?)
]]></artwork>
        <t>For applications using the BSD sockets API, the same cap is exposed as the socket-level <tt>SO_MAX_PACING_RATE</tt> option, taking a <tt>uint64_t</tt> rate in bytes per second and supported on <tt>AF_INET</tt> and <tt>AF_INET6</tt> sockets:</t>
        <artwork><![CDATA[
uint64_t rate = 2 * 1024 * 1024;  /* 2 MB/s */
setsockopt(fd, SOL_SOCKET, SO_MAX_PACING_RATE, &rate, sizeof(rate));
]]></artwork>
        <t>The same option may be read back with <tt>getsockopt</tt>.</t>
        <t>In all cases, the value supplied is an upper bound, in bytes per second, on the on-wire rate of a single connection. The actual pacing rate used by the TCP stack is the minimum of (a) this cap and (b) the rate calculated by the transport protocol. The cap can therefore only reduce the on-wire rate, and never raise it above what congestion control allows -- it is exactly the "upper limit" form of application control discussed in <xref target="appcontrol"/>.</t>
        <t>Passing 0 or UINT64_MAX in C, or <tt>nil</tt> in Swift, disables pacing on that connection; the stack then sends as congestion and flow control allow. The cap may be changed at any time during the lifetime of an established connection, and each call replaces the previous value.</t>
        <t>Caps strictly between 0 and 12500 bytes/second (i.e. below 100 Kbps) are silently clamped up to 12500 bytes/second. Applications that need a genuinely lower cap have to shape at the application layer.</t>
        <section anchor="rate-computation-and-packet-scheduling">
          <name>Rate computation and packet scheduling</name>
          <t>On every cwnd update the kernel recomputes a target rate as <tt>cwnd / SRTT</tt> in bytes per second, doubled while the sender is in slow start so that pacing does not throttle the exponential cwnd growth. The application cap, if set, is then applied: the effective pacing rate is the minimum of the computed rate and the cap. The stack then derives a burst budget of roughly 244 µs of data, with a minimum of one MSS.</t>
          <t>Packets are assigned transmit timestamps using a leaky-bucket scheme: consecutive packets share a timestamp while their cumulative size stays within the current burst budget, and once the budget is exhausted the next timestamp is advanced by <tt>budget / rate</tt>. The timestamp is then carried with the packet(s) into the per-interface AQM, which holds the packet in its per-flow queue until the wall clock reaches that timestamp before transmitting it.</t>
        </section>
      </section>
      <section anchor="freebsd">
        <name>FreeBSD</name>
        <t>FreeBSD has the infrastructure to support multiple TCP stacks.
Each TCP stack has a <tt>tcp_output()</tt> function, which handles most of the sending of TCP segments.
The default stack does not support pacing and its <tt>tcp_output()</tt> may be called whenever</t>
        <ol spacing="normal" type="1"><li>
            <t>a TCP segment is received or</t>
          </li>
          <li>
            <t>a TCP timer (like the retransmission or delayed ACK timer) runs off or</t>
          </li>
          <li>
            <t>the application provides new data to be sent</t>
          </li>
        </ol>
        <t>and sends as many TCP segments as is allowed by the congestion and flow control resulting in burst of TCP segments.
However, this also allows to make use of TCP Segment Offload (TSO), which reduces the CPU load.</t>
        <t>The RACK <xref target="RACK"/> and BBR stacks both support pacing by leveraging the TCP High Precision Timer System (HPTS) <xref target="HPTS"/>, which is a kernel loadable module available in FreeBSD 14 and higher.
The <tt>tcp_output()</tt> function of a TCP stack which supports pacing will not send as much as is allowed by congestion and flow control, but may only send a micro burst and schedule itself for being called after the inter-burst send time using the HPTS.
The RACK stack supports an application setting a pacing rate and a maximum burst size using TCP socket options.
The RACK stack then uses these values to compute the actual micro burst size and the inter-burst send time.</t>
        <t>The following <tt>IPPROTO_TCP</tt>-level socket options are used to control static pacing:</t>
        <table anchor="socket-options-table">
          <name>Socket Options</name>
          <thead>
            <tr>
              <th align="left">Option Name</th>
              <th align="left">Data Type</th>
              <th align="left">Semantic</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>TCP_RACK_PACE_RATE_SS</tt></td>
              <td align="left">
                <tt>uint64_t</tt></td>
              <td align="left">Pace rate in B/s during slow start</td>
            </tr>
            <tr>
              <td align="left">
                <tt>TCP_RACK_PACE_RATE_CA</tt></td>
              <td align="left">
                <tt>uint64_t</tt></td>
              <td align="left">Pace rate in B/s during congestion avoidance</td>
            </tr>
            <tr>
              <td align="left">
                <tt>TCP_RACK_PACE_RATE_REC</tt></td>
              <td align="left">
                <tt>uint64_t</tt></td>
              <td align="left">Pace rate in B/s during recovery</td>
            </tr>
            <tr>
              <td align="left">
                <tt>TCP_RACK_PACE_ALWAYS</tt></td>
              <td align="left">
                <tt>int</tt></td>
              <td align="left">Enable/Disable pacing</td>
            </tr>
            <tr>
              <td align="left">
                <tt>TCP_RACK_PACE_MAX_SEG</tt></td>
              <td align="left">
                <tt>int</tt></td>
              <td align="left">Micro burst size in number of full sized segments</td>
            </tr>
          </tbody>
        </table>
        <t>The first three options can be used to control the pace rate in B/s.
It is possible to specify individual pace rates for slow start, congestion avoidance,
and recovery.
When initializing one of the three pace rates, the other two pace rates are also
initialized to the same rate.
These pacing rates limit the maximum sending rate.
The congestion control and the flow control are always honored.
With the fourth socket option static pacing can be enabled and disabled.
The last socket option allows to control the size of the micro burst in
full sized segments. Its default value is 40.</t>
        <t>The following <tt>packetdrill</tt>-script illustrates the behaviour of a sender
using a pace rate of 1200000 b/s and a micro burst size of 4 full sized segments.
<tt>packetdrill</tt> is available in the FreeBSD ports collection.
Please note that 1200000 b/s correspond to 150000 B/s.
Since FreeBSD takes the size of the IP packet into account this corresponds
to 100 full sized segments per second on a path with an MTU of 1500 bytes.
This means sending a full sized segment every 10 ms or sending a micro burst
of 4 full sized segments every 40 ms.
The script uses a round trip time of 100 ms.
Please note that this behaviour is specific for the RACK stack;
the FreeBSD default stack does not support pacing.</t>
        <artwork><![CDATA[
--ip_version=ipv4

 0.000 `kldload -n tcp_rack`
+0.000 `kldload -n cc_newreno`
+0.000 `sysctl kern.timecounter.alloweddeviation=0`

+0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0.000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0.000 setsockopt(3, IPPROTO_TCP, TCP_FUNCTION_BLK, {function_set_name="rack",
                                                     pcbcnt=0}, 36) = 0
+0.000 setsockopt(3, IPPROTO_TCP, TCP_CONGESTION, "newreno", 8) = 0
+0.000 bind(3, ..., ...) = 0
+0.000 listen(3, 1) = 0
+0.000 < S      0:0(0)                  win 65535 <mss 1460,sackOK,eol,eol>
+0.000 > S.     0:0(0)        ack     1 win 65535 <mss 1460,sackOK,eol,eol>
+0.100 <  .     1:1(0)        ack     1 win 65535
+0.000 accept(3, ..., ...) = 4
+0.000 close(3) = 0
+0.000 setsockopt(4, IPPROTO_TCP, TCP_LOG, [TCP_LOG_STATE_CONTINUAL], 4) = 0
+0.000 setsockopt(4, IPPROTO_TCP, TCP_RACK_PACE_RATE_SS, [150000], 8) = 0
+0.000 setsockopt(4, IPPROTO_TCP, TCP_RACK_PACE_MAX_SEG, [4], 4) = 0
+0.000 setsockopt(4, IPPROTO_TCP, TCP_RACK_PACE_ALWAYS, [1], 4) = 0
// Provide user data for 10 full sized segments to the TCP stack.
+1.000 send(4, ..., 14600, 0) = 14600
// Send the first micro burst of 4 full sized segments.
+0.000 >  .     1:1461(1460)  ack     1 win 65535
+0.000 >  .  1461:2921(1460)  ack     1 win 65535
+0.000 >  .  2921:4381(1460)  ack     1 win 65535
+0.000 >  .  4381:5841(1460)  ack     1 win 65535
// Send the second micro burst of 4 full sized segments.
+0.040 >  .  5841:7301(1460)  ack     1 win 65535
+0.000 >  .  7301:8761(1460)  ack     1 win 65535
+0.000 >  .  8761:10221(1460) ack     1 win 65535
+0.000 >  . 10221:11681(1460) ack     1 win 65535
// Send the third micro burst of the remaining 2 full sized segments.
+0.040 >  . 11681:13141(1460) ack     1 win 65535
+0.000 > P. 13141:14601(1460) ack     1 win 65535
+0.020 <  .     1:1(0)        ack  2921 win 65535
+0.000 <  .     1:1(0)        ack  5841 win 65535
+0.040 <  .     1:1(0)        ack  8761 win 65535
+0.000 <  .     1:1(0)        ack 11681 win 65535
+0.040 <  .     1:1(0)        ack 14601 win 65535
+0.000 close(4) = 0
+0.000 > F. 14601:14601(0)    ack     1 win 65535
+0.100 < F.     1:1(0)        ack 14602 win 65535
+0.000 >  . 14602:14602(0)    ack     2
]]></artwork>
        <t>The HPTS is optimized for handling a large number of TCP connections and the <tt>tcp_output()</tt> function of the RACK stack is also optimized for being called more often than the <tt>tcp_output()</tt> function of the default stack.
This allows to use TSO in combination with TCP pacing.</t>
        <t>This subsystem underpins recently published research by Netflix and Stanford into application-informed pacing at scale <xref target="Sammy"/>.</t>
      </section>
      <section anchor="quic-bbr-implementations">
        <name>QUIC BBR implementations</name>
        <t>Pacing capability is expected in QUIC senders.  While standard QUIC congestion control <xref target="RFC9002"/> is based on TCP Reno, which is not defined to include pacing (but also does not prohibit it), QUIC congestion control requires either pacing or some other burst limitation (<xref section="7.7" sectionFormat="of" target="RFC9002"/>).  RFC 9002 does not require a specific approach or set of parameters for pacing, leaving endpoints to implement pacing as they choose.  BBR congestion control implementations are common in QUIC stacks, and pacing is integral to BBR, so this document focuses on it, though the same methods are applicable for congestion control based on RFC 9002.</t>
        <t>Pacing in QUIC stacks can rely on one or more of:</t>
        <ol spacing="normal" type="1"><li>
            <t>Access to lower-level (e.g., OS and hardware) capabilities needed for effective pacing.</t>
          </li>
          <li>
            <t>Managing additional timers related to pacing, along with those already needed for retransmission, and other events.</t>
          </li>
          <li>
            <t>Details of the actual pacing algorithm (e.g., granularity of bursts allowed, etc.).</t>
          </li>
        </ol>
        <t>Examples of different approaches to dealing with these challenges in ways that work on multiple operating systems and hardware platforms can be found in open source QUIC stacks, such as Google's QUIC implementation and Meta's "mvfst". These provide examples for some of the concepts discussed below.</t>
        <t>Unlike TCP implementations that typically run within the operating system kernel, QUIC implementations more typically run in user space and are thus faced with more challenges regarding timing and coupling with the underlying protocol stack and hardware needed to achieve pacing.  For instance, if an application trying to do pacing is running on a highly loaded system, it may often "wake up late" and miss the times that it intends to pace packets.  When available, QUIC implementations may choose to rely on operating system features that support pacing for outgoing UDP packets.</t>
        <t>Some operating systems, like Linux <xref target="linux"/>, can support pacing simply through use of an FQ queue discipline applied for outgoing QUIC packets.  However, since multiple QUIC connections can share a socket, this should be carefully applied.  Linux also includes an "SO_TXTIME" option that allows a per-packet transmission time to be specified, however, this may not be compatible with simultaneous use of GSO.  Effectiveness of different OS capabilities for pacing has been evaluated with multiple QUIC stacks <xref target="QuicSteps"/>.</t>
        <t>To support cases where operating systems mechanisms are not available or sufficient alone, QUIC stacks may include their own pacing logic.  When a large amount of data needs to be sent, pacing naively could result in an excessive number of timers to be managed and adjusted along with all of the other timers that the QUIC stack and rest of the application require.  The Hashed Hierarchical Timing Wheel <xref target="VL87"/> provides one approach for such cases, but implementations may also simply schedule the next send event based on the current pacing rate, and then schedule subsequent events as needed, rather than adjusting timers for them.  In any case, typically a pacing algorithm should allow for some amount of burstiness, in order to efficiently use the hardware as well as to be responsive for bursty (but low overall rate) applications, and to avoid excessive timer management.</t>
        <t>Pacing can be done based on different approaches such as a token-based or tokenless algorithm.  For instance, a tokenless algorithm (e.g., as used in mvfst) might compute a regular interval time and batch size (number of packets) to be released every interval and achieve the pacing rate.  This allows specific future transmissions to be scheduled.  In contrast, a token-based algorithm accumulates tokens to permit transmission based on the pacing rate, using a "leaky bucket" to control bursts.  In this case the size of bursts may be more granular, depending on how much time has elapsed between evaluations.</t>
        <t>The additional notion of "burst tokens" (or other burst allowance) may be present in order to rapidly transmit data if coming out of a quiescent period (e.g., when a flow has been application-limited without data to send, e.g., as used in Google's implementation).  A number of burst tokens, representing packets that can be sent unpaced, is initialized to some value (e.g., 10) when a flow starts or becomes quiescent.  If burst tokens are available, outgoing packets are sent immediately, without pacing, up to the limit permitted by the congestion window, and the burst tokens are depleted by each packet sent.  The number of burst tokens is reduced to zero on congestion events.  When coming out of quiescence, it is set to the minimum of the initial burst size, or the amount of packets that the congestion window (in bytes) represents.</t>
        <t>There may be additional "lumpy tokens" that further allow unpaced packets after the burst tokens have been consumed, and the congestion window does not limit sending.  The amount of lumpy tokens that might be present is determined using heuristics, generally limiting to a small number of packets (e.g., 1 or 2).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>While congestion control designs, including aspects such as pacing, could result in unwanted competing traffic, they do not directly result in new security considerations.</t>
      <t>Transport protocols that provide authentication (including those using encryption), or are carried over protocols that provide authentication, can protect their congestion control algorithm from network attack. This is orthogonal to the congestion control rules.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="I-D.draft-many-tiptop-usecase">
          <front>
            <title>IP in Deep Space: Key Characteristics, Use Cases and Requirements</title>
            <author fullname="Marc Blanchet" initials="M." surname="Blanchet">
              <organization>Viagenie</organization>
            </author>
            <author fullname="Wesley Eddy" initials="W." surname="Eddy">
              <organization>MTI Systems</organization>
            </author>
            <author fullname="Marshall Eubanks" initials="M." surname="Eubanks">
              <organization>Space Initiatives Inc</organization>
            </author>
            <date day="18" month="June" year="2025"/>
            <abstract>
              <t>   Deep space communications involve long delays (e.g., Earth to Mars
   has one-way delays 4-24 minutes) and intermittent communications,
   mainly because of orbital dynamics.  The IP protocol stack used on
   the Internet is based on the assumptions of shorter delays and mostly
   uninterrupted communications.  This document describes the key
   characteristics, use cases, and requirements for deep space
   networking, intended to help when profiling IP protocols in such
   environment.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-many-tiptop-usecase-03"/>
        </reference>
        <reference anchor="I-D.draft-johansson-ccwg-rfc8298bis-screamv2-03">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="Ingemar Johansson" initials="I." surname="Johansson">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Magnus Westerlund" initials="M." surname="Westerlund">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <date day="3" month="March" year="2025"/>
            <abstract>
              <t>   This memo describes Self-Clocked Rate Adaptation for Multimedia
   version 2 (SCReAMv2), an update to SCReAM congestion control for
   media streams such as RTP [RFC3550].  SCReAMv2 includes several
   algorithm simplifications and adds support for L4S.  The algorithm
   supports handling of multiple media streams, typical use cases are
   streaming for remote control, AR and 3D VR googles.  This
   specification obsoletes RFC 8298.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-03"/>
        </reference>
        <reference anchor="VL87">
          <front>
            <title>Hashed and hierarchical timing wheels: data structures for the efficient implementation of a timer facility</title>
            <author initials="G." surname="Varghese">
              <organization/>
            </author>
            <author initials="T." surname="Tauck">
              <organization/>
            </author>
            <date year="1987" month="November" day="01"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/37499.37504"/>
        </reference>
        <reference anchor="Sammy" target="https://doi.org/10.1145/3603269.3604839">
          <front>
            <title>Sammy: Smoothing Video Traffic to be a Friendly Internet Neighbor</title>
            <author initials="B." surname="Spang" fullname="Bruce Spang">
              <organization/>
            </author>
            <author initials="S." surname="Kunamalla" fullname="Shravya Kunamalla">
              <organization/>
            </author>
            <author initials="R." surname="Teixeira" fullname="Renata Teixeira">
              <organization/>
            </author>
            <author initials="T." surname="Huang" fullname="Te-Yuan Huang">
              <organization/>
            </author>
            <author initials="G." surname="Armitage" fullname="Grenville Armitage">
              <organization/>
            </author>
            <author initials="R." surname="Johari" fullname="Ramesh Johari">
              <organization/>
            </author>
            <author initials="N." surname="McKeown" fullname="Nick McKeown">
              <organization/>
            </author>
            <date year="2023" month="September" day="01"/>
          </front>
          <seriesInfo name="ACM SIGCOMM '23: Proceedings of the ACM SIGCOMM 2023 Conference" value=""/>
        </reference>
        <reference anchor="RACK" target="https://freebsdfoundation.org/our-work/journal/browser-based-edition/networking-10th-anniversary/rack-and-alternate-tcp-stacks-for-freebsd/">
          <front>
            <title>RACK and Alternate TCP Stacks for FreeBSD</title>
            <author initials="R." surname="Stewart" fullname="Randall Stewart">
              <organization/>
            </author>
            <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
              <organization/>
            </author>
            <date year="2024" month="February"/>
          </front>
          <seriesInfo name="FreeBSD Journal (January/February 2024)" value=""/>
        </reference>
        <reference anchor="HPTS" target="https://freebsdfoundation.org/wp-content/uploads/2024/11/stewart-adventures.pdf">
          <front>
            <title>Pacing in the FreeBSD TCP Stack</title>
            <author initials="R." surname="Stewart" fullname="Randall Stewart">
              <organization/>
            </author>
            <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
              <organization/>
            </author>
            <date year="2024" month="October"/>
          </front>
          <seriesInfo name="FreeBSD Journal" value=""/>
        </reference>
        <reference anchor="HPTSCode" target="https://github.com/freebsd/freebsd-src/blob/main/sys/netinet/tcp_hpts.c#L31-L99">
          <front>
            <title>tcp_hpts.c</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="October"/>
          </front>
        </reference>
        <reference anchor="LinuxPacing" target="https://folk.universitetetioslo.no/michawe/research/publications/icnc2025-pacing.pdf">
          <front>
            <title>TCP Pacing in the Linux Kernel</title>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2025" month="February" day="17"/>
          </front>
          <seriesInfo name="IEEE ICNC 2025" value=""/>
        </reference>
        <reference anchor="UnderstandingPacing" target="https://doi.org/10.1109/INFCOM.2000.832483">
          <front>
            <title>Understanding the performance of TCP pacing</title>
            <author initials="A." surname="Aggarwal" fullname="Amit Aggarwal">
              <organization/>
            </author>
            <author initials="S." surname="Savage" fullname="Stefan Savage">
              <organization/>
            </author>
            <author initials="T." surname="Anderson" fullname="Thomas Anderson">
              <organization/>
            </author>
            <date year="2000" month="March"/>
          </front>
          <seriesInfo name="IEEE Infocom 2000" value=""/>
        </reference>
        <reference anchor="QuicSteps" target="https://doi.org/10.1145/3730985">
          <front>
            <title>QUIC Steps: Evaluating Pacing Strategies in QUIC Implementations</title>
            <author initials="M." surname="Kempf" fullname="Marcel Kempf">
              <organization/>
            </author>
            <author initials="S." surname="Tietz" fullname="Simon Tietz">
              <organization/>
            </author>
            <author initials="B." surname="Jaeger" fullname="Benedikt Jaeger">
              <organization/>
            </author>
            <author initials="J." surname="Spath" fullname="Johannes Spath">
              <organization/>
            </author>
            <author initials="G." surname="Carle" fullname="Georg Carle">
              <organization/>
            </author>
            <author initials="J." surname="Zirngibl" fullname="Johnnes Zirngibl">
              <organization/>
            </author>
            <date year="2025" month="June"/>
          </front>
          <seriesInfo name="Proceedings of the ACM on Networking" value=""/>
        </reference>
        <reference anchor="I-D.ietf-ccwg-bbr">
          <front>
            <title>BBR Congestion Control</title>
            <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Joseph Beshay" initials="J." surname="Beshay">
              <organization>Meta</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <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 [RFC5681] or CUBIC [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 [RFC9293] and QUIC [RFC9000].  This document specifies
   version 3 of the BBR algorithm, BBRv3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-06"/>
        </reference>
        <reference anchor="RFC7567">
          <front>
            <title>IETF Recommendations Regarding Active Queue Management</title>
            <author fullname="F. Baker" initials="F." role="editor" surname="Baker"/>
            <author fullname="G. Fairhurst" initials="G." role="editor" surname="Fairhurst"/>
            <date month="July" year="2015"/>
            <abstract>
              <t>This memo presents recommendations to the Internet community concerning measures to improve and preserve Internet performance. It presents a strong recommendation for testing, standardization, and widespread deployment of active queue management (AQM) in network devices to improve the performance of today's Internet. It also urges a concerted effort of research, measurement, and ultimate deployment of AQM mechanisms to protect the Internet from flows that are not sufficiently responsive to congestion notification.</t>
              <t>Based on 15 years of experience and new research, this document replaces the recommendations of RFC 2309.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="197"/>
          <seriesInfo name="RFC" value="7567"/>
          <seriesInfo name="DOI" value="10.17487/RFC7567"/>
        </reference>
        <reference anchor="RFC8087">
          <front>
            <title>The Benefits of Using Explicit Congestion Notification (ECN)</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <date month="March" year="2017"/>
            <abstract>
              <t>The goal of this document is to describe the potential benefits of applications using a transport that enables Explicit Congestion Notification (ECN). The document outlines the principal gains in terms of increased throughput, reduced delay, and other benefits when ECN is used over a network path that includes equipment that supports Congestion Experienced (CE) marking. It also discusses challenges for successful deployment of ECN. It does not propose new algorithms to use ECN nor does it describe the details of implementation of ECN in endpoint devices (Internet hosts), routers, or other network devices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8087"/>
          <seriesInfo name="DOI" value="10.17487/RFC8087"/>
        </reference>
        <reference anchor="RFC9040">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>This memo provides guidance to TCP implementers that is intended to help improve connection convergence to steady-state operation without affecting interoperability. It updates and replaces RFC 2140's description of sharing TCP state, as typically represented in TCP Control Blocks, among similar concurrent or consecutive connections.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9040"/>
          <seriesInfo name="DOI" value="10.17487/RFC9040"/>
        </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="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="RFC9406">
          <front>
            <title>HyStart++: Modified Slow Start for TCP</title>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="Y. Huang" initials="Y." surname="Huang"/>
            <author fullname="M. Olson" initials="M." surname="Olson"/>
            <date month="May" year="2023"/>
            <abstract>
              <t>This document describes HyStart++, a simple modification to the slow start phase of congestion control algorithms. Slow start can overshoot the ideal send rate in many cases, causing high packet loss and poor performance. HyStart++ uses increase in round-trip delay as a heuristic to find an exit point before possible overshoot. It also adds a mitigation to prevent jitter from causing premature slow start exit.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9406"/>
          <seriesInfo name="DOI" value="10.17487/RFC9406"/>
        </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>
      </references>
    </references>
    <?line 596?>

<!-- # Acknowledgments
{:numbered="false"}

TODO acknowledge. Note, numbered sections shouldn't appear
after an unnumbered one - so either move this last, or take
the numbering rule out. -->

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank Grenville Armitage, Gorry Fairhurst, Ingemar Johansson, Nicolas Kuhn and Eduard Vasilenko for suggesting improvements to this document.</t>
    </section>
    <section numbered="false" anchor="change-log">
      <name>Change Log</name>
      <ul spacing="normal">
        <li>
          <t>-00 was the first individual submission for feedback by ICCRG.</t>
        </li>
        <li>
          <t>-01 adds Michael Tuexen as new co-author, and adds the following new descriptions:
          </t>
          <ul spacing="normal">
            <li>
              <t>a first version of text for Apple OSes</t>
            </li>
            <li>
              <t>a first version of text for FreeBSD</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-02 adds a reference for Linux pacing, removes a comment on Linux SRTT calculation ("TODO check": it was checked, nothing to change), adds more discussion text:
          </t>
          <ul spacing="normal">
            <li>
              <t>queue dynamics / AQM interactions</t>
            </li>
            <li>
              <t>initial RTT calculation, thanks to Ingemar Johansson</t>
            </li>
            <li>
              <t>mini-bursts and their trade-offs, thanks to Eduard Vasilenko</t>
            </li>
            <li>
              <t>... and now we also have an ACK section for such thanks</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-03:
          </t>
          <ul spacing="normal">
            <li>
              <t>re-structures the parts on general considerations and adds more text in them</t>
            </li>
            <li>
              <t>elaborates on application control</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Adopted version draft-irtf-iccrg-00:
          </t>
          <ul spacing="normal">
            <li>
              <t>adds a reference to the "Understanding the performance of TCP pacing" paper and discusses it in the "Motivations for pacing" section</t>
            </li>
            <li>
              <t>adds an example for the double-loss-after-slow start problem in section 4.1</t>
            </li>
            <li>
              <t>extends the FreeBSD text</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-01:
          </t>
          <ul spacing="normal">
            <li>
              <t>improves the FreeBSD text</t>
            </li>
            <li>
              <t>adds a discussion of the ABC limit in slow start</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-02:
          </t>
          <ul spacing="normal">
            <li>
              <t>Extended the Apple OSes description</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-03:
          </t>
          <ul spacing="normal">
            <li>
              <t>fixing nits, and a bit of text on how DelACKs can harm RTT estimation</t>
            </li>
          </ul>
        </li>
        <li>
          <t>-04:
          </t>
          <ul spacing="normal">
            <li>
              <t>addressing comment from Gorry Fairhurst: primarily editorial, some details in the QUIC section.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
aLzE2l12o+mErivGulwVDwTHa0XE2qiV7SVTQxljSzPoDqwKxANnUSBrh00+
1gZACun5Rbz3WP2AE/6jt6bD+xxo2yoj11TDoJRTLFIjFpJl7gEJYfOaG4ZA
8l8apL8D/kfvTitNp9ReJgM2WKRyhdv+4hmOQNUtLeTY5egeRtE//vGPiNS9
OL/9hLbJtJJPtIpPsoJPWME2fWV1+U9LUydgiJ/q2P7ac91Zv/CvofEfHeCN
9sA7P/DsXMyadOJXF7fpTOJlmXgnr67efrS32RAIB2c6+9WVbgJ7AiDPBIaC
yvc0zXP4P96ZUqJ+258slL/0xGH84RQL/t2OLA82YaePgZVLaKstilYFWPds
xJHLVGLOkV8VFTcbk6/42X5GTCajHV2cfzo7+tdP746OT9+++vT+6PLk6spp
bGrEJfScBSB9qxlc6tSR7j4ir9ixwV4sof2rq6OXn07fnlzSW/jS/f2IPtBF
K+gcgnj0Z8T9vyclbO9Af/wQx7vf04dnz3er+PvdiICM92mh2zNiuRfnbz5d
nB//dHKJ37s76sX/XcgYjLeYbTPiLeYvLbhk09YHz0ktyOSTw3Z1NXczXl1J
2ZT0WXNV4CJOsX92jKRBk1L2LfU2wcxnceV9uA1dOYhzfvlzqsW3E/TvbEmm
ML2S85TRGMlqXlaQ05jb3PaVdc0V42N7vON1oUChsgnia3a0LAGvtzsrcI5G
EB8JdyPsJYdQo78R6EVGJ8RMzPbZxrpWFgjoRVkLCSeceIihtwJvyZazkpMN
LqdOKl3YeGMAw0raNwwhlT6cvr0k6iO6wbPHLP+urvI0IzqlD5gT9FhUcRaj
56W17kBRJG28BP61zUuqut2DCBwz6bUUbNeDVilQuu+IayVXKyIo1srSmdH+
a6xK2kwlM11j7RwJgJsIUf4smWjujROtTLmIGaGotEJLnDrzkf+hmAh7rqpx
V487lynQY9gKgik/jVfVjkQOkRyEMSZZwt1GGm5atj7GIG41PBaPI6oHEmjh
xBOM5M1wr7GVpkgXyCNZOfd+iHoOIWjxzHtJbkHMOnFwt42aXHuJKDrPVeFi
md+spon2XVNbmB3GCHxDr5e23NrutyIaCewyoZX1Ey5N4FCymWatyFjadYlX
RRz2J/WxbRK/rPKzy5n4ea5d03h2Te8T7tAS/ivW2yojll/tuuGYqRSMm9lM
+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
pTf2vs6XQCTrc3ztDWCu88bB198AHn7VHAyPXzUHQ2J9DmGgbSbzY/xyIM8r
/GSkL8BP+PrLr8279yVqwnc8x15njj0fLYV3BvoSTIAlkwhYFntY1QHP+fze
xmynG/g+Nl91bLUVMNcLoj1py7/EaR7FrOYMJm2i8otTtHQ5VWO9UQPfI+oZ
pfpxzAUZ9hoEf+GwTQGpmrF2jG9gcazQkA7OXQ6FcToEh+fsxcjwur019SxL
P0u+XJ3ktKmpKu3exdXH7bHo+eDczohrJJnppJs+kHpf+DY7uf8uj9TVqN5p
aoCkzqR6da82UueCTkRC+OanhJbE324wRO/vpWR3T5rEuKwXAAe3OgV+UKjI
cpcT2zS2AbluaRsuRsawr3svi0U6RgS43ul9cQXayq6y93/a2KxeCyD2uvC5
oMRimyCn5emPB49BDG4faC9Pf8T4yy/Gd8xzZgJnGCIawXaMXlOJ9BfuMOML
1PkOC65XCnowFB5FDquV5INJQjqtAojcsONuXYdvLOLxyK5t17A6le5n7nY+
mp3G7km8MQ2uqZvRLzClMBT3DHAdodiNoVVR4mkQ+oSpO9t80bAjBgvNgb9u
rbVOTW7nFhr2Jhs9zNqTfCKXGxQSC1b3qOZsnV+0qoV32nXYiCb7a9ha0c4B
R1u4awyDfzpNbU8jvpstthchBVdSJXxThMbbClTSaFvNYJ52pCasPOXbV5Ex
tT+IX3AXencNdDutw3eu0U127pS1BUVi7dlrEaLoxCaYI7LqOjtaQjXuJpzU
b4LvMvD3SRFmJL8bNjLncQXl8bYAHh5ce2tFAPp4RfCS+3Fcm1kY5LhrYcXV
3U05MW0KtSmEr4pinpnvKvm20woDkyDZir7eWt7MqnqLI6KVsQEtn1k/cwff
hq35DtmwsRJnLBCwPuQcXFtvvWHjmq64pmzyMPDbhYIGeHqb1m67erXGSnPR
9+X6BPY7cYZiUyGz0gZ0+cUANShO1KKtdGmjj2T4r1roFNmTcY5o+6q0Nq6U
YNk9tEiNPxVyp4rcMTwxkvnZjrj4svhpEbAX2lnuUgzlliWOeRlb4NyzN9SJ
kN665fDeigtatiSRMa20Cz5iyrErxCLGlU83XGirN/xYp9uXMJBYphpzoYcy
mi4WXV241K60I4KgK1IjpLnJhxfv3Bqi6ILJrXsyelrIzjmfrkeLtOjqjM09
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

-->

</rfc>
