<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc strict="no" ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="exp" docName="draft-ietf-tcpm-generalized-ecn-16" ipr="trust200902" obsoletes="5562" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="ECN++">ECN++: Adding Explicit Congestion Notification (ECN)
    to TCP Control Packets</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-generalized-ecn-16"/>
    <author fullname="Marcelo Bagnulo" initials="M." surname="Bagnulo">
      <organization abbrev="UC3M">Universidad Carlos III de
      Madrid</organization>
      <address>
        <postal>
          <street>Av. Universidad 30</street>
          <city>Leganes</city>
          <region>Madrid</region>
          <code>28911</code>
          <country>SPAIN</country>
        </postal>
        <phone>34 91 6249500</phone>
        <email>marcelo@it.uc3m.es</email>
        <uri>https://www.it.uc3m.es</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>https://bobbriscoe.net/</uri>
      </address>
    </author>
    <date year=""/>
    <abstract>
      <t>This document specifies an experimental modification to ECN when used
      with TCP. It allows the use of ECN in the IP header of the following TCP
      packets: SYNs, SYN/ACKs, pure ACKs, Window probes, FINs, RSTs and
      retransmissions. This specification obsoletes RFC5562, which described a
      different way to use ECN on SYN/ACKs alone.</t>
    </abstract>
  </front>
  <middle>
    <section numbered="true" toc="default">
      <name>Introduction</name>
      <t>RFC 3168 <xref target="RFC3168" format="default"/> specifies support of Explicit
      Congestion Notification (ECN) in IP (v4 and v6). By using the ECN
      capability, network elements (e.g. routers, switches) performing
      Active Queue Management (AQM) can use ECN marks instead of packet drops
      to signal congestion to the endpoints of a communication. This results
      in lower packet loss and increased performance. RFC 3168 also specifies
      support for ECN in TCP, but solely on data packets. For various reasons
      it precludes the use of ECN on TCP control packets (TCP SYN, TCP
      SYN-ACK, pure ACKs, Window probes) and on retransmitted packets. RFC
      3168 is silent about the use of ECN on RST and FIN packets. RFC
      5562 <xref target="RFC5562" format="default"/> is an experimental modification to
      ECN that enables ECN support for TCP SYN-ACK packets.</t>
      <t>This document defines an experimental modification to ECN <xref target="RFC3168" format="default"/> that shall be called ECN++. It enables ECN support on
      all the aforementioned types of TCP packet. RFC 5562 (which was called
      ECN+) is obsoleted by the present specification, because it has the same
      goal of enabling ECT, but on only one type of control packet. The
      mechanisms proposed in this document have been defined conservatively
      and with safety in mind, possibly in some cases at the expense of
      performance.</t>
      <t>ECN++ uses a sender-only deployment model. It works whether the two
      ends of the TCP connection use classic ECN feedback <xref target="RFC3168" format="default"/> or the updated scheme called Accurate ECN feedback
      (AccECN <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>). {This is
      written assuming that AccECN will have been published as an RFC before
      ECN++, and that AccECN does indeed update RFC 3168, as intended at the
      time of writing. This note to be removed by the RFC Editor.}</t>
      <t>Using ECN on initial SYN packets provides significant benefits, as we
      describe in the next subsection. However, only AccECN provides a way to
      feed back whether the SYN was CE marked, and RFC 3168 does not.
      Therefore, this spec recommends that implementers of ECN++ also
      implement AccECN. Conversely, if AccECN (or an equivalent safety
      mechanism) is not implemented with ECN++, this specification rules out
      ECN on the SYN.</t>
      <t>ECN++ is designed for compatibility with a number of latency
      improvements to TCP such as TCP Fast Open (TFO <xref target="RFC7413" format="default"/>), initial window of 10 SMSS (IW10 <xref target="RFC6928" format="default"/>) and Low latency Low Loss Scalable Transport (L4S)
      <xref target="RFC9330" format="default"/>, but they can all be implemented and deployed
      independently. <xref target="RFC8311" format="default"/> is a standards track procedural
      device that relaxes requirements in RFC 3168 and other standards track
      RFCs that would otherwise preclude the experimental modifications needed
      for ECN++ and other ECN experiments.</t>
      <section anchor="genecn_sec_motivation" numbered="true" toc="default">
        <name>Motivation</name>
        <t>The absence of ECN support on TCP control packets and
        retransmissions has a potential harmful effect. In any ECN deployment,
        non-ECN-capable packets suffer a penalty when they traverse a
        congested bottleneck. For instance, with a drop probability of 1%, 1%
        of connection attempts suffer a timeout of about 1 second before the
        SYN is retransmitted, which is highly detrimental to the performance
        of short flows. TCP control packets, particularly TCP SYNs and
        SYN-ACKs, are important for performance, so dropping them is best
        avoided.</t>
        <t>Not using ECN on control packets can be particularly detrimental to
        performance in environments where the ECN marking level is high. For
        example, <xref target="judd-nsdi" format="default"/> shows that in a controlled private
        data centre (DC) environment where ECN is used (in conjunction with
        DCTCP <xref target="RFC8257" format="default"/>), the probability of being able to
        establish a new connection using a non-ECN SYN packet drops to close
        to zero even when there are only 16 ongoing TCP flows transmitting at
        full speed. The issue is that DCTCP exhibits a much more aggressive
        response to packet marking (which is why it is only applicable in
        controlled environments). This leads to a high marking probability for
        ECN-capable packets, and in turn a high drop probability for non-ECN
        packets. Therefore non-ECN SYNs are dropped aggressively, rendering it
        nearly impossible to establish a new connection in the presence of
        even mild traffic load.</t>
        <t>Finally, there are ongoing experimental efforts to promote the
        adoption of a slightly modified variant of DCTCP (and similar
        congestion controls) over the Internet to achieve low latency, low
        loss and scalable throughput (L4S) for all communications <xref target="RFC9330" format="default"/>. In such an approach, L4S packets identify
        themselves using an ECN codepoint <xref target="RFC9331" format="default"/>. With L4S,
        preventing TCP control packets from obtaining the benefits of ECN
        would not only expose them to the prevailing level of congestion loss,
        but it would also classify them into a different queue. Then only L4S
        data packets would be classified into the L4S queue that is expected
        to have lower latency, while the packets controlling and
        retransmitting these data packets would still get stuck behind the
        queue induced by non-L4S-enabled TCP traffic.</t>
      </section>
      <section numbered="true" toc="default">
        <name>Experiment Goals</name>
        <t>The goal of the experimental modifications defined in this document
        is to allow the use of ECN on all TCP packets. Experiments are
        expected in the public Internet as well as in controlled environments
        to understand the following issues: </t>
        <ul spacing="normal">
          <li>
            <t>How SYNs, Window probes, pure ACKs, FINs, RSTs and
            retransmissions that carry the ECT(0), ECT(1) or CE codepoints are
            processed by the TCP endpoints and the network (including routers,
            firewalls and other middleboxes). In particular we would like to
            learn if these packets are frequently blocked or if these packets
            are usually forwarded and processed.</t>
          </li>
          <li>
            <t>The scale of deployment of the different flavours of ECN,
            including <xref target="RFC3168" format="default"/>, <xref target="RFC5562" format="default"/>,
            <xref target="RFC3540" format="default"/> and <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>.</t>
          </li>
          <li>
            <t>How much the performance of TCP communications is improved by
            allowing ECN marking of each packet type.</t>
          </li>
          <li>
            <t>To identify any issues (including security issues) raised by
            enabling ECN marking of these packets.</t>
          </li>
          <li>
            <t>To conduct the specific experiments identified in the text by
            the strings "EXPERIMENTATION NEEDED" or "MEASUREMENTS NEEDED".</t>
          </li>
        </ul>
        <t>The data gathered through the experiments described in this
        document, particularly under the first 2 bullets above, will help in
        the redesign of the final mechanism (if needed) for adding ECN support
        to the different packet types considered in this document.</t>
        <t>Success criteria: The experiment will be a success if we obtain
        enough data to have a clearer view of the deployability and benefits
        of enabling ECN on all TCP packets, as well as any issues. If the
        results of the experiment show that it is feasible to deploy such
        changes; that there are gains to be achieved through the changes
        described in this specification; and that no other major issues may
        interfere with the deployment of the proposed changes; then it would
        be reasonable to adopt the proposed changes in a standards track
        specification that would update RFC 3168.</t>
      </section>
      <section numbered="true" toc="default">
        <name>Document Structure</name>
        <t>The remainder of this document is structured as follows. In <xref target="term" format="default"/>, we present the terminology used in the rest of the
        document. In <xref target="spec" format="default"/>, we specify the modifications to
        provide ECN support to TCP SYNs, pure ACKs, Window probes, FINs, RSTs
        and retransmissions. We describe both the network behaviour and the
        endpoint behaviour. <xref target="genecn_sec_variants" format="default"/> discusses
        variations of the specification that will be necessary to interwork
        with a number of popular variants or derivatives of TCP. RFC 3168
        provides a number of specific reasons why ECN support is not
        appropriate for each packet type. In <xref target="arguments" format="default"/>, we
        revisit each of these arguments for each packet type to justify why it
        is reasonable to conduct this experiment.</t>
      </section>
    </section>
    <section anchor="term" 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 BCP 14
      <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"> </xref> when, and only
      when, they appear in all capitals, as shown here.</t>
      <t>Pure ACK: A TCP segment with the ACK flag set and no data
      payload.</t>
      <t>SYN: A TCP segment with the SYN (synchronize) flag set.</t>
      <t>Window probe: Defined in <xref target="RFC9293" format="default"/>, a window probe is
      a regular TCP segment, but with only one octet of new data that is sent
      to learn if the receive window is still zero.</t>
      <t>FIN: A TCP segment with the FIN (finish) flag set.</t>
      <t>RST: A TCP segment with the RST (reset) flag set.</t>
      <t>Retransmission: A TCP segment that has been retransmitted by the TCP
      sender.</t>
      <t>TCP client: The initiating end of a TCP connection. Also called the
      initiator.</t>
      <t>TCP server: The responding end of a TCP connection. Also called the
      responder or listener.</t>
      <t>ECT: ECN-Capable Transport. One of the two codepoints ECT(0) or
      ECT(1) in the ECN field <xref target="RFC3168" format="default"/> of the IP header (v4 or
      v6). An ECN-capable sender sets one of these to indicate that both
      transport endpoints support ECN. When this specification says the sender
      sets an ECT codepoint, by default it means ECT(0). Optionally, it could
      mean ECT(1), which has been redefined for use by L4S experiments <xref target="RFC8311" format="default"/> <xref target="RFC9331" format="default"/>.</t>
      <t>Not-ECT: The ECN codepoint set by senders that indicates that the
      transport is not ECN-capable.</t>
      <t>CE: Congestion Experienced. The ECN codepoint that an intermediate
      node sets to indicate congestion <xref target="RFC3168" format="default"/>. A node sets
      an increasing proportion of ECT packets to CE as the level of congestion
      increases.</t>
    </section>
    <section anchor="spec" numbered="true" toc="default">
      <name>Specification</name>
      <t>The experimental ECN++ changes to the specification of TCP over ECN
      <xref target="RFC3168" format="default"/> defined here primarily alter the behaviour of
      the sending host for each half-connection. However, there are
      subsections for forwarding elements and receivers below, which recommend
      that they accept the new packets - they should do already, but might
      not. This will prompt implementers to check the receive side code while
      they are altering the send-side code. All changes can be deployed at
      each endpoint independently of others and independent of any network
      behaviour.</t>
      <t>The feedback behaviour at the receiver depends on whether classic ECN
      TCP feedback <xref target="RFC3168" format="default"/> or Accurate ECN (AccECN) TCP
      feedback <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> has been
      negotiated. Nonetheless, neither receiver feedback behaviour is altered
      by the present specification.</t>
      <section numbered="true" toc="default">
        <name>Network (e.g. Firewall) Behaviour</name>
        <t>Previously the specification of ECN for TCP <xref target="RFC3168" format="default"/> required the sender to set not-ECT on TCP control
        packets and retransmissions. Some readers of RFC 3168 might have
        erroneously interpreted this as a requirement for firewalls, intrusion
        detection systems, etc. to check and enforce this behaviour. Section
        4.3 of <xref target="RFC8311" format="default"/> updates RFC 3168 to remove this
        ambiguity. It requires firewalls or any intermediate nodes not to
        treat certain types of ECN-capable TCP segment differently (except
        potentially in one attack scenario). This is likely to only involve a
        firewall rule change in a fraction of cases (at most 0.4% of paths
        according to the tests reported in <xref target="genecn_sec_unexpected_ECN" format="default"/>).</t>
        <t>In case a TCP sender encounters a middlebox blocking ECT on certain
        TCP segments, the specification below includes behaviour to fall back
        to non-ECN. However, this loses the benefit of ECN on control packets.
        So operators are RECOMMENDED to alter their firewall rules to comply
        with the requirement referred to above (section 4.3 of <xref target="RFC8311" format="default"/>).</t>
      </section>
      <section numbered="true" toc="default">
        <name>Sender Behaviour</name>
        <t>For each type of control packet or retransmission, the following
        sections detail changes to the sender's behaviour in two respects: i)
        whether it sets ECT; and ii) its response to congestion feedback.
        <xref target="genecn_tab_summary" format="default"/> summarises these two behaviours
        for each type of packet, but the relevant subsection below should be
        referred to for the detailed behaviour. The subsection on the SYN is
        more complex than the others, because it has to include fall-back
        behaviour if the ECT packet appears not to have got through, and
        caching of the outcome to detect persistent failures.</t>
        <table align="center" anchor="genecn_tab_summary">
          <name>Summary of sender behaviour. In each case the relevant section
          below should be referred to for the detailed behaviour</name>
          <thead>
            <tr>
              <th align="left">TCP packet type</th>
              <th align="left">ECN field if AccECN f/b negotiated*</th>
              <th align="left">ECN field if RFC3168 f/b negotiated*</th>
              <th align="left">Congestion Response</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">SYN</td>
              <td align="left">ECT**</td>
              <td align="left">not-ECT</td>
              <td align="left">If AccECN, reduce IW</td>
            </tr>
            <tr>
              <td align="left">SYN-ACK</td>
              <td align="left">ECT</td>
              <td align="left">ECT</td>
              <td align="left">Reduce IW</td>
            </tr>
            <tr>
              <td align="left">Pure ACK</td>
              <td align="left">ECT</td>
              <td align="left">not-ECT</td>
              <td align="left">If AccECN, usual cwnd response and optionally
              <xref format="default" target="RFC5690"/></td>
            </tr>
            <tr>
              <td align="left">W Probe</td>
              <td align="left">ECT</td>
              <td align="left">ECT</td>
              <td align="left">Usual cwnd response</td>
            </tr>
            <tr>
              <td align="left">FIN</td>
              <td align="left">ECT</td>
              <td align="left">ECT</td>
              <td align="left">None or optionally <xref format="default" target="RFC5690"/></td>
            </tr>
            <tr>
              <td align="left">RST</td>
              <td align="left">ECT</td>
              <td align="left">ECT</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">Re-XMT</td>
              <td align="left">ECT</td>
              <td align="left">ECT</td>
              <td align="left">Usual cwnd response</td>
            </tr>
          </tbody>
          <tfoot>
            <tr>
              <td colspan="4"/>
            </tr>
            <tr>
              <td align="center" colspan="4">W Probe and Re-XMT stand for
              Window Probe and Retransmission.<br/> * For a SYN, "negotiated"
              means "requested".<br/>** AccECN or equivalent safety (see <xref target="genecn_sec_SYN_Classic" format="default"/>)</td>
            </tr>
          </tfoot>
        </table>
        <t>It can be seen that we recommend against the sender setting ECT on
        the SYN if it is not requesting AccECN feedback. Therefore it is
        RECOMMENDED that the AccECN specification <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> is implemented, along with the
        ECN++ experiment, because it is expected that ECT on the SYN will give
        the most significant performance gain, particularly for short
        flows.</t>
        <t>Nonetheless, this specification also caters for the case where an
        ECN++ TCP sender is not using AccECN. This could be because it does
        not support AccECN or because its peer does not (AccECN can only be
        used if both ends of a connection support it).</t>
        <t>Note that <xref target="genecn_tab_summary" format="default"/> does not imply any
        obligation to set any packet to ECT. ECN++ removes the restrictions
        that RFC 3168 places against setting ECT on these types of packets,
        and an implementation would normally be expected to take advantage of
        this, but it does not have to. Therefore, an implementation of the
        ECN++ experiment would be compliant if, for instance, it set ECT on
        some types of control packets but not others. If it did not set ECT on
        any control packets or retransmissions, it would not be compliant.</t>
        <section anchor="genecn_sec_SYN" numbered="true" toc="default">
          <name>SYN (Send)</name>
          <section anchor="genecn_sec_ECT_SYN" numbered="true" toc="default">
            <name>Setting ECT on the SYN</name>
            <t>With classic <xref target="RFC3168" format="default"/> ECN feedback, the SYN was
            not expected to be ECN-capable, so the flag provided to feed back
            congestion was put to another use (it is used in combination with
            other flags to indicate that the responder supports ECN). In
            contrast, Accurate ECN (AccECN) feedback <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> provides a codepoint in the
            SYN-ACK for the responder to feed back whether the SYN arrived
            marked CE. Therefore the setting of the IP/ECN field on the SYN is
            specified separately for each case in the following two
            subsections.</t>
            <section anchor="genecn_sec_SYN_AccECN" numbered="true" toc="default">
              <name>ECN++ TCP Client also Supports AccECN</name>
              <t>For the ECN++ experiment, if the SYN is requesting AccECN
              feedback, the TCP sender will also set ECT on the SYN. Section
              4.3 of <xref target="RFC8311" format="default"/> allows an ECN experiment to use
              ECT on a SYN, by updating Section 6.1.1 of RFC 3168 (which
              prohibited it).</t>
            </section>
            <section anchor="genecn_sec_SYN_Classic" numbered="true" toc="default">
              <name>ECN++ TCP Client does not Support AccECN</name>
              <t>If the SYN sent by a TCP initiator does not attempt to
              negotiate Accurate ECN feedback, or does not use an equivalent
              safety mechanism, it MUST NOT set ECT on a SYN. This follows
              section 6.1.1 of <xref target="RFC3168" format="default"/>, because, in this
              case, it would not be safe to use the extra flexibility to set
              ECT on a SYN that <xref target="RFC8311" format="default"/> allows.</t>
              <t>The only envisaged examples of "equivalent safety mechanisms"
              are: a) some future TCP ECN feedback protocol, perhaps evolved
              from AccECN, that feeds back CE marking on a SYN; b) setting the
              initial window to 1 SMSS. IW=1 is NOT RECOMMENDED because it
              could degrade performance, but might be appropriate for certain
              lightweight TCP implementations.</t>
              <t>See <xref target="genecn_sec_rationale_SYN" format="default"/> for discussion
              and rationale.</t>
              <t>If the TCP initiator does not set ECT on the SYN, the rest of
              <xref target="genecn_sec_SYN" format="default"/> does not apply.</t>
            </section>
          </section>
          <section anchor="genecn_sec_SYN_cache" numbered="true" toc="default">
            <name>Caching where to use ECT on SYNs</name>
            <t>This subsection only applies if the ECN++ TCP client sets ECT
            on the SYN and supports AccECN.</t>
            <t>Until AccECN servers become widely deployed, a TCP initiator
            that sets ECT on a SYN (which typically implies the same SYN also
            requests AccECN, as above) SHOULD also maintain a cache entry per
            server to record servers that it is not worth sending an ECT SYN
            to, e.g. because they do not support AccECN and therefore
            have no logic for congestion markings on the SYN. Mobile hosts MAY
            maintain a cache entry per access network to record 'non-ECT SYN'
            entries against proxies (see <xref target="genecn_sec_SYN_cache_rationale" format="default"/>). This cache can be
            implemented as part of the shared state across multiple TCP
            connections, if it is following <xref target="RFC9040" format="default"/>.</t>
            <t>Subsequently the initiator will not set ECT on a SYN to such a
            server or proxy, but it can still always request AccECN support
            (because the response will state any earlier stage of ECN
            evolution that the server supports with no performance penalty).
            If a server subsequently upgrades to support AccECN, the initiator
            will discover this as soon as it next connects, then it can remove
            the server from its cache and subsequently always set ECT for that
            server.</t>
            <t>The client can limit the size of its cache of 'non-ECT SYN'
            servers. Then, while AccECN is not widely deployed, it will only
            cache the 'non-ECT SYN' servers that are most used and most
            recently used by the client. As the client accesses servers that
            have been expelled from its cache, it will simply use ECT on the
            SYN by default.</t>
            <t>Servers that do not support ECN as a whole do not need to be
            recorded separately from non-support of AccECN because the
            response to a request for AccECN immediately states which stage in
            the evolution of ECN the server supports (AccECN <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>, classic ECN <xref target="RFC3168" format="default"/> or no ECN).</t>
            <t>The above strategy is named "optimistic ECT and cache
            failures". It is believed to be sufficient based on three
            measurement studies and assumptions detailed in <xref target="genecn_sec_SYN_cache_rationale" format="default"/>. However, <xref target="genecn_sec_SYN_cache_rationale" format="default"/> gives two other
            strategies and the choice between them depends on the
            implementer's goals (e.g., see <xref target="genecn_sec_l4s" format="default"/> if
            using L4S) and the deployment prevalence of ECN variants in the
            network and on servers, not to mention the prevalence of some
            significant bugs.</t>
            <t>If the initiator times out without seeing a SYN-ACK, it will
            separately cache this fact (see fall-back in <xref target="genect_sec_fall-back-SYN" format="default"/> for details).</t>
          </section>
          <section anchor="genect_sec_SYN-response" numbered="true" toc="default">
            <name>SYN Congestion Response</name>
            <t>As explained above, this subsection only applies if the ECN++
            TCP client sets ECT on the initial SYN.</t>
            <t>If the SYN-ACK returned to the TCP initiator confirms that the
            server supports AccECN, it will also be able to indicate whether
            or not the SYN was CE-marked. If the SYN was CE-marked, and if the
            initial window is greater than 1 MSS, then, the initiator MUST
            reduce its Initial Window (IW) and SHOULD reduce it to 1 SMSS
            (sender maximum segment size). The rationale is the same as that
            for the response to CE on a SYN-ACK (<xref target="rationale-syn-ack-congestion-resp" format="default"/>).</t>
            <t>If the initiator has set ECT on the SYN and if the SYN-ACK
            shows that the server does not support feedback of a CE on the SYN
            (e.g. it does not support AccECN) and if the initial
            congestion window of the initiator is greater than 1 MSS, then the
            TCP initiator MUST conservatively reduce its Initial Window and
            SHOULD reduce it to 1 SMSS. A reduction to greater than 1 SMSS MAY
            be appropriate (see <xref target="genecn_sec_CE-missed" format="default"/>).
            Conservatism is necessary because the SYN-ACK cannot show whether
            the SYN was CE-marked.</t>
            <t>If the TCP initiator (host A) receives a SYN from the remote
            end (host B) after it has sent a SYN to B, it indicates the
            (unusual) case of a simultaneous open. Host A will respond with a
            SYN-ACK. Host A will probably then receive a SYN-ACK in response
            to its own SYN, after which it can follow the appropriate one of
            the two paragraphs above.</t>
            <t>In all the above cases, the initiator does not have to back off
            its retransmission timer as it would in response to a timeout
            following no response to its SYN <xref target="RFC6298" format="default"/>, because
            both the SYN and the SYN-ACK have been successfully delivered
            through the network. Also, the initiator does not need to exit
            slow start or reduce ssthresh, which is not even required when a
            SYN is lost <xref target="RFC5681" format="default"/>.</t>
            <t>If an initial window of more than 3 segments is implemented
            (e.g. IW10 <xref target="RFC6928" format="default"/>), <xref target="genecn_sec_variants" format="default"/> gives additional
            recommendations.</t>
          </section>
          <section anchor="genect_sec_fall-back-SYN" numbered="true" toc="default">
            <name>Fall-Back Following No Response to an ECT SYN</name>
            <t>As explained above, this subsection only applies if the ECN++
            TCP client also sets ECT on the initial SYN.</t>
            <t>An ECT SYN might be lost due to an over-zealous path element
            (or server) blocking ECT packets that do not conform to RFC 3168.
            Some evidence of this was found in a 2014 study <xref target="ecn-pam" format="default"/>, but in a more recent study using 2017 data
            <xref target="Mandalari18" format="default"/> extensive measurements found no case
            where ECT on TCP control packets was treated any differently from
            ECT on TCP data packets. Loss is commonplace for numerous other
            reasons, e.g. congestion loss at a non-ECN queue on the
            forward or reverse path, transmission errors, etc. Alternatively,
            the cause of the loss might be the associated attempt to negotiate
            AccECN, or possibly other unrelated options on the SYN.</t>
            <t>Therefore, if the timer expires after the TCP initiator has
            sent the first ECT SYN, it SHOULD make one more attempt to
            retransmit the SYN with ECT set (backing off the timer as usual).
            If the retransmission timer expires again, it SHOULD retransmit
            the SYN with the not-ECT codepoint in the IP header, to expedite
            connection set-up. If other experimental fields or options were on
            the SYN, it will also be necessary to follow their specifications
            for fall-back too. It would make sense to coordinate all the
            strategies for fall-back in order to isolate the specific cause of
            the problem.</t>
            <t>If the TCP initiator is caching failed connection attempts, it
            SHOULD NOT give up using ECT on the first SYN of subsequent
            connection attempts until it is clear that a blockage persistently
            and specifically affects ECT on SYNs. This is because loss is so
            commonplace for other reasons. Even if it does eventually decide
            to give up setting ECT on the SYN, it will probably not need to
            give up on AccECN on the SYN. In any case, if a cache is used, it
            SHOULD be arranged to expire so that the initiator will
            infrequently attempt to check whether the problem has been
            resolved.</t>
            <t>Other fall-back strategies MAY be adopted where applicable (see
            <xref target="genecn_sec_unexpected_ECN" format="default"/> for suggestions, and
            the conditions under which they would apply).</t>
          </section>
        </section>
        <section anchor="genecn_sec_SYN-ACK" numbered="true" toc="default">
          <name>SYN-ACK (Send)</name>
          <t/>
          <section numbered="true" toc="default">
            <name>Setting ECT on the SYN-ACK</name>
            <t>For the ECN++ experiment, the TCP implementation will set ECT
            on SYN-ACKs. Section 4.3 of <xref target="RFC8311" format="default"/> allows an ECN
            experiment to use ECT on a SYN-ACK, by updating Section 6.1.1 of
            RFC 3168 (which prohibited it).</t>
          </section>
          <section anchor="genecn_sec_SYN-ACK_response" numbered="true" toc="default">
            <name>SYN-ACK Congestion Response</name>
            <t>A host that sets ECT on SYN-ACKs MUST reduce its initial window
            in response to any congestion feedback, whether using classic ECN
            or AccECN (see <xref target="genecn_sec_CE-missed-SYN-ACK" format="default"/>). It
            SHOULD reduce it to 1 SMSS. This is different to the behaviour
            specified in an earlier experiment that set ECT on the SYN-ACK
            <xref target="RFC5562" format="default"/>. This is justified in <xref target="rationale-syn-ack-congestion-resp" format="default"/>.</t>
            <t>The responder does not have to back off its retransmission
            timer because the ECN feedback proves that the network is
            delivering packets successfully and is not severely overloaded.
            Also the responder does not have to leave slow start or reduce
            ssthresh, which is not even required when a SYN-ACK has been
            lost.</t>
            <t>The congestion response to CE-marking on a SYN-ACK for a server
            that implements either the TCP Fast Open experiment (TFO <xref target="RFC7413" format="default"/>) or experimentation with an initial window of
            more than 3 segments (e.g. IW10 <xref target="RFC6928" format="default"/>) is
            discussed in <xref target="genecn_sec_variants" format="default"/>.</t>
          </section>
          <section anchor="genect_sec_fall-back-SYN-ACK" numbered="true" toc="default">
            <name>Fall-Back Following No Response to an ECT SYN-ACK</name>
            <t>After the responder sends a SYN-ACK with ECT set, if its
            retransmission timer expires it SHOULD retransmit one more SYN-ACK
            with ECT set (and back-off its timer as usual). If the timer
            expires again, it SHOULD retransmit the SYN-ACK with not-ECT in
            the IP header. If other experimental fields or options were on the
            initial SYN-ACK, it will also be necessary to follow their
            specifications for fall-back. It would make sense to co-ordinate
            all the strategies for fall-back in order to isolate the specific
            cause of the problem.</t>
            <t>This fall-back strategy attempts to use ECT one more time than
            the strategy for ECT SYN-ACKs in <xref target="RFC5562" format="default"/> (which
            is made obsolete, being superseded by the present specification).
            Other fall-back strategies MAY be adopted if found to be more
            effective, e.g. fall-back to not-ECT on the first
            retransmission attempt.</t>
            <t>The server MAY cache failed connection attempts, e.g. per
            client access network. If the TCP server is caching failed
            connection attempts, it SHOULD NOT give up using ECT on the first
            SYN-ACK of subsequent connection attempts until it is clear that
            the blockage persistently and specifically affects ECT on
            SYN-ACKs. This is because loss is so commonplace for other reasons
            (see <xref target="genect_sec_fall-back-SYN" format="default"/>).</t>
            <t>A client-based alternative to caching at the server is given in
            <xref target="genecn_sec_Fall-Back_SYN-ACK" format="default"/>.</t>
            <t>If either endpoint caches failed attempts, the cache SHOULD be
            arranged to expire so that the endpoint will infrequently attempt
            to check whether the problem has been resolved.</t>
          </section>
        </section>
        <section anchor="acks" numbered="true" toc="default">
          <name>Pure ACK (Send)</name>
          <t>A Pure ACK is an ACK packet that does not carry data, which
          includes the Pure ACK at the end of TCP's 3-way handshake.</t>
          <t>For the ECN++ experiment, whether a TCP implementation sets ECT
          on a Pure ACK depends on whether or not Accurate ECN TCP feedback
          <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> has been successfully
          negotiated for a particular TCP connection, as specified in the
          following two subsections.</t>
          <section numbered="true" toc="default">
            <name>Pure ACK without AccECN Feedback</name>
            <t>If AccECN has not been successfully negotiated for a
            connection, ECT MUST NOT be set on Pure ACKs by either end.</t>
          </section>
          <section anchor="genecn_sec_pure_acks_accecn" numbered="true" toc="default">
            <name>Pure ACK with AccECN Feedback</name>
            <t>For the ECN++ experiment, a host can only set ECT on outgoing
            Pure ACKs if it satisfies the following three conditions:</t>
            <ul spacing="normal">
              <li>
                <t>it MUST have successfully negotiated AccECN feedback for
                the connection;</t>
              </li>
              <li>
                <t>it MUST have successfully negotiated SACK <xref target="RFC2018" format="default"/> for the connection;</t>
              </li>
              <li>
                <t>when it checks whether incoming pure ACKs are duplicates it
                MUST apply the additional test in <xref target="genecn_sec_dupack_tests" format="default"/>.</t>
              </li>
            </ul>
            <t>If the host satisfies all these requirements, it can then
            set ECT on a pure ACK. Section 4.3 of <xref target="RFC8311" format="default"/>
            allows an ECN experiment to use ECT on a pure ACK, by updating
            Sections 5.2 and 6.1.4 of RFC 3168 (which prohibited it).</t>
            <ul empty="true" spacing="normal">
              <li>
                <t>MEASUREMENTS NEEDED: Measurements are needed to learn how
                the deployed base of network elements and RFC 3168 servers
                react to pure ACKs marked with the ECT(0)/ECT(1)/CE
                codepoints, i.e. whether they are dropped, codepoint
                cleared or processed and the congestion indication fed back on
                a subsequent packet.</t>
              </li>
            </ul>
            <t>See <xref target="genecn_sec_rcv_ACK" format="default"/> for the implications if
            a host receives a CE-marked Pure ACK.</t>
            <section numbered="true" toc="default">
              <name>Pure ACK Congestion Response</name>
              <t>This subsection only applies for a host that is setting ECT
              on outgoing pure ACKs, which is conditional on it satisfying the
              three conditions in <xref target="genecn_sec_pure_acks_accecn" format="default"/>.</t>
              <t>A host that sets ECT on pure ACKs SHOULD respond to the
              congestion signal resulting from pure ACKs being marked with the
              CE codepoint. The specific response will need to be defined as
              an update to each congestion control specification. Possible
              responses to congestion feedback include reducing the congestion
              window (CWND) and/or regulating the pure ACK rate (see <xref target="genecn_sec_cwnd_response_pure_ACK" format="default"/>).</t>
              <t>Note that, in comparison, TCP Congestion Control <xref target="RFC5681" format="default"/> does not require a TCP to detect or respond
              to loss of pure ACKs at all; it requires no reduction in
              congestion window or ACK rate.</t>
            </section>
          </section>
        </section>
        <section numbered="true" toc="default">
          <name>Window Probe (Send)</name>
          <t>For the ECN++ experiment, the TCP sender will set ECT on window
          probes. Section 4.3 of <xref target="RFC8311" format="default"/> allows an ECN
          experiment to use ECT on a window probe, by updating Section 6.1.6
          of RFC 3168 (which prohibited it).</t>
          <t>A window probe contains a single octet, so it is no different
          from a regular TCP data segment. Therefore a TCP receiver will feed
          back any CE marking on a window probe as normal (either using
          classic ECN feedback or AccECN feedback). The sender of the probe
          will then reduce its congestion window as normal.</t>
          <t>A receive window of zero indicates that the receiving application
          is not consuming data fast enough and does not imply anything about
          network congestion. Once the receive window opens, the congestion
          window might become the limiting factor, so it is correct that
          CE-marked probes reduce the congestion window. This complements cwnd
          validation <xref target="RFC7661" format="default"/>, which reduces cwnd as more time
          elapses without having used available capacity. However, CE-marking
          on window probes does not reduce the rate of the probes themselves.
          This is unlikely to present a problem, given the duration between
          window probes doubles <xref target="RFC1122" format="default"/> as long as the
          receiver is advertising a zero window (currently minimum 1 second,
          maximum at least 1 minute <xref target="RFC6298" format="default"/>).</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>MEASUREMENTS NEEDED: Measurements are needed to learn how the
              deployed base of network elements and servers react to Window
              probes marked with the ECT(0)/ECT(1)/CE codepoints,
              i.e. whether they are dropped, codepoint cleared or
              processed.</t>
            </li>
          </ul>
        </section>
        <section numbered="true" toc="default">
          <name>FIN (Send)</name>
          <t>A TCP implementation can set ECT on a FIN.</t>
          <t>See <xref target="genecn_sec_rcv_FIN" format="default"/> for the implications if a
          host receives a CE-marked FIN.</t>
          <t>A congestion response to a CE-marking on a FIN is not
          required.</t>
          <t>After sending a FIN, the endpoint will not send any more data in
          the connection. Therefore, even if the FIN-ACK indicates that the
          FIN was CE-marked (whether using classic or AccECN feedback),
          reducing the congestion window will not affect anything.</t>
          <t>After sending a FIN, a host might send one or more pure ACKs. If
          it is using one of the techniques in <xref target="acks" format="default"/> to
          regulate the delayed ACK ratio for pure ACKs, it could equally be
          applied after a FIN. But this is not required.</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>MEASUREMENTS NEEDED: Measurements are needed to learn how the
              deployed base of network elements and servers react to FIN
              packets marked with the ECT(0)/ECT(1)/CE codepoints,
              i.e. whether they are dropped, codepoint cleared or
              processed.</t>
            </li>
          </ul>
        </section>
        <section anchor="genecn_sec_ECT_RST" numbered="true" toc="default">
          <name>RST (Send)</name>
          <t>A TCP implementation can set ECT on a RST.</t>
          <t>See <xref target="genecn_sec_rcv_RST" format="default"/> for the implications if a
          host receives a CE-marked RST.</t>
          <t>A congestion response to a CE-marking on a RST is not required
          (and actually not possible).</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>MEASUREMENTS NEEDED: Measurements are needed to learn how the
              deployed base of network elements and servers react to RST
              packets marked with the ECT(0)/ECT(1)/CE codepoints,
              i.e. whether they are dropped, codepoint cleared or
              processed.</t>
            </li>
          </ul>
          <t>Implementers SHOULD ensure that RST packets are always sent out
          with the same ECN field regardless of the TCP state machine.
          Otherwise the ECN field could reveal internal TCP state. For
          instance, the ECN field on a RST ought not to reveal any distinction
          between a non-listening port, a recently in-use port, and a closed
          session port.</t>
        </section>
        <section anchor="genect_sec_ECT_reXMT" numbered="true" toc="default">
          <name>Retransmissions (Send)</name>
          <t>For the ECN++ experiment, the TCP sender will set ECT on
          retransmitted segments. Section 4.3 of <xref target="RFC8311" format="default"/>
          allows an ECN experiment to use ECT on a retransmission, by updating
          Sections 6.1.5 of RFC 3168 (which prohibited it).</t>
          <t>See <xref target="genecn_sec_rcv_reXMT" format="default"/> for the implications if
          a host receives a CE-marked retransmission.</t>
          <t>If the TCP sender receives feedback that a retransmitted packet
          was CE-marked, it will react as it would to any feedback of
          CE-marking on a data packet.</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>MEASUREMENTS NEEDED: Measurements are needed to learn how the
              deployed base of network elements and servers react to
              retransmissions marked with the ECT(0)/ECT(1)/CE codepoints,
              i.e. whether they are dropped, codepoint cleared or
              processed.</t>
            </li>
          </ul>
        </section>
        <section anchor="genect_sec_gen_fall-back" numbered="true" toc="default">
          <name>General Fall-back for any Control Packet or Retransmission</name>
          <t>Extensive measurements in fixed and mobile networks <xref target="Mandalari18" format="default"/> have found no evidence of blockages due to
          ECT being set on any type of TCP control packet.</t>
          <t>In case traversal problems arise in future, fall-back measures
          have been specified above, but only for the cases regarding the
          initial packet of a half-connection (SYN or SYN-ACK) where ECT is
          persistently failing to get through.</t>
          <t>Fall-back measures for blockage of ECT on other TCP control
          packets MAY be implemented. However they are not specified here
          given the lack of any evidence they will be needed. <xref target="genect_sec_gen_fall-back_justify" format="default"/> justifies this advice in
          more detail.</t>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Receiver Behaviour</name>
        <t>The present ECN++ specification primarily concerns the behaviour
        for sending TCP control packets or retransmissions. Below are a few
        changes to the receive side of an implementation that are recommended
        while updating its send side. Nonetheless, where deployment is
        concerned, ECN++ is still a sender-only deployment, because it does
        not depend on receivers complying with any of these
        recommendations.</t>
        <section anchor="genecn_sec_rcv_general" numbered="true" toc="default">
          <name>Receiver Behaviour for Any TCP Control Packet or Retransmission</name>
          <t>RFC8311 is a standards track update to RFC 3168 in order to
          (amongst other things) "...allow the use of ECT codepoints on SYN
          packets, pure acknowledgement packets, window probe packets, and
          retransmissions of packets..., provided that the changes from RFC
          3168 are documented in an Experimental RFC in the IETF document
          stream."</t>
          <t>Section 4.3 of RFC 8311 amends every statement in RFC 3168 that
          precludes the use of ECT on control packets and retransmissions to
          add "unless otherwise specified by an Experimental RFC in the IETF
          document stream". The present specification is such an Experimental
          RFC. Therefore, In order for the present RFC 8311 experiment to be
          useful, TCP receivers will need to satisfy the following
          requirements:</t>
          <ul spacing="normal">
            <li>
              <t>Any TCP implementation SHOULD accept receipt of any valid TCP
              control packet or retransmission irrespective of its IP/ECN
              field. If any existing implementation does not, it SHOULD be
              updated to do so.</t>
            </li>
            <li>
              <t>A TCP implementation taking part in the experiments proposed
              here MUST accept receipt of any valid TCP control packet or
              retransmission irrespective of its IP/ECN field.</t>
            </li>
          </ul>
          <t>The following sections give further requirements specific
          to each type of control packet.</t>
          <t>These measures are derived from the robustness principle of "...
          be liberal in what you accept from others", not only to ensure
          compatibility with the present experimental specification, but also
          any future protocol changes that allow ECT on any TCP packet.</t>
        </section>
        <section anchor="genecn_sec_rcv_SYN" numbered="true" toc="default">
          <name>SYN (Receive)</name>
          <t>RFC 3168 negotiates the use of ECN for the connection end-to-end
          using the ECN flags in the TCP header. RFC 3168 originally said that
          "A host MUST NOT set ECT on SYN ... packets." but it was silent as
          to what a TCP server ought to do if it receives a SYN packet with a
          non-zero IP/ECN field anyway.</t>
          <t>For the avoidance of doubt, the normative statements for all TCP
          control packets in <xref target="genecn_sec_rcv_general" format="default"/> are
          interpreted for the specific case when a SYN is received as
          follows:</t>
          <ul spacing="normal">
            <li>
              <t>Any TCP server implementation SHOULD accept receipt of a
              valid SYN that requests ECN support for the connection,
              irrespective of the IP/ECN field of the SYN. If any existing
              implementation does not, it SHOULD be updated to do so.</t>
            </li>
            <li>
              <t>A TCP implementation taking part in the ECN++ experiment MUST
              accept receipt of a valid SYN, irrespective of its IP/ECN
              field.</t>
            </li>
            <li>
              <t>If the SYN is CE-marked and the server has no logic to feed
              back a CE mark on a SYN-ACK (e.g. it does not support
              AccECN), it has to ignore the CE-mark (the client detects this
              case and behaves conservatively in mitigation - see <xref target="genect_sec_SYN-response" format="default"/>).</t>
            </li>
          </ul>
          <t>Rationale: At the time of the writing, some implementations of
          TCP servers (see <xref target="genecn_sec_unexpected_ECN_Server" format="default"/>)
          assume that, if a host receives a SYN with a non-zero IP/ECN field,
          it must be due to network mangling, and they disable ECN for the
          rest of the connection. <xref target="genecn_sec_unexpected_ECN_Server" format="default"/> cites a measurement
          study run in 2017 that found no occurrence of this type of network
          mangling. However, a year earlier, when ECN was enabled on
          connections from Apple clients, there was a case of a whole network
          that re-marked the ECN field of every packet to CE (it was rapidly
          fixed).</t>
          <t>When ECN was not allowed on SYNs, it made sense to look for a
          non-zero ECN field on the SYN to detect this type of network
          mangling. But now that ECN is being allowed on a SYN, detection
          needs to be more nuanced. A server needs to disable the test on the
          SYN alone for AccECN SYNs (which was done for Linux RFC 3168 servers
          in 2019 <xref target="relax-strict-ecn" format="default"/>) and for RFC 3168 SYNs it
          needs to watch for three or four packets all set to CE at the start
          of a flow. If such mangling is indeed now so rare, it would also be
          preferable to log each case detected and manually report it to the
          responsible network, so that the problem will eventually be
          eliminated.</t>
        </section>
        <section anchor="genecn_sec_rcv_ACK" numbered="true" toc="default">
          <name>Pure ACK (Receive)</name>
          <t>For the avoidance of doubt, the normative statements for all TCP
          control packets in <xref target="genecn_sec_rcv_general" format="default"/> are
          interpreted for the specific case when a Pure ACK is received as
          follows:</t>
          <ul spacing="normal">
            <li>
              <t>Any TCP implementation SHOULD accept receipt of a pure ACK
              with a non-zero IP-ECN field, as now allowed by <xref target="RFC8311" format="default"/>, which updated section 6.1.4 of <xref target="RFC3168" format="default"/> (which previously required the ECN field to
              be cleared to zero on all pure ACKs).</t>
            </li>
            <li>
              <t>A TCP implementation taking part in the ECN++ experiment MUST
              accept receipt of a pure ACK with a non-zero ECN field.</t>
            </li>
          </ul>
          <t>The question of whether and how the receiver of pure ACKs is
          required to feed back any CE marks on them is outside the scope of
          the present specification because it is a matter for the relevant
          feedback specification (<xref target="RFC3168" format="default"/> or <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>). AccECN feedback mandates
          counting of CE marks on any control packets including pure ACKs.
          Whereas RFC 3168 is silent on this point, so feedback of CE-markings
          might be implementation specific (see <xref target="genecn_sec_cwnd_response_pure_ACK" format="default"/>).</t>
          <section anchor="genecn_sec_dupack_tests" numbered="true" toc="default">
            <name>Additional DupACK Check</name>
            <t>A TCP implementation that is sending ECN-capable pure ACKs MUST
            add the following check to all its algorithms that detect
            duplicate ACKs (defined in Section 2 of <xref target="RFC5681" format="default"/>):</t>
            <ul spacing="normal">
              <li>
                <t>If there is no SACK option on an incoming pure ACK
                (ECN-capable or not) despite SACK having been negotiated, it
                is not counted as a duplicate ACK.</t>
              </li>
            </ul>
            <t>SACK blocks are known to be stripped on some paths
            through the public Internet, or some implementations are known to
            negotiate SACK but never send SACK blocks. Therefore, if a TCP
            implementation is sending ECN-capable pure ACKs, it SHOULD check
            for these pathologies (unless it is intended solely for an
            environment known to be clear of them), as follows:</t>
            <ul spacing="normal">
              <li>
                <t>If an incoming pure ACK appears to be a duplicate,
                but:</t>
                <ul spacing="normal">
                  <li>
                    <t>it does not carry any SACK blocks (despite SACK having
                    been negotiated)</t>
                  </li>
                  <li>
                    <t>and AccECN <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>
                    has been negotiated but the ACE field has increased by
                    less than 3 (after allowing for wrap)</t>
                  </li>
                </ul>
                <t>then the implementation can deem that SACK blocks are
                being stripped. In this case, for the rest of the connection,
                it SHOULD:</t>
                <ul spacing="normal">
                  <li>
                    <t>either disable the sending of ECN-capable pure
                    ACKs;</t>
                  </li>
                  <li>
                    <t>or replace any instance of the above additional DupACK
                    check with heuristics such as the following examples:</t>
                    <ul spacing="normal">
                      <li>
                        <t>If the ACE field <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> has incremented
                        by at least 3, an incoming ACK is not counted as a
                        duplicate ACK;</t>
                      </li>
                      <li>
                        <t>if the Timestamp option (TSopt) is available <xref target="RFC7323" format="default"/>, and the echoed timestamp (TSecr)
                        increments relative to the previous ACK, an incoming
                        ACK is not counted as a Duplicate ACK.</t>
                      </li>
                    </ul>
                  </li>
                </ul>
              </li>
            </ul>
            <t>An additional DupACK check is one of the mandatory conditions
            specified in <xref target="genecn_sec_pure_acks_accecn" format="default"/> for
            sending ECN-capable pure ACKs (the others are AccECN mode and
            SACK-negotiated mode).</t>
            <t>See <xref target="genecn_sec_pure_ACK_or_DupACK" format="default"/> for
            rationale.</t>
          </section>
        </section>
        <section anchor="genecn_sec_rcv_FIN" numbered="true" toc="default">
          <name>FIN (Receive)</name>
          <t>The normative statements for all TCP control packets in <xref target="genecn_sec_rcv_general" format="default"/> apply for the specific case when a
          FIN is received, with 'valid' defined as follows:</t>
          <t>The TCP data receiver MUST ignore the CE codepoint on incoming
          FINs that fail any validity check. The validity check in section 5.2
          of <xref target="RFC5961" format="default"/> is RECOMMENDED.</t>
        </section>
        <section anchor="genecn_sec_rcv_RST" numbered="true" toc="default">
          <name>RST (Receive)</name>
          <t>The normative statements for all TCP control packets in <xref target="genecn_sec_rcv_general" format="default"/> apply for the specific case when a
          RST is received, with 'valid' defined as follows:</t>
          <t>The "challenge ACK" approach to checking the validity of RSTs
          (section 3.2 of <xref target="RFC5961" format="default"/>) is RECOMMENDED at the data
          receiver.</t>
        </section>
        <section anchor="genecn_sec_rcv_reXMT" numbered="true" toc="default">
          <name>Retransmissions (Receive)</name>
          <t>The normative statements for all TCP control packets in <xref target="genecn_sec_rcv_general" format="default"/> apply for the specific case when a
          retransmission is received, with 'valid' defined as follows:</t>
          <t>The TCP data receiver MUST ignore the CE codepoint on incoming
          segments that fail any validity check. The validity check in section
          5.2 of <xref target="RFC5961" format="default"/> is RECOMMENDED. This will
          effectively mitigate an attack that uses spoofed data packets to
          fool the receiver into feeding back spoofed congestion indications
          to the sender, which in turn would be fooled into continually
          reducing its congestion window.</t>
        </section>
      </section>
    </section>
    <section anchor="arguments" numbered="true" toc="default">
      <name>Rationale</name>
      <t>This section is informative, not normative. It presents
      counter-arguments against the justifications in the RFC series for
      disabling ECN on TCP control segments and retransmissions. It also gives
      rationale for why ECT is safe on control segments that have not, so far,
      been mentioned in the RFC series (FINs and RSTs). First it addresses
      over-arching arguments used for most packet types, then it addresses the
      specific arguments for each packet type in turn.</t>
      <section anchor="reliability" numbered="true" toc="default">
        <name>The Reliability Argument</name>
        <t>Section 5.2 of RFC 3168 states: </t>
        <ul empty="true" spacing="normal">
          <li>
            <t>"To ensure the reliable delivery of the congestion indication
            of the CE codepoint, an ECT codepoint MUST NOT be set in a packet
            unless the loss of that packet [at a subsequent node] in the
            network would be detected by the end nodes and interpreted as an
            indication of congestion."</t>
          </li>
        </ul>
        <t>We believe this argument is misplaced. TCP does not deliver most
        control packets reliably. So it is more important to allow control
        packets to be ECN-capable, which greatly improves reliable delivery of
        the control packets themselves (see motivation in <xref target="genecn_sec_motivation" format="default"/>). ECN also improves the reliability
        and latency of delivery of any congestion notification on control
        packets, particularly where TCP does not detect the loss of certain
        types of control packet anyway. Both these points outweigh by far the
        concern that a CE marking applied to a control packet by one node
        might subsequently be dropped by another node.</t>
        <!--Perversely, by prohibiting ECT on control packets, RFC 3168 compromises reliable delivery of control packets themselves 
