<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-cheshire-sbm-04" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Source Buffer Management">Source Buffer Management</title>

    <author fullname="Stuart Cheshire">
      <organization>Apple Inc.</organization>
      <address>
        <email>cheshire@apple.com</email>
      </address>
    </author>

    <date year="2026" month="July" day="06"/>

    
    
    <keyword>Bufferbloat</keyword> <keyword>Latency</keyword> <keyword>Responsiveness</keyword>

    <abstract>


<?line 118?>

<t>In the past decade there has been growing awareness about the
harmful effects of bufferbloat in the network, and there has
been good work on developments like L4S to address that problem.
However, bufferbloat on the sender itself remains a significant
additional problem, which has not received similar attention.
This document offers techniques and guidance for host networking
software to avoid network traffic suffering unnecessary delays
caused by excessive buffering at the sender. These improvements
are broadly applicable across all datagram and transport
protocols (UDP, TCP, QUIC, etc.) on all operating systems.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://StuartCheshire.github.io/draft-cheshire-sbm/draft-cheshire-sbm.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-cheshire-sbm/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        sbm Working Group mailing list (<eref target="mailto:sbm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/sbm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/sbm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/StuartCheshire/draft-cheshire-sbm"/>.</t>
    </note>


  </front>

  <middle>


<?line 131?>

<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="introduction"><name>Introduction</name>

<t>In 2010 Jim Gettys identified the problem
of how excessive buffering in networks adversely affects
delay-sensitive applications <xref target="Bloat1"/><xref target="Bloat2"/><xref target="Bloat3"/>.
This important work identifying a non-obvious problem
has led to valuable developments to improve this situation,
like fq_codel <xref target="RFC8290"/>, PIE <xref target="RFC8033"/>, Cake <xref target="Cake"/>,
and L4S <xref target="RFC9330"/>.</t>

<t>However, excessive buffering at the source
-- in the sending devices themselves --
can equally contribute to degraded performance
for delay-sensitive applications,
and this problem has not yet received
a similar level of attention.</t>

<t>This document describes the source buffering problem,
steps that have been taken so far to address the problem,
shortcomings with those existing solutions,
and new mechanisms that work better.</t>

<t>To explain the problem and the solution,
this document begins with some historical background
about why computers have buffers in the first place,
and why buffers are useful.
This document explains the need for backpressure on
senders that are able to exceed the network capacity,
and separates backpressure mechanisms into
direct backpressure and indirect backpressure.</t>

<t>The document describes
the TCP_REPLENISH_TIME socket option
for TCP connections using BSD Sockets,
and its equivalent for other networking protocols and APIs.</t>

<t>The goal is to define a cross-platform and cross-protocol
mechanism that informs application software when it is a good
time to generate new data, and when the application software
might want to refrain from generating new data,
enabling the application software to
write chunks of data large enough to be efficient,
without writing too many of them too quickly.
This avoids the unfortunate situation where a delay-sensitive
application inadvertently writes many blocks of data
long before they will actually depart the source machine,
such that by the time the enqueued data is actually sent,
the application may have newer data that it would rather send instead.
By deferring generating data until the networking code is
actually ready to send it, the application retains more precise
control over what data will be sent when the opportunity arises.</t>

<t>The document concludes by describing some alternative
solutions that are often proposed, and explains
why we feel they are less effective than simply
implementing effective source buffer management.</t>

<section anchor="ietf-relevance"><name>IETF Relevance</name>

<t>Generally, the IETF concerns itself with design issues
like packet formats and protocol timing parameters
(i.e., properties that you can observe externally using tools like Wireshark).
The work described in this document does not alter
packet header formats, or define new protocol options.
Instead it concentrates on implementation details and API properties,
subjects usually on the fringe of IETF discussion when they do not
affect the on-the-wire protocol.</t>

<t>In this case, implementation and API characteristics are relevant to the IETF.
The delay between the time when an application writes some data
and when that data is sent in a packet on the network is,
in principle, an externally observable property.
Furthermore,
the problem of excessive buffering at the sender is very widespread,
across all common transport protocols and all major operating systems.
Given the pervasiveness of the Source Buffer Management problem,
it is worthwhile to have a holistic approach to solving it consistently
in all scenarios, rather than creating solutions piecemeal,
having a different ad hoc solution for each transport protocol
on each operating system.</t>

<t>Finally, there is the potential that additional work may
need to be done to ensure that congestion control algorithms
interact well with direct backpressure.
Normally, the congestion control algorithm is responsible for
controlling the rate at which packets are sent into the network.
When combined with direct backpressure,
there are now two mechanisms jointly responsible for
controlling the rate at which packets are sent into the network.
When direct backpressure is used to inform the
congestion control algorithm about how fast it should be
generating packets, care needs to be taken so
that when the local network conditions change
(e.g., varying contention for Wi-Fi spectrum, or varying Wi-Fi MCS rates)
and direct backpressure lifts, the congestion control algorithm does
not suddenly release an excessive burst of traffic into the network.</t>

</section>
</section>
<section anchor="source-buffer-backpressure"><name>Source Buffer Backpressure</name>

<t>Starting with the most basic principles,
computers have always had to deal with the situation
where software is able to generate output data
faster than the physical medium can accept it.
The software may be sending data to a paper tape punch,
to an RS232 serial port (UART),
or to a printer connected via a parallel port.
The software may be writing data to a floppy disk
or a spinning hard disk.
It was self-evident to early computer designers that it would
be unacceptable for data to be lost in these cases.</t>

<section anchor="direct-backpressure"><name>Direct Backpressure</name>

<t>The early solutions were simple.
When an application wrote data to a file on a floppy disk,
the file system “write” API would not return control to the caller
until the data had actually been written to the floppy disk.
This had the natural effect of slowing down
the application so that it could not exceed
the capacity of the medium to accept the data.</t>

<t>Soon it became clear that these simple synchronous APIs
unreasonably limited the performance of the system.
If, instead, the file system “write” API
were to return to the caller immediately
-- even though the actual write to the
spinning hard disk had not yet completed --
then the application could get on with other
useful work while the actual write to the
spinning hard disk proceeded in parallel.</t>

<t>Some systems allowed a single asynchronous write
to the spinning hard disk to proceed while
the application software performed other processing.
Other systems allowed multiple asynchronous writes to be enqueued,
but even these systems did not permit an unbounded backlog
of data waiting to be written disk.
At some point, if the application software persisted in
trying to write data faster than the medium could accept it,
then the application would be throttled in some way,
either by making the API call a blocking call
(simply not returning control to the application,
removing its ability to do anything else)
or by returning a Unix EWOULDBLOCK error or similar
(to inform the application that its API call had
been unsuccessful, and that it would need to take
action to write its data again at a later time).</t>

<t>It is instructive to observe a comparison with graphics cards.
Most graphics cards support double-buffering.
This allows one frame to be displayed while
the CPU and GPU are working on generating the next frame.
This concurrency allows for greater efficiency,
by enabling two actions to be happening at the same time.
But quintuple-buffering is not better than double-buffering.
Having a pipeline five frames deep, or ten frames,
or fifty frames, is not better than two frames.
For a fast-paced video game, having a display pipeline fifty
frames deep, where every frame is generated, then waits in
the pipeline, and then is displayed fifty frames later,
would not improve performance or efficiency,
but would cause an unacceptable delay between
a player performing an action and
seeing the results of that action on the screen.
It is beneficial for the video game to work on preparing
the next frame while the previous frame is being displayed,
but it is not beneficial for the video game to get multiple
frames ahead of the frame currently being displayed.</t>

<t>Another reason that it is good not to permit an
excessive amount of unsent data to be queued up
is that once data is committed to a buffer,
there are generally limited options for changing it.
Some systems may provide a mechanism to flush the entire
buffer and discard all the data, but mechanisms to
selectively remove or re-order enqueued data
are complicated and rare.
While it could be possible to add such mechanisms,
on balance it is simpler just to avoid committing
too much unsent data to the buffer in the first place.
If the backlog of unsent data is kept reasonably low,
that gives the source more flexibility to decide what to
put into the buffer next, when that opportunity arises.</t>

