<?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-ietf-ippm-responsiveness-06" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Responsiveness under Working Conditions">Responsiveness under Working Conditions</title>

    <author initials="C." surname="Paasch" fullname="Christoph Paasch">
      <organization></organization>
      <address>
        <email>christoph.paasch+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="R." surname="Meyer" fullname="Randall Meyer">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>rrm@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Cheshire" fullname="Stuart Cheshire">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>cheshire@apple.com</email>
      </address>
    </author>
    <author initials="W." surname="Hawkins" fullname="Will Hawkins">
      <organization>University of Cincinnati</organization>
      <address>
        <email>hawkinwh@ucmail.uc.edu</email>
      </address>
    </author>

    <date year="2025" month="June" day="26"/>

    <area>Transport</area>
    <workgroup>IP Performance Measurement</workgroup>
    <keyword>Internet-Draft</keyword>

    <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's networks.
Even after a decade of work on standardizing technical solutions,
it remains a common problem for the end users.</t>

<t>Everyone "knows" that it is "normal" 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.</t>

<t>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's
everyday experience will create the necessary awareness,
and result in a demand for solutions.</t>

<t>This document specifies the "Responsiveness Test" 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 "Round-trips Per Minute" (RPM)
and should be included with goodput (up and down) and
idle latency as critical indicators of network quality.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<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's networks <xref target="Bufferbloat"/>.
Solutions like fq_codel <xref target="RFC8290"/>, PIE <xref target="RFC8033"/>, Cake <xref target="Cake"/>
and L4S <xref target="RFC9330"/> have been standardized
and implemented, and are, to some extent, deployed.
Nevertheless, poor network responsiveness,
resulting from bufferbloat and other causes,
continues to affect many services and the people who use them.</t>

<t>Whenever a network path is actively being used at its full capacity,
if the bottleneck link has poor buffer management
then it may allow an overly large queue to build up,
resulting in high delay for the traffic in that queue.
Although bufferbloat significantly degrades user experience,
the impact can be transitory.
On a network that is generally underutilized
except for occasional medium-sized data transfers,
like sending an email with an attachment, or uploading a photo,
the user-experience disruptions can be intermittent and brief,
making them hard to diagnose.
The user may notice that the network seems sluggish for a few seconds,
or a videoconferencing application may briefly
show a message saying that the connection is “unstable”,
but before the user has a chance to run any
diagnostic tools to investigate, the problem has disappeared.
People have come to accept that the Internet will have “glitches”
from time to time, and it has almost become considered normal.
Upgrading to an Internet connection with higher
capacity does not eliminate these disruptions,
but it can shorten their duration.
Ironically, this has the effect of making the problem even
harder to diagnose, so instead of fixing the true problem,
this “upgrade” creates a situation where the actual
underlying problem is even more likely to remain unsolved.
Instead of eliminating Internet glitches,
it just makes them a little more elusive and harder to investigate.</t>

<t>To help engineers work on eliminating these glitches
it is useful to have a tool that
(a) reliably recreates the conditions that cause systems with
poor buffer management to exhibit latency spikes, and
(b) quantifies the magnitude of the resulting latency spikes.
This helps engineers identify where these problems exist.
After design changes are made, it helps engineers quantify
how much their changes have improved the situation.</t>

<t>Note that this document does not advocate
for entirely eliminating queues from networking,
or even for mandating shallow queues of some arbitrary fixed size.
Packet-switched network traffic tends to be bursty,
to varying degrees depending on the technology,
and queuing performs the essential function of
smoothing out those bursts to avoid packet loss.
What this document recommends is that (a) network queues should
be large enough to perform their essential smoothing function,
without being so large that they add additional unnecessary delay,
and (b) that when a persistent standing queue begins to form
(therefore exceeding the amount of queueing needed for smoothing)
network queues should communicate feedback
back to the sender, telling to to reduce its
sending rate to allow the standing queue to drain.</t>

<t>Including the responsiveness-under-working-conditions
test among other measurements of network quality
(e.g., goodput and idle latency) helps customers make
informed choices about the Internet service they buy.</t>

<section anchor="terminology"><name>Terminology</name>

<t>The term "bufferbloat" describes the situation where a network device
is prone to buffering an excessive number of packets in transit through
that device, causing a backlog of packets waiting to go out,
resulting in those waiting packets experiencing excessive delay.</t>