just because there is a (much smaller) possibility that a CE marking might not be reliably delivered. Even though, without ECN, 
the loss of the same packet would not have been detected anyway.-->

        <t>The principle to determine whether a packet can be ECN-capable
        ought to be "do no extra harm", meaning that the reliability of a
        congestion signal's delivery ought to be no worse with ECN than
        without.</t>
        <t>It will help to first compare with the case of a reliably delivered
        packet (e.g. a SYN or data packet) that is made ECN-capable. If it is
        CE-marked at two buffers in succession, it is not discarded by the
        first buffer so it goes on to help congest the second. But it delivers
        only one congestion signal. Similarly, if instead it is marked at the
        first buffer and dropped at the second, it still helps congest the
        second buffer, but it still delivers only one congestion signal (the
        loss).</t>
        <t>Some non-ECN TCP control packets (e.g. pure ACKs or FINs) certainly
        do not reliably deliver a congestion signal if they are discarded.
        But, making such control packets ECN-capable upgrades their ability to
        deliver a congestion signal from a buffer with ECN support. However,
        as before, they still cannot reliably deliver a loss signal from a
        non-ECN buffer. This includes the case where one congested buffer
        CE-marks such a packet, then a second congested buffer without ECN
        support discards it.</t>
        <t>Thus ECN is always more and never less reliable for delivery of
        congestion notification.</t>
      </section>
      <section anchor="genecn_sec_rationale_SYN" numbered="true" toc="default">
        <name>SYNs</name>
        <!-- Motivation for setting the ECT codepoint in SYN packets: If the ECT codepoint
        is not set in SYN packets, the SYN packets are much more likely to be dropped
        in congestion episodes. Because the only way to detect that a SYN packet has
        been lost is to wait for the retransmission timer to expire, this imposes a
        significant performance penalty. The situation is especially bad in the case
        where all traffic is ECN capable (such as a DC where ECN is used by default),
        because this means that all the rest of the traffic will be ECT marked and the
        first packets to be dropped will be the ones without the ECT bit set, in
        particular SYNs. See Judd's paper for specific experiments.-->

        <t>RFC 5562 presents two arguments against ECT marking of SYN packets
        (quoted verbatim): </t>
        <ul empty="true" spacing="normal">
          <li>
            <t>"First, when the TCP SYN packet is sent, there are no
            guarantees that the other TCP endpoint (node B in Figure 2) is
            ECN-Capable, or that it would be able to understand and react if
            the ECN CE codepoint was set by a congested router.</t>
          </li>
          <li>
            <t>Second, the ECN-Capable codepoint in TCP SYN packets could be
            misused by malicious clients to "improve" the well-known TCP SYN
            attack. By setting an ECN-Capable codepoint in TCP SYN packets, a
            malicious host might be able to inject a large number of TCP SYN
            packets through a potentially congested ECN-enabled router,
            congesting it even further."</t>
          </li>
        </ul>
        <t>The first point actually describes two subtly different
        issues. So below three arguments are countered in turn.</t>
        <section anchor="genecn_sec_CE-missed" numbered="true" toc="default">
          <name>Argument 1a: Unrecognized CE on the SYN</name>
          <t>This argument certainly applied at the time RFC 5562 was written,
          when no ECN responder mechanism had any logic to recognize a CE
          marking on a SYN and, even if logic were added, there was no field
          in the SYN-ACK to feed it back. The problem was that, during the
          3WHS, the flag in the TCP header for ECN feedback (called Echo
          Congestion Experienced) had been overloaded to negotiate the use of
          ECN itself.</t>
          <t>The accurate ECN (AccECN) protocol <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> has since been designed to
          solve this problem. Two features are important here:</t>
          <ol spacing="normal" type="1"><li>
              <t>An AccECN server uses the 3 AccECN flags in the TCP header of
              the SYN-ACK to respond to the client. 4 of the possible 8
              codepoints provide enough space for the server to feed back
              which of the 4 IP/ECN codepoints was on the incoming SYN
              (including CE of course).</t>
            </li>
            <li>
              <t>If any of these 4 codepoints are in the SYN-ACK, it confirms
              that the server supports AccECN and, if another codepoint is
              returned, it confirms that the server does not support
              AccECN.</t>
            </li>
          </ol>
          <t>This still does not seem to allow a client to set ECT on a SYN,
          it only finds out whether the server would have supported it
          afterwards. The trick the client uses for ECN++ is to set ECT on the
          SYN optimistically then, if the SYN-ACK reveals that the server
          wouldn't have understood CE on the SYN, the client responds
          conservatively as if the SYN was marked with CE.</t>
          <t>The recommended conservative congestion response is to reduce the
          initial window, which does not affect the performance of very
          popular protocols such as HTTP, since it is currently extremely rare
          for an HTTP client to send more than one packet as its initial
          request anyway (for data on HTTP/1 &amp; HTTP/2 request sizes see
          Fig 3 in <xref target="Manzoor17" format="default"/>). Any clients that do frequently
          use a larger initial window for their first message to the server
          can cache which servers will not understand ECT on a SYN (see <xref target="genecn_sec_SYN_cache_rationale" format="default"/> below). If caching is not
          practical, such clients could reduce the initial window to say IW2
          or IW3.</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>EXPERIMENTATION NEEDED: Experiments will be needed to
              determine any better strategy for reducing IW in response to
              congestion on a SYN, when the server does not support congestion
              feedback on the SYN-ACK (whether cached or discovered
              explicitly).</t>
            </li>
          </ul>
          <!--          <t>This specification does not recommend enabling ECN support in the
          SYN when the TCP initiator does not supports AccECN. The reason for
          this is because supporting this additional case would require to
          allocate additional reserved bits in the TCP header to signal this
          scenario and the TCP's header reserved bits are scarce.</t>