<t>In summary, in order to give applications maximum
flexibility, pending data should be kept close
to the application for as long as possible.
Application buffers should be as large as needed
for the application to do its work,
and lower-layer buffers should be no larger than
is necessary to provide efficient use of available
network capacity and other resources like CPU time.</t>

</section>
<section anchor="indirect-backpressure"><name>Indirect Backpressure</name>

<t>All of the situations described above using “direct backpressure”
are one-hop communication where the CPU generating the data
is connected more-or-less directly to the device consuming the data.
In these cases it is relatively simple for the receiving device
to exert direct backpressure to influence
the rate at which the CPU sends data.</t>

<t>When we introduce multi-hop networking,
the situation becomes more complicated.
When a flow of packets travels 30 hops though
a network, the bottleneck hop may be quite distant
from the original source of the data stream.</t>

<t>For example, consider the case of
a smartphone communicating via a Wi-Fi Access Point at 600 Mb/s,
which is connected to a home NAT gateway via gigabit Ethernet,
which is connected to a cable modem via gigabit Ethernet,
which has an upstream output rate of 35 Mb/s over the coaxial cable.</t>

<figure><artwork><![CDATA[
  -----   600            1              1             35
 |  P  |  Mb/s          Gb/s           Gb/s          Mb/s
 |  h  |        ------        -------        ------
 |  o  |------>|  AP  |----->|  NAT  |----->|  CM  |------> Internet
 |  n  |        ------        -------        ------
 |  e  |                                        ^
  -----                                       Queue
    ^                                         forms
Source of data                                here
]]></artwork></figure>

<t>When the cable modem experiences
an excessive flow of incoming packets arriving
on its gigabit Ethernet interface,
the cable modem has no direct way to cause
the networking code on the smartphone to curtail
the influx of data by pausing the sending application
via blocking its write calls or delivering EWOULDBLOCK errors.
The source of the excessive flood of data
causing the problem (the smartphone)
is three network hops away from the device
experiencing the problem (the cable modem).
When an incoming packet arrives,
the cable modem’s choices are limited to
enqueueing the packet,
discarding the packet,
or enqueueing the packet and
marking it with an ECN CE (Congestion Experienced) mark <xref target="RFC3168"/> <xref target="RFC9330"/>.
The cable modem drops or marks an incoming packet
in the expectation that this will, eventually,
indirectly, cause the networking code and operating system
on the sending device to take the necessary steps
to curtail the sending application.</t>

<t>The cable modem’s choices are so limited
because of security and packet size constraints.</t>

<t>Security and trust concerns revolve around preventing a
malicious entity from performing a denial-of-service attack
against a victim device, by sending fraudulent messages that
would cause the victim to reduce its transmission rate.
It is particularly important to guard against an off-path attacker
being able to do this. This concern is addressed if queue size
feedback generated in the network follows the same path already
taken by the data packets and their subsequent acknowledgment
packets. The logic is that any on-path device that is able to
modify data packets (changing the ECN bits in the IP header)
could equally well corrupt packets or discard them entirely.
Thus, trusting ECN information from these devices does not
increase security concerns, since these devices could already
perform more damaging actions anyway. The sender already
trusts the receiver to generate accurate acknowledgment
packets, so also trusting it to report ECN information back
to the sender does not increase the security risk.</t>

<t>A consequence of this security requirement is that it takes a
full round trip time for the source to learn about queue state
in the network. In many common cases this is not a significant
deficiency. For example, if a user is receiving data from a
well-connected server on the Internet, and the network
bottleneck is the last hop on the path (e.g., the Wi-Fi hop to
the user’s smartphone in their home) then the location where
the queue is building up (the Wi-Fi Access Point) is very close
to the receiver, and having the receiver echo the queue state
information back to the sender does not add significant delay.</t>

<t>Packet size constraints, particularly scarce bits available
in the IP header, mean that for pragmatic reasons the ECN
queue size feedback is limited to two states: “The source
may try sending a little faster if desired,” and, “The
source should reduce its sending rate.” Use of these
increase/decrease indications in successive packets allows
the sender to converge on the ideal transmission rate, and
then to oscillate slightly around the ideal transmission
rate as it continues to track changing network conditions.</t>

<t>Discarding or marking an incoming packet
at some point within the network are
what we refer to as indirect backpressure,
with the assumption that these actions will eventually
result in the sending application being throttled
via having a write call blocked,
returning an EWOULDBLOCK error,
or some other form of backpressure that
causes the source application
to temporarily pause sending new data.</t>

</section>
</section>
<section anchor="casestudy"><name>Case Study -- TCP_NOTSENT_LOWAT</name>

<t>In April 2011 the author was investigating
sluggishness with Mac OS Screen Sharing,
which uses the VNC Remote Framebuffer (RFB) protocol <xref target="RFC6143"/>.
Initially it seemed like a classic case of network bufferbloat.
However, deeper investigation revealed that in this case
the network was not responsible for the excessive delay --
the excessive delay was being caused by
excessive buffering on the sending device itself.</t>

<t>In this case the network connection was a relatively slow
DSL line (running at about 500 kb/s) and
the socket send buffer (SO_SNDBUF) was set to 128 kilobytes.
With a 50 ms round-trip time,
about 3 kilobytes (roughly two packets)
was sufficient to fill the bandwidth-delay product of the path.
The remaining 125 kilobytes available in the 128 kB socket send buffer
were simply holding bytes that had not even been sent yet.
At 500 kb/s throughput (62.5 kB/s),
this meant that every byte written by the VNC RFB server
spent two seconds sitting in the socket send buffer
before it even left the source machine.
Clearly, delaying every sent byte by two seconds
resulted in a very sluggish screen sharing experience,
and it did not yield any useful benefit like
higher throughput or lower CPU utilization.</t>

<t>This led to the creation in May 2011
of a new socket option on Mac OS and iOS
called “TCP_NOTSENT_LOWAT”.
This new socket option provided the ability for
sending software (like the VNC RFB server)
to specify a low-water-mark threshold for the
minimum amount of <strong>unsent</strong> data it would like
to have waiting in the socket send buffer.
Instead of inviting the application to
fill the socket send buffer to its maximum capacity,
the socket send buffer would hold just the data
that had been sent but not yet acknowledged
(enough to fully occupy the bandwidth-delay product
of the network path and fully utilize the available capacity)
plus some <strong>small</strong> amount of additional unsent data waiting to go out.
Some <strong>small</strong> amount of unsent data waiting to go out is
beneficial, so that the network stack has data
ready to send when the opportunity arises
(e.g., a TCP ACK arrives signaling
that previous data has now been delivered).
Too much unsent data waiting to go out
-- in excess of what the network stack
might soon be able to send --
is harmful for delay-sensitive applications
because it increases delay without
meaningfully increasing throughput or utilization.</t>

<t>Empirically it was found that setting an
unsent data low-water-mark threshold of 16 kilobytes
worked well for VNC RFB screen sharing.
When the amount of unsent data fell below this
low-water-mark threshold, kevent() would
wake up the VNC RFB screen sharing application
to begin work on preparing the next frame to send.
Once the VNC RFB screen sharing application
had prepared the next frame and written it
to the socket send buffer,
it would again call kevent() to block and wait
to be notified when it became time to begin work
on the following frame.
This allows the VNC RFB screen sharing server
to stay just one frame ahead of
the frame currently being sent over the network,
and not inadvertently get multiple frames ahead.
This provided enough unsent data waiting to go out
to fully utilize the capacity of the path,
without buffering so much unsent data
that it adversely affected usability.</t>

<t>A live on-stage demo showing the benefits of using TCP_NOTSENT_LOWAT
with VNC RFB screen sharing was shown at the
Apple Worldwide Developer Conference in June 2015 <xref target="Demo"/>.</t>

</section>
<section anchor="shortcomings-of-tcpnotsentlowat"><name>Shortcomings of TCP_NOTSENT_LOWAT</name>

<t>While TCP_NOTSENT_LOWAT achieved its initial intended goal,
later operational experience has revealed some shortcomings.</t>

<section anchor="platform-differences"><name>Platform Differences</name>