<t>"Latency" is a poor way to report responsiveness,
because it can be hard for the general public to understand.
The units are unfamiliar to many ("what is a millisecond?") and
can be counterintuitive ("100 msec -- that sounds good --
it's only a tenth of a second!").</t>

<t>Instead, we define the term "responsiveness under working conditions"
to make it clear that we are measuring all, not just idle, conditions,
and use "round-trips per minute" as the unit.
The advantage of using round-trips per minute as the unit are two-fold: First, it allows for a unit
that is "the higher the better". This kind of unit is often more intuitive for end-users.
Second, the range of the values tends to be around the four-digit integer range, which
is also a value easy to compare and read, again allowing for a more intuitive use.
Finally, we abbreviate the unit to "RPM", a wink to the
"revolutions per minute" that we use for car engines.</t>

<t>Some readers have complained that they don’t understand what "RPM" means,
and that it is just an arbitrary number with no way to judge
what should be considered a bad RPM rating or a good RPM rating.
We counter that argument by saying that round-trip times expressed
in milliseconds are equally arbitrary, and people similarly judge
whether a certain number of milliseconds is “good” or “bad”
from their personal experience and in relation to the range of
round trip times that are observed across a range of technologies.
In the same way, the RPM of a car engine is also interpreted
relative to the range of values that people have learned to expect.
We have learned that 8000 RPM is high for a car engine,
and anything below 1000 RPM is low.
By happy coincidence, the range of values observed for network
responsiveness happen to fall into this familiar range.</t>

<t>This document defines an algorithm for the "Responsiveness Test"
that explicitly measures responsiveness under working conditions.</t>

<t>This document imports terminology and concepts from HTTP <xref target="RFC9110"/>,
such as request and response header fields and content.</t>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" 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>
<section anchor="overview"><name>Overview</name>

<t>In the last few decades, the networking industry has made enormous
advances in terms of the quantity of data our wired and wireless
links can transfer. Rates have gone from kilobits per second, to
megabits, to gigabits, and continue to increase.
We also have broad industry agreement on the units for measuring
network capacity -- bits per second.
We have a wide array of tools available for measuring capacity
in these units, and these tools generally produce results that
are consistent and comparable between different tools.</t>

<t>In contrast to our remarkable improvements in throughput, we have
not done a good job developing networks that deliver consistently
low delay in all normal operating conditions. In fact, many people
may have unconsciously assumed that it would not be possible to
achieve such a capability. Correspondingly, we have not had
industry agreement on what constitutes reasonable fair working
conditions under which to measure a network’s round-trip delay,
and, consequently, for a long time we have measured and reported
the round-trip time on an idle network as the only metric.
The actual round-trip
times observed when traffic is flowing have generally been so much
worse than the idle round-trip time (often by a factor of 100 or
more) that it seemed almost impolite to draw attention to them.</t>

<t>And so, by measuring and reporting throughput and idle round-trip
time, we have motivated vendors and operators to focus on those
aspects of performance, and to neglect other factors that also
impact the quality of user experience.</t>

<t>Measurements of idle round-trip time can be informative, but users
care about how well their network performs when they are
using it, not only how well it performs when no one is using it.
In this document we specify how to measure network round-trip time
under reasonable representative operating conditions.
This document focusses on this specific aspect of network quality,
because we feel it is a particularly pressing issue at this time.
Future companion documents could address how to measure and report
other aspects of network quality that affect user experience.</t>

<section anchor="relevance"><name>Relevance</name>

<t>The most important property of this test tool is that its
results should be a good predictor of user experience.
High scores on the Responsiveness Test should
correlate with good user experience, and low
scores should correlate with poor user experience.
A test with this predictive power gives network engineers
a way to experiment with code changes
and then use the test to evaluate whether the changes
are beneficial, instead of having to judge the effects subjectively,
for example, by conducting a video conference and trying to assess
whether it seems to be working better or worse.</t>

</section>
<section anchor="repeatability"><name>Repeatability</name>

<t>For the test to be useful, it has to produce consistent results.
If results vary wildly from run to run, then an engineer doesn’t
know whether a different result from the test is a result of a
software change or just an artifact of randomness in the test.</t>

</section>
<section anchor="convenience"><name>Convenience</name>

<t>The test should complete as quickly as possible,
ideally with ten seconds, but only if this can be achieved
without sacrificing relevance and repeatability.</t>

</section>
<section anchor="interaction-with-end-systems"><name>Interaction with End Systems</name>

<t>Network delays that occur when traffic is flowing are not purely
a property of the network. How traffic flows is a result of the
interaction between the behavior of the network and the behavior
of the end systems generating and receiving the traffic.
Consequently, if we are to obtain useful measurements pertaining
to the network itself, uncontaminated by noise or bias introduced
by the test endpoints, we need to ensure that the test endpoints
are of the highest quality and are not responsible for introducing
significant delays (or delay variation) themselves.
This means that the test endpoints should be using source buffer management
techniques like TCP_NOTSENT_LOWAT <xref target="RFC9293"/><xref target="SBM"/>
to keep the backlog of unsent data
limited to a reasonable amount, in conjunction with the current
best-in-class rate adaptation algorithms
(such as the Prague congestion controller
<xref target="Prague"/>)
and the current best-in-class network signalling (such as L4S <xref target="RFC9330"/>).
These techniques allow the network to signal when the source
is sending too fast and a queue is starting to build up, so
that the source can adjust its sending rate accordingly.
We believe that having the network signal when the source is sending
more data than the network can carry (rather than just letting the
situation worsen until a queue overflows and packets are lost) is
vital for creating networks that deliver consistent low delay.
If our belief is correct, we expect the test results to reflect that
networks with this signalling yield lower delays than networks without it.
In any case, if the sending and receiving test endpoints are not
able to make use of L4S signalling, then the test will be unable
to measure and report the effect of L4S support (or its absence)
in the network’s bottleneck links.</t>

</section>
<section anchor="purpose-of-test-tool"><name>Purpose of Test Tool</name>

<t>The primary purpose of this test tool is to evaluate network
behavior, and that is the main focus of this document.</t>

<t>However, a secondary use can be to evaluate client and server software.</t>

<t>If a particular test client, over a particular network path,
produces good responsiveness scores when communicating with a
known-good test server, but poor results when using another test
server, that suggests problems with the other test server.
We have already had cases where we used an existing HTTP server
as a test endpoint, got worse-than-expected responsiveness scores,
and as a result realized that the HTTP server had some poor
configuration settings, which were also causing unnecessary
slowness for the other user-facing traffic it was serving. Tuning
these configuration settings for higher responsiveness lowered
delays across the board for all traffic delivered from that server.</t>

<t>Similarly, if a new test client, connecting to a known-good test
server over a particular network path, produces worse results than
an existing known-good test client, then this suggests problems
with the new test client, possibly in the new test client’s code,
or in it’s operating system’s networking implementation.
These insights can lead to enhancements in the networking code that
improve responsiveness for all software running on that operating system.</t>

</section>
<section anchor="use-of-http"><name>Use of HTTP</name>

<t>The test specified in this document is based on HTTP/2 and HTTP/3.
HTTP was selected because it is representative of a broad class of
commonly used request/response protocols, and protocols that do
bulk data transfer, adapting their sending rate to match the
available network capacity.</t>

<t>Many protocols share the property that over a single communication channel a client:</t>

<t>(a) may read small or large data objects from the server,<br />
(b) may write small or large data objects to the server,<br />
(c) may have multiple operations executing concurrently, and<br />
(d) may choose to cancel outstanding operations if
circumstances change and the operation is no longer needed.</t>

<t>If a client reads a very large data object from a server and then
a small data object, it is preferable if the small data object
doesn’t have to wait until after the very large data object has
been received in its entirety.</t>

<t>HTTP supports reads, writes, concurrent operations, cancellation
of outstanding operations, and interleaving of data from
concurrent operations. This makes HTTP a representative proxy for
virtually any request/response protocol. The specific details of
the message syntax, or the byte values used, are not important.</t>

<t>HTTP has the additional convenience that it is very widely
deployed in today’s world, and it is fairly easy to configure many
modern web servers to operate as Responsiveness Test servers.</t>

<t>If a network is able to deliver consistent low latency
even for the challenging case of a bulk data transfer over HTTP,
then it is reasonable to assume that this
network will deliver consistent low latency for all IP traffic,
including interactive audio and video telephony traffic,
which can be regarded as a kind of sender-limited bulk transfer.</t>

</section>
<section anchor="resisting-cheating"><name>Resisting Cheating</name>

<t>A desired property of the test was that it should resist cheating,
both intentional and accidental.</t>

<t>Suppose we were to measure network round-trip delay using ICMP
Echo Request packets. A network engineer given the task of
improving a vendor score on this metric might choose to simply
prioritize ICMP Echo Request packets so that they always go
directly to the front of the transmission queue.
Or, while exploring various options, the engineer might innocently
make a code change that inadvertently has this effect.
A quick run of the test tool would show that the engineer had
achieved the assigned goal -- on busy networks the tool reports
that the round trip time is now lower. Unfortunately, this change
would in no way improve actual user experience, because normal
data transfer is not performed using ICMP Echo Request packets.</t>

<t>To avoid that pitfall, the Responsiveness Test was designed to
obtain its measurements using normal client operations over HTTP.
These are representative of the kinds of operations a normal
client might do if rapidly fetching map tiles while a user scrolls
and zooms a map to view an area of interest on their smartphone,
or fetching new video data when a viewer skips ahead to a
different place in a streaming video.
Ultimately, application-layer responsiveness is what affects
user experience, not lower-layer performance metrics.</t>

<t>If a creative engineer does find a way to “cheat”
the Responsiveness Test to get a better score,
then it is almost certain that such a “cheat” would have
the effect of making real-world operations faster too.
This is a kind of “cheating” we are happy to tolerate.</t>

</section>
</section>
<section anchor="design-constraints"><name>Design Constraints</name>

<t>There are many challenges to defining measurements of the Internet:
the dynamic nature of the Internet,
the diverse nature of the traffic,
the large number of devices that affect traffic,
the difficulty of attaining appropriate measurement conditions,
diurnal traffic patterns,
and changing routes.</t>

<t>TCP and UDP traffic, or traffic on ports 80 and 443, may take
significantly different paths over the network between source and destination
and be subject to entirely different Quality of Service (QoS) treatment.
The traditional delay measurement tools use ICMP, which may experience even
more drastically different behavior than TCP or UDP.
Thus, a good test will use standard transport-layer traffic -- typical
for people's use of the network --
that is subject to the transport layer's congestion control algorithms
that might reduce the traffic's rate and thus its buffering in the network.</t>

<t>Significant queueing in the network only happens on entry to the lowest-capacity
(or "bottleneck") hop on a network path.
For any flow of data between two endpoints,
there is always one hop along the path where the capacity
available to that flow at that hop is the lowest among
all the hops of that flow's path at that moment in time.
It is important to understand that the existence of a
lowest-capacity hop on a network path, and a buffer to smooth bursts
of data, is not itself a problem.
In a heterogeneous network like the Internet, it is
inevitable that there is some hop
along a network path between two hosts with the lowest capacity for that path.
If that hop were to be improved by increasing its capacity, then some other hop would
become the new lowest-capacity hop for that path.
In this context, a "bottleneck" should not be seen as a problem to
be fixed, because any attempt to "fix" the bottleneck is futile --
such a "fix" can never remove the existence of a bottleneck
on a path; it just moves the bottleneck somewhere else.</t>

<t>Note that in a shared datagram network, conditions do not remain static.
The properties of the hop that is the current bottleneck
for a particular flow may change from moment to moment.
The amount of other traffic sharing that bottleneck may change,
or the underlying capacity of that hop itself may vary.
If the available capacity on that hop increases,
then a different hop may become the bottleneck for that flow.
For example, changes in the simultaneous transmission of data flows by hosts communicating
over the same hop may result in changes
to the share of bandwidth allocated to each flow. A user who physically moves around
may cause the Wi-Fi transmission rate to vary widely, fluctuating between
a few Mb/s when they are far from the Access Point,
and Gb/s or more when close to the Access Point.</t>

<t>Consequently, if we wish to enjoy the benefits of the Internet's great
flexibility, we need software that embraces and celebrates this
diversity and adapts intelligently to the varying conditions it encounters.</t>

<t>Because significant queueing in the network only happens on entry to the bottleneck
hop, the queue management at this critical hop of the path almost
entirely determines the responsiveness of the entire path.
If the bottleneck hop's queue management algorithm allows an
excessively large queue to form, this results in excessively large
delays for packets sitting in that queue awaiting transmission,
significantly degrading overall user experience.</t>

<t>In order to discover the depth of the buffer at the bottleneck hop,
the Responsiveness Test mimics normal network operations and data transfers,
with the goal of filling the bottleneck link to capacity, and then
measures the resulting end-to-end delay under these so-called working conditions.
A well managed bottleneck queue keeps its buffer occupancy
under control, resulting in consistently low round-trip times
and consistently good responsiveness.
A poorly managed bottleneck queue will not.</t>

<t>This section discusses bufferbloat in terms of a problem
that occurs in a network, i.e., in routers and switches.
However, there are some other system components that can also add delay.</t>

<t>In some cases the lowest capacity hop on a path is the first hop.
In this case network bufferbloat is not usually a significant
concern because the source device is simply unable to transmit data fast
enough to build up a significant queue anywhere else in the network.
However, in this case source-device bufferbloat
(excessive queuing in the device’s own outgoing network interface)
can result in excessive self-induced delays
for the traffic it is sending <xref target="SBM"/>.</t>

<t>The job of the rate adaptation (congestion control) algorithm of
the sender’s transport protocol is to determine this flow’s share of the
bottleneck hop on the path, and to restrain its own transmission rate
so as not to exceed that bottleneck rate. If the transport protocol
does not generate appropriate backpressure to the application
(e.g., using TCP_NOTSENT_LOWAT <xref target="RFC9293"/><xref target="SBM"/>) then the transport
protocol itself can cause significant delay by buffering an
excessive amount of application data that has not even been sent yet.</t>

<t>Finally, an application can make delay even worse by maintaining its own queue
of data that it hasn’t even given to the transport protocol for sending yet.
Any time data spends sitting in this application queue adds to
the delay it experiences while waiting to be set out of the network interface and
the delay it experiences while in transit traversing the network.</t>

</section>
<section anchor="goals"><name>Goals</name>

<t>The algorithm described here defines the Responsiveness Test that serves as a means of
quantifying user experience of latency in a network connection. Therefore:</t>

<t><list style="numbers">
  <t>Because today's Internet traffic primarily uses HTTP/2 over TLS, the test's
algorithm should use that protocol.  <vspace blankLines='1'/>
As a side note: other types of traffic are gaining in popularity (HTTP/3) <xref target="RFC9114"/>
and/or are already being used widely (RTP) <xref target="RFC1889"/>.
Traffic prioritization and QoS rules on the Internet may
subject traffic to completely different paths:
these could also be measured separately.</t>
  <t>Because the Internet is marked by the deployment of countless middleboxes like
“transparent” TCP proxies or traffic prioritization for certain types of traffic,
the Responsiveness Test algorithm must take into account their effect on
TCP-handshake <xref target="RFC9293"/>, TLS-handshake, and request/response.</t>
  <t>Because the goal of the test is to educate end users, the results should be expressed in an intuitive, nontechnical form
and not commit the user to spend a significant amount of their time (it is left to the implementation to chose a suitable time-limit and we recommend for
any implementation to allow the user to configure the duration of the test).</t>
</list></t>

</section>
<section anchor="measuring-responsiveness-under-working-conditions"><name>Measuring Responsiveness Under Working Conditions</name>

<t>Overall, the test to measure responsiveness under working conditions proceeds in two steps:</t>

<t><list style="numbers">
  <t>Put the network connection into "working conditions"</t>
  <t>Measure responsiveness of the network.</t>
</list></t>

<t>The following explains how the former and the latter are achieved.</t>

<section anchor="working-conditions"><name>Working Conditions</name>

<t>What are <em>the</em> conditions that best emulate how a network
connection is used? There is no one true answer to this question. It is a
tradeoff between using realistic traffic patterns and pushing the network to
its limits.</t>

<t>Current capacity-seeking transport protocols, like TCP and QUIC,
seek to achieve the highest throughput that the network can carry,
by increasing their sending rate until the network signals that
the transport protocol has reached the optimal throughput and
should not increase further.
That signal from the network can take the form of
packet loss (when a bottleneck queue overflows)
or ECN signals (prior to queue overflow).</t>

<t>The Responsiveness Test defines working conditions as the condition
where the path between the measuring endpoints is fully utilized at
its end-to-end capacity, and senders are sending a little faster
to discover if more capacity is available, causing a queue to build
up at the ingress to the bottleneck hop.
How the device at the ingress to the bottleneck hop
manages and limits the growth of that queue will influence the network
connection's responsiveness.</t>

<t>The Responsiveness Test algorithm for reaching working conditions combines
multiple standard HTTP transactions with very large data objects according to realistic traffic patterns
to create these conditions.</t>

<t>This creates a stable state of working conditions during which the
bottleneck of the path between client and server is fully utilized at its capacity,
revealing the behavior of its buffer management or Active Queue Management (AQM),
without generating DoS-like traffic
patterns (e.g., intentional UDP flooding). This creates a realistic traffic mix
representative of what a typical user's network experiences in normal operation.</t>

<t>Finally, as end-user usage of the network evolves to newer protocols and congestion
control algorithms, it is important that the working conditions also can evolve
to continuously represent a realistic traffic pattern.</t>

<section anchor="single-flow-vs-multi-flow"><name>Single-flow vs multi-flow</name>

<t>The purpose of the Responsiveness Test is not to productively move data
across the network, the way a normal application does.
The purpose of the Responsiveness Test is to, as quickly as possible, simulate
a representative traffic load as if real applications were doing
sustained data transfers and measure the resulting round-trip time
occurring under those realistic conditions.
A single TCP connection may not be sufficient
to reach the capacity and full buffer occupancy of a path quickly.
Using a 4MB receive window, over a network with a 32 ms round-trip time,
a single TCP connection can achieve up to 1Gb/s throughput.
For higher capacity connections or higher round-trip times,
a 4MB receive window is insufficient.
In addition, deep buffers along the path between the two endpoints may be
significantly larger than 4MB, and using a 4MB TCP receive window
would be insufficient to fully expose the depth of these buffers.</t>

<t>TCP allows larger receive window sizes, up to 1GB.
However, to avoid consuming too much memory, most transport stacks
today do not use such large receive windows.</t>

<t>Even if a single TCP connection would be able to fill the bottleneck's buffer,
it may take some time for a single TCP connection to ramp
up to full speed. One of the goals of the Responsiveness Test is to help the user
measure their network quickly. As a result, the test should load the
network, take its measurements, and then finish as fast as possible.</t>

<t>Finally, traditional loss-based TCP congestion control algorithms
react aggressively to packet loss by reducing the congestion window.
This reaction (intended by the protocol design) decreases the
queueing within the network, making it harder to determine the
depth of the bottleneck queue reliably.</t>

<t>For all these reasons, using multiple simultaneous parallel connections
allows the Responsiveness Test to complete its task more quickly, in a way that
overall is less disruptive and less wasteful of network capacity
than a test using a single TCP connection that would take longer
to bring the bottleneck hop to a stable saturated state.</t>

<t>One of the configuration parameters for the test is an upper bound on the number of parallel load-generating
connections. We recommend a default value for this parameter of 16.</t>

</section>
<section anchor="concurrent-vs-sequential-uplink-and-downlink"><name>Concurrent vs Sequential Uplink and Downlink</name>

<t>Poor responsiveness can be caused by bloated queues in either (or both)
the upstream and the downstream direction.
Furthermore, both paths may differ significantly due to access link
conditions (e.g., 5G downstream and LTE upstream) or routing changes
within the ISPs.
To measure responsiveness under working conditions,
the algorithm must explore both directions.</t>

<t>Most of today’s widely used network benchmark tools
measure the throughput in one direction at a time.
In a real sense this is very much a “softball” test,
contrived to let the network perform at its absolute best
so it can produce the most impressive-looking benchmark results.</t>

<t>In the 1950s we had analog telephone lines,
with the property that only one person at a time could
make a telephone call.
In the 1990s we had dial-up services like AOL,
with the property that only one person at a time could
use the telephone line to connect to AOL.
Two people in a home could not share a single
telephone line and both connect to AOL at the same time.</t>

<t>But, in contrast, by the 1990s we had packet switching,
as embodied in the Internet, Ethernet, Wi-Fi,
and similar connectionless datagram technologies.
The huge benefit of these connectionless datagram technologies
is that an arbitrary number of people and devices can
share a network and use it for different purposes
at the same time, in stark contrast to a telephone line
that can only support one telephone call at a time.
Indeed, it is common today for a home network to have
dozens of devices sharing a user’s network --
home security cameras streaming video,
adults working from home via videoconferencing,
children watching streaming video or playing video games, etc.</t>

<t>Given that today’s home networks are frequently used
by multiple people and devices at the same time,
(and given that this is arguably the whole reason
connectionless datagram networking was invented in the first place)
it makes sense for a network benchmark tool to evaluate how
well the network performs when it is being used this way,
rather than using only a carefully contrived artificial scenario,
intentionally doing only one thing at a time so as
to show the network in the best possible light.</t>

<t>For this reason, the Apple “networkQuality” tool currently
performs the upload and download tests simultaneously,
to properly reflect how well a network performs when it is used this way.</t>

<t>However, a number of caveats come with measuring concurrently:</t>

<t><list style="symbols">
  <t>Half-duplex links may not permit simultaneous uplink and downlink traffic.
This restriction means the test might not reach the path's capacity in both directions at once and thus not expose
all the potential sources of low responsiveness.</t>
  <t>Debugging the results becomes harder:
During concurrent measurement it is impossible to differentiate whether
the observed delay happens in the uplink or the downlink direction.</t>
</list></t>

<t>For this reason, a test tool should also offer the option
of performing the upload and download tests sequentially,
to help engineers diagnose whether the source of excessive delay
is in the upstream direction, downstream direction, or both.</t>

</section>
<section anchor="achieving-steady-state-buffer-utilization"><name>Achieving Steady-State Buffer Utilization</name>

<t>The Responsiveness Test gradually increases the number of TCP connections (known as load-generating connections)
and measures "goodput" (the sum of actual data transferred across all connections in a unit of time)
continuously.
By definition -- once goodput is maximized -- if the transport protocol emits more
traffic into the network than is needed, the additional traffic will either
get dropped, or be buffered and thus create a "standing queue" that is characteristic
of bufferbloat.
At this moment the test starts
measuring the responsiveness until that metric reaches saturation.
At this point we are creating the worst-case scenario
(best-case for throughput, worst-case for latency)
within the limits of the
realistic traffic pattern. Well designed network equipment
handles this scenario without creating excessive delay.</t>

<t>The algorithm presumes that goodput increases rapidly until TCP
connections complete their TCP slow-start phase.
At that point, goodput eventually stalls,
often due to receive window limitations, particularly in cases of
high network bandwidth, high network round-trip time,
low receive window size, or a combination of all three.
The only means to further increase goodput is by
adding more TCP connections to the pool of load-generating connections.
If new connections don't result in an increase in goodput,
full link utilization has been reached.
At this point, adding more connections will reveal the extent to which
the network is willing to buffer excess packets, with a resulting increase
in round-trip delay (decrease in responsiveness).
When the bottleneck queue signals the sender(s) to slow down
(either via packet drop or via ECN marking)
then the round-trip delay will stabilize.</t>

</section>
<section anchor="avoiding-test-hardware-bottlenecks"><name>Avoiding Test Hardware Bottlenecks</name>

<t>The Responsiveness Test could be run from various devices that are either consumer devices
or Internet infrastructure such as routers. Many home routers are cost-sensitive embedded devices
optimised for switching packets rather than terminating TLS connections at line rate. As a
result, they may not have sufficient processing power or memory bandwidth to saturate a
bottleneck link in order to be a useful test client for the responsiveness test.</t>

<t>In order to measure responsiveness from these devices, the test can be conducted without TLS
over plain HTTP. Whenever possible, it is preferred to test using TLS to resemble typical
Internet traffic to the maximum extent.</t>

</section>
</section>
<section anchor="test-parameters"><name>Test parameters</name>

<t>A number of parameters can be used to configure the test methodology. The following list
contains the names of those parameters and their default values. The detailed description of the
methodology that follows will explain how these parameters are being used. Experience has shown
that the default values for these parameters allow for a low runtime for the test and produce
accurate results in a wide range of environments.</t>

<texttable>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Explanation</ttcol>
      <ttcol align='left'>Default Value</ttcol>
      <c>MAD</c>
      <c>Moving Average Distance (number of intervals to take into account for the moving average)</c>
      <c>4</c>
      <c>ID</c>
      <c>Interval duration at which the algorithm reevaluates stability</c>
      <c>1 second</c>
      <c>TMP</c>
      <c>Trimmed Mean Percentage to be trimmed</c>
      <c>95%</c>
      <c>SDT</c>
      <c>Standard Deviation Tolerance for stability detection</c>
      <c>5%</c>
      <c>INP</c>
      <c>Initial number of concurrent transport connections at the start of the test</c>
      <c>1</c>
      <c>INC</c>
      <c>Number of transport connections to add to the pool of load-generating connections at each interval</c>
      <c>1</c>
      <c>MNP</c>
      <c>Maximum number of parallel transport-layer connections</c>
      <c>16</c>
      <c>MPS</c>
      <c>Maximum responsiveness probes per second</c>
      <c>100</c>
      <c>PTC</c>
      <c>Percentage of Total Capacity the probes are allowed to consume</c>
      <c>5%</c>
</texttable>

</section>
<section anchor="measuring-responsiveness"><name>Measuring Responsiveness</name>

<t>Measuring responsiveness under working conditions is an iterative process.
Moreover, it requires a sufficiently large sample of measurements to have confidence in the results.</t>

<t>The measurement of the responsiveness happens by sending probe-requests.
There are two types of probe requests:</t>

<t><list style="numbers">
  <t>An HTTP GET request on a connection separate from the load-generating connections ("foreign probes").
This probe type mimics the time it takes for a web browser to connect to a new
web server and request the first element of a web page (e.g., "index.html"),
or the startup time for a video streaming client to launch and begin fetching media.</t>
  <t>An HTTP GET request multiplexed on the load-generating connections ("self probes").
This probe type mimics the time it takes for a video streaming client
to skip ahead to a different chapter in the same video stream,
or for a navigation mapping application to react and fetch new map tiles
when the user scrolls the map to view a different area.
In a well functioning system, fetching new data
over an existing connection should take less time than
creating a brand new TLS connection from scratch to do the same thing.</t>
</list></t>

<t>Foreign probes will provide three (3) sets of data-points: First, the duration of the TCP-handshake
(noted hereafter as <spanx style="verb">tcp_f</spanx>).
Second, the TLS round-trip-time (noted <spanx style="verb">tls_f</spanx>). For this, it is important to note that different TLS versions
have a different number of round-trips. Thus, the TLS establishment time needs to be
normalized to the number of round-trips the TLS handshake takes until the connection
is ready to transmit data. In the case that TLS is not being used, it is undefined.
And third, the HTTP elapsed time between issuing the GET
request for a 1-byte object and receiving the entire response (noted <spanx style="verb">http_f</spanx>).</t>

<t>Self probes will provide a single data-point that measures the duration of time between
when the HTTP GET request for the 1-byte object is issued on the load-generating connection and when the
full HTTP response has been received (noted <spanx style="verb">http_l</spanx>). For cases where multiplexing GET requests into
the load generation connections is not possible (e.g. due to only HTTP/1.1 being available), the TCP
stack estimated round-trip-time can be used as a proxy or substitute value.</t>

<t><spanx style="verb">tcp_f</spanx>, <spanx style="verb">tls_f</spanx>, <spanx style="verb">http_f</spanx> and <spanx style="verb">http_l</spanx> are all measured in milliseconds.</t>

<t>The more probes that are sent, the more data available for calculation. In order to generate
as much data as possible, the Responsiveness Test specifies that a client issue these probes regularly.
There is, however, a risk that on low-capacity networks the responsiveness probes
themselves will consume a significant amount of the capacity. Because the test mandates
first saturating capacity before starting to probe for responsiveness, the test will have an
accurate estimate of how much of the capacity the responsiveness probes will consume and never
send more probes than the network can handle.</t>

<t>Limiting the data used by probes can be done by providing an estimate of the number of bytes exchanged for
each of the probe types. Taking TCP and TLS overheads into account, we can estimate
the amount of data exchanged for a foreign probe to be around 5000 bytes.
For self probes we can expect an overhead of no more than 1000 bytes.</t>

<t>Given this information, we recommend that a test client does
not send more than <spanx style="verb">MPS</spanx> (Maximum responsiveness Probes per Second - default to 100) probes per <spanx style="verb">ID</spanx>.
The same amount of probes should be sent on load-generating as well as on separate connections.
The probes should be spread out equally over the duration of the interval, with the two types
of probes interleaving with each other.
The test client
should uniformly and randomly select from the active load-generating connections on which to send self probes.</t>

<t>According to the default parameter values, the probes will consume 300 KB (or 2400Kb) of data per second, meaning
a total capacity utilization of 2400 Kbps for the probing.</t>

<t>On high-speed networks, these default parameter values will provide a significant amount of samples, while at
the same time minimizing the probing overhead.
However, on severely capacity-constrained networks the probing traffic could consume
a significant portion of the available capacity. The Responsiveness Test must
adjust its probing frequency in such a way that the probing traffic does not consume
more than <spanx style="verb">PTC</spanx> (Percentage of Total Capacity - default to 5%) of the available capacity.</t>

<section anchor="aggregating-the-measurements"><name>Aggregating the Measurements</name>

<section anchor="for-the-tls-enabled-case"><name>For the TLS-Enabled Case</name>

<t>The algorithm produces sets of 4 times for each probe, namely:
<spanx style="verb">tcp_f</spanx>, <spanx style="verb">tls_f</spanx>, <spanx style="verb">http_f</spanx>, <spanx style="verb">http_l</spanx> (from the previous section).
The responsiveness of the network connection being tested evolves over time as buffers gradually reach saturation. Once
the buffers are saturated, responsiveness will stabilize. Thus, the final calculation of network responsiveness
considers the last MAD (Moving Average Distance - default to 4) intervals worth of completed responsiveness probes.</t>

<t>Over that period of time, a large number of samples will have been collected.
These may be affected by noise in the measurements, and outliers. Thus, to aggregate these
we suggest using a single-sided trimmed mean at the <spanx style="verb">TMP</spanx> (Trimmed Mean Percentage - default to 95%) percentile, thus providing the following numbers:
<spanx style="verb">TM(tcp_f)</spanx>, <spanx style="verb">TM(tls_f)</spanx>, <spanx style="verb">TM(http_f)</spanx>, <spanx style="verb">TM(http_l)</spanx>.</t>

<t>The responsiveness is then calculated as the average of the "foreign responsiveness"
on separate connections and the responsiveness on load-generating connections.</t>

<figure><artwork><![CDATA[
Foreign_Responsiveness = 60000 / ((TM(tcp_f)+TM(tls_f)+TM(http_f))/3)
Loaded_Responsiveness = 60000 / TM(http_l)
Responsiveness = (Foreign_Responsiveness + Loaded_Responsiveness) / 2
]]></artwork></figure>

<t>This responsiveness value presents round-trips per minute (RPM).</t>

</section>
<section anchor="for-the-tcp-only-case"><name>For the TCP-Only Case</name>

<t>If there are no TLS connections being used, then the notion of a normalised round-trip time for the TLS handshake does not apply.
Zeroes cannot be substituted for <spanx style="verb">tls_f</spanx>, as that will result in an artificially low responsiveness value.
Instead, the same principle of giving each contribution to the foreign RTT equal weight, and then giving the foreign and self RTTs
equal weights is applied.</t>

<t>The TCP-only responsiveness is therefore calculated in the following way:</t>

<figure><artwork><![CDATA[
Foreign_Responsiveness = 60000 / ((TM(tcp_f) + TM(http_f)) / 2)
Loaded_Responsiveness = 60000 / TM(http_l)
Responsiveness = (Foreign_Responsiveness + Loaded_Responsiveness) / 2
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="final-algorithm"><name>Final Algorithm</name>

<t>Considering the previous two sections, where we explained the meaning of
working conditions and the definition of responsiveness, we can now describe
the design of the final algorithm. In order to measure the worst-case delay, we need to transmit
traffic at the full capacity of the path as well as ensure the buffers are filled
to the maximum.
We can achieve this by continuously adding HTTP sessions to the pool of connections
in an ID (Interval duration - default to 1 second) interval. This technique
ensures that we quickly reach full capacity.
In parallel with this process we send responsiveness probes.
First, the algorithm reaches stability for the goodput. Once
goodput stability has been achieved, the responsiveness stability is tracked
until it is shown to be stable at which point the final measurement can be computed.</t>

<t>We consider both goodput and responsiveness to be stable when the standard deviation
of the moving averages of the responsiveness calculated in the immediately preceding MAD intervals is within SDT
(Standard Deviation Tolerance - default to 5%) of the moving average calculated in the most-recent ID.</t>

<t>The following algorithm reaches working conditions of a network
by using HTTP/2 upload (POST) or download (GET) requests of infinitely large
files.
The algorithm is the same for upload and download and uses
the same term "load-generating connection" for each.
The actions of the algorithm take place at regular intervals. For the current draft
the interval is defined as one second.</t>

<t>Where</t>

<t><list style="symbols">
  <t><spanx style="verb">i</spanx>: The index of the current interval. The variable <spanx style="verb">i</spanx> is initialized to <spanx style="verb">0</spanx> when the algorithm begins and
increases by one for each interval.</t>
  <t>moving average aggregate goodput at interval <spanx style="verb">p</spanx>: The number of total bytes of data transferred within
interval <spanx style="verb">p</spanx> and the <spanx style="verb">MAD - 1</spanx> immediately preceding intervals, divided by <spanx style="verb">MAD</spanx> times <spanx style="verb">ID</spanx>.</t>
</list></t>

<t>the steps of the algorithm are:</t>

<t><list style="symbols">
  <t>Create INP load-generating connections (INP defaults to 1, but can be increased if one has prior knowledge on the capacity of the link).</t>
  <t>Launch a new foreign and self probe (according to the specification set forth
above) every 1/<spanx style="verb">MPS</spanx> seconds until <spanx style="verb">MPS</spanx>*<spanx style="verb">ID</spanx> pairs of probes have been launched
or the end of the interval is reached, whichever comes first.
probes to not exceed the percentage of total capacity (PTC).</t>
  <t>At each interval:
  <list style="symbols">
      <t>Create INC additional load-generating connections (INC defaults to 1, but can be increased for a more aggressive ramp-up phase).</t>
      <t>If goodput has not saturated:
      <list style="symbols">
          <t>Compute the moving average aggregate goodput at interval <spanx style="verb">i</spanx> as <spanx style="verb">current_average</spanx>.</t>
          <t>If the standard deviation of the past <spanx style="verb">MAD</spanx> average goodput values is less than SDT of the <spanx style="verb">current_average</spanx>, declare goodput saturation and move on to probe responsiveness.</t>
        </list></t>
      <t>If goodput saturation has been declared:
      <list style="symbols">
          <t>Compute the responsiveness at interval <spanx style="verb">i</spanx> as <spanx style="verb">current_responsiveness</spanx>.</t>
          <t>If the standard deviation of the past MAD responsiveness values is less than SDT of the <spanx style="verb">current_responsiveness</spanx>, declare responsiveness saturation and report <spanx style="verb">current_responsiveness</spanx>
as the final test result.</t>
        </list></t>
    </list></t>
</list></t>

<t>In <xref target="goals"/>, it is mentioned that implementations may chose to implement a time-limit
on the duration of the test.
If stability is not reached within the time-frame, the implementation can report
the current results with a indication of confidence in the result as described in
the following section.</t>

<t>Finally, if at any point one of these connections terminates with an error, the test should be aborted.</t>

<section anchor="confidence-of-test-results"><name>Confidence of test-results</name>

<t>As described above, a tool running the algorithm typically defines a time-limit for
the execution of each of the stages. For example, if the tool allocates a total
run-time of 40 seconds, and it executes a full downlink followed by a uplink test,
it may allocate 10 seconds to each of the saturation-stages (downlink capacity saturation, downlink responsiveness saturation, uplink capacity saturation, uplink responsiveness saturation).</t>

<t>As the different stages may or may not reach stability, we can define a "confidence score"
for the different metrics (capacity and responsiveness) the methodology was able to measure.</t>

<t>We define "Low" confidence in the result if the algorithm was not even able to
execute MAD iterations of the specific stage. Meaning, the moving average is
not taking the full window into account. This can happen if the time-limit of the
test has been reached before MAD intervals could execute.</t>

<t>We define "Medium" confidence if the algorithm was able to execute at least MAD
iterations, but did not reach stability based on standard deviation tolerance.</t>

<t>We define "High" confidence if the algorithm was able to fully reach stability
based on the defined standard deviation tolerance.</t>

<t>It must be noted that depending on the chosen standard deviation tolerance or
other parameters of the methodology and the network-environment it may be that a
measurement never converges to a stable point.
This is expected and part of the dynamic nature of networking and the accompanying
measurement inaccuracies, which is why the importance of imposing a time-limit
is so crucial, together with an accurate depiction of the "confidence" the methodology
was able to generate. The confidence score should be reported to the user as part of
the main results.</t>

</section>
</section>
</section>
<section anchor="interpreting-responsiveness-results"><name>Interpreting responsiveness results</name>

<t>The described methodology uses a high-level approach to measure responsiveness.
By executing the test with normal HTTP requests, a number of elements come into
play that will influence the result. Contrary to more traditional measurement methods,
the responsiveness metric is not only influenced by the properties of the
network, but can significantly be influenced by the properties of the client
and the server implementations. This is fully intentional as the properties of the
client and the server implementations have a direct impact on the perceived responsiveness by the user. This section describes how the different
elements influence responsiveness and how a user may differentiate them
when debugging a network.</t>

<section anchor="elements-influencing-responsiveness"><name>Elements influencing responsiveness</name>

<t>Due to the HTTP-centric approach of the measurement methodology a number of
factors come into play that influence the results. Namely, the client-side
networking stack (from the top of the HTTP-layer all the way down to the physical layer),
the network (including potential “transparent” HTTP "accelerators"), and the server-side
networking stack. The following outlines how each of these contributes to the responsiveness.</t>

<section anchor="client-side-influence"><name>Client side influence</name>

<t>As the driver of the measurement, the client-side networking stack can have a
large influence on the result. The biggest influence of the client comes
when measuring the responsiveness in the uplink direction. Load-generation can
cause queue-buildup in the transport layer as well as the HTTP layer. Additionally,
if the network's bottleneck is on the first hop, queue-buildup can happen at the
layers below the transport stack (e.g., in the outgoing network interface).</t>

<t>Each of these queue build-ups may cause delay and thus low responsiveness.
A well designed networking stack ensures that queue-buildup in the TCP layer
is kept at a bare minimum with solutions like TCP_NOTSENT_LOWAT <xref target="RFC9293"/><xref target="SBM"/>.
At the HTTP/2 layer it is important that the load-generating data is not interfering
with the latency-measuring probes. For example, the different streams should not
be stacked one after the other but rather be allowed to be multiplexed for
optimal latency. The queue-buildup at these layers would only influence latency
on the probes that are sent on the load-generating connections.</t>

<t>Below the transport layer many places have a potential queue build-up.
It is important to keep these queues at reasonable sizes.</t>

<t>Flow-queueing techniques like FQ-Codel are valuable for insulating
well behaved flows from badly behaved flows,
but flow-queueing alone without intelligent queue management
cannot insulate a flow from its own capacity-seeking behavior.</t>

<t>Depending on the techniques used at these layers, the queue build-up
can influence latency on probes sent on load-generating connections as well as
separate connections. If flow-queuing is used at these layers, the impact on
separate connections will be negligible.
This is why the Responsiveness Test performs probes
on load-generating connections, to detect and report
the responsiveness experienced by capacity-seeking flows,
not only the responsiveness experienced by low-rate flows.</t>

</section>
<section anchor="network-influence"><name>Network influence</name>

<t>The network obviously is a large driver for the responsiveness result.
Propagation delay from the client to the server,
waiting to access a shared resource like radio spectrum,
queuing in the bottleneck node,
and other sources of delay
all add to latency <xref target="BITAG"/>.
Beyond these traditional sources of latency,
other factors may influence the results as well. Many networks deploy “transparent”
TCP Proxies, firewalls doing deep packet-inspection, HTTP "accelerators" and similar
middleboxes.
As the methodology relies on the use of HTTP/2, the responsiveness metric will
be influenced by such devices as well.</t>

<t>The network will influence both kinds of latency probes that the responsiveness
tests sends out. Depending on the network's use of AQM and whether
this includes flow-queuing or not, the latency probes on the load-generating
connections may be influenced differently than the probes on the separate
connections.</t>

</section>
<section anchor="server-side-influence"><name>Server side influence</name>

<t>Finally, the server-side introduces the same kind of influence on the responsiveness
as the client-side, with the difference that the responsiveness will be impacted
during the downlink load generation.</t>

<t>Beyond the server's networking stack influence, the server selection impacts the
result as well. First, the network path chosen between client and server is influenced
by the server selection. Second, the network stack deployed on the selected server
may not be representative for workloads that are relevant to the user running the test.</t>

</section>
</section>
<section anchor="investigating-poor-responsiveness"><name>Investigating Poor Responsiveness</name>

<t>Once a responsiveness result has been generated, one might be motivated to try to localize
the source of a low responsiveness. The responsiveness measurement
is however aimed at providing a quick, top-level view of the responsiveness
under working conditions the way end-users experience it.
Localizing the source of low responsiveness involves however a set of different
tools and methodologies.</t>

<t>Nevertheless, the Responsiveness Test allows users to gain
some insight into what is responsible for excessive delay.
To gain this insight, implementations of the responsiveness
test are encouraged to have an optional verbose mode that exposes the inner workings
of the algorithm as well as statistics from the lower layers.
The following is a non-exhaustive list of additional information that can be exposed
in the verbose mode: Idle latency (measured at the beginning from the initial connections),
achieved capacity on load-generating connections, TM(tcp_f), TM(tls_f), TM(http_f) and TM(http_l)
(and even their raw values), HTTP-protocol (HTTP/1.1, HTTP/2, HTTP/3), transport protocol (TCP, QUIC, ...), congestion-control
algorithm (Cubic, BBR, ...) used on the client-side, ECN or L4S statistics, IP version, ... and many more.</t>

<t>The previous section described the elements that influence
responsiveness. It is apparent that the delay measured
on the load-generating connections and the delay measured on separate connections
may be different due to the different elements.</t>

<t>For example, if the delay measured on separate connections is much less than the
delay measured on the load-generating connections, it is possible to narrow
down the source of the additional delay on the load-generating connections.
As long as the other elements of the network don't do flow-queueing, the additional
delay must come from the queue build-up at the HTTP and TCP layer.
This is because all other bottlenecks in the network that may cause a queue build-up
will be affecting the load-generating connections as well as the separate
latency-probing connections in the same way.</t>

<t>Beyond the difference in the delay of the load-generating connections and the
separate connections, another element can provide additional information: Namely,
testing against different servers located in different places along the path will
allow, to some extent, the opportunity to separate the network’s path
into different segments. For
example, if the cable modem and a more distant ISP server are hosting
responsiveness measurement endpoints, some localization of the issue can be done.
If the RPM to the cable modem is very high, it means that the network segment
from the client endpoint to the cable modem does not have responsiveness issues,
thus allowing the user to conclude that possible responsiveness issues are
beyond the cable modem.
It must be noted, though, that due to the high level approach to the testing
(including HTTP), a low responsiveness to the cable modem does not necessarily
mean that the network between client and cable modem is the problem (as
outlined in the above previous paragraphs).</t>

</section>
</section>
<section anchor="responsiveness-test-server"><name>Responsiveness Test Server</name>

<t>The responsiveness measurement is built upon a foundation of standard protocols:
IP, TCP, TLS, HTTP/2.
On top of this foundation, a minimal amount of new "protocol" is defined,
merely specifying the URLs that used for GET and POST in the process of
executing the test.</t>

<t>Both the client and the server MUST support HTTP/2 over TLS.
The client and the server MAY also support HTTP/3 over QUIC.
The client MUST be able to send a request with a GET or POST method.
The client MUST send the GET with the "Accept-Encoding" header set to "identity" to ensure the
server will not compress the data.
The server MUST be able to respond to both of these
HTTP commands.
The server MUST have the ability to respond to a GET request with content.</t>

<t>The server MUST respond to 4 URLs:</t>

<t><list style="numbers">
  <t>A "small" URL/response:
The server must respond with a status code of 200 (OK) and 1 byte of content.
The actual message content is irrelevant.
The server SHOULD specify the Content-Type header field with the media type "application/octet-stream".
The server SHOULD minimize the size, in bytes, of the response fields that are encoded and sent on the wire.</t>
  <t>A "large" URL/response:
The server must respond with a status code of 200 (OK) and content size of at least 8GB.
The server SHOULD specify the Content-Type header field with the media type "application/octet-stream".
The content can be larger, and may need to grow as network speeds increases over time.
The actual message content is irrelevant.
The client will probably never completely download the object,
but will instead close the connection after reaching working conditions
and making its measurements.</t>
  <t>An "upload" URL/response:
The server must handle a POST request with an arbitrary content size.
The server should discard the content.
The actual POST message content is irrelevant.
The client will probably never completely upload the object,
but will instead close the connection after reaching working conditions
and making its measurements.</t>
  <t>A .well-known URL <xref target="RFC8615"/> that serves a JSON object providing
the three test URLs described above and other configuration information for
the client to run the test (See <xref target="discovery"/>, below.)</t>
</list></t>

<t>The client begins the responsiveness measurement by querying for the JSON <xref target="RFC8259"/> configuration.
This supplies the URLs for creating the load-generating connections in
the upstream and downstream direction as well as the small object
for the latency measurements.</t>

</section>
<section anchor="discovery"><name>Responsiveness Test Server Discovery</name>

<t>It makes sense for a service provider (either an application service provider like a video conferencing service
or a network access provider like an ISP) to host Responsiveness Test Servers on their
network so customers can determine what to expect about the quality of their connection to
the service offered by that provider.
However, when a user performs a Responsiveness Test and determines
that they are suffering from poor responsiveness during the connection to that service,
the logical next questions might be,</t>

<?rfc subcompact="yes" ?>
<t><list style="numbers">
  <t>"What's causing my poor performance?"</t>
  <t>"Something to do with my home Wi-Fi Access point?"</t>
  <t>"Something to do with my home gateway?"</t>
  <t>"Something to do with my service provider?"</t>
  <t>"Something else entirely?"
<?rfc subcompact="no" ?></t>
</list></t>

<t>To help an end user answer these questions, it will be useful for test clients
to be able to easily discover Responsiveness Test Servers running in various
places in the network (e.g., their home router, their Wi-Fi access point, their ISP's
head-end equipment, etc).</t>

<t>Consider this example scenario: A user has a cable modem
service offering 100 Mb/s download speed, connected via
gigabit Ethernet to one or more Wi-Fi access points in their home,
which then offer service to Wi-Fi client devices at different rates
depending on distance, interference from other traffic, etc.
By having the cable modem itself host a Responsiveness Test Server,
the user can then run a test between the cable modem and their computer
or smartphone, to help isolate whether bufferbloat they are experiencing
is occurring in equipment inside the home (like their Wi-Fi access points)
or somewhere outside the home.</t>

<section anchor="well-known-uniform-resource-identifier-uri-for-test-server-discovery"><name>Well-Known Uniform Resource Identifier (URI) For Test Server Discovery</name>

<t>An organization or device that hosts a Responsiveness Test Server
advertises that service using the network quality well-known URI <xref target="RFC8615"/>.
The URI scheme is "https" and the application name is "nq"
(e.g., https://example.com/.well-known/nq).
No additional path components, query strings or fragments are valid
for this well-known URI.
The media type of the resource at the well-known URI is "application/json" and
the format of the resource is a valid JSON object as specified below:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "urls": {
    "large_download_url": "<URL for bulk download>",
    "small_download_url": "<URL for small download>",
    "upload_url":         "<URL for small upload>"
  }
  "test_endpoint":        "<hostname for server to use for testing>"
}
]]></artwork></figure>

<t>The fields can appear in any order.</t>

<t>The content of the "version" field SHALL be "1".
Integer values greater than "1" are reserved
for possible use in future updates to this protocol.</t>

<t>The content of the "large_download_url", "small_download_url", and "upload_url"
SHALL all be validly formatted "http" or "https" URLs.
All three URLs MUST contain the same &lt;host&gt; part so that they are
eligible to be multiplexed onto the same TCP or QUIC connection.
If the three URLs do not contain the same &lt;host&gt; part
then the JSON configuration information object is invalid
and the client MUST ignore the entire JSON object.</t>

<t>The "version" field and the three URLs are mandatory
and each MUST appear exactly once in the JSON object.
If any of these fields are missing or appear more than once,
the configuration information is invalid and the entire JSON object MUST be ignored.
If a client implementing the current version of this specification encounters
a JSON configuration information object where the "version" field is not "1",
then the client should assume that it is unable
to safely parse the configuration information object
(that’s what incrementing the version field indicates)
and the client MUST ignore the entire JSON object.</t>

<t>The "test_endpoint" field is OPTIONAL,
and if present MUST appear exactly once in the JSON object.
If the "test_endpoint" field appears more than once,
the configuration information is invalid and the entire JSON object MUST be ignored.
If present, then for the purpose of determining the IP address to which it should
connect the test client MUST ignore the &lt;host&gt; part in the URLs and instead
connect to one of the IP addresses indicated by the "test_endpoint" field,
as determined by the test client’s address resolution policy
(e.g., Happy Eyeballs <xref target="RFC8305"/>).
The test client then sends HTTP GET and POST requests
(as determined by the test procedure)
to the host indicated by the "test_endpoint" field,
forming its HTTP requests using the &lt;host&gt; and &lt;path&gt; from the specified URLs.
In other words, when the "test_endpoint" field is present
the test client operates as if it were simply
using the specified URLs directly, except that it behaves
as if it had a local (e.g., “/etc/hosts”) entry overriding the
IP address(es) of the &lt;host&gt; given in the URLs to be the
IP address(es) of the "test_endpoint" hostname instead.
In the case of a large web site served by multiple load-balanced
servers, this feature gives the administrator more precise control over
which of those servers are used for responsiveness testing.
In a situation where some of a site’s servers have been configured
to deliver low-delay HTTP responses and some have not,
it can be useful to be able to measure the responsiveness of different
servers with different configurations to see how they compare
when handling identical HTTP GET and POST requests.</t>

<t>Servers implementing the current version of this specification
SHOULD NOT include any names in the JSON configuration information
other than those documented here.
Future updates to this specification may define additional names
in the JSON configuration information.
To allow for these future backwards-compatible updates,
clients implementing the current version of this specification
MUST silently ignore any unrecognized names in the
JSON configuration information they receive,
and MUST process the required names as documented here,
behaving as if the unrecognized names were not present.</t>

</section>
<section anchor="dns-based-service-discovery-for-test-server-discovery"><name>DNS-Based Service Discovery for Test Server Discovery</name>

<t>To further aid the test client in discovering Responsiveness Test Servers,
organizations or devices offering Responsiveness Test Servers
MAY advertise their availability using DNS-Based Service Discovery <xref target="RFC6763"/>
over Multicast DNS <xref target="RFC6762"/> or conventional unicast DNS <xref target="RFC1034"/>,
using the service type <xref target="RFC6335"/> "_nq._tcp".</t>

<t>When advertising over Multicast DNS, typically the device offering
the test service generally advertises its own Multicast DNS records.</t>

<t>When advertising over unicast DNS, population of the appropriate
DNS zone with the relevant unicast discovery records can be performed
by having a human administrator manually enter the required records,
or automatically using a Discovery Proxy <xref target="RFC8766"/>.</t>

<section anchor="unicast-dns-sd-example"><name>Unicast DNS-SD Example</name>

<t>An obscure service provider hosting a Responsiveness Test Server instance for their
organization (obs.cr) on the "rpm.obs.cr" host would return the following answers
to conventional PTR and SRV DNS queries:</t>

<figure><artwork><![CDATA[
$ nslookup -q=ptr _nq._tcp.obs.cr.
Non-authoritative answer:
_nq._tcp.obs.crname = rpm._nq._tcp.obs.cr.
$ nslookup -q=srv rpm._nq._tcp.obs.cr.
Non-authoritative answer:
rpm._nq._tcp.obs.crservice = 0 0 443 rpm.obs.cr.
]]></artwork></figure>

<t>Given those DNS query responses, the client would proceed to access the rpm.obs.cr
host on port 443 at the .well-known/nq well-known URI to begin the test.</t>

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

<t>The security considerations that apply to any Active
Measurement of live paths are relevant here <xref target="RFC4656"/><xref target="RFC5357"/>.</t>

<t>If server-side resource consumption is a concern, a server can choose to not reply or delay
its response to the initial request for the configuration information through the
.well-known URL.</t>

</section>
<section anchor="discussion"><name>DISCUSSION</name>

<t>We seek feedback from designers of delay-sensitive applications,
such as on-line games and videoconferencing applications, about
whether this test accurately predicts their real-world user experience.</t>

<t>As this document as evolved through multiple revisions, it has
arrived at an algorithm that discards the worst 5% of round-trip measurements,
and reports the arithmetic mean of the the best 95%, because this enabled
the algorithm to generate results that are both quick to produce and consistent
from one run to the next.</t>

<t>However, the BITAG “Latency Explained” report <xref target="BITAG"/> states that the 95th,
98th, or 99th percentile round-trip time is indicative of the behaviour
of videoconferencing applications,
which is more or less the opposite of the current Responsiveness Test.</t>

<t>While repeatability and convenience are both valuable properties of the test,
we need to ensure that we have not sacrificed relevance in the pursuit
of these two other goals.</t>

<t>If we cannot achieve all three goals in a single test,
we may need to have two versions of the test:
a “quick” version that runs in about ten seconds and gives an
approximate “ball park” result, suitable for a user to determine
quickly whether their Internet connection is good or terrible, and
a “precise” version that runs for longer and gives highly accurate and
repeatable results, suitable for an equipment vendor or network operator
to use when advertising the quality of their offerings.</t>

<t>The current specification of the Responsiveness Test
includes a number of configurable parameters.
If we want the Responsiveness Test to produce a score that can be compared
meaningfully between different hardware and different network operators,
we need to specify required values for these configurable parameters.
For engineering diagnostic purposes different parameter values may be useful,
but for comparisons between vendors or operators we need IETF consensus
on fixed standardized test parameters that everyone uses.</t>

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

<section anchor="well-known-uri"><name>Well-Known URI</name>

<t>This specification registers the "nq" well-known URI in the
"Well-Known URIs" registry <xref target="RFC5785"/>.</t>

<t>URI suffix: nq</t>

</section>
<section anchor="service-name"><name>Service Name</name>

<t>IANA has added the following value to the "Service Name and Transport
Protocol Port Number Registry".</t>

<figure><artwork><![CDATA[
Service Name:       nq
Transport Protocol: TCP
Assignee:           Stuart Cheshire
Contact:            Stuart Cheshire
Description:        Network Quality test server endpoint
]]></artwork></figure>

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

<t>Special thanks go to Jeroen Schickendantz and Felix Gaudin for their
enthusiasm around the project and the development
of the Go responsiveness measurement tool and the librespeed implementation.
We also thank Greg White, Lucas Pardue, Sebastian Moeller,
Rich Brown, Erik Auerswald, Matt Mathis and Omer Shapira for
their constructive feedback on the document.</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>

<reference anchor='RFC9110' target='https://www.rfc-editor.org/info/rfc9110'>
  <front>
    <title>HTTP Semantics</title>
    <author fullname='R. Fielding' initials='R.' role='editor' surname='Fielding'/>
    <author fullname='M. Nottingham' initials='M.' role='editor' surname='Nottingham'/>
    <author fullname='J. Reschke' initials='J.' role='editor' surname='Reschke'/>
    <date month='June' year='2022'/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='97'/>
  <seriesInfo name='RFC' value='9110'/>
  <seriesInfo name='DOI' value='10.17487/RFC9110'/>
</reference>




    </references>

    <references title='Informative References'>

<reference anchor="BITAG" target="https://www.bitag.org/latency-explained.php">
  <front>
    <title>Latency Explained</title>
    <author >
      <organization>Broadband Internet Technical Advisory Group</organization>
    </author>
    <date year="2022"/>
  </front>
</reference>
<reference anchor="Bufferbloat" >
  <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="n.d."/>
  </front>
  <seriesInfo name="Communications of the ACM, Volume 55, Number 1 (2012)" value=""/>
</reference>
<reference anchor="Cake" >
  <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="n.d."/>
  </front>
  <seriesInfo name="2018 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN)" value=""/>
</reference>



<reference anchor='Prague' target='https://datatracker.ietf.org/doc/html/draft-briscoe-iccrg-prague-congestion-control-04'>
   <front>
      <title>Prague Congestion Control</title>
      <author fullname='Koen De Schepper' initials='K.' surname='De Schepper'>
         <organization>Nokia Bell Labs</organization>
      </author>
      <author fullname='Olivier Tilmans' initials='O.' surname='Tilmans'>
         <organization>Nokia Bell Labs</organization>
      </author>
      <author fullname='Bob Briscoe' initials='B.' surname='Briscoe'>
         <organization>Independent</organization>
      </author>
      <author fullname='Vidhi Goel' initials='V.' surname='Goel'>
         <organization>Apple Inc</organization>
      </author>
      <date day='24' month='July' year='2024'/>
      <abstract>
	 <t>   This specification defines the Prague congestion control scheme,
   which is derived from DCTCP and adapted for Internet traffic by
   implementing the Prague L4S requirements.  Over paths with L4S
   support at the bottleneck, it adapts the DCTCP mechanisms to achieve
   consistently low latency and full throughput.  It is defined
   independently of any particular transport protocol or operating
   system, but notes are added that highlight issues specific to certain
   transports and OSs.  It is mainly based on experience with the
   reference Linux implementation of TCP Prague and the Apple
   implementation over QUIC, but it includes experience from other
   implementations where available.

   The implementation does not satisfy all the Prague requirements (yet)
   and the IETF might decide that certain requirements need to be
   relaxed as an outcome of the process of trying to satisfy them all.
   Future plans that have typically only been implemented as proof-of-
   concept code are outlined in a separate section.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-briscoe-iccrg-prague-congestion-control-04'/>
   
</reference>


<reference anchor='SBM' target='https://datatracker.ietf.org/doc/html/draft-cheshire-sbm-02'>
   <front>
      <title>Source Buffer Management</title>
      <author fullname='Stuart Cheshire' initials='S.' surname='Cheshire'>
         <organization>Apple Inc.</organization>
      </author>
      <date day='16' month='March' year='2025'/>
      <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>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-cheshire-sbm-02'/>
   
</reference>

<reference anchor='RFC1034' target='https://www.rfc-editor.org/info/rfc1034'>
  <front>
    <title>Domain names - concepts and facilities</title>
    <author fullname='P. Mockapetris' initials='P.' surname='Mockapetris'/>
    <date month='November' year='1987'/>
    <abstract>
      <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='13'/>
  <seriesInfo name='RFC' value='1034'/>
  <seriesInfo name='DOI' value='10.17487/RFC1034'/>
</reference>

<reference anchor='RFC1889' target='https://www.rfc-editor.org/info/rfc1889'>
  <front>
    <title>RTP: A Transport Protocol for Real-Time Applications</title>
    <author>
      <organization>Audio-Video Transport Working Group</organization>
    </author>
    <author fullname='H. Schulzrinne' initials='H.' surname='Schulzrinne'/>
    <author fullname='S. Casner' initials='S.' surname='Casner'/>
    <author fullname='R. Frederick' initials='R.' surname='Frederick'/>
    <author fullname='V. Jacobson' initials='V.' surname='Jacobson'/>
    <date month='January' year='1996'/>
    <abstract>
      <t>This memorandum describes RTP, the real-time transport protocol. RTP provides end-to-end network transport functions suitable for applications transmitting real-time data, such as audio, video or simulation data, over multicast or unicast network services. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='1889'/>
  <seriesInfo name='DOI' value='10.17487/RFC1889'/>
</reference>

<reference anchor='RFC4656' target='https://www.rfc-editor.org/info/rfc4656'>
  <front>
    <title>A One-way Active Measurement Protocol (OWAMP)</title>
    <author fullname='S. Shalunov' initials='S.' surname='Shalunov'/>
    <author fullname='B. Teitelbaum' initials='B.' surname='Teitelbaum'/>
    <author fullname='A. Karp' initials='A.' surname='Karp'/>
    <author fullname='J. Boote' initials='J.' surname='Boote'/>
    <author fullname='M. Zekauskas' initials='M.' surname='Zekauskas'/>
    <date month='September' year='2006'/>
    <abstract>
      <t>The One-Way Active Measurement Protocol (OWAMP) measures unidirectional characteristics such as one-way delay and one-way loss. High-precision measurement of these one-way IP performance metrics became possible with wider availability of good time sources (such as GPS and CDMA). OWAMP enables the interoperability of these measurements. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='4656'/>
  <seriesInfo name='DOI' value='10.17487/RFC4656'/>
</reference>

<reference anchor='RFC5357' target='https://www.rfc-editor.org/info/rfc5357'>
  <front>
    <title>A Two-Way Active Measurement Protocol (TWAMP)</title>
    <author fullname='K. Hedayat' initials='K.' surname='Hedayat'/>
    <author fullname='R. Krzanowski' initials='R.' surname='Krzanowski'/>
    <author fullname='A. Morton' initials='A.' surname='Morton'/>
    <author fullname='K. Yum' initials='K.' surname='Yum'/>
    <author fullname='J. Babiarz' initials='J.' surname='Babiarz'/>
    <date month='October' year='2008'/>
    <abstract>
      <t>The One-way Active Measurement Protocol (OWAMP), specified in RFC 4656, provides a common protocol for measuring one-way metrics between network devices. OWAMP can be used bi-directionally to measure one-way metrics in both directions between two network elements. However, it does not accommodate round-trip or two-way measurements. This memo specifies a Two-Way Active Measurement Protocol (TWAMP), based on the OWAMP, that adds two-way or round-trip measurement capabilities. The TWAMP measurement architecture is usually comprised of two hosts with specific roles, and this allows for some protocol simplifications, making it an attractive alternative in some circumstances. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='5357'/>
  <seriesInfo name='DOI' value='10.17487/RFC5357'/>
</reference>

<reference anchor='RFC5785' target='https://www.rfc-editor.org/info/rfc5785'>
  <front>
    <title>Defining Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname='M. Nottingham' initials='M.' surname='Nottingham'/>
    <author fullname='E. Hammer-Lahav' initials='E.' surname='Hammer-Lahav'/>
    <date month='April' year='2010'/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='5785'/>
  <seriesInfo name='DOI' value='10.17487/RFC5785'/>
</reference>

<reference anchor='RFC6335' target='https://www.rfc-editor.org/info/rfc6335'>
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname='M. Cotton' initials='M.' surname='Cotton'/>
    <author fullname='L. Eggert' initials='L.' surname='Eggert'/>
    <author fullname='J. Touch' initials='J.' surname='Touch'/>
    <author fullname='M. Westerlund' initials='M.' surname='Westerlund'/>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <date month='August' year='2011'/>
    <abstract>
      <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
      <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='165'/>
  <seriesInfo name='RFC' value='6335'/>
  <seriesInfo name='DOI' value='10.17487/RFC6335'/>
</reference>

<reference anchor='RFC6762' target='https://www.rfc-editor.org/info/rfc6762'>
  <front>
    <title>Multicast DNS</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <author fullname='M. Krochmal' initials='M.' surname='Krochmal'/>
    <date month='February' year='2013'/>
    <abstract>
      <t>As networked devices become smaller, more portable, and more ubiquitous, the ability to operate with less configured infrastructure is increasingly important. In particular, the ability to look up DNS resource record data types (including, but not limited to, host names) in the absence of a conventional managed DNS server is useful.</t>
      <t>Multicast DNS (mDNS) provides the ability to perform DNS-like operations on the local link in the absence of any conventional Unicast DNS server. In addition, Multicast DNS designates a portion of the DNS namespace to be free for local use, without the need to pay any annual fee, and without the need to set up delegations or otherwise configure a conventional DNS server to answer for those names.</t>
      <t>The primary benefits of Multicast DNS names are that (i) they require little or no administration or configuration to set them up, (ii) they work when no infrastructure is present, and (iii) they work during infrastructure failures.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='6762'/>
  <seriesInfo name='DOI' value='10.17487/RFC6762'/>
</reference>

<reference anchor='RFC6763' target='https://www.rfc-editor.org/info/rfc6763'>
  <front>
    <title>DNS-Based Service Discovery</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <author fullname='M. Krochmal' initials='M.' surname='Krochmal'/>
    <date month='February' year='2013'/>
    <abstract>
      <t>This document specifies how DNS resource records are named and structured to facilitate service discovery. Given a type of service that a client is looking for, and a domain in which the client is looking for that service, this mechanism allows clients to discover a list of named instances of that desired service, using standard DNS queries. This mechanism is referred to as DNS-based Service Discovery, or DNS-SD.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='6763'/>
  <seriesInfo name='DOI' value='10.17487/RFC6763'/>
</reference>

<reference anchor='RFC8615' target='https://www.rfc-editor.org/info/rfc8615'>
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname='M. Nottingham' initials='M.' surname='Nottingham'/>
    <date month='May' year='2019'/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8615'/>
  <seriesInfo name='DOI' value='10.17487/RFC8615'/>
</reference>

<reference anchor='RFC8766' target='https://www.rfc-editor.org/info/rfc8766'>
  <front>
    <title>Discovery Proxy for Multicast DNS-Based Service Discovery</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <date month='June' year='2020'/>
    <abstract>
      <t>This document specifies a network proxy that uses Multicast DNS to automatically populate the wide-area unicast Domain Name System namespace with records describing devices and services found on the local link.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8766'/>
  <seriesInfo name='DOI' value='10.17487/RFC8766'/>
</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='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='RFC8259' target='https://www.rfc-editor.org/info/rfc8259'>
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname='T. Bray' initials='T.' role='editor' surname='Bray'/>
    <date month='December' year='2017'/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='90'/>
  <seriesInfo name='RFC' value='8259'/>
  <seriesInfo name='DOI' value='10.17487/RFC8259'/>
</reference>

<reference anchor='RFC9293' target='https://www.rfc-editor.org/info/rfc9293'>
  <front>
    <title>Transmission Control Protocol (TCP)</title>
    <author fullname='W. Eddy' initials='W.' role='editor' surname='Eddy'/>
    <date month='August' year='2022'/>
    <abstract>
      <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='7'/>
  <seriesInfo name='RFC' value='9293'/>
  <seriesInfo name='DOI' value='10.17487/RFC9293'/>
</reference>

<reference anchor='RFC8305' target='https://www.rfc-editor.org/info/rfc8305'>
  <front>
    <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
    <author fullname='D. Schinazi' initials='D.' surname='Schinazi'/>
    <author fullname='T. Pauly' initials='T.' surname='Pauly'/>
    <date month='December' year='2017'/>
    <abstract>
      <t>Many communication protocols operating over the modern Internet use hostnames. These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics. Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly. This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs". This document obsoletes the original algorithm description in RFC 6555.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8305'/>
  <seriesInfo name='DOI' value='10.17487/RFC8305'/>
</reference>

<reference anchor='RFC9114' target='https://www.rfc-editor.org/info/rfc9114'>
  <front>
    <title>HTTP/3</title>
    <author fullname='M. Bishop' initials='M.' role='editor' surname='Bishop'/>
    <date month='June' year='2022'/>
    <abstract>
      <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='9114'/>
  <seriesInfo name='DOI' value='10.17487/RFC9114'/>
</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>




    </references>


<section anchor="apache-traffic-server-example-configurations"><name>Apache Traffic Server Example Configurations</name>

<t>Apache Traffic Server starting at version 9.1.0 supports configuration as a
Responsiveness Test Server, using the generator and the statichit plugin.</t>

<t>This section shows fragments of sample server configurations to host a
Responsiveness Test Server.</t>

<section anchor="single-server-configuration"><name>Single Server Configuration</name>

<t>Given a local file “config.example.com.json” with the following content:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "urls": {
    "large_download_url":"https://www.example.com/large",
    "small_download_url":"https://www.example.com/small",
    "upload_url":        "https://www.example.com/upload"
  }
}
]]></artwork></figure>

