<?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.17 (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-03" 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>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>cpaasch@apple.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="2023" month="October" day="20"/>

    <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 networks remain unresponsive, not from 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 throughput (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"/> or L4S <xref target="RFC9330"/> have been standardized
and are to some extent widely implemented.
Nevertheless, people still suffer from bufferbloat.</t>

<t>Although significant, the impact on user experience can be transitory --
that is, its effect is not always visible to the user.
Whenever a network is actively being used at its full capacity,
buffers can fill up and create latency for traffic.
The duration of those full buffers may be brief:
a medium-sized file transfer, like an email attachment
or uploading photos,
can create bursts of latency spikes.
An example of this is lag occurring during a videoconference,
where a connection is briefly shown as unstable.</t>

<t>These short-lived disruptions make it hard to narrow down the cause.
We believe that it is necessary to create a standardized way to
measure and express responsiveness.</t>

<t>Including the responsiveness-under-working-conditions test
among other measurements of network quality (e.g., throughput
and idle latency) would raise awareness of the problem and
establish the expectation among users that their network providers deploy
solutions.</t>

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

<t>A word about the term "bufferbloat" -- the undesirable latency
that comes from a router or other network equipment
buffering too much data.
This document uses the term as a general description of bad latency,
using more precise wording where warranted.</t>

<t>"Latency" is a poor measure of responsiveness,
because it can be hard for the general public to understand.
The units are unfamiliar ("what is a millisecond?") and
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 4-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>This document defines an algorithm for the "Responsiveness Test"
that explicitly measures responsiveness under working conditions.</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>In order to minimize the effects of these challenges,
it's best to keep the test duration relatively short.</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.
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>Traditionally, one thinks of bufferbloat happening in the network, i.e., on
routers and switches of the Internet.
However, the networking stacks of the clients and servers can
have huge buffers.
Data sitting in TCP sockets or waiting for the application
to send or read causes artificial latency, and affects user experience
the same way as in-network bufferbloat.</t>

<t>Finally, it is crucial to recognize that significant
queueing 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 must necessarily be some hop
along the path with the lowest capacity for that path.
If that hop were to be improved, 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.
Arguably, this heterogeneity of the Internet is one of its greatest strengths.
Allowing individual technologies to evolve and improve at their
own pace, without requiring the entire Internet to change in
lock-step, has enabled enormous improvements over the years
in technologies like DSL, cable modems, Ethernet, and Wi-Fi,
each advancing independently as new developments became ready.
As a result of this flexibility we have moved incrementally,
one step at a time, from 56kb/s dial-up modems in the 1990s to
Gb/s home Internet service and Gb/s wireless connectivity today.</t>

<t>Note that in a shared datagram network, conditions do not remain static.
The hop that is the current bottleneck may change from moment to moment.
For example, changes in simultaneous traffic may result in changes
to a flow's share of a given hop. A user moving around
may cause the Wi-Fi transmission rate to vary widely,
from a few Mb/s when far from the Access Point,
all the way up to 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 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 flow.
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 proposed Responsiveness Test mimics normal network operations and data transfers,
with the goal of filling the bottleneck buffer to capacity, and then
measures the resulting end-to-end latency under these so-called working conditions.
A well-managed bottleneck queue keeps its occupancy
under control, resulting in consistently low round-trip times
and consistently good responsiveness.
A poorly managed bottleneck queue will not.</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 their 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)
and/or are already being used widely (RTP).
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="RFC0793"/>, 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 (we target 20 seconds).</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>The Responsiveness Test defines working conditions as the condition where the path between the
measuring endpoints is utilized at its end-to-end capacity and the queue at the bottleneck link
is at (or beyond) its maximum occupancy. Under these conditions, the network connection's responsiveness
will be at its worst.</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 allows to create a stable state of working conditions during which the
bottleneck of the path between client and server has its buffer filled
up entirely, 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>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.
Additionally, deep buffers along the path between the two endpoints may be
significantly larger than 4MB.
TCP allows larger receive window sizes, up to 1GB. However, most transport stacks
aggressively limit the size of the receive window to avoid consuming too much
memory.</t>

<t>Thus, the only way to achieve full capacity and full buffer occupancy on those
networks is by creating multiple connections, allowing to actively fill the
bottleneck's buffer to achieve maximum working conditions.</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
quickly measure their network. As a result, the test must 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>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.
Because of this, 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="parallel-vs-sequential-uplink-and-downlink"><name>Parallel vs Sequential Uplink and Downlink</name>

<t>Poor responsiveness can be caused by 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>One approach could be to measure responsiveness in the uplink and downlink
in parallel. It would allow for a shorter test run-time.</t>

<t>However, a number of caveats come with measuring in parallel:</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>Debuggability of the results becomes harder:
During parallel measurement it is impossible to differentiate whether
the observed latency happens in the uplink or the downlink direction.</t>
</list></t>

<t>Thus, we recommend testing uplink and downlink sequentially. Parallel testing
is considered a future extension.</t>

</section>
<section anchor="achieving-full-buffer-utilization"><name>Achieving Full 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, buffers will start filling up, creating the
"standing queue" that is characteristic of bufferbloat. At this moment the test starts
measuring the responsiveness until it, too, reaches saturation.
At this point we are creating the worst-case scenario within the limits of the
realistic traffic pattern.</t>

<t>The algorithm notes that throughput increases rapidly until TCP
connections complete their TCP slow-start phase.
At that point, throughput 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 throughput is by
adding more TCP connections to the pool of load-generating connections.
If new connections leave the throughput the same,
full link utilization has been reached.
At this point, adding more connections will allow to achieve full buffer occupancy.
Responsiveness will gradually decrease from now on, until the buffers
are entirely full and reach stability of the responsiveness as well.</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>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 while achieving 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. 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_s</spanx>).</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_s</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 a
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 probes should be spread out equally over the duration of the interval. 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>