<t>The Linux network maintainers implemented a TCP
socket option with the same name but different behavior.
While the Apple version of TCP_NOTSENT_LOWAT was
focused on reducing delay,
the Linux version was focused on reducing kernel memory usage.
The Apple version of TCP_NOTSENT_LOWAT controls
a low-water mark, below which the application is signaled
that it is time to begin working on generating fresh data.
The Linux version determines a high-water mark for unsent data,
above which the application is <strong>prevented</strong> from writing any more,
even if it has data prepared and ready to enqueue.
Setting TCP_NOTSENT_LOWAT to 16 kilobytes works well on Apple systems,
but can increase CPU load and severely limit throughput on Linux systems.
This has led to confusion among developers and makes it difficult
to write portable code that works on both platforms.</t>

</section>
<section anchor="time-versus-bytes"><name>Time versus Bytes</name>

<t>The original thinking on TCP_NOTSENT_LOWAT focused on
the number of unsent bytes remaining, but it soon became
clear that the relevant quantity was time, not bytes.
The quantity of interest to the sending application
was how much advance notice it would get of impending
data exhaustion, so that it would have enough time
to generate its next logical block of data.
On low-rate paths (e.g., 250 kb/s and less)
16 kilobytes of unsent data could still result
in a fairly significant unnecessary queueing delay.
On high-rate paths (e.g., Gb/s and above)
16 kilobytes of unsent data could be consumed
very quickly, leaving the sending application
insufficient time to generate its next logical block of data
before the unsent backlog ran out
and available network capacity was left unused.
It became clear that it would be more useful for the
sending application to specify how much advance notice
of data exhaustion it required (in milliseconds, or microseconds),
depending on how much time the application anticipated
needing to generate its next logical block of data.</t>

<t>The application could perform this calculation itself,
calculating the estimated current data rate and multiplying
that by its desired advance notice time, to compute the number
of outstanding unsent bytes corresponding to that desired time.
For example, if the current average data rate is 1 megabyte per second,
and the application would like 0.1 seconds warning
before the backlog of awaiting data runs out,
then 1,000,000 x 0.1 gives us a
TCP_NOTSENT_LOWAT value of 100,000 bytes.</t>

<t>However, the application would have to keep adjusting its
TCP_NOTSENT_LOWAT value as the observed data rate changed.
Since the transport protocol already knows the number of
unacknowledged bytes in flight, and the current round-trip delay,
the transport protocol is in a better position
to perform this calculation.</t>

<t>In addition, the network stack knows if features like hardware
offload, aggregation, and stretch acks are being used,
which could impact the burstiness of consumption of unsent bytes.</t>

<t>Wi-Fi interfaces perform better when they send
batches of packets aggregated together instead of
sending individual packets one at a time.
The amount of aggregation that is desirable depends
on the current wireless conditions,
so the Wi-Fi interface and its driver
are in the best position to determine that.</t>

<t>If stretch acks are being used, then each ack packet
could acknowledge 8 data segments, or about 12 kilobytes.
If one such ack packet is lost, the following ack packet
will cumulatively acknowledge 24 kilobytes,
instantly consuming the entire 16-kilobyte unsent backlog,
and giving the application no advance notice that
the transport protocol is suddenly out of available data to send,
and some network capacity becomes wasted.</t>

<t>Occasional failures to fully utilize the entire
available network capacity are not a disaster, but we
still would like to avoid this being a common occurrence.
Therefore it is better to have the transport protocol,
in cooperation with the other layers of the network stack,
use all the information available to estimate
when it expects to run out of data available to send,
given the current network conditions
and current amount of unsent data.
When the estimated time remaining until exhaustion falls
below the application’s specified threshold, the application
is notified to begin working on generating more data.</t>

</section>
<section anchor="other-transport-protocols"><name>Other Transport Protocols</name>

<t>TCP_NOTSENT_LOWAT was initially defined only for TCP,
and only for the BSD Sockets programming interface.
It would be useful to define equivalent delay management
capabilities for other transport protocols,
like QUIC <xref target="RFC9000"/><xref target="RFC9369"/>,
and for other network programming APIs.</t>

</section>
</section>
<section anchor="tcpreplenishtime"><name>TCP_REPLENISH_TIME</name>

<t>Because of these lessons learned, this document proposes
a new BSD Socket option for TCP, TCP_REPLENISH_TIME.</t>

<t>The new TCP_REPLENISH_TIME socket option specifies the
threshold for notifying an application of impending data
exhaustion in terms of microseconds, not bytes.
It is the job of the transport protocol to compute its
best estimate of when the expected time-to-exhaustion
falls below this threshold.</t>

<t>The new TCP_REPLENISH_TIME socket option
should have the same semantics across all
operating systems and network stack implementations.</t>

<t>Other transport protocols, like QUIC,
and other network APIs not based on BSD Sockets,
should provide equivalent time-based backlog-management
mechanisms, as appropriate to their API design.</t>

<t>The time-based estimate does not need to be perfectly accurate,
either on the part of the transport protocol estimating how much
time remains before the backlog of unsent data is exhausted,
or on the part of the application estimating how much
time it will need to generate its next logical block of data.
If the network data rate increases significantly, or a group of
delayed acknowledgments all arrive together, then the transport
protocol could end up discovering that it has overestimated how
much time remains before the data is exhausted.
If the operating system scheduler is slow to schedule the
application process, or the CPU is busy with other tasks,
then the application may discover that it has
underestimated how much time it will take
to generate its next logical block of data.
These situations are not considered to be serious problems,
especially if they only occur infrequently.
For a delay-sensitive application, having some reasonable
mechanism to avoid an excessive backlog of unsent data is
dramatically better than having no such mechanism at all.
Occasional overestimates or underestimates do not
negate the benefit of this capability.</t>

<t>The IETF Transport Services API specification <xref target="RFC9622"/>
states that “Sent events allow an application to obtain
an understanding of the amount of buffering it creates.”
TCP_REPLENISH_TIME goes beyond
giving an application <strong>visibility</strong>
into the amount of buffering it creates,
by giving an application the ability to <strong>specify</strong>
the amount of buffering it would <strong>like</strong> to create.</t>

<section anchor="solicitation-for-name-suggestions"><name>Solicitation for Name Suggestions</name>

<t>Author’s note: The BSD socket option name “TCP_REPLENISH_TIME”
is currently proposed as a working name
for this new option for BSD Sockets.
While the name does not affect the behavior of the code,
the choice of name is important, because people often
form their first impressions of a concept based on its name,
and if they form incorrect first impressions then their
thinking about the concept may be adversely affected.</t>

<t>For example, one suggested name was “TCP_EXHAUSTION_TIME”.
We view “TCP_REPLENISH_TIME” and “TCP_EXHAUSTION_TIME”
as representing two interpretations of the same quantity.
From the application’s point of view, it is expressing
how much time it will require to replenish the buffer.
From the networking code’s point of view, it is estimating
how much time remains before it will need the buffer replenished.
In an ideal world,
REPLENISH_TIME == EXHAUSTION_TIME, so that the data is
replenished at exactly the moment the networking code needs it.
In a sense, they are two ways of saying the same thing.
Since this API call is made by the application, we feel it
should be expressed in terms of the application’s requirement.</t>

</section>
</section>
<section anchor="application-guidance"><name>Application Guidance</name>

<section anchor="program-structure"><name>Program Structure</name>

<t>For an application that wishes to achieve high throughput
without compromising the timeliness of its data,
this document recommends that the application use the
“TCP_REPLENISH_TIME” socket option (or equivalent)
to specify how much time it expects it will need
to generate its next batch of data.</t>

<t>After setting TCP_REPLENISH_TIME for a connection,
the application then uses a notification API like
kevent() on Mac OS (or equivalents on other platforms)
to block and wait until the networking code determines
that it is time to generate new data for that connection.
Immediately after the creation of a new connection,
kevent() (or equivalent) will immediately report that
it is ready for more data. Once the application has
written enough data to build up a sufficient backlog of
unsent data waiting on the source device, kevent() will stop
indicating that it is inviting the application to write more data.
Once the backlog of unsent data drains to the point
where the networking code expects it to be exhausted
in less than the time specified by TCP_REPLENISH_TIME
for that connection, kevent() again reports the socket
as writable to invite the application to generate its
next batch of data.</t>

