<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- This template is for creating an Internet Draft using xml2rfc,
    which is available here: http://xml.resource.org. -->
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
    please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
    (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
    (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="exp" docName="draft-ietf-tsvwg-ecn-l4s-id-20" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <!-- category values: std, bcp, info, exp, and historic
    ipr values: trust200902, noModificationTrust200902, noDerivativesTrust200902,
       or pre5378Trust200902
    you can add the attributes updates="NNNN" and obsoletes="NNNN" 
    they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
       full title is longer than 39 characters -->

    <title abbrev="L4S ECN Protocol for V Low Queuing Delay">Explicit
    Congestion Notification (ECN) Protocol for Very Low Queuing Delay
    (L4S)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-tsvwg-ecn-l4s-id-20"/>
    <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
      <organization>Nokia Bell Labs</organization>
      <address>
        <postal>
          <street/>
          <city>Antwerp</city>
          <country>Belgium</country>
        </postal>
        <email>koen.de_schepper@nokia.com</email>
        <uri>https://www.bell-labs.com/usr/koen.de_schepper</uri>
      </address>
    </author>
    <author fullname="Bob Briscoe" initials="B." role="editor" surname="Briscoe">
      <organization>Independent</organization>
      <address>
        <postal>
          <street/>
          <country>UK</country>
        </postal>
        <email>ietf@bobbriscoe.net</email>
        <uri>http://bobbriscoe.net/</uri>
      </address>
    </author>
    <!--
    <author fullname="Olga Bondarenko" initials="O." surname="Bondarenko">
      <organization>Simula Research Lab</organization>

      <address>
        <postal>
          <street/>

          <city>Lysaker</city>

          <country>Norway</country>
        </postal>

        <email>olgabnd@gmail.com</email>

        <uri>https://www.simula.no/people/olgabo</uri>
      </address>
    </author>
-->

    <!--
    <author fullname="Ing-jyh Tsang" initials="I." surname="Tsang">
      <organization>Nokia Bell Labs</organization>

      <address>
        <postal>
          <street/>

          <city>Antwerp</city>

          <country>Belgium</country>
        </postal>

        <email>ing-jyh.tsang@nokia.com</email>
      </address>
    </author>
-->

    <date year=""/>
    <area>Transport</area>
    <workgroup>Transport Services (tsv)</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>I-D</keyword>
    <abstract>
      <t>This specification defines the protocol to be used for a new network
      service called low latency, low loss and scalable throughput (L4S). L4S
      uses an Explicit Congestion Notification (ECN) scheme at the IP layer
      that is similar to the original (or 'Classic') ECN approach, except as
      specified within. L4S uses 'scalable' congestion control, which induces
      much more frequent control signals from the network and it responds to
      them with much more fine-grained adjustments, so that very low
      (typically sub-millisecond on average) and consistently low queuing
      delay becomes possible for L4S traffic without compromising link
      utilization. Thus even capacity-seeking (TCP-like) traffic can have high
      bandwidth and very low delay at the same time, even during periods of
      high traffic load.</t>
      <t>The L4S identifier defined in this document distinguishes L4S from
      'Classic' (e.g. TCP-Reno-friendly) traffic. It gives an incremental
      migration path so that suitably modified network bottlenecks can
      distinguish and isolate existing traffic that still follows the Classic
      behaviour, to prevent it degrading the low queuing delay and low loss of
      L4S traffic. This specification defines the rules that L4S transports
      and network elements need to follow with the intention that L4S flows
      neither harm each other's performance nor that of Classic traffic.
      Examples of new active queue management (AQM) marking algorithms and
      examples of new transports (whether TCP-like or real-time) are specified
      separately.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="l4sid_intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This specification defines the protocol to be used for a new network
      service called low latency, low loss and scalable throughput (L4S). L4S
      uses an Explicit Congestion Notification (ECN) scheme at the IP layer
      that is similar to the original (or 'Classic') Explicit Congestion
      Notification (ECN <xref target="RFC3168" format="default"/>). RFC 3168 required an ECN
      mark to be equivalent to a drop, both when applied in the network and
      when responded to by a transport. Unlike Classic ECN marking, the
      network applies L4S marking more immediately and more aggressively than
      drop, and the transport response to each mark is reduced and smoothed
      relative to that for drop. The two changes counterbalance each other so
      that the throughput of an L4S flow will be roughly the same as a
      comparable non-L4S flow under the same conditions. Nonetheless, the much
      more frequent control signals and the finer responses to them result in
      very low queuing delay without compromising link utilization, and this
      low delay can be maintained during high load. For instance, queuing
      delay under heavy and highly varying load with the example DCTCP/DualQ
      solution cited below on a DSL or Ethernet link is sub-millisecond on
      average and roughly 1 to 2 milliseconds at the 99th percentile without
      losing link utilization <xref target="DualPI2Linux" format="default"/>, <xref target="DCttH15" format="default"/>. Note that the inherent queuing delay while waiting
      to acquire a discontinuous medium such as WiFi has to be minimized in
      its own right, so it would be additional to the above (see section 6.3
      of <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/>).</t>
      <t>L4S relies on 'scalable' congestion controls for these delay
      properties and for preserving low delay as flow rate scales, hence the
      name. The congestion control used in Data Center TCP (DCTCP) is an
      example of a scalable congestion control, but DCTCP is applicable solely
      to controlled environments like data centres <xref target="RFC8257" format="default"/>,
      because it is too aggressive to co-exist with existing TCP-Reno-friendly
      traffic. The DualQ Coupled AQM, which is defined in a complementary
      experimental specification <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/>, is an AQM framework that
      enables scalable congestion controls derived from DCTCP to co-exist with
      existing traffic, each getting roughly the same flow rate when they
      compete under similar conditions. Note that a scalable congestion
      control is still not safe to deploy on the Internet unless it satisfies
      the requirements listed in <xref target="l4sid_transport_req" format="default"/>.</t>
      <t>L4S is not only for elastic (TCP-like) traffic - there are scalable
      congestion controls for real-time media, such as the L4S variant of the
      SCReAM <xref target="RFC8298" format="default"/> real-time media congestion avoidance
      technique (RMCAT). The factor that distinguishes L4S from Classic
      traffic is its behaviour in response to congestion. The transport wire
      protocol, e.g. TCP, QUIC, SCTP, DCCP, RTP/RTCP, is orthogonal (and
      therefore not suitable for distinguishing L4S from Classic packets).</t>
      <t>The L4S identifier defined in this document is the key piece that
      distinguishes L4S from 'Classic' (e.g. Reno-friendly) traffic. It
      gives an incremental migration path so that suitably modified network
      bottlenecks can distinguish and isolate existing Classic traffic from
      L4S traffic to prevent the former from degrading the very low delay and
      loss of the new scalable transports, without harming Classic performance
      at these bottlenecks. Initial implementation of the separate parts of
      the system has been motivated by the performance benefits.</t>
      <section anchor="l4sid_problem" numbered="true" toc="default">
        <name>Latency, Loss and Scaling Problems</name>
        <t>Latency is becoming the critical performance factor for many
        (most?) applications on the public Internet, e.g. interactive
        Web, Web services, voice, conversational video, interactive video,
        interactive remote presence, instant messaging, online gaming, remote
        desktop, cloud-based applications, and video-assisted remote control
        of machinery and industrial processes. In the 'developed' world,
        further increases in access network bit-rate offer diminishing
        returns, whereas latency is still a multi-faceted problem. In the last
        decade or so, much has been done to reduce propagation time by placing
        caches or servers closer to users. However, queuing remains a major
        intermittent component of latency.</t>
        <t>The Diffserv architecture provides Expedited Forwarding <xref target="RFC3246" format="default"/>, so that low latency traffic can jump the queue of
        other traffic. If growth in high-throughput latency-sensitive
        applications continues, periods with solely latency-sensitive traffic
        will become increasingly common on links where traffic aggregation is
        low. For instance, on the access links dedicated to individual sites
        (homes, small enterprises or mobile devices). These links also tend to
        become the path bottleneck under load. During these periods, if all
        the traffic were marked for the same treatment at these bottlenecks,
        Diffserv would make no difference. Instead, it becomes imperative to
        remove the underlying causes of any unnecessary delay.</t>
        <t>The bufferbloat project has shown that excessively-large buffering
        ('bufferbloat') has been introducing significantly more delay than the
        underlying propagation time. These delays appear only
        intermittently--only when a capacity-seeking (e.g. TCP) flow
        is long enough for the queue to fill the buffer, making every packet
        in other flows sharing the buffer sit through the queue.</t>
        <t>Active queue management (AQM) was originally developed to solve
        this problem (and others). Unlike Diffserv, which gives low latency to
        some traffic at the expense of others, AQM controls latency for <em>all</em> traffic in a class. In general, AQM methods
        introduce an increasing level of discard from the buffer the longer
        the queue persists above a shallow threshold. This gives sufficient
        signals to capacity-seeking (aka. greedy) flows to keep the
        buffer empty for its intended purpose: absorbing bursts. However,
        RED <xref target="RFC2309" format="default"/> and other algorithms from the 1990s
        were sensitive to their configuration and hard to set correctly. So,
        this form of AQM was not widely deployed.</t>
        <t>More recent state-of-the-art AQM methods,
        e.g. FQ-CoDel <xref target="RFC8290" format="default"/>, PIE <xref target="RFC8033" format="default"/>, Adaptive RED <xref target="ARED01" format="default"/>, are
        easier to configure, because they define the queuing threshold in time
        not bytes, so it is invariant for different link rates. However, no
        matter how good the AQM, the sawtoothing sending window of a Classic
        congestion control will either cause queuing delay to vary or cause
        the link to be under-utilized. Even with a perfectly tuned AQM, the
        additional queuing delay will be of the same order as the underlying
        speed-of-light delay across the network.</t>
        <t>If a sender's own behaviour is introducing queuing delay variation,
        no AQM in the network can 'un-vary' the delay without significantly
        compromising link utilization. Even flow-queuing (e.g. <xref target="RFC8290" format="default"/>), which isolates one flow from another, cannot
        isolate a flow from the delay variations it inflicts on itself.
        Therefore those applications that need to seek out high bandwidth but
        also need low latency will have to migrate to scalable congestion
        control.</t>
        <t>Altering host behaviour is not enough on its own though. Even if
        hosts adopt low latency behaviour (scalable congestion controls), they
        need to be isolated from the behaviour of existing Classic congestion
        controls that induce large queue variations. L4S enables that
        migration by providing latency isolation in the network and
        distinguishing the two types of packets that need to be isolated: L4S
        and Classic. L4S isolation can be achieved with a queue per flow
        (e.g. <xref target="RFC8290" format="default"/>) but a DualQ <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/> is sufficient, and
        actually gives better tail latency. Both approaches are addressed in
        this document.</t>
        <t>The DualQ solution was developed to make very low latency available
        without requiring per-flow queues at every bottleneck. This was
        because FQ has well-known downsides - not least the need to inspect
        transport layer headers in the network, which makes it incompatible
        with privacy approaches such as IPSec VPN tunnels, and incompatible
        with link layer queue management, where transport layer headers can be
        hidden, e.g. 5G.</t>
        <t>Latency is not the only concern addressed by L4S: It was known when
        TCP congestion avoidance was first developed that it would not scale
        to high bandwidth-delay products (footnote 6 of Jacobson and Karels
        <xref target="TCP-CA" format="default"/>). Given regular broadband bit-rates over WAN
        distances are already <xref target="RFC3649" format="default"/> beyond the scaling
        range of Reno congestion control, 'less unscalable' Cubic <xref target="RFC8312" format="default"/> and Compound <xref target="I-D.sridharan-tcpm-ctcp" format="default"/> variants of TCP have been
        successfully deployed. However, these are now approaching their
        scaling limits. Unfortunately, fully scalable congestion controls such
        as DCTCP <xref target="RFC8257" format="default"/> outcompete Classic ECN congestion
        controls sharing the same queue, which is why they have been confined
        to private data centres or research testbeds.</t>
        <t>It turns out that these scalable congestion control algorithms that
        solve the latency problem can also solve the scalability problem of
        Classic congestion controls. The finer sawteeth in the congestion
        window have low amplitude, so they cause very little queuing delay
        variation and the average time to recover from one congestion signal
        to the next (the average duration of each sawtooth) remains invariant,
        which maintains constant tight control as flow-rate scales. A
        background paper <xref target="DCttH15" format="default"/> gives the full explanation
        of why the design solves both the latency and the scaling problems,
        both in plain English and in more precise mathematical form. The
        explanation is summarised without the maths in the L4S architecture
        document <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/>.</t>
      </section>
      <section anchor="l4sid_Terminology" numbered="true" toc="default">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
        "OPTIONAL" in this document are to be interpreted as described in
        <xref target="RFC2119" format="default"/>. In this document, these words will appear
        with that interpretation only when in ALL CAPS. Lower case uses of
        these words are not to be interpreted as carrying RFC-2119
        significance.</t>
        <dl newline="false" spacing="normal">
          <dt>Classic Congestion Control:</dt>
          <dd>A congestion control
            behaviour that can co-exist with standard Reno <xref target="RFC5681" format="default"/> without causing significantly negative impact
            on its flow rate <xref target="RFC5033" format="default"/>. With Classic congestion
            controls, such as Reno or Cubic, because flow rate has scaled
            since TCP congestion control was first designed in 1988, it now
            takes hundreds of round trips (and growing) to recover after a
            congestion signal (whether a loss or an ECN mark) as shown in the
            examples in section 5.1 of <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/> and in <xref target="RFC3649" format="default"/>. Therefore control of queuing and utilization
            becomes very slack, and the slightest disturbances (e.g. from
            new flows starting) prevent a high rate from being attained.</dd>
          <dt>Scalable Congestion Control:</dt>
          <dd>A congestion control
            where the average time from one congestion signal to the next (the
            recovery time) remains invariant as the flow rate scales, all
            other factors being equal. This maintains the same degree of
            control over queueing and utilization whatever the flow rate, as
            well as ensuring that high throughput is robust to disturbances.
            For instance, DCTCP averages 2 congestion signals per round-trip
            whatever the flow rate, as do other recently developed scalable
            congestion controls, e.g. Relentless TCP <xref target="Mathis09" format="default"/>, TCP Prague <xref target="I-D.briscoe-iccrg-prague-congestion-control" format="default"/>, <xref target="PragueLinux" format="default"/>, BBRv2 <xref target="BBRv2" format="default"/> and the L4S
            variant of SCREAM for real-time media <xref target="SCReAM" format="default"/>, <xref target="RFC8298" format="default"/>). See <xref target="l4sid_congestion_response" format="default"/> for more explanation.</dd>
          <dt>Classic service:</dt>
          <dd>The Classic service is intended for
            all the congestion control behaviours that co-exist with Reno
            <xref target="RFC5681" format="default"/> (e.g. Reno itself, Cubic <xref target="RFC8312" format="default"/>, Compound <xref target="I-D.sridharan-tcpm-ctcp" format="default"/>, TFRC <xref target="RFC5348" format="default"/>). The term 'Classic queue' means a queue
            providing the Classic service.</dd>
          <dt>Low-Latency, Low-Loss Scalable throughput (L4S) service:</dt>
          <dd>
            <t>The
            'L4S' service is intended for traffic from scalable congestion
            control algorithms, such as TCP Prague <xref target="I-D.briscoe-iccrg-prague-congestion-control" format="default"/>, which was
            derived from DCTCP <xref target="RFC8257" format="default"/>. The L4S service
            is for more general traffic than just TCP Prague--it allows
            the set of congestion controls with similar scaling properties to
            Prague to evolve, such as the examples listed above (Relentless,
            SCReAM). The term 'L4S queue' means a queue providing the L4S
            service.</t>
            <t>The terms Classic or L4S can also
            qualify other nouns, such as 'queue', 'codepoint', 'identifier',
            'classification', 'packet', 'flow'. For example: an L4S packet
            means a packet with an L4S identifier sent from an L4S congestion
            control.</t>
            <t>Both Classic and L4S services can
            cope with a proportion of unresponsive or less-responsive traffic
            as well, but in the L4S case its rate has to be smooth enough or
            low enough not to build a queue (e.g. DNS, VoIP, game sync
            datagrams, etc).</t>
          </dd>
          <dt>Reno-friendly:</dt>
          <dd>The subset of Classic traffic that is
            friendly to the standard Reno congestion control defined for TCP
            in <xref target="RFC5681" format="default"/>. Reno-friendly is used in place of
            'TCP-friendly', given the latter has become imprecise, because the
            TCP protocol is now used with so many different congestion control
            behaviours, and Reno is used in non-TCP transports such as
            QUIC.</dd>
          <dt>Classic ECN:</dt>
          <dd>The original Explicit Congestion
            Notification (ECN) protocol <xref target="RFC3168" format="default"/>, which
            requires ECN signals to be treated the same as drops, both when
            generated in the network and when responded to by the sender. For
            L4S, the names used for the four codepoints of the 2-bit IP-ECN
            field are unchanged from those defined in <xref target="RFC3168" format="default"/>: Not ECT, ECT(0), ECT(1) and CE, where ECT
            stands for ECN-Capable Transport and CE stands for Congestion
            Experienced. A packet marked with the CE codepoint is termed
            'ECN-marked' or sometimes just 'marked' where the context makes
            ECN obvious.</dd>
        </dl>
      </section>
      <section numbered="true" toc="default">
        <name>Scope</name>
        <t>The new L4S identifier defined in this specification is applicable
        for IPv4 and IPv6 packets (as for Classic ECN <xref target="RFC3168" format="default"/>). It is applicable for the unicast, multicast and
        anycast forwarding modes.</t>
        <t>The L4S identifier is an orthogonal packet classification to the
        Differentiated Services Code Point (DSCP) <xref target="RFC2474" format="default"/>.
        <xref target="l4sid_other_IDs" format="default"/> explains what this means in
        practice.</t>
        <t>This document is intended for experimental status, so it does not
        update any standards track RFCs. Therefore it depends on <xref target="RFC8311" format="default"/>, which is a standards track specification
        that:</t>
        <ul spacing="normal">
          <li>updates the ECN proposed standard <xref target="RFC3168" format="default"/> to
            allow experimental track RFCs to relax the requirement that an ECN
            mark must be equivalent to a drop (when the network applies
            markings and/or when the sender responds to them). For instance,
            in the ABE experiment <xref target="RFC8511" format="default"/> this permits a
            sender to respond less to ECN marks than to drops;</li>
          <li>changes the status of the experimental ECN nonce <xref target="RFC3540" format="default"/> to historic;</li>
          <li>
            <t>makes consequent updates to the following additional proposed
            standard RFCs to reflect the above two bullets:</t>
            <ul spacing="normal">
              <li>ECN for RTP <xref target="RFC6679" format="default"/>;</li>
              <li>the congestion control specifications of various DCCP
                congestion control identifier (CCID) profiles <xref target="RFC4341" format="default"/>, <xref target="RFC4342" format="default"/>, <xref target="RFC5622" format="default"/>.</li>
            </ul>
          </li>
        </ul>
        <t>This document is about identifiers that are used for interoperation
        between hosts and networks. So the audience is broad, covering
        developers of host transports and network AQMs, as well as covering
        how operators might wish to combine various identifiers, which would
        require flexibility from equipment developers.</t>
      </section>
    </section>
    <section anchor="l4sid_reqs" numbered="true" toc="default">
      <name>Choice of L4S Packet Identifier: Requirements</name>
      <t>This subsection briefly records the process that led to the chosen
      L4S identifier.</t>
      <t>The identifier for packets using the Low Latency, Low Loss, Scalable
      throughput (L4S) service needs to meet the following requirements:</t>
      <ul spacing="normal">
        <li>it SHOULD survive end-to-end between source and destination
          end-points: across the boundary between host and network, between
          interconnected networks, and through middleboxes;</li>
        <li>it SHOULD be visible at the IP layer;</li>
        <li>it SHOULD be common to IPv4 and IPv6 and transport-agnostic;</li>
        <li>it SHOULD be incrementally deployable;</li>
        <li>it SHOULD enable an AQM to classify packets encapsulated by outer
          IP or lower-layer headers;</li>
        <li>it SHOULD consume minimal extra codepoints;</li>
        <li>it SHOULD be consistent on all the packets of a transport layer
          flow, so that some packets of a flow are not served by a different
          queue to others.</li>
      </ul>
      <t>Whether the identifier would be recoverable if the experiment failed
      is a factor that could be taken into account. However, this has not been
      made a requirement, because that would favour schemes that would be
      easier to fail, rather than those more likely to succeed.</t>
      <t>It is recognised that any choice of identifier is unlikely to satisfy
      all these requirements, particularly given the limited space left in the
      IP header. Therefore a compromise will always be necessary, which is why
      all the above requirements are expressed with the word 'SHOULD' not
      'MUST'.</t>
      <t>After extensive assessment of alternative schemes, "ECT(1) and CE
      codepoints" was chosen as the best compromise. Therefore this scheme is
      defined in detail in the following sections, while <xref target="l4sid_ECT1_CE" format="default"/> records its pros and cons against the above
      requirements.</t>
    </section>
    <section anchor="l4sid_identification" numbered="true" toc="default">
      <name>L4S Packet Identification</name>
      <t>The L4S treatment is an experimental track alternative packet marking
      treatment to the Classic ECN treatment in <xref target="RFC3168" format="default"/>,
      which has been updated by <xref target="RFC8311" format="default"/> to allow experiments
      such as the one defined in the present specification. <xref target="RFC4774" format="default"/> discusses some of the issues and evaluation criteria
      when defining alternative ECN semantics. Like Classic ECN, L4S ECN
      identifies both network and host behaviour: it identifies the marking
      treatment that network nodes are expected to apply to L4S packets, and
      it identifies packets that have been sent from hosts that are expected
      to comply with a broad type of sending behaviour.</t>
      <t>For a packet to receive L4S treatment as it is forwarded, the sender
      sets the ECN field in the IP header to the ECT(1) codepoint. See <xref target="l4sid_transport_req" format="default"/> for full transport layer behaviour
      requirements, including feedback and congestion response.</t>
      <t>A network node that implements the L4S service always classifies
      arriving ECT(1) packets for L4S treatment and by default classifies CE
      packets for L4S treatment unless the heuristics described in <xref target="l4sid_identification_transport_aware" format="default"/> are employed. See <xref target="l4sid_network_req" format="default"/> for full network element behaviour
      requirements, including classification, ECN-marking and interaction of
      the L4S identifier with other identifiers and per-hop behaviours.</t>
    </section>
    <section anchor="l4sid_transport_req" numbered="true" toc="default">
      <name>Transport Layer Behaviour (the 'Prague Requirements')</name>
      <t/>
      <section anchor="l4sid_codepoint" numbered="true" toc="default">
        <name>Codepoint Setting</name>
        <t>A sender that wishes a packet to receive L4S treatment as it is
        forwarded, MUST set the ECN field in the IP header (v4 or v6) to the
        ECT(1) codepoint.</t>
      </section>
      <section anchor="l4sid_feedback" numbered="true" toc="default">
        <name>Prerequisite Transport Feedback</name>
        <t>For a transport protocol to provide scalable congestion control
        (<xref target="l4sid_congestion_response" format="default"/>) it MUST provide feedback
        of the extent of CE marking on the forward path. When ECN was added to
        TCP <xref target="RFC3168" format="default"/>, the feedback method reported no more
        than one CE mark per round trip. Some transport protocols derived from
        TCP mimic this behaviour while others report the accurate extent of
        ECN marking. This means that some transport protocols will need to be
        updated as a prerequisite for scalable congestion control. The
        position for a few well-known transport protocols is given below.</t>
        <dl newline="false" spacing="normal">
          <dt>TCP:</dt>
          <dd>Support for the accurate ECN feedback
            requirements <xref target="RFC7560" format="default"/> (such as that provided by
            AccECN <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>) by both ends
            is a prerequisite for scalable congestion control in TCP.
            Therefore, the presence of ECT(1) in the IP headers even in one
            direction of a TCP connection will imply that both ends must be
            supporting accurate ECN feedback. However, the converse does not
            apply. So even if both ends support AccECN, either of the two ends
            can choose not to use a scalable congestion control, whatever the
            other end's choice.</dd>
          <dt>SCTP:</dt>
          <dd>A suitable ECN feedback mechanism for SCTP
            could add a chunk to report the number of received CE marks
            (e.g. <xref target="I-D.stewart-tsvwg-sctpecn" format="default"/>), and update
            the ECN feedback protocol sketched out in Appendix A of the
            standards track specification of SCTP <xref target="RFC4960" format="default"/>.</dd>
          <dt>RTP over UDP:</dt>
          <dd>A prerequisite for scalable congestion
            control is for both (all) ends of one media-level hop to signal
            ECN support <xref target="RFC6679" format="default"/> and use the new generic RTCP
            feedback format of <xref target="RFC8888" format="default"/>. The presence of
            ECT(1) implies that both (all) ends of that media-level hop
            support ECN. However, the converse does not apply. So each end of
            a media-level hop can independently choose not to use a scalable
            congestion control, even if both ends support ECN.</dd>
          <dt>QUIC:</dt>
          <dd>Support for sufficiently fine-grained ECN
            feedback is provided by the v1 IETF QUIC transport <xref target="RFC9000" format="default"/>.</dd>
          <dt>DCCP:</dt>
          <dd>The ACK vector in DCCP <xref target="RFC4340" format="default"/> is already sufficient to report the extent of
            CE marking as needed by a scalable congestion control.</dd>
        </dl>
      </section>
      <section anchor="l4sid_congestion_response" numbered="true" toc="default">
        <name>Prerequisite Congestion Response</name>
        <t>As a condition for a host to send packets with the L4S identifier
        (ECT(1)), it SHOULD implement a congestion control behaviour that
        ensures that, in steady state, the average duration between induced
        ECN marks does not increase as flow rate scales up, all other factors
        being equal. This is termed a scalable congestion control. This
        invariant duration ensures that, as flow rate scales, the average
        period with no feedback information about capacity does not become
        excessive. It also ensures that queue variations remain small, without
        having to sacrifice utilization.</t>
        <t>With a congestion control that sawtooths to probe capacity, this
        duration is called the recovery time, because each time the sawtooth
        yields, on average it take this time to recover to its previous high
        point. A scalable congestion control does not have to sawtooth, but it
        has to coexist with scalable congestion controls that do.</t>
        <t>For instance, for DCTCP <xref target="RFC8257" format="default"/>, TCP Prague <xref target="I-D.briscoe-iccrg-prague-congestion-control" format="default"/>, <xref target="PragueLinux" format="default"/> and the L4S variant of SCReAM <xref target="RFC8298" format="default"/>, the average recovery time is always half a round
        trip (or half a reference round trip), whatever the flow rate.</t>
        <t>As with all transport behaviours, a detailed specification
        (probably an experimental RFC) is expected for each congestion
        control, following the guidelines for specifying new congestion
        control algorithms in <xref target="RFC5033" format="default"/>. In addition it is
        expected to document these L4S-specific matters, specifically the
        timescale over which the proportionality is averaged, and control of
        burstiness. The recovery time requirement above is worded as a
        'SHOULD' rather than a 'MUST' to allow reasonable flexibility for such
        implementations.</t>
        <t>The condition 'all other factors being equal', allows the recovery
        time to be different for different round trip times, as long as it
        does not increase with flow rate for any particular RTT.</t>
        <t>Saying that the recovery time remains roughly invariant is
        equivalent to saying that the number of ECN CE marks per round trip
        remains invariant as flow rate scales, all other factors being equal.
        For instance, an average recovery time of half of 1 RTT is equivalent
        to 2 ECN marks per round trip. For those familiar with steady-state
        congestion response functions, it is also equivalent to say that the
        congestion window is inversely proportional to the proportion of bytes
        in packets marked with the CE codepoint (see section 2 of <xref target="PI2" format="default"/>).</t>
        <!--For example, the timescale over which this rough proportionality applies will depend on the type of application, ranging 
from per packet adjustment through smooth adjustment of encoding over perhaps tens of seconds. Low bit-rate flows might 
even respond at the timescale of self-admission control solely at the start of each flow. As with any congestion control, 
the sender SHOULD also avoid excessive bursts, but this is particularly important with the L4S service.-->

        <t>In order to coexist safely with other Internet traffic, a scalable
        congestion control MUST NOT tag its packets with the ECT(1) codepoint
        unless it complies with the following bulleted requirements:</t>
        <ul spacing="normal">
          <li>A scalable congestion control MUST be capable of being replaced
            by a Classic congestion control (by application and/or by
            administrative control). If a Classic congestion control is
            activated, it will not tag its packets with the ECT(1) codepoint
            (see <xref target="l4sid_sec_replaceable" format="default"/> for rationale).</li>
          <li>As well as responding to ECN markings, a scalable congestion
            control MUST react to packet loss in a way that will coexist
            safely with Classic congestion controls such as standard Reno
            <xref target="RFC5681" format="default"/>, as required by <xref target="RFC5033" format="default"/>
            (see <xref target="l4sid_sec_fallback_on_loss" format="default"/> for
            rationale).</li>
          <li>
            <t>In uncontrolled environments, monitoring MUST be implemented to
            support detection of problems with an ECN-capable AQM at the path
            bottleneck that appears not to support L4S and might be in a
            shared queue. Such monitoring SHOULD be applied to live traffic
            that is using Scalable congestion control. Alternatively,
            monitoring need not be applied to live traffic, if monitoring has
            been arranged to cover the paths that live traffic takes through
            uncontrolled environments.</t>
            <t>The detection
            function SHOULD be capable of making the congestion control adapt
            its ECN-marking response to coexist safely with Classic congestion
            controls such as standard Reno <xref target="RFC5681" format="default"/>, as
            required by <xref target="RFC5033" format="default"/>. Alternatively, if adaptation
            is not implemented and problems with such an AQM are detected, the
            scalable congestion control MUST be replaced by a Classic
            congestion control. </t>
            <t>Note that a scalable
            congestion control is not expected to change to setting ECT(0)
            while it transiently adapts to coexist with Classic congestion
            controls.</t>
            <t>See <xref target="l4sid_sec_fallback_on_classic_CE" format="default"/> and <xref target="I-D.ietf-tsvwg-l4sops" format="default"/> for rationale.</t>
          </li>
          <li>In the range between the minimum likely RTT and typical RTTs
            expected in the intended deployment scenario, a scalable
            congestion control MUST converge towards a rate that is as
            independent of RTT as is possible without compromising stability
            or efficiency (see <xref target="l4sid_sec_RTT_dependence" format="default"/> for
            rationale).</li>
          <li>A scalable congestion control SHOULD remain responsive to
            congestion when typical RTTs over the public Internet are
            significantly smaller because they are no longer inflated by
            queuing delay. It would be preferable for the minimum window of a
            scalable congestion control to be lower than 1 segment rather than
            use the timeout approach described for TCP in S.6.1.2 of <xref target="RFC3168" format="default"/> (or an equivalent for other transports).
            However, a lower minimum is not set as a formal requirement for
            L4S experiments (see <xref target="l4sid_sec_min_cwnd" format="default"/> for
            rationale).</li>
          <li>A scalable congestion control's loss detection SHOULD be
            resilient to reordering over an adaptive time interval that scales
            with throughput and adapts to reordering (as in <xref target="RFC8985" format="default"/>), as opposed to counting only in fixed units of
            packets (as in the 3 DupACK rule of <xref target="RFC5681" format="default"/> and
            <xref target="RFC6675" format="default"/>, which is not scalable). As data rates
            increase (e.g., due to new and/or improved technology), congestion
            controls that detect loss by counting in units of packets become
            more likely to incorrectly treat reordering events as
            congestion-caused loss events (see <xref target="l4sid_sec_reordering_tolerance" format="default"/> for further rationale).
            This requirement does not apply to congestion controls that are
            solely used in controlled environments where the network
            introduces hardly any reordering.</li>
          <li>A scalable congestion control is expected to limit the queue
            caused by bursts of packets. It would not seem necessary to set
            the limit any lower than 10% of the minimum RTT expected in a
            typical deployment (e.g. additional queuing of roughly 250 us
            for the public Internet). This would be converted to a number of
            packets under the worst-case assumption that the bottleneck link
            capacity equals the current flow rate. No normative requirement to
            limit bursts is given here and, until there is more industry
            experience from the L4S experiment, it is not even known whether
            one is needed - it seems to be in an L4S sender's self-interest to
            limit bursts.</li>
        </ul>
        <t>Each sender in a session can use a scalable congestion control
        independently of the congestion control used by the receiver(s) when
        they send data. Therefore there might be ECT(1) packets in one
        direction and ECT(0) or Not-ECT in the other.</t>
        <t>Later (<xref target="l4sid_inclusion_dualq" format="default"/>) this document
        discusses the conditions for mixing other "'Safe' Unresponsive
        Traffic" (e.g. DNS, LDAP, NTP, voice, game sync packets) with L4S
        traffic. To be clear, although such traffic can share the same queue
        as L4S traffic, it is not appropriate for the sender to tag it as
        ECT(1), except in the (unlikely) case that it satisfies the above
        conditions.</t>
      </section>
      <section numbered="true" toc="default">
        <name>Filtering or Smoothing of ECN Feedback</name>
        <t><xref target="l4sid_Semantics" format="default"/> below specifies that an L4S AQM is
        expected to signal L4S ECN without filtering or smoothing. This
        contrasts with a Classic AQM, which filters out variations in the
        queue before signalling ECN marking or drop. In the L4S architecture
        <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/>, responsibility for smoothing
        out these variations shifts to the sender's congestion control.</t>
        <t>This shift of responsibility has the advantage that each sender can
        smooth variations over a timescale proportionate to its own RTT.
        Whereas, in the Classic approach, the network doesn't know the RTTs of
        all the flows, so it has to smooth out variations for a worst-case RTT
        to ensure stability. For all the typical flows with shorter RTT than
        the worst-case, this makes congestion control unnecessarily
        sluggish.</t>
        <t>This also gives an L4S sender the choice not to smooth, depending
        on its context (start-up, congestion avoidance, etc). Therefore, this
        document places no requirement on an L4S congestion control to smooth
        out variations in any particular way. Implementers are encouraged to
        openly publish the approach they take to smoothing, and the results
        and experience they gain during the L4S experiment.</t>
      </section>
    </section>
    <section anchor="l4sid_network_req" numbered="true" toc="default">
      <name>Network Node Behaviour</name>
      <t/>
      <section numbered="true" toc="default">
        <name>Classification and Re-Marking Behaviour</name>
        <t>A network node that implements the L4S service:</t>
        <ul spacing="normal">
          <li>MUST classify arriving ECT(1) packets for L4S treatment, unless
            overridden by another classifier (e.g., see <xref target="l4sid_exclusion_dualq" format="default"/>);</li>
          <li>
            <t>MUST classify arriving CE packets for L4S treatment as well,
            unless overridden by a another classifier or unless the exception
            referred to next applies;</t>
            <t>CE packets might
            have originated as ECT(1) or ECT(0), but the above rule to
            classify them as if they originated as ECT(1) is the safe choice
            (see <xref target="l4sid_ECT1_CE" format="default"/> for rationale). The exception
            is where some flow-aware in-network mechanism happens to be
            available for distinguishing CE packets that originated as ECT(0),
            as described in <xref target="l4sid_identification_transport_aware" format="default"/>, but there is no
            implication that such a mechanism is necessary.</t>
          </li>
        </ul>
        <t>An L4S AQM treatment follows similar codepoint transition rules to
        those in RFC 3168. Specifically, the ECT(1) codepoint MUST NOT be
        changed to any other codepoint than CE, and CE MUST NOT be changed to
        any other codepoint. An ECT(1) packet is classified as ECN-capable
        and, if congestion increases, an L4S AQM algorithm will increasingly
        mark the ECN field as CE, otherwise forwarding packets unchanged as
        ECT(1). Necessary conditions for an L4S marking treatment are defined
        in <xref target="l4sid_Semantics" format="default"/>.</t>
        <t>Under persistent overload an L4S marking treatment MUST begin
        applying drop to L4S traffic until the overload episode has subsided,
        as recommended for all AQM methods in <xref target="RFC7567" format="default"/>
        (Section 4.2.1), which follows the similar advice in RFC 3168 (Section
        7). During overload, it MUST apply the same drop probability to L4S
        traffic as it would to Classic traffic.</t>
        <t>Where an L4S AQM is transport-aware, this requirement could be
        satisfied by using drop in only the most overloaded individual
        per-flow AQMs. In a DualQ with flow-aware queue protection (e.g. <xref target="I-D.briscoe-docsis-q-protection" format="default"/>), this could be achieved by
        redirecting packets in those flows contributing most to the overload
        out of the L4S queue so that they are subjected to drop in the Classic
        queue.</t>
        <!--KDS:Do we  
  want to propose this? In the paper I proposed to limit the probabilities
  to a max value, and to use delay to control overload (until tail drop).
BB: I've allowed what you do and made it sound compatible with RFC3168
-->

        <t>For backward compatibility in uncontrolled environments, a network
        node that implements the L4S treatment MUST also implement an AQM
        treatment for the Classic service as defined in <xref target="l4sid_Terminology" format="default"/>. This Classic AQM treatment need not mark
        ECT(0) packets, but if it does, see <xref target="l4sid_Semantics" format="default"/>
        for the strengths of the markings relative to drop. It MUST classify
        arriving ECT(0) and Not-ECT packets for treatment by this Classic AQM
        (for the DualQ Coupled AQM, see the extensive discussion on
        classification in Sections 2.3 and 2.5.1.1 of <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/>).</t>
        <t>In case unforeseen problems arise with the L4S experiment, it MUST
        be possible to configure an L4S implementation to disable the L4S
        treatment. Once disabled, all packets of all ECN codepoints will
        receive Classic treatment and ECT(1) packets MUST be treated as if
        they were {ToDo: Not-ECT / ECT(0) ?}.</t>
      </section>
      <section anchor="l4sid_Semantics" numbered="true" toc="default">
        <name>The Strength of L4S CE Marking Relative to Drop</name>
        <t>The relative strengths of L4S CE and drop are irrelevant where AQMs
        are implemented in separate queues per-application-flow, which are
        then explicitly scheduled (e.g. with an FQ scheduler as in <xref target="RFC8290" format="default"/>). Nonetheless, the relationship between them needs
        to be defined for the coupling between L4S and Classic congestion
        signals in a DualQ Coupled AQM <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/>, as below.</t>
        <t>Unless an AQM node schedules application flows explicitly, the
        likelihood that the AQM drops a Not-ECT Classic packet (p_C) MUST be
        roughly proportional to the square of the likelihood that it would
        have marked it if it had been an L4S packet (p_L). That is</t>
        <ul empty="true" spacing="normal">
          <li>p_C ~= (p_L / k)^2</li>
        </ul>
        <t>The constant of proportionality (k) does not have to be
        standardised for interoperability, but a value of 2 is RECOMMENDED.
        The term 'likelihood' is used above to allow for marking and dropping
        to be either probabilistic or deterministic.</t>
        <t>This formula ensures that Scalable and Classic flows will converge
        to roughly equal congestion windows, for the worst case of Reno
        congestion control. This is because the congestion windows of Scalable
        and Classic congestion controls are inversely proportional to p_L and
        sqrt(p_C) respectively. So squaring p_C in the above formula
        counterbalances the square root that characterizes Reno-friendly
        flows.</t>
        <t>Note that, contrary to RFC 3168, an AQM implementing the L4S and
        Classic treatments does not mark an ECT(1) packet under the same
        conditions that it would have dropped a Not-ECT packet, as allowed by
        <xref target="RFC8311" format="default"/>, which updates RFC 3168. However, if it marks
        ECT(0) packets, it does so under the same conditions that it would
        have dropped a Not-ECT packet <xref target="RFC3168" format="default"/>.<!--KDS: replace "a Not-ECT packet"
        by "a packet", as any drop should be classic, and also ECT(0),(1) or CE packets can be dropped 
BB: But that's not the intended meaning. Yes, a packet with any ECN field can be dropped, but this rule is just about 
what /would/ have been done /if/ the ECN field had been one specific value (Not-ECT).
-->
        </t>
        <t>Also, L4S CE marking needs to be interpreted as an unsmoothed
        signal, in contrast to the Classic approach in which AQMs filter out
        variations before signalling congestion. An L4S AQM SHOULD NOT smooth
        or filter out variations in the queue before signalling congestion. In
        the L4S architecture <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/>, the
        sender, not the network, is responsible for smoothing out
        variations.</t>
        <t>This requirement is worded as 'SHOULD NOT' rather than 'MUST NOT'
        to allow for the case where the signals from a Classic smoothed AQM
        are coupled with those from an unsmoothed L4S AQM. Nonetheless, the
        spirit of the requirement is for all systems to expect that L4S ECN
        signalling is unsmoothed and unfiltered, which is important for
        interoperability.</t>
      </section>
      <section anchor="l4sid_identification_transport_aware" numbered="true" toc="default">
        <name>Exception for L4S Packet Identification by Network Nodes with Transport-Layer Awareness</name>
        <!--This section doesn't fit very well here. It would be better as an Appendix, then it would need the following introductory 
para:

Section 2.3 recognizes that CE packets might have originally been L4S or Classic. It argues that this ambiguity is not 
serious, and therefore, for simplicity, it recommends that a packet classifer in the network "SHOULD" classify all CE 
packets as L4S. Even though it is probably unnecessary to resolve the ambiguity, the following text provides a way to do 
so using per-flow processing in the network. Per-flow processing has other detrimental side-effects, so this text is 
controversial, but worth recording, particularly for those cases where per-flow processing is already being used for 
other purposes.-->

        <t>To implement the L4S treatment, a network node does not need to
        identify transport-layer flows. Nonetheless, if an implementer is
        willing to identify transport-layer flows at a network node, and if
        the most recent ECT packet in the same flow was ECT(0), the node MAY
        classify CE packets for Classic ECN <xref target="RFC3168" format="default"/>
        treatment. In all other cases, a network node MUST classify all CE
        packets for L4S treatment. Examples of such other cases are: i) if no
        ECT packets have yet been identified in a flow; ii) if it is not
        desirable for a network node to identify transport-layer flows; or
        iii) if the most recent ECT packet in a flow was ECT(1).</t>
        <!--KDS: I'm not sure if looking at the most recent ECT packet is a good strategy.
        It makes it very difficult to do deterministic measurements of the delay in the 
        classic to L4S paths (as it depends on how previous packets are marked). I think
        always classifying CE would also be an advantage... To be further thought of...
