<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.13 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-ippm-responsiveness-01" category="exp" submissionType="IETF">

  <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="O." surname="Shapira" fullname="Omer Shapira">
      <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>oesh@apple.com</email>
      </address>
    </author>
    <author initials="M." surname="Mathis" fullname="Matt Mathis">
      <organization>Google, Inc</organization>
      <address>
        <postal>
          <street>1600 Amphitheatre Parkway</street>
          <city>Mountain View, CA  94043</city>
          <country>United States of America</country>
        </postal>
        <email>mattmathis@google.com</email>
      </address>
    </author>

    <date year="2022" month="July" day="11"/>

    <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 (fq_codel, cake, PIE)
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 its solutions.
We believe that creating a tool whose measurement matches people’s
everyday experience will create the necessary awareness,
and result in a demand for products that solve the problem.</t>

<t>This document specifies the “RPM 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" title="Introduction">

<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"/> or PIE <xref target="RFC8033"/> 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>Existing network measurement tools could incorporate a
responsiveness measurement into their set of metrics.
Doing so would also raise the awareness of the problem and
would help establish a new expectation
that the standard measures of network quality should
– in addition to throughput and idle latency –
also include latency under load, or, as we prefer to call it,
responsiveness under working conditions.</t>

<section anchor="terminology" title="Terminology">

<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,
since 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 create 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 metric.
The advantage of round-trips per minute are two-fold: First, it allows for a metric
that is “the higher the better”. This kind of metric 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 measurement to “RPM”, a wink to the
“revolutions per minute” that we use for car engines.</t>

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

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

<t>There are many challenges around measurements on the Internet.
They include the dynamic nature of the Internet,
the diverse nature of the traffic,
the large number of devices that affect traffic,
and the difficulty of attaining appropriate measurement conditions.</t>

<t>Internet paths are changing all the time.
Daily fluctuations in the demand make the bottlenecks ebb and flow.
To minimize the variability of routing changes,
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 on the Internet 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’s congestion control that might
reduce the traffic’s rate and thus its buffering in the network.</t>

<t>Traditionally, one thinks of bufferbloat happening on the
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 “traditional” 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 communicating devices,
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 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 to make it no longer
the lowest-capacity hop, 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 other 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 RPM Test mimics normal network operations and data transfers,
to cause this bottleneck buffer to fill to capacity, and then
measures the resulting end-to-end latency under these operating conditions.
A well managed bottleneck queue keeps its queue occupancy
under control, resulting in consistently low round-trip time
and consistently good responsiveness.
A poorly managed bottleneck queue will not.</t>

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

<t>The algorithm described here defines an RPM Test that serves as a good
proxy for user experience. This means:</t>

<t><list style="numbers">
  <t>Today’s Internet traffic primarily uses HTTP/2 over TLS.
Thus, the 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>The Internet is marked by the deployment of countless middleboxes like
transparent TCP proxies or traffic prioritization for certain types of traffic.
The RPM Test must take into account their effect on
TCP-handshake <xref target="RFC0793"/>, TLS-handshake, and request/response.</t>
  <t>The test result should be expressed in an intuitive, nontechnical form.</t>
  <t>Finally, to be useful to a wide audience, the measurement
should finish within a short time frame.
Our target is 20 seconds.</t>
</list></t>

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

<t>To make an accurate measurement,
the algorithm must reliably put the network in a state
that represents those “working conditions”.
During this process, the algorithm measures the responsiveness of the network.
The following explains how
the former and the latter are achieved.</t>

<section anchor="working-conditions" title="Working Conditions">

<t>There are many different ways to define the state of “working conditions” to
measure responsiveness. 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>In this document we aim to generate a realistic traffic pattern by
using standard HTTP transactions but exploring the worst-case scenario by creating
multiple of these transactions and using very large data objects in these HTTP
transactions.</t>

<t>This allows to create a stable state of working conditions during which the
network is used at its nearly full capacity, 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="from-single-flow-to-multi-flow" title="From single-flow to multi-flow">