<t>It is important to note that the kevent() signal indicating
that it is time to generate new data is a hint to the application.
The presence of the kevent() signal tells the application
that this is a good time to generate new data;
the absence of the kevent() signal is <strong>not</strong>
a <strong>prohibition</strong> on the application writing more data.
Even if kevent() is not signaling impending exhaustion
of the data buffer, an application is still free to write
as much data as is appropriate for that application
(potentially limited by some other parameter,
such as the SO_SNDBUF size in BSD Sockets).</t>

<t>Note that there is precedent for this
kind of behavior in current programming APIs.
For example, if a TCP connection on Linux
has a socket send buffer of 1000 kilobytes,
and a TCP ACK packet arrives
acknowledging 3 kilobytes of data,
leaving only 997 kilobytes of data
remaining in the socket send buffer,
then epoll() will not immediately wake up
the process to replenish the data and fill
the buffer back up to the full 1000 kilobytes.
Instead Linux will wait until the socket send
buffer occupancy has fallen to 50% before
waking up the process to replenish the data.
This allows the process to do a
relatively small number of efficient 500-kilobyte writes
instead of a huge number of little 3-kilobyte writes.
[Author’s note: I would appreciate a confirmation
that this is correct, with a reference, or alternatively
inform me if this is wrong and I will remove it.]</t>

<t>In this way the application is able to keep a
reasonable amount of data waiting in the outgoing buffer,
without building too much backlog resulting in excessive delay.</t>

</section>
<section anchor="selection-of-tcpreplenishtime-value"><name>Selection of TCP_REPLENISH_TIME value</name>

<t>The selection of the appropriate TCP_REPLENISH_TIME value
depends on the application’s needs.</t>

<t>For example, a screen sharing server (or a video streaming source)
sending data at 60 frames per second may require 17 milliseconds
to grab the frame from the screen (or camera), compress it,
and have the data ready for transmission.
Such an application might specify a TCP_REPLENISH_TIME
of 20 milliseconds, to give reasonable confidence that
it will have the next frame prepared and ready before
the transport protocol finishes sending the previous frame.
If the video capture process is more pipelined,
so that it takes the application 17 milliseconds
to capture the frame from the camera,
and then a further 17 milliseconds to compress that frame,
then it might specify a TCP_REPLENISH_TIME of 35 milliseconds.</t>

<t>For an application that cares most about
achieving the highest possible video quality,
and a little extra delay is not a serious problem,
it may be appropriate to specify a slightly higher
TCP_REPLENISH_TIME to ensure a slightly higher safety
margin and reduce the risk of the transport protocol
occasionally becoming starved of new data.</t>

<t>For an application that cares most about
getting the lowest possible delay rather than
achieving the highest utilization of available network capacity,
it may be appropriate to specify a slightly lower
TCP_REPLENISH_TIME to keep buffering delay to
a minimum, at the risk of occasionally leaving
some amount of network capacity unused.</t>

<t>Continuing the example of the video streaming application,
if a given frame has a lot of movement relative to the
previous frame, then the video compression algorithm
can be set either to encode the frame at lower quality
(yielding the same compressed data size)
or at the same quality
(yielding a larger compressed data size).
In the latter case, if the compressed data size is
three times larger than a typical compressed frame,
the application can still write that larger block of data.
The write is not prevented or blocked just because
it exceeds the desired TCP_REPLENISH_TIME budget.
After writing this larger block of data
kevent() (or equivalent) will not signal
that it is ready for more data
until after the large block has drained,
which may take more than one typical frame time.
In this way the kevent() loop has the effect of
automatically reducing the frame rate to stay within
the available network capacity, instead of continuing
to generate frames faster than the network can carry
them and building up an increasing backlog
(with a corresponding increasing delay).
The application may accept this reduced frame rate,
or it may choose to adjust its video compression algorithm
to a lower quality so as to increase the frame rate.
In either case, the source device buffering delay
is kept under control.</t>

<t>In all cases, it is expected that application writers will
experiment with different values of TCP_REPLENISH_TIME to
determine empirically what works best for their application.</t>

</section>
</section>
<section anchor="applicability"><name>Applicability</name>

<t>This time-based backlog management is applicable anywhere
that a queue of unsent data may build up on the sending device.</t>

<section anchor="physical-bottlenecks"><name>Physical Bottlenecks</name>

<t>A backlog may build up on the sending device if the source
of the packets is simply generating them faster than
the outgoing first-hop interface is able to send them.
This will cause a queue to build up in the network
hardware or its associated driver.
In this case,
to avoid packets suffering excessive queueing delay,
the hardware or its driver
needs to communicate backpressure to IP, which
needs to communicate backpressure to
the transport protocol (TCP or QUIC), which
needs to communicate backpressure to
the application that is the source of the data.
We refer to this case as a physical bottleneck.</t>

<t>For an example of a physical bottleneck,
consider the case where a user has symmetric
1 Gb/s Internet service,
and they are sending data from a device
communicating via Wi-Fi at a lower rate, say 300 Mb/s.
In this case (assuming the device is communicating
with a well-connected server on the Internet)
the limiting factor of the entire path is
the first hop -- the sending device’s Wi-Fi interface.
If the device’s Wi-Fi hardware, driver, and networking software
do not produce appropriate backpressure, then outgoing
network traffic will experience increasing delays.
The Linux Byte Queue Limits mechanism <xref target="Hruby"/><xref target="THJ"/><xref target="Herbert"/>
is one example of a technique to tune hardware buffers
to an appropriate size so that they are large enough
to avoid transmitter starvation without being
so large that they unnecessarily increase delay.</t>

<t>Poor backpressure from first-hop physical bottlenecks
can produce the ironic outcome that upgrading
home Internet service from 100 Mb/s to 1 Gb/s can sometimes
result in a customer getting a worse user experience,
because the service upgrade
causes the bottleneck hop to change location,
from the Internet gateway
(which may have good queue management using L4S <xref target="RFC9330"/>)
to the source device’s Wi-Fi interface,
which may have very poor source buffer management.</t>

<t>Note that when the physical bottleneck is the first-hop interface,
part of (or directly attached to) the source generating
the data stream, then the direct backpressure described here
is the appropriate way to signal that the source should slow down.</t>

<t>When the physical bottleneck is elsewhere along the path,
it may be a local interface from the point of view of the
device it is part of, but that device is not the original
source of the data -- that device is merely passing through
IP packets it received from another local interface
(that is to say, this device is acting as a router or switch).
In this situation the direct backpressure at the physical interface
cannot be immediately communicated directly to the source of
the data, because that software is running on a different device.
In this case the direct physical backpressure is communicated
instead to the device’s queue management algorithm,
which determines when it becomes appropriate to express
this local physical backpressure in the form of indirect backpressure
(i.e., ECN Congestion marks, or dropping the packet entirely)
that will indirectly cause the source to lower its sending rate.</t>

<t>In this way a physical bottleneck on the router
generates direct backpressure to the router’s queue management algorithm,
which generates indirect backpressure as appropriate,
which is manifested at the source as an algorithmic bottleneck
(the rate optimization or “congestion control” algorithm)
which moderates the rate at which the source will inject packets into the network
so as to match the rate the physical bottleneck can actually carry them.</t>

</section>
<section anchor="algorithmic-bottlenecks"><name>Algorithmic Bottlenecks</name>

<t>In addition to physical bottlenecks,
there are other reasons why software on the sending
device may choose to refrain from sending data as fast
as the outgoing first-hop interface can carry it.
We refer to these as algorithmic bottlenecks.</t>

<t>In the case study in <xref target="casestudy"/>, the bottleneck was the
transport protocol’s rate management (congestion control) algorithm,
not a physical constraint of the outgoing first-hop interface
(which was gigabit Ethernet).</t>

<t><list style="symbols">
  <t>If the TCP receive window is full, then the sending TCP
implementation will voluntarily refrain from sending new data,
even though the device’s outgoing first-hop interface is easily
capable of sending those packets.
This is vital to avoid overrunning the receiver with data
faster than it can process it.</t>
  <t>The transport protocol’s rate management (congestion control) algorithm
