<?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.6.14 (Ruby 2.6.10) -->


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

]>


<rfc ipr="trust200902" docName="draft-cheshire-sbm-02" 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="2025" month="March" day="16"/>

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

    <abstract>


<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/"/>.
      </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>


<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>

</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>
<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 generally imposed some upper bound on
the amount of outstanding incomplete writes they would support.
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 informative 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 simply 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 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 as 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 35Mb/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 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 reasons the cable modem’s choices are so limited
are 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 acknowledgement
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 acknowledgement
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 signalling
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
focussed on reducing delay,
the Linux version was focussed on reducing kernel memory usage.
The Apple version of TCP_NOTSENT_LOWAT controls
a low-water mark, below which the application is signalled
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 focussed 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 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 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 good throughput
while also caring about the timeliness of its data,
the recommendation is 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 signalling 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 precendent 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
between when it grabs the frame from the screen (or camera),
compresses it, and has the data ready for transmission.
Such an application might specify a TCP_REPLENISH_TIME
of 20 milliseconds, so 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
1Gb/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
does 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 100Mb/s to 1Gb/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 mangement using L4S <xref target="RFC9330"/>)
to the source device’s Wi-Fi interface,
which may have very poor source buffer management.</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 wastage 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.
When packet pacing is being used, 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 signalling
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 though 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 making an API call block,
or by returning a Unix EWOULDBLOCK error,
or 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,
unblocking an API call, indicating that a socket
has become writable using select() or kevent(),
or equivalent mechanisms in other APIs,
has the effect of immediately allowing the production of more data.</t>

<t>Indirect backpressure is vastly inferior to direct backpressure.
For rate adjustment signals generated within the network,
indirect backpressure has to be used because
in that situation better alternatives are not available.
Direct backpressure is vastly superior,
and 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 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 use existing
networking API mechanisms 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.</t>

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

<t>Is 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 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 seconds of outgoing delay;
after using TCP_REPLENISH_TIME the application was
generating 500 kb/s with 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 itself not be a real-time delay-sensitive application,
but a transport protocol itself is most definitely a
delay-sensitive application, 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 a 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-udp"><name>Just use UDP</name>

<t>Because much of the discussion about network latency involves
talking about the behavior of transport protocols like TCP,
sometimes people conclude that TCP is the problem,
and think that using UDP will solve the source buffering problem.
It does no such thing.
If an application sends 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 <xref target="RFC9000"/><xref target="RFC9369"/>) 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
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.
This backpressure allows 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 with 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 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 into 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 go away.
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 surprising 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 real-time 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='Normative References'>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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'>

<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' target='https://www.rfc-editor.org/info/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/RFC0792'/>
</reference>

<reference anchor='RFC3168' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://datatracker.ietf.org/doc/html/draft-ietf-ippm-responsiveness-05'>
   <front>
      <title>Responsiveness under Working Conditions</title>
      <author fullname='Christoph Paasch' initials='C.' surname='Paasch'>
         <organization>Apple Inc.</organization>
      </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='21' month='October' year='2024'/>
      <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 latency, 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-05'/>
   
</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>


    </references>


