<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
    which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?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 category="info" docName="draft-briscoe-tsvwg-l4s-diffserv-02"
     ipr="trust200902" obsoletes="">
  <!-- 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="Interactions between L4S and Diffserv">Interactions between
    Low Latency, Low Loss, Scalable Throughput (L4S) and Differentiated
    Services</title>

    <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
      <organization>CableLabs</organization>

      <address>
        <postal>
          <street/>

          <country>UK</country>
        </postal>

        <email>ietf@bobbriscoe.net</email>

        <uri>http://bobbriscoe.net/</uri>
      </address>
    </author>

    <date day="01" month="" year="2018"/>

    <area>Transport</area>

    <workgroup>Transport Area Working Group</workgroup>

    <keyword>Internet-Draft</keyword>

    <keyword>I-D</keyword>

    <abstract>
      <t>L4S and Diffserv offer somewhat overlapping services (low latency and
      low loss), but bandwidth allocation is out of scope for L4S. Therefore
      there is scope for the two approaches to complement each other, but also
      to conflict. This informational document explains how the two approaches
      interact, how they can be arranged to complement each other and in which
      cases one can stand alone without needing the other.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="l4sds_intro" title="Introduction">
      <t>The Low Latency Low Loss Scalable throughput (L4S) Internet service
      <xref target="I-D.ietf-tsvwg-l4s-arch"/> provides a new Internet service
      that could eventually replace best efforts, but with ultra-low queuing
      delay and loss. A structure called the Dual-Queue Coupled AQM manages to
      provide the L4S service alongside a second queue for Classic Internet
      traffic, but without prejudging the bandwidth allocations between them.
      L4S is orthogonal to allocation of bandwidth, so it can be complemented
      by various bandwidth allocation approaches without prejudging which
      one.</t>

      <t>The Differentiated Services (Diffserv) architecture <xref
      target="RFC2475"/> provides for various service classes, some defined
      globally, others defined locally per network domain. Certain of these
      service classes offer low latency and low loss, as well as
      differentiated allocation of bandwidth.</t>

      <t>Thus, L4S and Diffserv offer somewhat overlapping services (low
      latency and low loss), but bandwidth allocation is out of scope for L4S.
      Therefore there is scope for the two approaches to complement each
      other, but also to conflict. This informational document explains how
      the two approaches interact, how they can be arranged to complement each
      other and in which cases one can stand alone without needing the
      other.</t>

      <section anchor="l4sds_Terminology" title="Terminology">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <xref
        target="RFC2119"/>. 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>

        <t><list style="hanging">
            <t hangText="Classic service:">The 'Classic' service is intended
            for all the congestion control behaviours that currently co-exist
            with TCP Reno <xref target="RFC5681"/> (e.g. TCP Cubic, Compound,
            SCTP, etc).</t>

            <t
            hangText="Low-Latency, Low-Loss and Scalable (L4S) service:">The
            'L4S' service is intended for traffic from scalable congestion
            control algorithms such as Data Centre TCP <xref
            target="RFC8257"/>. But it is also more general&mdash;it will
            allow a set of congestion controls with similar scaling properties
            to DCTCP to evolve.<vspace blankLines="1"/>Both Classic and L4S
            services can cope with a proportion of unresponsive or
            less-responsive traffic as well (e.g. DNS, VoIP, etc).</t>

            <t hangText="Pure L4S:">L4S without unresponsive traffic.</t>

            <t hangText="Scalable Congestion Control:">See <xref
            target="I-D.ietf-tsvwg-l4s-arch"/> for definition.</t>

            <t hangText="Classic Congestion Control:">See <xref
            target="I-D.ietf-tsvwg-l4s-arch"/> for definition.</t>

            <t hangText="DualQ:">Abbreviation for Dual-Queue Coupled AQM <xref
            target="I-D.ietf-tsvwg-aqm-dualq-coupled"/>, which is not a
            specific AQM, but a framework for coupling two AQMs in order to
            provide L4S service while doing no harm to 'Classic' traffic from
            traditional sources.</t>

            <t hangText="ECN field:">The Explicit Congestion Notification
            field <xref target="RFC3168"/> in the IP header (v4 or v6). <xref
            target="RFC8311"/> has relaxed some of the restrictions that RFC
            3168 placed on the use of ECN, in order to enable experiments like
            L4S, among others.</t>

            <t hangText="Site:">A home, mobile device, small enterprise or
            campus, where the network bottleneck is typically the access link
            to the site. Not all network arrangements fit this model but it is
            a useful, widely applicable generalisation.</t>
          </list></t>
      </section>

      <section anchor="l4sds_doc_roadmap" title="Document Roadmap">
        <t>{ToDo}</t>
      </section>
    </section>

    <section anchor="l4sds_arch_comparison"
             title="Architectural Comparison of L4S and Diffserv">
      <t>This section compares the L4S architecture <xref
      target="I-D.ietf-tsvwg-l4s-arch"/> with the Diffserv architecture <xref
      target="RFC2475"/>.</t>

      <t>L4S uses an identifier <xref target="I-D.ietf-tsvwg-ecn-l4s-id"/> in
      the ECN field in IP packet headers that is orthogonal to the Diffserv
      field <xref target="RFC2474"/>. This is because the two approaches can
      either overlap or complement each other, as outlined in the following
      two subsections.</t>

      <section anchor="l4sds_arch_overlaps"
               title="Overlaps between L4S and Diffserv">
        <t>L4S provides a low queuing latency, low loss Internet Service.
        Specific Diffserv service classes also provide low latency and low
        loss.</t>

        <t>This means that it is possible to mix traffic from certain Diffserv
        classes in the same queue as L4S traffic (see <xref
        target="l4sds_mapping_DS_L4S"/>).</t>
      </section>

      <section anchor="l4sds_arch_diffs"
               title="Differences between L4S and Diffserv">
        <t><list style="hanging">
            <t hangText="Bandwidth allocation:">L4S is orthogonal to
            allocation of bandwidth, so it can be complemented by various
            bandwidth allocation approaches without prejudging which one. In
            contrast, with Diffserv it was never possible to completely
            separate control of latency and loss from allocation of bandwidth.
            The only bandwidth-related aspect of L4S is that it ensures that
            the capacity seeking behaviour of end-systems can scale with
            increasing flow rate.</t>

            <t hangText="Differentiation vs. General improvement:">Diffserv
            concerns give and take of bandwidth, latency and loss between
            traffic classes. In contrast, the separation of L4S from Classic
            traffic in separate queues concerns incremental deployment of a
            general improvement in latency and loss, without taking from the
            other queue.</t>

            <t hangText="Open vs. closed loop control:">The Diffserv
            architecture requires the source to keep traffic within a contract
            and, failing that, it has mechanisms to enforce the contract. In
            this respect, Diffserv is an open-loop control system that is
            primarily concerned with keeping traffic within capacity limits.
            Nonetheless, there is an element of closed-loop control in
            Diffserv. The weighted AQM (e.g. WRED) used for Assured Forwarding
            <xref target="RFC2597"/> expects traffic to seek to fill capacity
            and exploits the response to feedback of congestion controllers at
            traffic sources (closed-loop). Nonetheless, the Diffserv
            architecture still provides for traffic conditioners that tag
            traffic that is outside the bandwidth contract for each AF class
            (open-loop). Then out-of-contract traffic can be discarded if it
            would otherwise lead to congestion.<vspace blankLines="1"/>L4S
            uses a similar closed-loop mechanism to the weighted AQM used in
            Diffserv AF in order to ensure roughly equal per-flow throughput
            between the L4S and Classic queues. That is, L4S relies on the
            source's closed-loop response to feedback, not any open-loop
            obligation of each source to keep within a traffic contract. With
            L4S, any enforcement of per-flow throughput (whether open-loop or
            closed) is set aside as a separate issue that may or may not be
            addressed by separate mechanisms, dependent on policy.</t>

            <t hangText="Per bottleneck vs. per domain:">L4S can be
            independently and incrementally deployed at certain bottlenecks.
            In contrast a Diffserv system is domain-based consisting of the
            per-hop behaviour of interior nodes and the traffic conditioning
            behaviour of boundary nodes, which have to be deployed as a
            coordinated whole.</t>

            <t hangText="Degree of multiplexing:">Diffserv components such as
            traffic conditioning are less applicable in access networks where
            statistical multiplexing is low, whereas L4S was initially
            designed for access networks, but is also applicable at larger
            pinch-points (e.g. public peerings).</t>
          </list></t>
      </section>
    </section>

    <section anchor="l4sds_mapping_DS_L4S"
             title="Low Latency Diffserv Classes within a DualQ Bandwidth Pool">
      <t>The experimental Dual-Queue Coupled AQM <xref
      target="I-D.ietf-tsvwg-aqm-dualq-coupled"/> consists of a pair of
      queues. One provides a low latency low loss service but both have full
      access to the same pool of bandwidth. When Diffserv was defined no
      mechanism like this was available that could provide low latency without
      also requiring bandwidth controls. All Diffserv's mechanisms for low
      latency and low loss use some form of priority over bandwidth, then
      apply a bandwidth constraint to prevent the lower priority traffic from
      being starved.</t>

      <t>This Diffserv bandwidth constraint has a flip side - it can also
      provide a bandwidth assurance. However, in turn, bandwidth assurance has
      both positive and negative aspects. It certainly prevents other traffic
      encroaching on the bandwidth of the low latency class, but it also
      carves off a partition within which low latency sessions are more prone
      to encroach on each other.</t>

      <t>The DualQ offers an alternative where low latency traffic can access
      the whole pool of bandwidth (in effect, the largest possible bandwidth
      constraint). This is expected to be preferred by many network operators
      and users who would rather not set a bandwidth limit for their low
      latency traffic - particularly at links in access networks where the
      very low level of flow multiplexing makes the bandwidth shares of
      different traffic classes nearly impossible to predict. Nonetheless, if
      a bandwidth partition is required for bandwidth assurance purposes, it
      can still be provided separately (see <xref
      target="l4sds_complement"/>).</t>

      <t>The DualQ classifies packets with the ECN field set to ECT(1) or CE
      into the low latency low loss (L) queue. The L queue maintains a low
      latency low loss service primarily because an L4S source paces its
      packets and is linearly responsive to ECN markings, which earns it the
      right to set the ECT(1) codepoint <xref
      target="I-D.ietf-tsvwg-ecn-l4s-id"/> <xref target="RFC8311"/>.</t>

      <t>Nonetheless, a low level of non-L4S traffic can share the L queue
      without compromising the low latency and low loss of the service.
      Certain existing Diffserv classes are already intended as low latency
      and low loss services. An operator could use the DualQ instead of
      traditional Diffserv queues to give a few of these classes the benefit
      of low latency and access to the whole pool of bandwidth.</t>

      <t>However, that would only be safe for those Diffserv service classes
      that would not risk ruining the low latency of the service. Therefore,
      an operator must take care to only classify a Diffserv traffic class
      into the L queue if it is expected to send smoothly without multi-packet
      bursts. Below we give examples of classes that should (and should not)
      be safe to mix into the L queue.</t>

      <t><xref target="l4sds_tab_dscp_mapping"/> lists the Diffserv service
      classes that have been allocated global use Diffserv codepoints (DSCPs)
      from Pool 1. They are described in RFC 4594 <xref target="RFC4594"/> and
      its updates (<xref target="RFC5865"/> and <xref
      target="I-D.ietf-tsvwg-le-phb"/> so far). An operator that only deploys
      a DualQ <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled"/> but not the
      relevant Diffserv PHBs could classify those with an 'L' in the 'Coupled
      Queue' column (or local use DSCPs with similar characteristics) into its
      L queue, irrespective of the setting of the ECN field.</t>

      <texttable anchor="l4sds_tab_dscp_mapping"
                 title="Mapping of RFC4594 Diffserv Service Classes in a Coupled AQM">
        <ttcol>Service Class Name</ttcol>

        <ttcol>DSCP Name</ttcol>

        <ttcol>DSCP</ttcol>

        <ttcol>AQM?</ttcol>

        <ttcol>Coupled Queue</ttcol>

        <c>Network Control{1}</c>

        <c>CS7</c>

        <c>111000</c>

        <c>Y &amp; N</c>

        <c>L if L4S</c>

        <c>Network Control</c>

        <c>CS6</c>

        <c>110000</c>

        <c>Y &amp; N</c>

        <c>L if L4S</c>

        <c>OAM</c>

        <c>CS2</c>

        <c>010000</c>

        <c>Y &amp; N</c>

        <c>L if L4S</c>

        <c>Signalling</c>

        <c>CS5</c>

        <c>101000</c>

        <c>N</c>

        <c>L if L4S{2}</c>

        <c>Telephony</c>

        <c>EF</c>

        <c>101110</c>

        <c>N</c>

        <c>L</c>

        <c>RFC 5865</c>

        <c>Voice-Admit</c>

        <c>101100</c>

        <c>N</c>

        <c>L{3}</c>

        <c>R-T Interactive</c>

        <c>CS4</c>

        <c>100000</c>

        <c>N</c>

        <c>L if L4S{4}</c>

        <c>MM Conferencing</c>

        <c>AF4n</c>

        <c>100nn0</c>

        <c>Y</c>

        <c>L if L4S</c>

        <c>Broadcast Video</c>

        <c>CS3</c>

        <c>011000</c>

        <c>N</c>

        <c>L if L4S{4}</c>

        <c>MM Streaming</c>

        <c>AF3n</c>

        <c>011nn0</c>

        <c>Y</c>

        <c>L if L4S</c>

        <c>Low Latency Data</c>

        <c>AF2n</c>

        <c>010nn0</c>

        <c>Y</c>

        <c>L if L4S</c>

        <c>High Thru'put Data</c>

        <c>AF1n</c>

        <c>001nn0</c>

        <c>Y</c>

        <c>L if L4S{5}</c>

        <c>Standard</c>

        <c>BE/DF/CS0</c>

        <c>000000</c>

        <c>Y</c>

        <c>L if L4S</c>

        <c>Low Priority Data</c>

        <c>LE{6}</c>

        <c>000001</c>

        <c>Y</c>

        <c>L if L4S{7}</c>

        <postamble>Some service class names have been abbreviated to fit.
        Abbreviations are expanded in RFC 4594 or its updates. For the assured
        forwarding (AF) DSCP names, the digit 'n' represents 1, 2 or 3 and the
        corresponding binary digits 'nn' in the DSCP value represent 01,10 or
        11. The 'Coupled Queue' column is explained in the text.</postamble>
      </texttable>

      <t>Notes for <xref target="l4sds_tab_dscp_mapping"/>:<list
          style="format {%d}: ">
          <t>Reserved by RFC 2474 <xref target="RFC2474"/>.</t>

          <t>Superficially, CS5 is a candidate for classification into the L
          queue irrespective of its ECN field, given application signalling is
          bursty but usually lightweight. However, at least one major
          equipment vendor uses CS5 by default to indicate unresponsive
          broadcast video traffic (to which RFC 4594 allocates CS3).</t>

          <t>Voice-Admit <xref target="RFC5865"/> could be given priority over
          Expedited Forwarding (EF) <xref target="RFC3246"/>.</t>

          <t>The Real-Time Interactive and Broadcast Video service classes (or
          any equivalent local-use classes) are intended for inelastic
          traffic. Therefore they would not be expected to mark themselves as
          ECN-capable. If they did they would be claiming to be elastic and
          therefore eligible for classification into the L queue (subject to
          any policing). These classes should not be classified into the L
          queue on the basis of DSCP alone, because high bandwidth
          unresponsive traffic with potentially variable rate is not
          compatible with the L4S service.</t>

          <t>High Throughput Data (or any equivalent local-use class) might
          use the L4S service because of its support for scalable congestion
          control.</t>

          <t><xref target="I-D.ietf-tsvwg-le-phb"/> updates RFC 4594 to
          deprecate using CS1 for Lower Effort (LE).</t>

          <t>If a packet is marked LE and ECT(1) and the operator has solely
          provided a DualQ, this recommends that the packet is classified into
          the L queue. This could result in LE traffic competing for bandwidth
          with other classes of traffic in the L queue, but at least it should
          not harm the latency of other traffic. This is because the ECT(1)
          marking means the source "MUST" use a scalable congestion control
          <xref target="I-D.ietf-tsvwg-ecn-l4s-id"/>, but the LE marking only
          means it "SHOULD" use an LBE congestion control <xref
          target="I-D.ietf-tsvwg-le-phb"/>.</t>
        </list></t>

      <t>Those classes with an 'L' in the 'DualQ-Coupled' column would not be
      expected to have the ECT(1) codepoint set because they are generally
      unresponsive to congestion. Nonetheless, they could coexist in the same
      queue as L4S traffic because traffic in all of these classes is expected
      to arrive smoothly, not in bursts of more than a few packets. Therefore
      an operator could configure a DualQ Coupled AQM to classify such packets
      into the L queue solely based on their DSCP, irrespective of their ECN
      codepoint <xref target="I-D.ietf-tsvwg-ecn-l4s-id"/>.</t>

      <t>Otherwise, <xref target="I-D.ietf-tsvwg-ecn-l4s-id"/> requires that
      any other DSCP has no effect on classification into the L queue. Thus a
      packet of any other DSCP will not be classified into the L queue unless
      it carries an ECT(1) or CE codepoint in the ECN field. This is shown as
      'L if L4S' in in the 'DualQ-Coupled' column of <xref
      target="l4sds_tab_dscp_mapping"/>.</t>
    </section>

    <section anchor="l4sds_complement"
             title="DualQ Bandwidth Pool within a Hierarchy of (Diffserv) Bandwidth Queues">
      <t>The DualQ Coupled AQM offers an L queue that provides low latency low
      loss service but it pools bandwidth with the Classic (C) service as if
      they shared a single FIFO. As explained earlier, unlike previous
      Diffserv low latency mechanisms, the L queue can offer low latency
      without needing to limit its bandwidth.</t>

      <t>Typically the DualQ will be able to use all the bandwidth available
      to a customer site, e.g. a household, a campus or a mobile node, as a
      single pool. However, this section considers scenarios where the network
      operator might want to carve off a fraction of a site's bandwidth for
      other purposes, for instance:<list style="numbers">
          <t>to ensure that a particularly demanding application (e.g. a
          virtual reality session) survives even if excess traffic overloads
          the remainder of the site's bandwidth;</t>

          <t>to give guaranteed low latency to a particular application (e.g.
          industrial process control), if the statistically assured low
          latency of the L queue is insufficiently stable;</t>

          <t>to provide a bandwidth scavenger service that will have no effect
          on any other applications at the site, but will scavenge any unused
          bandwidth, for instance to transfer backups or large data sets.</t>
        </list></t>

      <t>In all cases, it is assumed that the DualQ has to be able to borrow
      back any of the carved off bandwidth that is unused by the other
      service.</t>

      <t>The following three subsections present solutions for each of the
      above scenarios. Depending on the reader's viewpoint, each scenario can
      be seen as:<list style="symbols">
          <t>either taking a queue within an existing Diffserv hierarchy and
          splitting it into L4S and Classic queues;</t>

          <t>or building a queuing hierarchy around a pre-existing dual
          L4S/Classic queue.</t>
        </list></t>

      <t>In each case, the DualQ remains as an indivisible 'atomic' component
      as if it were a single queue with a single pool of bandwidth (but that
      can either be used for low latency or classic service).</t>

      <t>The three examples represent the three main ways that this queue-like
      'atom' can be included in a hierarchy of other queues. Without loss of
      generality only one other queue complements the DualQ in each case, but
      it would be straightforward to extend the examples with more queues.</t>

      <t>Although these examples are framed in the context of IP and Diffserv,
      similar queuing hierarchies could be constructed at a lower layer, as
      long as it supported a similar capability to ECN and a similar Traffic
      Class identifier to Diffserv.</t>

      <section anchor="l4sds_assured"
               title="DualQ Complemented by an Assured Bandwidth Service">
        <t><xref target="l4sds_fig_assured_bw"/> shows a DualQ complemented by
        an additional queue to add a bandwidth assured service. It is assumed
        that the operator classifies certain packets into the assured
        bandwidth queue, perhaps by class of service, source address or
        5-tuple flow ID.</t>

        <figure align="center" anchor="l4sds_fig_assured_bw"
                title="How to Complement a DualQ with an Assured Bandwidth Service">
          <artwork><![CDATA[           ---------+--+
  Assured b/w       |  |-----------.
           ---------+--+            \    Weighted
                                    w\.-.scheduler
        ,  -----------++             (   )--->
        |   L      .->||---.         /`-'
  DualQ |  -------/---++   c\.-.    /
  b/w  <         (Coupling  (   )--'
  pool  |  ----+--\----+    /`-'Conditional
        |   C  |   \   |---'    priority
        `  ----+-------+        scheduler

]]></artwork>
        </figure>

        <t>The DualQ is used as if it were an indivisible 'atomic' component,
        unchanged from its original description in <xref
        target="I-D.ietf-tsvwg-aqm-dualq-coupled"/>:<list style="symbols">
            <t>The outputs of the AQMs in the two queues (L and C) are coupled
            together so that L4S sources leave enough space for C packets so
            that all 'standard' flows get roughly equal throughput;</t>

            <t>A scheduler recombines the outputs of the two queues, giving
            conditional priority to L packets (the condition prevents
            starvation of the C queue if any L traffic misbehaves).</t>
          </list>A weighted scheduler, e.g. weighted round robin (WRR), is
        used to combine the outputs of the assured bandwidth queue and the
        DualQ. It is configured with weight w for the assured bandwidth queue.
        Then, packets requesting assured bandwidth will have priority access
        to fraction w of the link capacity. However, whenever the assured
        bandwidth queue is idle or under-utilized, the DualQ can borrow the
        balance of the bandwidth. Likewise the assured bandwidth queue can
        borrow more than fraction w if the DualQ under-utilizes its remaining
        share.</t>

        <t>Note that a weighted scheduler such as WRR can be used to implement
        the conditional priority scheduler between the L and C queues.
        However, the system will not work as intended if the two weighted
        schedulers in series are replaced by a single three-input weighted
        scheduler. This is because, whenever one queue under-uses its weighted
        share, a weighted scheduler allows the other queue to borrow unused
        capacity. Whenever traffic is present in the C queue, the coupling
        ensures that L traffic makes space for it by underutiliizing its share
        of the first scheduler. If the assured bandwidth queue was also served
        by the same scheduler, the assured bandwidth service would continually
        borrow the spare capacity left by the L queue that was intended for
        the C queue.</t>

        <t>The assured bandwidth service could itself also support
        applications using low latency low loss and scalable throughput (L4S).
        This would be done by serving assured bandwidth traffic with a DualQ
        (<xref target="l4sds_fig_dual_assured_bw"/>) and, as usual, confining
        legacy queue-building traffic to the C queue.</t>

        <figure align="center" anchor="l4sds_fig_dual_assured_bw"
                title="How to Complement a DualQ with an Assured Bandwidth Service that also Supports L4S">
          <artwork><![CDATA[        ,  -----------++        Conditional
        |   L      .->||---.    priority
Assured |  -------/---++   c\.-.scheduler
  b/w  <         (Coupling  (   )--.
        |  ----+--\----+    /`-'    \
        |   C  |   \   |---'         \    Weighted
        `  ----+-------+             w\.-.scheduler
                                      (   )--->
        ,  -----------++              /`-'
        |   L      .->||---.         /
  DualQ |  -------/---++   c\.-.    /
  b/w  <         (Coupling  (   )--'
  pool  |  ----+--\----+    /`-'Conditional
        |   C  |   \   |---'    priority
        `  ----+-------+        scheduler

]]></artwork>
        </figure>

        <t>The symmetry of <xref target="l4sds_fig_dual_assured_bw"/> reveals
        that both DualQs actually have assured bandwidth. Nonetheless, the
        label 'Assured bandwidth' is only really meaningful from a
        per-application perspective if the traffic classified into that DualQ
        is limited to a small number of application sessions at any one
        time.</t>
      </section>

      <section anchor="l4sds_latency_guarantee"
               title="DualQ Complemented by a Guaranteed Low Latency Service">
        <t><xref target="l4sds_fig_guaranteed_latency"/> shows a DualQ
        complemented by an additional queue to add a guaranteed latency
        service. It is assumed that the operator classifies certain packets
        into the guaranteed latency queue, perhaps by class of service, source
        address or 5-tuple flow ID.</t>

        <figure align="center" anchor="l4sds_fig_guaranteed_latency"
                title="How to Complement a DualQ with a Guaranteed Low Latency Service">
          <artwork><![CDATA[   o  Token bucket
 | o |rate/burst limiter
 |___|
 |___|     -----------++
Guaranteed low latency||-----------.
           -----------++            \    Priority
                                    1\.-.scheduler
        ,  -----------++             (   )--->
        |   L      .->||---.         /`-'
  DualQ |  -------/---++   c\.-.    /
  b/w  <         (Coupling  (   )--'
  pool  |  ----+--\----+    /`-'Conditional
        |   C  |   \   |---'    priority
        `  ----+-------+        scheduler
 ]]></artwork>
        </figure>

        <t>As in all the previous example, the DualQ is used as if it were an
        indivisible 'atomic' component.</t>

        <t>A strict priority scheduler is used to combine the outputs of the
        guaranteed latency queue and the DualQ. Guaranteed low latency traffic
        is shown as subject to a token bucket that limits rate and tightly
        limits burst size, which ensures that:<list style="symbols">
            <t>Excessive guaranteed latency traffic cannot abuse its priority
            and cause the DualQ to starve;</t>

            <t>Guaranteed latency traffic cannot ruin its own latency
            guarantees - it has to keep to a the traffic contract enforced by
            the token bucket.</t>
          </list>In a traditional Diffserv architecture, the token bucket
        would be deployed at the ingress network edge, to limit traffic at
        each entry point. Alternatively, the token bucket could be deployed
        directly in front of the queue, where it would only limit the total
        traffic from all entry points to the network. For an access link into
        a network, these two alternative would amount to the same thing.</t>

        <t>Whenever the guaranteed latency queue is idle or under-utilized,
        the DualQ can borrow the balance of the bandwidth. However, the
        guaranteed latency queue cannot borrow more than the token bucket
        allows, even if the DualQ under-utilizes its remaining share.</t>
      </section>

      <section anchor="l4sds_scavenger"
               title="DualQ Complemented by a Scavenger Service">
        <t><xref target="l4sds_fig_guaranteed_latency"/> shows a DualQ
        complemented by an additional queue to add a bandwidth scavenger
        service. It is assumed that the operator classifies certain packets
        into the scavenger queue, probably by class of service, e.g. the
        global-use Lower Effort (LE) Diffserv codepoint <xref
        target="I-D.ietf-tsvwg-le-phb"/>.</t>

        <figure align="center" anchor="l4sds_fig_scavenger"
                title="How to Complement a DualQ with a Bandwidth Scavenger Service">
          <artwork><![CDATA[        ,  -----------++        Conditional
        |   L      .->||---.    priority
  DualQ |  -------/---++   c\.-.scheduler
  b/w  <         (Coupling  (   )--.
  pool  |  ----+--\----+    /`-'    \    Priority
        |   C  |   \   |---'        1\.-.scheduler
        `  ----+-------+             (   )--->
                                     /`-'
          -+-----------+            /
  Bandwidth|scavenger  |-----------'
          -+-----------+
 ]]></artwork>
        </figure>

        <t>As in all the previous example, the DualQ is used as if it were an
        indivisible 'atomic' component.</t>

        <t>A strict priority scheduler is used to combine the outputs of the
        DualQ and the scavenger service. Section 2 of <xref
        target="I-D.ietf-tsvwg-le-phb"/> suggests alternative mechanisms.</t>

        <t>Whenever the DualQ is idle or under-utilized, the scavenger service
        can borrow the balance of the bandwidth. In contrast to the previous
        guaranteed latency example, no rate limiter is needed on the DualQ
        because, by definition, the scavenger service is expected to starve if
        the higher priority service is using all the capacity.</t>
      </section>
    </section>

    <section anchor="l4sds_nQ-Coupled"
             title="Coupling More than Two AQMs within a Bandwidth Pool">
      <t>The Diffserv Assured Forwarding (AF) classes of service <xref
      target="RFC2597"/> use an AQM with differently weighted outputs, e.g.
      WRED, to provide weighted congestion feedback to the transport layer.
      Flows classified to use a higher weight AQM each take more of the
      available capacity, because the weighted AQM has fooled their congestion
      controller into detecting that the bottleneck is more lightly
      loaded.</t>

      <t>A similar mechanism can be used to add throughput differentiation to
      either or both of the queues within a DualQ. <xref
      target="l4sds_fig_gt2aqm_L"/> illustrates an example with an AQM
      offering three weights within the L queue, where L1 gets the highest
      throughput per flow. It would be a matter of operator policy to choose
      which of the three L4S AQMs the Classic AQM would couple to. If it were
      coupled to L3, then C and L3 flows would get roughly equal throughput,
      while L2 and L1 flows would get more.</t>

      <figure align="center" anchor="l4sds_fig_gt2aqm_L"
              title="Coupling the Classic AQM to Multiple L4S AQMs">
        <artwork><![CDATA[
        ,  -----------++
        |  L1         ||
        |  L2         ||--.
        |  L3    .->  ||   \
  DualQ |  -----/-----++   c\.-.
  b/w  <       ( Coupling   (   )--->
  pool  |  ----+\------+    /`-'Conditional
        |   C  | \     |---'    priority
        `  ----+-------+        scheduler

]]></artwork>
      </figure>

      <t>Note: this structure seems straightforward to implement, but the
      authors are not aware of any implementation or evaluation of AQMs that
      are both weighted and coupled to other AQMs.</t>
    </section>

    <section title="Applicability of Coupled AQM to Global Diffserv PHBs">
      <t>As has been explained, Diffserv always divides up bandwidth and
      divides up latency along the same lines as a consequence, whereas the
      DualQ Coupled AQM solely provides latency separation without bandwidth
      separation (the idea being that bandwidth separation can be added if
      needed, using Diffserv mechanisms).</t>

      <t>In this draft so far, various queuing structures have been described
      in terms of the way they separate bandwidth and latency. Operators with
      existing Diffserv deployments may put the question the other way round
      and ask whether the DualQ Coupled AQM can be used to isolate low latency
      traffic within the bandwidth allocated to one of the standardized
      Diffserv PHBs. For instance:<list style="symbols">
          <t>Bandwidth has been allocated to Network Control traffic, but some
          BGP speakers have been upgraded to a low latency Scalable TCP while
          others still use Classic TCP. However it's not possible to predict
          how much bandwidth one or the other needs at any one time. So it
          would be useful to isolate the low latency BGP and all the control
          signalling from the delay caused by the legacy BGP speaker, without
          having to decide how to carve up the Network Control bandwidth.</t>

          <t>Bandwidth has been allocated to Assured Forwarding (AF) traffic
          but it all shares the same WRED queue and therefore all suffers the
          same delay. So it would be useful to isolate the AF traffic that
          supports low latency congestion control from the rest. However,
          again, it is not possible to predict how many flows of each type
          there will be at any one time.</t>
        </list></t>

      <t><xref target="l4sds_tab_dualq_applic_phb"/> lists all the PHBs with
      standardized global-use DSCPs from <xref target="RFC4594"/> and the
      right-hand 'Latency Separation?' column identifies all those that could
      benefit from an unknowable and variable fraction of their traffic being
      separated between ultra-low and regular delay using a DualQ Coupled AQM.
      There is no implication that it is sensible to do this in any of the
      cases; just that it is possible.</t>

      <t>For convenience, the 'Mechanism' column also answers the question
      "How do PHBs for the global-use DSCPs map to the scenarios in this
      draft?"</t>

      <texttable anchor="l4sds_tab_dualq_applic_phb"
                 title="Applicability of a Coupled AQM to RFC4594 Diffserv PHBs ">
        <ttcol>Service&nbsp;Class&nbsp;Name</ttcol>

        <ttcol>DSCP Name</ttcol>

        <ttcol>AQM?</ttcol>

        <ttcol>Mechanism</ttcol>

        <ttcol>Latency Separation?</ttcol>

        <c>Network Control</c>

        <c>CS7</c>

        <c>Y&amp;N</c>

        <c><xref target="l4sds_fig_assured_bw"/> or <xref
        target="l4sds_fig_dual_assured_bw"/></c>

        <c>Y</c>

        <c>Network Control</c>

        <c>CS6</c>

        <c>Y&amp;N</c>

        <c><xref target="l4sds_fig_assured_bw"/> or <xref
        target="l4sds_fig_dual_assured_bw"/></c>

        <c>Y</c>

        <c>OAM</c>

        <c>CS2</c>

        <c>Y&amp;N</c>

        <c><xref target="l4sds_fig_assured_bw"/> or <xref
        target="l4sds_fig_dual_assured_bw"/></c>

        <c>Y</c>

        <c>Signalling</c>

        <c>CS5</c>

        <c>N</c>

        <c><xref target="l4sds_fig_assured_bw"/></c>

        <c>N</c>

        <c>Telephony</c>

        <c>EF</c>

        <c>N</c>

        <c><xref target="l4sds_latency_guarantee"/></c>

        <c>N</c>

        <c>RFC 5865</c>

        <c>VA</c>

        <c>N</c>

        <c><xref target="l4sds_latency_guarantee"/></c>

        <c>N</c>

        <c>R-T Interactive</c>

        <c>CS4</c>

        <c>N</c>

        <c><xref target="l4sds_fig_dual_assured_bw"/></c>

        <c>Y</c>

        <c>MM Conferencing</c>

        <c>AF4n</c>

        <c>Y</c>

        <c><xref target="l4sds_nQ-Coupled"/></c>

        <c>Y</c>

        <c>Broadcast Video</c>

        <c>CS3</c>

        <c>N</c>

        <c><xref target="l4sds_fig_dual_assured_bw"/></c>

        <c>N</c>

        <c>MM Streaming</c>

        <c>AF3n</c>

        <c>Y</c>

        <c><xref target="l4sds_nQ-Coupled"/></c>

        <c>Y</c>

        <c>Low Latency Data</c>

        <c>AF2n</c>

        <c>Y</c>

        <c><xref target="l4sds_nQ-Coupled"/></c>

        <c>Y</c>

        <c>High Thru'put Data</c>

        <c>AF1n</c>

        <c>Y</c>

        <c><xref target="l4sds_nQ-Coupled"/></c>

        <c>Y</c>

        <c>Standard</c>

        <c>BE/DF/CS0</c>

        <c>Y</c>

        <c><xref target="l4sds_mapping_DS_L4S"/></c>

        <c>Y</c>

        <c>Low Priority Data</c>

        <c>LE</c>

        <c>Y</c>

        <c><xref target="l4sds_scavenger"/></c>

        <c>n/a</c>
      </texttable>
    </section>

    <section anchor="l4sds_classification"
             title="Best Practice for Classification and Marking">
      <section title="Never Re-Mark a DSCP">
        <t>It is not a DualQ's job to alter Diffserv codepoints to attempt to
        make other downstream AQMs classify selected packets in certain ways.
        Each DualQ Coupled AQM is independently (but hopefully consistently)
        configured to select certain DSCPs for classification into the L
        queue. It never alters the DSCP nor the ECN codepoint (except setting
        CE to indicate that congestion was experienced) <xref
        target="I-D.ietf-tsvwg-aqm-dualq-coupled"/>.</t>
      </section>

      <section anchor="l4sds_order" title="Classification Order">
        <section anchor="l4sds_order_problem"
                 title="Classification Order: Problem">
          <t>The above wide range of possible structures raises the question
          of which order it would be more efficient for classifier rules to
          take: DSCP before ECN, ECN before DSCP or some hybrid.</t>

          <t>On the one hand, for a structure like that in <xref
          target="l4sds_fig_assured_bw"/> it would make sense to classify on
          DSCP first, then ECN. Otherwise, if packets were classified on ECN
          first, an extra merge stage would be required because the assured
          bandwidth queue handles all ECN codepoints for a particular
          DSCP.</t>

          <t>On the other hand, for a structure like that in <xref
          target="l4sds_fig_gt2aqm_L"/> it would make sense to classify on ECN
          first, then DSCP. Otherwise, again an extra merge stage would be
          needed, because the C queue handles all DSCPs but only some ECN
          codepoints.</t>

          <t>A hybrid of these two scenarios would be possible, for instance
          where the L queue in <xref target="l4sds_fig_assured_bw"/> was
          further broken down into three weighted AQMs, as in <xref
          target="l4sds_fig_gt2aqm_L"/>. In this case, the ideal matching
          order would be DSCP, ECN, DSCP.</t>
        </section>

        <section anchor="l4sds_order_solutions"
                 title="Classification Order: Solutions">
          <t>Probably the most straightforward solution would be to classify
          in a single stage over all 8 octets of the IPv6 Traffic Class field
          or the former IPv4 TOS octet, irrespective of the boundary between
          the 6-bit DS field and the 2-bit ECN field <xref target="RFC3260"/>.
          As long as hardware supports this, it will be possible because all
          the inputs to the queues are at the same level of hierarchy, even
          though the outputs form a multi-level hierarchy of schedulers in
          some cases.</t>

          <t>Pre-existing classifier hardware might consider the 6-bit and
          2-bit fields as separate. Then it would seem most efficient for the
          order of the classifiers to depend on the structure of the queues
          being classified (given the structure has to have been designed
          before the classifiers are designed).</t>
        </section>
      </section>
    </section>

    <section anchor="l4sds_conditioning"
             title="Policing and Traffic Conditioning">
      <!--   Edge conditioning is traditional in the Diffserv architecture.
   However, traffic conditioning in multiple locations has to be
   extremely severe in order to minimize latency spikes when these
   sources coincide at a bottleneck queue.  An alternative would be to
   monitor the aggregate of traffic arriving at the queue and only to
   police when a latency threshold would otherwise be exceeded.  Penalty
   scores could be accumulated and suitably aged to detect the most ill-
   behaved sources, so that any policing action could focus on those
   sources most to blame for latency exceeding the threshold.-->

      <t>{ToDo: L4S latency policing is discussed in the Security
      Considerations section of <xref target="I-D.ietf-tsvwg-l4s-arch"/>. This
      section will compare Diffserv traffic conditioning with L4S latency
      policing.}</t>
    </section>

    <section anchor="l4sds_IANA" title="IANA Considerations">
      <t>This specification contains no IANA considerations.</t>
    </section>

    <section anchor="l4sds_Security_Considerations"
             title="Security Considerations">
      <t>{ToDo}</t>
    </section>

    <section title="Comments Solicited">
      <t>Comments and questions are encouraged and very welcome. They can be
      addressed to the IETF Transport Area working group mailing list
      &lt;tsvwg@ietf.org&gt;, and/or to the authors.</t>
    </section>

    <section title="Acknowledgements">
      <t>Thanks to Greg White, David Black, Wes Eddy and Gorry Fairhurst for
      their useful discussions prior to this -00 draft.</t>
    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119" ?>
    </references>

    <references title="Informative References">
      <?rfc include="reference.RFC.2474" ?>

      <?rfc include="reference.RFC.2475" ?>

      <?rfc include="reference.RFC.2597" ?>

      <?rfc include="reference.RFC.3168" ?>

      <?rfc include="reference.RFC.3246" ?>

      <?rfc include="reference.RFC.3260" ?>

      <?rfc include="reference.RFC.5681" ?>

      <?rfc include="reference.RFC.4594" ?>

      <?rfc include="reference.RFC.5865" ?>

      <?rfc include="reference.I-D.ietf-tsvwg-aqm-dualq-coupled" ?>

      <?rfc include="reference.I-D.ietf-tsvwg-ecn-l4s-id" ?>

      <?rfc include="reference.I-D.ietf-tsvwg-l4s-arch" ?>

      <?rfc include="reference.RFC.8257" ?>

      <?rfc include="reference.RFC.8311" ?>

      <?rfc include="reference.I-D.ietf-tsvwg-le-phb" ?>
    </references>

    <section title="Open Issues">
      <t><list style="symbols">
          <t>The Abstract promises "in which cases one can stand alone without
          needing the other". That's in the text, but not highlighted as
          such.</t>

          <t>Document Roadmap TBA</t>

          <t>Mapping to 802.11 user priorities (or LTE QCIs)? Not strictly
          within the scope, but perhaps desirable to add, or at least to
          mention how L4S (experimental) would affect RFC8325 which gives
          (standards track) mappings between Diffserv and 802.11.</t>

          <t>Identify L4S-friendly rate policers</t>

          <t>Comparison between L4S policing and Diffserv traffic conditioning
          is TBA</t>

          <t>Security Considerations are TBA (largely depends on the previous
          bullet)</t>
        </list></t>

      <t/>
    </section>
  </back>
</rfc>