may determine that it should delay before sending more data, so as
not to overflow a queue at some other bottleneck within the network.
This is vital to avoid overrunning the capacity of the bottleneck
network hop with data faster than it can forward it,
resulting in massive packet loss,
which would equate to a large waste of resources at the sender,
in the form of battery power and network capacity wasted by
generating packets that will not make it to the receiver.</t>
  <t>When packet pacing is being used, the sending network
implementation may choose voluntarily to moderate the rate at
which it emits packets, so as to smooth the flow of packets into
the network, even though the device’s outgoing first-hop interface
might be easily capable of sending at a much higher rate.
A temporary backlog can build up at this layer if the source
is generating data faster than the pacing rate.</t>
</list></t>

<t>Whether the source application is constrained
by a physical bottleneck on the sending device, or
by an algorithmic bottleneck on the sending device,
it is still beneficial to avoid
overcommitting data to the outgoing buffer.</t>

<t>As described in the introduction,
the goal is for the application software to be able to
write chunks of data large enough to be efficient,
without writing too many of them too quickly,
and causing unwanted self-inflicted delay.</t>

</section>
<section anchor="superiority-of-direct-backpressure"><name>Superiority of Direct Backpressure</name>

<t>Since multi-hop network protocols already implement
indirect backpressure signaling
in the form of discarding or marking packets,
it can be tempting to use the same mechanism
to generate backpressure for first-hop physical bottlenecks.
Superficially, there might seem to be some attractive
elegance in having the first hop use the same drop/mark
mechanism as the remaining hops on the path.
However, this is not an ideal solution because indirect
backpressure from the network is very crude compared to
the much richer direct backpressure
that is available within the sending device itself.
Relying on indirect backpressure by
discarding or marking a packet in the sending device
is a crude rate-control signal, because it takes a full network
round-trip time before the effect of that drop or mark is
observed at the receiver and echoed back to the sender, and
it may take multiple such round trips before it finally
results in an appropriate reduction in sending rate.</t>

<t>In contrast to queue buildup in the network,
queue buildup at the sending device has different properties
regarding (i) security, (ii) packet size constraints, and (iii) immediacy.
This means that when it is the source device itself
that is building up a backlog of unsent data,
designers of networking software have more freedom about how to manage this.</t>

<t>(i) When the source of the data and the location of the backlog are
the same physical device, network security and trust concerns do not apply.</t>

<t>(ii) When the mechanism we use to communicate about queue state
is a software API instead of packets sent through a network,
we do not have the constraint of having to work within
limited IP packet header space.</t>

<t>(iii) When flow control is implemented via a local software API,
the delivery of STOP/GO information to the source is immediate.</t>

<t>Furthermore, the situation where the bottleneck is
the first hop of the path is a fairly common case,
and it is the case where indirect backpressure is at
its worst (it takes an entire network round trip to
learn what is already known on the sending device),
so it is worthwhile optimizing for this common case.</t>

<t>Direct backpressure can be achieved
simply by making an API call block,
or by returning a Unix EWOULDBLOCK error,
or by using equivalent mechanisms in other APIs,
and has the effect of immediately halting the flow of new data.
Similarly, when the system becomes able to accept more data,
immediately allowing the production of more data is achieved
by unblocking an API call,
by indicating that a socket has become writable using select() or kevent(),
or by using equivalent mechanisms in other APIs.</t>

<t>Direct backpressure, when available,
is vastly superior to indirect backpressure.
For rate adjustment signals generated within the network,
indirect backpressure has to be used because
in that situation better alternatives are not available.
Where direct backpressure mechanisms are possible they
should be preferred over indirect backpressure mechanisms.</t>

</section>
<section anchor="application-programming-interface"><name>Application Programming Interface</name>

<t>It is important to understand that these
backpressure mechanisms at the API layer are not new.
By necessity, backpressure has existed for as long as we have had
networking APIs (or serial port APIs, or file system APIs, etc.).
All applications have always had to be prevented from generating
a sustained stream of data faster than the medium can consume it.
The problem is not that backpressure mechanisms
did not exist, but that, historically, for networking APIs
these backpressure mechanisms were exercised far too late,
after an excessive backlog had already built up.</t>

<t>The proposal in this Source Buffer Management
document is not to define entirely new API mechanisms
that did not previously exist, or to fundamentally
change how networking applications are written;
the proposal is to make existing
networking API mechanisms work more effectively.
Depending on how a networking application is written,
using kevent() or similar mechanisms
to tell it when it is time to write to a socket,
it may be that the only change the application
needs is a single call using TCP_REPLENISH_TIME to indicate
its expected time budget to generate a new block
of data, and everything else in the application
remains completely unchanged.
Indeed, if a networking implementation were to adopt a reasonable
default value of TCP_REPLENISH_TIME (e.g., 20 ms) that is
broadly suitable for a wide range of applications,
then many existing applications based on kevent() loops
or similar mechanisms would immediately experience
significantly lower delays, without changing a single
line of code (or even needing to be recompiled).</t>

</section>
<section anchor="relationship-between-throughput-and-delay"><name>Relationship Between Throughput and Delay</name>

<t>It is important to understand that Source Buffer Management
using TCP_REPLENISH_TIME does not alter the overall
long-term average throughput of a data transfer.
Calculating the optimum rate to send data
(so as not to exceed the receiver’s capacity,
or the available network capacity)
remains the responsibility of the transport protocol.
Using TCP_REPLENISH_TIME does not alter the data rate;
it controls the delay between the time when data is generated
and the time when that data departs the sending device.
Using the example from <xref target="casestudy"/>, in both cases
the long-term average throughput was 500 kb/s.
What changed was that originally the application was
generating 500 kb/s with two whole seconds of outgoing delay;
after using TCP_NOTSENT_LOWAT the application was
generating 500 kb/s with just 250 milliseconds of outgoing delay.</t>

</section>
<section anchor="bulk-transfer-protocols"><name>Bulk Transfer Protocols</name>

<t>It is frequently asserted that latency matters primarily for
interactive applications like video conferencing and on-line games,
and latency is relatively unimportant for most other applications.</t>

<t>We do not agree with this characterization.</t>

<t>Even for large bulk data transfers
-- e.g., downloading a software update or uploading a video --
we believe latency affects performance.</t>

<t>For example, TCP Fast Retransmit <xref target="RFC5681"/> can immediately
recover a single lost packet in a single round-trip time.
TCP generally performs at its absolute best when the
loss rate is no more than one loss per round-trip time.
More than one loss per round-trip time requires
more extensive use of TCP SACK blocks
(which consume extra space in the packet header)
and makes the work of the
rate management (congestion control) algorithm harder.
This can result in the transport protocol temporarily
sending too fast, resulting in additional packet loss,
or too slowly, resulting in underutilized network capacity.
For a given fixed loss rate (in packets lost per second)
a higher total network round-trip time
(including the time spent in buffers in the sending network
interface, below the transport protocol layer)
equates to more lost packets per network round-trip time,
causing error recovery to occur less quickly.
A transport protocol cannot make rate adaptation changes
to adjust to varying network conditions in less than one
network round-trip time, so the higher the total network
round-trip time is, the less agile the transport protocol
is at adjusting to varying network conditions.</t>

<t>In short, a client running over a transport protocol
like TCP may not be a delay-sensitive application itself,
but the transport protocol is most definitely
delay-sensitive software, responding in real time
to changing network conditions.
The application doing the large bulk data transfer
may have no need to use TCP_REPLENISH_TIME
to manage its own application-layer backlog,
but the transport protocol it is using (e.g., TCP or QUIC)
obtains significant benefit from receiving timely
direct backpressure from the driver and hardware below
to keep the network round-trip time low.</t>

</section>
</section>
<section anchor="experimental-validation"><name>Experimental Validation</name>