<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 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 weighted mean:</t>

<figure><artwork><![CDATA[
Responsiveness = 60000 /
(1/6*(TM(tcp_f) + TM(tls_f) + TM(http_f)) + 1/2*TM(http_s))
]]></artwork></figure>

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

</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 final algorithm. In order to measure the worst-case latency, 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 full
buffer occupancy. First, the algorithm reaches stability for the goodput. Once
goodput stability has been achieved, responsiveness probes will be transmitted
until responsiveness stability is reached.</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 most-recent 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 p: 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 a load-generating connection.</t>
  <t>At each interval:
  <list style="symbols">
      <t>Create an additional load-generating connection.</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 one of the goals is that the test finishes within
20 seconds. It is left to the implementation what to do when stability is not reached
within that time-frame. For example, an implementation might gather a provisional
responsiveness measurement or let the test run for longer.</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 4 iterations of the specific stage. Meaning, the moving average is
not taking the full window into account.</t>

<t>We define "Medium" confidence if the algorithm was able to execute at least 4
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.</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 regular 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 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 will
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 will happen at the
layers below the transport stack (e.g., NIC firmware).</t>

<t>Each of these queue build-ups may cause latency and thus low responsiveness.
A well designed networking stack would ensure that queue-buildup in the TCP layer
is kept at a bare minimum with solutions like TCP_NOTSENT_LOWAT <xref target="RFC9293"/>.
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 or that they implement techniques
like FQ-Codel. 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.</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 as well as queuing in the
bottleneck node will cause latency. 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",...
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 Smart Queue Management 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>

</section>
</section>
<section anchor="root-causing-responsiveness"><name>Root-causing Responsiveness</name>

<t>Once a responsiveness result has been generated one might be tempted to try to localize
the source of a potential 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 to gain some insight into what the
source of the latency is. The previous section described the elements that influence
the responsiveness. From there it became apparent that the latency measured
on the load-generating connections and the latency measured on separate connections
may be different due to the different elements.</t>

<t>For example, if the latency measured on separate connections is much less than the
latency measured on the load-generating connections, it is possible to narrow
down the source of the additional latency on the load-generating connections.
As long as the other elements of the network don't do flow-queueing, the additional
latency 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>

</section>
</section>
<section anchor="responsiveness-test-server-api"><name>Responsiveness Test Server API</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 PUT in the process of
executing the test.</t>