-->
        </section>
        <section anchor="genecn_sec_unexpected_ECN" numbered="true" toc="default">
          <name>Argument 1b: ECT Considered Invalid on the SYN</name>
          <t>Given that prior to <xref target="RFC8311" format="default"/> ECT-marked SYN
          packets were prohibited, it cannot be assumed they will be accepted,
          by TCP middleboxes or servers.</t>
          <section numbered="true" toc="default">
            <name>ECT on SYN Considered Invalid by Middleboxes</name>
            <t>According to a study using 2014 data <xref target="ecn-pam" format="default"/>
            from a limited range of fixed vantage points, for the top 1M Alexa
            web sites, adding the ECN capability to SYNs increased connection
            establishment failures by about 0.4%.</t>
            <t>From a wider range of fixed and mobile vantage points, a more
            recent study in Jan-May 2017 <xref target="Mandalari18" format="default"/> found no
            occurrences of blocking of ECT on SYNs. However, in more than half
            the mobile networks tested it found wiping of the ECN codepoint at
            the first hop.</t>
            <ul empty="true" spacing="normal">
              <li>
                <t>MEASUREMENTS NEEDED: As wiping at the first hop is
                remedied, measurements will be needed to check whether SYNs
                with ECT are sometimes blocked deeper into the path.</t>
              </li>
            </ul>
            <t>Silent failures introduce a retransmission timeout delay
            (default 1 second) at the initiator before it attempts any fall
            back strategy (whereas explicit RSTs can be dealt with
            immediately). Ironically, making SYNs ECN-capable is intended to
            avoid the timeout when a SYN is lost due to congestion.
            Fortunately, if there is any discard of ECN-capable SYNs due to
            policy, it will occur predictably, not randomly like congestion.
            So the initiator should be able to avoid it by caching paths or
            servers that do not support ECN-capable SYNs (see the last
            paragraph of <xref target="genecn_sec_SYN_cache" format="default"/>).</t>
          </section>
          <section anchor="genecn_sec_unexpected_ECN_Server" numbered="true" toc="default">
            <name>ECT on SYN Considered Invalid by Servers</name>
            <t>A study conducted in Nov 2017 <xref target="Kuehlewind18" format="default"/>
            found that, of the 82% of the Alexa top 50k web servers that
            supported ECN, 84% disabled ECN if the IP/ECN field on the SYN was
            ECT0, CE or either. Given most web servers use Linux, this
            behaviour can most likely be traced to a patch contributed in May
            2012 that was first distributed in v3.5 of the Linux kernel <xref target="strict-ecn" format="default"/>. The comment says "RFC3168 : 6.1.1 SYN
            packets must not have ECT/ECN bits set. If we receive a SYN packet
            with these bits set, it means a network is playing bad games with
            TOS bits. In order to avoid possible false congestion
            notifications, we disable TCP ECN negociation." Of course, some of
            the 84% might be due to similar code in other OSs.</t>
            <t>For brevity we shall call this the "over-strict" ECN test,
            because it is over-conservative with what it accepts, contrary to
            Postel's robustness principle. A robust protocol will not usually
            assume network mangling without comparing with the value
            originally sent, and one packet is not sufficient to make an
            assumption with such irreversible consequences anyway.</t>
            <t>Ironically, networks rarely seem to alter the IP/ECN field on a
            SYN from zero to non-zero anyway. In a study conducted in Jan-May
            2017 over millions of paths from vantage points in a few dozen
            mobile and fixed networks <xref target="Mandalari18" format="default"/>, no such
            transition was observed. With such a small or non-existent
            incidence of this sort of network mangling, it would be preferable
            to report any residual problem paths so that they can be
            fixed.</t>
            <t>Whatever, the widespread presence of this 'over-strict' test
            proves that RFC 5562 was correct to expect that ECT would be
            considered invalid on SYNs. Nonetheless, it is not an
            insurmountable problem - the over-strict test in Linux was patched
            in Apr 2019 <xref target="relax-strict-ecn" format="default"/> and caching can work
            round it where previous versions of Linux are running. The
            prevalence of these "over-strict" ECN servers makes it challenging
            to cache them all. However, <xref target="genecn_sec_SYN_cache_rationale" format="default"/> below explains how a
            cache of limited size can alleviate this problem for a client's
            most popular sites.</t>
            <t>For the future, <xref target="RFC8311" format="default"/> updates RFC 3168 to
            clarify that the IP/ECN field does not have to be zero on a SYN if
            documented in an experimental RFC such as the present ECN++
            specification.</t>
          </section>
        </section>
        <section anchor="genecn_sec_SYN_cache_rationale" numbered="true" toc="default">
          <name>Caching Strategies for ECT on SYNs</name>
          <t>Given the server handling of ECN on SYNs outlined in <xref target="genecn_sec_unexpected_ECN_Server" format="default"/> above, an initiator
          might combine AccECN with three candidate strategies for setting ECT
          on a SYN and caching the outcome:</t>
          <ol spacing="normal" type="(S%d):"><li>
              <t>Pessimistic ECT and cache successes: The initiator always
              requests AccECN, but by default without ECT on the SYN. Then it
              caches those servers that confirm that they support AccECN as
              'ECT SYN OK'. On a subsequent connection to any server that
              supports AccECN, the initiator can then set ECT on the SYN. When
              connecting to other servers (non-ECN or classic ECN) it will not
              set ECT on the SYN, so it will not fail the 'over-strict' ECN
              test.</t>
              <t>Longer term, as servers upgrade to
              AccECN, the initiator is still requesting AccECN, so it will add
              them to the cache and use ECT on subsequent SYNs to those
              servers. However, assuming it has to cap the size of the cache,
              the client will not have the benefit of ECT SYNs to those less
              frequently used AccECN servers expelled from its cache.</t>
            </li>
            <li>
              <t>Optimistic ECT: The initiator always requests AccECN and by
              default sets ECT on the SYN. Then, if the server response shows
              it has no AccECN logic (so it cannot feed back a CE mark), the
              initiator conservatively behaves as if the SYN was CE-marked, by
              reducing its initial window. Two caching sub-strategies are
              feasible:</t>
              <ol spacing="normal" type="a"><li>
                  <t>No cache.</t>
                </li>
                <li>
                  <t>Cache failures: The optimistic ECT strategy can be
                  improved by caching solely those servers that do not support
                  AccECN as 'ECT SYN NOK'. This would include non-ECN servers
                  and all Classic ECN servers whether 'over-strict' or not. On
                  subsequent connections to these non-AccECN servers, the
                  initiator will still request AccECN but not set ECT on the
                  SYN. Then, the connection can still fall back to Classic
                  ECN, if the server supports it, and the initiator can use
                  its full initial window (if it has enough request data to
                  need it). </t>
                  <t>Longer term, as servers
                  upgrade to AccECN, the initiator will remove them from the
                  cache and use ECT on subsequent SYNs to that server.</t>
                  <t>Where an access network operator mediates
                  Internet access via a proxy that does not support AccECN,
                  the optimistic ECT strategy will always fail. This scenario
                  is more likely in mobile networks. Therefore, a mobile host
                  could cache lack of AccECN support per attached access
                  network operator. Whenever it attached to a new operator, it
                  could check a well-known AccECN test server and, if it found
                  no AccECN support, it would add a cache entry for the
                  attached operator. It would only use ECT when neither
                  network nor server were cached. It would only populate its
                  per server cache when not attached to a non-AccECN
                  proxy.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>ECT by configuration: In a controlled environment, the
              administrator can make sure that servers support ECN-capable SYN
              packets. Examples of controlled environments are single-tenant
              DCs, and possibly multi-tenant DCs if it is assumed that each
              tenant mostly communicates with its own VMs.</t>
            </li>
          </ol>
          <t>For unmanaged environments like the public Internet,
          pragmatically the choice is between strategies (S1), (S2A) and
          (S2B). The normative specification for ECT on a SYN in <xref target="genecn_sec_SYN" format="default"/> recommends the "optimistic ECT and cache
          failures" strategy (S2B) but the choice depends on the implementer's
          motivation for using ECN++, and the deployment prevalence of
          different technologies and bug-fixes. </t>
          <ul spacing="normal">
            <li>
              <t>The "pessimistic ECT and cache successes" strategy (S1)
              suffers from exposing the initial SYN to the prevailing loss
              level, even if the server supports ECT on SYNs, but only on the
              first connection to each AccECN server. If AccECN becomes widely
              deployed on servers, SYNs to those AccECN servers that are less
              frequently used by the client and therefore don't fit in the
              cache will not benefit from ECN protection at all.</t>
            </li>
            <li>
              <t>The "optimistic ECT without a cache" strategy (S2A) is the
              simplest. It would satisfy the goal of an implementer who is
              solely interested in low latency using AccECN and ECN++ and is
              not concerned about fall-back to Classic ECN.</t>
            </li>
            <li>
              <t>The "optimistic ECT and cache failures" strategy (S2B)
              exploits ECT on SYNs from the very first attempt. But if the
              server turns out to be 'over-strict' it will disable ECN for the
              connection, but only for the first connection if it's one of the
              client's more popular servers that fits in the cache. If the
              server turns out not to support AccECN, the initiator has to
              conservatively limit its initial window, but again only for the
              first connection if it's one of the client's more popular
              servers (and anyway this rarely makes any difference when most
              client requests fit in a single packet).</t>
            </li>
          </ul>
          <t>Note that, if AccECN deployment grows, storage for 'caching
          successes' (S1) starts off small then grows, while with 'caching
          failures' (S2B) it is large at first, then shrinks. At half-way, the
          size of the cache has to be capped with either approach, so the
          default behaviour for all the servers that do not fit in the cache
          is as important as the behaviour for the popular servers that do
          fit.</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>MEASUREMENTS NEEDED: Measurements are needed to determine
              which strategy would be sufficient for any particular client,
              whether a particular client would need different strategies in
              different circumstances and how many occurrences of problems
              would be masked by how few cache entries.</t>
            </li>
          </ul>
          <t>Another strategy would be to send a not-ECT SYN a short delay
          (below the typical lowest RTT) after an ECT SYN and only accept the
          non-ECT connection if it returned first. This would reduce the
          performance penalty for those deploying ECT SYN support. However,
          this 'happy eyeballs' approach becomes complex when multiple
          optional features are all tried on the first SYN (or on multiple
          SYNs), so it is not recommended.</t>
        </section>
        <section anchor="genecn_sec_SYN_DOS" numbered="true" toc="default">
          <name>Argument 2: DoS Attacks</name>
          <t><xref target="RFC5562" format="default"/> says that ECT SYN packets could be
          misused by malicious clients to augment "the well-known TCP SYN
          attack". It goes on to say "a malicious host might be able to inject
          a large number of TCP SYN packets through a potentially congested
          ECN-enabled router, congesting it even further."</t>
          <t>We assume this is a reference to the TCP SYN flood attack (see
          https://en.wikipedia.org/wiki/SYN_flood), which is an attack against
          a responder end point. We assume the idea of this attack is to use
          ECT to get more packets through an ECN-enabled router in preference
          to other non-ECN traffic so that they can go on to use the SYN
          flooding attack to inflict more damage on the responder end point.
          This argument could apply to flooding with any type of packet, but
          we assume SYNs are singled out because their source address is
          easier to spoof, whereas floods of other types of packets are easier
          to block.</t>
          <t>Mandating Not-ECT in an RFC does not stop attackers using ECT for
          flooding. Nonetheless, if a standard says SYNs are not meant to be
          ECT it would make it legitimate for firewalls to discard them.
          However this would negate the considerable benefit of ECT SYNs for
          compliant transports and seems unnecessary because RFC 3168 already
          provides the means to address this concern. In section 7, RFC 3168
          says "During periods where ... the potential packet marking rate
          would be high, our recommendation is that routers drop packets
          rather then set the CE codepoint..." and this advice is repeated in
          <xref target="RFC7567" format="default"/> (section 4.2.1). This makes it harder for
          flooding packets to gain from ECT.</t>
          <t><xref target="ecn-overload" format="default"/> showed that ECT can only slightly
          augment flooding attacks relative to a non-ECT attack. It was hard
          to overload the link without causing the queue to grow, which in
          turn caused the AQM to disable ECN and switch to drop, thus negating
          any advantage of using ECT. This was true even with the switch-over
          point set to 25% drop probability (i.e. the arrival rate was
          133% of the link rate).</t>
        </section>
      </section>
      <section anchor="genecn_sec_argue_SYN-ACK" numbered="true" toc="default">
        <name>SYN-ACKs</name>
        <t>The proposed approach in <xref target="genecn_sec_SYN-ACK" format="default"/> for
        experimenting with ECN-capable SYN-ACKs is effectively identical to
        the scheme called ECN+ <xref target="ECN-PLUS" format="default"/>. In 2005, the ECN+
        paper demonstrated that it could reduce the average Web response time
        by an order of magnitude. It also argued that adding ECT to SYN-ACKs
        did not raise any new security vulnerabilities.</t>
        <section anchor="genecn_sec_CE-missed-SYN-ACK" numbered="true" toc="default">
          <name>Possibility of Unrecognized CE on the SYN-ACK</name>
          <t>The feedback behaviour by the initiator in response to a
          CE-marked SYN-ACK from the responder depends on whether classic ECN
          feedback <xref target="RFC3168" format="default"/> or AccECN feedback <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> has been negotiated. In either
          case no change is required to RFC 3168 or the AccECN
          specification.</t>
          <t>Some classic ECN client implementations might ignore a CE-mark on
          a SYN-ACK, or even ignore a SYN-ACK packet entirely if it is set to
          ECT or CE. This is a possibility because an RFC 3168 implementation
          would not necessarily expect a SYN-ACK to be ECN-capable. This issue
          already came up when the IETF first decided to experiment with ECN
          on SYN-ACKs <xref target="RFC5562" format="default"/> and it was decided to go ahead
          without any extra precautionary measures. This was because the
          probability of encountering the problem was believed to be low and
          the harm if the problem arose was also low (see Appendix B of RFC
          5562).</t>
        </section>
        <section anchor="rationale-syn-ack-congestion-resp" numbered="true" toc="default">
          <name>Response to Congestion on a SYN-ACK</name>
          <t>The IETF has already specified an experiment with ECN-capable
          SYN-ACK packets <xref target="RFC5562" format="default"/>. It was inspired by the
          ECN+ paper, but it specified a much more conservative congestion
          response to a CE-marked SYN-ACK, called ECN+/TryOnce. This required
          the server to reduce its initial window to 1 segment (like ECN+),
          but then the server had to send a second SYN-ACK and wait for its
          ACK before it could continue with its initial window of 1 SMSS. The
          second SYN-ACK of this 5-way handshake had to carry no data, and had
          to disable ECN, but no justification was given for these last two
          aspects.</t>
          <t>The present ECN++ experimental specification obsoletes RFC 5562
          because it uses the ECN+ congestion response, not ECN+/TryOnce.
          First we argue against the rationale for ECN+/TryOnce given in
          sections 4.4 and 6.2 of <xref target="RFC5562" format="default"/>. It starts with a
          rather too literal interpretation of the requirement in RFC 3168
          that says TCP's response to a single CE mark has to be "essentially
          the same as the congestion control response to a *single* dropped
          packet." TCP's response to a dropped initial (SYN or SYN-ACK) packet
          is to wait for the retransmission timer to expire (currently 1s).
          However, this long delay assumes the worst case between two possible
          causes of the loss: a) heavy overload; or b) the normal
          capacity-seeking behaviour of other TCP flows. When the network is
          still delivering CE-marked packets, it implies that there is an AQM
          at the bottleneck and that it is not overloaded. This is because an
          AQM under overload will disable ECN (as recommended in section 7 of
          RFC 3168 and repeated in section 4.2.1 of RFC 7567). So scenario (a)
          can be ruled out. Therefore, TCP's response to a CE-marked SYN-ACK
          can be similar to its response to the loss of <em>any</em>
          packet, rather than backing off as if the special <em>initial</em> packet of a flow has been lost.</t>
          <t>How TCP responds to the loss of any single packet depends what it
          has just been doing. But there is not really a precedent for TCP's
          response when it experiences a CE mark having sent only one (small)
          packet. If TCP had been adding one segment per RTT, it would have
          halved its congestion window, but it hasn't established a congestion
          window yet. If it had been exponentially increasing it would have
          exited slow start, but it hasn't started exponentially increasing
          yet so it hasn't established a slow-start threshold.</t>
          <t>Therefore, we have to work out a reasoned argument for what to
          do. If an AQM is CE-marking packets, it implies there is already a
          queue and it is probably already somewhere around the AQM's
          operating point - it is unlikely to be well below and it might be
          well above. So, the more data packets that the client sends in its
          IW, the more likely at least one will be CE marked, leading it to
          exit slow-start early. On the other hand, it is highly unlikely that
          the SYN-ACK itself pushed the AQM into congestion, so it will be
          safe to introduce another single segment immediately (1 RTT after
          the SYN-ACK). Therefore, starting to probe for capacity with a slow
          start from an initial window of 1 segment seems appropriate to the
          circumstances. This is the approach adopted in <xref target="genecn_sec_SYN-ACK" format="default"/>.</t>
          <ul empty="true" spacing="normal">
            <li>
              <t>EXPERIMENTATION NEEDED: Experiments will be needed to check
              the above reasoning and determine any better strategy for
              reducing IW in response to congestion on a SYN-ACK (or a
              SYN).</t>
            </li>
          </ul>
        </section>
        <section anchor="genecn_sec_Fall-Back_SYN-ACK" numbered="true" toc="default">
          <name>Fall-Back if ECT SYN-ACK Fails</name>
          <t><xref target="genect_sec_fall-back-SYN-ACK" format="default"/> describes how a
          server could cache failed connection attempts. As an alternative,
          the server could rely on the client to cache failed attempts (on the
          basis that the client would cache a failure whether ECT was blocked
          on the SYN or the SYN-ACK). This strategy cannot be used if the SYN
          does not request AccECN support.</t>
          <t>It works as follows. If a server would rather not maintain its
          own cache, when it receives a SYN that requests AccECN support but
          is set to not-ECT, the server replies with a SYN-ACK also set to
          not-ECT. This gives the client the power to disable ECT on both the
          SYN and SYN-ACK, if it has cached knowedge that there were previous
          problems.</t>
          <t>If a middlebox only blocks ECT on SYNs, not SYN-ACKs, this
          strategy might disable ECN on a SYN-ACK when it did not need to, but
          at least it saves the server from maintaining a cache. However, a
          client cannot rely on all non-caching servers suppressing ECT on
          SYN/ACKs when they might not need to.</t>
          <t>Therefore, a more practical way for a client to cache failures on
          behalf of the server would be for the client to initially fall-back
          to Not-ECT on the SYN after multiple timeouts, then if that doesn't
          resolve the problem, the client could disable ECN completely at the
          TCP layer, and if the connection then works, it could cache to
          disable ECN in future. With this approach, it is still preferable
          but optional for the server to also cache failure to deliver
          ECN-capable SYN-ACKs.</t>
        </section>
      </section>
      <section anchor="genecn_sec_argue_pure_ACK" numbered="true" toc="default">
        <name>Pure ACKs</name>
        <section numbered="true" toc="default">
          <name>Arguments against ECT on Pure ACKS</name>
          <t>After the general reliability argument already quoted in <xref target="reliability" format="default"/>, Section 5.2 of RFC 3168 goes on to use ECT
          marking of pure ACKs as a specific example of the reliability
          argument: </t>
          <ul empty="true" spacing="normal">
            <li>
              <t>"Transport protocols such as TCP do not necessarily detect
              all packet drops, such as the drop of a "pure" ACK packet; for
              example, TCP does not reduce the arrival rate of subsequent ACK
              packets in response to an earlier dropped ACK packet. Any
              proposal for extending ECN-Capability to such packets would have
              to address issues such as the case of an ACK packet that was
              marked with the CE codepoint but was later dropped in the
              network. We believe that this aspect is still the subject of
              research, so this document specifies that at this time, "pure"
              ACK packets MUST NOT indicate ECN-Capability."</t>
            </li>
          </ul>
          <t>Later on, in section 6.1.4 it reads: </t>
          <ul empty="true" spacing="normal">
            <li>
              <t>"For the current generation of TCP congestion control
              algorithms, pure acknowledgement packets (e.g., packets that do
              not contain any accompanying data) MUST be sent with the not-ECT
              codepoint. Current TCP receivers have no mechanisms for reducing
              traffic on the ACK-path in response to congestion notification.
              Mechanisms for responding to congestion on the ACK-path are
              areas for current and future research. (One simple possibility
              would be for the sender to reduce its congestion window when it
              receives a pure ACK packet with the CE codepoint set). For
              current TCP implementations, a single dropped ACK generally has
              only a very small effect on the TCP's sending rate."</t>
            </li>
          </ul>
        </section>
        <section anchor="genecn_sec_mechanism_pure_ACK" numbered="true" toc="default">
          <name>Counter-arguments for ECT on Pure ACKs</name>
          <t>The first argument above is a specific instance of the
          reliability argument for the case of pure ACKs. This has already
          been addressed by countering the general reliability argument in
          <xref target="reliability" format="default"/>.</t>
          <t>The second argument says that ECN ought not to be enabled on Pure
          ACKs unless there is a mechanism to respond to it. Although the
          above passage from RFC 3168 envisages the possibility of ECN on pure
          ACKs in the future, it is silent on how its ECN feedback mechanisms
          would be used if CE markings did arrive on pure ACKs. In contrast,
          the position of AccECN with respect to the three parts of a
          congestion response mechanism is as follows:</t>
          <dl newline="false" spacing="normal">
            <dt>Detection:</dt>
            <dd>The AccECN spec requires the receiver
              of any TCP packets including pure ACKs to count any CE marks on
              them (whether or not it sends ECN-capable control packets
              itself).</dd>
            <dt>Feedback:</dt>
            <dd>
              <t>The AccECN Data Receiver continually
              feeds back a count of the number of CE-marked packets (including
              pure ACKs) that it has received.</t>
              <t>Even if
              the receiver of a CE-mark on a pure ACK does not feed it back
              immediately, it still includes it within subsequent feedback,
              for instance when it later sends a data segment. Even if an
              AccECN host has no data outstanding, it is still required to
              send an 'increment-triggered' pure ACK after every 'n' CE marks
              it receives, where 'n' is at least 3.</t>
            </dd>
            <dt>Congestion response:</dt>
            <dd>Once an AccECN Data Sender
              receives feedback about CE-markings on pure ACKs, it will be
              able to reduce the congestion window (cwnd) and/or the ACK rate.
              The specific response to congestion feedback is out of scope of
              both AccECN and the present spec, because it would be defined in
              a base TCP congestion control spec <xref target="RFC5681" format="default"/>
              <xref target="RFC9438" format="default"/> or a variant. Nonetheless, in order to
              decide whether the present ECN++ experimental spec should allow
              a host to set ECT on pure ACKs, we only need to know whether a
              congestion response would be feasible - we do not have to
              standardize it. Possible responses are discussed in the
              following subsections,</dd>
          </dl>
          <section anchor="genecn_sec_cwnd_response_pure_ACK" numbered="true" toc="default">
            <name>Congestion Window Response to CE-Marked Pure ACKs</name>
            <t>This subsection explores issues that congestion control
            designers will need to consider when defining a cwnd response to
            CE-marked Pure ACKs.</t>
            <t>A CE-mark on a Pure ACK does not mean that only Pure ACKs are
            causing congestion. It only means that the marked Pure ACK is part
            of an aggregate that is collectively causing a bottleneck queue to
            randomly CE-mark a fraction of the packets. A CE-mark on a Pure
            ACK might be due to data packets in other flows through the same
            bottleneck, due to data packets interspersed between Pure ACKs in
            the same half-connection, or just due to the rate of Pure ACKs
            alone. (RFC 3168 only considered the last possibility, which led
            to the argument that standardization of ECN-enabled Pure ACKs had
            to be deferred, because ACK congestion control was a research
            issue.)</t>
            <t>If a host has been sending a mix of Pure ACKs and data, it
            doesn't need to work out whether a particular CE mark was on a
            Pure ACK or not; it just needs to respond to congestion feedback
            as a whole by reducing its congestion window (cwnd), which limits
            the data it can launch into flight through the congested
            bottleneck. If a host is solely receiving data and sending only
            Pure ACKs, reducing cwnd will have no immediate effect (the next
            subsection addresses that). Nonetheless, reducing cwnd at one
            moment would limit its rate if it was given something to send at a
            later moment.</t>
            <t>When a host is sending data as well as Pure ACKs, it would not
            be right for CE-marks on Pure ACKs and on data packets to induce
            the same reduction in cwnd. A possible way to address this issue
            would be to weight the response by the size of the marked packets
            (assuming the congestion control supports a weighted response,
            e.g. <xref target="RFC8257" format="default"/>). For instance, one could
            calculate the fraction of CE-marked bytes (headers and data) over
            each round trip (say) as follows:</t>
            <ul empty="true" spacing="normal">
              <li>
                <t>(CE-marked header bytes + CE-marked data bytes) / (all
                header bytes + all data bytes)</t>
              </li>
            </ul>
            <t>Even if the exact header size is not known, header bytes
            could be calculated by multiplying a packet count by a nominal
            header size, which is possible with AccECN feedback, because it
            gives a count of CE-marked packets (as well as CE-marked bytes).
            The above simple aggregate calculation caters for the full range
            of scenarios; from all Pure ACKs to just a few interspersed with
            data packets.</t>
            <t>Note that any mechanism that reduces cwnd due to CE-marked Pure
            ACKs would need to be integrated with the congestion window
            validation mechanism <xref target="RFC7661" format="default"/>, which already
            conservatively reduces cwnd over time because cwnd becomes stale
            if it is not used to fill the pipe.</t>
          </section>
          <section numbered="true" toc="default">
            <name>ACK Rate Response to CE-Marked Pure ACKs</name>
            <t>Reducing the congestion window will have little effect if the
            bottleneck is congested mostly by unresponsive pure ACKs. This
            could leave little or no capacity for data transfers that would be
            responsive to the congestion.</t>
            <t>Since RFC 3168 was published, experimental Acknowledgement
            Congestion Control (AckCC) techniques have been documented in
            <xref target="RFC5690" format="default"/> (informational), which describes how two
            new TCP options could allow any pair of TCP endpoints to regulate
            the delayed ACK ratio in response to lost or CE-marked pure ACKs.
            However, this spec did not ask IANA to actually allocate any
            option numbers, because the intention was to describe the scheme
            and document the unresolved complications.</t>
            <t>AckCC addressed three main problems, namely that TCP had: i) no
            mechanism to feed back loss or CE-marking of pure ACKs; ii)
            consequently, no mechanism to allow ECT to be set on pure ACKs;
            and iii) no mechanism to regulate the ACK rate. A combination of
            AccECN and the present specification addresses the first two
            problems, at least for ECN marking. So, with the addition of an
            ACK rate mechanism, it might now be possible to design an
            ECN-specific ACK congestion control scheme along similiar lines to
            RFC 5690. However, such a mechanism is out of scope of the present
            document.</t>
            <t>Setting aside the unfinished nature of RFC 5690, the need for
            AckCC has not been conclusively demonstrated. It has been argued
            that the Internet has survived so far with no mechanism to even
            detect loss of pure ACKs. However, it has also been argued that
            ECN is not the same as loss. Packet discard can naturally thin the
            ACK load to whatever the bottleneck can support, whereas ECN
            marking does not (it queues the ACKs instead). Nonetheless, RFC
            3168 (section 7) recommends that an AQM switches over from ECN
            marking to discard when the marking probability becomes high.
            Therefore discard can still be relied on to thin out ECN-enabled
            pure ACKs as a last resort.</t>
          </section>
        </section>
        <section anchor="genecn_sec_summary_pure_ACK" numbered="true" toc="default">
          <name>Summary: Enabling ECN on Pure ACKs</name>
          <t>In the case when AccECN has been negotiated, it provides a
          feasible congestion response mechanism for Pure ACKs, so the
          arguments for ECT on pure ACKs outweigh those against. ECN is always
          more and never less reliable for delivery of congestion
          notification. A cwnd reduction needs to be considered by congestion
          control designers as a response to congestion on pure ACKs.
          Separately, AckCC (or an improved variant exploiting AccECN) could
          optionally be used to regulate the spacing between pure ACKs.
          However, it is not clear whether AckCC is justified. If it is not,
          packet discard will still act as the "congestion response of last
          resort" by thinning out the ACK traffic. In contrast, not setting
          ECT on pure ACKs is certainly detrimental to performance, because
          when a pure ACK is lost it can prevent the release of new data.</t>
          <t>In the case when Classic ECN has been negotiated, the argument
          for ECT on pure ACKs is less clear-cut. Some of the installed base
          of RFC 3168 implementations might happen to (unintentionally)
          provide a feedback mechanism to support a cwnd response. For those
          that did not, setting ECT on pure ACKs would be better for the
          flow's own performance than not setting it. However, where there was
          no feedback mechanism, setting ECT could do slightly more harm than
          not setting it. AckCC could provide a complementary response
          mechanism, because it is designed to work with RFC 3168 ECN, but it
          is incomplete. In summary, a congestion response mechanism for Pure
          ACKs is unlikely to be feasible with the installed base of classic
          ECN.</t>
          <t><xref target="acks" format="default"/> of this specification uses a safe approach
          where it allows ECT on Pure ACKs if AccECN feedback has been
          negotiated, but not with classic RFC 3168 ECN feedback. Allowing
          hosts to set ECT on Pure ACKs without a feasible response mechanism
          could result in risk. It would certainly improve the flow's own
          performance, but it would slightly increase potential harm to
          others. Morevoer, if would set an undesirable precedent for setting
          ECT on packets with no mechanism to respond to any resulting
          congestion signals.</t>
          <!--
          <t>During review of this specification, it was decided that allowing
          hosts to set ECT on Pure ACKs without a feasible response mechanism
          would set an undesirable precedent. It would certainly improve the
          flow's own performance, but it would slightly increase potential
          harm to others. Therefore, <xref target="acks"/> allows ECT on Pure
          ACKs if AccECN feedback has been negotiated, but not with classic
          RFC 3168 ECN feedback.</t> -->
        </section>
        <section anchor="genecn_sec_pure_ACK_or_DupACK" numbered="true" toc="default">
          <name>Pure ACKs: DupACK Tests</name>
          <t>This section justifies the requirement for a host to use the
          additional test for incoming duplicate pure ACKs in <xref target="genecn_sec_dupack_tests" format="default"/>, which is one of the mandatory
          conditions for a host to set ECT on its outgoing pure ACKs. See
          <xref target="genecn_sec_pure_acks_accecn" format="default"/> for all three
          conditions, the other two being to have successfully negotiated SACK
          and AccECN feedback.</t>
          <t>The AccECN spec <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/>
          mandates the 'increment-triggered ACK' rule where, "an AccECN Data
          Receiver MUST emit an ACK if 'n' CE marks have arrived since the
          previous ACK." The value of 'n' depends on whether there is newly
          delivered data to acknowledge. If there is not, "'n' MUST be no less
          than 3".</t>
          <t>Use of ECN-capable pure ACKs by the ECN++ experiment combined
          with congestion at an ECN AQM at the bottleneck of the ACK path can
          cause AccECN to acknowledge ACKs that carry new CE information, by
          the above rule. This leads to repetition of the ACK of a segment,
          which is an exception to the requirement in the last paragraph of
          Sec 4.2 of <xref target="RFC5681" format="default"/>.</t>
          <t>This exception is justified because, although there is no new
          data for the receiver to acknowledge, there is new IP-ECN
          information to feed back. When such new IP-ECN information arrives
          on an ACK, it is not possible to feed it back without also repeating
          the acknowledgement of the latest data segment (if ECN++ had been
          part of TCP from the start, a logical approach would have been to
          clear the ACK flag, but nowadays such an unorthodox segment would be
          rejected). Therefore, to distinguish these ACKs of ACKs from genuine
          duplicate ACKs, it was necessary to introduce the test for the
          absence of SACK.</t>
          <t>To justify adding this test, we use the same scenario as in
          Section 3.2.2.5.1 of the AccECN spec <xref target="I-D.ietf-tcpm-accurate-ecn" format="default"/> with volleys of unidirectional
          data initially from host A to B then from B to A. In response to the
          first volley, B emits ECN-capable pure ACKs as feedback (as per the
          present ECN++ spec). If the ACK stream from B experiences congestion
          at an ECN-enabled buffer, some of these ACKs will be CE-marked once
          they arrive at A.</t>
          <t>Host A would normally inform B about the congested ACK path by
          piggybacking AccECN feedback on the data packets from A to B.
          However, once A stops sending data, it still needs to inform B about
          any CE-marked ACKs continuing to arrive from B in the subsequent
          round trip (so that B has up to date congestion information, in case
          it starts sending data). AccECN's 'increment-triggered ACK' rule
          ensures that A emits a pure ACK at least every third incoming CE
          mark. However, as each 'increment-triggered ACK' from A arrives at
          B, it will not only feed back CE markings, but it will also
          repeatedly acknowledge whatever the last sequence number was from
          B.</t>
          <t>Then, if SACK had not been negotiated for the connection, and if
          B started sending its volley of new data packets, the ACKs from A
          could imply to B that its first new data packet had been lost and A
          was then emitting duplicate ACKs triggered by the rest of B's volley
          arriving. Then, as well as detecting CE marking, B could falsely
          detect loss, leading to spurious retransmission and potentially
          incorrect congestion response. Similarly, false detection of
          duplicate ACKs could confuse other algorithms, such as Limited
          Transmit, Fast Recovery, PRR, etc.</t>
          <t>This is why <xref target="genecn_sec_dupack_tests" format="default"/> requires B
          to negotiate SACK and to use lack of SACK options as an additional
          check for a duplicate ACK.</t>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Window Probes</name>
        <t>Section 6.1.6 of RFC 3168 presents only the reliability argument
        for prohibiting ECT on Window probes:</t>
        <ul empty="true" spacing="normal">
          <li>
            <t>"If a window probe packet is dropped in the network, this loss
            is not detected by the receiver. Therefore, the TCP data sender
            MUST NOT set either an ECT codepoint or the CWR bit on window
            probe packets.</t>
          </li>
          <li>
            <t>However, because window probes use exact sequence numbers, they
            cannot be easily spoofed in denial-of-service attacks. Therefore,
            if a window probe arrives with the CE codepoint set, then the
            receiver SHOULD respond to the ECN indications."</t>
          </li>
        </ul>
        <t>The reliability argument has already been addressed in <xref target="reliability" format="default"/>.</t>
        <t>Allowing ECT on window probes could considerably improve
        performance because, once the receive window has reopened, if a window
        probe is lost the sender will stall until the next window probe
        reaches the receiver, which might be after the maximum retransmission
        timeout (at least 1 minute <xref target="RFC6928" format="default"/>).</t>
        <t>On the bright side, RFC 3168 at least specifies the receiver
        behaviour if a CE-marked window probe arrives, so changing the
        behaviour ought to be less painful than for other packet types.</t>
      </section>
      <section numbered="true" toc="default">
        <name>FINs</name>
        <t>RFC 3168 is silent on whether a TCP sender can set ECT on a FIN. A
        FIN is considered as part of the sequence of data, and the rate of
        pure ACKs sent after a FIN could be controlled by a CE marking on the
        FIN. Therefore there is no reason not to set ECT on a FIN.</t>
      </section>
      <section numbered="true" toc="default">
        <name>RSTs</name>
        <t>RFC 3168 is silent on whether a TCP sender can set ECT on a RST.
        The host generating the RST message does not have an open connection
        after sending it (either because there was no such connection when the
        packet that triggered the RST message was received or because the
        packet that triggered the RST message also triggered the closure of
        the connection).</t>
        <t>Moreover, the receiver of a CE-marked RST message can either: i)
        accept the RST message and close the connection; ii) emit a so-called
        challenge ACK in response (with suitable throttling) <xref target="RFC5961" format="default"/> and otherwise ignore the RST (e.g. because the
        sequence number is in-window but not the precise number expected
        next); or iii) discard the RST message (e.g. because the sequence
        number is out-of-window). In the first two cases there is no point in
        echoing any CE mark received because the sender closed its connection
        when it sent the RST. In the third case, given the RST is deemed
        invalid, any CE marking on it could also be invalid, so it makes sense
        to discard the CE signal as well as the RST.</t>
        <t>Although a congestion response following a CE-marking on a RST does
        not appear to make sense, the following factors have been considered
        before deciding whether the sender ought to set ECT on a RST
        message:</t>
        <ul spacing="normal">
          <li>
            <t>As explained above, a congestion response by the sender of a
            CE-marked RST message is not possible;</t>
          </li>
          <li>
            <t>So the only reason for the sender setting ECT on a RST would be
            to improve the reliability of the message's delivery;</t>
          </li>
          <li>
            <t>RST messages are used to both mount and mitigate attacks:</t>
            <ul spacing="normal">
              <li>
                <t>Spoofed RST messages are used by attackers to terminate
                ongoing connections, although the mitigations in RFC 5961 have
                considerably raised the bar against off-path RST attacks;</t>
              </li>
              <li>
                <t>Legitimate RST messages allow endpoints to inform their
                peers to eliminate existing state that correspond to non
                existing connections, liberating resources e.g. in DoS
                attacks scenarios;</t>
              </li>
            </ul>
          </li>
          <li>
            <t>AQMs are advised to disable ECN marking during persistent
            overload, so:</t>
            <ul spacing="normal">
              <li>
                <t>it is harder for an attacker to exploit ECN to intensify an
                attack;</t>
              </li>
              <li>
                <t>it is harder for a legitimate user to exploit ECN to more
                reliably mitigate an attack</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Prohibiting ECT on a RST would deny the benefit of ECN to
            legitimate RST messages, but not to attackers who can disregard
            RFCs;</t>
          </li>
          <li>
            <t>If ECT were prohibited on RSTs</t>
            <ul spacing="normal">
              <li>
                <t>it would be easy for security middleboxes to discard all
                ECN-capable RSTs;</t>
              </li>
              <li>
                <t>However, unlike a SYN flood, it is already easy for a
                security middlebox (or host) to distinguish a RST flood from
                legitimate traffic <xref target="RFC5961" format="default"/>, and even if a
                some legitimate RSTs are accidentally removed as well,
                legitimate connections still function.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>So, on balance, it has been decided that it is worth
        experimenting with ECT on RSTs. During experiments, if the ECN
        capability on RSTs is found to open a vulnerability that is hard to
        close, this decision can be reversed, before it is specified for the
        standards track.</t>
      </section>
      <section anchor="genecn_sec_reXMT" numbered="true" toc="default">
        <name>Retransmitted Packets.</name>
        <t>RFC 3168 says the sender "MUST NOT" set ECT on retransmitted
        packets. The rationale for this consumes nearly 2 pages of RFC 3168,
        so the reader is referred to section 6.1.5 of RFC 3168, rather than
        quoting it all here. There are essentially three arguments, namely:
        reliability; DoS attacks; and unnecessary retransmissions. We address
        them in order below.</t>
        <t>The reliability argument has already been addressed in <xref target="reliability" format="default"/>.</t>
        <t>Protection against DoS attacks is not afforded by prohibiting ECT
        on retransmitted packets. An attacker can set ECT or CE on spoofed
        retransmissions whether or not it is prohibited by an RFC. Protection
        against the DoS attack described in section 6.1.5 of RFC 3168 is
        solely afforded by the requirement that "the TCP data receiver SHOULD
        ignore the CE codepoint on out-of-window packets". Therefore in <xref target="genect_sec_ECT_reXMT" format="default"/> the sender is allowed to set ECT on
        retransmitted packets, in order to reduce the chance of them being
        dropped. We also strengthen the receiver's requirement from "SHOULD
        ignore" to "MUST ignore". And we generalize the receiver's requirement
        to include failure of any validity check, not just out-of-window
        checks, in order to include the more stringent validity checks in RFC
        5961 that have been developed since RFC 3168.</t>
        <t>Finally, the third argument is about unnecessary retransmissions.
        For those retransmitted packets that arrive at the receiver after the
        original packet has been properly received (so-called spurious
        retransmissions), RFC 3168 raises the concern that any CE marking will
        be ignored, because any spurious retransmission is out of window and
        CE markings on out of window packets will be ignored (by the above
        rule). In mitigation against this argument, the fact that the original
        packet has been delivered implies that the sender's original
        congestion response (when it deemed the packet to be lost and
        retransmitted it) was unnecessary. However, omitting a congestion
        response to the CE one round trip later does not strictly compensate
        for the previous unnecessary response, because the response should be
        in the same round as the congestion occurs. Nonetheless, there is a
        stronger argument against the concern in RFC 3168: TCP does not detect
        the loss of a spurious retransmission, and therefore does not respond
        to this congestion loss. So not responding to CE on ECN-capable
        supurious retransmissions is no worse than TCP's existing lack of
        response to loss of spurious retransmissions.</t>
        <t>Therefore, in all three cases, it is not incorrect to set ECT on
        retransmissions.</t>
      </section>
      <section anchor="genect_sec_gen_fall-back_justify" numbered="true" toc="default">
        <name>General Fall-back for any Control Packet</name>
        <t>Extensive experiments have found no evidence of any traversal
        problems with ECT on any TCP control packet <xref target="Mandalari18" format="default"/>. Nonetheless, Sections <xref format="counter" target="genect_sec_fall-back-SYN"/> and <xref format="counter" target="genect_sec_fall-back-SYN-ACK"/> specify fall-back measures if
        ECT on the first packet of either half-connection (SYN or SYN-ACK)
        appears to be blocking progress. Here, the question of fall-back
        measures for ECT on other control packets is explored. It supports the
        advice given in <xref target="genect_sec_gen_fall-back" format="default"/>, paraphrased
        here as, "Until there's evidence that something's broken, don't fix
        it."</t>
        <t>If an implementation has had to disable ECT to ensure the first
        packet of a flow (SYN or SYN-ACK) gets through, the question arises
        whether it ought to disable ECT on all subsequent control packets
        within the same TCP connection. Without evidence of any such problems,
        this seems unnecessarily cautious. Particularly given it would be hard
        to detect loss of most other types of TCP control packets that are not
        ACK'd. And particularly given that unnecessarily removing ECT from
        other control packets could lead to performance problems, e.g. by
        directing them into another queue <xref target="RFC9331" format="default"/> or over a
        different path, because some broken multipath equipment (erroneously)
        routes based on all 8 bits of the ex-Traffic Class octet (IPv6) or the
        ex-ToS octet (IPv4).</t>
        <t>In the case where a connection starts without ECT on the SYN
        (perhaps because problems with previous connections had been cached),
        there will have been no test for ECT traversal in the client-server
        direction until the pure ACK that completes the handshake. It is
        possible that some middlebox might block ECT on this pure ACK or on
        later retransmissions of lost packets. Similarly, after a route
        change, the new path might include some middlebox that blocks ECT on
        some or all TCP control packets. However, without evidence of such
        problems, the complexity of a fix does not seem worthwhile.</t>
        <ul empty="true" spacing="normal">
          <li>
            <t>MORE MEASUREMENTS NEEDED (?): If further two-ended measurements
            do find evidence for these traversal problems, measurements would
            be needed to check for correlation of ECT traversal problems
            between different control packets. It might then be necessary to
            introduce a catch-all fall-back rule that disables ECT on certain
            subsequent TCP control packets based on some criteria developed
            from these measurements.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="genecn_sec_variants" numbered="true" toc="default">
      <name>Interaction with popular variants or derivatives of TCP</name>
      <t>The designs of the following TCP variants have been assessed and
      found not to interact adversely with ECT on TCP control packets: SYN
      cookies (see Appendix A of <xref target="RFC4987" format="default"/> and section 3.1 of
      <xref target="RFC5562" format="default"/>), Initial Window of ten (IW10 <xref target="RFC6928" format="default"/>, TCP Fast Open (TFO <xref target="RFC7413" format="default"/>), DCTCP
      <xref target="RFC8257" format="default"/> and L4S <xref target="RFC9330" format="default"/>.</t>
      <t>The following subsections assess the interaction between setting ECT
      on all packets and each of these variants (except SYN cookies where no
      detail is necessary). A final subsection briefly notes the possibility
      that the principles applied here should translate to protocols derived
      from TCP.</t>
      <t>This section is informative not normative, because no interactions
      have been identified that require any change to specifications. The
      subsection on IW10 discusses potential changes to specifications but
      recommends that no changes are needed.</t>
      <section anchor="genecn_sec_IW10" numbered="true" toc="default">
        <name>IW10</name>
        <t>IW10 is an experiment to determine whether it is safe for TCP to
        use an initial window of 10 SMSS <xref target="RFC6928" format="default"/>.</t>
        <t>This subsection does not recommend any additions to the present
        specification in order to interwork with IW10. The specifications as
        they stand are safe, and there is only a corner-case with ECT on the
        SYN where performance could be occasionally improved, as explained
        below.</t>
        <t>As specified in <xref target="genecn_sec_ECT_SYN" format="default"/>, a TCP
        initiator will typically only set ECT on the SYN if it requests AccECN
        support. If, however, the SYN-ACK tells the initiator that the
        responder does not support AccECN, <xref target="genecn_sec_ECT_SYN" format="default"/>
        advises the initiator to conservatively reduce its initial window,
        preferably to 1 SMSS because, if the SYN was CE-marked, the SYN-ACK
        has no way to feed that back.</t>
        <t>If the initiator implements IW10, it seems rather over-conservative
        to reduce IW from 10 to 1 just in case a congestion marking was
        missed. Nonetheless, a reduction to 1 SMSS will rarely harm
        performance, because:</t>
        <ul spacing="normal">
          <li>
            <t>as long as the initiator is caching failures to negotiate
            AccECN, subsequent attempts to access the same server will not use
            ECT on the SYN anyway, so there will no longer be any need to
            conservatively reduce IW;</t>
          </li>
          <li>
            <t>currently, at least for web sessions, it is extremely rare for
            a TCP initiator (client) to have more than one data segment to
            send at the start of a TCP connection (see Fig 3 in <xref target="Manzoor17" format="default"/>) - IW10 is primarily exploited by TCP
            servers.</t>
          </li>
        </ul>
        <t>If a responder receives feedback that the SYN-ACK was CE-marked,
        <xref target="genecn_sec_SYN-ACK_response" format="default"/> recommends that it
        reduces its initial window, preferably to 1 SMSS. When the responder
        also implements IW10, it might again seem rather over-conservative to
        reduce IW from 10 to 1. But in this case the rationale is somewhat
        different:</t>
        <ul spacing="normal">
          <li>
            <t>The IW10 spec <xref target="RFC6928" format="default"/> recommends not reducing
            cwnd to 1 segment on the grounds that it is uncertain whether
            absence of feedback implies loss. However, in contrast, explicit
            feedback that the SYN-ACK was CE-marked is a positive indication
            that the queue has been building.</t>
          </li>
          <li>
            <t>Given it is now likely that a queue already exists, the more
            data packets that the server sends in its IW, the more likely at
            least one will be CE marked, leading it to exit slow-start
            early.</t>
          </li>
        </ul>
        <t>Experimentation will be needed to determine the best
        strategy.</t>
        <t>It should be noted that experience from recent congestion avoidance
        experiments where the window is reduced by less than half in response
        to ECN marking <xref target="RFC8511" format="default"/> is not necessarily applicable
        to a flow start scenario.</t>
      </section>
      <section numbered="true" toc="default">
        <name>TFO</name>
        <t>TCP Fast Open (TFO <xref target="RFC7413" format="default"/>) is an experiment to
        remove the round trip delay of TCP's 3-way hand-shake (3WHS). A TFO
        initiator caches a cookie from a previous connection with a
        TFO-enabled server. Then, for subsequent connections to the same
        server, any data included on the SYN can be passed directly to the
        server application, which can then return up to an initial window of
        response data on the SYN-ACK and on data segments straight after it,
        without waiting for the ACK that completes the 3WHS.</t>
        <t>The TFO experiment and the present experiment to add ECN-support
        for TCP control packets can be combined without altering either
        specification, which is justified as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The handling of ECN marking on a SYN is no different whether or
            not it carries data.</t>
          </li>
          <li>
            <t>In response to any CE-marking on the SYN-ACK, the responder
            adopts the normal response to congestion, as discussed in Section
            7.2 of <xref target="RFC7413" format="default"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="genecn_sec_l4s" numbered="true" toc="default">
        <name>L4S</name>
        <t>A Low Latency, Low Loss, and Scalable throughput (L4S) variant of
        TCP such as TCP Prague <xref target="I-D.briscoe-iccrg-prague-congestion-control" format="default"/> requires AccECN
        feedback and uses ECN++. Also the spec of the L4S-ECN protocol <xref target="RFC9331" format="default"/> mentions ECN++ as a useful performance
        optimization.</t>
        <t>Therefore, the L4S experiment and the present ECN++ experiment can
        be combined without altering any of the specifications. The only
        difference would be in the recommendation of the best SYN cache
        strategy.</t>
        <t>The normative specification for ECT on a SYN in <xref target="genecn_sec_SYN_cache" format="default"/> recommends the "optimistic ECT and
        cache failures" strategy (S2B defined in <xref target="genecn_sec_SYN_cache_rationale" format="default"/>) for the general Internet.
        However, if a user's Internet access bottleneck supported L4S ECN but
        not Classic ECN, the "optimistic ECT without a cache" strategy (S2A)
        would make most sense, because there would be little point trying to
        avoid the 'over-strict' test and negotiate Classic ECN, if L4S ECN but
        not Classic ECN was available on that user's access link (as is the
        case with Low Latency DOCSIS <xref target="DOCSIS3.1" format="default"/>).</t>
        <t>Strategy (S2A) is the simplest, because it requires no cache. It
        would satisfy the goal of an implementer who is solely interested in
        ultra-low latency using AccECN and ECN++ (e.g. accessing L4S
        servers) and is not concerned about fall-back to Classic ECN
        (e.g. when accessing other servers).</t>
      </section>
      <section numbered="true" toc="default">
        <name>Other transport protocols</name>
        <t>Experience from experiments on adding ECN support to all TCP
        packets ought to be directly transferable between TCP and derivatives
        of TCP, like SCTP.</t>
        <t>Stream Control Transmission Protocol (SCTP) <xref target="RFC9260" format="default"/> is a standards track transport protocol derived
        from TCP. SCTP currently does not include ECN support, but Appendix A
        of an obsoleted earlier version of the spec <xref target="RFC4960" format="default"/>
        broadly describes how it would be supported and a draft on the
        addition of ECN to SCTP has been produced <xref target="I-D.stewart-tsvwg-sctpecn" format="default"/>. The question of whether SCTP
        ought to set ECT on retransmissions and control packets is work in
        progress.</t>
        <t>QUIC <xref target="RFC9000" format="default"/> is another standards track transport
        protocol offering similar services to TCP but intended to exploit some
        of the benefits of running over UDP. Building on the arguments in the
        current draft, a QUIC sender sets ECT on all packets unless it fails
        the test for path support.</t>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>There are several security arguments presented in RFC 3168 for
      preventing the ECN marking of TCP control packets and retransmitted
      segments. We believe all of them have been properly countered in <xref target="arguments" format="default"/>, particularly <xref target="genecn_sec_SYN_DOS" format="default"/>
      and <xref target="genecn_sec_reXMT" format="default"/> on DoS attacks using spoofed
      ECT-marked SYNs and spoofed CE-marked retransmissions. In both cases,
      RFC 3168 attempted to legislate against the sender setting ECT, which
      degrades the performance of genuine senders, but will not be heeded by
      attackers. Instead, the approach adopted is to specify reinforced
      defences against such attacks that already reside in the network and at
      the receiver.</t>
      <t><xref target="genecn_sec_ECT_RST" format="default"/> on sending TCP RSTs considers the
      question of whether ECT on RSTs will allow RST attacks to be
      intensified. It also points out that implementers need to take care to
      ensure that the ECN field on a RST does not depend on TCP's state
      machine. Otherwise the internal information revealed could be of use to
      potential attackers. This point actually applies more generally to all
      control packets (unless it has become necessary to disable ECN to evade
      path traversal problems).</t>
      <t>If each TCP implementation chooses to make different control packets
      ECN-capable, it could contribute to easier fingerprinting of TCP
      stacks.</t>
    </section>
    <section removeInRFC="true" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>There are no IANA considerations in this memo.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2018" target="https://www.rfc-editor.org/info/rfc2018" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2018.xml">
          <front>
            <title>TCP Selective Acknowledgment Options</title>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="J. Mahdavi" initials="J." surname="Mahdavi"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Romanow" initials="A." surname="Romanow"/>
            <date month="October" year="1996"/>
            <abstract>
              <t>This memo proposes an implementation of SACK and discusses its performance and related issues. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2018"/>
          <seriesInfo name="DOI" value="10.17487/RFC2018"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC5961" target="https://www.rfc-editor.org/info/rfc5961" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5961.xml">
          <front>
            <title>Improving TCP's Robustness to Blind In-Window Attacks</title>
            <author fullname="A. Ramaiah" initials="A." surname="Ramaiah"/>
            <author fullname="R. Stewart" initials="R." surname="Stewart"/>
            <author fullname="M. Dalal" initials="M." surname="Dalal"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>TCP has historically been considered to be protected against spoofed off-path packet injection attacks by relying on the fact that it is difficult to guess the 4-tuple (the source and destination IP addresses and the source and destination ports) in combination with the 32-bit sequence number(s). A combination of increasing window sizes and applications using longer-term connections (e.g., H-323 or Border Gateway Protocol (BGP) [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5961"/>
          <seriesInfo name="DOI" value="10.17487/RFC5961"/>
        </reference>
        <reference anchor="I-D.ietf-tcpm-accurate-ecn" target="https://datatracker.ietf.org/doc/html/draft-ietf-tcpm-accurate-ecn-28" xml:base="https://bib.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-tcpm-accurate-ecn.xml">
          <front>
            <title>More Accurate Explicit Congestion Notification (ECN) Feedback in TCP</title>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Richard Scheffenegger" initials="R." surname="Scheffenegger">
              <organization>NetApp</organization>
            </author>
            <date day="17" month="November" year="2023"/>
            <abstract>
              <t>Explicit Congestion Notification (ECN) is a mechanism where network nodes can mark IP packets instead of dropping them to indicate incipient congestion to the endpoints. Receivers with an ECN-capable transport protocol feed back this information to the sender. ECN was originally specified for TCP in such a way that only one feedback signal can be transmitted per Round-Trip Time (RTT). Recent new TCP mechanisms like Congestion Exposure (ConEx), Data Center TCP (DCTCP) or Low Latency, Low Loss, and Scalable Throughput (L4S) need more accurate ECN feedback information whenever more than one marking is received in one RTT. This document updates the original ECN specification in RFC 3168 to specify a scheme that provides more than one feedback signal per RTT in the TCP header. Given TCP header space is scarce, it allocates a reserved header bit previously assigned to the ECN-Nonce. It also overloads the two existing ECN flags in the TCP header. The resulting extra space is exploited to feed back the IP-ECN field received during the 3-way handshake as well. Supplementary feedback information can optionally be provided in two new TCP option alternatives, which are never used on the TCP SYN. The document also specifies the treatment of this updated TCP wire protocol by middleboxes.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-accurate-ecn-28"/>
        </reference>
        <reference anchor="RFC8311" target="https://www.rfc-editor.org/info/rfc8311" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8311.xml">
          <front>
            <title>Relaxing Restrictions on Explicit Congestion Notification (ECN) Experimentation</title>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="January" year="2018"/>
            <abstract>
              <t>This memo updates RFC 3168, which specifies Explicit Congestion Notification (ECN) as an alternative to packet drops for indicating network congestion to endpoints. It relaxes restrictions in RFC 3168 that hinder experimentation towards benefits beyond just removal of loss. This memo summarizes the anticipated areas of experimentation and updates RFC 3168 to enable experimentation in these areas. An Experimental RFC in the IETF document stream is required to take advantage of any of these enabling updates. In addition, this memo makes related updates to the ECN specifications for RTP in RFC 6679 and for the Datagram Congestion Control Protocol (DCCP) in RFCs 4341, 4342, and 5622. This memo also records the conclusion of the ECN nonce experiment in RFC 3540 and provides the rationale for reclassification of RFC 3540 from Experimental to Historic; this reclassification enables new experimental use of the ECT(1) codepoint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8311"/>
          <seriesInfo name="DOI" value="10.17487/RFC8311"/>
        </reference>
        <reference anchor="RFC9293" target="https://www.rfc-editor.org/info/rfc9293" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC1122" target="https://www.rfc-editor.org/info/rfc1122" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1122.xml">
          <front>
            <title>Requirements for Internet Hosts - Communication Layers</title>
            <author fullname="R. Braden" initials="R." role="editor" surname="Braden"/>
            <date month="October" year="1989"/>
            <abstract>
              <t>This RFC is an official specification for the Internet community. It incorporates by reference, amends, corrects, and supplements the primary protocol standards documents relating to hosts. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="3"/>
          <seriesInfo name="RFC" value="1122"/>
          <seriesInfo name="DOI" value="10.17487/RFC1122"/>
        </reference>
        <reference anchor="RFC3540" target="https://www.rfc-editor.org/info/rfc3540" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3540.xml">
          <front>
            <title>Robust Explicit Congestion Notification (ECN) Signaling with Nonces</title>
            <author fullname="N. Spring" initials="N." surname="Spring"/>
            <author fullname="D. Wetherall" initials="D." surname="Wetherall"/>
            <author fullname="D. Ely" initials="D." surname="Ely"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This note describes the Explicit Congestion Notification (ECN)-nonce, an optional addition to ECN that protects against accidental or malicious concealment of marked packets from the TCP sender. It improves the robustness of congestion control by preventing receivers from exploiting ECN to gain an unfair share of network bandwidth. The ECN-nonce uses the two ECN-Capable Transport (ECT)codepoints in the ECN field of the IP header, and requires a flag in the TCP header. It is computationally efficient for both routers and hosts. This memo defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3540"/>
          <seriesInfo name="DOI" value="10.17487/RFC3540"/>
        </reference>
        <reference anchor="RFC4960" target="https://www.rfc-editor.org/info/rfc4960" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4960.xml">
          <front>
            <title>Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." role="editor" surname="Stewart"/>
            <date month="September" year="2007"/>
            <abstract>
              <t>This document obsoletes RFC 2960 and RFC 3309. It describes the Stream Control Transmission Protocol (SCTP). SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.</t>
              <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network such as IP. It offers the following services to its users:</t>
              <t>-- acknowledged error-free non-duplicated transfer of user data,</t>
              <t>-- data fragmentation to conform to discovered path MTU size,</t>
              <t>-- sequenced delivery of user messages within multiple streams, with an option for order-of-arrival delivery of individual user messages,</t>
              <t>-- optional bundling of multiple user messages into a single SCTP packet, and</t>
              <t>-- network-level fault tolerance through supporting of multi-homing at either or both ends of an association.</t>
              <t>The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4960"/>
          <seriesInfo name="DOI" value="10.17487/RFC4960"/>
        </reference>
        <reference anchor="RFC9260" target="https://www.rfc-editor.org/info/rfc9260" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml">
          <front>
            <title>Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart"/>
            <author fullname="M. Tüxen" initials="M." surname="Tüxen"/>
            <author fullname="K. Nielsen" initials="K." surname="Nielsen"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes the Stream Control Transmission Protocol (SCTP) and obsoletes RFC 4960. It incorporates the specification of the chunk flags registry from RFC 6096 and the specification of the I bit of DATA chunks from RFC 7053. Therefore, RFCs 6096 and 7053 are also obsoleted by this document. In addition, RFCs 4460 and 8540, which describe errata for SCTP, are obsoleted by this document.</t>
              <t>SCTP was originally designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks. It is also suited to be used for other applications, for example, WebRTC.</t>
              <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network, such as IP. It offers the following services to its users:</t>
              <t>The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9260"/>
          <seriesInfo name="DOI" value="10.17487/RFC9260"/>
        </reference>
        <reference anchor="I-D.stewart-tsvwg-sctpecn" target="https://datatracker.ietf.org/doc/html/draft-stewart-tsvwg-sctpecn-06" xml:base="https://bib.ietf.org/public/rfc/bibxml-ids/reference.I-D.stewart-tsvwg-sctpecn.xml">
          <front>
            <title>Explicit Congestion Notification for the Stream Control Transmission Protocol</title>
            <author fullname="Randall R. Stewart" initials="R. R." surname="Stewart">
              <organization>Netflix, Inc.</organization>
            </author>
            <author fullname="Michael Tüxen" initials="M." surname="Tüxen">
              <organization>Münster University of Applied Sciences</organization>
            </author>
            <date day="20" month="October" year="2023"/>
            <abstract>
              <t>This document describes the addition of the Explicit Congestion Notification (ECN) to the Stream Control Transmission Protocol (SCTP).</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-stewart-tsvwg-sctpecn-06"/>
        </reference>
        <reference anchor="RFC4987" target="https://www.rfc-editor.org/info/rfc4987" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4987.xml">
          <front>
            <title>TCP SYN Flooding Attacks and Common Mitigations</title>
            <author fullname="W. Eddy" initials="W." surname="Eddy"/>
            <date month="August" year="2007"/>
            <abstract>
              <t>This document describes TCP SYN flooding attacks, which have been well-known to the community for several years. Various countermeasures against these attacks, and the trade-offs of each, are described. This document archives explanations of the attack and common defense techniques for the benefit of TCP implementers and administrators of TCP servers or networks, but does not make any standards-level recommendations. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4987"/>
          <seriesInfo name="DOI" value="10.17487/RFC4987"/>
        </reference>
        <reference anchor="RFC5562" target="https://www.rfc-editor.org/info/rfc5562" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5562.xml">
          <front>
            <title>Adding Explicit Congestion Notification (ECN) Capability to TCP's SYN/ACK Packets</title>
            <author fullname="A. Kuzmanovic" initials="A." surname="Kuzmanovic"/>
            <author fullname="A. Mondal" initials="A." surname="Mondal"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <date month="June" year="2009"/>
            <abstract>
              <t>The proposal in this document is Experimental. While it may be deployed in the current Internet, it does not represent a consensus that this is the best possible mechanism for the use of Explicit Congestion Notification (ECN) in TCP SYN/ACK packets.</t>
              <t>This document describes an optional, experimental modification to RFC 3168 to allow TCP SYN/ACK packets to be ECN-Capable. For TCP, RFC 3168 specifies setting an ECN-Capable codepoint on data packets, but not on SYN and SYN/ACK packets. However, because of the high cost to the TCP transfer of having a SYN/ACK packet dropped, with the resulting retransmission timeout, this document describes the use of ECN for the SYN/ACK packet itself, when sent in response to a SYN packet with the two ECN flags set in the TCP header, indicating a willingness to use ECN. Setting the initial TCP SYN/ACK packet as ECN-Capable can be of great benefit to the TCP connection, avoiding the severe penalty of a retransmission timeout for a connection that has not yet started placing a load on the network. The TCP responder (the sender of the SYN/ACK packet) must reply to a report of an ECN-marked SYN/ACK packet by resending a SYN/ACK packet that is not ECN-Capable. If the resent SYN/ACK packet is acknowledged, then the TCP responder reduces its initial congestion window from two, three, or four segments to one segment, thereby reducing the subsequent load from that connection on the network. If instead the SYN/ACK packet is dropped, or for some other reason the TCP responder does not receive an acknowledgement in the specified time, the TCP responder follows TCP standards for a dropped SYN/ACK packet (setting the retransmission timer). This memo defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5562"/>
          <seriesInfo name="DOI" value="10.17487/RFC5562"/>
        </reference>
        <reference anchor="RFC5681" target="https://www.rfc-editor.org/info/rfc5681" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml">
          <front>
            <title>TCP Congestion Control</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines TCP's four intertwined congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. In addition, the document specifies how TCP should begin transmission after a relatively long idle period, as well as discussing various acknowledgment generation methods. This document obsoletes RFC 2581. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5681"/>
          <seriesInfo name="DOI" value="10.17487/RFC5681"/>
        </reference>
        <reference anchor="RFC5690" target="https://www.rfc-editor.org/info/rfc5690" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5690.xml">
          <front>
            <title>Adding Acknowledgement Congestion Control to TCP</title>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Arcia" initials="A." surname="Arcia"/>
            <author fullname="D. Ros" initials="D." surname="Ros"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <date month="February" year="2010"/>
            <abstract>
              <t>This document describes a possible congestion control mechanism for acknowledgement (ACKs) traffic in TCP. The document specifies an end-to-end acknowledgement congestion control mechanism for TCP that uses participation from both TCP hosts: the TCP data sender and the TCP data receiver. The TCP data sender detects lost or Explicit Congestion Notification (ECN)-marked ACK packets, and tells the TCP data receiver the ACK Ratio R to use to respond to the congestion on the reverse path from the data receiver to the data sender. The TCP data receiver sends roughly one ACK packet for every R data packets received. This mechanism is based on the acknowledgement congestion control in the Datagram Congestion Control Protocol's (DCCP's) Congestion Control Identifier (CCID) 2. This acknowledgement congestion control mechanism is being specified for further evaluation by the network community. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5690"/>
          <seriesInfo name="DOI" value="10.17487/RFC5690"/>
        </reference>
        <reference anchor="RFC6298" target="https://www.rfc-editor.org/info/rfc6298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6928" target="https://www.rfc-editor.org/info/rfc6928" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6928.xml">
          <front>
            <title>Increasing TCP's Initial Window</title>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document proposes an experiment to increase the permitted TCP initial window (IW) from between 2 and 4 segments, as specified in RFC 3390, to 10 segments with a fallback to the existing recommendation when performance issues are detected. It discusses the motivation behind the increase, the advantages and disadvantages of the higher initial window, and presents results from several large-scale experiments showing that the higher initial window improves the overall performance of many web services without resulting in a congestion collapse. The document closes with a discussion of usage and deployment for further experimental purposes recommended by the IETF TCP Maintenance and Minor Extensions (TCPM) working group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6928"/>
          <seriesInfo name="DOI" value="10.17487/RFC6928"/>
        </reference>
        <reference anchor="RFC7323" target="https://www.rfc-editor.org/info/rfc7323" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7323.xml">
          <front>
            <title>TCP Extensions for High Performance</title>
            <author fullname="D. Borman" initials="D." surname="Borman"/>
            <author fullname="B. Braden" initials="B." surname="Braden"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="R. Scheffenegger" initials="R." role="editor" surname="Scheffenegger"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>This document specifies a set of TCP extensions to improve performance over paths with a large bandwidth * delay product and to provide reliable operation over very high-speed paths. It defines the TCP Window Scale (WS) option and the TCP Timestamps (TS) option and their semantics. The Window Scale option is used to support larger receive windows, while the Timestamps option can be used for at least two distinct mechanisms, Protection Against Wrapped Sequences (PAWS) and Round-Trip Time Measurement (RTTM), that are also described herein.</t>
              <t>This document obsoletes RFC 1323 and describes changes from it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7323"/>
          <seriesInfo name="DOI" value="10.17487/RFC7323"/>
        </reference>
        <reference anchor="RFC7413" target="https://www.rfc-editor.org/info/rfc7413" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7413.xml">
          <front>
            <title>TCP Fast Open</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="S. Radhakrishnan" initials="S." surname="Radhakrishnan"/>
            <author fullname="A. Jain" initials="A." surname="Jain"/>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document describes an experimental TCP mechanism called TCP Fast Open (TFO). TFO allows data to be carried in the SYN and SYN-ACK packets and consumed by the receiving end during the initial connection handshake, and saves up to one full round-trip time (RTT) compared to the standard TCP, which requires a three-way handshake (3WHS) to complete before data can be exchanged. However, TFO deviates from the standard TCP semantics, since the data in the SYN could be replayed to an application in some rare circumstances. Applications should not use TFO unless they can tolerate this issue, as detailed in the Applicability section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7413"/>
          <seriesInfo name="DOI" value="10.17487/RFC7413"/>
        </reference>
        <reference anchor="RFC7567" target="https://www.rfc-editor.org/info/rfc7567" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7567.xml">
          <front>
            <title>IETF Recommendations Regarding Active Queue Management</title>
            <author fullname="F. Baker" initials="F." role="editor" surname="Baker"/>
            <author fullname="G. Fairhurst" initials="G." role="editor" surname="Fairhurst"/>
            <date month="July" year="2015"/>
            <abstract>
              <t>This memo presents recommendations to the Internet community concerning measures to improve and preserve Internet performance. It presents a strong recommendation for testing, standardization, and widespread deployment of active queue management (AQM) in network devices to improve the performance of today's Internet. It also urges a concerted effort of research, measurement, and ultimate deployment of AQM mechanisms to protect the Internet from flows that are not sufficiently responsive to congestion notification.</t>
              <t>Based on 15 years of experience and new research, this document replaces the recommendations of RFC 2309.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="197"/>
          <seriesInfo name="RFC" value="7567"/>
          <seriesInfo name="DOI" value="10.17487/RFC7567"/>
        </reference>
        <reference anchor="RFC7661" target="https://www.rfc-editor.org/info/rfc7661" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7661.xml">
          <front>
            <title>Updating TCP to Support Rate-Limited Traffic</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="A. Sathiaseelan" initials="A." surname="Sathiaseelan"/>
            <author fullname="R. Secchi" initials="R." surname="Secchi"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This document provides a mechanism to address issues that arise when TCP is used for traffic that exhibits periods where the sending rate is limited by the application rather than the congestion window. It provides an experimental update to TCP that allows a TCP sender to restart quickly following a rate-limited interval. This method is expected to benefit applications that send rate-limited traffic using TCP while also providing an appropriate response if congestion is experienced.</t>
              <t>This document also evaluates the Experimental specification of TCP Congestion Window Validation (CWV) defined in RFC 2861 and concludes that RFC 2861 sought to address important issues but failed to deliver a widely used solution. This document therefore reclassifies the status of RFC 2861 from Experimental to Historic. This document obsoletes RFC 2861.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7661"/>
          <seriesInfo name="DOI" value="10.17487/RFC7661"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Judd" initials="G." surname="Judd"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic. DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred. DCTCP then scales the TCP congestion window based on this estimate. This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches. This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations. This memo documents DCTCP as currently implemented by several major operating systems. DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </reference>
        <reference anchor="RFC9040" target="https://www.rfc-editor.org/info/rfc9040" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9040.xml">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>This memo provides guidance to TCP implementers that is intended to help improve connection convergence to steady-state operation without affecting interoperability. It updates and replaces RFC 2140's description of sharing TCP state, as typically represented in TCP Control Blocks, among similar concurrent or consecutive connections.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9040"/>
          <seriesInfo name="DOI" value="10.17487/RFC9040"/>
        </reference>
        <reference anchor="RFC9331" target="https://www.rfc-editor.org/info/rfc9331" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9331.xml">
          <front>
            <title>The Explicit Congestion Notification (ECN) Protocol for Low Latency, Low Loss, and Scalable Throughput (L4S)</title>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <date month="January" year="2023"/>
            <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. Then, network bottlenecks can be incrementally modified to distinguish and isolate existing traffic that still follows the Classic behaviour, to prevent it from degrading the low queuing delay and low loss of L4S traffic. This Experimental 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. It also suggests open questions to be investigated during experimentation. Examples of new Active Queue Management (AQM) marking algorithms and new transports (whether TCP-like or real time) are specified separately.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9331"/>
          <seriesInfo name="DOI" value="10.17487/RFC9331"/>
        </reference>
        <reference anchor="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
        <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9438" target="https://www.rfc-editor.org/info/rfc9438" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9438.xml">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>CUBIC is a standard TCP congestion control algorithm that uses a cubic function instead of a linear congestion window increase function to improve scalability and stability over fast and long-distance networks. CUBIC has been adopted as the default TCP congestion control algorithm by the Linux, Windows, and Apple stacks.</t>
              <t>This document updates the specification of CUBIC to include algorithmic improvements based on these implementations and recent academic work. Based on the extensive deployment experience with CUBIC, this document also moves the specification to the Standards Track and obsoletes RFC 8312. This document also updates RFC 5681, to allow for CUBIC's occasionally more aggressive sending behavior.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
        <reference anchor="I-D.briscoe-iccrg-prague-congestion-control" target="https://datatracker.ietf.org/doc/html/draft-briscoe-iccrg-prague-congestion-control-03" xml:base="https://bib.ietf.org/public/rfc/bibxml-ids/reference.I-D.briscoe-iccrg-prague-congestion-control.xml">
          <front>
            <title>Prague Congestion Control</title>
            <author fullname="Koen De Schepper" initials="K." surname="De Schepper">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Olivier Tilmans" initials="O." surname="Tilmans">
              <organization>Nokia Bell Labs</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Independent</organization>
            </author>
            <author fullname="Vidhi Goel" initials="V." surname="Goel">
              <organization>Apple Inc</organization>
            </author>
            <date day="14" month="October" year="2023"/>
            <abstract>
              <t>This specification defines the Prague congestion control scheme, which is derived from DCTCP and adapted for Internet traffic by implementing the Prague L4S requirements. Over paths with L4S support at the bottleneck, it adapts the DCTCP mechanisms to achieve consistently low latency and full throughput. It is defined independently of any particular transport protocol or operating system, but notes are added that highlight issues specific to certain transports and OSs. It is mainly based on experience with the reference Linux implementation of TCP Prague and the Apple implementation over QUIC, but it includes experience from other implementations where available. The implementation does not satisfy all the Prague requirements (yet) and the IETF might decide that certain requirements need to be relaxed as an outcome of the process of trying to satisfy them all. Future plans that have typically only been implemented as proof-of- concept code are outlined in a separate section.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-briscoe-iccrg-prague-congestion-control-03"/>
        </reference>
        <reference anchor="judd-nsdi" target="https://www.usenix.org/node/188966">
          <front>
            <title>Attaining the promise and avoiding the pitfalls of TCP in the
          Datacenter</title>
            <author fullname="Glenn" initials="G.J." surname="Judd">
              <organization/>
            </author>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="USENIX Symposium on Networked Systems Design and Implementation (NSDI'15)" value="pp.145-157"/>
          <format target="https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-judd.pdf" type="PDF"/>
        </reference>
        <reference anchor="ecn-pam" target="https://link.springer.com/chapter/10.1007/978-3-319-15509-8_15">
          <front>
            <title>Enabling Internet-Wide Deployment of Explicit Congestion
          Notification</title>
            <author fullname="Brian Trammell" initials="B." surname="Trammell">
              <organization/>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>ETHZ</organization>
            </author>
            <author fullname="Damiano Boppart" initials="D." surname="Boppart">
              <organization/>
            </author>
            <author fullname="Iain Learmonth" initials="I." surname="Learmonth">
              <organization/>
            </author>
            <author fullname="Gorry Fairhurst" initials="G" surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="Richard Scheffenegger" initials="R." surname="Scheffenegger">
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="Int'l Conf. on Passive and Active Network Measurement (PAM'15)" value="pp193-205"/>
          <format target="https://tik-old.ee.ethz.ch/file/55c228c89bd841b6f85542c58781b2dc/ecn-pam15.pdf" type="PDF"/>
        </reference>
        <reference anchor="ECN-PLUS" target="https://dl.acm.org/citation.cfm?id=1080100">
          <front>
            <title>The Power of Explicit Congestion Notification</title>
            <author fullname="Aleksander Kuzmanovic" initials="A." surname="Kuzmanovic">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="ACM SIGCOMM" value="35(4):61--72"/>
          <format target="https://users.cs.northwestern.edu/~akuzma/doc/ecn.pdf" type="PDF"/>
        </reference>
        <reference anchor="Mandalari18" target="https://ieeexplore.ieee.org/document/8316790">
          <front>
            <title>Measuring ECN++: Good News for ++, Bad News for ECN over
          Mobile</title>
            <author fullname="Anna Mandalari" initials="A." surname="Mandalari">
              <organization>UC3M</organization>
            </author>
            <author fullname="Andra Lutu" initials="A." surname="Lutu">
              <organization>Simula</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization>Simula</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Marcelo Bagnulo" initials="M." surname="Bagnulo">
              <organization>UC3M</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Özgü Alay" initials="Ö." surname="Alay">
              <organization>Simula</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <date month="March" year="2018"/>
          </front>
          <seriesInfo name="IEEE Communications Magazine" value=""/>
          <format target="http://www.it.uc3m.es/amandala/ecn++/ecn_commag_2018.html" type="PDF"/>
        </reference>
        <reference anchor="Manzoor17" target="https://ieeexplore.ieee.org/document/8002899">
          <front>
            <title>How HTTP/2 is changing Web traffic and how to detect
          it</title>
            <author fullname="Jawad Manzoor" initials="J." surname="Manzoor">
              <organization>Université Catholique de
            Louvain</organization>
            </author>
            <author fullname="Idilio Drago" initials="I." surname="Drago">
              <organization>Politecnico di Torino</organization>
            </author>
            <author fullname="Ramin Sadre" initials="R." surname="Sadre">
              <organization>Université Catholique de
            Louvain</organization>
            </author>
            <date month="June" year="2017"/>
          </front>
          <seriesInfo name="In Proc: Network Traffic Measurement and Analysis Conference (TMA) 2017" value="pp.1-9"/>
          <format target="https://tma.ifip.org/wp-content/uploads/sites/7/2017/06/tma2017_paper75.pdf" type="PDF"/>
        </reference>
        <reference anchor="Kuehlewind18" target="https://ieeexplore.ieee.org/document/8506532">
          <front>
            <title>Tracing Internet Path Transparency</title>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>ETHZ</organization>
            </author>
            <author fullname="Michael Walter" initials="M." surname="Walter">
              <organization>ETHZ</organization>
            </author>
            <author fullname="Iain Learmonth" initials="I." surname="Learmonth">
              <organization>University of Aberdeen</organization>
            </author>
            <author fullname="Brian Trammell" initials="B." surname="Trammell">
              <organization>ETHZ</organization>
            </author>
            <date month="June" year="2018"/>
          </front>
          <seriesInfo name="In Proc: Network Traffic Measurement and Analysis Conference (TMA) 2018" value=""/>
          <format target="https://tma.ifip.org/2018/wp-content/uploads/sites/3/2018/06/tma2018_paper12.pdf" type="PDF"/>
        </reference>
        <reference anchor="strict-ecn" target="https://patchwork.ozlabs.org/patch/156953/">
          <front>
            <title>tcp: be more strict before accepting ECN negociation</title>
            <author fullname="Eric Dumazet" initials="E." surname="Dumazet">
              <organization/>
            </author>
            <date day="4" month="May" year="2012"/>
          </front>
          <seriesInfo name="Linux netdev patch list" value=""/>
        </reference>
        <reference anchor="relax-strict-ecn" target="https://lore.kernel.org/patchwork/patch/1057812/">
          <front>
            <title>tcp: Accept ECT on SYN in the presence of RFC8311</title>
            <author fullname="Olivier Tilmans" initials="O." surname="Tilmans">
              <organization/>
            </author>
            <date day="3" month="April" year="2019"/>
          </front>
          <seriesInfo name="Linux netdev patch list" value=""/>
        </reference>
        <reference anchor="ecn-overload" target="https://urn.nb.no/URN:NBN:no-60155">
          <front>
            <title>Destruction Testing: Ultra-Low Delay using Dual Queue Coupled
          Active Queue Management</title>
            <author fullname="Henrik Steen" initials="H." surname="Steen">
              <organization>Department of Informatics, University of
            Oslo</organization>
            </author>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="Masters Thesis, Uni Oslo" value=""/>
          <format target="https://www.duo.uio.no/bitstream/handle/10852/57424/thesis-henrste.pdf?sequence=1" type="PDF"/>
        </reference>
        <reference anchor="DOCSIS3.1" target="https://specification-search.cablelabs.com/CM-SP-MULPIv3.1">
          <front>
            <title>MAC and Upper Layer Protocols Interface (MULPI)
          Specification, CM-SP-MULPIv3.1</title>
            <author fullname="" surname="">
              <organization>CableLabs</organization>
            </author>
            <date day="21" month="January" year="2019"/>
          </front>
          <seriesInfo name="Data-Over-Cable Service Interface Specifications DOCSIS® 3.1" value="Version i17 or later"/>
        </reference>
      </references>
    </references>
    <section numbered="false" toc="default">
      <name>Acknowledgments</name>
      <t>Thanks to Mirja Kühlewind, David Black, Padma Bhooma, Gorry
      Fairhurst, Michael Scharf, Yuchung Cheng and Christophe Paasch for their
      useful reviews. Richard Scheffenegger provided useful advice gained from
      implementing ECN++ for FreeBSD.</t>
      <t>The work of Marcelo Bagnulo has been partially funded by EU under
      projects Stand-ICT CCI and H2020-ICT-2014-2 5G NORMA.</t>
      <t>Bob Briscoe's contribution was partly funded by Apple Inc, 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>
  </back>
</rfc>