-->

        <t>If an implementer uses flow-awareness to classify CE packets, to
        determine whether the flow is using ECT(0) or ECT(1) it only uses the
        most recent ECT packet of a flow (this advice will need to be verified
        as part of L4S experiments). This is because a sender might switch
        from sending ECT(1) (L4S) packets to sending ECT(0) (Classic ECN)
        packets, or back again, in the middle of a transport-layer flow
        (e.g. it might manually switch its congestion control module
        mid-connection, or it might be deliberately attempting to confuse the
        network).</t>
      </section>
      <section anchor="l4sid_other_IDs" numbered="true" toc="default">
        <name>Interaction of the L4S Identifier with other Identifiers</name>
        <t>The examples in this section concern how additional identifiers
        might complement the L4S identifier to classify packets between
        class-based queues. Firstly <xref target="l4sid_iother_IDs_dualq" format="default"/>
        considers two queues, L4S and Classic, as in the Coupled DualQ AQM
        <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/>, either alone (<xref target="l4sid_inclusion_dualq" format="default"/>) or within a larger queuing hierarchy
        (<xref target="l4sid_exclusion_dualq" format="default"/>). Then <xref target="l4sid_iother_IDs_fq" format="default"/> considers schemes that might combine
        per-flow 5-tuples with other identifiers.</t>
        <section anchor="l4sid_iother_IDs_dualq" numbered="true" toc="default">
          <name>DualQ Examples of Other Identifiers Complementing L4S Identifiers</name>
          <t/>
          <section anchor="l4sid_inclusion_dualq" numbered="true" toc="default">
            <name>Inclusion of Additional Traffic with L4S</name>
            <t>In a typical case for the public Internet a network element
            that implements L4S in a shared queue might want to classify some
            low-rate but unresponsive traffic (e.g. DNS, LDAP, NTP,
            voice, game sync packets) into the low latency queue to mix with
            L4S traffic.</t>
            <t>In this case it would not be appropriate to call the queue an
            L4S queue, because it is shared by L4S and non-L4S traffic.
            Instead it will be called the low latency or L queue. The L queue
            then offers two different treatments:</t>
            <ul spacing="normal">
              <li>The L4S treatment, which is a combination of the L4S AQM
                treatment and a priority scheduling treatment;</li>
              <li>The low latency treatment, which is solely the priority
                scheduling treatment, without ECN-marking by the AQM.</li>
            </ul>
            <t>To identify packets for just the scheduling treatment, it would
            be inappropriate to use the L4S ECT(1) identifier, because such
            traffic is unresponsive to ECN marking. Examples of relevant
            non-ECN identifiers are:</t>
            <ul spacing="normal">
              <li>address ranges of specific applications or hosts configured
                to be, or known to be, safe, e.g. hard-coded IoT devices
                sending low intensity traffic;</li>
              <li>certain low data-volume applications or protocols
                (e.g. ARP, DNS);</li>
              <li>specific Diffserv codepoints that indicate traffic with
                limited burstiness such as the EF (Expedited Forwarding <xref target="RFC3246" format="default"/>), Voice-Admit <xref target="RFC5865" format="default"/> or
                proposed NQB (Non-Queue-Building <xref target="I-D.ietf-tsvwg-nqb" format="default"/>) service classes or equivalent
                local-use DSCPs (see <xref target="I-D.briscoe-tsvwg-l4s-diffserv" format="default"/>).</li>
            </ul>
            <t>In summary, a network element that implements L4S in a shared
            queue MAY classify additional types of packets into the L queue
            based on identifiers other than the ECN field, but the types
            SHOULD be 'safe' to mix with L4S traffic, where 'safe' is
            explained in <xref target="l4sid_safe_unresponsive" format="default"/>.</t>
            <t>A packet that carries one of these non-ECN identifiers to
            classify it into the L queue would not be subject to the L4S ECN
            marking treatment, unless it also carried an ECT(1) or CE
            codepoint. The specification of an L4S AQM MUST define the
            behaviour for packets with unexpected combinations of codepoints,
            e.g. a non-ECN-based classifier for the L queue, but ECT(0) in the
            ECN field (for examples see section 2.5.1.1 of <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/>).</t>
            <t>For clarity, non-ECN identifiers, such as the examples itemized
            above, might be used by some network operators who believe they
            identify non-L4S traffic that would be safe to mix with L4S
            traffic. They are not alternative ways for a host to indicate that
            it is sending L4S packets. Only the ECT(1) ECN codepoint indicates
            to a network element that a host is sending L4S packets (and CE
            indicates that it could have originated as ECT(1)). Specifically
            ECT(1) indicates that the host claims its behaviour satisfies the
            prerequisite transport requirements in <xref target="l4sid_transport_req" format="default"/>.</t>
            <t>To include additional traffic with L4S, a network element only
            reads identifiers such as those itemized above. It MUST NOT alter
            these non-ECN identifiers, so that they survive for any potential
            use later on the network path.</t>
            <section anchor="l4sid_safe_unresponsive" numbered="true" toc="default">
              <name>'Safe' Unresponsive Traffic</name>
              <t>The above section requires unresponsive traffic to be 'safe'
              to mix with L4S traffic. Ideally this means that the sender
              never sends any sequence of packets at a rate that exceeds the
              available capacity of the bottleneck link. However, typically an
              unresponsive transport does not even know the bottleneck
              capacity of the path, let alone its available capacity.
              Nonetheless, an application can be considered safe enough if it
              paces packets out (not necessarily completely regularly) such
              that its maximum instantaneous rate from packet to packet stays
              well below a typical broadband access rate.</t>
              <t>This is a vague but useful definition, because many low
              latency applications of interest, such as DNS, voice, game sync
              packets, RPC, ACKs, keep-alives, could match this
              description.</t>
            </section>
          </section>
          <section anchor="l4sid_exclusion_dualq" numbered="true" toc="default">
            <name>Exclusion of Traffic From L4S Treatment</name>
            <t>To extend the above example, an operator might want to exclude
            some traffic from the L4S treatment for a policy reason,
            e.g. security (traffic from malicious sources) or commercial
            (e.g. initially the operator may wish to confine the benefits
            of L4S to business customers).</t>
            <t>In this exclusion case, the operator MUST classify on the
            relevant locally-used identifiers (e.g. source addresses)
            before classifying the non-matching traffic on the end-to-end L4S
            ECN identifier.</t>
            <t>The operator MUST NOT alter the end-to-end L4S ECN identifier
            from L4S to Classic, because an operator decision to exclude
            certain traffic from L4S treatment is local-only. The end-to-end
            L4S identifier then survives for other operators to use, or
            indeed, they can apply their own policy, independently based on
            their own choice of locally-used identifiers. This approach also
            allows any operator to remove its locally-applied exclusions in
            future, e.g. if it wishes to widen the benefit of the L4S
            treatment to all its customers.</t>
            <t>An operator that excludes traffic carrying the L4S identifier
            from L4S treatment MUST NOT treat such traffic as if it carries
            the ECT(0) codepoint, which could confuse the sender.</t>
          </section>
          <section numbered="true" toc="default">
            <name>Generalized Combination of L4S and Other Identifiers</name>
            <t>L4S concerns low latency, which it can provide for all traffic
            without differentiation and without <em>necessarily</em>
            affecting bandwidth allocation. Diffserv provides for
            differentiation of both bandwidth and low latency, but its control
            of latency depends on its control of bandwidth. The two can be
            combined if a network operator wants to control bandwidth
            allocation but it also wants to provide low latency - for any
            amount of traffic within one of these allocations of bandwidth
            (rather than only providing low latency by limiting bandwidth)
            <xref target="I-D.briscoe-tsvwg-l4s-diffserv" format="default"/>.</t>
            <t>The DualQ examples so far have been framed in the context of
            providing the default Best Efforts Per-Hop Behaviour (PHB) using
            two queues - a Low Latency (L) queue and a Classic (C) Queue. This
            single DualQ structure is expected to be the most common and
            useful arrangement. But, more generally, an operator might choose
            to control bandwidth allocation through a hierarchy of Diffserv
            PHBs at a node, and to offer one (or more) of these PHBs with a
            low latency and a Classic variant.</t>
            <t>In the first case, if we assume that a network element provides
            no PHBs except the DualQ, if a packet carries ECT(1) or CE, the
            network element would classify it for the L4S treatment
            irrespective of its DSCP. And, if a packet carried (say) the EF
            DSCP, the network element could classify it into the L queue
            irrespective of its ECN codepoint. However, where the DualQ is in
            a hierarchy of other PHBs, the classifier would classify some
            traffic into other PHBs based on DSCP before classifying between
            the low latency and Classic queues (based on ECT(1), CE and
            perhaps also the EF DSCP or other identifiers as in the above
            example). <xref target="I-D.briscoe-tsvwg-l4s-diffserv" format="default"/> gives a
            number of examples of such arrangements to address various
            requirements.</t>
            <t><xref target="I-D.briscoe-tsvwg-l4s-diffserv" format="default"/> describes how
            an operator might use L4S to offer low latency for all L4S traffic
            as well as using Diffserv for bandwidth differentiation. It
            identifies two main types of approach, which can be combined: the
            operator might split certain Diffserv PHBs between L4S and a
            corresponding Classic service. Or it might split the L4S and/or
            the Classic service into multiple Diffserv PHBs. In either of
            these cases, a packet would have to be classified on its Diffserv
            and ECN codepoints.</t>
            <t>In summary, there are numerous ways in which the L4S ECN
            identifier (ECT(1) and CE) could be combined with other
            identifiers to achieve particular objectives. The following
            categorization articulates those that are valid, but it is not
            necessarily exhaustive. Those tagged 'Recommended-standard-use'
            could be set by the sending host or a network. Those tagged
            'Local-use' would only be set by a network:</t>
            <ol spacing="normal" type="1"><li>
                <t>Identifiers Complementing the L4S Identifier</t>
                <ol spacing="normal" type="a"><li>
                    <t>Including More Traffic in the L Queue</t>
                    <t>(Could use Recommended-standard-use or
                    Local-use identifiers)</t>
                  </li>
                  <li>
                    <t>Excluding Certain Traffic from the L Queue</t>
                    <t>(Local-use only)</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Identifiers to place L4S classification in a PHB
                Hierarchy</t>
                <t>(Could use
                Recommended-standard-use or Local-use identifiers)</t>
                <ol spacing="normal" type="a"><li>PHBs Before L4S ECN Classification</li>
                  <li>PHBs After L4S ECN Classification</li>
                </ol>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="l4sid_iother_IDs_fq" numbered="true" toc="default">
          <name>Per-Flow Queuing Examples of Other Identifiers Complementing L4S Identifiers</name>
          <t>At a node with per-flow queueing (e.g. FQ-CoDel <xref target="RFC8290" format="default"/>), the L4S identifier could complement the Layer-4
          flow ID as a further level of flow granularity (i.e. Not-ECT and
          ECT(0) queued separately from ECT(1) and CE packets). "Risk of
          reordering Classic CE packets" in <xref target="l4sid_ECT1_CE" format="default"/>
          discusses the resulting ambiguity if packets originally marked
          ECT(0) are marked CE by an upstream AQM before they arrive at a node
          that classifies CE as L4S. It argues that the risk of reordering is
          vanishingly small and the consequence of such a low level of
          reordering is minimal.</t>
          <t>Alternatively, it could be assumed that it is not in a flow's own
          interest to mix Classic and L4S identifiers. Then the AQM could use
          the ECN field to switch itself between a Classic and an L4S AQM
          behaviour within one per-flow queue. For instance, for ECN-capable
          packets, the AQM might consist of a simple marking threshold and an
          L4S ECN identifier might simply select a shallower threshold than a
          Classic ECN identifier would.</t>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Limiting Packet Bursts from Links Supporting L4S AQMs</name>
        <t>As well as senders needing to limit packet bursts (<xref target="l4sid_congestion_response" format="default"/>), links need to limit the degree
        of burstiness they introduce. In both cases (senders and links) this
        is a tradeoff, because batch-handling of packets is done for good
        reason, e.g. processing efficiency or to make efficient use of
        medium acquisition delay. Some take the attitude that there is no
        point reducing burst delay at the sender below that introduced by
        links (or vice versa). However, delay reduction proceeds by cutting
        down 'the longest pole in the tent', which turns the spotlight on the
        next longest, and so on.</t>
        <t>This document does not set any quantified requirements for links to
        limit burst delay, primarily because link technologies are outside the
        remit of L4S specifications. Nonetheless, it would not make sense to
        implement an L4S AQM that feeds into a particular link technology
        without also reviewing opportunities to reduce any form of burst delay
        introduced by that link technology. This would at least limit the
        bursts that the link would otherwise introduce into the onward
        traffic, which would cause jumpy feedback to the sender as well as
        potential extra queuing delay downstream. This document does not
        presume to even give guidance on an appropriate target for such burst
        delay until there is more industry experience of L4S. However, as
        suggested in <xref target="l4sid_congestion_response" format="default"/> it would not
        seem necessary to limit bursts lower than roughly 10% of the minimum
        base RTT expected in the typical deployment scenario (e.g. 250 us
        burst duration for links within the public Internet).</t>
      </section>
    </section>
    <section anchor="l4sid_encaps" numbered="true" toc="default">
      <name>Behaviour of Tunnels and Encapsulations</name>
      <section anchor="l4sid_encaps_no_change" numbered="true" toc="default">
        <name>No Change to ECN Tunnels and Encapsulations in General</name>
        <t>The L4S identifier is expected to work through and within any
        tunnel without modification, as long as the tunnel propagates the ECN
        field in any of the ways that have been defined since the first
        variant in the year 2001 <xref target="RFC3168" format="default"/>. L4S will also work
        with (but does not rely on) any of the more recent updates to ECN
        propagation in <xref target="RFC4301" format="default"/>, <xref target="RFC6040" format="default"/> or
        <xref target="I-D.ietf-tsvwg-rfc6040update-shim" format="default"/>. However, it is
        likely that some tunnels still do not implement ECN propagation at
        all. In these cases, L4S will work through such tunnels, but within
        them the outer header of L4S traffic will appear as Classic.</t>
        <t>AQMs are typically implemented where an IP-layer buffer feeds into
        a lower layer, so they are agnostic to link layer encapsulations.
        Where a bottleneck link is not IP-aware, the L4S identifier is still
        expected to work within any lower layer encapsulation without
        modification, as long it propagates the ECN field as defined for the
        link technology, for example for MPLS <xref target="RFC5129" format="default"/> or
        TRILL <xref target="I-D.ietf-trill-ecn-support" format="default"/>. In some of these
        cases, e.g. layer-3 Ethernet switches, the AQM accesses the IP layer
        header within the outer encapsulation, so again the L4S identifier is
        expected to work without modification. Nonetheless, the programme to
        define ECN for other lower layers is still in progress <xref target="I-D.ietf-tsvwg-ecn-encap-guidelines" format="default"/>.</t>
      </section>
      <section anchor="l4sid_VPN_anti-replay" numbered="true" toc="default">
        <name>VPN Behaviour to Avoid Limitations of Anti-Replay</name>
        <t>If a mix of L4S and Classic packets is sent into the same security
        association (SA) of a virtual private network (VPN), and if the VPN
        egress is employing the optional anti-replay feature, it could
        inappropriately discard Classic packets (or discard the records in
        Classic packets) by mistaking their greater queuing delay for a replay
        attack (see <xref target="Heist21" format="default"/> for the potential performance
        impact). This known problem is common to both IPsec <xref target="RFC4301" format="default"/> and DTLS <xref target="RFC6347" format="default"/> VPNs, given they
        use similar anti-replay window mechanisms. The mechanism used can only
        check for replay within its window, so if the window is smaller than
        the degree of reordering, it can only assume there might be a replay
        attack and discard all the packets behind the trailing edge of the
        window. The specifications of IPsec AH <xref target="RFC4302" format="default"/> and
        ESP <xref target="RFC4303" format="default"/> suggest that an implementer scales the
        size of the anti-replay window with interface speed, and the current
        draft of DTLS 1.3 <xref target="I-D.ietf-tls-dtls13" format="default"/> says "The
        receiver SHOULD pick a window large enough to handle any plausible
        reordering, which depends on the data rate." However, in practice, the
        size of a VPN's anti-replay window is not always scaled
        appropriately.</t>
        <t>If a VPN carrying traffic participating in the L4S experiment
        experiences inappropriate replay detection, the foremost remedy would
        be to ensure that the egress is configured to comply with the above
        window-sizing requirements.</t>
        <t>If an implementation of a VPN egress does not support a
        sufficiently large anti-replay window, e.g. due to hardware
        limitations, one of the temporary alternatives listed in order of
        preference below might be feasible instead:</t>
        <ul spacing="normal">
          <li>If the VPN can be configured to classify packets into different
            SAs indexed by DSCP, apply the appropriate locally defined DSCPs
            to Classic and L4S packets. The DSCPs could be applied by the
            network (based on the least significant bit of the ECN field), or
            by the sending host. Such DSCPs would only need to survive as far
            as the VPN ingress.</li>
          <li>
            <t>If the above is not possible and it is necessary to use L4S,
            either of the following might be appropriate as a last
            resort:</t>
            <ul spacing="normal">
              <li>disable anti-replay protection at the VPN egress, after
                considering the security implications (optional anti-replay is
                mandatory in both IPsec and DTLS);</li>
              <li>configure the tunnel ingress not to propagate ECN to the
                outer, which would lose the benefits of L4S and Classic ECN
                over the VPN.</li>
            </ul>
          </li>
          <!--ToDo: Perhaps better to delete this whole third bullet.-->
          </ul>
        <t>Modification to VPN implementations is outside the present scope,
        which is why this section has so far focused on reconfiguration.
        Although this document does not define any requirements for VPN
        implementations, determining whether there is a need for such
        requirements could be one aspect of L4S experimentation.</t>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>L4S Experiments</name>
      <t>This section describes open questions that L4S Experiments ought to
      focus on. This section also documents outstanding open issues that will
      need to be investigated as part of L4S experimentation, given they could
      not be fully resolved during the WG phase. It also lists metrics that
      will need to be monitored during experiments (summarizing text elsewhere
      in L4S documents) and finally lists some potential future directions
      that researchers might wish to investigate.</t>
      <t>In addition to this section, <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled" format="default"/> sets operational and
      management requirements for experiments with DualQ Coupled AQMs; and
      General operational and management requirements for experiments with L4S
      congestion controls are given in <xref target="l4sid_transport_req" format="default"/>
      and <xref target="l4sid_network_req" format="default"/> above, e.g. co-existence and
      scaling requirements, incremental deployment arrangements.</t>
      <t>The specification of each scalable congestion control will need to
      include protocol-specific requirements for configuration and monitoring
      performance during experiments. Appendix A of <xref target="RFC5706" format="default"/>
      provides a helpful checklist.</t>
      <section numbered="true" toc="default">
        <name>Open Questions</name>
        <t>L4S experiments would be expected to answer the following
        questions:</t>
        <ul spacing="normal">
          <li>Have all the parts of L4S been deployed, and if so, what
            proportion of paths support it?</li>
          <li>Does use of L4S over the Internet result in significantly
            improved user experience?</li>
          <li>Has L4S enabled novel interactive applications?</li>
          <li>Did use of L4S over the Internet result in improvements to the
            following metrics:</li>
          <li>
            <ul spacing="normal">
              <li>queue delay (mean and 99th percentile) under various
                loads;</li>
              <li>utilization;</li>
              <li>starvation / fairness;</li>
              <li>scaling range of flow rates and RTTs?</li>
            </ul>
          </li>
          <li>How much does burstiness in the Internet affect L4S
            performance, and how much limitation of bustiness was needed
            and/or was realized - both at senders and at links, especially
            radio links?</li>
          <li>
            <t>Was per-flow queue protection typically (un)necessary? </t>
            <ul spacing="normal">
              <li>How well did overload protection or queue protection
                work?</li>
            </ul>
          </li>
          <li>How well did L4S flows coexist with Classic flows when sharing
            a bottleneck?</li>
          <li>
            <ul spacing="normal">
              <li>How frequently did problems arise?</li>
              <li>What caused any coexistence problems, and were any problems
                due to single-queue Classic ECN AQMs (this assumes
                single-queue Classic ECN AQMs can be distinguished from FQ
                ones)?</li>
            </ul>
          </li>
          <li>How prevalent were problems with the L4S service due to tunnels
            / encapsulations that do not support ECN decapsulation?</li>
          <li>How easy was it to implement a fully compliant L4S congestion
            control, over various different transport protocols (TCP. QUIC,
            RMCAT, etc)?</li>
        </ul>
        <t>Monitoring for harm to other traffic, specifically bandwidth
        starvation or excess queuing delay, will need to be conducted
        alongside all early L4S experiments. It is hard, if not impossible,
        for an individual flow to measure its impact on other traffic. So such
        monitoring will need to be conducted using bespoke monitoring across
        flows and/or across classes of traffic.</t>
      </section>
      <section numbered="true" toc="default">
        <name>Open Issues</name>
        <ul spacing="normal">
          <li>What is the best way forward to deal with L4S over single-queue
            Classic ECN AQM bottlenecks, given current problems with
            misdetecting L4S AQMs as Classic ECN AQMs?</li>
          <li>Fixing the poor Interaction between current L4S congestion
            controls and CoDel with only Classic ECN support during flow
            startup.</li>
        </ul>
      </section>
      <section numbered="true" toc="default">
        <name>Future Potential</name>
        <t>Researchers might find that L4S opens up the following interesting
        areas for investigation:</t>
        <ul spacing="normal">
          <li>Potential for faster convergence time and tracking of available
            capacity;</li>
          <li>Potential for improvements to particular link technologies, and
            cross-layer interactions with them;</li>
          <li>Potential for using virtual queues, e.g. to further reduce
            latency jitter, or to leave headroom for capacity variation in
            radio networks;</li>
          <li>Development and specification of reverse path congestion
            control using L4S building bocks (e.g. AccECN, QUIC);</li>
          <li>Once queuing delay is cut down, what becomes the 'second
            longest pole in the tent' (other than the speed of light)?</li>
          <li>Novel alternatives to the existing set of L4S AQMs;</li>
          <li>Novel applications enabled by L4S.</li>
        </ul>
      </section>
    </section>
    <section anchor="l4sid_IANA" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>The 01 codepoint of the ECN Field of the IP header is specified by
      the present Experimental RFC. The process for an experimental RFC to
      assign this codepoint in the IP header (v4 and v6) is documented in
      Proposed Standard <xref target="RFC8311" format="default"/>, which updates the Proposed
      Standard <xref target="RFC3168" format="default"/>.</t>
      <t>When the present document is published as an RFC, IANA is asked to
      update the 01 entry in the registry, "ECN Field (Bits 6-7)" to the
      following (see
      https://www.iana.org/assignments/dscp-registry/dscp-registry.xhtml#ecn-field
      ):</t>
      <table align="center">
        <thead>
          <tr>
            <th align="left">Binary</th>
            <th align="left">Keyword</th>
            <th align="left">References</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">01</td>
            <td align="left">ECT(1) (ECN-Capable Transport(1))[1]</td>
            <td align="left">
              <xref target="RFC8311" format="default"/> [RFC Errata 5399] [RFCXXXX]</td>
          </tr>
        </tbody>
      </table>
      <t>[XXXX is the number that the RFC Editor assigns to the present
      document (this sentence to be removed by the RFC Editor)].</t>
    </section>
    <section anchor="l4sid_Security_Considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Approaches to assure the integrity of signals using the new
      identifier are introduced in <xref target="l4sid_competing_integrity" format="default"/>.
      See the security considerations in the L4S architecture <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/> for further discussion of mis-use of
      the identifier, as well as extensive discussion of policing rate and
      latency in regard to L4S.</t>
      <t>If the anti-replay window of a VPN egress is too small, it will
      mistake deliberate delay differences as a replay attack, and discard
      higher delay packets (e.g. Classic) carried within the same security
      association (SA) as low delay packets (e.g. L4S). <xref target="l4sid_VPN_anti-replay" format="default"/> recommends that VPNs used in L4S
      experiments are configured with a sufficiently large anti-replay window,
      as required by the relevant specifications. It also discusses other
      alternatives.</t>
      <t>If a user taking part in the L4S experiment sets up a VPN without
      being aware of the above advice, and if the user allows anyone to send
      traffic into their VPN, they would open up a DoS vulnerability in which
      an attacker could induce the VPN's anti-replay mechanism to discard
      enough of the user's Classic (C) traffic (if they are receiving any) to
      cause a significant rate reduction. While the user is actively
      downloading C traffic, the attacker sends C traffic into the VPN to fill
      the remainder of the bottleneck link, then sends intermittent L4S
      packets to maximize the chance of exceeding the VPN's replay window. The
      user can prevent this attack by following the recommendations in <xref target="l4sid_VPN_anti-replay" format="default"/>.<!--ToDo: I'm not sure this para is warranted. 