<t>Both the client and the server MUST support HTTP/2 over TLS.
The client MUST be able to send a GET request and a POST.
The server MUST be able to respond to both of these
HTTP commands.
The server MUST have the ability to provide content upon a GET request.
The server MUST use a packet scheduling algorithm that minimizes internal queueing
to avoid affecting the client's measurement.</t>

<t>As clients and servers become deployed that use L4S congestion control
(e.g., TCP Prague with ECT(1) packet marking),
for their normal traffic when it is available, and fall back
to traditional loss-based congestion controls (e.g., Reno or CUBIC)
otherwise, the same strategy SHOULD be used for Responsiveness Test traffic.
This is RECOMMENDED so that the synthetic traffic generated
by the Responsiveness Test mimics real-world traffic for that server.</t>

<t>Delay-based congestion-control algorithms (e.g., Vegas, FAST, BBR)
SHOULD NOT be used for Responsiveness Test traffic because they take
much longer to discover the depth of the bottleneck buffers.
Delay-based congestion-control algorithms seek to mitigate the
effects of bufferbloat, by detecting and responding to early signs
of increasing round-trip delay, and reducing the amount of data they
have in flight before the bottleneck buffer fills up and overflows.
In a world where bufferbloat is common, this is a pragmatic
mitigation to allow software to work better in that environment.
However, that approach does not fix the underlying problem of bufferbloat;
it merely avoids it in some cases,
and allows the problem in the network to persist.
For a diagnostic tool made to identify symptoms of bufferbloat in the
network so that they can be fixed, using a transport protocol explicitly
designed to mask those symptoms would be a poor choice, and would
require the test to run for much longer to deliver the same results.</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 and 1 byte in the body.
The actual message content is irrelevant.
The server SHOULD specify the content-type as 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 and a body size of at least 8GB.
The server SHOULD specify the content-type as application/octet-stream.
The body can be bigger, 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 condition
and making its measurements.</t>
  <t>An "upload" URL/response:
The server must handle a POST request with an arbitrary body size.
The server should discard the payload.
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 condition
and making its measurements.</t>
  <t>A .well-known URL <xref target="RFC8615"/> which contains 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 Server instances 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>

<t><list style="numbers">
  <t>"What's causing my poor performance?"</t>
  <t>"Is it poor buffer management by my ISP?"</t>
  <t>"Is it poor buffer management in my home Wi-Fi Access point?"</t>
  <t>"Something to do with the service provider?"</t>
  <t>"Something else entirely?"</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 Server instances 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 instance,
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>Any organization that wishes to host their own instance of a Responsiveness Test Server can advertise that capability
by hosting at the network quality well-known URI a resource whose content type is application/json and contains a valid JSON object meeting the
following criteria:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "urls": {
    "large_download_url":"https://nq.example.com/api/v1/large",
    "small_download_url":"https://nq.example.com/api/v1/small",
    "upload_url":        "https://nq.example.com/api/v1/upload"
  }
  "test_endpoint": "hostname123.provider.com"
}
]]></artwork></figure>

<t>The server SHALL specify the content-type of the resource at the well-known URI as application/json.</t>

<t>The content of the "version" field SHALL be "1". Integer values greater than "1" are reserved
for future versions of this protocol.
The content of the "large_download_url", "small_download_url", and "upload_url" SHALL
all be validly formatted "http" or "https" URLs. See above for the semantics of the fields.
All of the fields in the sample configuration are required except "test_endpoint".
If the test server provider can pin all of the requests for a test run to a specific
host in the service (for a particular run), they can specify that host name in the
"test_endpoint" field.</t>

<t>For purposes of registration of the well-known URI <xref target="RFC8615"/>, the application name is "nq". The media type
of the resource at the well-known URI is "application/json" and the format of the resource is as specified
above. The URI scheme is "https". No additional path components, query strings or fragments are valid
for this well-known URI.</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 instances of the Responsiveness Test Server, organizations
wishing to host their own instances of the Test Server MAY advertise their availability using
DNS-Based Service Discovery <xref target="RFC6763"/> using conventional, unicast DNS <xref target="RFC1034"/> or multicast DNS <xref target="RFC6762"/>
on the organization network's local link(s).</t>