<t>The sample remap configuration file then is:</t>

<figure><artwork><![CDATA[
map https://www.example.com/.well-known/nq \
    http://localhost/ \
    @plugin=statichit.so \
    @pparam=--file-path=config.example.com.json \
    @pparam=--mime-type=application/json

map https://www.example.com/large \
    http://localhost/cache/8589934592/ \
    @plugin=generator.so

map https://www.example.com/small \
    http://localhost/cache/1/ \
    @plugin=generator.so

map https://www.example.com/upload \
    http://localhost/ \
    @plugin=generator.so
]]></artwork></figure>

</section>
<section anchor="alternate-server-configuration"><name>Alternate Server Configuration</name>

<t>If a separate test_endpoint server is desired, then on the main www.example.com server(s)
a JSON configuration file like the one shown below is used:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "urls": {
    "large_download_url":"https://www.example.com/large",
    "small_download_url":"https://www.example.com/small",
    "upload_url":        "https://www.example.com/upload"
  }
  "test_endpoint": "nq-test-server.example.com"
}
]]></artwork></figure>

<t>On the main www.example.com server(s) a remap configuration file like the
one shown below is used, to serve the JSON configuration file to clients:</t>

<figure><artwork><![CDATA[
map https://www.example.com/.well-known/nq \
    http://localhost/ \
    @plugin=statichit.so \
    @pparam=--file-path=config.example.com.json \
    @pparam=--mime-type=application/json
]]></artwork></figure>

