<?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-03" 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-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>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="08"/>
    <area>IRTF</area>
    <workgroup>Internet Congestion Control</workgroup>
    <keyword>pacing</keyword>
    <keyword>congestion control</keyword>
    <abstract>
      <?line 169?>

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

<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.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 which 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 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 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>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="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 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. 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 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 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 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">
      <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"/>).  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="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="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="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 575?>

<!-- # 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 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>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
NgWkasba7L2BxbFCzzg4dzkUxukQHJ6zt+rC63Zu6lmWfpF8uTrJaVNTVdq9
i6uPq2LRsMG5nRHXSDLTSTd9JMW68G12svRdHqkrML3X1ABJnaH98avaBJ3L
MREJ4dueEloSf7vBEH14kHrbPenj4rJeABzc5BT4QaEiy/1NbNPYnuG6pW24
GPmEfdF6WSzSMSLA9U7vqyvQbnOVvfbTxma1o7/Y68LngmKIbYKc1pY/HTwF
Mrh9oDU8QLhhrm7tg+/H4SHITmXX1zmV1mDuMjzaOI3dk0hfGtwKN6NfYMRg
qHrgLyNrDeubGaT5Le7KrLTB9kT69hcSK1X3oZTuXly2SmF32jXGCLb6m8la
wcABByO47wnj3FTuTMcm+Lqy2N4NFNzSlPAdCBqOKlASoo0hg3nagYywrJLv
JEVC0f4gfsV91StLpu2sB997RfbYuWjVFsaILWQb/kfRiU2/RtzRtSbkRFEN
Z8kVL6nfA3fp9zcs0XFI9jMsSM5yCiq/bW03/Jv2OoYA8vGKwCUXv7g+qTBX
0Y5/xZXLTUmWfQuLbILdm6KYZ+aHSr7tdHnAJEhFoq+3lrezqt7ieGFlbLjH
553PHFnYoC5frBp2BuJ4PgHrY86hp/WuEjbq54pEyiYPw6JdKGj4o7dp7bYt
VWusNBdtWO4DYK8M5+81FfIObbiTXwyOBkV2WnyULm1sjsziVes4hTNnnEHZ
vjysfVaKr+w8WaTGE4VcFiIX706M5EW24xG+5HtaBCyAdpa7BDy5PogjQsYW
6vbsnW0iwrbuOPi14mKOLUnzSytt6I6Ia+wKioi55NP1K19tPZStvWxnE4fV
H9JrVdeaJ8QDuDGrVOq4i1YkX7ni6yW8cFdmIAPJfWPiO0ym/yoB74ApIIKs
qKeOVH3bdiL02B+Lq9arpyGMlenznU+kkCQsV9+mhHgkV7nX/ZUgAUHAQEr9
+d2zpySiXPwTfl5L+EIVfMexZHNxQXwXT+lgWDxxz8N7H+1y4XyO7jALayd/
2jSBVkKlqkC5HwfKA7f2qJUPgu4FDduVRwJXmwJcuhaAy+6tU56qknXG6Rr3
woPs2ELQ3DtocRBeGNJuTdDpqEArRutITjUsJIvO3vcs6ppcP8WyHvMWfPOf
NDve6Vy+k4jrU9oXeMSTsLi/124QqDa5q2RyB7CRzVuuiuj3jcn7+nQpf3Kq
uwPUGsEnm55SOZRU/np5MOIdbY7k+l6sVcnZ4pCpNFMQL+62py6l5R0HT70P
TRyhbhSmN2VUnfxvey+aKrXeydlIukUgix07sPfcCEax9pOgkKENML97NNvh
ZBmWoTdG7582JQc3wrSFFmW0KMK657c4fSeW9J2tMLJgS75bTWNbvm8V/Jp8
wRLCqgadUgi0cuY4OMMfSSSkzKyqoLmFQSBC7wATuyfQgEg9VRtiS1RL2fUW
9zAPVU6GOhBnJ2jDVelto46oymSVToMmmlrygkuXmYvxVdYzvo5AmnTVttRw
29fOJRINkptW21eW9e39qrZoyaZ+gGdp/V2Au07baDPBHW444nEz3HkPqYWy
MxatYSeQoKG37XvYE6W4FSxjBqQ1KbyiEVmg4c44sFdJaYL0FXDgAFK0FyTR
MBuN4aumpKtUWPclB7EkyyolHER1Zbc/vyQuSr4lX9LOOB3kyG660NC2j+8u
B3cGG32XczJtNqLsADi2GbqSJSTNV2g5fzNlERetei1VnbWNThttfGc320GP
c/2LTVl+tvOVj3/1bNWGlw2t090IhHjbZkLueMSoXCWhbbXsCWoLN8rdOzLi
kV0bD5ZRtmOmOz+XTdKCFKeIMv4j46/hLocuWXFtmc7W1EJ0YRB6Fn7D4eJk
bcLXQ3JGBBPdS9i+FWa2ME2Jm5cmRB6+qMwV0XChiRSKrTF8SwIAvnRsR7uv
hi2c4/YNU5GY6hvMVekQyQIctjbzV7580ItAi+ddZa/J7xIuMYXoMrLc4Gab
e3sXkmvb6l9Falll19q+DQsIsJZTrhC1tgruPQYXsY0x/drFohTQEjaX9yst
zUFxBDftkmxIrnT+rtF7tulgjbaimvb5jTuRpE2IuzqkZp+Ra4KBZhHFPOxb
u8ld0cjttygOPjo/WjvMq5ZXYMHVTvJkMrEwjPr9PtcmRNHv/xv9+ig+cn0s
2FUbPRwKRpnpi60Zqa2G0zIuXl2EHS9w7wEkr33U3npmezrkP7DWZJIyEmJD
PUPunoae1YcjQx0vy+JWy6czVhbANsiE4cipvMTCHrouMaZB3O//DCh839IX
7kJs6QAgPZ4YzEl+E78hFe82zdDVA/yZLw88JdgvSdX6J1u73YvPU8IIAukv
zULM5pNpA+/WnxPOWL8p1BSY86nBbvPtDzX6EpyOnOKx3G/7rphvXvqPcX84
5LI1H30JMlhI7be6EeaekcLPVSckIk6Pjz+8GcgIIzDLCrk8i4QMmqvGfJG7
ckBtk6IvwNGGMdNpt9yK0z19gVp1GMXxj5CrvBxb7Q0ZAEsGCwnqzn7tUZfZ
i4XuyfTQdO3lT3gmLH2DrgBkkarlJSO6K0C/7Lb5295ivCWVdHKzdQgBBljy
n+DtWqHIeiKfBPEDXoHcziduDTbLabmy7b+2ujfHu9xll1VpJTF+Kmx0Gayn
JxjH2LCGYfxit51W3ek4GI7QxT8eYDAY6E1Dd+iqz1antLmVGnJ7OaEzW2U8
gf++7LE0fZdSbZO8WXnKv3U3ogecLUqEXckDkno8LrQ7YLejh/TKoOmPpsUK
QsNiiTRPSMt61k8nk3JOlKCY18URZZhbH9n/DK+zzQUNb7zXWIKg0Rb9XDFX
mjr3VRX7u122zrrXuOtrCr9gIa4zg0v9kJqNPjpk95n59YOURXuxPYo39CwO
BiMB0xf1xQTpIoClUrHsXrnKhqcC2ASoq7rZ0ctj1VNaVSNKdzL0Cc+vVQae
hkPib+HJLP3C/CG1Te8TtLBx5K2W0iuTubanaB0dNlXFiP8HIQ4SW2WeAAA=

-->

</rfc>