<t>A single TCP connection may not be sufficient
to reach the capacity of a path quickly.
Using a 4MB receive window, over a network with a 32 ms round-trip time,
a single TCP connection can achieve up to 1Gb/s throughput.
For higher throughput and/or networks with higher round-trip time,
TCP allows larger receive window sizes, up to 1 GB.
For most applications there is little reason to open multiple
parallel TCP connections in an attempt to achieve higher throughput.</t>

<t>However, it may take some time for a single TCP connection to ramp
up to full speed, and one of the goals of the RPM test is to quickly
load the network to capacity, take its measurements, and then finish.
Additionally, 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 RPM Test is not to productively move data
across the network in a useful way, the way a normal application does.
The purpose of the RPM 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, and then end the test.
Because of this, using multiple simultaneous parallel connections
allows the RPM 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>

</section>
<section anchor="parallel-vs-sequential-uplink-and-downlink" title="Parallel vs Sequential Uplink and Downlink">

<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 the 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 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="reaching-full-link-utilization" title="Reaching full link utilization">

<t>The RPM Test gradually increases the number of TCP connections
and measures “goodput” – the sum of actual data transferred
across all connections in a unit of time.
When the goodput stops increasing, it means that the network is used at its full capacity.
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 and – more importantly –
the working condition is stable.</t>

</section>
<section anchor="final-working-conditions-algorithm" title="Final “Working Conditions” Algorithm">

<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>instantaneous aggregate goodput at interval p: The number of total bytes of data transferred within
interval p, divided by the interval duration.
If p is negative (i.e., a time interval logically prior to the start of the test beginning,
used in moving average calculations),
the number of total bytes of data transferred within that
interval is considered to be 0.</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>
  <t>moving average stability during the period between intervals b and e:
Whether or not, for all b≤x&lt;e, the absolute difference is less than 5% between
the moving average aggregate goodput at interval x and
the moving average aggregate goodput at interval x+1.
If all absolute differences are below 5% then the moving average has achieved stability.
If any of the absolute differences are 5% or more then the moving average has not achieved stability.</t>
</list></t>

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

<t><list style="symbols">
  <t>Create four load-generating connections.</t>
  <t>At each interval:
  <list style="symbols">
      <t>Compute the instantaneous aggregate goodput at interval i.</t>
      <t>Compute the moving average aggregate goodput at interval i.</t>
      <t>If the moving average aggregate goodput at interval i is more than a 5% increase over
the moving average aggregate goodput at interval i - 1, the network has not yet reached full link utilization.
      <list style="symbols">
          <t>If no load-generating connections have been added within the last four intervals, add four more load-generating connections.</t>
        </list></t>
      <t>Else, the network has reached full link utilization with the existing load-generating connections. The current state is a candidate for stable working conditions.
      <list style="symbols">
          <t>If a) there have been load-generating connections added in the past four intervals and b) there has been moving average stability during the period between intervals i-4 and i,
then the network has reached full link utilization and the algorithm terminates.</t>
          <t>Otherwise, add four more load-generating connections.</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 full link utilization 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>

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

<t>Measuring responsiveness during the previously explained working conditions creation
is a continuous process during the duration of the test. 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 for a small
object. The probe requests are being sent in two ways:</t>

<t><list style="numbers">
  <t>A HTTP GET request on a separate connection.
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.
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>The former will provide 3 set of data-points. First, the duration of the TCP-handshake
(noted hereafter as tcp_foreign).
Second, the TLS round-trip-time (noted tls_foreign). 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 latency between issuing the GET
request for a 1-byte object until the entire response has been received (noted http_foreign).</t>

<t>The latter will provide a single data-point between the time the HTTP GET request
for the 1-byte object is issued on the load-generating connection until the
full HTTP response has been received (noted http_self).</t>

<t>It is important to issue multiple of these probes. To have a large dataset, the
methodology requires a client to issue these probes every 100 milli-seconds.
For the probes on the load-generating connections, the client needs to use one of the
initial load-generating connections.
This means that every 100ms, 2 probes are being evaluated. The total amount of data
used for these probes would be no more than about 50KB worth of data within one second.</t>

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

<t>The algorithm produces sets of 4 times for each probe, namely:
tcp_foreign, tls_foreign, http_foreign, http_self (fromm the previous section). Each of these sets
will have a large number of sample. To aggregate the methodology proposes the following:</t>