It's a bit lame to say there's an attack if you don't follow advice, and the solution to the attack is to follow the advice.-->
      </t>
      <t>The recommendation to detect loss in time units prevents the
      ACK-splitting attacks described in <xref target="Savage-TCP" format="default"/>.</t>
    </section>
    <section numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>Thanks to Richard Scheffenegger, John Leslie, David Taeht,
      Jonathan Morton, Gorry Fairhurst, Michael Welzl, Mikael Abrahamsson and
      Andrew McGregor for the discussions that led to this specification.
      Ing-jyh (Inton) Tsang was a contributor to the early drafts of this
      document. And thanks to Mikael Abrahamsson, Lloyd Wood, Nicolas Kuhn,
      Greg White, Tom Henderson, David Black, Gorry Fairhurst, Brian
      Carpenter, Jake Holland, Rod Grimes, Richard Scheffenegger, Sebastian
      Moeller, Neal Cardwell, Praveen Balasubramanian, Reza Marandian Hagh,
      Stuart Cheshire and Vidhi Goel for providing help and reviewing this
      draft and thanks to Ingemar Johansson for reviewing and providing
      substantial text. Thanks to Sebastian Moeller for identifying the
      interaction with VPN anti-replay and to Jonathan Morton for identifying
      the attack based on this. Particular thanks to tsvwg chairs Gorry
      Fairhurst, David Black and Wes Eddy for patiently helping this and the
      other L4S drafts through the IETF process. <xref target="l4sps_tcp-prague-reqs" format="default"/> listing the Prague L4S Requirements is
      based on text authored by Marcelo Bagnulo Braun that was originally an
      appendix to <xref target="I-D.ietf-tsvwg-l4s-arch" format="default"/>. That text was in
      turn based on the collective output of the attendees listed in the
      minutes of a 'bar BoF' on DCTCP Evolution during IETF-94 <xref target="TCPPrague" format="default"/>.</t>
      <t>The authors' contributions were part-funded by the European Community
      under its Seventh Framework Programme through the Reducing Internet
      Transport Latency (RITE) project (ICT-317700). Bob Briscoe was also
      funded partly by the Research Council of Norway through the TimeIn
      project, partly by CableLabs and partly by the Comcast Innovation Fund.
      The views expressed here are solely those of the authors.</t>
    </section>
  </middle>
  <!--  *****BACK MATTER ***** -->

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4774.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2474.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2309.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3540.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3246.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3649.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4301.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4302.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4303.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4340.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4341.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4342.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5033.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5129.xml"/>
        <!--  <?rfc include='reference.RFC.5238'?>
      <?rfc include='reference.RFC.5415'?>
      <?rfc include='reference.RFC.5764'?>
      <?rfc include='reference.RFC.6083'?>