<t>The mechanisms described in this document do not exist
for purely ideological or philosophical reasons.
Any work to improve source buffer management in end systems
should be validated by confirming that real-world applications
exhibit verifiably improved responsiveness, and by taking
measurements using benchmark tools that measure application-layer
round-trip times under realistic working conditions <xref target="RPM"/>.
Using the ‘ping’ command to send one ICMP Echo packet <xref target="RFC792"/>
per second on an otherwise idle network is not a good
predictor of real-world application performance.
Testing the scenario where the outgoing buffer is
almost always completely empty due to lack of traffic
does not reveal anything about how it will perform
when a nontrivial amount of data is being sent and
the buffer is no longer empty.
The quality of the source buffer management policy
and the effectiveness of its backpressure mechanisms
only become apparent when the source of the data is
willing and able to exceed the available network capacity,
and the backpressure mechanisms become operational
to regulate the rate that data is being sent.</t>

</section>
<section anchor="alternative-proposals"><name>Alternative Proposals</name>

<section anchor="just-use-raw-udp"><name>Just use “Raw UDP”</name>

<t>Because much of the discussion about network latency involves
talking about the behavior of transport protocols like TCP and QUIC,
sometimes people conclude that TCP and QUIC are the problem,
and they may imagine that directly using raw UDP packets
will magically solve the source buffering problem.
It does no such thing.
If an application sends raw UDP packets faster than the outgoing
network interface can carry them, then a queue of packets
will still build up, causing increasing delay for those packets,
and eventual packet loss when the queue reaches its capacity.</t>

<t>Any protocol that runs over UDP (like QUIC) must end up
re-creating the same rate optimization behaviors that
are already built into TCP, or it will fail to operate
gracefully over a range of different network conditions.</t>

<t>Networking APIs for UDP cannot include capabilities like
reliability, in-order delivery, and rate optimization,
because the UDP header has no sequence number or similar
fields that would make these capabilities possible.
However, networking APIs for UDP <bcp14>SHOULD</bcp14> provide appropriate
first-hop (direct) backpressure to the client software,
so that software using UDP can avoid unnecessary self-inflicted
delays when inadvertently attempting to send faster than
the outgoing first-hop interface can carry it.
Additionally, networking APIs for UDP <bcp14>SHOULD</bcp14> provide the
ability to read and write the ECN field of the IP header,
so that software using UDP can avoid unnecessary self-inflicted
delays when inadvertently attempting to send faster than
subsequent hops on the path can carry it <xref target="UDPECN"/>.
These backpressure mechanisms
(both first-hop direct backpressure and ECN-based indirect backpressure)
allow advanced protocols
like QUIC to provide capabilities like reliability,
in-order delivery, and rate optimization, while avoiding
unwanted delay caused by on-device first-hop buffering.</t>

</section>
<section anchor="expiration"><name>Packet Expiration</name>

<t>One approach that is sometimes used is to send packets
tagged with an expiration time, and if they have spent
too long waiting in the outgoing queue then they are
automatically discarded without even being sent.
This is counterproductive because the sending application
does all the work to generate data, and then has to do more
work to recover from the self-inflicted data loss caused by
the expiration time.</t>

<t>If the outgoing queue is kept short, then the
amount of unwanted delay is kept correspondingly short.
In addition, if there is only a small amount of data in the
outgoing queue, then the cost of sending a small amount of
data that may arguably have become stale is also small --
usually smaller than the cost of having to recover missing
state caused by intentional discard of that delayed data.</t>

<t>For example, in video conferencing applications it is
frequently thought that if a frame is delayed past the
point where it becomes too late to display it, then it becomes
a waste of network capacity to send that frame at all.
However, the fallacy in that argument is that modern
video compression algorithms make extensive use of
similarity between consecutive frames.
A given video frame is not just encoded as a single frame
in isolation, but as a collection of visual
differences relative to the previous frame.
The previous frame may have arrived too late for the
time it was supposed to be displayed, but the data
contained within it is still needed to decode and
display the current frame.
If the previous frame was intentionally discarded by the
sender, then the subsequent frames are also impacted by
that loss, and the cost of repairing the damage is
frequently much higher than the cost would have been
to simply send the delayed frame.
Just because a frame arrives too late to be displayed does
not mean that the data within that frame is not important.
The data contained within a frame is used not only to display
that frame, but also in the construction of subsequent frames.</t>

</section>
<section anchor="traffic-priorities-head-of-line-blocking"><name>Traffic Priorities / Head of Line Blocking</name>

<t>People are often very concerned about the problem of
head-of-line blocking, and propose to solve it using
techniques such as packet priorities,
the ability to cancel unsent pending messages <xref target="MMADAPT"/>,
and out-of-order delivery on the receiving side.
There is an unconscious, unstated assumption baked into
this line of reasoning, which is that having an excessively
long outgoing queue is inevitable and unavoidable, and therefore
we have to devote a lot of our energy working out how to organize
and prioritize and manage that obligatory excessive queue.
In contrast, if we take steps to keep queues short,
the problems of head-of-line blocking largely solve themselves.
When the line is consistently short, being at the back of
the line is no longer the serious problem that it used to be.</t>

<t>On the receiving device, if a single packet is lost,
then subsequent data cannot be delivered
to the receiving application in-order
until the missing packet is retransmitted
and arrives at the receiver to fill in the gap.
Using techniques like TCP Fast Retransmit <xref target="RFC5681"/>,
this recovery can occur in a single network round-trip time,
making the effective application-layer round-trip time
for that data twice the underlying network round-trip time.
When using techniques like L4S <xref target="RFC9330"/>
to minimize network losses and queueing delays,
even twice the network round-trip time may be substantially
better than today’s typical network round-trip times.
For many applications the difference between
one network round-trip time and
two network round-trip times may have
negligible effect on the user experience of that application,
especially if such degradations are rare.</t>

<t>There is a small class of applications,
like audio and video conferencing over long distances,
where people may feel that
a single network round-trip time provides adequate user experience
but two network round-trip times would be unacceptable.
This is the scenario where out-of-order delivery
on the receiving side appears attractive.
However, writing application code to take advantage of
out-of-order delivery has proven to be surprisingly difficult.
Many modern data types are not amenable to easy interpretation
when parts of the data are missing.
In compressed data, such as ZIP files, JPEG images,
and modern video formats,
correct interpretation of data depends on having the
data that preceded it, making it very difficult to write
software that will correctly handle gaps in the data.
For example, in a compressed video stream where a frame is encoded
as differences relative to the previous frame, there is no easy
way to decode the current frame when the previous frame is missing.
This scenario has many similarities to
Packet Expiration (<xref target="expiration"/>)
except that when using Packet Expiration the data loss is
intentional and self-inflicted, whereas out-of-order delivery
encompasses both the case of intentional packet loss by
the sender and inadvertent packet loss in the network.</t>

<t>In a network using L4S <xref target="RFC9330"/>, the motivation
for writing extremely complicated software to handle
out-of-order delivery (i.e., data with gaps) is weak,
especially when L4S makes actual packet loss exceedingly rare,
and Fast Retransmit recovers from these rare losses
in a single extra round-trip time,
which is low when L4S is being used.</t>

<t>Note that the justification for scenarios
where one network round-trip time is acceptable
but two network round-trip times would be unacceptable
only applies when the network round-trip time is large
relative to the user-experience requirements of the application.
For example, for distributing low-latency audio within a home network,
where round-trip delays over the local Ethernet or Wi-Fi network
are just a few milliseconds, simply relying on Fast Retransmit to recover
occasional lost packets within a few milliseconds <xref target="TCPFR"/>
makes the application programming easier and is preferable
to accepting received data out of order and then
playing degraded audio due to gaps in the data stream.
To give some calibration, the speed of sound in air is
roughly one foot per millisecond, so a 5 ms playback delay
buffer to allow for loss recovery equates to the same delay
as standing five feet further away from the speakers.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>No security concerns are anticipated resulting from reducing
the amount of stale data sitting in buffers at the sender.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<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 title='Informative References' anchor="sec-informative-references">

<reference anchor="Bloat1" target="https://gettys.wordpress.com/2010/12/06/whose-house-is-of-glasse-must-not-throw-stones-at-another/">
  <front>
    <title>Whose house is of glasse, must not throw stones at another</title>
    <author initials="J." surname="Gettys">
      <organization></organization>
    </author>
    <date year="2010" month="December"/>
  </front>