<t>The Responsiveness Test Service instances should advertise using the service type <xref target="RFC6335"/>
"_nq._tcp".  Population of the appropriate DNS zone with the
relevant unicast discovery records can be performed
automatically using a Discovery Proxy <xref target="RFC8766"/>,
or in some scenarios simply by having a human
administrator manually enter the required records.</t>

<section anchor="example"><name>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 PTR and SRV conventional 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 conventional 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. See <xref target="RFC4656"></xref> and <xref target="RFC5357"></xref>.</t>

<t>If server-side resources are 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="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 as defined by <xref target="RFC5785"></xref>.</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" in the System Range.  The registry for
that range requires IETF Review or IESG Approval <xref target="RFC6335"></xref>.</t>

<t>Service Name: nq
Transport Protocol: TCP
Assignee: <contact fullname="Stuart Cheshire"/>
Contact: <contact fullname="Stuart Cheshire"/>
Description: Network Quality test server endpoint</t>

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

<t>Special thanks go to Jeroen Schickendantz for his tireless
enthusiasm around the project and his contributions to this I-D and the development
of the Go responsiveness measurement tool.
We would also like to thank Rich Brown for his editorial pass over this I-D.
We also thank Erik Auerswald, Matt Mathis and Omer Shapira for their constructive feedback on the I-D.</t>

</section>


  </middle>

  <back>



    <references title='Informative References'>

<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='RFC0793' target='https://www.rfc-editor.org/info/rfc793'>
  <front>
    <title>Transmission Control Protocol</title>
    <author fullname='J. Postel' initials='J.' surname='Postel'/>
    <date month='September' year='1981'/>
  </front>
  <seriesInfo name='RFC' value='793'/>
  <seriesInfo name='DOI' value='10.17487/RFC0793'/>
</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='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='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="example-server-configuration"><name>Example Server Configuration</name>

<t>This section shows fragments of sample server configurations to host an responsiveness
measurement endpoint.</t>

<section anchor="apache-traffic-server"><name>Apache Traffic Server</name>

