<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-welzl-iccrg-pacing-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Pacing in Transport Protocols">Pacing in Transport Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-welzl-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>MTI Systems</organization>
      <address>
        <postal>
          <street>25111 Country Club Blvd, Suite 295</street>
          <city>North Olmsted, OH 44070</city>
          <country>United States of America</country>
        </postal>
        <email>wes@mti-systems.com</email>
      </address>
    </author>
    <author initials="V." surname="Goel" fullname="Vidhi Goel">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>vidhi_goel@apple.com</email>
      </address>
    </author>
    <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
      <organization>Münster University of Applied Sciences</organization>
      <address>
        <postal>
          <street>Stegerwaldstrasse 39</street>
          <city>48565 Steinfurt</city>
          <country>Germany</country>
        </postal>
        <email>tuexen@fh-muenster.de</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>IRTF</area>
    <workgroup>Internet Congestion Control</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 138?>

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

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

</section>
    <section anchor="pacing-general-considerations-and-consequences">
      <name>Pacing: general considerations and consequences</name>
      <section anchor="losstypes">
        <name>More likely to saturate a bottleneck</name>
        <t>We can distinguish between two reasons for packet losses that are due to congestion at a bottleneck with a DropTail (FIFO) queue:</t>
        <ol spacing="normal" type="1"><li>
            <t>A flight of N packets arrives. The amount of data in this flight exceeds the amount of data that can be transmitted by the bottleneck during the flight's arrival plus the queue length, i.e. some data do not fit into the queue.</t>
          </li>
          <li>
            <t>The bottleneck is fully saturated. The queue is full, and packets drain from it more slowly than new packets arrive.</t>
          </li>
        </ol>
        <t>The second type of loss matches the typical expectation of a congestion control algorithm: the cwnd value when loss happens is indicative of the bottleneck being fully saturated. When the first type of loss happens, however, a sender's cwnd can be much smaller than the Bandwidth*Delay Product (BDP) of the path (the amount of data that can be in flight, ignoring the queue). In the absence of other traffic, the probability for the first type of loss to happen depends on the queue length and the ratio between the departure and the arrival rate during the flight's arrival. By introducing time gaps between the packets of a burst, this ratio is increased, i.e. the difference between the departure and the arrival rate becomes smaller, and the second type of loss is more likely.</t>
        <t>For example, consider a network path with a bottleneck capacity of 50 Mbit/s, a queue length of 15000 bytes (or 10 packets of size 1500 bytes) and an RTT of 30 ms. Assume that all packets emitted by the sender have a size of 1500 bytes. Then, the BDP equals 125 packets. The bottleneck of this network path is fully saturated when a (BDP + queue length) amount of bytes are in flight: 135 packets.</t>
        <t>In this network, the first type of loss can happen as follows: say, N=40 packets arrive at this bottleneck at a rate of 100 Mbit/s. In an otherwise empty network and assuming an initial window of 10 packets and no delayed ACKs, this occurs in the third round of slow start without pacing, provided that the capacities of all links before the bottleneck are at least 100 Mbit/s.