</reference>
<reference anchor="Bloat2" target="https://queue.acm.org/detail.cfm?id=2071893">
  <front>
    <title>Bufferbloat: Dark Buffers in the Internet</title>
    <author initials="J." surname="Gettys">
      <organization></organization>
    </author>
    <author initials="K." surname="Nichols">
      <organization></organization>
    </author>
    <date year="2011" month="November"/>
  </front>
  <seriesInfo name="ACM Queue, Volume 9, issue 11" value=""/>
</reference>
<reference anchor="Bloat3" target="https://dl.acm.org/doi/10.1145/2063176.2063196">
  <front>
    <title>Bufferbloat: Dark Buffers in the Internet</title>
    <author initials="J." surname="Gettys">
      <organization></organization>
    </author>
    <author initials="K." surname="Nichols">
      <organization></organization>
    </author>
    <date year="2012" month="January"/>
  </front>
  <seriesInfo name="Communications of the ACM, Volume 55, Number 1" value=""/>
</reference>
<reference anchor="Cake" target="https://ieeexplore.ieee.org/document/8475045">
  <front>
    <title>Piece of CAKE: A Comprehensive Queue Management Solution for Home Gateways</title>
    <author initials="T." surname="Høiland-Jørgensen">
      <organization></organization>
    </author>
    <author initials="D." surname="Taht">
      <organization></organization>
    </author>
    <author initials="J." surname="Morton">
      <organization></organization>
    </author>
    <date year="2018" month="June"/>
  </front>
  <seriesInfo name="2018 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN)" value=""/>
</reference>
<reference anchor="Demo" target="https://developer.apple.com/videos/play/wwdc2015/719/?time=2199">
  <front>
    <title>Your App and Next Generation Networks</title>
    <author initials="S." surname="Cheshire">
      <organization></organization>
    </author>
    <date year="2015" month="June"/>
  </front>
  <seriesInfo name="Apple Worldwide Developer Conference" value=""/>
</reference>
<reference anchor="Herbert" target="https://medium.com/@tom_84912/byte-queue-limits-the-unauthorized-biography-61adc5730b83">
  <front>
    <title>Byte Queue Limits: the unauthorized biography</title>
    <author initials="" surname="Tom Herbert">
      <organization></organization>
    </author>
    <date year="2025" month="January"/>
  </front>
</reference>
<reference anchor="Hruby" target="https://blog.linuxplumbersconf.org/2012/wp-content/uploads/2012/08/bql_slide.pdf">
  <front>
    <title>Byte Queue Limits</title>
    <author initials="" surname="Tomáš Hrubý">
      <organization></organization>
    </author>
    <date year="2012" month="August"/>
  </front>
</reference>
<reference anchor="MMADAPT" target="https://queue.acm.org/detail.cfm?id=2381998">
  <front>
    <title>Sender-side buffers and the case for multimedia adaptation</title>
    <author initials="" surname="Aiman Erbad">
      <organization></organization>
    </author>
    <author initials="" surname="Charles Buck Krasic">
      <organization></organization>
    </author>
    <date year="2012" month="October"/>
  </front>
  <seriesInfo name="ACM Queue, Volume 10, issue 10" value=""/>
</reference>


<reference anchor="RFC792">
  <front>
    <title>Internet Control Message Protocol</title>
    <author fullname="J. Postel" initials="J." surname="Postel"/>
    <date month="September" year="1981"/>
  </front>
  <seriesInfo name="STD" value="5"/>
  <seriesInfo name="RFC" value="792"/>
  <seriesInfo name="DOI" value="10.17487/RFC792"/>
</reference>
<reference anchor="RFC3168">
  <front>
    <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
    <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
    <author fullname="S. Floyd" initials="S." surname="Floyd"/>
    <author fullname="D. Black" initials="D." surname="Black"/>
    <date month="September" year="2001"/>
    <abstract>
      <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3168"/>
  <seriesInfo name="DOI" value="10.17487/RFC3168"/>
</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="RFC6143">
  <front>
    <title>The Remote Framebuffer Protocol</title>
    <author fullname="T. Richardson" initials="T." surname="Richardson"/>
    <author fullname="J. Levine" initials="J." surname="Levine"/>
    <date month="March" year="2011"/>
    <abstract>
      <t>RFB ("remote framebuffer") is a simple protocol for remote access to graphical user interfaces that allows a client to view and control a window system on another computer. Because it works at the framebuffer level, RFB is applicable to all windowing systems and applications. This document describes the protocol used to communicate between an RFB client and RFB server. RFB is the protocol used in VNC. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6143"/>
  <seriesInfo name="DOI" value="10.17487/RFC6143"/>
</reference>
<reference anchor="RFC8033">
  <front>
    <title>Proportional Integral Controller Enhanced (PIE): A Lightweight Control Scheme to Address the Bufferbloat Problem</title>
    <author fullname="R. Pan" initials="R." surname="Pan"/>
    <author fullname="P. Natarajan" initials="P." surname="Natarajan"/>
    <author fullname="F. Baker" initials="F." surname="Baker"/>
    <author fullname="G. White" initials="G." surname="White"/>
    <date month="February" year="2017"/>
    <abstract>
      <t>Bufferbloat is a phenomenon in which excess buffers in the network cause high latency and latency variation. As more and more interactive applications (e.g., voice over IP, real-time video streaming, and financial transactions) run in the Internet, high latency and latency variation degrade application performance. There is a pressing need to design intelligent queue management schemes that can control latency and latency variation, and hence provide desirable quality of service to users.</t>
      <t>This document presents a lightweight active queue management design called "PIE" (Proportional Integral controller Enhanced) that can effectively control the average queuing latency to a target value. Simulation results, theoretical analysis, and Linux testbed results have shown that PIE can ensure low latency and achieve high link utilization under various congestion situations. The design does not require per-packet timestamps, so it incurs very little overhead and is simple enough to implement in both hardware and software.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8033"/>
  <seriesInfo name="DOI" value="10.17487/RFC8033"/>
</reference>
<reference anchor="RFC8290">
  <front>
    <title>The Flow Queue CoDel Packet Scheduler and Active Queue Management Algorithm</title>
    <author fullname="T. Hoeiland-Joergensen" initials="T." surname="Hoeiland-Joergensen"/>
    <author fullname="P. McKenney" initials="P." surname="McKenney"/>
    <author fullname="D. Taht" initials="D." surname="Taht"/>
    <author fullname="J. Gettys" initials="J." surname="Gettys"/>
    <author fullname="E. Dumazet" initials="E." surname="Dumazet"/>
    <date month="January" year="2018"/>
    <abstract>
      <t>This memo presents the FQ-CoDel hybrid packet scheduler and Active Queue Management (AQM) algorithm, a powerful tool for fighting bufferbloat and reducing latency.</t>
      <t>FQ-CoDel mixes packets from multiple flows and reduces the impact of head-of-line blocking from bursty traffic. It provides isolation for low-rate traffic such as DNS, web, and videoconferencing traffic. It improves utilisation across the networking fabric, especially for bidirectional traffic, by keeping queue lengths short, and it can be implemented in a memory- and CPU-efficient fashion across a wide range of hardware.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8290"/>
  <seriesInfo name="DOI" value="10.17487/RFC8290"/>
</reference>
<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>
<reference anchor="RFC9330">
  <front>
    <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
    <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
    <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
    <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
    <author fullname="G. White" initials="G." surname="White"/>
    <date month="January" year="2023"/>
    <abstract>
      <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
      <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9330"/>
  <seriesInfo name="DOI" value="10.17487/RFC9330"/>
</reference>
<reference anchor="RFC9369">
  <front>
    <title>QUIC Version 2</title>
    <author fullname="M. Duke" initials="M." surname="Duke"/>
    <date month="May" year="2023"/>
    <abstract>
      <t>This document specifies QUIC version 2, which is identical to QUIC version 1 except for some trivial details. Its purpose is to combat various ossification vectors and exercise the version negotiation framework. It also serves as a template for the minimum changes in any future version of QUIC.</t>
      <t>Note that "version 2" is an informal name for this proposal that indicates it is the second version of QUIC to be published as a Standards Track document. The protocol specified here uses a version number other than 2 in the wire image, in order to minimize ossification risks.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9369"/>
  <seriesInfo name="DOI" value="10.17487/RFC9369"/>