<t>Apache Traffic Server starting at version 9.1.0 supports configuration as a responsiveness
server. It requires the generator and the statichit plugin.</t>

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

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

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

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

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

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAEX/MmUAA9V9aXMjR5Ll9/gVsehdE9kLoMi6pOKYbIYqltQ1XQe7SLVs
baZNlUAGgGwCmVAeZKHVNb99/bl7HJkAqWqbsbVZ9SEQyIzDw8P9+REek8nE
tEW7dmf2g2u2VdkUt650TWO7Mne1/amqb4pyaV9WZV60Bf1ustmsdrdf/nxe
zctsQx3kdbZoJ4VrF5Niu91M6l4Dk5MnJs9ad2bm9P/Lqt6d2abNjWm62aZo
GmrrerelZl6/uv7ezKucujmzHTX2jSm29Zlt665pH5+cvDh5bLLaZWf2us5K
6qJuzR0Na1lX3ZZev7SXrl5U9SYr586+dVnT1W7jytbcuB09mNMzZevq0rWT
CwyZhtBmZf5ztq5K6n/nGrMtzuy/tdV8bBtqvnaLhj7tNvjwF2Oyrl1V9Zmx
dkL/s7YomzP7cmovs6yZr/grocjLVV00bbVdpT9VNc3rfLtdOxrHfMrfNdSH
a8/s+9LpT5dZfWN/ynb887xoiVovu62r26KsxvZlti5oimWR2RfPTk6fylNV
V7Yg649l0brcXrVE6MZWC3u+cXUxz/gpt8mK9Zmdb3lE/5Kht+m82pj+dD5M
iXQ7Vyez+UBEytbr5Pv/HlOp682907ia0iK4ZlXULpnJVdtlddv/5b/HXOY6
pHsn9NPU/iG7oz3YJPP5qaBlSb/myVB/t65uaJDo7GVRzouyzNoi7W/FL92t
/qWb44tpN5+6vDOmKHkHtdQC+Py7brFw9WxdZe0Zvx63AP0zkaH969T+4Np2
1/S+/ePUvivmq2otX6swGqUt2gtQVb5p6C3brlzYoyNZCaKUazAqIni12XQl
EY7lD+aG589fvh3bP1frbuPss2dj+67bzEhgndqjxyenj4+plQ/fvzz5+sWT
M/l4evLkqX58+vzZc/347Mmzr/3Hr795ph+fP3kSPn79/HH86Bv75vmpf+Cb
r5/7xr55/OLEfzx5Ep59/OyFfnzxOAznxZMn9KyZTCY2mxHfZXOSS99XtSUx
tiOZlNUkgjK7zuY3mHFfto7tbVYXVdesd3ZOW9TlZp0tx/R068r5bkz8YGeR
4GNa9sbOnCupnXm1LIu/0Rv0VVaSmKeFbzviEzemd1pi382mKln8bdtqw8tT
5dnuq8bS6kDwNlPzisZhSZQSwTObu3mWO4wSv9qqtCxfszov/gbd0br5Csu3
JuG67ngRx6ZoaSzEgrSgmfZpt3U1W7uNpRHxErsytx1xAnWIHusdyWs7uimr
u2ZED2StpVaKxo5K8O56xC9m9rbIXUVtljR/B53QVmaV3TrffmPvVjT8ptq4
WZXvrFs3zlJjK/qCmjN3WTtfYeCZffpHu6luCweCdluiJbSU3a6qtmrsoiby
0DiLGt+Ubmr+UN05GucY39Zoy5ZVMn1SYg1NU6ZHP7YVLQrPdJ419Ppr+o34
IKyu/aVznQNHZEvWaJGAMiH685YkDFrQuRGl3nd1WCmlMa1yZKAxDaqVwUf+
OrhGYIc6w1ySJ7M7UsaMEHQj+lWjJSdWICLteKj0a9E2sbmp+cnRdNcFUUgW
b070aIXObVWt5cuN6O9mr+kNVoW+37qKJOVXjQGld8SY1n3aQlpgpe8gGLld
oWvp5jTSrN7FYY8NWqMeunUL5gb/bvAVliUZrbnGEhHY6YTyWzcvFoUObDQA
S9euaYX9ZPyYVX/L0uq2YOYmYXYCHCQmZXZE/6wsmg1zhRKBmd8k09NBYMvv
hIllkrzYYDcBbXcK2uYBtE1pNs43y/Ohh6lhGmNDDESiYPSB1FY+aeti2wBQ
2bdF2bVuZI8+XL49Zpo1q6pb52BZUi3rLqcX74p2RWMgJLZcbYlbjrqt8EF1
Vx7jkyly0qIql9DPvKYRgc8KGhuJ9KpmRvJz+KUjldrupiIZN0VOrxvzO2iH
usq7OWbz/42ctL/+mqi9z5+n5srzl10XN84ufvmZgK9b04OqPj5/HtvL16/0
C1Iinz9jkG+eXslXUBv0Fe9+HmgUtRgqkZ7YHCwE6UYr3GKt70ggEgWKDW0c
LL7Lp+Ydtg9xz5rJJJuKGsP+aXjMIiES6tCanK8JBdBS26Yg4oARy5aFHdom
yQXZD55NtyQ9w1IO2L2g5d5ZmCgsvKljiAhHXcxbkZatzdZ32a4hId4UtPcx
FbSPVkmCEMtj3LTgCdNTx7TeNMGZA9d3zNEtN73oIA8yGhsxFQSaQA6MaYGp
KruqxPBsygKaLAWaoGycvKsZfIjIq0hdcMO+uU2Gvu2MZrw4Mxnts7zoNpMG
a4J+dPYLaAZed+qe8RgNs83mKzZWDmiYscFAdXCzrm5a3it+mM2W2qKtfU6t
fcqwuDI+Ign9lxjdVvN5V7MwykUmqXKMunFs7lhVQQeXJC15lvQ2z4VISnv+
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

-->

</rfc>

