<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-welzl-iccrg-pacing-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Pacing in Transport Protocols">Pacing in Transport Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-welzl-iccrg-pacing-03"/>
    <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>MTI Systems</organization>
      <address>
        <postal>
          <street>25111 Country Club Blvd, Suite 295</street>
          <city>North Olmsted, OH 44070</city>
          <country>United States of America</country>
        </postal>
        <email>wes@mti-systems.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="2025" month="July" day="07"/>
    <area>IRTF</area>
    <workgroup>Internet Congestion Control</workgroup>
    <keyword>pacing</keyword>
    <keyword>congestion control</keyword>
    <abstract>
      <?line 153?>

<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-welzl-iccrg-pacing.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-welzl-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 158?>

<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 to send the same cwnd sized data but spread it across a round-trip time more evenly.</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 being back-to-back), loss can be more likely to happen than in a case where there are time gaps between packets (e.g., when they are spread out 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.cardwell-iccrg-bbr-congestion-control"/>.</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>There are 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 wind up
being aggregated beyond the normal delayed ACK recommendation, 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 in order to accomodate 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>We can distinguish between two reasons for packet losses that are due to congestion at a bottleneck with a DropTail (FIFO) queue:</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 to happen 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="backing-off-after-the-increase">
          <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>
        </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, incuring 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 to drop packets or mark them using Explicit Congestion Notification (ECN). 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. This may be the reason why 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>
      </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 hardware frames and 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 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>
      </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 and FreeBSD
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 spread over the 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 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-examples">
      <name>Implementation examples</name>
      <section anchor="linux">
        <name>Linux TCP</name>
        <t>The following description is based on Linux kernel version 6.8.9.</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>Pacing was added to Apple OS as a private API in iOS 17 and macOS 14. In its current form, an application or transport protocol computes and sets the desired transmit timestamp on a per packet basis and sends it to the pacing module in AQM. The packets are queued in the AQM until the current time becomes greater than or equal to corresponding packet's transmit timestamp. There is an upper limit of 3 seconds for how long the AQM will hold a queued packet before sending it.</t>
        <t>The above simplicity in the kernel allows upper layer protocols or applications to set a transmit timestamp in a manner that is suitable for them. For example, a stream based protocol like TCP might pace packets differently than a video conferencing app.</t>
      </section>
      <section anchor="freebsd">
        <name>FreeBSD</name>
        <t>FreeBSD has the infrastructure to support multiple TCP stacks.
Each TCP stack has a tcp_output() function, which handles most of the sending of TCP segments.
The default stack does not support pacing and its tcp_output() 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 tcp_output() 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 HPTS is optimized for handling a large number of TCP connections and the tcp_output() function of the RACK stack is also optimized for being called more often than the tcp_output() 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"/>).  BBR congestion control implementations are common in QUIC stacks, and pacing is integral to BBR, so this document focuses on it.</t>
        <t>Pacing in QUIC stacks commonly involves:</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.</t>
        <t>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="I-D.cardwell-iccrg-bbr-congestion-control">
          <front>
            <title>BBR Congestion Control</title>
            <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
              <organization>Google</organization>
            </author>
            <author fullname="Yuchung Cheng" initials="Y." surname="Cheng">
              <organization>Google</organization>
            </author>
            <author fullname="Soheil Hassas Yeganeh" initials="S. H." surname="Yeganeh">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Van Jacobson" initials="V." surname="Jacobson">
              <organization>Google</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <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 [RFC8312], 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 [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cardwell-iccrg-bbr-congestion-control-02"/>
        </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="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="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="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="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 427?>

<!-- # 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, Ingemar Johannson 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 Johannson</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>
            <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>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8196XIjyZHm/3yKGJatNdkLgEfdlFpqFuviqFisLrJVJlvb
HUtkBoAUE5lQHmRRZXqXfZD5tfNi65+7x5EJdKv1a1dj00UCkZERfn5+RHA6
nSZd0ZX21HxKs6JamqIyN01atZu66cynpu7qrC7bJJ3PG3v3z0ZlaWeXdfNw
SgMWdZLkdVala5o8b9JFN7235d/LaZFlzXK64YmmR4+Ttp+vi7Yt6qp72NDY
izc3b415ZNKyrU/NXlHldmPpP1W3NzF7Ni+6uinSEr9cnL2if+qGfvp883Yv
qfr13DanSU7rOE2yumpt1fbtqema3ia0/MdJ2tj01I2/r5vbZVP3G3xSdbap
bGfO62pp247Wgx+7pi73klv7QGPz08RMjawcP2VhZCYjkztb9fRqY37TtMbI
lvc+29amTbYy7/AYvlinRYndg1g/Fk23mNXNEl9gGH2x6rpNe3p4iHH4qLiz
s8LKsEN8cDhv6vvWHvIMeHBZdKt+To+umQ+HwpOYGxhVEunaLn4Bj57J07Oi
3vHc4S+xd7bq1rTNJO27Vd2ALFP6f0PSQTy5nJkveII/ETG5LLJVasvoc9rN
qfm5ot01bdE9mHphrtqy5u/arrGWlvrpyryqv5rjoxdH5lUJeWkqHpDRE6fm
6PHxMxOeyuqeqE+ff6yb+/SBP7NC7TVef29/LBbFrC/qWSVP9E1xakAOooYQ
I+0Oh3v5MjNv8vwh2soX25b2IXzKG7m8uTDXD21n1+1gBydPj4+PSSx4Zea8
7Oe0kbt8Yq77orPm5OXTaD+07m5lrso1zUNDrt6bJ0+Onh8NN0cko2/NdQd2
gmpna9sUWRpv9962P667YtrKimZZvU6G2/rzzLyrbcyhPxf5qggf8q7ONpvS
mosqmw02dVVZ/epT2tyaL0pr2cR5v7FNV1T1xJynZbGom6pIzcunR8dP/vWN
3GFR/7GkRf2Y4oU7dkLCdvNf//nVVjukLfpCuPRf/1kRRZqR3GEvBZaSFbbK
7JCD12T4LMlTmdMnadta8/hltN0nL54+e4pBZBf7phtu8Z1t1mk1kMSut7Sk
Hxer6bq3vJhZbpOkqmlkR4s6TRJY2PCbMZ/fnr88Ojrhny+mr2eik5h42hWb
rt5M+9ZmaWtHI/5ar8iQt3U1zbL75bRZZC9OXr6YF+20zchWru9OyEjTM/TQ
nz+8eH7Ky1Sfsfc+bVdEkrTKzaqwDRuiLC3p+zXcxP3K2pKoT/Y4Ban6rOsb
YiOt3HQra+xiUYCanSnWxLc1/ZSyhSRyp5iEmLAgS1ISEff4xcGS4H9T/VeZ
/G5m/pw2yxUZ090DbkgK0j675U/ZSZjjly+eT4+Pp0fHwk8SLtuCtu4dr68u
aNTR7Pj4ydPDx8+fvHw5e/z86dETEOQ6Xa8fhhSRj8z1uq67FWhAGmNreEvs
1XS1mVva21t6TZWXD8b7h4+2WK7mdfMb9vlqZq43KXyQ/k/k+RXR1w6+GT13
PTN/6mlsWpbp6NnrVZPePaRb349m+EwEtMVXWzTjCT7bCkwefbtF/+lfZuZ9
v732Gzv9C308+G6bu2fNuujSpR09/K6x1V1RkqUZDdhe/b+TtDfFeO3033Y1
/G706MeZucz+ZOv7avTsxyK7HXwlYnVydPJ4evRyh1iZvbPzS3N98e786vLS
fHfy+BQAKrMEbKolWzhoRjwGcwEzLGwDwyMC0pGgw/A4N53XBbt+L6nPjh6f
PCNZfXb05AXZIliIs/M/DYUVn7DynpWQQlq5uTn/BGOb3YqWviXz9ur69W8Q
SiIu2bf7VK1bTN0qJ4kafTt6emifw8M7bLQQ+K2dN31K3pKo82Sbxrpu4mlP
+yrN/r+nFYYfDp472E3LBT08b/MFGeic7RFTlmaaAjAe/lXmVIDVTOdkVPMp
gCkNPSRdxiiA2+OjbjVNK/EieHlDdKUP8mnq6D3tss20ZXpPid5TffUh+PX+
0831kF8BfUNG3B49y/7/49JV1tWEyH8bk/4VZtxvpoDc5DAO+01Zp3l7iHcc
Hh8ftrKDaZoTGGd/M9vkC0fQ8zq3Q6ISB/5jtekI/+z92srH61JATFDDLdH9
O22b7HBe1nOA8+qQ4BWEoqD/PwzvevTh8fH0w0tWzA9F1X8V3g6XBs4Oec5D
zZ/gMsrfwO4Bxt7mV/jOW62n06OT6fHzbWZdvHnzxlycfzznUb/Aq7q8nfUO
NVn6v6Im3E1A+lCx9WGjkc7hpp+XhBXA0ZaClCrjl2vcwAybTqcmnQNPZV2S
MPzS8Qj5toMvs7b0jqpo163JyJdsmjqHR5z3TUsQrlMXfE8QZcUDspQgkemr
yhKcg4Kav/W2B7VhE2kpt+SXy7ptSexr01ieDVzgGYmhrdhrmXjCX9FaMrvp
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
GrezSqPo/wWCtsgVkHUAAA==

-->

</rfc>