<t>Among each set, we take the 90th percentile, thus resulting in 4 individual numbers.
To aggregate these individual numbers into a single responsiveness number, we suggest the following weighted mean:</t>

<figure><artwork><![CDATA[
Responsiveness = 60000 / ((1/3*tcp_foreign + 1/3*tls_foreign + 1/3*http_foreign + http_self)/2)
]]></artwork></figure>

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

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

<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" title="Elements influencing responsiveness">

<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" title="Client side influence">

<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" title="Network influence">

<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" title="Server side influence">

<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" title="Root-causing Responsiveness">

<t>Once an RPM 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="rpm-test-server-api" title="RPM Test Server API">

<t>The RPM 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.
Both client and server SHOULD use loss-based congestion controls
like Cubic.
The server MUST use a packet scheduling algorithm that minimizes internal queueing
to avoid affecting the client’s measurement.</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 configuration URL that returns a JSON <xref target="RFC8259"/> object with the information
the client uses to run the test (sample below). The server SHOULD specify the
content-type as application/json.
Sample JSON:</t>
</list></t>

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

<t>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>The client begins the responsiveness measurement by querying for the JSON 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="rpm-test-server-discovery" title="RPM Test Server Discovery">

<t>It makes sense to host RPM Test Server instances in Internet
Data Centers where they can be accessed easily by users
wishing to test the quality of their Internet connection.
However, when a user performs an RPM test and determines
that they are suffering from poor RPM during download,
the logical next question might be,
“What’s causing my poor performance?
Is it poor buffer management by my ISP?
Is it poor buffer management in my home Wi-Fi Access point?
Something else?”</t>

<t>To help an end user answer this question, it will be useful for home gateway
equipment to host RPM Test Server instances.
In an example configuration, a user may have cable modem
service offering 100 Mb/s download speed, connected via
gigabit Ethernet to one or more Wi-Fi access points in the 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 an RPM 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>

<t>To aid in discoverability of these facilities,
local RPM Test Server instances SHOULD advertise the availability
of service type <xref target="RFC6335"/> “_nq._tcp” (Network Quality),
via DNS-Based Service Discovery <xref target="RFC6763"/>,
using Multicast DNS on its local link(s) <xref target="RFC6762"/>.
Where applicable, an RPM Test Server instance SHOULD also advertise
the availability of its service via unicast discovery,
for discovery by client devices not directly attached to the same link.
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.
Similarly, a “cloud” service, providing Internet hosting service for
“example.com” could choose to include the relevant DNS-SD records
within the “example.com” domain <xref target="RFC6763"/> to communicate
to clients the list of available RPM Test Server instances.</t>

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

<t>TBD</t>

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

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

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

<t>We would like to thank Rich Brown for his editorial pass over this I-D.
We also thank Erik Auerswald and Will Hawkins 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 initials='J.' surname='Postel' fullname='J. Postel'><organization /></author>
<date year='1981' month='September' />
</front>
<seriesInfo name='STD' value='7'/>
<seriesInfo name='RFC' value='793'/>
<seriesInfo name='DOI' value='10.17487/RFC0793'/>
</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 initials='M.' surname='Cotton' fullname='M. Cotton'><organization /></author>
<author initials='L.' surname='Eggert' fullname='L. Eggert'><organization /></author>
<author initials='J.' surname='Touch' fullname='J. Touch'><organization /></author>
<author initials='M.' surname='Westerlund' fullname='M. Westerlund'><organization /></author>
<author initials='S.' surname='Cheshire' fullname='S. Cheshire'><organization /></author>
<date year='2011' month='August' />
<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 initials='S.' surname='Cheshire' fullname='S. Cheshire'><organization /></author>
<author initials='M.' surname='Krochmal' fullname='M. Krochmal'><organization /></author>
<date year='2013' month='February' />
<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 initials='S.' surname='Cheshire' fullname='S. Cheshire'><organization /></author>
<author initials='M.' surname='Krochmal' fullname='M. Krochmal'><organization /></author>
<date year='2013' month='February' />
<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="RFC8766" target='https://www.rfc-editor.org/info/rfc8766'>
<front>
<title>Discovery Proxy for Multicast DNS-Based Service Discovery</title>
<author initials='S.' surname='Cheshire' fullname='S. Cheshire'><organization /></author>
<date year='2020' month='June' />
<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 initials='T.' surname='Hoeiland-Joergensen' fullname='T. Hoeiland-Joergensen'><organization /></author>
<author initials='P.' surname='McKenney' fullname='P. McKenney'><organization /></author>
<author initials='D.' surname='Taht' fullname='D. Taht'><organization /></author>
<author initials='J.' surname='Gettys' fullname='J. Gettys'><organization /></author>
<author initials='E.' surname='Dumazet' fullname='E. Dumazet'><organization /></author>
<date year='2018' month='January' />
<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 initials='R.' surname='Pan' fullname='R. Pan'><organization /></author>
<author initials='P.' surname='Natarajan' fullname='P. Natarajan'><organization /></author>
<author initials='F.' surname='Baker' fullname='F. Baker'><organization /></author>
<author initials='G.' surname='White' fullname='G. White'><organization /></author>
<date year='2017' month='February' />
<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 initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2017' month='December' />
<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="RFC8446" target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2018' month='August' />
<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='8446'/>
<seriesInfo name='DOI' value='10.17487/RFC8446'/>
</reference>




    </references>


