<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-iccrg-pacing-02" 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-02"/>
    <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="June" day="26"/>
    <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. 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>
        <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. The 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="2" month="March" 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-05"/>
        </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="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 574?>

<!-- # 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 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>Adopted version draft-irtf-iccrg-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>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