<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:
H4sIAHF91mcAA8V9644bSZbe/3iKdDcMqASSqpJaarXGs7ulS7eqR5daVfW0
xzu7gySZJHOUzORkJoti98qYx7CBNeB9i/3jPx74ReZJfL5ziYhMJkvqBQw3
MKMqFjMy4sSJc/3OifF47Nq8LbInyRdX1baeZcnT7WKR1cnrtEyX2Tor2y9c
Op3W2c2tX5mlbbas6v2TJC8XlXPzalamaxp2XqeLdjxbZc0qr7NxM12PT++7
Zjtd502TV2W732R4aJ5tMvq/snXldj3N6iduTkM+Se6f3n84Pn0wPnvkaAYP
3JdJWmfpk+THi2v6eVfV75d1td08Sa6vfvvjd8l1nZbNpqrbJC3nyVVW3+Sz
rEl+pO/l5TL5Dt9177M9PTh/4pKxrmVaVGmLX1/RS8vZHj++y2igsslvsjJr
Gkf/bLMn9M5EX/jjd/hF5t8dP0nWaV48SWixf5dn7WJS1Ut8N61nqyfJqm03
zZN797IP6XpTZJNZtb5HY9G4ebvaTkHmdpvW7TOl2b1DEn5B3y5opk1L37bx
uk9NZLRJXg08P/DRZNWuiy+cS7ftqqpBGnpHkiy2RSEbKcMnNj7/ldaVlvlP
aUsb+SQ539BykotyNuE/ZkIEe8nfpRtdrXNlVa/poRuipwO/hN+S5Cm24uwJ
D+Eng//GxCXNk+T7SfJd1rb7hj815v1xVTVZsqq29P95k1SLZFmkTZONkvW2
aZOyapN2VVe7pGkr2s4kBYNU7Sqrv+BxhNmeZ7MMzEdcd3Yq46f1MmvDpi35
1ROwz6YmtuDdw7fvnd2/d/ro3g7zGPM8xnkzrhZjmccY0xjTG8c8jbFMY5y2
Y53GPVv6/c9dun36m0nyJp+tqqJLkYixaWFp/V5ZvaGniBbYqDary6yNCfCm
uvEEOOPPm6zOswabRBv87HXy99tsS1T9bVVs11nyzYio3WyzRL/dJ9ef8O1J
OlvjCNybZy2xxGS2WP9tPv/1/dOvzx5/88DW/eD/57q/T0vi7j2Wff9g2c+q
9Xpb5jNmc+YtDEPE8GR4+HCUvGGxlQzTYV4EIlT5vbPTydnZVw+JcR49OPv6
0YT//eYRPfosfZ8dJ8T1JHn5l3/LC5Jt4+//8m/0jrLJys5Xnk+S63TV9un3
mkRiVXYIdZkTt2M1z85/84I2F+sknl5lLPNkoyMZn1zRWkGBhM5r8rKiZX9H
tNul+6ZDyW2ZgYyPD8iID5OLFy9e6A4wOdMiudqvN1WTb9cJjf2qmtFHkN2v
s7auNlWRt2mZnJPMT95kLeR9k9x5df7m9fmbk0FS51mWfdgUFYlA/Kg0n22x
hnuPv/r64elXD+nB59m6Ok7oq0lX0BnNfkcKEHKOZ/gm+9ASY5ZZzUvx8xsi
x8PDw8TSkhRHMd/l84wmdJMV1YZY6FlVEr+SGsqGecm+OPES9d4NjVA19zZF
ur+3281neOO9r8++ufe3bb7Ofn3/7JtvaKyXdC6yur2Fv6q1fal7pvatMcSr
fJ239FUcgW0pg+Q/ZfNkmlfLOt2s9sPn6v7DwcWsszntPK/h79pq/YfHX31D
gnRK7xuz7BgX/D6Smtk4ft3Yv2786Cydzx5+/eB0+hjC5GW9ne5vXeJf/vX/
/Ct/7S//6/ZVxis53y6hSLyA6C+EBM5yUuTllniPJUEzo21k7sMz93abMX3Q
ggm3xJ3pvJHPTx/fm/6p+ENT0A5ONvMFDf769fnz88vr42s4z9d0Jl7U03Te
+fzZKq0LUm5Pt7P3yW/qtMlnnQVewcKqxw3YbapCEYyMvZylpDlxstfbAjwz
z9Mknaeblnk7psTbWVupijiUlYcq4uzU64hhlXqrjnjwmFgXsuTdt8++/oZ1
I/304OzRY/3x4aPHZ/rjo7OvHuiPj08f+B/vf3OqP35zeup/fPAg/PjoG/vx
0X15xeXrJ8nF+PkE1ts432zW47prDSbJ9bPLb9/9cgnyjvZmSwZp/m2evLhJ
i+0Bfc83dV4QdU8fHZCLqNWwGWZGFZNsk5IwaO7JyGOMPA4jK09dv/z+tjPx
PjuqWGzi18QkV8QNmVeAZA2SSo30bXJNFinMYDDVu2y+nbFchFjHwYgX+Rq2
MFjowSBP7Ha7iVnO9zZ1NcuIIctlc+/xo3t8VBr9Z/z40Tifzerl+JRX6sbj
cZJOm7ZOZ61zF6LyNykd3Xk2S4nxYWyRpZg2yTTLShjzO57yjvwKbC09XW1h
LWaOjtOaDOAkoxXOWtb802i1ak+UIvZHdpRkdCejV9WcnRQQQQU3FFGTFDnR
/NVXV0lb0Tmbw5akh2lUWu20yNYT97La0QP1qPPOSt7Z8ElOSEZlxSKpYWqT
ZZImTb4s8wWZKuRH0ai5qlgdc5TsVmQx8eJhEddkABBDz+mxNe19TVYxBBS4
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
/zhx/xe2pX3tTdgAAA==

-->

</rfc>