In this case, an overshoot will occur: packets are forwarded with half their arrival rate, i.e. less than 20 packets can be forwarded during the burst's arrival. The remaining 20 (or more) packets cannot fit into the 10-packet queue. A cwnd of 40 packets is much smaller than the (BDP + queue) limit of 135 packets, and the bottleneck is not fully saturated.</t>
        <t>Let us now assume that the flight of 40 packets is instead paced, such that the arrival rate only mildly exceeds the departure rate -- e.g., they arrive at a rate of 60 Mbit/s. When the last packet of this flight arrives at the bottleneck, the bottleneck should already have forwarded 5/6 * 39 = 32.5 packets. Since only complete packets can be sent, the bottleneck has really forwarded 32 packets, and the remaining 40-32 = 8 packets fit in the queue. No loss occurs.</t>
        <t>This example explains how pacing can enable a rate increase to last longer than without pacing. This makes it more likely that a bottleneck is saturated, such that cwnd reflects the BDP plus the queue length (loss type 2).</t>
        <section anchor="backing-off-after-the-increase">
          <name>Backing off after the increase</name>
          <t>The two loss types explained in <xref target="losstypes"/> require a different back-off factor to allow the queue to drain and congestion to dissipate. Specifically, in the single-sender single-bottleneck example above, when a slow start overshoot occurs as loss type 2, a back-off function such as: ssthresh = cwnd * beta with beta &gt;= 0.5 is guaranteed to cause a second loss after the end of loss recovery. This is because, when cwnd exceeds a fully saturated bottleneck (i.e., cwnd &gt; BDP + queue length), cwnd will have grown further by another (BDP + queue length) by the time the sender learns about the loss. In this case, beta = 0.5 will cause ssthresh to exceed (BDP + queue length) again.</t>
          <t>Since pacing makes loss type 2 more likely, beta &lt; 0.5 may be a better choice after slow start overshoot when pacing is used.</t>
        </section>
        <section anchor="able-to-work-with-smaller-queues">
          <name>Able to work with smaller queues</name>
          <t>The probability of loss type 1 in <xref target="losstypes"/> is indirectly proportional to the queue length. Pacing therefore enables a rate increase to continue with a smaller queue at the bottleneck than in the case without pacing.</t>
        </section>
      </section>
      <section anchor="getting-good-rtt-estimates">
        <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, and using it to pace the initial window can cause unnecessary delay. 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>
    <section anchor="implementation-examples">
      <name>Implementation examples</name>
      <section anchor="linux">
        <name>Linux TCP</name>
        <t>The following description is based on Linux kernel version 6.8.9.</t>
        <t>There are two ways to enable pacing in Linux: 1) via a socket option, 2) by configuring the FQ queue discipline. We describe case 1.</t>
        <t>Independent of the value of the Initial Window (IW), the first 10 (hardcoded) packets are not paced. Later, 10 packets will generally be sent without pacing every 2^32 packets.</t>
        <t>Every time an ACK arrives, a pacing rate is calculated, as: factor * MSS * cwnd / SRTT, where "factor" is a configurable value that, by default, is 2 in slow start and 1.2 in congestion avoidance. MSS is the sender maximum segment size <xref target="RFC5681"/>, and SRTT is the smoothed round-trip time <xref target="RFC6298"/> [TODO check: Linux calculates SRTT different from the standard, though RFC 6298 relaxes the rules, so maybe it's ok?]
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><strong>TEMPORARY NOTE - TO BE REMOVED:</strong> This description is based on the longer Linux pacing analysis text that is currently available at: <eref target="https://docs.google.com/document/d/1h5hN9isFjT76YjaCphHZdW9LCRYqV4y3GKwRKxgqEO0/edit?usp=sharing">https://docs.google.com/document/d/1h5hN9isFjT76YjaCphHZdW9LCRYqV4y3GKwRKxgqEO0/edit?usp=sharing</eref>  - comments or corrections are very welcome!</t>
      </section>
      <section anchor="apple-oses">
        <name>Apple OSes</name>
        <t>Pacing was added to Apple OS as a private API in iOS 17 and macOS 14. In its current form, an application or transport protocol computes and sets the desired transmit timestamp on a per packet basis and sends it to the pacing module in AQM. The packets are queued in the AQM until the current time becomes greater than or equal to corresponding packet's transmit timestamp. There is an upper limit of 3 seconds for how long the AQM will hold a queued packet before sending it.</t>
        <t>The above simplicity in the kernel allows upper layer protocols or applications to set a transmit timestamp in a manner that is suitable for them. For example, a stream based protocol like TCP might pace packets differently than a video conferencing app.</t>
      </section>
      <section anchor="freebsd">
        <name>FreeBSD</name>
        <t>FreeBSD has the infrastructure to support multiple TCP stacks.
Each TCP stack has a tcp_output() function, which handles most of the sending of TCP segments.
The default stack does not support pacing and its tcp_output() may be called whenever</t>
        <ol spacing="normal" type="1"><li>
            <t>a TCP segment is received or</t>
          </li>
          <li>
            <t>a TCP timer (like the retransmission or delayed ACK timer) runs off or</t>
          </li>
          <li>
            <t>the application provides new data to be sent</t>
          </li>
        </ol>
        <t>and sends as many TCP segments as is allowed by the congestion and flow control resulting in burst of TCP segments.
However, this also allows to make use of TCP Segment Offload (TSO), which reduces the CPU load.</t>
        <t>The RACK <xref target="RACK"/> and BBR stacks both support pacing by leveraging the TCP High Precision Timer System (HPTS) <xref target="HPTS"/>, which is a kernel loadable module available in FreeBSD 14 and higher.
The tcp_output() function of a TCP stack which supports pacing will not send as much as is allowed by congestion and flow control, but may only send a micro burst and schedule itself for being called after the inter-burst send time using the HPTS.
The RACK stack supports an application setting a pacing rate and a maximum burst size using TCP socket options.
The RACK stack then uses these values to compute the actual micro burst size and the inter-burst send time.</t>
        <t>The HPTS is optimized for handling a large number of TCP connections and the tcp_output() function of the RACK stack is also optimized for being called more often than the tcp_output() function of the default stack.
This allows to use TSO in combination with TCP pacing.</t>
        <t>This subsystem underpins recently published research by Netflix and Stanford into application-informed pacing at scale <xref target="Sammy"/>.</t>
      </section>
      <section anchor="quic-bbr-implementations">
        <name>QUIC BBR implementations</name>
        <t>Pacing capability is expected in QUIC senders.  While standard QUIC congestion control <xref target="RFC9002"/> is based on TCP Reno, which is not defined to include pacing (but also does not prohibit it), QUIC congestion control requires either pacing or some other burst limitation (<xref section="7.7" sectionFormat="of" target="RFC9002"/>).  BBR congestion control implementations are common in QUIC stacks, and pacing is integral to BBR, so this document focuses on it.</t>
        <t>Pacing in QUIC stacks commonly involves:</t>
        <ol spacing="normal" type="1"><li>
            <t>Access to lower-level (e.g. OS and hardware) capabilities needed for effective pacing.</t>
          </li>
          <li>
            <t>Managing additional timers related to pacing, along with those already needed for retransmission, and other events.</t>
          </li>
          <li>
            <t>Details of the actual pacing algorithm (e.g. granularity of bursts allowed, etc.).</t>
          </li>
        </ol>
        <t>Examples of different approaches to dealing with these challenges in ways that work on multiple operating systems and hardware platforms can be found in open source QUIC stacks, such as Google's QUIC implementation and Meta's "mvfst". These provide examples for some of the concepts discussed below.</t>
        <t>Unlike TCP implementations that typically run within the operating system kernel, QUIC implementations more typically run in user space and are thus faced with more challenges regarding timing and coupling with the underlying protocol stack and hardware needed to achieve pacing.  For instance, if an application trying to do pacing is running on a highly loaded system, it may often "wake up late" and miss the times that it intends to pace packets.</t>
        <t>When a large amount of data needs to be sent, pacing naively could result in an excessive number of timers to be managed and adjusted along with all of the other timers that the QUIC stack and rest of the application require.  The Hashed Hierarchical Timing Wheel <xref target="VL87"/> provides one approach for such cases, but implementations may also simply schedule the next send event based on the current pacing rate, and then schedule subsequent events as needed, rather than adjusting timers for them.  In any case, typically a pacing algorithm should allow for some amount of burstiness, in order to efficiently use the hardware as well as to be responsive for bursty (but low overall rate) applications, and to avoid excessive timer management.</t>
        <t>Pacing can be done based on different approaches such as a token-based or tokenless algorithm.  For instance, a tokenless algorithm (e.g. as used in mvfst) might compute a regular interval time and batch size (number of packets) to be released every interval and achieve the pacing rate.  This allows specific future transmissions to be scheduled.  In contrast, a token-based algorithm accumulates tokens to permit transmission based on the pacing rate, using a "leaky bucket" to control bursts.  In this case the size of bursts may be more granular, depending on how much time has elapsed between evaluations.</t>
        <t>The additional notion of "burst tokens" (or other burst allowance) may be present in order to rapidly transmit data if coming out of a quiescent period (e.g. when a flow has been application-limited without data to send, e.g. as used in Google's implementation).  A number of burst tokens, representing packets that can be sent unpaced, is initialized to some value (e.g. 10) when a flow starts or becomes quiescent.  If burst tokens are available, outgoing packets are sent immediately, without pacing, up to the limit permitted by the congestion window, and the burst tokens are depleted by each packet sent.  The number of burst tokens is reduced to zero on congestion events.  When coming out of quiescence, it is set to the minimum of the initial burst size, or the amount of packets that the congestion window (in bytes) represents.</t>
        <t>There may be additional "lumpy tokens" that further allow unpaced packets after the burst tokens have been consumed, and the congestion window does not limit sending.  The amount of lumpy tokens that might be present is determined using heuristics, generally limiting to a small number of packets (e.g. 1 or 2).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>While congestion control designs, including aspects such as pacing, could result in unwanted competing traffic, they do not directly result in new security considerations.</t>
      <t>Transport protocols that provide authentication (including those using encryption), or are carried over protocols that provide authentication, can protect their congestion control algorithm from network attack. This is orthogonal to the congestion control rules.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.cardwell-iccrg-bbr-congestion-control">
          <front>
            <title>BBR Congestion Control</title>
            <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
              <organization>Google</organization>
            </author>
            <author fullname="Yuchung Cheng" initials="Y." surname="Cheng">
              <organization>Google</organization>
            </author>
            <author fullname="Soheil Hassas Yeganeh" initials="S. H." surname="Yeganeh">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Van Jacobson" initials="V." surname="Jacobson">
              <organization>Google</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document specifies the BBR congestion control algorithm.  BBR
   ("Bottleneck Bandwidth and Round-trip propagation time") uses recent
   measurements of a transport connection's delivery rate, round-trip
   time, and packet loss rate to build an explicit model of the network
   path.  BBR then uses this model to control both how fast it sends
   data and the maximum volume of data it allows in flight in the
   network at any time.  Relative to loss-based congestion control
   algorithms such as Reno [RFC5681] or CUBIC [RFC8312], BBR offers
   substantially higher throughput for bottlenecks with shallow buffers
   or random losses, and substantially lower queueing delays for
   bottlenecks with deep buffers (avoiding "bufferbloat").  BBR can be
   implemented in any transport protocol that supports packet-delivery
   acknowledgment.  Thus far, open source implementations are available
   for TCP [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cardwell-iccrg-bbr-congestion-control-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="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">
          <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="Upcoming in FreeBSD Journal (September/October 2024)" 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="RFC9040">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>This memo provides guidance to TCP implementers that is intended to help improve connection convergence to steady-state operation without affecting interoperability. It updates and replaces RFC 2140's description of sharing TCP state, as typically represented in TCP Control Blocks, among similar concurrent or consecutive connections.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9040"/>
          <seriesInfo name="DOI" value="10.17487/RFC9040"/>
        </reference>
        <reference anchor="RFC5681">
          <front>
            <title>TCP Congestion Control</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines TCP's four intertwined congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. In addition, the document specifies how TCP should begin transmission after a relatively long idle period, as well as discussing various acknowledgment generation methods. This document obsoletes RFC 2581. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5681"/>
          <seriesInfo name="DOI" value="10.17487/RFC5681"/>
        </reference>
        <reference anchor="RFC6298">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
      </references>
    </references>
    <?line 305?>

<!-- # 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 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>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81c23IbR5J9x1fUQA8mtQAIkNSFXN9IipI4FkWZpKzwTsxO
FLoLQJt9gbu6ScEK/ct+yDzt/Njmyayq7gYgj+dhY9cRFslGdVVWXk9mZWE4
HPaqpErNsXqnoySfqyRXt6XO7bIoK/WuLKoiKlLb09Npae7/2ahIV2ZelKtj
GjArer24iHKd0eRxqWfV8MGkv6XDJIrK+XDJEw3Hk56tp1libVLk1WpJYy/O
b18q9Ujp1BbHqp/ksVka+iev+gPVN3FSFWWiU/xxcXJKP4qSfru+fdnv5XU2
NeVxLyY6jntRkVuT29oeq6qsTY/IP+jp0uhjP/6hKO/mZVEv8SSvTJmbSp0V
+dzYiujBr1VZpP3enVnR2Pi4p4YqNx8rNTe5KTUG4VGdJ1FR8q92qcu7FDyK
E1uVybSuTKxSE89N2bs3eU2EKfWHFlVKGNK/NtboMlqoV3gNH2Q6ScEbsPL7
pKxmo6Kc4wMMow8WVbW0x3t7GIdHyb0ZJUaG7eHB3rQsHqzZ4xnw4jypFvWU
Xs1YSnsisbasMColxtqqvQCPHsnbo6TY8t7el4Q/WlQZbbOn62pRlGDLkP5X
pDskscuR+oA3+Iko0WUSLbRJW89pN8fqfU67K21SrVQxU1c2LfgzYr4xROq7
K3VafFST8fOxOk2hTRAU/RfRG8dqfDB5qpq3oqIm7tPzt0X5oFf8zAi3Myz/
YL5PZsmoTopRLm/UZXKswA7ihjBDV3vdvXwYqfM4XrW28sHY1Kyap7yRy9sL
dbOylclsZwf7TyaTCakFU6bO0npKG7mPB+qmTiqj9o+etPZDdFcLdZVmNA8N
uXqtDg/Hz8bdzRHLoJU3FcQJrp1kpkwi3d7ug7HfZ1UytELRKCqyXndbP43U
q8K0JfRTEi+S5iHv6mS5TI26yKNRZ1NXuXEfvSODUR8cr2UTZ/XSlFWSFwN1
ptNkRraVaHX0ZDw5/Nc3cg+i/jYnor7XWHDLTkjZbv/x948m36JtrQ9ESv/4
e04cKdf0DntJQEqUmDwyXQnekFs0pE9pTE+0tUYdHLW2e/j8ydMnGEResy6r
7hZfmTLTeUcTq9oQSd/PFsOsNkzMKDa9Xl7QyIqIOu714H+bv5S6fnl2NB7v
8+8/vXn+7Jjnc66//1rbBdGu81gtEvJr8BiRTunzDJ7sYWFMSmwit6qxpzqq
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
9D9VWb38z1IAAA==

-->

</rfc>