</reference>
<reference anchor="RFC9622">
  <front>
    <title>An Abstract Application Programming Interface (API) for Transport Services</title>
    <author fullname="B. Trammell" initials="B." role="editor" surname="Trammell"/>
    <author fullname="M. Welzl" initials="M." role="editor" surname="Welzl"/>
    <author fullname="R. Enghardt" initials="R." surname="Enghardt"/>
    <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
    <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
    <author fullname="C. S. Perkins" initials="C. S." surname="Perkins"/>
    <author fullname="P.S. Tiesel" initials="P.S." surname="Tiesel"/>
    <author fullname="T. Pauly" initials="T." surname="Pauly"/>
    <date month="January" year="2025"/>
    <abstract>
      <t>This document describes an abstract Application Programming Interface (API) to the transport layer that enables the selection of transport protocols and network paths dynamically at runtime. This API enables faster deployment of new protocols and protocol features without requiring changes to the applications. The specified API follows the Transport Services Architecture by providing asynchronous, atomic transmission of Messages. It is intended to replace the BSD Socket API as the common interface to the transport layer, in an environment where endpoints could select from multiple network paths and potential transport protocols.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9622"/>
  <seriesInfo name="DOI" value="10.17487/RFC9622"/>
</reference>

<reference anchor="RPM">
   <front>
      <title>Responsiveness under Working Conditions</title>
      <author fullname="Christoph Paasch" initials="C." surname="Paasch">
         </author>
      <author fullname="Randall Meyer" initials="R." surname="Meyer">
         <organization>Apple Inc.</organization>
      </author>
      <author fullname="Stuart Cheshire" initials="S." surname="Cheshire">
         <organization>Apple Inc.</organization>
      </author>
      <author fullname="Will Hawkins" initials="W." surname="Hawkins">
         <organization>University of Cincinnati</organization>
      </author>
      <date day="20" month="October" year="2025"/>
      <abstract>
	 <t>   For many years, a lack of responsiveness, variously called lag,
   latency, or bufferbloat, has been recognized as an unfortunate, but
   common, symptom in today&#x27;s networks.  Even after a decade of work on
   standardizing technical solutions, it remains a common problem for
   the end users.

   Everyone &quot;knows&quot; that it is &quot;normal&quot; for a video conference to have
   problems when somebody else at home is watching a 4K movie or
   uploading photos from their phone.  However, there is no technical
   reason for this to be the case.  In fact, various queue management
   solutions have solved the problem.

   Our network connections continue to suffer from an unacceptable
   amount of delay, not for a lack of technical solutions, but rather a
   lack of awareness of the problem and deployment of its solutions.  We
   believe that creating a tool that measures the problem and matches
   people&#x27;s everyday experience will create the necessary awareness, and
   result in a demand for solutions.

   This document specifies the &quot;Responsiveness Test&quot; for measuring
   responsiveness.  It uses common protocols and mechanisms to measure
   user experience specifically when the network is under working
   conditions.  The measurement is expressed as &quot;Round-trips Per Minute&quot;
   (RPM) and should be included with goodput (up and down) and idle
   latency as critical indicators of network quality.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-ippm-responsiveness-08"/>
   
</reference>

<reference anchor="TCPFR" target="http://stuartcheshire.org/papers/Ruckus-WiFi-Evaluation.pdf">
  <front>
    <title>Ruckus WiFi Evaluation</title>
    <author initials="S." surname="Cheshire">
      <organization></organization>
    </author>
    <date year="2006" month="April"/>
  </front>
</reference>
<reference anchor="THJ" target="https://www.ietf.org/proceedings/86/slides/slides-86-iccrg-0.pdf">
  <front>
    <title>The State of the Art in Bufferbloat Testing and Reduction on Linux</title>
    <author initials="" surname="Toke Høiland-Jørgensen">
      <organization></organization>
    </author>
    <date year="2013" month="March"/>
  </front>
</reference>



<reference anchor="UDPECN">
   <front>
      <title>Configuring UDP Sockets for ECN for Common Platforms</title>
      <author fullname="Martin Duke" initials="M." surname="Duke">
         <organization>Google</organization>
      </author>
      <date day="4" month="May" year="2026"/>
      <abstract>
	 <t>   Explicit Congestion Notification (ECN) applies to all transport
   protocols in principle.  However, it had limited deployment for UDP
   until QUIC became widely adopted.  As a result, documentation of UDP
   socket APIs for ECN on various platforms is sparse.  This document
   records the results of experimenting with these APIs in order to get
   ECN working on UDP for Chromium on Apple, Linux, and Windows
   platforms.

   This document provides a snapshot of ECN state of affairs as
   supported by these platforms at the time of writing.  Readers should
   refer to the documentations of the various platforms for an up-to-
   date information on the matter.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-tsvwg-udp-ecn-08"/>
   
</reference>



    </references>

</references>


<?line 1359?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>This document has benefited from input and suggestions from:
Chris Box,
Morten Brørup,
Neal Cardwell,
Yuchung Cheng,
Eric Dumazet,
Jonathan Lennox,
Sebastian Moeller,
Yoshifumi Nishida,
Christoph Paasch,
Kevin Smith,
Ian Swett,
Michael Welzl,
all who joined the side meeting at IETF 121 in Dublin (November 2024),
and others [please don’t be shy about reminding me if I somehow missed your name].</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA8V9644cR5be/3iKtAQD3URVs5sUKYqzs7vNi0RqxMuyWyOP
d3YHWVVZVSlmZdbkpYs1Mo15DBtYA9632D/+44FfZJ7E5zuXiMisrBa1gGEB
M+yuroyMy4lz/c450+nUtXlbZI+Tz66qrp5nyZNuuczq5FVapqtsk5XtZy6d
zers5tavzNM2W1X1/nGSl8vKuUU1L9MNDbuo02U7na+zZp3X2bSZbabnX7im
m23ypsmrst1vMzy0yLYZ/V/ZurLbzLL6sVvQkI+Te+f3Hk7Pv5yeP3Q0g/vu
8ySts/Rx8sPLa/p5V9XvV3XVbR8n11e//eGb5LpOy2Zb1W2SlovkKqtv8nnW
JD/Q9/JylXyD77r32Z4eXDx2yVTXMiuqtMWv39FLy/keP77LaKCyyW+yMmsa
R/902WN6Z6Iv/OEb/CLz74+fJJs0Lx4ntNi/z7N2eVbVK3w3refrx8m6bbfN
47t3sw/pZltkZ/Nqc5fGonHzdt3NsM1tl9btU92zu4db+Bl9u6CZNi1928br
P3Umo53l1cjzIx+drdtN8ZlzadeuqxpbQ+9IkmVXFHKQMnxi4/NfaV1pmf8p
bekgHyeXW1pO8rKcn/EfM9kEe8nfp1tdrXNlVW/ooRvaTwd6Cb8lyRMcxcVj
HsJPBv9NiUqax8m3Z8k3WdvuG/7UiPeHddVkybrq6P/zJqmWyapImyabJJuu
aZOyapN2XVe7pGkrOs4kBYFU7TqrP+NxhNieZfMMxEdUd3Eu46f1KmvDoa34
1Wcgn21NZMGnh2/fvbh39/zh3R3mMeV5TPNmWi2nMo8ppjGlN055GlOZxjRt
pzqNu7b0e5+6dPv0N2fJ63y+ror+jkSETQtL6/dK6g09RXuBg2qzuszaeANe
Vzd+Ay748yar86zBIdEBP32V/EOXdbSrv62KbpMlX01ot5suS/Tbw+36I759
ls43uAJ3F1lLJHE2X27+Ll/8+t75lxePvrpv677//3Pd36YlUfcey753sOyn
1WbTlfmcyZxpC8PQZvhtePBgkrxmtpWM78OiCJtQ5Xcvzs8uLr54QITz8P7F
lw/P+N+vHtKjT9P32fGNuD5LXvzl3/KCeNv027/8G72jbLKy95VnZ8l1um6H
+/eKWGJV9jbqbU7UjtU8vfzNczpcrJNoep0xz5ODjnh8ckVrxQ4kdF+TFxUt
+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

-->

</rfc>