<section anchor="example-server-configuration" title="Example Server Configuration">

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

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

<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:
H4sIANaUzGIAA9V96ZIjx5Hm/3yK2JLtsGoGQFdfFLtkMqn6INUjdrPEKk7/
mFlrC2QGgFQlMsE8Cg3RKNNrjJn25fQk65+7x5EAqpuc0a5pZXs0UZlxuHu4
f36E53Q6zfqyr9yF+dZ1m6buyjtXu64zQ1241rxr2tuyXpoXTV2UfUl/z+x8
3rq7n/580eS1XdMERWsX/bR0/WJabjbraTsaYHr+MCts7y6ynP7fZdPuLoz7
sMmybpivy66jsW52Gxrm9aubL7O8KWiaCzPQYF9k5aa9MH07dP2j8/Nn548y
2zp7YW5aW9MUbZ9taVnLthk29PqVuXLtomnXts6deeNsN7Ru7eo+u3U7erCg
Z+retbXrpy+xZFpCb+viva2amubfuS7blBfm3/smn5iOhm/doqN/7db4x//K
Mjv0q6a9yIyZ0v81pqy7C/NiZq6s7fIV/yQUebFqy65vNqv0T01L+7rcbCpH
68hn/FtHc7j+wnxTO/3TlW1vzTu74z/nZU/UejFsXNuXdTMxL2xV0hbr0ppn
T88fPpGnmqHuQdbv6rJ3hbnuidCdaRbmcu3aMrf8lFvbsrow+YZX9FuL2WZ5
s87G2/l2RqTbuTbZzbdEJFtVye//GFtp2/W927ieERNctypbl+zkuh9s24//
8o+xl1yXdO+GvpmZ65XdlK1N9vMNDTT6+R9jMw3t5d6NvCEBs/2q7JJ90A99
+itv46umWVZugo2M9vHw8/NzmnWzKvuVs/Qj72c72s4bLNeWtfm30m1pS5fG
PHty/uTxz9/Lmpa25pX9dskLki2VNWuanpQc9MHzYbFw7bxqbH/Bb0dVQf+b
ys7/dWa+cn2/60a//n5m3pb5qqnkZ1XaJ+mI5iUYJr909JahjQdddiLEoYW7
DqsiXjbr9VDTPlhPY194/vLFm4n5t6Ya1s48fToxb4f1nKTnoTl9dP7w0RmN
kujxPoceX+S/fPZ4Xnb3b+ndzLwqit1o5aydVbPDXvRtU5mrtiG1Sv84vXlx
dWauNy4vF7rEwx34vZlX9bKsHf2FTM+N7W7Nl02b49x+++WLc1rchfzz88eP
n/p//vLzR/Gf/oEvfvn55/6fj56d+3+ePw4PPHr6zP/zyRN6NptOp8bOSehs
TpaC5iVRqHdkJWxLRsGayua3oO3Y2k3MnW3LZuiqnclJaboiq+xyQk/3rs53
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

-->

</rfc>

