<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-iccrg-pacing-00" 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-00"/>
    <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="2025" month="October" day="20"/>
    <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.cardwell-iccrg-bbr-congestion-control"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="motivations-for-pacing">
      <name>Motivations for Pacing</name>
      <t>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>
      </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.
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 12 Mb/s and a micro burst size of 4 full sized segments.
<tt>packetdrill</tt> is available in the FreeBSD ports collection.
Please note that 12 Mb/s correspond to 1.5MB/s.
Since FreeBSD takes the size of the IP packet into account this corresponds
to 1000 full sized segments on a path with an MTU of 1500 bytes.
The script uses a round trip time of 50 ms.</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.050 <  .     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, [1500000], 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
+0.100 send(4, ..., 14600, 0) = 14600
+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
+0.004 >  .  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
+0.004 >  . 11681:13141(1460) ack     1 win 65535
+0.000 > P. 13141:14601(1460) ack     1 win 65535
+0.042 <  .     1:1(0)        ack  2921 win 65535
+0.000 <  .     1:1(0)        ack  5841 win 65535
+0.004 <  .     1:1(0)        ack  8761 win 65535
+0.000 <  .     1:1(0)        ack 11681 win 65535
+0.004 <  .     1:1(0)        ack 14601 win 65535
+0.000 close(4) = 0
+0.000 > F. 14601:14601(0)    ack     1 win 65535
+0.050 < 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="I-D.cardwell-iccrg-bbr-congestion-control">
          <front>
            <title>BBR Congestion Control</title>
            <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
              <organization>Google</organization>
            </author>
            <author fullname="Yuchung Cheng" initials="Y." surname="Cheng">
              <organization>Google</organization>
            </author>
            <author fullname="Soheil Hassas Yeganeh" initials="S. H." surname="Yeganeh">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Van Jacobson" initials="V." surname="Jacobson">
              <organization>Google</organization>
            </author>
            <date day="7" month="March" year="2022"/>
            <abstract>
              <t>   This document specifies the BBR congestion control algorithm.  BBR
   ("Bottleneck Bandwidth and Round-trip propagation time") uses recent
   measurements of a transport connection's delivery rate, round-trip
   time, and packet loss rate to build an explicit model of the network
   path.  BBR then uses this model to control both how fast it sends
   data and the maximum volume of data it allows in flight in the
   network at any time.  Relative to loss-based congestion control
   algorithms such as Reno [RFC5681] or CUBIC [RFC8312], BBR offers
   substantially higher throughput for bottlenecks with shallow buffers
   or random losses, and substantially lower queueing delays for
   bottlenecks with deep buffers (avoiding "bufferbloat").  BBR can be
   implemented in any transport protocol that supports packet-delivery
   acknowledgment.  Thus far, open source implementations are available
   for TCP [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cardwell-iccrg-bbr-congestion-control-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="I-D.draft-many-tiptop-usecase">
          <front>
            <title>IP in Deep Space: Key Characteristics, Use Cases and Requirements</title>
            <author fullname="Marc Blanchet" initials="M." surname="Blanchet">
              <organization>Viagenie</organization>
            </author>
            <author fullname="Wesley Eddy" initials="W." surname="Eddy">
              <organization>MTI Systems</organization>
            </author>
            <author fullname="Marshall Eubanks" initials="M." surname="Eubanks">
              <organization>Space Initiatives Inc</organization>
            </author>
            <date day="18" month="June" year="2025"/>
            <abstract>
              <t>   Deep space communications involve long delays (e.g., Earth to Mars
   has one-way delays 4-24 minutes) and intermittent communications,
   mainly because of orbital dynamics.  The IP protocol stack used on
   the Internet is based on the assumptions of shorter delays and mostly
   uninterrupted communications.  This document describes the key
   characteristics, use cases, and requirements for deep space
   networking, intended to help when profiling IP protocols in such
   environment.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-many-tiptop-usecase-03"/>
        </reference>
        <reference anchor="I-D.draft-johansson-ccwg-rfc8298bis-screamv2-03">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="Ingemar Johansson" initials="I." surname="Johansson">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Magnus Westerlund" initials="M." surname="Westerlund">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <date day="3" month="March" year="2025"/>
            <abstract>
              <t>   This memo describes Self-Clocked Rate Adaptation for Multimedia
   version 2 (SCReAMv2), an update to SCReAM congestion control for
   media streams such as RTP [RFC3550].  SCReAMv2 includes several
   algorithm simplifications and adds support for L4S.  The algorithm
   supports handling of multiple media streams, typical use cases are
   streaming for remote control, AR and 3D VR googles.  This
   specification obsoletes RFC 8298.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-03"/>
        </reference>
        <reference anchor="VL87">
          <front>
            <title>Hashed and hierarchical timing wheels: data structures for the efficient implementation of a timer facility</title>
            <author initials="G." surname="Varghese">
              <organization/>
            </author>
            <author initials="T." surname="Tauck">
              <organization/>
            </author>
            <date year="1987" month="November" day="01"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/37499.37504"/>
        </reference>
        <reference anchor="Sammy" target="https://doi.org/10.1145/3603269.3604839">
          <front>
            <title>Sammy: Smoothing Video Traffic to be a Friendly Internet Neighbor</title>
            <author initials="B." surname="Spang" fullname="Bruce Spang">
              <organization/>
            </author>
            <author initials="S." surname="Kunamalla" fullname="Shravya Kunamalla">
              <organization/>
            </author>
            <author initials="R." surname="Teixeira" fullname="Renata Teixeira">
              <organization/>
            </author>
            <author initials="T." surname="Huang" fullname="Te-Yuan Huang">
              <organization/>
            </author>
            <author initials="G." surname="Armitage" fullname="Grenville Armitage">
              <organization/>
            </author>
            <author initials="R." surname="Johari" fullname="Ramesh Johari">
              <organization/>
            </author>
            <author initials="N." surname="McKeown" fullname="Nick McKeown">
              <organization/>
            </author>
            <date year="2023" month="September" day="01"/>
          </front>
          <seriesInfo name="ACM SIGCOMM '23: Proceedings of the ACM SIGCOMM 2023 Conference" value=""/>
        </reference>
        <reference anchor="RACK" target="https://freebsdfoundation.org/our-work/journal/browser-based-edition/networking-10th-anniversary/rack-and-alternate-tcp-stacks-for-freebsd/">
          <front>
            <title>RACK and Alternate TCP Stacks for FreeBSD</title>
            <author initials="R." surname="Stewart" fullname="Randall Stewart">
              <organization/>
            </author>
            <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
              <organization/>
            </author>
            <date year="2024" month="February"/>
          </front>
          <seriesInfo name="FreeBSD Journal (January/February 2024)" value=""/>
        </reference>
        <reference anchor="HPTS" target="https://freebsdfoundation.org/wp-content/uploads/2024/11/stewart-adventures.pdf">
          <front>
            <title>Pacing in the FreeBSD TCP Stack</title>
            <author initials="R." surname="Stewart" fullname="Randall Stewart">
              <organization/>
            </author>
            <author initials="M." surname="Tüxen" fullname="Michael Tüxen">
              <organization/>
            </author>
            <date year="2024" month="October"/>
          </front>
          <seriesInfo name="FreeBSD Journal" value=""/>
        </reference>
        <reference anchor="HPTSCode" target="https://github.com/freebsd/freebsd-src/blob/main/sys/netinet/tcp_hpts.c#L31-L99">
          <front>
            <title>tcp_hpts.c</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="October"/>
          </front>
        </reference>
        <reference anchor="LinuxPacing" target="https://folk.universitetetioslo.no/michawe/research/publications/icnc2025-pacing.pdf">
          <front>
            <title>TCP Pacing in the Linux Kernel</title>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2025" month="February" day="17"/>
          </front>
          <seriesInfo name="IEEE ICNC 2025" value=""/>
        </reference>
        <reference anchor="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="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 530?>

<!-- # 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>
            <li>
              <t>-03:
              </t>
              <ul spacing="normal">
                <li>
                  <t>re-structures the parts on general considerations and adds more text in them</t>
                </li>
                <li>
                  <t>elaborates on application control</t>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
eoe968q6OHxbNDT322LuwupAteGxzKnFCZ8o+in3WZlt19YHFX5lk4f1an0q
aFx6sG3u7kxwp6+U46GlXsbIXjonX5sKSWN3NxA/GLAG1a7lTNPaLmlC7uG6
w07RzBmnv7s3t3d5pfLKPvUyte2mkJta5W1IiZWkdjdQ3J66mBWBCqCV5b6I
Qu5u5lC9dbXyA3dhvpiwnVvOSqy5Em9HErBppbfpIQvXloDifYezzffwuApW
V/7cLQUJS/fkohudax6TDuBbcaTM0t9yK8UmFd/t2Rp3VQbSkVz2LnGkePbX
puL3irRKARUtKnoa4dKn3TUQrfQbiaG1ebSQxqr0+cJtAiTytuEfwjcNX4kQ
fMCbhslK4RXFZKJ8YgoBOLfxZVfwi6fkMlQ+k9KXU2IMmyfOrN61aQhMLUf+
ncPurMK6mXuXVQ7SBr5yI2/7AXjgyzZr1YPY9yKG3bJRoaur3yirINnavfK7
3VXxpuL0tyYhlunVQnCzWnDKKLyttXs6qHeoiWaMezu4noPloX0Jl8A1ufub
bT3GLfi1C3LT1F7v5uNYwmFygqgVPMlXti8VGAXQJvdlqJ4BW9W806pIS17b
fKitS/mV65Q8oTY2fLytldqhuGrf+QdFvKcJbX/0bKPE2VX2zeQ8kwT3dtvd
pXt5z9NTL6OX+h7fC+83VVS94h13Kb2CWv/CiHkjefDAFnt14C4ZFoli9BOj
Cq1LsHb1cUIohivpKmlR6aEzLhkI88mdndHZES5Uu0MrvL4jUcHCd8Ioszt1
0bmxpxMSVcOvWXG2EA4a9OrYUGjBCUqmP7L7BGbWVXC+zCIorRewa2VFi4AI
nqoPsSPQUla9wxfIhZCTqQ7B2QvOQFf6qhe/qcp4nc6CG0y0XhFvwmItxu8X
m3MJiJyQrl2d+G5b+BxLMtW/fTJ0INzLbVzFqcvJQ2dp8XQgux5tdJXgHp/5
a2UzXDmpKKsra6thVK8Ht6m5SycGAoo7WQxWQFpQyDOakAcarowzLvIeRa3N
8eSAUHQnJMkSF53ne77lEG9YDCSMWPHbKWsuje9fjtisXYJFKnZEpoNSsW1v
k3B39/Wngxc2WX2WjzKt/Xs6ajVl26kr5Rty/pGm83dbFr13Yip01pOsXbFp
j9W76wtQ1KPLckWa7g1FWgDd5kMGruSutQ0d7m4lgtlNc3cBqReMypeBu3uu
2g21g+v87/w24p79STq2Ue66Es8/n+bvUIovY2D5x6m5hq+YcAzZnKb3NYW7
WqqjvGgXHE5O5iZ6PdzOKN/DAUL2b0WZLW1T4trrhLZHWxHsKyC5SlCqfDcU
vtsCIL5cl2fIX23YwzntXu8diau+xV2V6znYgMPXZv3Kb35oTaCT8z7Ya/Lb
mM8HwHRZmW5wrfCdu4ja35nTPoqan8rNtXsVOQRgy9tf5ZUk6qvgpVPQIu5W
knbu4lEKaUmay7u11lWibI3PzZdlavXcz1f1PnA3PtS406Xm84NfupBazuv5
e1trjhn502i0qGWxCC8N2hauaOTVQzjZcfL2ZIOZ3VcAL7lUVVrGiaMhv8sX
tzBF0e/+hX58YE78S3Q4pxfdH4tE2dmznTnBVsv58osXF8HrdvjSSVhe19Rd
Oe9eQJB/w6jJxmUkmy3mV7261sBZQwQyNPCyKtwLVTMGC1Ab5MLw2SR5iI09
sG6Bl7AOh9+DCl839aV/G5kc35KSQSZznF+b1wTxblJyBc0J9DO/ueGMaL8i
qPUHd/CG9cDLWYN41p9ivvrjulDwv2A+5YvwfolK+g/4oe9/lNcJvSkW2yf7
rRmOx1xi254cCYoJCOg7NISx5wTxwUsYhbPT0/evR9LDBOqx8q9kv2rsz3I1
MfZXUgyFHHpWc6a3srZpc668a+uJK7za/FtYUp6OO5wDrQ/fBRMJyoR/rakv
ssRED2T4WN6qzNepoE1YqQx0APGQQyYreUenOy/EZzz80Qps+R2WVAKhyfXO
MUwWaMm/QptrQTkjQ+YEaQCegbwMQQIZ7IjTdGXZf+tclmX2ubSWwbNuKm4V
3iQSzGcgMsbSsCFT/GD/DHvdu+Yj7KEvf9zBaDTSi51vcYkh+5lyq5Ac+XHv
gvCOqvQX8cPD8aG8t/5bovLQV7hWCrFLSfF/4XUULfFcHTm8Se2SYPG00Is5
+scw5YDj/wDe9SL1940AAA==

-->

</rfc>