<t>On nq-test-server.example.com a remap configuration file like the
one shown below is used, to handle the test downloads and uploads:</t>

<figure><artwork><![CDATA[
map https://www.example.com/large \
    http://localhost/cache/8589934592/ \
    @plugin=generator.so

map https://www.example.com/small \
    http://localhost/cache/1/ \
    @plugin=generator.so

map https://www.example.com/upload \
    http://localhost/ \
    @plugin=generator.so
]]></artwork></figure>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAIQCXmgAA+2965LcVnYu+B9Pgakeh6rszBSvapHjdrtEUhLdvFSzSlac
GU1IyExUJZqZQDaAZLFaTUe/xkT4vMf5f96kn2TW96219t5AZlG0fcIzZ2La
4e5iFbCxL2uv+/rWdDrN+qpfl4/zN2W3bequelfWZdflu3pZtvn3Tfu2qq/y
J029rPpK/p4V83lbvvv055fNoi428oFlW1z206rsL6fVdruZtoMBpne+yJZF
Xz7OFvLfV0178zjv+mWWdbv5puo6GeviZivDPH928XW2aJbymcf5Tgb7Mqu2
7eO8b3ddf+/OnUd37mVFWxaP84u2qOUTbZ9dy7Su2ma3ldfP8rOyvWzaTVEv
yvxlWXS7ttyUdZ+9LW/kwaU8U/dlW5f99CmmLFPoi3r5Y7Fuavn+Tdll2+px
/n/0zWKSdzJ8W1528tPNBj/8n1lW7PpV0z7O8nwq/5/nVd09zp/M8rOi6BYr
/kp35Mmqrbq+2a7SP5Wbolo/zhf+t9mWf/s7bNw/XuGPs0WzyYajv5nJSm7K
Nhn8jcy5WK+T3zet7NjpdrsuZYWLGX/XyezL/nH+ui7tT2dF+zb/vrjhnxdV
L+fwZLct276qm0n+pFhXsnl1VeSPHt65+0CfanZ1jwP7rq76cpmf93KEXd5c
5qebsq0WRbqwtt38Y4EvHVjG+Uz2pOxWVVsmKznvd0XbD//y/461LGxKty7o
+1n+bXEtV6JL1vN9JceS/pqLke+9K9tOJomPPanqRVXXRV+l31vxpevVP+4W
JITdYlYud1lWg5x7eR9E9+brJ/fu3n1kP35599cP7MdHd+/eeZxlVX2ZPv7V
84vTbx7zK8YJjl7IkuvFTf7s/XZdVHW5POKfI13Lf6Y666/apljOhdTCpckv
ysWqlo1a56fLd5VckJv8G9w9vscrnt+7c++efrFor3Bkq77fdo8///z6+no2
r/riaiajf77WeUxLn8dsu8IwX+0uL8t2vm6K/vGhmXHr/2mWf1P2/U03+O3v
ZvmrarFq1t1gxemI+VNQjf6mk7fyflWG1elOdEIJZYeNFIJqNpsd1kt2h7PD
86dPXk7yf27Wu02ZP3w4yV/tNnPhj3fz43t37t47kVGeFG/L22d/IYTz3/9b
tZadnf7Tf/9vskt1V9aDR57O8oti1Y8X/VI4UlMPVndWlcLqQFWnv3sm1wZz
3rblqiT3zX+/K3fCCYu6uCIjzM9l3lhNLoSSf9vIEr6Rk7gubrr95ctyvhSe
/OyZbRG3Qc7+/Gazbbpqt8llnBcNyAFU8rLs22bbrOWM6/xU2HT+quzBnrv8
+MXpq5enr7A3Z21xtQOvnz6dqdiYCzdcNOW0Wizaq+mWf58umvqq7PBB/CgD
r+Xd869epi/6FZ12841eg7t37vuNuPvll35PHnzx8Av78eH9h7/2H3/95UP7
8Yv798OPv/7iXvzxvt+0L+76A1/++gsf7Mt7j+74j3fuh2fvPfQPP7r3KPz2
/p2H8a6Ga3v/Pq7tdDrNi7nwuGIhIulrORmRYDcijopWpE+Rr4vFW5zxUKxO
8ndFWzW7bn2Tyxmsy2W2Lq4muV2tidzifB6JfyIspsvnZVnLOIvmqq7+JG/I
r+S0duAb/U5OuJzIO72wys2mqSn5tn2z4VVplsXNZ11e26HOsmcyj1wOQoi/
yJfloliSEvFXUAZFa9Euqz9BbegD6+iMBLtJVvUyF2F3crkK+2a+bZv5utyQ
QHHdSiGtnZClfBBfbG9EVOdHb+vmujuSB4o+l1GqLj8ip1wf8cUif1cty0bG
rGX9JdSBvslWhVwJG7/Lr+WSyGQ25bxZ3uTluitzGWyFO1F12XXRL1aYeJE/
+F2+ad5VJTZ0t5W9hIKSb1dN33T5ZSvbI/OsWvymLmfZt811KfOc4Lctxsrr
Jlm+XIzO7l+/kj/2jRwKV7ooOnn9ufxN6CCcbv5H3uFNvMNhA3VB8s93Is0w
gq1Ndur1rvWTwibU5UJ5GC5TVe+wHXlH4tAVkAiKxaLc9oUMkRcbCMtMjnNZ
rgshprrpbWedGg+dKImnLbDy5MniWrQ2kGxmLNTPGGxjWcqW3nBh8teq7+Jw
s+z7UjZnXcl+6lEvZPd6PZW+adb6y40qet3e0Bucofx+WzYiwz/rMpzLjZBx
LmIHjA50cQ2RzXH1FGSrZKaFiLYw7UmG0eQLu3WPqwBq3+BX2JBkttkFDlS0
4p2e07ZcVJeVTexopFVfCHtTYtX5Y1XDCy600IP0u+RqiGYqAk5XJ/tf1FW3
IQ3ZJvCqZMnybBJgEDdK8rpIJY3Ktftr0+4XQbufyWpKH5brkYdlYJljJ+Qm
jOPojdDIctq31baD5p2/FMrqy6P8+M3ZyxPuWbdqduslCFyUnvVuKS9eV/0q
v2qa5VZI5Xi3VSJorusT/JRVS6E+Y2H4yKKV6YDIKpmYSOKmpSD2BfxxJ5pe
fzNTJrqplvJ6lv0KEqttljtS/f80LDX/+edEW/nwYZa5uO7ydfW2zC//+KOY
R+VaHjT58+HDJD97/sx+IVIIv4D+Ib/B/3z4wHN48eBcH4HE+fAhJ+PgxCOX
xtTl0WojdwXnXS4nPBu5BBOyC3DG8r3shCxcb62obdkrXCqhqTX3b9s0kfGM
NjfTGwQyI89JdpIfasg2FgVIfpI5pyJ1F/LkotczFAJ/V8kd5Tu88rzeQtwN
qB+/Agf8XmgdU5PD9vlshTGBioW9ypzkjOclJrMjPffkPZc7cINiW8CkEAGl
/Gre9KJuCWd4K+dQv+Wxc6W6hIQ5Zz2uWIWpCvmu1801iKGRecjn1lCJjZ+D
7e8quRu7bboxQhWr6mqlXDfIQNEMLuUOq8YqM+UQs+x0LdrlTp5Od7KrhA5x
4etePrksr1qRyx35QsL2Jpgozlr2QtZbUwbBqK7khsl1el0n+6ZStstFUy1b
MhIyDaHMNcmmfA+5wdk2C5FiqiZuyqXoiNMOj8A4KPQDUL0nGclZ1F6KUvk8
rSDlDfKvou+LxWpDShsI3ULFrs4eS5omrG5Zde1ua3JOl1RBcd1UPYiW9CLK
Znk5yTYFuR1IRQ6zXeI4llVxVTcQwRc2OA9RBF+1MPGTss6uhBLRrXdXV1W3
Mtl4WV7LH8BEZY1RDwlqCNcgBqXZFPwAp7S+yYRXCrHIton0ETLpihudon03
SnEcxV//8q+7uqOs/utf/uskA4eZlzIJFWKcPahU1KpVoepP3u5kZ+ubzBYq
y6IQ5QWr6ndQt6/IrlI5ikFkY2XSwjpx38/0tpGDLMAScD2pOMS5BoORwpWP
yoSvhFNDHsuEM1WbKn0d/6u8Ri4OZ73eyPxkQfzAAjxE6E3ISHW8WfbdFmTN
/WlAMOGDyS6RmHCZRCD6jRZBU3bUZUSr2FS1Cf1uQDy6m5XeCzmVtlepKSre
ctfy4EQ0t02tUnWiehzmTX1VWZXIlkhkYTeFIdUZCE6OJyE5OJtg5fVlscSb
l9V7f7Nvd+F1kL2dPdePozfVBSctd3enZHVNzROvy/UWCZnxvq5JUD4VSHMo
8BvQDK6jXGsQCfVxueCqVkIfDdPyPcMwYcf9VKnN/2HXgfW9VZ1nA0FbgXXq
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
8CYL383/UFqEf6Ixh/cFkhrIEnEVkBZCF+Bekhgnqp5/uHNxM7pg0xo7djeJ
K53qnIEJS97vtCVabm/CWBNQ0nXPS4tWTTzkCZ+8KUiJPmTUJeziMuhNCE0g
sLqUS0aFE3FdDe9OdJfhIrUTYhSGrosMKXN5tM+jTmWJTW526yR5oe0vsHqz
ToTWNdW1lZqJbeLg6CuwcSbUyBY2G1JwVYfhdFOeNLUQN2nOfcSBxtXtUqrr
7I+7avGWelDQdiaZnJUmMZFKIXIt0E5+ThZc2VU1pm/a0TJEMDox/MHcNNfK
br8zlXheOls6vIsklvxMnjvXuGCWvQq+atFljB80iwVsh1u0BuwdhMV2h/iX
3Jwhhwl8fpZ/C6ZnA1zSRzg6Dfi7qmR6rierrxCXQ9lOmq/g2TL+d8/FQ36l
RztVp+mjwrAoq3cxEs0ZzbInA5VN9tw8r9DD5/T5WCR2EKPYqj8IqqM5RkIS
Wt+V68uJ6sB9oWH5JS5r3VQdKW1eFaAnzemSA53fREqVBWwb+VtHlQUBIHKW
mgIjpCQMHyVvsQ2gn7Xrg9ywnCeelXsW3ADyKWAVSaKNU8Fx05pFgDwyuqdO
qJbJAt+FqC69hbfNLBEkqix0YtssykOZRsy/hAdCk8Munpz98KNY/efPXl38
8OOL19+fXpjb4t6j+x8+/Pzz+VcvP3zA5r8ty63SQgyB7JCE3tMCzhCZ7XUb
i1S/0HgbGDF41B88pGliQzjDrgVDEf2g66dVPV2Iwd5pcKxYFtte/XXB3dNl
x+5JwduaGZ7HzO/cMr/XZZv9/LP++cOHE5cm/rl8+LmQnyPHU2jcLnxmlAZ3
Qjugs2CubmUM4YVIcWNjxfRJPRN4vz0CKHqBaLLmCyos6oe/90XrIaWQ7yXv
Z+H47XzBsoqlRir6OK5u3kKkuJpx+ymxLgrT1KSD083jdGlkWE6WWyrRWVDD
pSgy5tgSefkIZyb82dMvsiR8B7GHlJG+Woe1I+VNeRe9xRYqw71ai551ghTr
d/D8qEve03p/yerOg81NkQizn5txicVR1Vmoia+O1Hi/gtMBQbfLtf6t6LPw
waj7JIRzAycevlm2CaOv88FbDZOFqNHDskcW9yS3xMGY4TbgpsMbb8wmK9So
19gWNCW5lqDYOCGT72FVTK8Cp+D9zA4qyoluFAbcbfkXsCsGCsXgFUF4Ys6c
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
N53OlV5Q+Pey8f1c0HMEQaLdSyzxbskiuh4NSgKkUQvody46u11Ziu29JroM
U8SGZc1ER0jq6WdWLZS/OXvpLCadmbcQQQySd9wBxEd9Xm2t2dju90kdGjtU
DVFb2KuO6VCYnNGdXLg0DwqvAkHReMsNtNYYz8FxsIdirAbCTqYx2wvr4+QB
FTzRkRPmS3Ta/Uisa904oCSmA05xMjmo+X50O+SayCPs8p6xaHBvtw/YK6ND
cwtT7ld+XIhKpZGfkB/PxKsoKEHVV22xXXXaW/qQ2ql26MEKwUHcvyML6/Pd
luhhl6ggC0QYkiJCb8nH2XPRIKhGsIO9ah0zlIOHUBvirWEY7Cid/Yi5hgpv
5BAf+aBHSSb6RPaQ1dqanHPjZPTdmxdGxzvPfQXiC/YSOf2+UV5s0lxm+1F1
cMvGrOPDUd6X38lQ3vDD4gos+pW1qqp6y3un/0Xx4wfv3td3oW4NXuZXkvZz
nbaRcrAdyyjE8mSVXJ1aHvuDdKXNAw8Hy//odLEot/30mSj5IO2jHFXxNIF5
s4+QNNELjzxiOlAoWMpsNRRl1pWdnYFUlgA+SaEgks1KlqFUprGLJukemFEG
A8miIDbNeAjyE6VyzTEajlUMkIi4SGiqCpY6Hit57wFpxsDy8qNOCFAoTX73
uYMOPU5fJ0/x1+0IoMkCcx1WEOAQ7tzJj1//TvX1u7lCIV3G2WA0w6zfgCVc
lf43OiZa9wUMtuD829ffvXjq5M59eKIvTS8ADmdHd1mV62U8YtYdKHrcUYLT
9nmz6EtRyRmFOjr0HYNO0A1XNG50jEApxGRkNJb60RT5GARlqUdpkOi6ojJ/
jxtNT/T/wI32LcRkaQZ62tqXaC75n7mTPhMTyNr/cmI2zU0oH0RDaih1Qdhu
CXcWS1sCjMC/lWTs6juGxpw9bzx3TCv01zdJV4qVQ3Vp3MpcuazAlbG812eK
0sXg5Ee6W2vbBu+LOGwcKRRwn5iJR1oL9Us0oIhCcvpkcUPul3aGSglgcOAW
ZEXXcsioPh7RYGONg/4P2l2r8/rP39sHuF0zWAxT7bAhu6th8S+/uPvwwwe9
ptwaOFH+6fz1KwdqC044evkUm5CuIErVUX53HoMyi0FbxdTp4mncMV4E3HQX
tPnxuXzh55+9n/wNcv6Z4TA7ydK9ttqvA67pVEeZ38DYaqkLeGiLy9PV33v4
SFY/mKvZeJDG68q8Vlwr8c3SVhQfM4osP3/QN/FQ25U9S25Di5J7H/Kl3fE0
OtWPKW+A6ND9y3/+VdxLzWzd60hljfDcMGtzR9rHZUqgPPeeY+TOYUbTxmD+
aDboeGURwNHrNUwgQv3D9vnIojyGUrVZYJDyWWEIYgUZpnlssnqtPcUCqNYc
MXa19tlTykRWlcId54b95wttrIfK3JLLfOYJTBATjyx7LoSNi8PuXHYos/l1
AX/8RjMnWPEdnIjbA907kxDLYMrx+sqcJwZeeMVktFpM3JzcUSNW5s+fZNnf
/7a9XACugVm9i/43Rzdld5T/9h+g9Bx9LyOyNZS1mb3RCdkCkcz72yM+eN5A
wbQI77KxllfWoIBdAvNTO3VYh5/yFsrFroubX3h0TIt7j5frziEx1xhsf8F1
w/XCLc52S6h70bJbUH53XToOfNhAGsburrH2A7ylEfuLndAS1VbubAXJanfw
o+TtwR1Rq6yFRGbOjJFHyRK7lHyTXhD+K934Itl4/4tctc+6DPrMFGsN3WvY
jw8moeM1qDFmvozQzuaxCBLuz4qIlIktmg3uDFYB+O+X6JoetAqqMxMnXrlX
76oiu6quRHvvQ3NJhdAsWWwCP8n+Wnw7bO2TLGDM1/r1QBwylL7uwHexP2D0
3rSEYRwk9y8N4GgS8rvoGuPNVPlm+A7WxvAroAYE8JCBhd6zxpWc7TBXOLdM
ieDxWKhrtqZcNOC+tMP72J/kTIylhC04rkiRtmezSfq6SNxV16yT5mhpZ6fI
hEI8DAIfOYnIu2+NJAOtMHS0VC2FxHdMRn4b6XUnnJM8qCAfQqmD1zWEie5K
09+pdqKwedgtdSQ/p9Ep2rdIpu/ePD9hGt1BaZdlp4DtuCrq4A/zLivKJXEQ
t/Fn83sUS8Tmqs6zEpyYlBWm19AlyUCzep5qVqoe4pfdYlUicNflRwjWWOoG
bddEwgKyjM/UfzzK7Jbz8ceff253cSYn/XmizH1e/1Hu7asmdadqyFsoQkiA
fkIqQUgxRNiN0N1toT5Lz2+rllloPz1cz8xA6oOxE209PR7zWY12AatIraI/
dMAoQK1+z7gd9MG9oRjE42wGWijCgQYDu1Rt0HByfs7y/MjCREeP87tAJj/a
tetO/vEzC0vVqPzRedCP8kf529HfQwXGgue79dvAof7haKIvUQ+7/SVV0/be
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
1S+F+IGTmioZShefspP/Px/L/m8Dfxk1qBwBAA==

-->

</rfc>