-->

      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5348.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5622.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5865.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4960.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5562.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5706.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6040.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6077.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6347.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6660.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6675.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7560.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7567.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7713.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5925.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tcpm-accurate-ecn.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8033.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8290.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8298.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-ecn-encap-guidelines.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-rfc6040update-shim.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-trill-ecn-support.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-aqm-dualq-coupled.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-stewart-tsvwg-sctpecn.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-l4s-arch.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-briscoe-tsvwg-l4s-diffserv.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-nqb.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tsvwg-l4sops.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8311.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tcpm-generalized-ecn.xml"/>
        <reference anchor="ARED01" target="http://www.icir.org/floyd/red.html">
          <front>
            <title>Adaptive RED: An Algorithm for Increasing the Robustness of
          RED's Active Queue Management</title>
            <author fullname="Sally Floyd" initials="S." surname="Floyd">
              <organization>ACIRI</organization>
            </author>
            <author fullname="Ramakrishna Gummadi" initials="R." surname="Gummadi">
              <organization>ACIRI</organization>
            </author>
            <author fullname="S. Shenker" initials="S." surname="Shenker">
              <organization>ACIRI</organization>
            </author>
            <date month="August" year="2001"/>
          </front>
          <seriesInfo name="ACIRI Technical Report" value=""/>
        </reference>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8312.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8888.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-sridharan-tcpm-ctcp.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-briscoe-docsis-q-protection.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-briscoe-iccrg-prague-congestion-control.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-tls-dtls13.xml"/>
        <reference anchor="Mathis09" target="http://www.hpcc.jp/pfldnet2009/Program_files/1569198525.pdf">
          <front>
            <title>Relentless Congestion Control</title>
            <author fullname="Matt Mathis" initials="M." surname="Mathis">
              <organization>PSC</organization>
            </author>
            <date month="May" year="2009"/>
          </front>
          <seriesInfo name="PFLDNeT'09" value=""/>
        </reference>
        <!--{ToDo: DCttH ref will need to be updated, once stable}-->

      <reference anchor="DCttH15" target="http://riteproject.eu/publications/">
          <front>
            <title>'Data Centre to the Home': Ultra-Low Latency for All</title>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Bell Labs</organization>
            </author>
            <author fullname="Olga Bondarenko" initials="O." surname="Bondarenko">
              <organization>Simula Research Lab</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>BT</organization>
            </author>
            <author fullname="Ing-jyh Tsang" initials="I." surname="Tsang">
              <organization>Bell Labs</organization>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="RITE Project Technical Report" value=""/>
          <format target="http://www.bobbriscoe.net/projects/latency/dctth_preprint.pdf" type="PDF"/>
        </reference>
        <reference anchor="PI2" target="http://dl.acm.org/citation.cfm?doid=2999572.2999578">
          <front>
            <title>PI^2 : A Linearized AQM for both Classic and Scalable
          TCP</title>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Bell Labs</organization>
            </author>
            <author fullname="Olga Bondarenko" initials="O." surname="Bondarenko">
              <organization>Simula Research Lab</organization>
            </author>
            <author fullname="Ing-jyh Tsang" initials="I." surname="Tsang">
              <organization>Bell Labs</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>BT</organization>
            </author>
            <date month="December" year="2016"/>
          </front>
          <seriesInfo name="Proc. ACM CoNEXT 2016" value="pp.105-119"/>
        </reference>
        <reference anchor="VCP" target="http://doi.acm.org/10.1145/1080091.1080098">
          <front>
            <title>One more bit is enough</title>
            <author fullname="Yong Xia" initials="Y." surname="Xia">
              <organization/>
            </author>
            <author fullname="Lakshminarayanan Subramanian" initials="L." surname="Subramanian">
              <organization/>
            </author>
            <author fullname="Ion Stoica" initials="I." surname="Stoica">
              <organization/>
            </author>
            <author fullname="Shivkumar Kalyanaraman" initials="S." surname="Kalyanaraman">
              <organization/>
            </author>
            <date month="" year="2005"/>
          </front>
          <seriesInfo name="Proc. SIGCOMM'05, ACM CCR" value="35(4)37--48"/>
          <format target="http://conferences.sigcomm.org/sigcomm/2005/paper-XiaSub.pdf" type="PDF"/>
        </reference>
        <reference anchor="QV" target="https://riteproject.files.wordpress.com/2015/12/rite-deliverable-2-3.pdf">
          <front>
            <title>Up to Speed with Queue View</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>BT</organization>
            </author>
            <author fullname="Per Hurtig" initials="P." surname="Hurtig">
              <organization>Uni Karlstad</organization>
            </author>
            <date month="August" year="2015"/>
          </front>
          <seriesInfo name="RITE Technical Report" value="D2.3; Appendix C.2"/>
        </reference>
        <reference anchor="Alizadeh-stability" target="https://people.csail.mit.edu/alizadeh/papers/dctcp_analysis-sigmetrics11.pdf">
          <front>
            <title>Analysis of DCTCP: Stability, Convergence, and
          Fairness</title>
            <author fullname="Mohamed Alizadeh" initials="M." surname="Alizadeh"/>
            <author fullname="Adel Javanmard" initials="A." surname="Javanmard"/>
            <author fullname="Balaji Prabhakar" initials="B." surname="Prabhakar"/>
            <date month="June" year="2011"/>
          </front>
          <seriesInfo name="ACM SIGMETRICS 2011" value=""/>
        </reference>
        <reference anchor="TCPPrague" target="https://www.ietf.org/mail-archive/web/tcpprague/current/msg00001.html">
          <front>
            <title>Notes: DCTCP evolution 'bar BoF': Tue 21 Jul 2015, 17:40,
          Prague</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Simula</organization>
            </author>
            <date month="July" year="2015"/>
          </front>
          <seriesInfo name="tcpprague mailing list archive" value=""/>
        </reference>
        <reference anchor="sub-mss-prob" target="https://arxiv.org/abs/1904.07598">
          <front>
            <title>Scaling TCP's Congestion Window for Small Round Trip
          Times</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>BT</organization>
            </author>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Bell Labs</organization>
            </author>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="BT Technical Report" value="TR-TUB8-2015-002"/>
          <format target="https://arxiv.org/pdf/1904.07598" type="PDF"/>
        </reference>
        <reference anchor="ecn-fallback" target="https://arxiv.org/abs/1911.00710">
          <front>
            <title>TCP Prague Fall-back on Detection of a Classic ECN
          AQM</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <author fullname="Asad Sajjad Ahmed" initials="A.S." surname="Ahmed">
              <organization>Simula and Uni Oslo</organization>
            </author>
            <date month="April" year="2020"/>
          </front>
          <seriesInfo name="bobbriscoe.net Technical Report" value="TR-BB-2019-002"/>
        </reference>
        <reference anchor="Ahmed19" target="https://www.duo.uio.no/handle/10852/70966">
          <front>
            <title>Extending TCP for Low Round Trip Delay</title>
            <author fullname="Asad Sajjad Ahmed" initials="A.S." surname="Ahmed">
              <organization>Simula and Uni Oslo</organization>
            </author>
            <date month="August" year="2019"/>
          </front>
          <seriesInfo name="Masters Thesis, Uni Oslo" value=""/>
          <format target="https://www.duo.uio.no/bitstream/handle/10852/70966/main.pdf?sequence=5&amp;isAllowed=y" type="PDF"/>
        </reference>
        <reference anchor="Paced-Chirping" target="https://riteproject.files.wordpress.com/2018/07/misundjoakimmastersthesissubmitted180515.pdf">
          <front>
            <title>Rapid Acceleration in TCP Prague</title>
            <author fullname="Joakim Misund" initials="J." surname="Misund">
              <organization>University of Oslo and Simula</organization>
            </author>
            <date month="May" year="2018"/>
          </front>
          <seriesInfo name="Masters Thesis" value=""/>
        </reference>
        <reference anchor="A2DTCP" target="http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6871352">
          <front>
            <title>Adaptive-Acceleration Data Center TCP</title>
            <author fullname="Tao Zhang" initials="T." surname="Zhang">
              <organization/>
            </author>
            <author fullname="Jianxin Wang" initials="J." surname="Wang">
              <organization/>
            </author>
            <author fullname="Jiawei Huang" initials="J." surname="Huang">
              <organization/>
            </author>
            <author fullname="Yi Huang" initials="Y." surname="Huang">
              <organization/>
            </author>
            <author fullname="Jianer Chen" initials="J." surname="Chen">
              <organization/>
            </author>
            <author fullname="Yi Pan" initials="Y." surname="Pan">
              <organization/>
            </author>
            <date month="June" year="2015"/>
          </front>
          <seriesInfo name="IEEE Transactions on Computers" value="64(6):1522-1533"/>
        </reference>
        <reference anchor="PragueLinux" target="https://www.netdevconf.org/0x13/session.html?talk-tcp-prague-l4s">
          <front>
            <title>Implementing the `TCP Prague' Requirements for Low Latency
          Low Loss Scalable Throughput (L4S)</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Olga Albisser" initials="O." surname="Albisser">
              <organization>Simula</organization>
            </author>
            <author fullname="Joakim Misund" initials="J." surname="Misund">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Olivier Tilmans" initials="O." surname="Tilmans">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>ETHZ</organization>
            </author>
            <author fullname="Asad Sajjad Ahmed" initials="A.S." surname="Ahmed">
              <organization>Simula</organization>
            </author>
            <date month="March" year="2019"/>
          </front>
          <seriesInfo name="Proc. Linux Netdev 0x13" value=""/>
          <format target="https://www.files.netdevconf.info/f/4d6939d5f1fb404fafd1/?dl=1" type="PDF"/>
        </reference>
        <reference anchor="LinuxPacedChirping" target="https://www.netdevconf.org/0x13/session.html?talk-chirp">
          <front>
            <title>Paced Chirping - Rethinking TCP start-up</title>
            <author fullname="Joakim Misund" initials="J." surname="Misund">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <date month="March" year="2019"/>
          </front>
          <seriesInfo name="Proc. Linux Netdev 0x13" value=""/>
          <format target="https://www.files.netdevconf.info/f/da8cc04a608a448f890e/?dl=1" type="PDF"/>
        </reference>
        <reference anchor="TCP-CA" target="http://ee.lbl.gov/papers/congavoid.pdf">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author fullname="Van Jacobson" initials="V." surname="Jacobson">
              <organization/>
            </author>
            <author fullname="Michael J. Karels" initials="M.J." surname="Karels">
              <organization/>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <date month="November" year="1988"/>
          </front>
          <seriesInfo name="Laurence Berkeley Labs Technical Report" value=""/>
        </reference>
        <reference anchor="Savage-TCP">
          <front>
            <title>TCP Congestion Control with a Misbehaving Receiver</title>
            <author fullname="Stefan Savage" initials="S." surname="Savage">
              <organization>Uni Washington</organization>
            </author>
            <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
              <organization>Uni Washington</organization>
            </author>
            <author fullname="David Wetherall" initials="D." surname="Wetherall">
              <organization>Uni Washington</organization>
            </author>
            <author fullname="Tom Anderson" initials="T." surname="Anderson">
              <organization>Uni Washington</organization>
            </author>
            <date month="October" year="1999"/>
          </front>
          <seriesInfo name="ACM SIGCOMM Computer Communication Review" value="29(5):71--78"/>
        </reference>
        <reference anchor="Heist21" target="https://github.com/heistp/l4s-tests/#dropped-packets-for-tunnels-with-replay-protection-enabled">
          <front>
            <title>Dropped Packets for Tunnels with Replay Protection
          Enabled</title>
            <author fullname="Pete Heist" initials="P." surname="Heist">
              <organization/>
            </author>
            <date month="May" year="2021"/>
          </front>
          <seriesInfo name="github" value="README"/>
        </reference>
        <reference anchor="SCReAM" target="https://github.com/EricssonResearch/scream/blob/master/README.md">
          <front>
            <title>SCReAM</title>
            <author fullname="Ingemar Johansson" initials="I" surname="Johansson">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="github repository;" value=""/>
          <format target="https://github.com/google/bbr/blob/v2alpha/README.md" type="Source code"/>
        </reference>
        <reference anchor="BBRv2" target="https://github.com/google/bbr/blob/v2alpha/README.md">
          <front>
            <title>TCP BBR v2 Alpha/Preview Release</title>
            <author fullname="Neal Cardwell" initials="N" surname="Cardwell">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="github repository;" value="Linux congestion control module"/>
        </reference>
        <reference anchor="DualPI2Linux" target="https://www.netdevconf.org/0x13/session.html?talk-DUALPI2-AQM">
          <front>
            <title>DUALPI2 - Low Latency, Low Loss and Scalable (L4S)
          AQM</title>
            <author fullname="Olga Albisser" initials="O." surname="Albisser">
              <organization>Simula Research Lab</organization>
            </author>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <author fullname="Olivier Tilmans" initials="O." surname="Tilmans">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Henrik Steen" initials="H." surname="Steen">
              <organization>Simula Research Lab</organization>
            </author>
            <date month="March" year="2019"/>
          </front>
          <seriesInfo name="Proc. Linux Netdev 0x13" value=""/>
          <format target="https://www.files.netdevconf.org/f/febbe8c6a05b4ceab641/?dl=1" type="PDF"/>
        </reference>
      </references>
    </references>
    <section anchor="l4sps_tcp-prague-reqs" numbered="true" toc="default">
      <name>The 'Prague L4S Requirements'</name>
      <t>This appendix is informative, not normative. It gives a list of
      modifications to current scalable congestion controls so that they can
      be deployed over the public Internet and coexist safely with existing
      traffic. The list complements the normative requirements in <xref target="l4sid_transport_req" format="default"/> that a sender has to comply with before
      it can set the L4S identifier in packets it sends into the Internet. As
      well as necessary safety improvements (requirements) this appendix also
      includes preferable performance improvements (optimizations).</t>
      <t>These recommendations have become know as the Prague L4S
      Requirements, because they were originally identified at an ad hoc
      meeting during IETF-94 in Prague <xref target="TCPPrague" format="default"/>. They were
      originally called the 'TCP Prague Requirements', but they are not solely
      applicable to TCP, so the name and wording has been generalized for all
      transport protocols, and the name 'TCP Prague' is now used for a
      specific implementation of the requirements.</t>
      <t>At the time of writing, DCTCP <xref target="RFC8257" format="default"/> is the most
      widely used scalable transport protocol. In its current form, DCTCP is
      specified to be deployable only in controlled environments. Deploying it
      in the public Internet would lead to a number of issues, both from the
      safety and the performance perspective. The modifications and additional
      mechanisms listed in this section will be necessary for its deployment
      over the global Internet. Where an example is needed, DCTCP is used as a
      base, but it is likely that most of these requirements equally apply to
      other scalable congestion controls, covering adaptive real-time media,
      etc., not just capacity-seeking behaviours.</t>
      <section numbered="true" toc="default">
        <name>Requirements for Scalable Transport Protocols</name>
        <t/>
        <section numbered="true" toc="default">
          <name>Use of L4S Packet Identifier</name>
          <t>Description: A scalable congestion control needs to distinguish
          the packets it sends from those sent by Classic congestion controls
          (see the precise normative requirement wording in <xref target="l4sid_codepoint" format="default"/>).</t>
          <t>Motivation: It needs to be possible for a network node to
          classify L4S packets without flow state into a queue that applies an
          L4S ECN marking behaviour and isolates L4S packets from the queuing
          delay of Classic packets.</t>
        </section>
        <section numbered="true" toc="default">
          <name>Accurate ECN Feedback</name>
          <t>Description: The transport protocol for a scalable congestion
          control needs to provide timely, accurate feedback about the extent
          of ECN marking experienced by all packets (see the precise normative
          requirement wording in <xref target="l4sid_feedback" format="default"/>).</t>
          <t>Motivation: Classic congestion controls only need feedback about
          the existence of a congestion episode within a round trip, not
          precisely how many packets were marked with ECN or dropped.
          Therefore, in 2001, when ECN feedback was added to TCP <xref target="RFC3168" format="default"/>, it could not inform the sender of more than one
          ECN mark per RTT. Since then, requirements for more accurate ECN
          feedback in TCP have been defined in <xref target="RFC7560" format="default"/> and
          <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> specifies a change to
          the TCP protocol to satisfy these requirements. Most other transport
          protocols already satisfy this requirement (see <xref target="l4sid_feedback" format="default"/>).</t>
        </section>
        <section anchor="l4sid_sec_replaceable" numbered="true" toc="default">
          <name>Capable of Replacement by Classic Congestion Control</name>
          <t>Description: It needs to be possible to replace the
          implementation of a scalable congestion control with a Classic
          control (see the precise normative requirement wording in <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: L4S is an experimental protocol, therefore it seems
          prudent to be able to disable it at source in case of insurmountable
          problems, perhaps due to some unexpected interaction on a particular
          sender; over a particular path or network; with a particular
          receiver or even ultimately an insurmountable problem with the
          experiment as a whole.</t>
        </section>
        <section anchor="l4sid_sec_fallback_on_loss" numbered="true" toc="default">
          <name>Fall back to Classic Congestion Control on Packet Loss</name>
          <t>Description: As well as responding to ECN markings in a scalable
          way, a scalable congestion control needs to react to packet loss in
          a way that will coexist safely with a Reno congestion control <xref target="RFC5681" format="default"/> (see the precise normative requirement wording in
          <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: Part of the safety conditions for deploying a
          scalable congestion control on the public Internet is to make sure
          that it behaves properly when it builds a queue at a network
          bottleneck that has not been upgraded to support L4S. Packet loss
          can have many causes, but it usually has to be conservatively
          assumed that it is a sign of congestion. Therefore, on detecting
          packet loss, a scalable congestion control will need to fall back to
          Classic congestion control behaviour. If it does not comply with
          this requirement it could starve Classic traffic.</t>
          <t>A scalable congestion control can be used for different types of
          transport, e.g. for real-time media or for reliable transport
          like TCP. Therefore, the particular Classic congestion control
          behaviour to fall back on will need to be dependent on the specific
          congestion control implementation. In the particular case of DCTCP,
          the DCTCP specification <xref target="RFC8257" format="default"/> states that "It is
          RECOMMENDED that an implementation deal with loss episodes in the
          same way as conventional TCP." For safe deployment of a scalable
          congestion control in the public Internet, the above requirement
          would need to be defined as a "MUST".</t>
          <t>Even though a bottleneck is L4S capable, it might still become
          overloaded and have to drop packets. In this case, the sender may
          receive a high proportion of packets marked with the CE bit set and
          also experience loss. Current DCTCP implementations each react
          differently to this situation. At least one implementation reacts
          only to the drop signal (e.g. by halving the CWND) and at least
          another DCTCP implementation reacts to both signals (e.g. by
          halving the CWND due to the drop and also further reducing the CWND
          based on the proportion of marked packet). A third approach for the
          public Internet has been proposed that adjusts the loss response to
          result in a halving when combined with the ECN response. We believe
          that further experimentation is needed to understand what is the
          best behaviour for the public Internet, which may or not be one of
          these existing approaches.</t>
        </section>
        <section anchor="l4sid_sec_fallback_on_classic_CE" numbered="true" toc="default">
          <name>Coexistence with Classic Congestion Control at Classic ECN bottlenecks</name>
          <t>Description: Monitoring has to be in place so that a non-L4S but
          ECN-capable AQM can be detected at path bottlenecks. This is in case
          such an AQM has been implemented in a shared queue, in which case
          any long-running scalable flow would predominate over any
          simultaneous long-running Classic flow sharing the queue. The
          requirement is written so that such a problem could either be
          resolved in real-time, or via administrative intervention (see the
          precise normative requirement wording in <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: Similarly to the requirement in <xref target="l4sid_sec_fallback_on_loss" format="default"/>, this requirement is a safety
          condition to ensure an L4S congestion control coexists well with
          Classic flows when it builds a queue at a shared network bottleneck
          that has not been upgraded to support L4S. Nonetheless, if
          necessary, it is considered reasonable to resolve such problems over
          management timescales (possibly involving human intervention)
          because:</t>
          <ul spacing="normal">
            <li>although a Classic flow can considerably reduce its
              throughput in the face of a competing scalable flow, it still
              makes progress and does not starve;</li>
            <li>implementations of a Classic ECN AQM in a queue that is
              intended to be shared are believed to be rare;</li>
            <li>detection of such AQMs is not always clear-cut; so focused
              out-of-band testing (or even contacting the relevant network
              operator) would improve certainty.</li>
          </ul>
          <t>Therefore, the relevant normative requirement (<xref target="l4sid_congestion_response" format="default"/>) is divided into three stages:
          monitoring, detection and action:</t>
          <dl newline="false" spacing="normal">
            <dt>Monitoring:</dt>
            <dd>Monitoring involves collection of the
              measurement data to be analysed. Monitoring is expressed as a
              'MUST' for uncontrolled environments, although the placement of
              the monitoring function is left open. Whether monitoring has to
              be applied in real-time is expressed as a 'SHOULD'. This allows
              for the possibility that the operator of an L4S sender
              (e.g. a CDN) might prefer to test out-of-band for signs of
              Classic ECN AQMs, perhaps to avoid continually consuming
              resources to monitor live traffic.</dd>
            <dt>Detection:</dt>
            <dd>Detection involves analysis of the
              monitored data to detect the likelihood of a Classic ECN AQM.
              The requirements recommend that detection occurs live in
              real-time. However, detection is allowed to be deferred (e.g. it
              might involve further testing targeted at candidate AQMs);</dd>
            <dt>Action:</dt>
            <dd>
              <t>This involves the act of switching the
              sender to a Classic congestion control. This might occur in
              real-time within the congestion control for the subsequent
              duration of a flow, or it might involve administrative action to
              switch to Classic congestion control for a specific interface or
              for a certain set of destination addresses.</t>
              <t>Instead of the sender taking action itself, the
              operator of the sender (e.g. a CDN) might prefer to ask the
              network operator to modify the Classic AQM's treatment of L4S
              packets; or to ensure L4S packets bypass the AQM; or to upgrade
              the AQM to support L4S. Once L4S flows no longer shared the
              Classic ECN AQM they would obviously no longer detect it, and
              the requirement to act on it would no longer apply.</t>
            </dd>
          </dl>
          <t>The whole set of normative requirements concerning Classic ECN
          AQMs does not apply in controlled environments, such as private
          networks or data centre networks. CDN servers placed within an
          access ISP's network can be considered as a single controlled
          environment, but any onward networks served by the access network,
          including all the attached customer networks, would be unlikely to
          fall under the same degree of coordinated control. Monitoring is
          expressed as a 'MUST' for these uncontrolled segments of paths (e.g.
          beyond the access ISP in a home network), because there is a
          possibility that there might be a shared queue Classic ECN AQM in
          that segment. Nonetheless, the intent is to only require occasional
          monitoring of these uncontrolled regions, and not to burden CDN
          operators if monitoring never uncovers any potential problems, given
          it is anyway in the CDN's own interests not to degrade the service
          of its own customers.</t>
          <t>More detailed discussion of all the above options and
          alternatives can be found in <xref target="I-D.ietf-tsvwg-l4sops" format="default"/>.</t>
          <t>Having said all the above, the approach recommended in the
          requirements is to monitor, detect and act in real-time on live
          traffic. A passive monitoring algorithm to detect a Classic ECN AQM
          at the bottleneck and fall back to Classic congestion control is
          described in an extensive technical report <xref target="ecn-fallback" format="default"/>, which also provides a link to Linux source
          code, and a large online visualization of its evaluation results.
          Very briefly, the algorithm primarily monitors RTT variation using
          the same algorithm that maintains the mean deviation of TCP's
          smoothed RTT, but it smooths over a duration of the order of a
          Classic sawtooth. The outcome is also conditioned on other metrics
          such as the presence of CE marking and congestion avoidance phase
          having stabilized. The report also identifies further work to
          improve the approach, for instance improvements with low capacity
          links and combining the measurements with a cache of what had been
          learned about a path in previous connections. The report also
          suggests alternative approaches.</t>
          <t>Although using passive measurements within live traffic (as
          above) can detect a Classic ECN AQM, it is much harder (perhaps
          impossible) to determine whether or not the AQM is in a shared
          queue. Nonetheless, this is much easier using active test traffic
          out-of-band, because two flows can be used. Section 4 of the same
          report <xref target="ecn-fallback" format="default"/> describes a simple technique to
          detect a Classic ECN AQM and determine whether it is in a shared
          queue, summarized here.</t>
          <t>An L4S-enabled test server could be set up so that, when a test
          client accesses it, it serves a script that gets the client to open
          two parallel long-running flows. It could serve one with a Classic
          congestion control (C, that sets ECT(0)) and one with a scaleable CC
          (L, that sets ECT(1)).If neither flow induces any ECN marks, it can
          be presumed the path does not contain a Classic ECN AQM. If either
          flow induces some ECN marks, the server could measure the relative
          flow rates and round trip times of the two flows. <xref target="l4sid_tab_active_AQN_test" format="default"/> shows the AQM that can be
          inferred for various cases.</t>
          <table anchor="l4sid_tab_active_AQN_test" align="center">
            <name>Out-of-band testing with two parallel flows. L:=L4S, C:=Classic.</name>
            <thead>
              <tr>
                <th align="left">Rate</th>
                <th align="left">RTT</th>
                <th align="left">Inferred AQM</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">L &gt; C</td>
                <td align="left">L = C</td>
                <td align="left">Classic ECN AQM (FIFO)</td>
              </tr>
              <tr>
                <td align="left">L = C</td>
                <td align="left">L = C</td>
                <td align="left">Classic ECN AQM (FQ)</td>
              </tr>
              <tr>
                <td align="left">L = C</td>
                <td align="left">L &lt; C</td>
                <td align="left">FQ-L4S AQM</td>
              </tr>
              <tr>
                <td align="left">L ~= C</td>
                <td align="left">L &lt; C</td>
                <td align="left">Coupled DualQ AQM</td>
              </tr>
            </tbody>
          </table>
          <t>Finally, we motivate the recommendation in <xref target="l4sid_congestion_response" format="default"/> that a scalable congestion
          control is not expected to change to setting ECT(0) while it adapts
          its behaviour to coexist with Classic flows. This is because the
          sender needs to continue to check whether it made the right decision
          - and switch back if it was wrong, or if a different link becomes
          the bottleneck:</t>
          <ul spacing="normal">
            <li>If, as recommended, the sender changes only its behaviour but
              not its codepoint to Classic, its codepoint will still be
              compatible with either an L4S or a Classic AQM. If the
              bottleneck does actually support both, it will still classify
              ECT(1) into the same L4S queue, where the sender can measure
              that switching to Classic behaviour was wrong, so that it can
              switch back.</li>
            <li>In contrast, if the sender changes both its behaviour and its
              codepoint to Classic, even if the bottleneck supports both, it
              will classify ECT(0) into the Classic queue, reinforcing the
              sender's incorrect decision so that it never switches back.</li>
            <li>Also, not changing codepoint avoids the risk of being flipped
              to a different path by a load balancer or multipath routing that
              hashes on the whole of the ex-ToS byte (unfortunately still a
              common pathology).</li>
          </ul>
          <t>Note that if a flow is configured to <em>only</em>
          use a Classic congestion control, it is then entirely appropriate
          not to use ECT(1).</t>
        </section>
        <section anchor="l4sid_sec_RTT_dependence" numbered="true" toc="default">
          <name>Reduce RTT dependence</name>
          <t>Description: A scalable congestion control needs to reduce RTT
          bias as much as possible at least over the low to typical range of
          RTTs that will interact in the intended deployment scenario (see the
          precise normative requirement wording in <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: The throughput of Classic congestion controls is
          known to be inversely proportional to RTT, so one would expect flows
          over very low RTT paths to nearly starve flows over larger RTTs.
          However, Classic congestion controls have never allowed a very low
          RTT path to exist because they induce a large queue. For instance,
          consider two paths with base RTT 1 ms and 100 ms. If a
          Classic congestion control induces a 100 ms queue, it turns
          these RTTs into 101 ms and 200 ms leading to a throughput
          ratio of about 2:1. Whereas if a scalable congestion control induces
          only a 1 ms queue, the ratio is 2:101, leading to a throughput
          ratio of about 50:1.</t>
          <t>Therefore, with very small queues, long RTT flows will
          essentially starve, unless scalable congestion controls comply with
          this requirement.</t>
          <t>The RTT bias in current Classic congestion controls works
          satisfactorily when the RTT is higher than typical, and L4S does not
          change that. So, there is no additional requirement for high RTT L4S
          flows to remove RTT bias - they can but they don't have to.</t>
        </section>
        <section anchor="l4sid_sec_min_cwnd" numbered="true" toc="default">
          <name>Scaling down to fractional congestion windows</name>
          <t>Description: A scalable congestion control needs to remain
          responsive to congestion when typical RTTs over the public Internet
          are significantly smaller because they are no longer inflated by
          queuing delay (see the precise normative requirement wording in
          <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: As currently specified, the minimum congestion window
          of ECN-capable TCP (and its derivatives) is expected to be 2 sender
          maximum segment sizes (SMSS), or 1 SMSS after a retransmission
          timeout. Once the congestion window reaches this minimum, if there
          is further ECN-marking, TCP is meant to wait for a retransmission
          timeout before sending another segment (see section 6.1.2 of <xref target="RFC3168" format="default"/>). In practice, most known window-based congestion
          control algorithms become unresponsive to congestion signals at this
          point. No matter how much drop or ECN marking, the congestion window
          no longer reduces. Instead, the sender's lack of any further
          congestion response forces the queue to grow, overriding any AQM and
          increasing queuing delay (making the window large enough to become
          responsive again).</t>
          <t>Most congestion controls for other transport protocols have a
          similar minimum, albeit when measured in bytes for those that use
          smaller packets.</t>
          <t>L4S mechanisms significantly reduce queueing delay so, over the
          same path, the RTT becomes lower. Then this problem becomes
          surprisingly common <xref target="sub-mss-prob" format="default"/>. This is because,
          for the same link capacity, smaller RTT implies a smaller window.
          For instance, consider a residential setting with an upstream
          broadband Internet access of 8 Mb/s, assuming a max segment
          size of 1500 B. Two upstream flows will each have the minimum
          window of 2 SMSS if the RTT is 6 ms or less, which is
          quite common when accessing a nearby data centre. So, any more than
          two such parallel TCP flows will become unresponsive and increase
          queuing delay.</t>
          <t>Unless scalable congestion controls address this requirement from
          the start, they will frequently become unresponsive, negating the
          low latency benefit of L4S, for themselves and for others.</t>
          <t>That would seem to imply that scalable congestion controllers
          ought to be required to be able work with a congestion window less
          than 1 SMSS. For instance, if an ECN-capable TCP gets an
          ECN-mark when it is already sitting at a window of 1 SMSS, RFC
          3168 requires it to defer sending for a retransmission timeout. A
          less drastic but more complex mechanism can maintain a congestion
          window less than 1 SMSS (significantly less if necessary), as
          described in <xref target="Ahmed19" format="default"/>. Other approaches are likely
          to be feasible.</t>
          <t>However, the requirement in <xref target="l4sid_congestion_response" format="default"/> is worded as a "SHOULD" because
          the existence of a minimum window is not all bad. When competing
          with an unresponsive flow, a minimum window naturally protects the
          flow from starvation by at least keeping some data flowing.</t>
          <t>By stating the requirement to go lower than 1 SMSS as a
          "SHOULD", while the requirement in RFC 3168 still stands as well, we
          shall be able to watch the choices of minimum window evolve in
          different scalable congestion controllers.</t>
          <!--			Requirement #3.5: Smoothing ECN feedback

			Description: The ratio of marked packets CE marks received by the scalable transport sender are averaged 
-->
        </section>
        <section anchor="l4sid_sec_reordering_tolerance" numbered="true" toc="default">
          <name>Measuring Reordering Tolerance in Time Units</name>
          <t>Description: When detecting loss, a scalable congestion control
          needs to be tolerant to reordering over an adaptive time interval,
          which scales with throughput, rather than counting only in fixed
          units of packets, which does not scale (see the precise normative
          requirement wording in <xref target="l4sid_congestion_response" format="default"/>).</t>
          <t>Motivation: A primary purpose of L4S is scalable throughput (it's
          in the name). Scalability in all dimensions is, of course, also a
          goal of all IETF technology. The inverse linear congestion response
          in <xref target="l4sid_congestion_response" format="default"/> is necessary, but not
          sufficient, to solve the congestion control scalability problem
          identified in <xref target="RFC3649" format="default"/>. As well as maintaining
          frequent ECN signals as rate scales, it is also important to ensure
          that a potentially false perception of loss does not limit
          throughput scaling.</t>
          <t>End-systems cannot know whether a missing packet is due to loss
          or reordering, except in hindsight - if it appears later. So they
          can only deem that there has been a loss if a gap in the sequence
          space has not been filled, either after a certain number of
          subsequent packets has arrived (e.g. the 3 DupACK rule of
          standard TCP congestion control <xref target="RFC5681" format="default"/>) or after a
          certain amount of time (e.g. the RACK approach <xref target="RFC8985" format="default"/>).</t>
          <t>As we attempt to scale packet rate over the years:</t>
          <ul spacing="normal">
            <li>Even if only <em>some</em> sending hosts
              still deem that loss has occurred by counting reordered packets,
              <em>all</em> networks will have to keep
              reducing the time over which they keep packets in order. If some
              link technologies keep the time within which reordering occurs
              roughly unchanged, then loss over these links, as perceived by
              these hosts, will appear to continually rise over the years.</li>
            <li>In contrast, if all senders detect loss in units of time, the
              time over which the network has to keep packets in order stays
              roughly invariant.</li>
          </ul>
          <t>Therefore hosts have an incentive to detect loss in time
          units (so as not to fool themselves too often into detecting losses
          when there are none). And for hosts that are changing their
          congestion control implementation to L4S, there is no downside to
          including time-based loss detection code in the change (loss
          recovery implemented in hardware is an exception, covered later).
          Therefore requiring L4S hosts to detect loss in time-based units
          would not be a burden.</t>
          <t>If this requirement is not placed on L4S hosts, even though it
          would be no burden on them to do so, all networks will face
          unnecessary uncertainty over whether some L4S hosts might be
          detecting loss by counting packets. Then <em>all</em>
          link technologies will have to unnecessarily keep reducing the time
          within which reordering occurs. That is not a problem for some link
          technologies, but it becomes increasingly challenging for other link
          technologies to continue to scale, particularly those relying on
          channel bonding for scaling, such as LTE, 5G and DOCSIS.</t>
          <t>Given Internet paths traverse many link technologies, any scaling
          limit for these more challenging access link technologies would
          become a scaling limit for the Internet as a whole.</t>
          <t>It might be asked how it helps to place this loss detection
          requirement only on L4S hosts, because networks will still face
          uncertainty over whether non-L4S flows are detecting loss by
          counting DupACKs. The answer is that those link technologies for
          which it is challenging to keep squeezing the reordering time will
          only need to do so for non-L4S traffic (which they can do because
          the L4S identifier is visible at the IP layer). Therefore, they can
          focus their processing and memory resources into scaling non-L4S
          (Classic) traffic. Then, the higher the proportion of L4S traffic,
          the less of a scaling challenge they will have.</t>
          <t>To summarize, there is no reason for L4S hosts not to be part of
          the solution instead of part of the problem.</t>
          <t>Requirement ("MUST") or recommendation ("SHOULD")? As explained
          above, this is a subtle interoperability issue between hosts and
          networks, which seems to need a "MUST". Unless networks can be
          certain that all L4S hosts follow the time-based approach, they
          still have to cater for the worst case - continually squeeze
          reordering into a smaller and smaller duration - just for hosts that
          might be using the counting approach. However, it was decided to
          express this as a recommendation, using "SHOULD". The main
          justification was that networks can still be fairly certain that L4S
          hosts will follow this recommendation, because following it offers
          only gain and no pain.</t>
          <t>Details:</t>
          <t>The speed of loss recovery is much more significant for short
          flows than long, therefore a good compromise is to adapt the
          reordering window; from a small fraction of the RTT at the start of
          a flow, to a larger fraction of the RTT for flows that continue for
          many round trips.</t>
          <t>This is broadly the approach adopted by TCP RACK (Recent
          ACKnowledgements) <xref target="RFC8985" format="default"/>. However, RACK starts
          with the 3 DupACK approach, because the RTT estimate is not
          necessarily stable. As long as the initial window is paced, such
          initial use of 3 DupACK counting would amount to time-based loss
          detection and therefore would satisfy the time-based loss detection
          recommendation of <xref target="l4sid_congestion_response" format="default"/>. This
          is because pacing of the initial window would ensure that 3 DupACKs
          early in the connection would be spread over a small fraction of the
          round trip.</t>
          <t>As mentioned above, hardware implementations of loss recovery
          using DupACK counting exist (e.g. some implementations of
          RoCEv2 for RDMA). For low latency, these implementations can change
          their congestion control to implement L4S, because the congestion
          control (as distinct from loss recovery) is implemented in software.
          But they cannot easily satisfy this loss recovery requirement.
          However, it is believed they do not need to, because such
          implementations are believed to solely exist in controlled
          environments, where the network technology keeps reordering
          extremely low anyway. This is why controlled environments with
          hardly any reordering are excluded from the scope of the normative
          recommendation in <xref target="l4sid_congestion_response" format="default"/>.</t>
          <t>Detecting loss in time units also prevents the ACK-splitting
          attacks described in <xref target="Savage-TCP" format="default"/>.</t>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Scalable Transport Protocol Optimizations</name>
        <t/>
        <section numbered="true" toc="default">
          <name>Setting ECT in Control Packets and Retransmissions</name>
          <t>Description: This item concerns TCP and its derivatives
          (e.g. SCTP) as well as RTP/RTCP <xref target="RFC6679" format="default"/>. The
          original specification of ECN for TCP precluded the use of ECN on
          control packets and retransmissions. To improve performance,
          scalable transport protocols ought to enable ECN at the IP layer in
          TCP control packets (SYN, SYN-ACK, pure ACKs, etc.) and in
          retransmitted packets. The same is true for derivatives of TCP,
          e.g. SCTP. Similarly <xref target="RFC6679" format="default"/> precludes the use
          of ECT on RTCP datagrams, in case the path changes after it has been
          checked for ECN traversal.</t>
          <t>Motivation (TCP): RFC 3168 prohibits the use of ECN on these
          types of TCP packet, based on a number of arguments. This means
          these packets are not protected from congestion loss by ECN, which
          considerably harms performance, particularly for short flows. <xref target="I-D.ietf-tcpm-generalized-ecn" format="default"/> proposes experimental use
          of ECN on all types of TCP packet as long as AccECN feedback <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> is available (which itself
          satisfies the accurate feedback requirement in <xref target="l4sid_feedback" format="default"/> for using a scalable congestion
          control).</t>
          <t>Motivation (RTCP): L4S experiments in general will need to
          observe the rule in <xref target="RFC6679" format="default"/> that precludes ECT on
          RTCP datagrams. Nonetheless, as ECN usage becomes more widespread,
          it would be useful to conduct specific experiments with ECN-capable
          RTCP to gather data on whether such caution is necessary.</t>
        </section>
        <section numbered="true" toc="default">
          <name>Faster than Additive Increase</name>
          <t>Description: It would improve performance if scalable congestion
          controls did not limit their congestion window increase to the
          standard additive increase of 1 SMSS per round trip <xref target="RFC5681" format="default"/> during congestion avoidance. The same is true for
          derivatives of TCP congestion control, including similar approaches
          used for real-time media.</t>
          <t>Motivation: As currently defined <xref target="RFC8257" format="default"/>, DCTCP
          uses the traditional Reno additive increase in congestion avoidance
          phase. When the available capacity suddenly increases
          (e.g. when another flow finishes, or if radio capacity
          increases) it can take very many round trips to take advantage of
          the new capacity. TCP Cubic was designed to solve this problem, but
          as flow rates have continued to increase, the delay accelerating
          into available capacity has become prohibitive. See, for instance,
          the examples in <xref target="l4sid_Terminology" format="default"/>. Even when out of
          its Reno-compatibility mode, every 8x scaling of Cubic's flow rate
          leads to 2x more acceleration delay.</t>
          <t>In the steady state, DCTCP induces about 2 ECN marks per round
          trip, so it is possible to quickly detect when these signals have
          disappeared and seek available capacity more rapidly, while
          minimizing the impact on other flows (Classic and scalable) <xref target="LinuxPacedChirping" format="default"/>. Alternatively, approaches such as
          Adaptive Acceleration (A2DTCP <xref target="A2DTCP" format="default"/>) have been
          proposed to address this problem in data centres, which might be
          deployable over the public Internet.</t>
        </section>
        <section numbered="true" toc="default">
          <name>Faster Convergence at Flow Start</name>
          <t>Description: It would improve performance if scalable congestion
          controls converged (reached their steady-state share of the
          capacity) faster than Classic congestion controls or at least no
          slower. This affects the flow start behaviour of any L4S congestion
          control derived from a Classic transport that uses TCP slow start,
          including those for real-time media.</t>
          <t>Motivation: As an example, a new DCTCP flow takes longer than a
          Classic congestion control to obtain its share of the capacity of
          the bottleneck when there are already ongoing flows using the
          bottleneck capacity. In a data centre environment DCTCP takes about
          a factor of 1.5 to 2 longer to converge due to the much higher
          typical level of ECN marking that DCTCP background traffic induces,
          which causes new flows to exit slow start early <xref target="Alizadeh-stability" format="default"/>. In testing for use over the public
          Internet the convergence time of DCTCP relative to a regular
          loss-based TCP slow start is even less favourable <xref target="Paced-Chirping" format="default"/> due to the shallow ECN marking threshold
          needed for L4S. It is exacerbated by the typically greater mismatch
          between the link rate of the sending host and typical Internet
          access bottlenecks. This problem is detrimental in general, but
          would particularly harm the performance of short flows relative to
          Classic congestion controls.</t>
        </section>
      </section>
    </section>
    <section anchor="l4sid_ECT1_CE" numbered="true" toc="default">
      <name>Compromises in the Choice of L4S Identifier</name>
      <t>This appendix is informative, not normative. As explained in <xref target="l4sid_reqs" format="default"/>, there is insufficient space in the IP header (v4
      or v6) to fully accommodate every requirement. So the choice of L4S
      identifier involves tradeoffs. This appendix records the pros and cons
      of the choice that was made.</t>
      <t>Non-normative recap of the chosen codepoint scheme:</t>
      <ul empty="true" spacing="normal">
        <li>
          <t>Packets with ECT(1) and conditionally packets with CE signify L4S
          semantics as an alternative to the semantics of Classic ECN <xref target="RFC3168" format="default"/>, specifically:</t>
          <ul spacing="normal">
            <li>The ECT(1) codepoint signifies that the packet was sent by an
              L4S-capable sender.</li>
            <li>Given shortage of codepoints, both L4S and Classic ECN sides
              of an AQM have to use the same CE codepoint to indicate that a
              packet has experienced congestion. If a packet that had already
              been marked CE in an upstream buffer arrived at a subsequent
              AQM, this AQM would then have to guess whether to classify CE
              packets as L4S or Classic ECN. Choosing the L4S treatment is a
              safer choice, because then a few Classic packets might arrive
              early, rather than a few L4S packets arriving late.</li>
            <li>Additional information might be available if the classifier
              were transport-aware. Then it could classify a CE packet for
              Classic ECN treatment if the most recent ECT packet in the same
              flow had been marked ECT(0). However, the L4S service ought not
              to need tranport-layer awareness.</li>
          </ul>
        </li>
      </ul>
      <t>Cons:</t>
      <dl newline="false" spacing="normal">
        <dt>Consumes the last ECN codepoint:</dt>
        <dd>The L4S service could
          potentially supersede the service provided by Classic ECN, therefore
          using ECT(1) to identify L4S packets could ultimately mean that the
          ECT(0) codepoint was 'wasted' purely to distinguish one form of ECN
          from its successor.</dd>
        <dt>ECN hard in some lower layers:</dt>
        <dd>It is not always
          possible to support the equivalent of an IP-ECN field in an AQM
          acting in a buffer below the IP layer <xref target="I-D.ietf-tsvwg-ecn-encap-guidelines" format="default"/>. Then, depending on
          the lower layer scheme, the L4S service might have to drop rather
          than mark frames even though they might encapsulate an ECN-capable
          packet.</dd>
        <dt>Risk of reordering Classic CE packets within a flow:</dt>
        <dd anchor="l4sid_CE_reordering">
          <t>Classifying
          all CE packets into the L4S queue risks any CE packets that were
          originally ECT(0) being incorrectly classified as L4S. If there were
          delay in the Classic queue, these incorrectly classified CE packets
          would arrive early, which is a form of reordering. Reordering within
          a microflow can cause TCP senders (and senders of similar
          transports) to retransmit spuriously. However, the risk of spurious
          retransmissions would be extremely low for the following
          reasons:</t>
          <ol spacing="normal" type="1"><li>It is quite unusual to experience queuing at more than one
              bottleneck on the same path (the available capacities have to be
              identical).</li>
            <li>In only a subset of these unusual cases would the first
              bottleneck support Classic ECN marking while the second
              supported L4S ECN marking, which would be the only scenario
              where some ECT(0) packets could be CE marked by an AQM
              supporting Classic ECN then the remainder experienced further
              delay through the Classic side of a subsequent L4S DualQ
              AQM.</li>
            <li>
              <t>Even then, when a few packets are delivered early, it takes
              very unusual conditions to cause a spurious retransmission, in
              contrast to when some packets are delivered late. The first
              bottleneck has to apply CE-marks to at least N contiguous
              packets and the second bottleneck has to inject an uninterrupted
              sequence of at least N of these packets between two packets
              earlier in the stream (where N is the reordering window that the
              transport protocol allows before it considers a packet is
              lost).</t>
              <ul empty="true" spacing="normal">
                <li>For example consider N=3, and consider the sequence of
                  packets 100, 101, 102, 103,... and imagine that packets
                  150,151,152 from later in the flow are injected as follows:
                  100, 150, 151, 101, 152, 102, 103... If this were late
                  reordering, even one packet arriving out of sequence would
                  trigger a spurious retransmission, but there is no spurious
                  retransmission here with early reordering, because packet
                  101 moves the cumulative ACK counter forward before 3
                  packets have arrived out of order. Later, when packets 148,
                  149, 153... arrive, even though there is a 3-packet hole,
                  there will be no problem, because the packets to fill the
                  hole are already in the receive buffer.</li>
              </ul>
            </li>
            <li>Even with the current TCP recommendation of N=3 <xref target="RFC5681" format="default"/> spurious retransmissions will be unlikely for
              all the above reasons. As RACK <xref target="RFC8985" format="default"/> is
              becoming widely deployed, it tends to adapt its reordering
              window to a larger value of N, which will make the chance of a
              contiguous sequence of N early arrivals vanishingly small.</li>
            <li>Even a run of 2 CE marks within a Classic ECN flow is
              unlikely, given FQ-CoDel is the only known widely deployed AQM
              that supports Classic ECN marking and it takes great care to
              separate out flows and to space any markings evenly along each
              flow.</li>
          </ol>
          <t>It is extremely unlikely that the above set of 5
          eventualities that are each unusual in themselves would all happen
          simultaneously. But, even if they did, the consequences would hardly
          be dire: the odd spurious fast retransmission. Whenever the traffic
          source (a Classic congestion control) mistakes the reordering of a
          string of CE marks for a loss, one might think that it will reduce
          its congestion window as well as emitting a spurious retransmission.
          However, it would have already reduced its congestion window when
          the CE markings arrived early. If it is using ABE <xref target="RFC8511" format="default"/>, it might reduce cwnd a little more for a loss
          than for a CE mark. But it will revert that reduction once it
          detects that the retransmission was spurious.</t>
          <t>In conclusion, the impact of early reordering on
          spurious retransmissions due to CE being ambiguous will generally be
          vanishingly small.</t>
        </dd>
        <dt>Insufficient anti-replay window in some pre-existing VPNs:</dt>
        <dd>If
          delay is reduced for a subset of the flows within a VPN, the
          anti-replay feature of some VPNs is known to potentially mistake the
          difference in delay for a replay attack. <xref target="l4sid_VPN_anti-replay" format="default"/> recommends that the anti-replay
          window at the VPN egress is sufficiently sized, as required by the
          relevant specifications. However, in some VPN implementations the
          maximum anti-replay window is insufficient to cater for a large
          delay difference at prevailing packet rates. <xref target="l4sid_VPN_anti-replay" format="default"/> suggests alternative work-rounds
          for such cases, but end-users using L4S over a VPN will need to be
          able to recognize the symptoms of this problem, in order to seek out
          these work-rounds.</dd>
        <dt>Hard to distinguish Classic ECN AQM:</dt>
        <dd>
          <t>With this scheme,
          when a source receives ECN feedback, it is not explicitly clear
          which type of AQM generated the CE markings. This is not a problem
          for Classic ECN sources that send ECT(0) packets, because an L4S AQM
          will recognize the ECT(0) packets as Classic and apply the
          appropriate Classic ECN marking behaviour.</t>
          <t>However, in the absence of explicit disambiguation
          of the CE markings, an L4S source needs to use heuristic techniques
          to work out which type of congestion response to apply (see <xref target="l4sid_sec_fallback_on_classic_CE" format="default"/>). Otherwise, if
          long-running Classic flow(s) are sharing a Classic ECN AQM
          bottleneck with long-running L4S flow(s), which then apply an L4S
          response to Classic CE signals, the L4S flows would outcompete the
          Classic flow(s). Experiments have shown that L4S flows can take
          about 20 times more capacity share than equivalent Classic flows.
          Nonetheless, as link capacity reduces (e.g. to 4 Mb/s), the
          inequality reduces. So Classic flows always make progress and are
          not starved.</t>
          <t>When L4S was first proposed (in
          2015, 14 years after <xref target="RFC3168" format="default"/> was published), it was
          believed that Classic ECN AQMs had failed to be deployed, because
          research measurements had found little or no evidence of CE marking.
          In subsequent years Classic ECN was included in per-flow-queuing
          (FQ) deployments, however an FQ scheduler stops an L4S flow
          outcompeting Classic, because it enforces equality between flow
          rates. It is not known whether there have been any non-FQ
          deployments of Classic ECN AQMs in the subsequent years, or whether
          there will be in future.</t>
          <t>An algorithm for
          detecting a Classic ECN AQM as soon as a flow stabilizes after
          start-up has been proposed <xref target="ecn-fallback" format="default"/> (see <xref target="l4sid_sec_fallback_on_classic_CE" format="default"/> for a brief summary).
          Testbed evaluations of v2 of the algorithm have shown detection is
          reasonably good for Classic ECN AQMs, in a wide range of
          circumstances. However, although it can correctly detect an L4S ECN
          AQM in many circumstances, its is often incorrect at low link
          capacities and/or high RTTs. Although this is the safe way round,
          there is a danger that it will discourage use of the algorithm.</t>
        </dd>
        <dt>Non-L4S service for control packets:</dt>
        <dd>Solely for the
          case of TCP, the Classic ECN RFCs <xref target="RFC3168" format="default"/> and <xref target="RFC5562" format="default"/> require a sender to clear the ECN field to
          Not-ECT on retransmissions and on certain control packets
          specifically pure ACKs, window probes and SYNs. When L4S packets are
          classified by the ECN field, these TCP control packets would not be
          classified into an L4S queue, and could therefore be delayed
          relative to the other packets in the flow. This would not cause
          reordering (because retransmissions are already out of order, and
          these control packets typically carry no data). However, it would
          make critical TCP control packets more vulnerable to loss and delay.
          To address this problem, <xref target="I-D.ietf-tcpm-generalized-ecn" format="default"/> proposes an experiment in
          which all TCP control packets and retransmissions are ECN-capable as
          long as appropriate ECN feedback is available in each case.</dd>
      </dl>
      <t>Pros:</t>
      <dl newline="false" spacing="normal">
        <dt>Should work e2e:</dt>
        <dd>The ECN field generally propagates
          end-to-end across the Internet without being wiped or mangled, at
          least over fixed networks. Unlike the DSCP, the setting of the ECN
          field is at least meant to be forwarded unchanged by networks that
          do not support ECN.</dd>
        <dt>Should work in tunnels:</dt>
        <dd>The L4S identifiers work
          across and within any tunnel that propagates the ECN field in any of
          the variant ways it has been defined since ECN-tunneling was first
          specified in the year 2001 <xref target="RFC3168" format="default"/>. However, it is
          likely that some tunnels still do not implement ECN propagation at
          all.</dd>
        <dt>Should work for many link technologies:</dt>
        <dd>At most, but
          not all, path bottlenecks there is IP-awareness, so that L4S AQMs
          can be located where the IP-ECN field can be manipulated.
          Bottlenecks at lower layer nodes without IP-awareness either have to
          use drop to signal congestion or a specific congestion notification
          facility has to be defined for that link technology, including
          propagation to and from IP-ECN. The programme to define these is
          progressing and in each case so far the scheme already defined for
          ECN inherently supports L4S as well (see <xref target="l4sid_encaps_no_change" format="default"/>).</dd>
        <dt>Could migrate to one codepoint:</dt>
        <dd>If all Classic ECN
          senders eventually evolve to use the L4S service, the ECT(0)
          codepoint could be reused for some future purpose, but only once use
          of ECT(0) packets had reduced to zero, or near-zero, which might
          never happen.</dd>
        <dt>L4 not required:</dt>
        <dd>Being based on the ECN field, this
          scheme does not need the network to access transport layer flow
          identifiers. Nonetheless, it does not preclude solutions that
          do.</dd>
      </dl>
    </section>
    <section numbered="true" toc="default">
      <name>Potential Competing Uses for the ECT(1) Codepoint</name>
      <t>The ECT(1) codepoint of the ECN field has already been assigned once
      for the ECN nonce <xref target="RFC3540" format="default"/>, which has now been
      categorized as historic <xref target="RFC8311" format="default"/>. ECN is probably the
      only remaining field in the Internet Protocol that is common to IPv4 and
      IPv6 and still has potential to work end-to-end, with tunnels and with
      lower layers. Therefore, ECT(1) should not be reassigned to a different
      experimental use (L4S) without carefully assessing competing potential
      uses. These fall into the following categories:</t>
      <section anchor="l4sid_competing_integrity" numbered="true" toc="default">
        <name>Integrity of Congestion Feedback</name>
        <t>Receiving hosts can fool a sender into downloading faster by
        suppressing feedback of ECN marks (or of losses if retransmissions are
        not necessary or available otherwise).</t>
        <t>The historic ECN nonce protocol <xref target="RFC3540" format="default"/> proposed
        that a TCP sender could set either of ECT(0) or ECT(1) in each packet
        of a flow and remember the sequence it had set. If any packet was lost
        or congestion marked, the receiver would miss that bit of the
        sequence. An ECN Nonce receiver had to feed back the least significant
        bit of the sum, so it could not suppress feedback of a loss or mark
        without a 50-50 chance of guessing the sum incorrectly.</t>
        <t>It is highly unlikely that ECT(1) will be needed for integrity
        protection in future. The ECN Nonce RFC <xref target="RFC3540" format="default"/> as
        been reclassified as historic, partly because other ways have been
        developed to protect feedback integrity of TCP and other transports
        <xref target="RFC8311" format="default"/> that do not consume a codepoint in the IP
        header. For instance:</t>
        <ul spacing="normal">
          <li>the sender can test the integrity of the receiver's feedback by
            occasionally setting the IP-ECN field to a value normally only set
            by the network. Then it can test whether the receiver's feedback
            faithfully reports what it expects (see para 2 of Section 20.2 of
            <xref target="RFC3168" format="default"/>. This works for loss and it will work for
            the accurate ECN feedback <xref target="RFC7560" format="default"/> intended for
            L4S.</li>
          <li>A network can enforce a congestion response to its ECN markings
            (or packet losses) by auditing congestion exposure (ConEx) <xref target="RFC7713" format="default"/>. Whether the receiver or a downstream network
            is suppressing congestion feedback or the sender is unresponsive
            to the feedback, or both, ConEx audit can neutralise any advantage
            that any of these three parties would otherwise gain.</li>
          <li>The TCP authentication option (TCP-AO <xref target="RFC5925" format="default"/>)
            can be used to detect any tampering with TCP congestion feedback
            (whether malicious or accidental). TCP's congestion feedback
            fields are immutable end-to-end, so they are amenable to TCP-AO
            protection, which covers the main TCP header and TCP options by
            default. However, TCP-AO is often too brittle to use on many
            end-to-end paths, where middleboxes can make verification fail in
            their attempts to improve performance or security, e.g. by
            resegmentation or shifting the sequence space.</li>
        </ul>
      </section>
      <section numbered="true" toc="default">
        <name>Notification of Less Severe Congestion than CE</name>
        <t>Various researchers have proposed to use ECT(1) as a less severe
        congestion notification than CE, particularly to enable flows to fill
        available capacity more quickly after an idle period, when another
        flow departs or when a flow starts, e.g. VCP <xref target="VCP" format="default"/>, Queue View (QV) <xref target="QV" format="default"/>.</t>
        <t>Before assigning ECT(1) as an identifier for L4S, we must carefully
        consider whether it might be better to hold ECT(1) in reserve for
        future standardisation of rapid flow acceleration, which is an
        important and enduring problem <xref target="RFC6077" format="default"/>.</t>
        <t>Pre-Congestion Notification (PCN) is another scheme that assigns
        alternative semantics to the ECN field. It uses ECT(1) to signify a
        less severe level of pre-congestion notification than CE <xref target="RFC6660" format="default"/>. However, the ECN field only takes on the PCN
        semantics if packets carry a Diffserv codepoint defined to indicate
        PCN marking within a controlled environment. PCN is required to be
        applied solely to the outer header of a tunnel across the controlled
        region in order not to interfere with any end-to-end use of the ECN
        field. Therefore a PCN region on the path would not interfere with the
        L4S service identifier defined in <xref target="l4sid_identification" format="default"/>.</t>
      </section>
    </section>
    <!--    <section title="Change Log (to be Deleted before Publication)">
      <t>A detailed version history can be accessed at
      &lt;http://datatracker.ietf.org/doc/draft-briscoe-aqm-ecn-roadmap/history/&gt;</t>

      <t><list style="hanging">
          <t hangText="From briscoe-...-00 to briscoe-...-01:">Technical
          changes:<list style="symbols">
              <t/>
            </list>Editorial changes:<list style="symbols">
              <t/>
            </list></t>
        </list></t>
    </section>
-->
  </back>
</rfc>
