<?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-02" 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="March" day="13"/>

    <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 a Responsiveness Test that serves as a good
proxy for user experience. 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 in a useful way, the way a normal application does.
The purpose of the Responsiveness Test is, as quickly as possible, to simulate
a representative traffic load as if real applications were doing
sustained data transfers, 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>In this document, we impose an upper bound on the number of parallel load-generating
connections to 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 ore 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 serve as input to the test methodology. The following lists
their acronyms and default values. Hereafter the detailed description of the
methodology will explain how these parameters are being used. Experience has shown
that these parameters allow for a low runtime and accurate results among 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 a process of continuous measurement.
It requires a sufficiently large sample-size 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>A HTTP GET request on a separate connection ("foreign probes").
This test 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>A HTTP GET request multiplexed on the load-generating connections ("self probes").
This test 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 client 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 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 for the duration of time between
when the HTTP GET request for the 1-byte object is issued on the load-generating connection and 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 probing for responsiveness, we are able to
accurately estimate 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
responsiveness probe. Taking TCP and TLS overheads into account, we can estimate
the amount of data exchanged for a probe on a foreign connection to be around 5000 bytes.
On load-generating connections we can expect an overhead of no more than 1000 bytes.</t>

<t>Given this information, we recommend that each responsiveness probing interval does
not send more than MPS (Maximum responsiveness Probes per Second - default to 100) probes per second.
The probes should be spread out equally over the duration of the interval with an
equal split between foreign and different load-generating connections. For the probes on
load-generating connections, the connection should be selected randomly for each probe.</t>

<t>This would result in a total amount of data per second of 300 KB or 2400Kb, meaning
a total capacity utilization of 2400 Kbps for the probing.</t>

