<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-iccrg-pacing-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Pacing in Transport Protocols">Pacing in Transport Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-iccrg-pacing-01"/>
    <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="January" day="28"/>
    <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 and FreeBSD
applications allow the application to set an upper limit.</t>
        <t>For example, frame based video transmission typically generates data chunks at a varying size at regular intervals.
Such an application could request a data chunk to be spread over the interval. This would
allow a more sustained data transmission at a lower rate than a transport protocol's congestion control
might choose, rather than using a shorter time period within the interval with a high rate. This has
the benefit that queue growth is less likely, i.e. this form of pacing can reduce latency.</t>
        <t>Spreading over the interval needs to be done with some caution; "ideally" spreading data across the
entire interval risks that some of data will not arrive in time, e.g. when delays are introduced
by other traffic. SCReAM and SAMMY pace packets at a somewhat higher rate (50% in case of SCReAM)
to reduce this risk <xref target="I-D.draft-johansson-ccwg-rfc8298bis-screamv2-03"/>, <xref target="Sammy"/>.</t>
      </section>
    </section>
    <section anchor="implementation">
      <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>Pacing was added to Apple OS as a private API in iOS 17 and macOS 14. In its current form, an application or transport protocol computes and sets the desired transmit timestamp on a per packet basis and sends it to the pacing module in AQM. The packets are queued in the AQM until the current time becomes greater than or equal to corresponding packet's transmit timestamp. There is an upper limit of 3 seconds for how long the AQM will hold a queued packet before sending it.</t>
        <t>The above simplicity in the kernel allows upper layer protocols or applications to set a transmit timestamp in a manner that is suitable for them. For example, a stream based protocol like TCP might pace packets differently than a video conferencing app.</t>
      </section>
      <section anchor="freebsd">
        <name>FreeBSD</name>
        <t>FreeBSD has the infrastructure to support multiple TCP stacks.
Each TCP stack has a <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="20" month="October" year="2025"/>
            <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-04"/>
        </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 542?>

<!-- # 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:
H4sIAAAAAAAAA81963YbyZHm/3qKGursabINgABJ3dhW2xRFSZwWRVmkrPWZ
MysVgARQw0IVXBdSMO15lnmQ+TXzYhNfROSlCpBavX925eMmCWTlJTIy4otb
Vr/fj+q0zsxx/C6ZpPk8TvP4ukzyalWUdfyuLOpiUmRVlIzHpbn9tVaTpDbz
olwfU4NZEUXTYpInS+p8Wiazup+W9ayfTiblvL/ifvrDUVQ142VaVWmR1+sV
NT0/u34Zxw/iJKuK43gnzadmZeg/eb3Ti3fMNK2LMk0y/HF+8px+FCX99v76
5U6UN8uxKY+jKU3jOJoUeWXyqqmO47psTESzP4yS0iTHtv1dUd7My6JZ4ZO8
NmVu6vi0yOemqmk++LUui2wnujFrajs9juJ+LDPHbxPfciIto1uTNzR0HH9X
t3EsS955byqTlJNF/AqP4YtlkmZYPYj1R9BtUJRzfIFm9MWirlfV8f4+2uGj
9NYMUiPN9vHB/rgs7iqzzz3gwXlaL5oxPbq8M9nfsn3dkmA30Coj0lV1OAC3
HsjTg7TY8tz+V3Z3sKiXtMooaepFUYIqffp/TLxBW3IxiD+iZ/5EmOQinSwS
kwWf02KO4w85La6s0nodF7P4ssoK/q6qS2Nopu8u4+fFl3g0fDKMn2dglzLn
BhN64jgeHo4exf6pSdEQ8enzt0V5l6z5MyPEXmL4O/PHdJYOmrQY5PJEU6bH
MahBxBBaJPV+ey0fB/HZdLoOlvLRVJlZ+095ISdJtibWja/NZJEXWTFPTRXM
9OS2yHvx5ev46Gg4GrVnSzSozTS+qrE9IMPJ0pTpJAnnf2eqPyYyxGBSLKP2
HP88iF8VJiT3n9PpIvUfyhRXq8zE5/lk0KLxZW70q3dJeRN/VMLJvE+blSnr
NC968WmSpbOizGmRTx8OR0e/fRG3mNSnOU3qjwkG3LIS4pzr//7PLybfwjrB
F7yei//+z7yiE9hhIqwlxVQmqcknugt2sVckwwwxRzalT5KqMvHh02C5R08e
PnqIRiTimrJuL/GVKZdJ3mKrujE0pT/OFv1lY3gyg6mJorygljVN6jiKICz9
X3H8/uXp0+HwgH8/778YyPlCx/06XdXFqt9UZpJUptPi34oFyeSqyPuTyd28
X84mTw6ePhmnVb+akNxb3h70h4f0DD305zdPHh/zNFX877xOqgWRJMmn8SI1
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

-->

</rfc>