<t>On high-speed networks, this 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 PTC (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:
tcp_f, tls_f, http_f, http_l (from the previous section).
The responsiveness evolves over time as buffers gradually reach saturation. Once
the buffers are saturated responsiveness is stable over time. Thus, the aggregation
of the measurements considers the last MAD (Moving Average Distance - default to 4) intervals worth of completed responsiveness probes.</t>

<t>Over the timeframe of these intervals a potentially large number of samples has been collected.
These may be affected by noise in the measurements, and outliers. Thus, to aggregate these
we suggest to use a trimmed mean at the TMP (Trimmed Mean Percentage - default to 95%) percentile, thus providing the following numbers:
TM(tcp_f), TM(tls_f), TM(http_f), TM(http_l).</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 explain what the meaning of
working conditions is and the definition of responsiveness, we can design the
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 a ID (Interval duration - default to 1 second) interval. This will ensure that we quickly reach capacity and full
buffer occupancy. First, the algorithm reaches stability for the goodput. Once
goodput stability has been achieved, responsiveness probes are being transmitted
until responsiveness stability is reached.</t>

<t>We consider both, goodput and responsiveness to be stable, when the standard deviation
of the past MAD intervals is within SDT (Standard Deviation Tolerance - default to 5%) of the last of the moving averages.</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>i: The index of the current interval. The variable i is initialized to 0 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 p and the three immediately preceding intervals, divided by four times the interval duration.</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 i as current_average.</t>
          <t>If the standard deviation of the past MAD average goodput values is less than SDT of the current_average, declare saturation and move on to probe responsiveness.</t>
        </list></t>
      <t>If goodput has saturated:
      <list style="symbols">
          <t>Compute the responsiveness at interval i as current_responsiveness.</t>
          <t>If the standard deviation of the past MAD responsiveness values is less than SDT of the current_responsiveness, declare saturation and report current_responsiveness.</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 paramenters 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="draft-ietf-tcpm-rfc793bis"/>.
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>TBD</t>

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

<t>IANA has been requested to record the service type
“_nq._tcp” (Network Quality)
for advertising and discovery of Responsiveness Test Server instances.</t>

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

<t>Special thanks go to Jeroen Schickendantz for his tireless
enthousiasm 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 Matthis 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="draft-ietf-tcpm-rfc793bis" >
  <front>
    <title>Transmission Control Protocol (TCP) Specification</title>
    <author initials="W." surname="Eddy">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
  <seriesInfo name="Internet Engineering Task Force" 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'><organization/></author>
<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'><organization/></author>
<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='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'><organization/></author>
<author fullname='L. Eggert' initials='L.' surname='Eggert'><organization/></author>
<author fullname='J. Touch' initials='J.' surname='Touch'><organization/></author>
<author fullname='M. Westerlund' initials='M.' surname='Westerlund'><organization/></author>
<author fullname='S. Cheshire' initials='S.' surname='Cheshire'><organization/></author>
<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'><organization/></author>
<author fullname='M. Krochmal' initials='M.' surname='Krochmal'><organization/></author>
<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'><organization/></author>
<author fullname='M. Krochmal' initials='M.' surname='Krochmal'><organization/></author>
<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'><organization/></author>
<date month='May' year='2019'/>
<abstract><t>This memo defines a path prefix for &quot;well-known locations&quot;, &quot;/.well-known/&quot;, 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'><organization/></author>
<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'><organization/></author>
<author fullname='P. McKenney' initials='P.' surname='McKenney'><organization/></author>
<author fullname='D. Taht' initials='D.' surname='Taht'><organization/></author>
<author fullname='J. Gettys' initials='J.' surname='Gettys'><organization/></author>
<author fullname='E. Dumazet' initials='E.' surname='Dumazet'><organization/></author>
<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'><organization/></author>
<author fullname='P. Natarajan' initials='P.' surname='Natarajan'><organization/></author>
<author fullname='F. Baker' initials='F.' surname='Baker'><organization/></author>
<author fullname='G. White' initials='G.' surname='White'><organization/></author>
<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 &quot;PIE&quot; (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'><organization/></author>
<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='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'><organization/></author>
<author fullname='K. De Schepper' initials='K.' surname='De Schepper'><organization/></author>
<author fullname='M. Bagnulo' initials='M.' surname='Bagnulo'><organization/></author>
<author fullname='G. White' initials='G.' surname='White'><organization/></author>
<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:
H4sIAI6zD2QAA9V9e5Mbx5Hn//Up+uDb0IwPAGf4sjgbCu+IpCSu+RhzRlZc
3F5oG+gaoE2gG+rqHhCWtaGvcRHeL6dPcvnLzHp0AxjRdxsXe96HhwC6uior
K/OXz5pMJqYt25W9yN5bt6krV97ZyjqXdVVhm+y7uvlQVovseV0VZVvS9yaf
zRp79+m/L+p5la/pBUWT37aT0ra3k3KzWU+a3gCTs4emyFt7Yeb0/xd1s7vI
XFsY47rZunSOxrrZbWiYVy9vvjLzuqDXXGQdDfa5KTfNRdY2nWsfnp09o4Hy
xuYX2U2TV/SKpjVbmtaiqbsNPX6VXdnmtm7WeTW32Rubu66xa1u15oPd0Q8L
+k3V2qay7eQFpkxTaPOq+D5f1RW9f2ed2ZQX2f9o6/k4czR8Y28d/bVb44//
aUzetcu6uTBZNqH/y7KychfZ82l2leduvuSPhCLPl03p2nqzTL+qG1rX5Waz
sjSP+ZQ/c/QO215k7yqrX13lzYfsu3zHX8/Llqj1vNvYpi2repw9z1clLbEq
8+zZk7Pzx/KruqtakPXbqmxtkV23RGiX1bfZ5do25TznX9l1Xq4usvmGZ/RP
Od42nddr01/O+ymRbmebZDXviUj5apV8/p9jKU2zPrqM6yltgnXLsrHJSq7b
Lm/a/jf/OdYy1ykdXdB30+ybfEtn0CXr+a6kbUk/5sXQ++5s42iSeNnzspqX
VZW3Zfq+JT+0Xf5TN8cH024+tUVnTFnxCWppBPD5l93trW1mqzpvL/jxeATo
PxOZ2j9Ps69t2+5c79M/TLO35XxZr+RjFUajdMTsBagqnzh6KmuXNpzRkewE
Uco6zIoIXq/XXUWEY/mDteH3l8/fjLM/1atubbMnT8bZ2249I4F1np08PDt/
eEqjJPKpnUM+3c5/9+zRrHTHl0TUflkUu97MWeqoxIIcbJt6lV01NYkL+uPk
5vnVaXa9sfPyVqe4vwK/tuxltSgrS9+QSL3J3Yfsq7qZgx/ff/X8jCZ3IX+e
nz16rH8+ffToif/zd08fxj/9bz9/eu5/8Pnvnj71fz58dub/PHsUfvvwyTP9
89mjR/QDM5lMsnxGfJ/PSS7SbDISozuSiXlDIjDPVvn8Ayjel+3j7C5vyrpz
q102JxFhC7PKF2P6dWur+W5M/JjN4oaPie1cNrO2onHm9aIq/0JP0Ed5RWqG
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
+tVJ/cmew/1T38ZxHcjsGFQSk2H/8V9ZqI8SpS0a5CJDEy4y7O9nGr6MMOdX
ceGl42iLt6RE4YbNHnTVK+rqsxYxpCDNbXAVx/fH9cK7ya6CACj68Mzn4bB+
5axtb49Ed2K4zoIEn8LwgDKChRk6dfItKMGWyodwMHSk5Ew3f4Y/Dfz11EjA
5T7Hc9CTISiGLV9O8JuDR1cVz+XVq4NZZ4PbcrGIlmxpTULvUFOgLsrgGw5d
Di/Mq6sxyDmWBtGCQDghPXhXcL1DGGbMlwBWbLPEzF7UcP3y89/8sLgQJOZE
jM1aMnUlhLDz5Pz2/WsVE4yCgT5RQIP9vfr2xlMnVoWafXcl7JVatWLS8TIB
oW++vb4hfLRhO2bQD1syQ/Q5/mHSNs5Jr+C0pEeuskHmizyZviJ5UrZHDL66
jca8YfZF3n3OVTXDIZa+l4CPUUjwnFOq+dKXKmxrMqv9cYSjtdWaQ7S2W/WT
f/RmLLkBTS4w4IvU/Ek1ocFg/wAIqT4bFOVCNhy6hkqvuBFw7cMWmBwuCd7v
HmfUISLIO1902tnn5fObk/NTvx702qbpnI59ZA0N8qQVmk/aY3+TiMWQ9Cyu
ulsIhxkNZCTZ71Bru/2JhaZN7y0aCzfZ82+/fPX8VIyObenUY8DHGAnorSV8
f/3Nu29fvwBbBOY+2E+s11qI/vf9y+fv3rx5+fbFyxcIQgQl6HYV/VfaYiSg
LKPe6nsuEkCDEtwguyrC4+F2Idku2sYXsOn2qDDZb+7n6fEnu8hJA311eX0z
zr788v2p0VW/fXfzqSsPcpvtfb76TjQjh/Z/5ZKF4Z0GuOTskxfhrOVrIVGR
5NORTXITYO++7Vko79cYlB7yUlpcWm6LAicbX2mlKVhlv5sd28y+Z3rS+HBQ
ywFCSNEnaqBXip5va59buneRAzJMnb8hGpSC1nV6dZZsuqTkptfUlf5+dy3g
0Ar8fIEioblRomjRkrSoiPek1Jm/dDAUNaOIKAYJe7fXwQXlYwihtOG2/CiW
LwD2aud9cbilqk/7f+TkAlEgLJP4IhWPYLkNjdz3mHTu8yMNtX6NVGdcCqE3
ueG2oUVVS+ceJEus84KXhxBeS6rKX5q+d8ufOjL8yMlJ3fkaNr1my/fsi960
0LYy3gdqgocWDJlzSSK67IXXx66mcgnwfFmXc5VqcqGY9kUIqpE1kebJDE+U
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

-->

</rfc>

