<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" consensus="true" docName="draft-ietf-tcpm-accurate-ecn-34" number="9768" submissionType="IETF" ipr="pre5378Trust200902" updates="3168" obsoletes="" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" xml:lang="en" prepTime="2026-04-24T12:53:13" indexInclude="true" scripts="Common,Latin">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-tcpm-accurate-ecn-34" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9768" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="Accurate TCP ECN Feedback">More Accurate Explicit Congestion Notification (AccECN) Feedback in TCP</title>
    <seriesInfo name="RFC" value="9768" stream="IETF"/>
    <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
      <organization showOnFrontPage="true">Independent</organization>
      <address>
        <postal>
          <country>United Kingdom</country>
        </postal>
        <email>ietf@bobbriscoe.net</email>
        <uri>http://bobbriscoe.net/</uri>
      </address>
    </author>
    <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
      <organization showOnFrontPage="true">Ericsson</organization>
      <address>
        <postal>
          <country>Germany</country>
        </postal>
        <email>ietf@kuehlewind.net</email>
      </address>
    </author>
    <author fullname="Richard Scheffenegger" initials="R." surname="Scheffenegger">
      <organization showOnFrontPage="true">NetApp</organization>
      <address>
        <postal>
          <city>Vienna</city>
          <country>Austria</country>
        </postal>
        <email>Richard.Scheffenegger@netapp.com</email>
      </address>
    </author>
    <date month="04" year="2026"/>
    <area>WIT</area>
    <workgroup>tcpm</workgroup>
    <keyword>Congestion Control and Management</keyword>
    <keyword>Congestion Notification</keyword>
    <keyword>Feedback</keyword>
    <keyword>Reliable</keyword>
    <keyword>Ordered</keyword>
    <keyword>Protocol</keyword>
    <keyword>ECN</keyword>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">Explicit Congestion Notification (ECN) is a mechanism by which 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). More recently defined 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 defined in RFC 3168 by specifying a
      scheme that provides more than one feedback signal per RTT in the TCP
      header, called More Accurate ECN (AccECN). 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
      additionally exploited to feed back the IP-ECN field received during
      the TCP connection establishment.
      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>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9768" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2026 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
        <t indent="0" pn="section-boilerplate.2-3">
            This document may contain material from IETF Documents or IETF
            Contributions published or made publicly available before November
            10, 2008. The person(s) controlling the copyright in some of this
            material may not have granted the IETF Trust the right to allow
            modifications of such material outside the IETF Standards Process.
            Without obtaining an adequate license from the person(s)
            controlling the copyright in such materials, this document may not
            be modified outside the IETF Standards Process, and derivative
            works of it may not be created outside the IETF Standards Process,
            except to format it for publication as an RFC or to translate it
            into languages other than English.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-document-roadmap">Document Roadmap</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.2">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.2.1"><xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-goals">Goals</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.3">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.3.1"><xref derivedContent="1.3" format="counter" sectionFormat="of" target="section-1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.4">
                <t indent="0" pn="section-toc.1-1.1.2.4.1"><xref derivedContent="1.4" format="counter" sectionFormat="of" target="section-1.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-recap-of-existing-ecn-feedb">Recap of Existing ECN Feedback in IP/TCP</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-accecn-protocol-overview-an">AccECN Protocol Overview and Rationale</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t indent="0" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-capability-negotiation">Capability Negotiation</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.2">
                <t indent="0" pn="section-toc.1-1.2.2.2.1"><xref derivedContent="2.2" format="counter" sectionFormat="of" target="section-2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-feedback-mechanism">Feedback Mechanism</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.3">
                <t indent="0" pn="section-toc.1-1.2.2.3.1"><xref derivedContent="2.3" format="counter" sectionFormat="of" target="section-2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-delayed-acks-and-resilience">Delayed ACKs and Resilience Against ACK Loss</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.4">
                <t indent="0" pn="section-toc.1-1.2.2.4.1"><xref derivedContent="2.4" format="counter" sectionFormat="of" target="section-2.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-feedback-metrics">Feedback Metrics</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.5">
                <t indent="0" pn="section-toc.1-1.2.2.5.1"><xref derivedContent="2.5" format="counter" sectionFormat="of" target="section-2.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-generic-mechanistic-reflect">Generic (Mechanistic) Reflector</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-accecn-protocol-specificati">AccECN Protocol Specification</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-negotiating-to-use-accecn">Negotiating to Use AccECN</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.1.2">
                  <li pn="section-toc.1-1.3.2.1.2.1">
                    <t indent="0" pn="section-toc.1-1.3.2.1.2.1.1"><xref derivedContent="3.1.1" format="counter" sectionFormat="of" target="section-3.1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-negotiation-during-the-tcp-">Negotiation During the TCP Three-Way Handshake</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.1.2.2">
                    <t indent="0" pn="section-toc.1-1.3.2.1.2.2.1"><xref derivedContent="3.1.2" format="counter" sectionFormat="of" target="section-3.1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-backward-compatibility">Backward Compatibility</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.1.2.3">
                    <t indent="0" pn="section-toc.1-1.3.2.1.2.3.1"><xref derivedContent="3.1.3" format="counter" sectionFormat="of" target="section-3.1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-forward-compatibility">Forward Compatibility</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.1.2.4">
                    <t indent="0" pn="section-toc.1-1.3.2.1.2.4.1"><xref derivedContent="3.1.4" format="counter" sectionFormat="of" target="section-3.1.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multiple-syns-or-syn-acks">Multiple SYNs or SYN/ACKs</xref></t>
                    <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.1.2.4.2">
                      <li pn="section-toc.1-1.3.2.1.2.4.2.1">
                        <t indent="0" pn="section-toc.1-1.3.2.1.2.4.2.1.1"><xref derivedContent="3.1.4.1" format="counter" sectionFormat="of" target="section-3.1.4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-retransmitted-syns">Retransmitted SYNs</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.1.2.4.2.2">
                        <t indent="0" pn="section-toc.1-1.3.2.1.2.4.2.2.1"><xref derivedContent="3.1.4.2" format="counter" sectionFormat="of" target="section-3.1.4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-retransmitted-syn-acks">Retransmitted SYN/ACKs</xref></t>
                      </li>
                    </ul>
                  </li>
                  <li pn="section-toc.1-1.3.2.1.2.5">
                    <t indent="0" pn="section-toc.1-1.3.2.1.2.5.1"><xref derivedContent="3.1.5" format="counter" sectionFormat="of" target="section-3.1.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-implications-of-accecn-mode">Implications of AccECN Mode</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-accecn-feedback">AccECN Feedback</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.2.2">
                  <li pn="section-toc.1-1.3.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.3.2.2.2.1.1"><xref derivedContent="3.2.1" format="counter" sectionFormat="of" target="section-3.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-initialization-of-feedback-">Initialization of Feedback Counters</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.3.2.2.2.2.1"><xref derivedContent="3.2.2" format="counter" sectionFormat="of" target="section-3.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-ace-field">The ACE Field</xref></t>
                    <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.2.2.2.2">
                      <li pn="section-toc.1-1.3.2.2.2.2.2.1">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.2.2.1.1"><xref derivedContent="3.2.2.1" format="counter" sectionFormat="of" target="section-3.2.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-ace-field-on-the-ack-of-the">ACE Field on the ACK of the SYN/ACK</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.2.2.2">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.2.2.2.1"><xref derivedContent="3.2.2.2" format="counter" sectionFormat="of" target="section-3.2.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-encoding-and-decoding-feedb">Encoding and Decoding Feedback in the ACE Field</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.2.2.3">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.2.2.3.1"><xref derivedContent="3.2.2.3" format="counter" sectionFormat="of" target="section-3.2.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-testing-for-mangling-of-the">Testing for Mangling of the IP/ECN Field</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.2.2.4">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.2.2.4.1"><xref derivedContent="3.2.2.4" format="counter" sectionFormat="of" target="section-3.2.2.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-testing-for-zeroing-of-the-">Testing for Zeroing of the ACE Field</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.2.2.5">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.2.2.5.1"><xref derivedContent="3.2.2.5" format="counter" sectionFormat="of" target="section-3.2.2.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-safety-against-ambiguity-of">Safety Against Ambiguity of the ACE Field</xref></t>
                      </li>
                    </ul>
                  </li>
                  <li pn="section-toc.1-1.3.2.2.2.3">
                    <t indent="0" pn="section-toc.1-1.3.2.2.2.3.1"><xref derivedContent="3.2.3" format="counter" sectionFormat="of" target="section-3.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-accecn-option">The AccECN Option</xref></t>
                    <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.2.2.3.2">
                      <li pn="section-toc.1-1.3.2.2.2.3.2.1">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.3.2.1.1"><xref derivedContent="3.2.3.1" format="counter" sectionFormat="of" target="section-3.2.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-encoding-and-decoding-feedba">Encoding and Decoding Feedback in the AccECN Option Fields</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.3.2.2">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.3.2.2.1"><xref derivedContent="3.2.3.2" format="counter" sectionFormat="of" target="section-3.2.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-path-traversal-of-the-accec">Path Traversal of the AccECN Option</xref></t>
                      </li>
                      <li pn="section-toc.1-1.3.2.2.2.3.2.3">
                        <t indent="0" pn="section-toc.1-1.3.2.2.2.3.2.3.1"><xref derivedContent="3.2.3.3" format="counter" sectionFormat="of" target="section-3.2.3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-usage-of-the-accecn-tcp-opt">Usage of the AccECN TCP Option</xref></t>
                      </li>
                    </ul>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.3.2.3">
                <t indent="0" pn="section-toc.1-1.3.2.3.1"><xref derivedContent="3.3" format="counter" sectionFormat="of" target="section-3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-accecn-compliance-requireme">AccECN Compliance Requirements for TCP Proxies, Offload Engines, and Other Middleboxes</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2.3.2">
                  <li pn="section-toc.1-1.3.2.3.2.1">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.1.1"><xref derivedContent="3.3.1" format="counter" sectionFormat="of" target="section-3.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-for-tcp-proxie">Requirements for TCP Proxies</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.3.2.2">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.2.1"><xref derivedContent="3.3.2" format="counter" sectionFormat="of" target="section-3.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-for-transparen">Requirements for Transparent Middleboxes and TCP Normalizers</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.3.2.3">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.3.1"><xref derivedContent="3.3.3" format="counter" sectionFormat="of" target="section-3.3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-for-tcp-ack-fi">Requirements for TCP ACK Filtering</xref></t>
                  </li>
                  <li pn="section-toc.1-1.3.2.3.2.4">
                    <t indent="0" pn="section-toc.1-1.3.2.3.2.4.1"><xref derivedContent="3.3.4" format="counter" sectionFormat="of" target="section-3.3.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-requirements-for-tcp-segmen">Requirements for TCP Segmentation Offload and Large Receive Offload</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-updates-to-rfc-3168">Updates to RFC 3168</xref></t>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-interaction-with-tcp-varian">Interaction with TCP Variants</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-compatibility-with-syn-cook">Compatibility with SYN Cookies</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-compatibility-with-tcp-expe">Compatibility with TCP Experiments and Common TCP Options</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.3">
                <t indent="0" pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" format="counter" sectionFormat="of" target="section-5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-compatibility-with-feedback">Compatibility with Feedback Integrity Mechanisms</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-summary-protocol-properties">Summary: Protocol Properties</xref></t>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-and-privacy-consid">Security and Privacy Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2">
              <li pn="section-toc.1-1.9.2.1">
                <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent="9.1" format="counter" sectionFormat="of" target="section-9.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.2">
                <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent="9.2" format="counter" sectionFormat="of" target="section-9.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-algorithms">Example Algorithms</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="A.1" format="counter" sectionFormat="of" target="section-appendix.a.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-algorithm-to-encode">Example Algorithm to Encode/Decode the AccECN Option</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="A.2" format="counter" sectionFormat="of" target="section-appendix.a.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-algorithm-for-safet">Example Algorithm for Safety Against Long Sequences of ACK Loss</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2.2.2">
                  <li pn="section-toc.1-1.10.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.10.2.2.2.1.1"><xref derivedContent="A.2.1" format="counter" sectionFormat="of" target="section-appendix.a.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-safety-algorithm-without-th">Safety Algorithm Without the AccECN Option</xref></t>
                  </li>
                  <li pn="section-toc.1-1.10.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.10.2.2.2.2.1"><xref derivedContent="A.2.2" format="counter" sectionFormat="of" target="section-appendix.a.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-safety-algorithm-with-the-a">Safety Algorithm With the AccECN Option</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.10.2.3">
                <t indent="0" pn="section-toc.1-1.10.2.3.1"><xref derivedContent="A.3" format="counter" sectionFormat="of" target="section-appendix.a.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-algorithm-to-estima">Example Algorithm to Estimate Marked Bytes from Marked Packets</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.4">
                <t indent="0" pn="section-toc.1-1.10.2.4.1"><xref derivedContent="A.4" format="counter" sectionFormat="of" target="section-appendix.a.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-algorithm-to-count-">Example Algorithm to Count Not-ECT Bytes</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-rationale-for-usage-of-tcp-">Rationale for Usage of TCP Header Flags</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.11.2">
              <li pn="section-toc.1-1.11.2.1">
                <t indent="0" pn="section-toc.1-1.11.2.1.1"><xref derivedContent="B.1" format="counter" sectionFormat="of" target="section-appendix.b.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-three-tcp-header-flags-in-t">Three TCP Header Flags in the SYN-SYN/ACK Handshake</xref></t>
              </li>
              <li pn="section-toc.1-1.11.2.2">
                <t indent="0" pn="section-toc.1-1.11.2.2.1"><xref derivedContent="B.2" format="counter" sectionFormat="of" target="section-appendix.b.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-four-codepoints-in-the-syn-">Four Codepoints in the SYN/ACK</xref></t>
              </li>
              <li pn="section-toc.1-1.11.2.3">
                <t indent="0" pn="section-toc.1-1.11.2.3.1"><xref derivedContent="B.3" format="counter" sectionFormat="of" target="section-appendix.b.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-space-for-future-evolution">Space for Future Evolution</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.d"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="accecn_Introduction" numbered="true" removeInRFC="false" toc="include" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">Explicit Congestion Notification (ECN) <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> is a
      mechanism by which 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. In RFC 3168, ECN was specified for TCP in such a way that only
      one feedback signal could be transmitted per Round-Trip Time (RTT).
      This is sufficient for congestion control schemes like Reno <xref target="RFC5681" format="default" sectionFormat="of" derivedContent="RFC5681"/> and CUBIC <xref target="RFC9438" format="default" sectionFormat="of" derivedContent="RFC9438"/>, as those schemes
      reduce their congestion window by a fixed factor if congestion occurs
      within an RTT independent of the number of received congestion markings.
      More recently defined mechanisms like Congestion Exposure (ConEx <xref target="RFC7713" format="default" sectionFormat="of" derivedContent="RFC7713"/>), DCTCP <xref target="RFC8257" format="default" sectionFormat="of" derivedContent="RFC8257"/>, and L4S <xref target="RFC9330" format="default" sectionFormat="of" derivedContent="RFC9330"/> need to know when more than one marking is received
      in one RTT, which is information that cannot be provided by the feedback
      scheme as specified in <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>. This document specifies
      an update to the ECN feedback scheme of RFC 3168 that provides more
      accurate information and could be used by these and potentially other
      future TCP extensions, while still also supporting the pre-existing TCP
      congestion controllers that use just one feedback signal per round.
      Congestion control is the term the IETF uses to describe data rate
      management. It is the algorithm that a sender uses to optimize its
      sending rate so that it transmits data as fast as the network can
      carry it, but no faster. A fuller description of the motivation for
      this specification is given in the associated requirements document
      <xref target="RFC7560" format="default" sectionFormat="of" derivedContent="RFC7560"/>.</t>
      <t indent="0" pn="section-1-2">This document specifies a Standards Track scheme for ECN feedback in
      the TCP header to provide more than one feedback signal per RTT. It is
      called the "more Accurate ECN feedback" scheme, or AccECN for short.

      This document updates RFC 3168 with respect to negotiation and use of
      the feedback scheme for TCP. All aspects of RFC 3168 other than the TCP
      feedback scheme and its negotiation remain unchanged by this
      specification. In particular, the definition of ECN at the IP layer is
      unaffected. <xref target="accecn_3168_updates" format="default" sectionFormat="of" derivedContent="Section 4"/> details the aspects of RFC 3168 that are updated by this document.</t>
      <t indent="0" pn="section-1-3">This document uses the term "Classic ECN feedback" when it needs to
      distinguish the TCP/ECN feedback scheme defined in <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> from the AccECN TCP feedback scheme. AccECN is
      intended to offer a complete replacement for Classic TCP/ECN feedback,
      not a fork in the design of TCP. AccECN feedback complements TCP's loss
      feedback and it can coexist alongside hosts using Classic TCP/ECN
      feedback. So its applicability is intended to include the public Internet
      as well as private IP networks such as data centres (and even any non-IP
      networks over which TCP is used), whether or not any nodes on the path
      support ECN, of whatever flavour.</t>
      <t indent="0" pn="section-1-4">AccECN feedback overloads the two existing ECN flags in the TCP
      header and allocates the currently reserved flag (previously called NS)
      in the TCP header to be used as one 3-bit counter field for feeding
      back the number of packets marked as congestion experienced (CE). Given
      the new definitions of these three bits, both ends have to support the
      new wire protocol before it can be used. Therefore, during the TCP
      handshake, the two ends use these three bits in the TCP header to
      negotiate the most advanced feedback protocol that they can both
      support, in a way that is backward compatible with <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</t>
      <t indent="0" pn="section-1-5">AccECN is solely a change to the TCP wire protocol; it covers the
      negotiation and signaling of more Accurate ECN feedback from a TCP Data
      Receiver to a Data Sender. It is completely independent of how TCP might
      respond to congestion feedback, which is out of scope, but ultimately
      the motivation for Accurate ECN feedback. Like Classic ECN feedback,
      AccECN can be used by standard Reno or CUBIC congestion control <xref target="RFC5681" format="default" sectionFormat="of" derivedContent="RFC5681"/> <xref target="RFC9438" format="default" sectionFormat="of" derivedContent="RFC9438"/> to respond
      to the existence of at least one congestion notification within a round
      trip. Or, unlike Reno or CUBIC, AccECN can be used to respond to the
      extent of congestion notification over a round trip, as for example
      DCTCP does in controlled environments <xref target="RFC8257" format="default" sectionFormat="of" derivedContent="RFC8257"/>. For
      congestion response, this specification refers to the original ECN
      specification adopted in 2001 <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, as updated
      by the more relaxed rules introduced in 2018 to allow ECN experiments
      <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>, namely: a TCP-based Low Latency
      Low Loss Scalable (L4S) congestion control <xref target="RFC9330" format="default" sectionFormat="of" derivedContent="RFC9330"/>; or
      Alternative Backoff with ECN (ABE) <xref target="RFC8511" format="default" sectionFormat="of" derivedContent="RFC8511"/>.</t>
      <t indent="0" pn="section-1-6"><xref target="accecn_Interaction_Other" format="default" sectionFormat="of" derivedContent="Section 5.2"/> explains how AccECN is
      compatible with current commonly used TCP Options, and a number of
      current experimental modifications to TCP, as well as SYN cookies.</t>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-1.1">
        <name slugifiedName="name-document-roadmap">Document Roadmap</name>
        <t indent="0" pn="section-1.1-1">The following introductory section outlines the goals of AccECN
        (<xref target="accecn_Goals" format="default" sectionFormat="of" derivedContent="Section 1.2"/>). Then, terminology is defined (<xref target="accecn_Terminology" format="default" sectionFormat="of" derivedContent="Section 1.3"/>) and a recap of existing prerequisite
        technology is given (<xref target="accecn_Recap" format="default" sectionFormat="of" derivedContent="Section 1.4"/>).</t>
        <t indent="0" pn="section-1.1-2"><xref target="accecn_Overview" format="default" sectionFormat="of" derivedContent="Section 2"/> gives an informative overview of
        the AccECN protocol. Then <xref target="accecn_Spec" format="default" sectionFormat="of" derivedContent="Section 3"/> gives the
        normative protocol specification, and <xref target="accecn_Mbox_Operation" format="default" sectionFormat="of" derivedContent="Section 3.3"/> collects  requirements for
        proxies, offload engines, and other middleboxes. <xref target="accecn_3168_updates" format="default" sectionFormat="of" derivedContent="Section 4"/> clarifies which aspects of RFC 3168 are
        updated by AccECN. <xref target="accecn_Interact_Variants" format="default" sectionFormat="of" derivedContent="Section 5"/> assesses
        the interaction of AccECN with commonly used variants of TCP, whether
        they are standardized or not. Then <xref target="accecn_Properties" format="default" sectionFormat="of" derivedContent="Section 6"/>
        summarizes the features and properties of AccECN.</t>
        <t indent="0" pn="section-1.1-3"><xref target="accecn_IANA_Considerations" format="default" sectionFormat="of" derivedContent="Section 7"/> summarizes the protocol
        fields and numbers that IANA assigned, and <xref target="accecn_Security_Considerations" format="default" sectionFormat="of" derivedContent="Section 8"/> points to the aspects of the
        protocol that will be of interest to the security community.</t>
        <t indent="0" pn="section-1.1-4"><xref target="accecn_Algo_Examples" format="default" sectionFormat="of" derivedContent="Appendix A"/> gives pseudocode examples for
        the various algorithms that AccECN uses, and <xref target="accecn_flags_rationale" format="default" sectionFormat="of" derivedContent="Appendix B"/> explains why AccECN uses flags in
        the main TCP header and quantifies the space left for future use.</t>
      </section>
      <section anchor="accecn_Goals" numbered="true" removeInRFC="false" toc="include" pn="section-1.2">
        <name slugifiedName="name-goals">Goals</name>
        <t indent="0" pn="section-1.2-1"><xref target="RFC7560" format="default" sectionFormat="of" derivedContent="RFC7560"/> enumerates requirements that a candidate
        feedback scheme needs to satisfy, under the headings: resilience,
        timeliness, integrity, accuracy (including ordering and lack of bias),
        complexity, overhead, and compatibility (both backward and forward). It
        recognizes that a perfect scheme that fully satisfies all the
        requirements is unlikely and tradeoffs between requirements are
        likely. <xref target="accecn_Properties" format="default" sectionFormat="of" derivedContent="Section 6"/> assesses the properties of
        AccECN against these requirements and discusses the tradeoffs.</t>
        <t indent="0" pn="section-1.2-2">The requirements document recognizes that a protocol as ubiquitous
        as TCP needs to be able to serve as-yet-unspecified requirements.
        Therefore, an AccECN receiver acts as a generic (mechanistic) reflector
        of congestion information with the aim that new sender
        behaviours can be deployed unilaterally in the future (see <xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/>).</t>
      </section>
      <section anchor="accecn_Terminology" numbered="true" removeInRFC="false" toc="include" pn="section-1.3">
        <name slugifiedName="name-terminology">Terminology</name>
        <dl newline="false" spacing="normal" indent="3" pn="section-1.3-1">
          <dt pn="section-1.3-1.1">AccECN:</dt>
          <dd pn="section-1.3-1.2">The more Accurate ECN feedback scheme.</dd>
          <dt pn="section-1.3-1.3">Classic ECN:</dt>
          <dd pn="section-1.3-1.4">The ECN protocol specified in <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</dd>
          <dt pn="section-1.3-1.5">Classic ECN feedback:</dt>
          <dd pn="section-1.3-1.6">The feedback aspect of the ECN
            protocol specified in <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, including
            generation, encoding, transmission and decoding of feedback, but
            not the Data Sender's subsequent response to that feedback.</dd>
          <dt pn="section-1.3-1.7">ACK:</dt>
          <dd pn="section-1.3-1.8">A TCP acknowledgement, with or without a data
            payload (ACK=1).</dd>
          <dt pn="section-1.3-1.9">Pure ACK:</dt>
          <dd pn="section-1.3-1.10">A TCP acknowledgement without a data
            payload.</dd>
          <dt pn="section-1.3-1.11">Acceptable packet / segment:</dt>
          <dd pn="section-1.3-1.12">A packet or segment
            that passes the acceptability tests in <xref target="RFC9293" format="default" sectionFormat="of" derivedContent="RFC9293"/>
            and <xref target="RFC5961" format="default" sectionFormat="of" derivedContent="RFC5961"/>, or that has passed other tests with
            equivalent protection.</dd>
          <dt pn="section-1.3-1.13">TCP Client:</dt>
          <dd pn="section-1.3-1.14">The TCP stack that originates a
            connection (the initiator).</dd>
          <dt pn="section-1.3-1.15">TCP Server:</dt>
          <dd pn="section-1.3-1.16">The TCP stack that responds to a
            connection request (the listener).</dd>
          <dt pn="section-1.3-1.17">Three-way handshake:</dt>
          <dd pn="section-1.3-1.18">The procedure used to establish
            a TCP connection as described in the TCP protocol specification
            <xref target="RFC9293" format="default" sectionFormat="of" derivedContent="RFC9293"/>.</dd>
          <dt pn="section-1.3-1.19">Data Receiver:</dt>
          <dd pn="section-1.3-1.20">The endpoint of a TCP half-connection
            that receives data and sends AccECN feedback.</dd>
          <dt pn="section-1.3-1.21">Data Sender:</dt>
          <dd pn="section-1.3-1.22">The endpoint of a TCP half-connection
            that sends data and receives AccECN feedback.</dd>
        </dl>
        <t indent="0" pn="section-1.3-2"> In a mild abuse of terminology, this document sometimes
        refers to 'TCP packets' instead of 'TCP segments'.</t>
        <t indent="0" pn="section-1.3-3">
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
    "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
    interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as
    shown here.
        </t>
      </section>
      <section anchor="accecn_Recap" numbered="true" removeInRFC="false" toc="include" pn="section-1.4">
        <name slugifiedName="name-recap-of-existing-ecn-feedb">Recap of Existing ECN Feedback in IP/TCP</name>
        <t indent="0" pn="section-1.4-1">Explicit Congestion Notification (ECN) <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>
        can be split into two parts conceptually. In the forward direction,
        alongside the data stream, it uses a 2-bit field in the IP header.
        This is referred to as IP ECN later on. This signal carried in the
        IP (Layer 3) header is exposed to network devices, which can modify it
        when they start to experience congestion (see <xref target="accecn_Tab_ECN" format="default" sectionFormat="of" derivedContent="Table 1"/>). The second part is the feedback mechanism, by which the data receiver notifies the current congestion state to the original data sender
        of the intermediate path. That returned signal is carried in a
        transport-protocol-specific manner, and is not to be modified by intermediate
        network devices. While ECN is in active use for protocols such as
        QUIC <xref target="RFC9000" format="default" sectionFormat="of" derivedContent="RFC9000"/>, SCTP <xref target="RFC9260" format="default" sectionFormat="of" derivedContent="RFC9260"/>,
        RTP <xref target="RFC6679" format="default" sectionFormat="of" derivedContent="RFC6679"/>, and Remote Direct Memory Access over
        Converged Ethernet <xref target="RoCEv2" format="default" sectionFormat="of" derivedContent="RoCEv2"/>, this document only concerns
        itself with the specific implementation for the TCP protocol.</t>
        <t indent="0" pn="section-1.4-2">Once ECN has been negotiated for a transport layer connection, the
        Data Sender for either half-connection can set two possible codepoints
        (ECT(0) or ECT(1)) in the IP header of a data packet to indicate an
        ECN-capable transport (ECT). If the ECN codepoint is 0b00, the packet
        is considered to have been sent by a Not ECN-capable Transport
        (Not-ECT). When a network node experiences congestion, it will
        occasionally either drop or mark a packet, with the choice depending
        on the packet's ECN codepoint. If the codepoint is Not-ECT, only drop
        is appropriate. If the codepoint is ECT(0) or ECT(1), the node can
        mark the packet by setting the ECN codepoint to 0b11, which is termed
        'Congestion Experienced' (CE), or loosely a 'congestion mark'. <xref target="accecn_Tab_ECN" format="default" sectionFormat="of" derivedContent="Table 1"/> summarises these codepoints.</t>
        <table anchor="accecn_Tab_ECN" align="center" pn="table-1">
          <name slugifiedName="name-the-ecn-field-in-the-ip-hea">The ECN Field in the IP Header</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">IP-ECN Codepoint</th>
              <th align="left" colspan="1" rowspan="1">Codepoint Name</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">0b00</td>
              <td align="left" colspan="1" rowspan="1">Not-ECT</td>
              <td align="left" colspan="1" rowspan="1">Not ECN-Capable Transport</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">0b01</td>
              <td align="left" colspan="1" rowspan="1">ECT(1)</td>
              <td align="left" colspan="1" rowspan="1">ECN-Capable Transport (1)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">0b10</td>
              <td align="left" colspan="1" rowspan="1">ECT(0)</td>
              <td align="left" colspan="1" rowspan="1">ECN-Capable Transport (0)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">0b11</td>
              <td align="left" colspan="1" rowspan="1">CE</td>
              <td align="left" colspan="1" rowspan="1">Congestion Experienced</td>
            </tr>
          </tbody>
        </table>
        <t indent="0" pn="section-1.4-4">In the TCP header, the first two bits in byte 14 (the TCP header
        flags at bit offsets 8 and 9 labelled Congestion Window Reduced (CWR)
        and Explicit Congestion notification Echo (ECE) in <xref target="accecn_Fig_TCPHdr" format="default" sectionFormat="of" derivedContent="Figure 1"/>) are defined as flags for the use of
        Classic ECN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>. A TCP Client indicates that it
        supports Classic ECN feedback by setting (CWR,ECE) = (1,1) in the SYN,
        and an ECN-enabled TCP Server confirms Classic ECN support by setting
        (CWR,ECE) = (0,1) in the SYN/ACK. On reception of a CE-marked packet
        at the IP layer, the Data Receiver for that half-connection starts to
        set the Echo Congestion Experienced (ECE) flag continuously in the TCP
        header of ACKs, which gives the signal resilience to loss or
        reordering of ACKs. The Data Sender for the same half-connection
        confirms that it has received at least one ECE signal by responding
        with the CWR flag, which allows the Data
        Receiver to stop repeating the ECN-Echo flag. This always leads to a
        full RTT of ACKs with ECE set. Thus Classic ECN cannot feed back any
        additional CE markings arriving within this RTT.</t>
        <t indent="0" pn="section-1.4-5">The last bit in byte 13 of the TCP header (the TCP header flag at
        bit offset 7 in <xref target="accecn_Fig_TCPHdr" format="default" sectionFormat="of" derivedContent="Figure 1"/>) was defined as the
        Nonce Sum (NS) for the ECN-nonce <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>. In the
        absence of widespread deployment, RFC 3540 was reclassified as
        Historic <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> and the respective flag was
        marked as "Reserved", which made this TCP flag available for use by AccECN
        instead.</t>
        <figure anchor="accecn_Fig_TCPHdr" align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-tcp-header-flags-as-defined">TCP Header Flags as Defined Before the Nonce Sum Flag Reverted to Reserved</name>
          <artwork align="center" pn="section-1.4-6.1">
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|               |           | N | C | E | U | A | P | R | S | F |
| Header Length | Reserved  | S | W | C | R | C | S | S | Y | I |
|               |           |   | R | E | G | K | H | T | N | N |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
</artwork>
        </figure>
      </section>
    </section>
    <section anchor="accecn_Overview" numbered="true" removeInRFC="false" toc="include" pn="section-2">
      <name slugifiedName="name-accecn-protocol-overview-an">AccECN Protocol Overview and Rationale</name>
      <t indent="0" pn="section-2-1">This section provides an informative overview of the AccECN protocol
      that is normatively specified in <xref target="accecn_Spec" format="default" sectionFormat="of" derivedContent="Section 3"/>.</t>
      <t indent="0" pn="section-2-2">Like the general TCP approach, the Data Receiver of each TCP
      half-connection sends AccECN feedback to the Data Sender on TCP
      acknowledgements, reusing data packets of the other half-connection
      whenever possible.</t>
      <t indent="0" pn="section-2-3">The AccECN protocol has had to be designed in two parts:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-2-4">
        <li pn="section-2-4.1">
          <t indent="0" pn="section-2-4.1.1">an essential feedback part that reuses the TCP-ECN header bits for the
          Data Receiver to feed back the number of packets arriving with CE in
          the IP-ECN field. This provides more accuracy than Classic ECN
          feedback, but limited resilience against ACK loss.</t>
        </li>
        <li pn="section-2-4.2">
          <t indent="0" pn="section-2-4.2.1">a supplementary feedback part using one of two new alternative AccECN TCP
          Options that provide additional feedback on the number of payload bytes
          that arrive marked with each of the three ECN codepoints in the IP-ECN
          field (not just CE marks). See the BCP on Byte and Packet Congestion
          Notification <xref target="RFC7141" format="default" sectionFormat="of" derivedContent="RFC7141"/> for the rationale determining that
          conveying congested payload bytes should be preferred over just
          providing feedback about congested packets. This also provides
          greater resilience against ACK loss than the essential feedback,
          but it is currently more likely to suffer from middlebox
          interference.</t>
        </li>
      </ul>
      <t indent="0" pn="section-2-5">The two part design was necessary, given limitations on the
      space available for TCP Options and given the possibility that certain
      incorrectly designed middleboxes might prevent TCP from using any new
      options.</t>
      <t indent="0" pn="section-2-6">The essential feedback part overloads the previous definition of the three
      flags in the TCP header that had been assigned for use by Classic ECN.
      This design choice deliberately allows AccECN peers to replace the
      Classic ECN feedback protocol, rather than leaving Classic ECN feedback
      intact and adding more accurate feedback separately because:</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-2-7">
        <li pn="section-2-7.1">
          <t indent="0" pn="section-2-7.1.1">this efficiently reuses scarce TCP header space, given TCP Option
          space is approaching saturation;</t>
        </li>
        <li pn="section-2-7.2">
          <t indent="0" pn="section-2-7.2.1">a single upgrade path for the TCP protocol is preferable to a
          fork in the design that modifies the TCP header to convey all
          ECN feedback;</t>
        </li>
        <li pn="section-2-7.3">
          <t indent="0" pn="section-2-7.3.1">otherwise, Classic and Accurate ECN feedback could give
          conflicting feedback about the same segment, which could open up new
          security concerns and make implementations unnecessarily
          complex; </t>
        </li>
        <li pn="section-2-7.4">
          <t indent="0" pn="section-2-7.4.1">middleboxes are more likely to faithfully forward the TCP-ECN
          flags than newly defined areas of the TCP header.</t>
        </li>
      </ul>
      <t indent="0" pn="section-2-8">AccECN is designed to work even if the supplementary feedback part is removed
      or zeroed out, as long as the essential feedback part gets through.</t>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-2.1">
        <name slugifiedName="name-capability-negotiation">Capability Negotiation</name>
        <t indent="0" pn="section-2.1-1">AccECN changes the wire protocol of the main TCP header;
        therefore, it can only be used if both endpoints have been upgraded to
        understand it. The TCP Client signals support for AccECN on the
        initial SYN of a connection, and the TCP Server signals whether it
        supports AccECN on the SYN/ACK. The TCP flags on the SYN that the TCP
        Client uses to signal AccECN support have been carefully chosen so
        that a TCP Server will interpret them as a request to support the most
        recent variant of ECN feedback that it supports. Then the TCP Client
        falls back to the same variant of ECN feedback.</t>
        <t indent="0" pn="section-2.1-2">An AccECN TCP Client does not send an AccECN Option on the SYN as
        SYN option space is limited. The TCP Server sends an AccECN Option on
        the SYN/ACK, and the TCP Client sends one on the first ACK to test
        whether the network path forwards these options correctly.</t>
      </section>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-2.2">
        <name slugifiedName="name-feedback-mechanism">Feedback Mechanism</name>
        <t indent="0" pn="section-2.2-1">A Data Receiver maintains four counters initialized at the start of
        the half-connection. Three count the number of arriving payload bytes
        marked CE, ECT(1), and ECT(0) in the IP-ECN field. These byte counters
        reflect only the TCP payload length, excluding the TCP header and TCP
        Options. The fourth counter counts the number of packets arriving
        marked with a CE codepoint (including control packets without payload
        if they are CE-marked).</t>
        <t indent="0" pn="section-2.2-2">The Data Sender maintains four equivalent counters for the half-connection, and the AccECN protocol is designed to ensure they will
        match the values in the Data Receiver's counters, albeit after a
        little delay.</t>
        <t indent="0" pn="section-2.2-3">Each ACK carries the three least significant bits (LSBs) of the
        packet-based CE counter using the ECN bits in the TCP header, now
        renamed the Accurate ECN (ACE) field (see <xref target="accecn_Fig_ACE_ACK" format="default" sectionFormat="of" derivedContent="Figure 3"/>). The 24 LSBs of some or all of
        the byte counters can be optionally carried in an AccECN Option. For
        efficient use of limited option space, two alternative forms of the AccECN
        Option are specified with the fields in the opposite order to each
        other.</t>
      </section>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-2.3">
        <name slugifiedName="name-delayed-acks-and-resilience">Delayed ACKs and Resilience Against ACK Loss</name>
        <t indent="0" pn="section-2.3-1">With both the ACE and the AccECN Option mechanisms, the Data
        Receiver continually repeats the current LSBs of each of its
        respective counters. There is no need to acknowledge these continually
        repeated counters, so the CWR mechanism of
        <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> is no longer used. Even if some ACKs are
        lost, the Data Sender ought to be able to infer how much to increment
        its own counters, even if the protocol field has wrapped.</t>
        <t indent="0" pn="section-2.3-2">The 3-bit ACE field can wrap fairly frequently. Therefore, even if
        it appears to have incremented by one (say), the field might have
        actually cycled completely and then incremented by one. The Data Receiver
        is not allowed to delay sending an ACK to such an extent that the ACE
        field would cycle. However, ACKs received at the Data Sender could
        still cycle because a whole sequence of ACKs carrying intervening
        values of the field might all be lost or delayed in transit.</t>
        <t indent="0" pn="section-2.3-3">The fields in an AccECN Option are larger, but they will increment
        in larger steps because they count bytes not packets. Nonetheless,
        their size has been chosen such that a whole cycle of the field would never occur between ACKs unless there had been an infeasibly long sequence of ACK losses.
Therefore, provided that an AccECN Option is
        available, it can be treated as a dependable feedback channel.</t>
        <t indent="0" pn="section-2.3-4">If an AccECN Option is not available, e.g., it is being
        stripped by a middlebox, the AccECN protocol will only feed back
        information on CE markings (using the ACE field). Although not ideal,
        this will be sufficient, because it is envisaged that neither ECT(0)
        nor ECT(1) will ever indicate more severe congestion than CE, even
        though future uses for ECT(0) or ECT(1) are still unclear <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>. Because the 3-bit ACE field is so small, when it
        is the only field available, the Data Sender has to interpret it
        assuming the most likely wrap, but with a degree of conservatism.</t>
        <t indent="0" pn="section-2.3-5">Certain specified events trigger the Data Receiver to include an
        AccECN Option on an ACK. The rules are designed to ensure that the
        order in which different markings arrive at the receiver is
        communicated to the sender (as long as options are reaching the sender
        and as long as there is no ACK loss). Implementations are encouraged
        to send an AccECN Option more frequently, but this is left up to the
        implementer.</t>
      </section>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-2.4">
        <name slugifiedName="name-feedback-metrics">Feedback Metrics</name>
        <t indent="0" pn="section-2.4-1">The CE packet counter in the ACE field and the CE byte counter in
        AccECN Options both provide feedback on received CE marks. The CE
        packet counter includes control packets that do not have payload data,
        while the CE byte counter solely includes marked payload bytes. If
        both are present, the byte counter in an AccECN Option will provide
        the more accurate information needed for modern congestion control and
        policing schemes, such as L4S, DCTCP, or ConEx. If AccECN Options are
        stripped, a simple algorithm to estimate the number of marked bytes
        from the ACE field is given in <xref target="accecn_Algo_ACE_Bytes" format="default" sectionFormat="of" derivedContent="Appendix A.3"/>.</t>
        <t indent="0" pn="section-2.4-2">The AccECN design has been generalized so that it ought to be able
        to support possible future uses of the experimental ECT(1) codepoint
        other than the L4S experiment <xref target="RFC9330" format="default" sectionFormat="of" derivedContent="RFC9330"/>, such as a
        lower severity or a more instant congestion signal than CE.</t>
        <t indent="0" pn="section-2.4-3">Feedback in bytes is provided to protect against the receiver or a
        middlebox using attacks similar to 'ACK-Division' to artificially
        inflate the congestion window, which is why <xref target="RFC5681" format="default" sectionFormat="of" derivedContent="RFC5681"/>
        now recommends that TCP counts acknowledge bytes not packets.</t>
      </section>
      <section anchor="accecn_demb_reflector" numbered="true" removeInRFC="false" toc="include" pn="section-2.5">
        <name slugifiedName="name-generic-mechanistic-reflect">Generic (Mechanistic) Reflector</name>
        <t indent="0" pn="section-2.5-1">The ACE field provides feedback about CE markings in the IP-ECN
        field of both data and control packets. According to <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, the Data Sender is meant to set the IP-ECN field of
        control packets to Not-ECT. However, mechanisms in certain private
        networks (e.g., data centres) set control packets to be ECN-capable because they are precisely the packets that performance
        depends on most.</t>
        <t indent="0" pn="section-2.5-2">For this reason, AccECN is designed to be a generic reflector of
        whatever ECN markings it sees, whether or not they are compliant with
        a current standard. Then as standards evolve, Data Senders can upgrade
        unilaterally without any need for receivers to upgrade too.</t>
        <t indent="0" pn="section-2.5-3">It is also useful to be able to rely on generic reflection
        behaviour when senders need to test for unexpected interference with
        markings (for instance Sections <xref target="accecn_sec_ecn-mangling" format="counter" sectionFormat="of" derivedContent="3.2.2.3"/>, <xref target="accecn_sec_ACE_init_invalid" format="counter" sectionFormat="of" derivedContent="3.2.2.4"/>, and <xref target="accecn_Mbox_Interference" format="counter" sectionFormat="of" derivedContent="3.2.3.2"/> of the present document and
        paragraph 2 of <xref target="RFC3168" sectionFormat="of" section="20.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-20.2" derivedContent="RFC3168"/>).</t>
        <t indent="0" pn="section-2.5-4">The initial SYN and SYN/ACK are the most critical control packets,
        so AccECN feeds back their IP-ECN fields. Although RFC 3168 prohibits
        ECN-capable SYNs and SYN/ACKs, providing feedback of ECN marking on
        the SYN and SYN/ACK supports future scenarios in which SYNs might be
        ECN-enabled (without prejudging whether they ought to be). For
        instance, <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> updates this aspect of RFC 3168 to
        allow experimentation with ECN-capable TCP control packets.</t>
        <t indent="0" pn="section-2.5-5">Even if the TCP Client (or Server) has set the SYN (or SYN/ACK) to
        Not-ECT in compliance with RFC 3168, feedback on the state of the
        IP-ECN field when it arrives at the receiver could still be useful,
        because middleboxes have been known to overwrite the IP-ECN field as
        if it is still part of the old Type of Service (ToS) field <xref target="Mandalari18" format="default" sectionFormat="of" derivedContent="Mandalari18"/>. For example, if a TCP Client has set the SYN
        to Not-ECT, but receives feedback that the IP-ECN field on the SYN
        arrived with a different codepoint, it can detect such middlebox
        interference. Previously, neither end knew what IP-ECN field the other
        sent. So, if a TCP Server received ECT or CE on a SYN, it could
        not know whether it was invalid because only the TCP Client knew
        whether it originally marked the SYN as Not-ECT (or ECT). Therefore,
        prior to AccECN, the Server's only safe course of action in this
        example was to disable ECN for the connection. Instead, the AccECN
        protocol allows the Server and Client to feed back the ECN field
        received on the SYN and SYN/ACK to their peer, which now has all the
        information to decide whether the connection has to fall back from
        supporting ECN (or not).</t>
      </section>
    </section>
    <section anchor="accecn_Spec" numbered="true" removeInRFC="false" toc="include" pn="section-3">
      <name slugifiedName="name-accecn-protocol-specificati">AccECN Protocol Specification</name>
      <section anchor="accecn_Negotiation" numbered="true" removeInRFC="false" toc="include" pn="section-3.1">
        <name slugifiedName="name-negotiating-to-use-accecn">Negotiating to Use AccECN</name>
        <section anchor="accecn_Negotiation_3WHS" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.1">
          <name slugifiedName="name-negotiation-during-the-tcp-">Negotiation During the TCP Three-Way Handshake</name>
          <t indent="0" pn="section-3.1.1-1">Given the ECN-nonce <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/> has been
          reclassified as Historic <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>, the TCP flag that
          was previously called NS (Nonce Sum) is renamed as the AE (Accurate
          ECN) flag (the TCP header flag at bit offset 7 in <xref target="accecn_Fig_TCPHdr_AE" format="default" sectionFormat="of" derivedContent="Figure 2"/>). See the IANA Considerations in
          <xref target="accecn_IANA_Considerations" format="default" sectionFormat="of" derivedContent="Section 7"/>.</t>
          <figure anchor="accecn_Fig_TCPHdr_AE" align="left" suppress-title="false" pn="figure-2">
            <name slugifiedName="name-the-new-definition-of-the-t">The New Definition of the TCP Header Flags During the TCP Three-Way Handshake</name>
            <artwork align="center" pn="section-3.1.1-2.1">
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|               |           | A | C | E | U | A | P | R | S | F |
| Header Length | Reserved  | E | W | C | R | C | S | S | Y | I |
|               |           |   | R | E | G | K | H | T | N | N |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
</artwork>
          </figure>
          <t indent="0" pn="section-3.1.1-3">During the TCP three-way handshake at the start of a connection, to request
          more Accurate ECN feedback the TCP Client (host A) <bcp14>MUST</bcp14> set the TCP
          flags (AE,CWR,ECE) = (1,1,1) in the initial SYN segment.</t>
          <t indent="0" pn="section-3.1.1-4">If a TCP Server (host B) that is AccECN-enabled receives a SYN with
          the above three flags set, it <bcp14>MUST</bcp14> set both its half-connections
          into AccECN mode. Then it <bcp14>MUST</bcp14> set the AE, CWR, and ECE TCP flags on
          the SYN/ACK to the combination in the top block of <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/> that feeds back the IP-ECN field
          that arrived on the SYN. This applies whether or not the Server
          itself supports setting the IP-ECN field on a SYN or SYN/ACK (see
          <xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/> for rationale).</t>
          <t indent="0" pn="section-3.1.1-5">When the TCP Server returns any of the four combinations in the top
          block of <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>, it confirms that
          it supports AccECN. The TCP Server <bcp14>MUST NOT</bcp14> set one of these four
          combinations of flags on the SYN/ACK unless the preceding SYN
          requested support for AccECN as above.</t>
          <t indent="0" pn="section-3.1.1-6">Once a TCP Client (A) has sent the above SYN to declare that it
          supports AccECN, and once it has received the above SYN/ACK segment
          that confirms that the TCP Server supports AccECN, the TCP Client
          <bcp14>MUST</bcp14> set both its half-connections into AccECN mode. The TCP Client
          <bcp14>MUST NOT</bcp14> enter AccECN mode (or any feedback mode) before it has
          received the first SYN/ACK.</t>
          <t indent="0" pn="section-3.1.1-7">Once in AccECN mode, a TCP Client or Server has the rights and obligations defined in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/> concerning use of ECN.</t>
          <t indent="0" pn="section-3.1.1-8">The procedures for retransmission of SYNs or SYN/ACKs
          are given in <xref target="accecn_sec_multiple_SYNs_or_SYN-ACKs" format="default" sectionFormat="of" derivedContent="Section 3.1.4"/>.</t>
          <t indent="0" pn="section-3.1.1-9">It is <bcp14>RECOMMENDED</bcp14> that the AccECN protocol be implemented
          alongside Selective Acknowledgement (SACK) <xref target="RFC2018" format="default" sectionFormat="of" derivedContent="RFC2018"/>.
          If SACK is implemented with AccECN, Duplicate Selective Acknowledgement
          (D-SACK) <xref target="RFC2883" format="default" sectionFormat="of" derivedContent="RFC2883"/> <bcp14>MUST</bcp14> also be implemented.</t>
        </section>
        <section anchor="accecn_sec_backward_compat" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.2">
          <name slugifiedName="name-backward-compatibility">Backward Compatibility</name>
          <t indent="0" pn="section-3.1.2-1">The TCP flags used to indicate AccECN support on the SYN were carefully chosen to enable natural fall-back to prior
          stages in the evolution of ECN. <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/> tabulates all the negotiation
          possibilities for ECN-related capabilities that involve at least one
          AccECN-capable host. The entries in the first two columns have been
          abbreviated, as follows: </t>
          <dl newline="false" spacing="normal" indent="4" pn="section-3.1.2-2">
            <dt pn="section-3.1.2-2.1">AccECN:</dt>
            <dd pn="section-3.1.2-2.2">Supports more Accurate ECN feedback (the
              present specification).</dd>
            <dt pn="section-3.1.2-2.3">Nonce:</dt>
            <dd pn="section-3.1.2-2.4">Supports ECN-nonce feedback <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>.</dd>
            <dt pn="section-3.1.2-2.5">ECN:</dt>
            <dd pn="section-3.1.2-2.6">Supports 'Classic' ECN feedback <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</dd>
            <dt pn="section-3.1.2-2.7">No ECN:</dt>
            <dd pn="section-3.1.2-2.8">Not ECN-capable. Implicit congestion
              notification using packet drop.</dd>
          </dl>
          <table align="center" anchor="accecn_Tab_Negotiation" pn="table-2">
            <name slugifiedName="name-ecn-capability-negotiation-">ECN Capability Negotiation Between Client (A) and Server
            (B)</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Host A</th>
                <th align="left" colspan="1" rowspan="1">Host B</th>
                <th align="center" colspan="1" rowspan="1">SYN<br/>A-&gt;B<br/>AE CWR ECE</th>
                <th align="center" colspan="1" rowspan="1">SYN/ACK<br/>B-&gt;A<br/>AE CWR ECE</th>
                <th align="left" colspan="1" rowspan="1">Feedback Mode<br/>of Host A</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">AccECN<br/>AccECN<br/>AccECN<br/>AccECN</td>
                <td align="left" colspan="1" rowspan="1">AccECN<br/>AccECN<br/>AccECN<br/>AccECN</td>
                <td align="center" colspan="1" rowspan="1">1   1   1<br/>1   1  
                1<br/>1   1   1<br/>1   1   1</td>
                <td align="center" colspan="1" rowspan="1">0   1   0<br/>0   1  
                1<br/>1   0   0<br/>1   1   0</td>
                <td align="left" colspan="1" rowspan="1">AccECN (Not-ECT SYN)<br/>AccECN (ECT1 on
                SYN)<br/>AccECN (ECT0 on SYN)<br/>AccECN (CE on SYN)</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">AccECN<br/>AccECN<br/>AccECN</td>
                <td align="left" colspan="1" rowspan="1">Nonce<br/>ECN<br/>No ECN</td>
                <td align="center" colspan="1" rowspan="1">1   1   1<br/>1   1  
                1<br/>1   1   1</td>
                <td align="center" colspan="1" rowspan="1">1   0   1<br/>0   0  
                1<br/>0   0   0</td>
                <td align="left" colspan="1" rowspan="1">(Reserved)<br/>Classic ECN<br/>Not ECN</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">Nonce<br/>ECN<br/>No ECN</td>
                <td align="left" colspan="1" rowspan="1">AccECN<br/>AccECN<br/>AccECN</td>
                <td align="center" colspan="1" rowspan="1">0   1   1<br/>0   1  
                1<br/>0   0   0</td>
                <td align="center" colspan="1" rowspan="1">0   0   1<br/>0   0  
                1<br/>0   0   0</td>
                <td align="left" colspan="1" rowspan="1">Classic ECN<br/>Classic ECN<br/>Not ECN</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="center" colspan="1" rowspan="1"/>
                <td align="left" colspan="1" rowspan="1"/>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">AccECN</td>
                <td align="left" colspan="1" rowspan="1">Broken</td>
                <td align="center" colspan="1" rowspan="1">1   1   1</td>
                <td align="center" colspan="1" rowspan="1">1   1   1</td>
                <td align="left" colspan="1" rowspan="1">Not ECN</td>
              </tr>
            </tbody>
          </table>
          <t indent="0" pn="section-3.1.2-4"><xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/> is divided into blocks, with 
          each block separated by an empty row.</t>
          <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-3.1.2-5"><li pn="section-3.1.2-5.1" derivedCounter="1.">
              <t indent="0" pn="section-3.1.2-5.1.1">The top block shows the case already described in <xref target="accecn_Negotiation" format="default" sectionFormat="of" derivedContent="Section 3.1"/> where both endpoints support
              AccECN and how the TCP Server (B) indicates congestion
              feedback.</t>
            </li>
            <li pn="section-3.1.2-5.2" derivedCounter="2.">
              <t indent="0" pn="section-3.1.2-5.2.1">The second block shows the cases where the TCP Client (A)
              supports AccECN but the TCP Server (B) supports some earlier
              variant of TCP feedback, as indicated in its SYN/ACK. Therefore, as
              soon as an AccECN-capable TCP Client (A) receives the SYN/ACK
              shown, it <bcp14>MUST</bcp14> set both its half-connections into the feedback
              mode shown in the rightmost column. If the TCP Client has set
              itself into Classic ECN feedback mode, it <bcp14>MUST</bcp14> comply with
              <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</t>
              <t indent="0" pn="section-3.1.2-5.2.2">An AccECN
              implementation has no need to recognize or support the Server
              response labelled 'Nonce' or ECN-nonce feedback more generally
              <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>, as RFC 3540 has been reclassified as
              Historic <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>. AccECN is compatible with
              alternative ECN feedback integrity approaches to the nonce (see
              <xref target="accecn_Integrity" format="default" sectionFormat="of" derivedContent="Section 5.3"/>). The SYN/ACK labelled 'Nonce'
              with (AE,CWR,ECE) = (1,0,1) is reserved for future use. A TCP
              Client (A) that receives such a SYN/ACK follows the procedure
              for forward compatibility given in <xref target="accecn_sec_forward_compat" format="default" sectionFormat="of" derivedContent="Section 3.1.3"/>.</t>
            </li>
            <li pn="section-3.1.2-5.3" derivedCounter="3.">
              <t indent="0" pn="section-3.1.2-5.3.1">The third block shows the cases where the TCP Server (B)
              supports AccECN but the TCP Client (A) supports some earlier
              variant of TCP feedback, as indicated in its SYN.</t>
              <t indent="0" pn="section-3.1.2-5.3.2">When an AccECN-enabled TCP Server (B) receives a
              SYN with (AE,CWR,ECE) = (0,1,1), it <bcp14>MUST</bcp14> do one of the
              following:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.2-5.3.3">
                <li pn="section-3.1.2-5.3.3.1">
                  <t indent="0" pn="section-3.1.2-5.3.3.1.1">set both its half-connections into the Classic ECN
                  feedback mode and return a SYN/ACK with (AE,CWR,ECE) =
                  (0,0,1) as shown. Then it <bcp14>MUST</bcp14> comply with <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</t>
                </li>
                <li pn="section-3.1.2-5.3.3.2">
                  <t indent="0" pn="section-3.1.2-5.3.3.2.1">set both its half-connections into Not ECN mode and
                  return a SYN/ACK with (AE,CWR,ECE) = (0,0,0), then continue
                  with ECN disabled. This latter case is unlikely to be
                  desirable, but it is allowed as a possibility, e.g., for
                  minimal TCP implementations.</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.1.2-5.3.4">When an AccECN-enabled TCP Server (B) receives a SYN
              with (AE,CWR,ECE) = (0,0,0), it <bcp14>MUST</bcp14> set both its half-connections into the Not ECN feedback mode, return a SYN/ACK
              with (AE,CWR,ECE) = (0,0,0) as shown, and continue with ECN
              disabled.</t>
            </li>
            <li pn="section-3.1.2-5.4" derivedCounter="4.">
              <t indent="0" pn="section-3.1.2-5.4.1">The fourth block displays a combination labelled 'Broken'.
              Some older TCP Server implementations incorrectly set the
              TCP-ECN flags in the SYN/ACK by reflecting those in the SYN.
              Such broken TCP Servers (B) cannot support ECN; so as soon as an
              AccECN-capable TCP Client (A) receives such a broken SYN/ACK, it
              <bcp14>MUST</bcp14> fall back to Not ECN mode for both its half-connections and
              continue with ECN disabled.</t>
            </li>
          </ol>
          <t indent="0" pn="section-3.1.2-6">The following additional rules do not fit the structure of the
          table, but they complement it:</t>
          <dl newline="false" spacing="normal" indent="3" pn="section-3.1.2-7">
            <dt pn="section-3.1.2-7.1">Simultaneous Open:</dt>
            <dd pn="section-3.1.2-7.2">An originating AccECN Host (A),
              having sent a SYN with (AE,CWR,ECE) = (1,1,1), might receive
              another SYN from host B. Host A <bcp14>MUST</bcp14> then enter the same
              feedback mode as it would have entered had it been a responding
              host and received the same SYN. Then host A <bcp14>MUST</bcp14> send the same
              SYN/ACK as it would have sent had it been a responding host.</dd>
            <dt pn="section-3.1.2-7.3">In-window SYN during TIME-WAIT:</dt>
            <dd pn="section-3.1.2-7.4">Many TCP
              implementations create a new TCP connection if they receive an
              in-window SYN packet during TIME-WAIT state. When a TCP host
              enters TIME-WAIT or CLOSED state, it ought to ignore any
              previous state about the negotiation of AccECN for that
              connection and renegotiate the feedback mode according to <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>.</dd>
          </dl>
        </section>
        <section anchor="accecn_sec_forward_compat" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.3">
          <name slugifiedName="name-forward-compatibility">Forward Compatibility</name>
          <t indent="0" pn="section-3.1.3-1">If a TCP Server that implements AccECN receives a SYN with the
          three TCP header flags (AE,CWR,ECE) set to any combination other
          than (0,0,0), (0,1,1), or (1,1,1) and it does not have logic specific
          to such a combination, the Server <bcp14>MUST</bcp14> negotiate the use of AccECN
          as if the three flags had been set to (1,1,1). However, an AccECN
          Client implementation <bcp14>MUST NOT</bcp14> send a SYN with any combination other
          than the three listed.</t>
          <t indent="0" pn="section-3.1.3-2">If a TCP Client sent a SYN requesting AccECN feedback with
          (AE,CWR,ECE) = (1,1,1) and then receives a SYN/ACK with the currently
          reserved combination (AE,CWR,ECE) = (1,0,1) but it does not have
          logic specific to such a combination, the Client <bcp14>MUST</bcp14> enable AccECN
          mode as if the SYN/ACK confirmed that the Server supported AccECN
          and as if it fed back that the IP-ECN field on the SYN had arrived
          unchanged. However, an AccECN Server implementation <bcp14>MUST NOT</bcp14> send a
          SYN/ACK with this combination (AE,CWR,ECE) = (1,0,1).</t>
          <aside pn="section-3.1.3-3">
            <t indent="0" pn="section-3.1.3-3.1">For the avoidance of doubt, the behaviour described in the
            present specification applies whether or not the three remaining
            reserved TCP header flags are zero.</t>
          </aside>
          <t indent="0" pn="section-3.1.3-4">All of these requirements ensure that future uses of 
all the Reserved combinations of all the TCP header bits on a SYN or SYN/ACK
(see <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>) can rely on consistent
          behaviour from the installed base of AccECN implementations. See
          <xref target="accecn_space_evolution" format="default" sectionFormat="of" derivedContent="Appendix B.3"/> for related discussion.</t>
        </section>
        <section anchor="accecn_sec_multiple_SYNs_or_SYN-ACKs" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.4">
          <name slugifiedName="name-multiple-syns-or-syn-acks">Multiple SYNs or SYN/ACKs</name>
          <section anchor="accecn_sec_SYN_rexmt" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.4.1">
            <name slugifiedName="name-retransmitted-syns">Retransmitted SYNs</name>
            <t indent="0" pn="section-3.1.4.1-1">If the sender of an AccECN SYN (the TCP Client) times out
            before receiving the SYN/ACK, it <bcp14>SHOULD</bcp14> attempt to negotiate the
            use of AccECN at least one more time by continuing to set all
            three TCP-ECN flags (AE,CWR,ECE) = (1,1,1) on the first
            retransmitted SYN (using the usual retransmission timeouts). If
            this first retransmission also fails to be acknowledged, in
            deployment scenarios where AccECN path traversal might be
            problematic, the TCP Client <bcp14>SHOULD</bcp14> send subsequent retransmissions
            of the SYN with the three TCP-ECN flags cleared (AE,CWR,ECE) =
            (0,0,0). Such a retransmitted SYN <bcp14>MUST</bcp14> use the same initial
            sequence number (ISN) as the original SYN.</t>
            <t indent="0" pn="section-3.1.4.1-2">Retrying once before fall-back adds delay in the case where a
            middlebox drops an AccECN (or ECN) SYN deliberately. However,
            recent measurements <xref target="Mandalari18" format="default" sectionFormat="of" derivedContent="Mandalari18"/> imply that a drop
            is less likely to be due to middlebox interference than other
            intermittent causes of loss, e.g., congestion, wireless
            transmission loss, etc.</t>
            <t indent="0" pn="section-3.1.4.1-3">Implementers <bcp14>MAY</bcp14> use other fall-back strategies if they are
            found to be more effective, e.g., attempting to negotiate
            AccECN on the SYN only once or more than twice (most appropriate
            during high levels of congestion).</t>
            <t indent="0" pn="section-3.1.4.1-4">Further it might make sense to also remove any other new or
            experimental fields or options on the SYN in case a middlebox
            might be blocking them, although the required behaviour will
            depend on the specification of the other option(s) and any attempt
            to coordinate fall-back between different modules of the stack. For instance,
if taking part in an <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> experiment that allows ECT on a SYN,
it would be advisable to have a fall-back strategy that tries use of AccECN without setting ECT on the SYN.
</t>
            <t indent="0" pn="section-3.1.4.1-5">Whichever fall-back strategy is used, the TCP initiator <bcp14>SHOULD</bcp14>
            cache failed connection attempts. If it does, it <bcp14>SHOULD NOT</bcp14> give
            up attempting to negotiate AccECN on the SYN of subsequent
            connection attempts until it is clear that the blockage is
            persistently and specifically due to AccECN. The cache needs to be
            arranged to expire so that the initiator will infrequently attempt
            to check whether the problem has been resolved.</t>
            <t indent="0" pn="section-3.1.4.1-6">All fall-back strategies will need to follow all the normative
            rules in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>, which
            concern behaviour when SYNs or SYN/ACKs negotiating different
            types of feedback have been sent within the same connection,
            including the possibility that they arrive out of order. As
            examples, the following non-normative bullets call out those rules
            from <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/> that apply
            to the above fall-back strategies:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.4.1-7">
              <li pn="section-3.1.4.1-7.1">
                <t indent="0" pn="section-3.1.4.1-7.1.1">Once the TCP Client has sent SYNs with (AE,CWR,ECE) =
                (1,1,1) and with (AE,CWR,ECE) = (0,0,0), it might eventually
                receive a SYN/ACK from the Server in response to one, the
                other, or both, and possibly reordered.</t>
              </li>
              <li pn="section-3.1.4.1-7.2">
                <t indent="0" pn="section-3.1.4.1-7.2.1">Such a TCP Client enters the feedback mode appropriate to
                the first SYN/ACK it receives according to <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>, and it does not switch to a
                different mode, whatever other SYN/ACKs it might receive or
                send.</t>
              </li>
              <li pn="section-3.1.4.1-7.3">
                <t indent="0" pn="section-3.1.4.1-7.3.1">If a TCP Client has entered AccECN mode but then
                subsequently sends a SYN or receives a SYN/ACK with
                (AE,CWR,ECE) = (0,0,0), it is still allowed to set ECT on
                packets for the rest of the connection. Note that this rule is
                different from that of a Server in an equivalent position (<xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/> explains).</t>
              </li>
              <li pn="section-3.1.4.1-7.4">
                <t indent="0" pn="section-3.1.4.1-7.4.1">Having entered AccECN mode, in general a TCP Client commits
                to respond to any incoming congestion feedback, whether or not
                it sets ECT on outgoing packets (for rationale and some
                exceptions see <xref target="accecn_sec_ecn-mangling" format="default" sectionFormat="of" derivedContent="Section 3.2.2.3"/>, <xref target="accecn_sec_ACE_init_invalid" format="default" sectionFormat="of" derivedContent="Section 3.2.2.4"/>).</t>
              </li>
              <li pn="section-3.1.4.1-7.5">
                <t indent="0" pn="section-3.1.4.1-7.5.1">Having entered AccECN mode, a TCP Client commits to using
                AccECN to feed back the IP-ECN field in incoming packets for
                the rest of the connection, as specified in <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/>, even if it is not itself setting
                ECT on outgoing packets.</t>
              </li>
            </ul>
          </section>
          <section anchor="accecn_sec_SYN-ACK_rexmt" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.4.2">
            <name slugifiedName="name-retransmitted-syn-acks">Retransmitted SYN/ACKs</name>
            <t indent="0" pn="section-3.1.4.2-1">A TCP Server might send multiple SYN/ACKs indicating different
            feedback modes. For instance, when falling back to sending a
            SYN/ACK with (AE,CWR,ECE) = (0,0,0) after previous AccECN SYN/ACKs
            have timed out (<xref target="accecn_AccECN_Option_Loss" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2.2"/>); or to
            acknowledge different retransmissions of the SYN (<xref target="accecn_sec_SYN_rexmt" format="default" sectionFormat="of" derivedContent="Section 3.1.4.1"/>).</t>
            <t indent="0" pn="section-3.1.4.2-2">All fall-back strategies will need to follow all the normative
            rules in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>, which
            concern behaviour when SYNs or SYN/ACKs negotiating different
            types of feedback are sent within the same connection, including
            the possibility that they arrive out of order. As examples, the
            following non-normative bullets call out those rules from <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/> that apply to the above
            fall-back strategies:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.4.2-3">
              <li pn="section-3.1.4.2-3.1">
                <t indent="0" pn="section-3.1.4.2-3.1.1">An AccECN-capable TCP Server enters the feedback mode
                appropriate to the first SYN it receives using <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>, and it does not switch to a
                different mode, whatever other SYNs it might receive and
                whatever SYN/ACKs it might send.</t>
              </li>
              <li pn="section-3.1.4.2-3.2">
                <t indent="0" pn="section-3.1.4.2-3.2.1">If a TCP Server in AccECN mode receives a SYN with
                (AE,CWR,ECE) = (0,0,0), it preferably acknowledges it first
                using an AccECN SYN/ACK, but it can retry using a SYN/ACK with
                (AE,CWR,ECE) = (0,0,0).</t>
              </li>
              <li pn="section-3.1.4.2-3.3">
                <t indent="0" pn="section-3.1.4.2-3.3.1">If a TCP Server in AccECN mode sends multiple AccECN
                SYN/ACKs, it uses the TCP-ECN flags in each SYN/ACK to feed
                back the IP-ECN field on the latest SYN to have arrived.</t>
              </li>
              <li pn="section-3.1.4.2-3.4">
                <t indent="0" pn="section-3.1.4.2-3.4.1">If a TCP Server enters AccECN mode and then subsequently sends
                a SYN/ACK or receives a SYN with (AE,CWR,ECE) = (0,0,0), it is
                prohibited from setting ECT on any packet for the rest of the
                connection.</t>
              </li>
              <li pn="section-3.1.4.2-3.5">
                <t indent="0" pn="section-3.1.4.2-3.5.1">Having entered AccECN mode, in general a TCP Server commits
                to respond to any incoming congestion feedback, whether or not
                it sets ECT on outgoing packets (for rationale and some
                exceptions see Sections <xref target="accecn_sec_ecn-mangling" format="counter" sectionFormat="of" derivedContent="3.2.2.3"/>, <xref target="accecn_sec_ACE_init_invalid" format="counter" sectionFormat="of" derivedContent="3.2.2.4"/>).</t>
              </li>
              <li pn="section-3.1.4.2-3.6">
                <t indent="0" pn="section-3.1.4.2-3.6.1">Having entered AccECN mode, a TCP Server commits to using
                AccECN to feed back the IP-ECN field in incoming packets for
                the rest of the connection, as specified in <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/>, even if it is not itself setting
                ECT on outgoing packets.</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="accecn_implications_accecn_mode" numbered="true" removeInRFC="false" toc="include" pn="section-3.1.5">
          <name slugifiedName="name-implications-of-accecn-mode">Implications of AccECN Mode</name>
          <t indent="0" pn="section-3.1.5-1"><xref target="accecn_Negotiation_3WHS" format="default" sectionFormat="of" derivedContent="Section 3.1.1"/> describes the only ways
          that a host can enter AccECN mode, whether as a Client or as a
          Server.</t>
          <t indent="0" pn="section-3.1.5-2">An implementation that supports AccECN has the rights and
          obligations concerning the use of ECN defined below, which update
          those in <xref target="RFC3168" sectionFormat="of" section="6.1.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.1" derivedContent="RFC3168"/>. This section
          uses the following definitions:</t>
          <ul empty="true" bare="false" indent="3" spacing="normal" pn="section-3.1.5-3">
            <li pn="section-3.1.5-3.1">
              <dl newline="false" spacing="normal" indent="3" pn="section-3.1.5-3.1.1">
                <dt pn="section-3.1.5-3.1.1.1">'During the handshake':</dt>
                <dd pn="section-3.1.5-3.1.1.2">The connection states
              prior to synchronization.</dd>
                <dt pn="section-3.1.5-3.1.1.3">'Valid SYN':</dt>
                <dd pn="section-3.1.5-3.1.1.4">A SYN that has the same port numbers
              and the same ISN as the SYN that first caused the Server to open
              the connection. An 'Acceptable' packet is defined in <xref target="accecn_Terminology" format="default" sectionFormat="of" derivedContent="Section 1.3"/>.</dd>
              </dl>
            </li>
          </ul>
          <t indent="0" pn="section-3.1.5-4">Handling SYNs or SYN/ACKs of multiple types
          (e.g., fall-back): </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-5">
            <li pn="section-3.1.5-5.1">
              <t indent="0" pn="section-3.1.5-5.1.1">Any implementation that supports AccECN:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-5.1.2">
                <li pn="section-3.1.5-5.1.2.1">
                  <t indent="0" pn="section-3.1.5-5.1.2.1.1"><bcp14>MUST NOT</bcp14> switch into a different feedback mode from the one
                  it first entered according to <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>, no matter whether it
                  subsequently receives valid SYNs or Acceptable SYN/ACKs of
                  different types;</t>
                </li>
                <li pn="section-3.1.5-5.1.2.2">
                  <t indent="0" pn="section-3.1.5-5.1.2.2.1"><bcp14>SHOULD</bcp14> ignore the TCP-ECN flags in SYNs or SYN/ACKs that
                  are received after the implementation reaches the
                  ESTABLISHED state, in line with the general TCP approach
                  <xref target="RFC9293" format="default" sectionFormat="of" derivedContent="RFC9293"/>;</t>
                  <t indent="0" pn="section-3.1.5-5.1.2.2.2">Reason:
                  Reaching ESTABLISHED state implies that at least one SYN and
                  one SYN/ACK have successfully been delivered. And all the
                  rules for handshake fall-back are designed to work based on
                  those packets that successfully traverse the path, whatever
                  other handshake packets are lost or delayed.</t>
                </li>
                <li pn="section-3.1.5-5.1.2.3">
                  <t indent="0" pn="section-3.1.5-5.1.2.3.1"><bcp14>MUST NOT</bcp14> send a 'Classic' ECN-setup SYN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> with (AE,CWR,ECE) = (0,1,1) and a SYN
                  with (AE,CWR,ECE) = (1,1,1) requesting AccECN feedback
                  within the same connection;</t>
                </li>
                <li pn="section-3.1.5-5.1.2.4">
                  <t indent="0" pn="section-3.1.5-5.1.2.4.1"><bcp14>MUST NOT</bcp14> send a 'Classic' ECN-setup SYN/ACK <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> with (AE,CWR,ECE) = (0,0,1) and a SYN/ACK
                  agreeing to use AccECN feedback within the same
                  connection;</t>
                </li>
                <li pn="section-3.1.5-5.1.2.5">
                  <t indent="0" pn="section-3.1.5-5.1.2.5.1"><bcp14>MUST</bcp14> reset the connection with a RST packet, if it
                  receives a 'Classic' ECN-setup SYN with (AE,CWR,ECE) =
                  (0,1,1) and a SYN requesting AccECN feedback during the same
                  handshake;</t>
                </li>
                <li pn="section-3.1.5-5.1.2.6">
                  <t indent="0" pn="section-3.1.5-5.1.2.6.1"><bcp14>MUST</bcp14> reset the connection with a RST packet, if it
                  receives 'Classic' ECN-setup SYN/ACK with (AE,CWR,ECE) =
                  (0,0,1) and a SYN/ACK agreeing to use AccECN feedback during
                  the same handshake.</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.1.5-5.1.3">The last four rules are necessary because, if one peer
              were to negotiate the feedback mode in two different types of
              handshake, it would not be possible for the other peer to know
              for certain which handshake packet(s) the other end had
              eventually received or in which order it received them. So, in
              the absence of these rules, the two peers could end up using
              different ECN feedback modes without knowing it.</t>
            </li>
            <li pn="section-3.1.5-5.2">
              <t indent="0" pn="section-3.1.5-5.2.1">A host in AccECN mode that is feeding back the IP-ECN field
              on a SYN or SYN/ACK:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-5.2.2">
                <li pn="section-3.1.5-5.2.2.1">
                  <t indent="0" pn="section-3.1.5-5.2.2.1.1"><bcp14>MUST</bcp14> feed back the IP-ECN field on the latest valid SYN
                  or acceptable SYN/ACK to arrive.</t>
                </li>
              </ul>
            </li>
            <li pn="section-3.1.5-5.3">
              <t indent="0" pn="section-3.1.5-5.3.1">A TCP Server already in AccECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-5.3.2">
                <li pn="section-3.1.5-5.3.2.1">
                  <t indent="0" pn="section-3.1.5-5.3.2.1.1"><bcp14>SHOULD</bcp14> acknowledge a valid SYN arriving with (AE,CWR,ECE)
                  = (0,0,0) by emitting an AccECN SYN/ACK (with the
                  appropriate combination of TCP-ECN flags to feed back the
                  IP-ECN field of this latest SYN);</t>
                </li>
                <li pn="section-3.1.5-5.3.2.2">
                  <t indent="0" pn="section-3.1.5-5.3.2.2.1"><bcp14>MAY</bcp14> acknowledge a valid SYN arriving with (AE,CWR,ECE) =
                  (0,0,0) by sending a SYN/ACK with (AE,CWR,ECE) =
                  (0,0,0).</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.1.5-5.3.3">Rationale: When a SYN arrives with (AE,CWR,ECE) =
              (0,0,0) at a TCP Server that is already in AccECN mode, it
              implies that the TCP Client had probably not received the
              previous AccECN SYN/ACK emitted by the TCP Server. Therefore,
              the first bullet recommends attempting at least one more AccECN
              SYN/ACK. Nonetheless, the second bullet recognizes that the
              Server might eventually need to fall back to a non-ECN SYN/ACK.
              In either case, the TCP Server remains in AccECN feedback mode
              (according to the earlier requirement not to switch modes).</t>
            </li>
            <li pn="section-3.1.5-5.4">
              <t indent="0" pn="section-3.1.5-5.4.1">An AccECN-capable TCP Server already in Not ECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-5.4.2">
                <li pn="section-3.1.5-5.4.2.1">
                  <t indent="0" pn="section-3.1.5-5.4.2.1.1"><bcp14>SHOULD</bcp14> respond to any subsequent valid SYN using a
                  SYN/ACK with (AE,CWR,ECE) = (0,0,0), even if the SYN is
                  offering to negotiate Classic ECN or AccECN feedback
                  mode.</t>
                  <t indent="0" pn="section-3.1.5-5.4.2.1.2">Rationale: There would be no
                  point in the Server offering any type of ECN feedback,
                  because the Client will not be using ECN. However, there is
                  no interoperability reason to make this rule mandatory.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t indent="0" pn="section-3.1.5-6">If for any reason a host is not willing to provide ECN
          feedback on a particular TCP connection, it <bcp14>SHOULD</bcp14> clear the AE, CWR,
          and ECE flags in all SYN and/or SYN/ACK packets that it sends.</t>
          <t indent="0" pn="section-3.1.5-7">Sending ECT:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-8">
            <li pn="section-3.1.5-8.1">
              <t indent="0" pn="section-3.1.5-8.1.1">Any implementation that supports AccECN:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-8.1.2">
                <li pn="section-3.1.5-8.1.2.1">
                  <t indent="0" pn="section-3.1.5-8.1.2.1.1"><bcp14>MUST NOT</bcp14> set ECT if it is in Not ECN feedback mode.</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.1.5-8.1.3">A Data Sender in AccECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-8.1.4">
                <li pn="section-3.1.5-8.1.4.1">
                  <t indent="0" pn="section-3.1.5-8.1.4.1.1"><bcp14>SHOULD</bcp14> set an ECT codepoint in the IP header of packets to
                  indicate to the network that the transport is capable and
                  willing to participate in ECN for this packet;</t>
                </li>
                <li pn="section-3.1.5-8.1.4.2">
                  <t indent="0" pn="section-3.1.5-8.1.4.2.1"><bcp14>MAY</bcp14> not set ECT on any packet (for instance if
                  it has reason to believe such a packet would be
                  blocked).</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.1.5-8.1.5">A TCP Server in AccECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-8.1.6">
                <li pn="section-3.1.5-8.1.6.1">
                  <t indent="0" pn="section-3.1.5-8.1.6.1.1"><bcp14>MUST NOT</bcp14> set ECT on any packet for the rest of the
                  connection, if it has received or sent at least one valid
                  SYN or Acceptable SYN/ACK with (AE,CWR,ECE) = (0,0,0) during
                  the handshake.</t>
                  <t indent="0" pn="section-3.1.5-8.1.6.1.2">This rule solely
                  applies to a Server because, when a Server enters AccECN
                  mode, it doesn't know for sure whether the Client will end up
                  in AccECN mode. But when a Client enters AccECN mode, it can
                  be certain that the Server is already in AccECN feedback
                  mode.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t indent="0" pn="section-3.1.5-9">Congestion response:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-10">
            <li pn="section-3.1.5-10.1">
              <t indent="0" pn="section-3.1.5-10.1.1">A host in AccECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-10.1.2">
                <li pn="section-3.1.5-10.1.2.1">
                  <t indent="0" pn="section-3.1.5-10.1.2.1.1">is obliged to respond appropriately to AccECN feedback
                  that indicates there were ECN marks on packets it had
                  previously sent, where 'appropriately' is defined in <xref target="RFC3168" sectionFormat="of" section="6.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1" derivedContent="RFC3168"/> and
                  updated by Sections <xref target="RFC8311" sectionFormat="bare" section="2.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8311#section-2.1" derivedContent="RFC8311"/> and <xref target="RFC8311" sectionFormat="bare" section="4.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8311#section-4.1" derivedContent="RFC8311"/> of
                  <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>;</t>
                </li>
                <li pn="section-3.1.5-10.1.2.2">
                  <t indent="0" pn="section-3.1.5-10.1.2.2.1">is still obliged to respond appropriately to congestion
                  feedback, even when it is solely sending non-ECN-capable
                  packets (for rationale, some examples and some exceptions
                  see Sections <xref target="accecn_sec_ecn-mangling" format="counter" sectionFormat="of" derivedContent="3.2.2.3"/> and <xref target="accecn_sec_ACE_init_invalid" format="counter" sectionFormat="of" derivedContent="3.2.2.4"/>);</t>
                </li>
                <li pn="section-3.1.5-10.1.2.3">
                  <t indent="0" pn="section-3.1.5-10.1.2.3.1">is still obliged to respond appropriately to congestion
                  feedback, even if it has sent or received a SYN or SYN/ACK
                  packet with (AE,CWR,ECE) = (0,0,0) during the handshake;</t>
                </li>
                <li pn="section-3.1.5-10.1.2.4">
                  <t indent="0" pn="section-3.1.5-10.1.2.4.1"><bcp14>MUST NOT</bcp14> set CWR to indicate that it has received and
                  responded to indications of congestion.</t>
                  <t indent="0" pn="section-3.1.5-10.1.2.4.2">For the avoidance of doubt, this is unlike
                  an RFC 3168 data sender and this does not preclude the Data
                  Sender from setting the bits of the ACE counter field, which
                  includes an overloaded use of the same bit.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t indent="0" pn="section-3.1.5-11">Receiving ECT:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-12">
            <li pn="section-3.1.5-12.1">
              <t indent="0" pn="section-3.1.5-12.1.1">A host in AccECN mode:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.1.5-12.1.2">
                <li pn="section-3.1.5-12.1.2.1">
                  <t indent="0" pn="section-3.1.5-12.1.2.1.1"><bcp14>MUST</bcp14> feed back the information in the IP-ECN field of
                  incoming packets using Accurate ECN feedback, as specified
                  in <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/>.</t>
                  <t indent="0" pn="section-3.1.5-12.1.2.1.2">For the avoidance of doubt, this requirement
                  stands even if the AccECN host has also sent or received a
                  SYN or SYN/ACK with (AE,CWR,ECE) = (0,0,0). Reason: Such a
                  SYN or SYN/ACK implies some form of packet mangling might be
                  present. Even if the remote peer is not setting ECT, it
                  could still be set erroneously by packet mangling at the IP
                  layer (see <xref target="accecn_sec_ecn-mangling" format="default" sectionFormat="of" derivedContent="Section 3.2.2.3"/>). In
                  such cases, the Data Sender is best placed to decide whether
                  ECN markings are valid, but it can only do that if the Data
                  Receiver mechanistically feeds back any ECN markings. This
                  approach will not lead to TCP Options being generated
                  unnecessarily if the recommended simple scheme in <xref target="accecn_option_usage" format="default" sectionFormat="of" derivedContent="Section 3.2.3.3"/> is used, because no byte
                  counters will change if no packets are set to ECT.</t>
                </li>
                <li pn="section-3.1.5-12.1.2.2">
                  <t indent="0" pn="section-3.1.5-12.1.2.2.1"><bcp14>MUST NOT</bcp14> use reception of packets with ECT set in the
                  IP-ECN field as an implicit signal that the peer is
                  ECN-capable.</t>
                  <t indent="0" pn="section-3.1.5-12.1.2.2.2">Reason: ECT at the IP
                  layer does not explicitly confirm the peer has the correct
                  ECN feedback logic, because the packets could have been
                  mangled at the IP layer.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="accecn_feedback" numbered="true" removeInRFC="false" toc="include" pn="section-3.2">
        <name slugifiedName="name-accecn-feedback">AccECN Feedback</name>
        <t indent="0" pn="section-3.2-1">Each Data Receiver of each half-connection maintains four counters,
        r.cep, r.ceb, r.e0b, and r.e1b:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2-2">
          <li pn="section-3.2-2.1">
            <t indent="0" pn="section-3.2-2.1.1">The Data Receiver <bcp14>MUST</bcp14> increment the CE packet counter (r.cep),
            for every Acceptable packet that it receives with the CE code
            point in the IP-ECN field, including CE-marked control packets and retransmissions but
            excluding CE on SYN packets (SYN=1; ACK=0).</t>
          </li>
          <li pn="section-3.2-2.2">
            <t indent="0" pn="section-3.2-2.2.1">A Data Receiver that supports sending of AccECN TCP Options
            <bcp14>MUST</bcp14> increment the r.ceb, r.e0b, or r.e1b byte counters by the
            number of TCP payload octets in Acceptable packets marked with the
            CE, ECT(0), and ECT(1) codepoint in their IP-ECN field, including
            any payload octets on control packets and retransmissions, but not including any
            payload octets on SYN packets (SYN=1; ACK=0).</t>
          </li>
        </ul>
        <t indent="0" pn="section-3.2-3">Each Data Sender of each half-connection maintains four counters,
        s.cep, s.ceb, s.e0b, and s.e1b, intended to track the equivalent
        counters at the Data Receiver.</t>
        <t indent="0" pn="section-3.2-4">A Data Receiver feeds back the CE packet counter using the Accurate
        ECN (ACE) field, as explained in <xref target="accecn_ACE" format="default" sectionFormat="of" derivedContent="Section 3.2.2"/>. And it
        optionally feeds back all the byte counters using the AccECN TCP
        Option, as specified in <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>.</t>
        <t indent="0" pn="section-3.2-5">Whenever a Data Receiver feeds back the value of any counter, it
        <bcp14>MUST</bcp14> report the most recent value, no matter whether it is in a pure
        ACK, or an ACK piggybacked on a packet used by the other
        half-connection, whether a new payload data or a retransmission.
        Therefore, the feedback piggybacked on a retransmitted packet is
        unlikely to be the same as the feedback on the original packet.</t>
        <section anchor="accecn_init_counters" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.1">
          <name slugifiedName="name-initialization-of-feedback-">Initialization of Feedback Counters</name>
          <t indent="0" pn="section-3.2.1-1">When a host first enters AccECN mode, in its role as a Data
          Receiver, it initializes its counters to r.cep = 5, r.e0b = r.e1b = 1,
          and r.ceb = 0.</t>
          <t indent="0" pn="section-3.2.1-2">Non-zero initial values are used to support a stateless handshake
          (see <xref target="accecn_Interaction_SYN_Cookies" format="default" sectionFormat="of" derivedContent="Section 5.1"/>) and to be
          distinct from cases where the fields are incorrectly zeroed
          (e.g., by middleboxes -- see <xref target="accecn_sec_zero_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2.4"/>).</t>
          <t indent="0" pn="section-3.2.1-3">When a host enters AccECN mode, in its role as a Data Sender, it
          initializes its counters to s.cep = 5, s.e0b = s.e1b = 1, and s.ceb =
          0.</t>
        </section>
        <section anchor="accecn_ACE" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2">
          <name slugifiedName="name-the-ace-field">The ACE Field</name>
          <t indent="0" pn="section-3.2.2-1">After AccECN has been negotiated on the SYN and SYN/ACK, both
          hosts overload the three TCP flags (AE, CWR, and ECE) in the main TCP
          header as one 3-bit field. Then the field is given a new name, ACE,
          as shown in <xref target="accecn_Fig_ACE_ACK" format="default" sectionFormat="of" derivedContent="Figure 3"/>.</t>
          <figure anchor="accecn_Fig_ACE_ACK" align="left" suppress-title="false" pn="figure-3">
            <name slugifiedName="name-definition-of-the-ace-field">Definition of  the ACE Field Within Bytes 13 and 14 of the TCP Header (When AccECN Has Been Negotiated and SYN=0).</name>
            <artwork align="center" pn="section-3.2.2-2.1">
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|               |           |           | U | A | P | R | S | F |
| Header Length | Reserved  |    ACE    | R | C | S | S | Y | I |
|               |           |           | G | K | H | T | N | N |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
</artwork>
          </figure>
          <t indent="0" pn="section-3.2.2-3">The original definition of these three flags in the TCP header,
          including the addition of support for the ECN-nonce, is shown for
          comparison in <xref target="accecn_Fig_TCPHdr" format="default" sectionFormat="of" derivedContent="Figure 1"/>. This specification
          does not rename these three TCP flags to ACE unconditionally; it
          merely overloads them with another name and definition once an
          AccECN connection has been established.</t>
          <t indent="0" pn="section-3.2.2-4">With one exception (<xref target="accecn_ACE_3rdACK" format="default" sectionFormat="of" derivedContent="Section 3.2.2.1"/>), a host
          with both of its half-connections in AccECN mode <bcp14>MUST</bcp14> interpret the
          AE, CWR, and ECE flags as the 3-bit ACE counter on a segment with the
          SYN flag cleared (SYN=0). On such a packet, a Data Receiver <bcp14>MUST</bcp14>
          encode the 3 least significant bits of its r.cep counter into
          the ACE field that it feeds back to the Data Sender. The least
          significant bit is at bit offset 9 in <xref target="accecn_Fig_ACE_ACK" format="default" sectionFormat="of" derivedContent="Figure 3"/>. A host <bcp14>MUST NOT</bcp14> interpret the three flags
          as a 3-bit ACE field on any segment with SYN=1 (whether ACK is 0 or
          1), or if AccECN negotiation is incomplete or has not succeeded.</t>
          <t indent="0" pn="section-3.2.2-5">Both parts of each of these conditions are equally important. For
          instance, even if AccECN negotiation has been successful, the ACE
          field is not defined on any segments with SYN=1 (e.g., a
          retransmission of an unacknowledged SYN/ACK, or when both ends send
          SYN/ACKs after AccECN support has been successfully negotiated
          during a simultaneous open).</t>
          <section anchor="accecn_ACE_3rdACK" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2.1">
            <name slugifiedName="name-ace-field-on-the-ack-of-the">ACE Field on the ACK of the SYN/ACK</name>
            <t indent="0" pn="section-3.2.2.1-1">If the TCP Client (A) in AccECN mode uses a pure ACK with no SACK blocks to acknowledge the SYN/ACK, it <bcp14>MUST</bcp14> use the binary encoding in <xref target="accecn_Tab_SYN-ACK_fb2" format="default" sectionFormat="of" derivedContent="Table 3"/>  when writing the ACE field (which is the same as the encoding used on the SYN/ACK in <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/>). This feeds back which of the 4 possible values of the IP-ECN field was on the SYN/ACK. This shall be called the
            "handshake encoding" of the ACE field, and it is the only exception
            to the rule that the ACE field carries the 3 least significant
            bits of the r.cep counter on packets with SYN=0.</t>
            <t indent="0" pn="section-3.2.2.1-2">Normally, a TCP Client acknowledges a SYN/ACK with an ACK that
            satisfies the above conditions anyway (SYN=0, no data, no SACK
            blocks). If an AccECN TCP Client intends to acknowledge the
            SYN/ACK with a packet that does not satisfy these conditions
            (e.g., it has data to include on the ACK), it <bcp14>SHOULD</bcp14> first
            send a pure ACK that does satisfy these conditions (see <xref target="accecn_Interaction_Other" format="default" sectionFormat="of" derivedContent="Section 5.2"/>), so that it can feed back
            which of the four values of the IP-ECN field arrived on the
            SYN/ACK. A valid exception to this "<bcp14>SHOULD</bcp14>" would be where the
            implementation will only be used in an environment where mangling
            of the ECN field is unlikely.</t>
            <t indent="0" pn="section-3.2.2.1-3">The TCP Client <bcp14>MUST</bcp14> also use the handshake encoding for the
            pure ACK of any retransmitted SYN/ACK that confirms that the TCP
            Server supports AccECN. If the TCP Server does not receive the final ACK of the handshake before its retransmission timer expires, the procedure for it to follow is given in
<xref target="accecn_sec_SYN-ACK_rexmt" format="default" sectionFormat="of" derivedContent="Section 3.1.4.2"/>. </t>
            <table anchor="accecn_Tab_SYN-ACK_fb2" align="center" pn="table-3">
              <name slugifiedName="name-the-encoding-of-the-ace-fie">The Encoding of the ACE Field in the ACK of the SYN-ACK to Reflect the SYN-ACK's IP-ECN Field</name>
              <thead>
                <tr>
                  <th align="left" colspan="1" rowspan="1">IP-ECN Codepoint on SYN/ACK</th>
                  <th align="left" colspan="1" rowspan="1">ACE on Pure ACK of SYN/ACK</th>
                  <th align="left" colspan="1" rowspan="1">r.cep of TCP Client in AccECN Mode</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left" colspan="1" rowspan="1">Not-ECT</td>
                  <td align="left" colspan="1" rowspan="1">0b010</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">ECT(1)</td>
                  <td align="left" colspan="1" rowspan="1">0b011</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">ECT(0)</td>
                  <td align="left" colspan="1" rowspan="1">0b100</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">CE</td>
                  <td align="left" colspan="1" rowspan="1">0b110</td>
                  <td align="left" colspan="1" rowspan="1">6</td>
                </tr>
              </tbody>
            </table>
            <t indent="0" pn="section-3.2.2.1-5">When an AccECN Server in SYN-RCVD state receives a pure ACK with
SYN=0 and no SACK blocks, it <bcp14>MUST</bcp14> infer the meaning of each possible 
value of the ACE field from <xref target="accecn_Tab_SYN-ACK_fb" format="default" sectionFormat="of" derivedContent="Table 4"/> instead of treating the ACE field  as a counter. As a result, an AccECN Server
<bcp14>MUST</bcp14> set s.cep to the respective value, also shown in <xref target="accecn_Tab_SYN-ACK_fb" format="default" sectionFormat="of" derivedContent="Table 4"/>.</t>
            <t indent="0" pn="section-3.2.2.1-6">Given this encoding of the ACE field on the ACK of a SYN/ACK is
exceptional, an AccECN Server using large receive offload (LRO) might prefer to disable LRO until it transitions out of SYN-RCVD state (when it first receives an ACK that covers the SYN/ACK).</t>
            <table anchor="accecn_Tab_SYN-ACK_fb" align="center" pn="table-4">
              <name slugifiedName="name-meaning-of-the-ace-field-on">Meaning of the ACE Field on the ACK of the SYN/ACK</name>
              <thead>
                <tr>
                  <th align="left" colspan="1" rowspan="1">ACE on ACK of SYN/ACK</th>
                  <th align="left" colspan="1" rowspan="1">IP-ECN Codepoint on SYN/ACK Inferred by Server</th>
                  <th align="left" colspan="1" rowspan="1">s.cep of TCP Server in AccECN Mode</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b000</td>
                  <td align="left" colspan="1" rowspan="1">{Notes 1, 3}</td>
                  <td align="left" colspan="1" rowspan="1">Disable s.cep</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b001</td>
                  <td align="left" colspan="1" rowspan="1">{Notes 2, 3}</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b010</td>
                  <td align="left" colspan="1" rowspan="1">Not-ECT</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b011</td>
                  <td align="left" colspan="1" rowspan="1">ECT(1)</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b100</td>
                  <td align="left" colspan="1" rowspan="1">ECT(0)</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b101</td>
                  <td align="left" colspan="1" rowspan="1">Currently Unused {Note 2}</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b110</td>
                  <td align="left" colspan="1" rowspan="1">CE</td>
                  <td align="left" colspan="1" rowspan="1">6</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">0b111</td>
                  <td align="left" colspan="1" rowspan="1">Currently Unused {Note 2}</td>
                  <td align="left" colspan="1" rowspan="1">5</td>
                </tr>
              </tbody>
            </table>
            <dl indent="9" newline="false" spacing="normal" pn="section-3.2.2.1-8">
              <dt pn="section-3.2.2.1-8.1">Note 1:</dt>
              <dd pn="section-3.2.2.1-8.2">
                <t indent="0" pn="section-3.2.2.1-8.2.1">If the Server is in AccECN mode and in SYN-RCVD
            state, and if it receives a value of zero on a pure ACK with SYN=0
            and no SACK blocks, for the rest of the connection the Server <bcp14>MUST NOT</bcp14> set ECT on outgoing packets and <bcp14>MUST NOT</bcp14> respond to AccECN
            feedback. Nonetheless, as a Data Receiver, it <bcp14>MUST NOT</bcp14> disable
            AccECN feedback.</t>
                <t indent="0" pn="section-3.2.2.1-8.2.2">Any of the circumstances below could cause a value of zero but,
            whatever the cause, the actions above would be the appropriate
            response:</t>
                <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.2.1-8.2.3">
                  <li pn="section-3.2.2.1-8.2.3.1">
                    <t indent="0" pn="section-3.2.2.1-8.2.3.1.1">The TCP Client has somehow entered No ECN feedback mode
                (most likely if the Server received a SYN or sent a SYN/ACK
                with (AE,CWR,ECE) = (0,0,0) after entering AccECN mode, but
                possible even if it didn't).</t>
                  </li>
                  <li pn="section-3.2.2.1-8.2.3.2">
                    <t indent="0" pn="section-3.2.2.1-8.2.3.2.1">The TCP Client genuinely might be in AccECN mode, but its
                count of received CE marks might have caused the ACE field to
                wrap to zero. This is highly unlikely, but not impossible
                because the Server might have already sent multiple packets
                while still in SYN-RCVD state, e.g., using TFO (see <xref target="accecn_Interaction_Other" format="default" sectionFormat="of" derivedContent="Section 5.2"/>), and some might have been
                CE-marked. Then ACE on the first ACK seen by the Server might
                be zero, due to previous ACKs experiencing an unfortunate
                pattern of loss or delay.</t>
                  </li>
                  <li pn="section-3.2.2.1-8.2.3.3">
                    <t indent="0" pn="section-3.2.2.1-8.2.3.3.1">There is some form of non-compliance at the TCP Client or on the
                path.</t>
                  </li>
                </ul>
              </dd>
              <dt pn="section-3.2.2.1-8.3">Note 2:</dt>
              <dd pn="section-3.2.2.1-8.4"> If the Server is in AccECN mode, these values are
            Currently Unused but the AccECN Server's behaviour is still
            defined for forward compatibility. Then the designer of a future
            protocol can know for certain what AccECN Servers will do with
            these codepoints.</dd>
              <dt pn="section-3.2.2.1-8.5">Note 3:</dt>
              <dd pn="section-3.2.2.1-8.6"> In the case where a Server that implements AccECN is
            also using a stateless handshake (termed a SYN cookie), it will not
            remember whether it entered AccECN mode. The values 0b000 or 0b001
            will remind it that it did not enter AccECN mode, because AccECN
            does not use them (see <xref target="accecn_Interaction_SYN_Cookies" format="default" sectionFormat="of" derivedContent="Section 5.1"/> for details). If a
            Server that uses a stateless handshake and implements AccECN
            receives either of these two values in the ACK, its action is
            implementation-dependent and outside the scope of this document. It
            will certainly not take the action in the third column because,
            after it receives either of these values, it is not in AccECN
            mode. That is, it will not disable ECN (at least not just because ACE is 0b000) and it will not set s.cep.
</dd>
            </dl>
          </section>
          <section anchor="accecn_sec_ACE_feedback" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2.2">
            <name slugifiedName="name-encoding-and-decoding-feedb">Encoding and Decoding Feedback in the ACE Field</name>
            <t indent="0" pn="section-3.2.2.2-1">Whenever the Data Receiver sends an ACK with SYN=0 (with or
            without data), unless the handshake encoding in <xref target="accecn_ACE_3rdACK" format="default" sectionFormat="of" derivedContent="Section 3.2.2.1"/> applies, the Data Receiver <bcp14>MUST</bcp14>
            encode the least significant 3 bits of its r.cep counter into the
            ACE field (see <xref target="accecn_Algo_ACE_Wrap" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>).</t>
            <t indent="0" pn="section-3.2.2.2-2">Whenever the Data Sender receives an ACK with SYN=0 (with or
            without data), it first checks whether it has already been
            superseded (defined in <xref target="accecn_Algo_Option_Coding" format="default" sectionFormat="of" derivedContent="Appendix A.1"/>)
            by another ACK in which case it ignores the ECN feedback. If the
            ACK has not been superseded, and if the special handshake encoding
            in <xref target="accecn_ACE_3rdACK" format="default" sectionFormat="of" derivedContent="Section 3.2.2.1"/> does not apply, the Data
            Sender decodes the ACE field as follows (see <xref target="accecn_Algo_ACE_Wrap" format="default" sectionFormat="of" derivedContent="Appendix A.2"/> for examples).</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.2.2-3">
              <li pn="section-3.2.2.2-3.1">
                <t indent="0" pn="section-3.2.2.2-3.1.1">It takes the least significant 3 bits of its local s.cep
                counter and subtracts them from the incoming ACE counter to
                work out the minimum positive increment it could apply to
                s.cep (assuming the ACE field only wrapped once at most).</t>
              </li>
              <li pn="section-3.2.2.2-3.2">
                <t indent="0" pn="section-3.2.2.2-3.2.1">It then follows the safety procedures in <xref target="accecn_ACE_Safety_S" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5.2"/> to calculate or estimate how
                many packets the ACK could have acknowledged under the
                prevailing conditions to determine whether the ACE field might
                have wrapped more than once.</t>
              </li>
            </ul>
            <t indent="0" pn="section-3.2.2.2-4">The encode/decode procedures during the three-way handshake are
            exceptions to the general rules given so far, so they are spelled
            out step by step below for clarity:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.2.2-5">
              <li pn="section-3.2.2.2-5.1">
                <t indent="0" pn="section-3.2.2.2-5.1.1">If a TCP Server in AccECN mode receives a CE mark in the
                IP-ECN field of a SYN (SYN=1, ACK=0), it <bcp14>MUST NOT</bcp14> increment
                r.cep (it remains at its initial value of 5). </t>
                <t indent="0" pn="section-3.2.2.2-5.1.2">Reason: It would be redundant for the Server
                to include CE-marked SYNs in its r.cep counter, because it
                already reliably delivers feedback of any CE marking using the
                encoding in the top block of <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/> in the SYN/ACK. This also
                ensures that, when the Server starts using the ACE field, it
                has not unnecessarily consumed more than one initial value,
                given they can be used to negotiate variants of the AccECN
                protocol (see <xref target="accecn_space_evolution" format="default" sectionFormat="of" derivedContent="Appendix B.3"/>).</t>
              </li>
              <li pn="section-3.2.2.2-5.2">
                <t indent="0" pn="section-3.2.2.2-5.2.1">If a TCP Client in AccECN mode receives CE feedback in the
                TCP flags of a SYN/ACK, it <bcp14>MUST NOT</bcp14> increment s.cep (it
                remains at its initial value of 5) so that it stays in step
                with r.cep on the Server. Nonetheless, the TCP Client still
                triggers the congestion control actions necessary to respond
                to the CE feedback.</t>
              </li>
              <li pn="section-3.2.2.2-5.3">
                <t indent="0" pn="section-3.2.2.2-5.3.1">If a TCP Client in AccECN mode receives a CE mark in the
                IP-ECN field of a SYN/ACK, it <bcp14>MUST</bcp14> increment r.cep, but no
                more than once no matter how many CE-marked SYN/ACKs it
                receives (i.e., incremented from 5 to 6, but no further).
                </t>
                <t indent="0" pn="section-3.2.2.2-5.3.2">Reason: Incrementing r.cep ensures the
                Client will eventually deliver any CE marking to the Server
                reliably when it starts using the ACE field. Even though the
                Client also feeds back any CE marking on the ACK of the
                SYN/ACK using the encoding in <xref target="accecn_Tab_SYN-ACK_fb2" format="default" sectionFormat="of" derivedContent="Table 3"/>, this ACK is not delivered
                reliably, so it can be considered as a timely notification
                that is redundant but unreliable. The Client does not
                increment r.cep more than once, because the Server can only
                increment s.cep once (see next bullet). Also, this limits the
                unnecessarily consumed initial values of the ACE field to
                two.</t>
              </li>
              <li pn="section-3.2.2.2-5.4">
                <t indent="0" pn="section-3.2.2.2-5.4.1">If a TCP Server in AccECN mode and in SYN-RCVD state
                receives CE feedback in the TCP flags of a pure ACK with no
                SACK blocks, it <bcp14>MUST</bcp14> increment s.cep (from 5 to 6). The TCP
                Server then triggers the congestion control actions necessary
                to respond to the CE feedback.</t>
                <t indent="0" pn="section-3.2.2.2-5.4.2">Reasoning: The TCP Server can only increment
                s.cep once, because the first ACK it receives will cause it to
                transition out of SYN-RCVD state. The Server's congestion
                response would be no different, even if it could receive
                feedback of more than one CE-marked SYN/ACK.</t>
                <t indent="0" pn="section-3.2.2.2-5.4.3">Once the TCP Server transitions to ESTABLISHED
                state, it might later receive other pure ACK(s) with the
                handshake encoding in the ACE field. A Server <bcp14>MAY</bcp14> implement a
                test for such a case, but it is not required. Therefore, once
                in the ESTABLISHED state, it will be sufficient for the Server
                to consider the ACE field to be encoded as the normal ACE
                counter on all packets with SYN=0.</t>
                <t indent="0" pn="section-3.2.2.2-5.4.4">Reasoning: Such ACKs will be quite unusual,
                e.g., a SYN/ACK (or ACK of the SYN/ACK) that is delayed
                for longer than the Server's retransmission timeout; or packet
                duplication by the network. And the impact of any error in the
                feedback on such ACKs will only be temporary.</t>
              </li>
            </ul>
          </section>
          <section anchor="accecn_sec_ecn-mangling" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2.3">
            <name slugifiedName="name-testing-for-mangling-of-the">Testing for Mangling of the IP/ECN Field</name>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.2.3-1">
              <li pn="section-3.2.2.3-1.1">
                <t indent="0" pn="section-3.2.2.3-1.1.1">TCP Client side:</t>
                <t indent="0" pn="section-3.2.2.3-1.1.2">The value of the TCP-ECN flags on the SYN/ACK indicates the
              value of the IP-ECN field when the SYN arrived at the Server. The
              TCP Client can compare this with how it originally set the IP-ECN
              field on the SYN. If this comparison implies an invalid transition
              (defined below) of the IP-ECN field, for the remainder of the
              half-connection the Client is advised to send non-ECN-capable
              packets, but it still ought to respond to any feedback of CE
              markings (explained below). However, the TCP Client <bcp14>MUST</bcp14> remain in
              the AccECN feedback mode and it <bcp14>MUST</bcp14> continue to feed back any ECN
              markings on arriving packets (in its role as Data Receiver). 
                </t>
              </li>
              <li pn="section-3.2.2.3-1.2">
                <t indent="0" pn="section-3.2.2.3-1.2.1">TCP Server side:</t>
                <t indent="0" pn="section-3.2.2.3-1.2.2">The value of the ACE field on the last ACK of the three-way handshake
              indicates the value of the IP-ECN field when the SYN/ACK arrived
              at the TCP Client. The Server can compare this with how it
              originally set the IP-ECN field on the SYN/ACK. If this comparison
              implies an invalid transition of the IP-ECN field, for the
              remainder of the half-connection the Server is advised to send
              non-ECN-capable packets, but it still ought to respond to any
              feedback of CE markings (explained below). However, the Server
              <bcp14>MUST</bcp14> remain in the AccECN feedback mode and it <bcp14>MUST</bcp14> continue to
              feed back any ECN markings on arriving packets (in its role as
              Data Receiver).
                </t>
              </li>
            </ul>
            <t indent="0" pn="section-3.2.2.3-2">If a Data Sender in AccECN mode starts sending non-ECN-capable
            packets because it has detected mangling, it is still advised to
            respond to CE feedback. Reason: Any CE marking arriving at the
            Data Receiver could be due to something early in the path mangling
            the non-ECN-capable IP-ECN field into an ECN-capable codepoint and
            then, later in the path, a network bottleneck might be applying
            CE markings to indicate genuine congestion. This argument applies
            whether the handshake packet originally sent by the TCP Client or
            Server was non-ECN-capable or ECN-capable because, in either case,
            an unsafe transition could imply that non-ECN-capable packets
            later in the connection might get mangled.</t>
            <t indent="0" pn="section-3.2.2.3-3">Once a Data Sender has entered AccECN mode it is advised to
            check whether it is receiving continuous feedback of CE. Specifying
            exactly how to do this is beyond the scope of the present
            specification, but the sender might check whether the feedback for
            every packet it sends for the first three or four rounds indicates
            CE marking. If continuous CE marking is detected, for the
            remainder of the half-connection, the Data Sender ought to send
            non-ECN-capable packets, and it is advised not to respond to any
            feedback of CE markings. The Data Sender might occasionally test
            whether it can resume sending ECN-capable packets.</t>
            <t indent="0" pn="section-3.2.2.3-4">The above advice on switching to sending non-ECN-capable
            packets but still responding to CE markings unless they become
            continuous is not stated normatively (in capitals), because the
            best strategy might depend on experience of the most likely types
            of mangling, which can only be known at the time of
            deployment. For instance, later in a connection, sender implementations might need to detect the onset (or the end) of mangling and stop (or start) sending ECN-capable packets accordingly.</t>
            <t indent="0" pn="section-3.2.2.3-5">As always, once a host has entered AccECN mode, it follows the
            general mandatory requirements (<xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>) to remain in the same
            feedback mode and to continue feeding back any ECN markings on
            arriving packets using AccECN feedback. This follows the general
            approach where an AccECN Data Receiver mechanistically reflects
            whatever it receives (<xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/>).</t>
            <t indent="0" pn="section-3.2.2.3-6">The ACK of the SYN/ACK is not reliably delivered (nonetheless,
            the count of CE marks is still eventually delivered reliably). If
            this ACK does not arrive, the Server is advised to continue to
            send ECN-capable packets without having tested for mangling of the
            IP-ECN field on the SYN/ACK.</t>
            <t indent="0" pn="section-3.2.2.3-7">All the fall-back behaviours in this section are necessary in
            case mangling of the IP-ECN field is asymmetric, which is
            currently common over some mobile networks <xref target="Mandalari18" format="default" sectionFormat="of" derivedContent="Mandalari18"/>. In this case, one end might see no unsafe
            transition and continue sending ECN-capable packets, while the
            other end sees an unsafe transition and stops sending ECN-capable
            packets.</t>
            <t indent="0" pn="section-3.2.2.3-8">Invalid transitions of the IP-ECN field are defined in Section
            <xref target="RFC3168" sectionFormat="bare" section="18" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-18" derivedContent="RFC3168"/> of the
            Classic ECN specification <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> and repeated
            here for convenience:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.2.3-9">
              <li pn="section-3.2.2.3-9.1">
                <t indent="0" pn="section-3.2.2.3-9.1.1">the Not-ECT codepoint changes;</t>
              </li>
              <li pn="section-3.2.2.3-9.2">
                <t indent="0" pn="section-3.2.2.3-9.2.1">either ECT codepoint transitions to Not-ECT;</t>
              </li>
              <li pn="section-3.2.2.3-9.3">
                <t indent="0" pn="section-3.2.2.3-9.3.1">the CE codepoint changes.</t>
              </li>
            </ul>
            <t indent="0" pn="section-3.2.2.3-10">RFC 3168 says that a router that changes ECT to Not-ECT is
            invalid but safe. However, from a host's viewpoint, this
            transition is unsafe because it could be the result of two
            transitions at different routers on the path: ECT to CE (safe)
            then CE to Not-ECT (unsafe). This scenario could well happen where
            an ECN-enabled home router congests its upstream mobile broadband
            bottleneck link, then the ingress to the mobile network clears the
            ECN field <xref target="Mandalari18" format="default" sectionFormat="of" derivedContent="Mandalari18"/>.</t>
          </section>
          <section anchor="accecn_sec_ACE_init_invalid" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2.4">
            <name slugifiedName="name-testing-for-zeroing-of-the-">Testing for Zeroing of the ACE Field</name>
            <t indent="0" pn="section-3.2.2.4-1">Note that this section concerns the ACE field after the three way handshake. It does not concern the case where the ACE field is zero when the handshake encoding has been used on the ACK of the SYN/ACK under the carefully worded conditions in <xref target="accecn_ACE_3rdACK" format="default" sectionFormat="of" derivedContent="Section 3.2.2.1"/></t>
            <t indent="0" pn="section-3.2.2.4-2"><xref target="accecn_ACE" format="default" sectionFormat="of" derivedContent="Section 3.2.2"/> required the Data Receiver to initialize the r.cep counter to a non-zero value. Therefore, in either direction the ACE counter ought to be non-zero in the first feedback packet (with or without data) that arrives at a host in AccECN mode after the three-way handshake.  However, if reordering occurs, the first feedback packet that arrives will not necessarily be the same as the first packet in sequence order. The possibility of reordering means that there is a chance that the ACE field on the first packet to arrive after the three-way handshake is genuinely zero (without middlebox interference). Disabling ECN for a half-connection in this case would be unnecessary. Therefore, it is <bcp14>NOT RECOMMENDED</bcp14> for either Data Sender to explicitly test for zeroing/bleaching of the ACE field after the three-way handshake.</t>
            <t indent="0" pn="section-3.2.2.4-3">Further, the Data Sender <bcp14>MUST NOT</bcp14> test whether the arriving counter in the initial ACE field has been initialized to a specific valid value. This allows hosts to use different initial values as an additional signalling channel in the future.</t>
          </section>
          <section anchor="accecn_ACE_Safety" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.2.5">
            <name slugifiedName="name-safety-against-ambiguity-of">Safety Against Ambiguity of the ACE Field</name>
            <t indent="0" pn="section-3.2.2.5-1">If too many CE-marked segments are acknowledged at once, or if
            a long run of ACKs is lost or thinned out, the 3-bit counter in
            the ACE field might have cycled between two ACKs arriving at the
            Data Sender. The following safety procedures minimize this
            ambiguity.</t>
            <section anchor="accecn_ACE_Safety_R" numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.2.5.1">
              <name slugifiedName="name-packet-receiver-safety-proc">Packet Receiver Safety Procedures</name>
              <t indent="0" pn="section-3.2.2.5.1-1">The following rules define when the receiver of a packet in AccECN
              mode emits an ACK:</t>
              <dl newline="false" spacing="normal" indent="3" pn="section-3.2.2.5.1-2">
                <dt pn="section-3.2.2.5.1-2.1">Change-Triggered ACKs:</dt>
                <dd pn="section-3.2.2.5.1-2.2">
                  <t indent="0" pn="section-3.2.2.5.1-2.2.1">An AccECN Data Receiver
                  <bcp14>SHOULD</bcp14> emit an ACK whenever a data packet marked CE arrives
                  after the previous packet was not CE.</t>
                  <t indent="0" pn="section-3.2.2.5.1-2.2.2">Even though this rule is stated as a
                  "<bcp14>SHOULD</bcp14>", it is important for a transition to trigger an ACK
                  if at all possible. The only valid
exception to this rule is due to Large Receive Offload (LRO) or
Generic Receive Offload (GRO) as further described below.</t>
                  <t indent="0" pn="section-3.2.2.5.1-2.2.3">For the
                  avoidance of doubt, this rule is deliberately worded to
                  apply solely when <em>data</em> packets
                  arrive, but the comparison with the previous packet includes
                  any packet, not just data packets.</t>
                </dd>
                <dt pn="section-3.2.2.5.1-2.3">Increment-Triggered ACKs:</dt>
                <dd pn="section-3.2.2.5.1-2.4">An AccECN receiver of a packet
                  <bcp14>MUST</bcp14> emit an ACK if 'n' CE marks have arrived since
                  the previous ACK. If there is unacknowledged data at the
                  receiver, 'n' <bcp14>SHOULD</bcp14> be 2. If there is no unacknowledged data
                  at the receiver, 'n' <bcp14>SHOULD</bcp14> be 3 and <bcp14>MUST</bcp14> be no less
                  than 3. In either case, 'n' <bcp14>MUST</bcp14> be no greater than 7.</dd>
              </dl>
              <t indent="0" pn="section-3.2.2.5.1-3">The above rules for when to send an ACK are designed to
              be complemented by those in <xref target="accecn_option_usage" format="default" sectionFormat="of" derivedContent="Section 3.2.3.3"/>, which concern whether an AccECN
              TCP Option ought to be included on ACKs.</t>
              <t indent="0" pn="section-3.2.2.5.1-4">If the arrivals of a number of data packets are all processed
              as one event, e.g., using large receive offload (LRO) or
              generic receive offload (GRO), both the above rules <bcp14>SHOULD</bcp14> be
              interpreted as requiring multiple ACKs to be emitted
              back to back (for each transition and for each sequence of 'n'
              CE marks). If this is problematic for high performance, either
              rule can be interpreted as requiring just a single ACK at the
              end of the whole receive event.</t>
              <t indent="0" pn="section-3.2.2.5.1-5">Even if a number of data packets do not arrive as one event,
              the 'Change-Triggered ACKs' rule could sometimes cause the ACK
              rate to be problematic for high performance (although high
              performance protocols such as DCTCP already successfully use
              change-triggered ACKs). The rationale for change-triggered ACKs
              is so that the Data Sender can rely on them to detect queue
              growth as soon as possible, particularly at the start of a flow.
              The approach can lead to some additional ACKs but it feeds back
              the timing and the order in which ECN marks are received with
              minimal additional complexity. If CE marks are infrequent, as is
              the case for most Active Queue Management (AQM) algorithms
              at the time of writing, or there are
              multiple marks in a row, the additional load will be low.
              However, marking patterns with numerous non-contiguous CE marks
              could increase the load significantly. One possible compromise
              would be for the receiver to heuristically detect whether the
              sender is in slow-start, then to implement change-triggered ACKs
              while the sender is in slow-start, and offload otherwise.</t>
              <t indent="0" pn="section-3.2.2.5.1-6">In a scenario where both endpoints support AccECN, if host B
              has chosen to use ECN-capable pure ACKs (as
              allowed in <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> experiments) and enough of
              these ACKs become CE marked, then the 'Increment-Triggered ACKs'
              rule ensures that its peer (host A) gives B sufficient
              feedback about this congestion on the ACKs from B to A.
              Normally, for instance in a unidirectional data scenario from
              host A to B, the Data Sender (A) can piggyback that feedback on
              its data. But if A stops sending data, the second part of the
              'Increment-Triggered ACKs' rule requires A to emit a pure ACK
              for at least every third CE-marked incoming ACK over the
              subsequent round trip.</t>
              <t indent="0" pn="section-3.2.2.5.1-7">Although TCP normally only ACKs data segments, in this
              case the increment-triggered ACK rule makes it mandatory for A
              to emit ACKs of ACKs. This is justifiable because the ACKs in
              this case are ECN-capable and so, even though the ACKs of these
              ACKs do not acknowledge new data, they feed back new congestion
              state (useful in case B starts sending). The minimum of 3 for
              'n' in this case ensures that, even if A also uses ECN-capable
              pure ACKs, and even if there is pathological congestion in both
              directions, any resulting ping-pong of ACKs will be rapidly
              damped.</t>
              <t indent="0" pn="section-3.2.2.5.1-8">In the above bidirectional scenario, incoming ACKs of ACKs
              could be mistaken for duplicate ACKs. But ACKs of ACKs can be
              distinguished from duplicate ACKs because they do not contain any
              SACK blocks even when SACK has been negotiated. It is outside the
              scope of this AccECN specification to normatively specify this additional
              test for DupACKs, because ACKs of ACKs can only arise if the
              original ACKs are ECN-capable. Instead, any specification that allows
              ECN-capable pure ACKs <bcp14>MUST</bcp14> make sending ACKs of ACKs conditional
              on measures to distinguish ACKs of ACKs from DupACKs (see for
              example <xref target="I-D.ietf-tcpm-generalized-ecn" format="default" sectionFormat="of" derivedContent="ECN++"/>). All that
              is necessary here is to require that these ACKs of ACKs <bcp14>MUST NOT</bcp14>
              contain any SACK blocks (which would normally not happen
              anyway).</t>
            </section>
            <section anchor="accecn_ACE_Safety_S" numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.2.5.2">
              <name slugifiedName="name-data-sender-safety-procedur">Data Sender Safety Procedures</name>
              <t indent="0" pn="section-3.2.2.5.2-1">If the Data Sender has not received AccECN TCP Options to
              give it more dependable information, and it detects that the ACE
              field could have cycled, it <bcp14>SHOULD</bcp14> deem whether it cycled by
              taking the safest likely case under the prevailing conditions.
              It can detect if the counter could have cycled by using the jump
              in the acknowledgement number since the last ACK to calculate or
              estimate how many segments could have been acknowledged. An
              example algorithm to implement this policy is given in <xref target="accecn_Algo_ACE_Wrap" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>. An implementation <bcp14>MAY</bcp14> use an
              alternative algorithm as long as it satisfies the requirements
              in this subsection.</t>
              <t indent="0" pn="section-3.2.2.5.2-2">If missing acknowledgement numbers arrive later (reordering)
              and prove that the counter did not cycle, the Data Sender <bcp14>MAY</bcp14>
              attempt to neutralize the effect of any action it took based on
              a conservative assumption that it later found to be
              incorrect.</t>
              <t indent="0" pn="section-3.2.2.5.2-3">The Data Sender can estimate how many packets (of any
              marking) an ACK acknowledges. If the ACE counter on an ACK seems
              to imply that the minimum number of newly CE-marked packets is
              greater than the number of newly acknowledged packets, the Data
              Sender <bcp14>SHOULD</bcp14> consider the ACE counter to be correct (and its
              count of control packets to be incomplete), unless it can be
              sure that it is counting all control packets correctly.</t>
            </section>
          </section>
        </section>
        <section anchor="accecn_option" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.3">
          <name slugifiedName="name-the-accecn-option">The AccECN Option</name>
          <t indent="0" pn="section-3.2.3-1">Two alternative AccECN Options are defined as shown in <xref target="accecn_Fig_TCPopt" format="default" sectionFormat="of" derivedContent="Figure 4"/>. The initial 'E' of each field name
          stands for 'Echo'.</t>
          <figure anchor="accecn_Fig_TCPopt" align="left" suppress-title="false" pn="figure-4">
            <name slugifiedName="name-the-two-alternative-accecn-">The Two Alternative AccECN TCP Options</name>
            <artwork align="center" pn="section-3.2.3-2.1">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Kind = 172   |  Length = 11  |          EE0B field           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| EE0B (cont'd) |           ECEB field                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  EE1B field                   |             Order 0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Kind = 174   |  Length = 11  |          EE1B field           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| EE1B (cont'd) |           ECEB field                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  EE0B field                   |             Order 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
          </figure>
          <t indent="0" pn="section-3.2.3-3"><xref target="accecn_Fig_TCPopt" format="default" sectionFormat="of" derivedContent="Figure 4"/> shows two option field orders;
          order 0 and order 1. They both consist of three 24-bit fields.
          Order 0 provides the 24 least significant bits of the r.e0b, r.ceb,
          and r.e1b counters, respectively. Order 1 provides the same fields,
          but in the opposite order. On each packet, the Data Receiver can use
          whichever order is more efficient. In either case, the bytes within
          the fields are in network byte order (big-endian).</t>
          <t indent="0" pn="section-3.2.3-4">The choice to use three bytes (24 bits) fields in the options was made to
          strike a balance between TCP Option space usage, and the required
          fidelity of the counters to accommodate typical scenarios such as
          hardware TCP Segmentation Offloading (TSO), and periods during which no option may
          be transmitted (e.g., SACK loss recovery). Providing only 2 bytes (16 bits)
          for these counters could easily roll over within a single TSO transmission
          or large/generic receive offload (LRO/GRO) event. Having two distinct
          orderings further allows the transmission of the most pertinent changes
          in an abbreviated option (see below).</t>
          <t indent="0" pn="section-3.2.3-5">When a Data Receiver sends an AccECN Option, it <bcp14>MUST</bcp14> set the Kind
          field to 172 if using Order 0, or to 174 if using Order 1. These two
          new TCP Option Kinds are registered in <xref target="accecn_IANA_Considerations" format="default" sectionFormat="of" derivedContent="Section 7"/> and are called
          AccECN0 and AccECN1, respectively.</t>
          <t indent="0" pn="section-3.2.3-6">Note that there is no field to feed back Not-ECT bytes.
          Nonetheless, an algorithm for the Data Sender to calculate the number
          of payload bytes received as Not-ECT is given in <xref target="accecn_Algo_Not-ECT" format="default" sectionFormat="of" derivedContent="Appendix A.4"/>.</t>
          <t indent="0" pn="section-3.2.3-7">Whenever a Data Receiver sends an AccECN Option, the rules in
          <xref target="accecn_option_usage" format="default" sectionFormat="of" derivedContent="Section 3.2.3.3"/> allow it to omit unchanged
          fields from the tail of the option, to help cope with option space
          limitations, as long as it preserves the order of the remaining
          fields and includes any field that has changed. The length field
          <bcp14>MUST</bcp14> indicate which fields are present as follows:</t>
          <table anchor="accecn_Fig_TCPopttab" align="center" pn="table-5">
            <name slugifiedName="name-fields-included-in-accecn-t">Fields included in AccECN TCP Options of each length and order</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Length</th>
                <th align="left" colspan="1" rowspan="1">Order 0</th>
                <th align="left" colspan="1" rowspan="1">Order 1</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">11</td>
                <td align="left" colspan="1" rowspan="1">EE0B, ECEB, EE1B</td>
                <td align="left" colspan="1" rowspan="1">EE1B, ECEB, EE0B</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">8</td>
                <td align="left" colspan="1" rowspan="1">EE0B, ECEB</td>
                <td align="left" colspan="1" rowspan="1">EE1B, ECEB</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">5</td>
                <td align="left" colspan="1" rowspan="1">EE0B</td>
                <td align="left" colspan="1" rowspan="1">EE1B</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">2</td>
                <td align="left" colspan="1" rowspan="1">(empty)</td>
                <td align="left" colspan="1" rowspan="1">(empty)</td>
              </tr>
            </tbody>
          </table>
          <t indent="0" pn="section-3.2.3-9">The empty option of Length=2 is provided to allow for a case
          where an AccECN Option has to be sent (e.g., on the SYN/ACK to
          test the path), but there is very limited space for the option.</t>
          <t indent="0" pn="section-3.2.3-10">All implementations of a Data Sender that read any AccECN Option
          <bcp14>MUST</bcp14> be able to read AccECN Options of any of the above lengths. For
          forward compatibility, if the AccECN Option is of any other length,
          implementations <bcp14>MUST</bcp14> use those whole 3-octet fields that fit within
          the length and ignore the remainder of the option, treating it as
          padding.</t>
          <t indent="0" pn="section-3.2.3-11">AccECN Options have to be optional to implement, because both
          sender and receiver have to be able to cope without options anyway --
          in cases where they do not traverse a network path. It is
          <bcp14>RECOMMENDED</bcp14> to implement both sending and receiving of AccECN
          Options. Support for AccECN Options is particularly valuable over
          paths that introduce a high degree of ACK filtering, where the 3-bit
          ACE counter alone might sometimes be insufficient, when it is
          ambiguous whether it has wrapped. If sending of AccECN Options is
          implemented, the fall-backs described in this document will need to
          be implemented as well (unless solely for a controlled environment
          where path traversal is not considered a problem). Even if a
          developer does not implement logic to understand received AccECN
          Options, it is <bcp14>RECOMMENDED</bcp14> that they implement logic to send AccECN
          Options. Otherwise, those remote peers that implement the receiving
          logic will still be excluded from congestion feedback that is robust
          against the increasingly aggressive ACK filtering in the Internet.
          The logic to send AccECN Options is the simpler to implement of the
          two sides.</t>
          <t indent="0" pn="section-3.2.3-12">If a Data Receiver intends to send an AccECN Option at any time
          during the rest of the connection, it is <bcp14>RECOMMENDED</bcp14> to also test
          path traversal of the AccECN Option as specified in <xref target="accecn_Mbox_Interference" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2"/>.</t>
          <section numbered="true" removeInRFC="false" toc="include" pn="section-3.2.3.1">
            <name slugifiedName="name-encoding-and-decoding-feedba">Encoding and Decoding Feedback in the AccECN Option Fields</name>
            <t indent="0" pn="section-3.2.3.1-1">Whenever the Data Receiver includes any of the counter fields
            (ECEB, EE0B, EE1B) in an AccECN Option, it <bcp14>MUST</bcp14> encode the 24
            least significant bits of the current value of the associated
            counter into the field (respectively r.ceb, r.e0b, r.e1b).</t>
            <t indent="0" pn="section-3.2.3.1-2">Whenever the Data Sender receives an ACK carrying an AccECN
            Option, it first checks whether the ACK has already been
            superseded by another ACK in which case it ignores the ECN
            feedback. If the ACK has not been superseded, the Data Sender
            normally decodes the fields in the AccECN Option as follows. For
            each field, it takes the least significant 24 bits of its
            associated local counter (s.ceb, s.e0b, or s.e1b) and subtracts
            them from the counter in the associated field of the incoming
            AccECN Option (respectively ECEB, EE0B, EE1B), to work out the
            minimum positive increment it could apply to s.ceb, s.e0b, or s.e1b
            (assuming the field in the option only wrapped once at most).</t>
            <t indent="0" pn="section-3.2.3.1-3"><xref target="accecn_Algo_Option_Coding" format="default" sectionFormat="of" derivedContent="Appendix A.1"/> gives an example
            algorithm for the Data Receiver to encode its byte counters into
            an AccECN Option, and for the Data Sender to decode the AccECN
            Option fields into its byte counters.</t>
            <t indent="0" pn="section-3.2.3.1-4">Note that, as specified in <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/>,
            any data on the SYN (SYN=1, ACK=0) is not included in any of the
            byte counters held locally for each ECN marking nor in an AccECN
            Option on the wire.</t>
          </section>
          <section anchor="accecn_Mbox_Interference" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.3.2">
            <name slugifiedName="name-path-traversal-of-the-accec">Path Traversal of the AccECN Option</name>
            <section anchor="accecn_AccECN_Option_3WHS" numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.3.2.1">
              <name slugifiedName="name-testing-the-accecn-option-d">Testing the AccECN Option During the Handshake</name>
              <t indent="0" pn="section-3.2.3.2.1-1">The TCP Client <bcp14>MUST NOT</bcp14> include an AccECN TCP Option on the
              SYN. If there is somehow an AccECN Option on a SYN, it <bcp14>MUST</bcp14> be
              ignored when forwarded or received.</t>
              <t indent="0" pn="section-3.2.3.2.1-2">A TCP Server that confirms its support for AccECN (in
              response to an AccECN SYN from the Client as described in <xref target="accecn_Negotiation" format="default" sectionFormat="of" derivedContent="Section 3.1"/>) <bcp14>SHOULD</bcp14> include an AccECN TCP
              Option on the SYN/ACK.</t>
              <t indent="0" pn="section-3.2.3.2.1-3">A TCP Client that has successfully negotiated AccECN <bcp14>SHOULD</bcp14>
              include an AccECN Option in the first ACK at the end of the
              three-way handshake. However, this first ACK is not delivered reliably, so the
              TCP Client <bcp14>SHOULD</bcp14> also include an AccECN Option on the first
              data segment it sends (if it ever sends one).</t>
              <t indent="0" pn="section-3.2.3.2.1-4">A host <bcp14>MAY</bcp14> omit an AccECN Option in any of the above three
              cases because of insufficient option space or because it has cached
              knowledge that the packet would be likely to be blocked on the
              path to the other host if it included an AccECN Option.</t>
            </section>
            <section anchor="accecn_AccECN_Option_Loss" numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.3.2.2">
              <name slugifiedName="name-testing-for-loss-of-packets">Testing for Loss of Packets Carrying the AccECN Option</name>
              <t indent="0" pn="section-3.2.3.2.2-1">If the TCP Server has not received an ACK to acknowledge its
              SYN/ACK after the normal TCP timeout or if it receives a second SYN
              with a request for AccECN support, then either the SYN/ACK might
              just have been lost, e.g., due to congestion, or a middlebox
              might be blocking AccECN Options. To expedite connection setup
              in deployment scenarios where AccECN path traversal might be
              problematic, the TCP Server <bcp14>SHOULD</bcp14> retransmit the SYN/ACK, but
              with no AccECN Option. If this retransmission times out, to
              expedite connection setup, the TCP Server <bcp14>SHOULD</bcp14> retransmit the
              SYN/ACK with (AE,CWR,ECE) = (0,0,0) and no AccECN Option, but it
              remains in AccECN feedback mode (per <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>).</t>
              <aside pn="section-3.2.3.2.2-2">
                <t indent="0" pn="section-3.2.3.2.2-2.1">Note that a retransmitted AccECN SYN/ACK will not
                necessarily have the same TCP-ECN flags as the original
                SYN/ACK, because it feeds back the IP-ECN field of the latest
                SYN to have arrived (by the rule in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>).</t>
              </aside>
              <t indent="0" pn="section-3.2.3.2.2-3">The above fall-back approach limits any interference by
              middleboxes that might drop packets with unknown options, even
              though it is more likely that SYN/ACK loss is due to congestion.
              The TCP Server <bcp14>MAY</bcp14> try to send another packet with an AccECN
              Option at a later point during the connection but it ought to
              monitor if that packet got lost as well, in which case it <bcp14>SHOULD</bcp14>
              disable the sending of AccECN Options for this
              half-connection.</t>
              <t indent="0" pn="section-3.2.3.2.2-4">Implementers <bcp14>MAY</bcp14> use other fall-back strategies if they are
              found to be more effective (e.g., retrying an AccECN Option
              for a second time before fall-back -- most appropriate during
              high levels of congestion). However, other fall-back strategies
              will need to follow all the rules in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/>, which concern
              behaviour when SYNs or SYN/ACKs negotiating different types of
              feedback have been sent within the same connection.</t>
              <t indent="0" pn="section-3.2.3.2.2-5">Further it might make sense to also remove any other new or
              experimental fields or options on the SYN/ACK, although the
              required behaviour will depend on the specification of the other
              option(s) and on any attempt to coordinate fall-back between
              different modules of the stack.</t>
              <t indent="0" pn="section-3.2.3.2.2-6">If the TCP Client detects that the first data segment it sent
              with an AccECN Option was lost, in deployment scenarios where
              AccECN path traversal might be problematic, it <bcp14>SHOULD</bcp14> fall back
              to no AccECN Option on the retransmission. Again, implementers
              <bcp14>MAY</bcp14> use other fall-back strategies such as attempting to
              retransmit a second segment with an AccECN Option before
              fall-back, and/or caching whether AccECN Options are blocked for
              subsequent connections. <xref target="RFC9040" format="default" sectionFormat="of" derivedContent="RFC9040"/> further
              discusses caching of TCP parameters and status information.</t>
              <t indent="0" pn="section-3.2.3.2.2-7">If a middlebox is dropping packets with options it does not
              recognize, a host that is sending little or no data but mostly
              pure ACKs will not inherently detect such losses. Such a host
              <bcp14>MAY</bcp14> detect loss of ACKs carrying the AccECN Option by detecting
              whether the acknowledged data always reappears as a
              retransmission. In such cases, the host <bcp14>SHOULD</bcp14> disable the
              sending of the AccECN Option for this half-connection.</t>
              <t indent="0" pn="section-3.2.3.2.2-8">If a host falls back to not sending AccECN Options, it will
              continue to process any incoming AccECN Options as normal.</t>
              <t indent="0" pn="section-3.2.3.2.2-9">Either host <bcp14>MAY</bcp14> include AccECN Options in one or more subsequent
              segments to retest whether AccECN Options can
              traverse the path.</t>
              <t indent="0" pn="section-3.2.3.2.2-10">Similarly, an AccECN endpoint <bcp14>MAY</bcp14> separately memorize which
              data packets carried an AccECN Option and disable the sending of
              AccECN Options if the loss probability of those packets is
              significantly higher than that of all other data packets in the
              same connection.</t>
            </section>
            <section numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.3.2.3">
              <name slugifiedName="name-testing-for-absence-of-the-">Testing for Absence of the AccECN Option</name>
              <t indent="0" pn="section-3.2.3.2.3-1">If the TCP Client has successfully negotiated AccECN but does
              not receive an AccECN Option on the SYN/ACK (e.g., because
              is has been stripped by a middlebox or not sent by the Server),
              the Client switches into a mode that assumes that the AccECN
              Option is not available for this half-connection.</t>
              <t indent="0" pn="section-3.2.3.2.3-2">Similarly, if the TCP Server has successfully negotiated
              AccECN but does not receive an AccECN Option on the first
              segment that acknowledges sequence space at least covering the
              ISN, it switches into a mode that assumes that the AccECN Option
              is not available for this half-connection.</t>
              <t indent="0" pn="section-3.2.3.2.3-3">While a host is in this mode that assumes incoming AccECN
              Options are not available, it <bcp14>MUST</bcp14> adopt the conservative
              interpretation of the ACE field discussed in <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/>. However, it cannot make any
              assumption about support of outgoing AccECN Options on the other
              half-connection, so it <bcp14>SHOULD</bcp14> continue to send AccECN Options
              itself (unless it has established that sending AccECN Options is
              causing packets to be blocked as in <xref target="accecn_AccECN_Option_Loss" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2.2"/>).</t>
              <t indent="0" pn="section-3.2.3.2.3-4">If a host is in the mode that assumes incoming AccECN Options
              are not available, but it receives an AccECN Option at any later
              point during the connection, this clearly indicates that AccECN
              Options are no longer blocked on the respective path, and the
              AccECN endpoint <bcp14>MAY</bcp14> switch out of the mode that assumes AccECN
              Options are not available for this half-connection.</t>
            </section>
            <section anchor="accecn_sec_zero_option" numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.3.2.4">
              <name slugifiedName="name-test-for-zeroing-of-the-acc">Test for Zeroing of the AccECN Option</name>
              <t indent="0" pn="section-3.2.3.2.4-1">For the merits of a related test for invalid initialization of the ACE
              field, see <xref target="accecn_sec_ACE_init_invalid" format="default" sectionFormat="of" derivedContent="Section 3.2.2.4"/>.</t>
              <t indent="0" pn="section-3.2.3.2.4-2"><xref target="accecn_init_counters" format="default" sectionFormat="of" derivedContent="Section 3.2.1"/> required the Data
              Receiver to initialize the r.e0b and r.e1b counters to a
              non-zero value. Therefore, in either direction the initial value
              of the EE0B field or EE1B field in an AccECN Option (if one
              exists) ought to be non-zero. If AccECN has been
              negotiated:</t>
              <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.3.2.4-3">
                <li pn="section-3.2.3.2.4-3.1">
                  <t indent="0" pn="section-3.2.3.2.4-3.1.1">the TCP Server <bcp14>MAY</bcp14> check that the initial value of the
                  EE0B field or the EE1B field is non-zero in the first
                  segment that acknowledges sequence space that at least
                  covers the ISN plus 1. If it runs a test and either initial
                  value is zero, the Server will switch into a mode that
                  ignores AccECN Options for this half-connection.</t>
                </li>
                <li pn="section-3.2.3.2.4-3.2">
                  <t indent="0" pn="section-3.2.3.2.4-3.2.1">the TCP Client <bcp14>MAY</bcp14> check that the initial value of the EE0B
                  field or the EE1B field is non-zero on the SYN/ACK. If it
                  runs a test and either initial value is zero, the Client
                  will switch into a mode that ignores AccECN Options for this
                  half-connection.</t>
                </li>
              </ul>
              <t indent="0" pn="section-3.2.3.2.4-4">While a host is in the mode that ignores AccECN Options, it
              <bcp14>MUST</bcp14> adopt the conservative interpretation of the ACE field
              discussed in <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/>.</t>
              <aside pn="section-3.2.3.2.4-5">
                <t indent="0" pn="section-3.2.3.2.4-5.1">Note that the Data Sender <bcp14>MUST NOT</bcp14> test whether the arriving
              byte counters in an initial AccECN Option have been initialized
              to specific valid values -- the above checks solely test whether
              these fields have been incorrectly zeroed. This allows hosts to
              use different initial values as an additional signalling channel
              in the future. Also note that the initial value of either field
              might be greater than its expected initial value, because the
              counters might already have been incremented. Nonetheless, the
              initial values of the counters have been chosen so that they
              cannot wrap to zero on these initial segments.</t>
              </aside>
            </section>
            <section numbered="true" removeInRFC="false" toc="exclude" pn="section-3.2.3.2.5">
              <name slugifiedName="name-consistency-between-accecn-">Consistency Between AccECN Feedback Fields</name>
              <t indent="0" pn="section-3.2.3.2.5-1">When AccECN Options are available, they ought to provide more
              unambiguous feedback. However, they supplement but do not
              replace the ACE field. An endpoint using AccECN feedback <bcp14>MUST</bcp14>
              always reconcile the information provided in the ACE field with
              that in any AccECN Option, so that the state of the ACE-related
              packet counter can be relied on if future feedback does not
              carry an AccECN Option.</t>
              <t indent="0" pn="section-3.2.3.2.5-2">If an AccECN Option is present, the s.cep counter might
              increase more than expected from the increase of the s.ceb
              counter (e.g., due to a CE-marked control packet). The
              sender's response to such a situation is out of scope, and needs
              to be dealt with in a specification that uses ECN-capable
              control packets. Theoretically, this situation could also occur
              if a middlebox mangled an AccECN Option but not the ACE field.
              However, the Data Sender has to assume that the integrity of
              AccECN Options is sound, based on the above test of the
              well-known initial values and optionally other integrity tests
              (<xref target="accecn_Integrity" format="default" sectionFormat="of" derivedContent="Section 5.3"/>).</t>
              <t indent="0" pn="section-3.2.3.2.5-3">If either endpoint detects that the s.ceb counter has
              increased but the s.cep has not (and by testing ACK coverage it
              is certain how much the ACE field has wrapped), and if there is
              no explanation other than an invalid protocol transition due to
              some form of feedback mangling, the Data Sender <bcp14>MUST</bcp14> disable
              sending ECN-capable packets for the remainder of the
              half-connection by setting the IP-ECN field in all subsequent
              packets to Not-ECT.
              </t>
            </section>
          </section>
          <section anchor="accecn_option_usage" numbered="true" removeInRFC="false" toc="include" pn="section-3.2.3.3">
            <name slugifiedName="name-usage-of-the-accecn-tcp-opt">Usage of the AccECN TCP Option</name>
            <t indent="0" pn="section-3.2.3.3-1">If a Data Receiver in AccECN mode intends to use AccECN TCP
            Options to provide feedback, the rules below determine when to
            include an AccECN TCP Option, and which fields to include, given
            other options might be competing for limited option space:</t>
            <dl newline="false" spacing="normal" indent="3" pn="section-3.2.3.3-2">
              <dt pn="section-3.2.3.3-2.1">Importance of Congestion Control:</dt>
              <dd pn="section-3.2.3.3-2.2">
                <t indent="0" pn="section-3.2.3.3-2.2.1">AccECN is for
                congestion control, which implementations <bcp14>SHOULD</bcp14> generally
                prioritize over other TCP Options when there is insufficient
                space for all the options in use.</t>
                <t indent="0" pn="section-3.2.3.3-2.2.2">If
                SACK has been negotiated <xref target="RFC2018" format="default" sectionFormat="of" derivedContent="RFC2018"/>, and the
                smallest recommended AccECN Option would leave insufficient
                space for two SACK blocks on a particular ACK, the Data
                Receiver <bcp14>MUST</bcp14> give precedence to the SACK option (total 18
                octets), because loss feedback is more critical.</t>
              </dd>
              <dt pn="section-3.2.3.3-2.3">Recommended Simple Scheme:</dt>
              <dd pn="section-3.2.3.3-2.4">
                <t indent="0" pn="section-3.2.3.3-2.4.1">The Data Receiver
                <bcp14>SHOULD</bcp14> include an AccECN TCP Option on every scheduled ACK if
                any byte counter has incremented since the last ACK. Whenever
                possible, it <bcp14>SHOULD</bcp14> include a field for every byte counter
                that has changed at some time during the connection (see
                examples later). </t>
                <t indent="0" pn="section-3.2.3.3-2.4.2">A scheduled ACK means
                an ACK that the Data Receiver would send by its regular
                delayed ACK rules. Recall that <xref target="accecn_Terminology" format="default" sectionFormat="of" derivedContent="Section 1.3"/> defines an 'ACK' as either with
                data payload or without. But the above rule is worded so that,
                in the common case when most of the data is from a Server to a
                Client, the Server only includes an AccECN TCP Option while it
                is acknowledging data from the Client.</t>
              </dd>
            </dl>
            <t indent="0" pn="section-3.2.3.3-3">When available TCP Option space is limited on particular
            packets, the recommended scheme will need to include compromises.
            To guide the implementer, the rules below are ranked in order of
            importance, but the final decision has to be
            implementation-dependent, because tradeoffs will alter as new TCP
            Options are defined and new use-cases arise.</t>
            <dl newline="false" spacing="normal" indent="3" pn="section-3.2.3.3-4">
              <dt pn="section-3.2.3.3-4.1">Necessary Option Length:</dt>
              <dd pn="section-3.2.3.3-4.2">
                <t indent="0" pn="section-3.2.3.3-4.2.1">When TCP Option space
                is limited, an AccECN TCP Option <bcp14>MAY</bcp14> be truncated to omit one
                or two fields from the end of the option, as indicated by the
                permitted variants listed in
                <xref target="accecn_Fig_TCPopttab" format="default" sectionFormat="of" derivedContent="Table 5"/>, provided that the
                counter(s) that have changed since the previous AccECN TCP
                Option are not omitted.</t>
                <t indent="0" pn="section-3.2.3.3-4.2.2">
                If there is insufficient space to include an AccECN TCP
                Option containing the counter(s) that have changed since
                the previous AccECN TCP Option, then the entire AccECN
                TCP Option <bcp14>MUST</bcp14> be omitted. (see <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>);</t>
              </dd>
              <dt pn="section-3.2.3.3-4.3">Change-Triggered AccECN TCP Options:</dt>
              <dd pn="section-3.2.3.3-4.4">
                <t indent="0" pn="section-3.2.3.3-4.4.1">If an
                arriving packet increments a different byte counter to that
                incremented by the previous packet, the Data Receiver <bcp14>SHOULD</bcp14>
                feed it back in an AccECN Option on the next scheduled ACK.
                </t>
                <t indent="0" pn="section-3.2.3.3-4.4.2">
                For the avoidance of doubt, this rule
                does not concern the arrival of control packets with no
                payload, because they cannot alter any byte counters.</t>
              </dd>
              <dt pn="section-3.2.3.3-4.5">Continual Repetition:</dt>
              <dd pn="section-3.2.3.3-4.6">
                <t indent="0" pn="section-3.2.3.3-4.6.1">Otherwise, if arriving
                packets continue to increment the same byte counter:</t>
                <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.2.3.3-4.6.2">
                  <li pn="section-3.2.3.3-4.6.2.1">
                    <t indent="0" pn="section-3.2.3.3-4.6.2.1.1">the Data Receiver <bcp14>SHOULD</bcp14> include a counter that has
                    continued to increment on the next scheduled ACK following
                    a change-triggered AccECN TCP Option;</t>
                  </li>
                  <li pn="section-3.2.3.3-4.6.2.2">
                    <t indent="0" pn="section-3.2.3.3-4.6.2.2.1">while the same counter continues to increment, it
                    <bcp14>SHOULD</bcp14> include the counter every n ACKs as consistently as
                    possible, where n can be chosen by the implementer;</t>
                  </li>
                  <li pn="section-3.2.3.3-4.6.2.3">
                    <t indent="0" pn="section-3.2.3.3-4.6.2.3.1">it <bcp14>SHOULD</bcp14> always include an AccECN Option if the r.ceb
                    counter is incrementing and it <bcp14>MAY</bcp14> include an AccECN
                    Option if r.e0b or r.e1b is incrementing;</t>
                  </li>
                  <li pn="section-3.2.3.3-4.6.2.4">
                    <t indent="0" pn="section-3.2.3.3-4.6.2.4.1">it <bcp14>SHOULD</bcp14> include each counter at least once for every
                    2^22 bytes incremented to prevent overflow during
                    continual repetition.</t>
                  </li>
                </ul>
              </dd>
            </dl>
            <t indent="0" pn="section-3.2.3.3-5">The above rules complement those in <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/>, which determine when to generate an
            ACK irrespective of whether an AccECN TCP Option is to be
            included.</t>
            <t indent="0" pn="section-3.2.3.3-6">The recommended scheme is intended as a simple way to ensure
            that all the relevant byte counters will be carried on any ACK
            that reaches the Data Sender, no matter how many pure ACKs are
            filtered or coalesced along the network path, and without
            consuming the space available for payload data with counter
            field(s) that have never changed.</t>
            <t indent="0" pn="section-3.2.3.3-7">As an example of the recommended scheme, if ECT(0) is the only
            codepoint that has ever arrived in the IP-ECN field, the Data
            Receiver will feed back an AccECN0 TCP Option with only the EE0B
            field on every packet that acknowledges new data. However, as soon
            as even one CE-marked packet arrives, on every packet that
            acknowledges new data it will start to include an option with two
            fields, EE0B and ECEB. As a second example, if the first packet to
            arrive happens to be CE marked, the Data Receiver will have to
            arbitrarily choose whether to precede the ECEB field with an EE0B
            field or an EE1B field. If it chooses, say, EE0B but it turns out
            never to receive ECT(0), it can start sending EE1B and ECEB
            instead -- it does not have to include the EE0B field if the r.e0b
            counter never changed during the connection.</t>
            <t indent="0" pn="section-3.2.3.3-8">With the recommended scheme, if the data sending direction
            switches during a connection, there can be cases where the AccECN
            TCP Option that is meant to feed back the counter values at the
            end of a volley in one direction never reaches the other peer due
            to packet loss. ACE feedback ought to be sufficient to fill this
            gap, given accurate feedback becomes moot after data transmission
            has paused.</t>
            <t indent="0" pn="section-3.2.3.3-9"><xref target="accecn_Algo_ACE_Bytes" format="default" sectionFormat="of" derivedContent="Appendix A.3"/> gives an example
            algorithm to estimate the number of marked bytes from the ACE
            field alone, if AccECN Options are not available.</t>
            <t indent="0" pn="section-3.2.3.3-10">If a host has determined that segments with AccECN Options
            always seem to be discarded somewhere along the path, it is no
            longer obliged to follow any of the rules in this section.</t>
          </section>
        </section>
      </section>
      <section anchor="accecn_Mbox_Operation" numbered="true" removeInRFC="false" toc="include" pn="section-3.3">
        <name slugifiedName="name-accecn-compliance-requireme">AccECN Compliance Requirements for TCP Proxies, Offload Engines, and Other Middleboxes</name>
        <t indent="0" pn="section-3.3-1">Given AccECN alters the TCP protocol on the wire, this section
        specifies new requirements on certain networking equipment that
        forwards TCP and inspects TCP header information.</t>
        <section numbered="true" removeInRFC="false" toc="include" pn="section-3.3.1">
          <name slugifiedName="name-requirements-for-tcp-proxie">Requirements for TCP Proxies</name>
          <t indent="0" pn="section-3.3.1-1">A large class of middleboxes split TCP connections. Such a
          middlebox would be compliant with the AccECN protocol if the TCP
          implementation on each side complied with the present AccECN
          specification and each side negotiated AccECN independently of the
          other side.</t>
        </section>
        <section anchor="accecn_middlebox_transparent_normalizers" numbered="true" removeInRFC="false" toc="include" pn="section-3.3.2">
          <name slugifiedName="name-requirements-for-transparen">Requirements for Transparent Middleboxes and TCP Normalizers</name>
          <t indent="0" pn="section-3.3.2-1">Another large class of middleboxes intervenes to some degree at
          the transport layer, but attempts to be transparent (invisible) to
          the end-to-end connection. A subset of this class of middleboxes
          attempts to 'normalize' the TCP wire protocol by checking that all
          values in header fields comply with a rather narrow interpretation of the TCP specifications that is also not always kept up to date.</t>
          <t indent="0" pn="section-3.3.2-2">A middlebox that is not normalizing the TCP protocol and does not
          itself act as a back-to-back pair of TCP endpoints (i.e., a
          middlebox that intends to be transparent or invisible at the
          transport layer) ought to forward AccECN TCP Options unaltered,
          whether or not the length value matches one of those specified in
          <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>, and whether or not the initial
          values of the byte-counter fields match those in <xref target="accecn_init_counters" format="default" sectionFormat="of" derivedContent="Section 3.2.1"/>. This is because blocking apparently
          invalid values prevents the standardized set of values from being
          extended in the future (such outdated normalizers would block updated
          hosts from using the extended AccECN standard).</t>
          <t indent="0" pn="section-3.3.2-3">A TCP normalizer is likely to block or alter an AccECN TCP Option
          if the length value or the initial values of its byte-counter fields
          do not match one of those specified in Sections <xref target="accecn_option" format="counter" sectionFormat="of" derivedContent="3.2.3"/> or <xref target="accecn_init_counters" format="counter" sectionFormat="of" derivedContent="3.2.1"/>.
          However, to comply with the present AccECN specification, a
          middlebox <bcp14>MUST NOT</bcp14> change the ACE field; or those fields of an
          AccECN Option that are currently specified in <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>; or any AccECN field covered by integrity
          protection (e.g., <xref target="RFC5925" format="default" sectionFormat="of" derivedContent="RFC5925"/>).</t>
        </section>
        <section numbered="true" removeInRFC="false" toc="include" pn="section-3.3.3">
          <name slugifiedName="name-requirements-for-tcp-ack-fi">Requirements for TCP ACK Filtering</name>
          <t indent="0" pn="section-3.3.3-1"><xref target="RFC3449" sectionFormat="of" section="5.2.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3449#section-5.2.1" derivedContent="RFC3449"/> gives best
          current practice on filtering (aka thinning or coalescing) of pure
          TCP ACKs. It advises that filtering ACKs carrying ECN feedback ought
          to preserve the correct operation of ECN feedback. As the present
          specification updates the operation of ECN feedback, this section
          discusses how an ACK filter might preserve correct operation of
          AccECN feedback as well.</t>
          <t indent="0" pn="section-3.3.3-2">The problem divides into two parts: determining if an ACK is part
          of a connection that is using AccECN and then preserving the correct
          operation of AccECN feedback:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3.3.3-3">
            <li pn="section-3.3.3-3.1">
              <t indent="0" pn="section-3.3.3-3.1.1">To determine whether a pure TCP ACK is part of an AccECN
              connection without resorting to connection tracking and per-flow
              state, a useful heuristic would be to check for a non-zero ECN
              field at the IP layer (because the ECN++ experiment only allows
              TCP pure ACKs to be ECN-capable if AccECN has been negotiated
              <xref target="I-D.ietf-tcpm-generalized-ecn" format="default" sectionFormat="of" derivedContent="ECN++"/>). This heuristic
              is simple and stateless. However, it might omit some AccECN ACKs because
AccECN can be used without ECN++. Even if a sender uses ECN++, it does not necessarily have to mark pure ACKs as ECN-capable -- only deployment experience
will tell. Also, TCP ACKs might be
              ECN-capable owing to some scheme other than AccECN,
              e.g., <xref target="RFC5690" format="default" sectionFormat="of" derivedContent="RFC5690"/> or some future standards
              action. Again, only deployment experience will tell.</t>
            </li>
            <li pn="section-3.3.3-3.2">
              <t indent="0" pn="section-3.3.3-3.2.1">The main concern with preserving correct AccECN operation
              involves leaving enough ACKs for the Data Sender to work out
              whether the 3-bit ACE field has wrapped. In the worst case, in
              feedback about a run of received packets that were all
              ECN-marked, the ACE field will wrap every 8 acknowledged
              packets. ACE field wrap might be of less concern if packets also
              carry AccECN TCP Options. However, note that logic to read an
              AccECN TCP Option is optional to implement (albeit recommended
              -- see <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>). So one end writing
              an AccECN TCP Option into a packet does not necessarily imply
              that the other end will read it.</t>
            </li>
          </ul>
          <t indent="0" pn="section-3.3.3-4">Note that the present specification of AccECN in TCP does not
          presume to rely on any of the above ACK filtering behaviour in the
          network, because it has to be robust against pre-existing network
          nodes that do not distinguish AccECN ACKs, and robust against ACK
          loss during overload more generally.</t>
        </section>
        <section numbered="true" removeInRFC="false" toc="include" pn="section-3.3.4">
          <name slugifiedName="name-requirements-for-tcp-segmen">Requirements for TCP Segmentation Offload and Large Receive Offload</name>
          <t indent="0" pn="section-3.3.4-1">Hardware to offload certain TCP processing represents another
          large class of middleboxes (even though it is often a function of a
          host's network interface and rarely in its own 'box').</t>
          <t indent="0" pn="section-3.3.4-2">Offloading can happen in the transmit path, usually referred to as
          TCP Segmentation Offload (TSO), and the receive path where it is called
          Large Receive Offload (LRO).</t>
          <t indent="0" pn="section-3.3.4-3">In the transmit direction, with AccECN, all segments created from
          the same super-segment should retain the same ACE field, which should
          make TSO straightforward.</t>
          <t indent="0" pn="section-3.3.4-4">However, with TSO hardware that supports <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>,
          the CWR bit is usually masked out on the middle and last segments.
          If applied to an AccECN segment, this would change the ACE field, and
          would be interpreted as having received numerous CE marks in the
          receive direction. Therefore, currently available TSO hardware with
          <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> support may need some minor driver changes,
          to adjust the bitmask for the first, middle, and last segments processed
          with TSO.</t>
          <t indent="0" pn="section-3.3.4-5">Initially, when Classic ECN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> and Accurate ECN flows
          coexist on the same offloading engine, the host software may need to
          work around incompatibilities (e.g., when only global configurable
          TSO TCP Flag bitmasks are available), otherwise this would cause some
          issues.</t>
          <t indent="0" pn="section-3.3.4-6">One way around this could be to only negotiate for Accurate ECN,
          but not offer a fall back to Classic ECN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>. Another way
          could be to allow TSO only as long as the CWR flag in the TCP header
          is not set -- at the cost of more processing overhead while the ACE
          field has this bit set.</t>
          <t indent="0" pn="section-3.3.4-7">For LRO in the receive direction, a different issue may get
          exposed with hardware that supports Classic ECN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</t>
          <t indent="0" pn="section-3.3.4-8">The ACE field changes with every received CE marking, so today's
          receive offloading could lead to many interrupts in high congestion
          situations. Although that would be useful (because congestion
          information is received sooner), it could also significantly
          increase processor load, particularly in scenarios such as DCTCP or
          L4S where the marking rate is generally higher.</t>
          <t indent="0" pn="section-3.3.4-9">Current offload hardware ejects a segment from the coalescing
          process whenever the TCP-ECN flags change. In data centres, it has
          been fortunate for this offload hardware that DCTCP-style feedback
          changes less often when there are long sequences of CE marks, which
          is more common with a step marking threshold (but less likely the
          more short flows are in the mix). The ACE counter approach has been
          designed so that coalescing can continue over arbitrary patterns of
          marking and only needs to stop when the counter wraps. Nonetheless,
          until the particular offload hardware in use implements this more
          efficient approach, it is likely to be more efficient for AccECN
          connections to implement this counter-style logic using software
          segmentation offload.</t>
          <t indent="0" pn="section-3.3.4-10">ECN encodes a varying signal in the ACK stream, so it is
          inevitable that offload hardware will ultimately need to handle any
          form of ECN feedback exceptionally. The ACE field has been designed
          as a counter so that it is straightforward for offload hardware to
          pass on the highest counter, and to push a segment from its cache
          before the counter wraps. The purpose of working towards
          standardized TCP-ECN feedback is to reduce the risk for hardware
          developers, who would otherwise have to guess which scheme is likely
          to become dominant.</t>
          <t indent="0" pn="section-3.3.4-11">The above process has been designed to enable a continuing
          incremental deployment path -- to more highly dynamic congestion
          control. Once offload hardware supports AccECN, it will be able to
          coalesce efficiently for any sequence of marks, instead of relying
          on the long marking sequences from step marking for efficiency. In
          the next stage, marking can evolve from a step to a ramp function.
          That in turn will allow host congestion control algorithms to
          respond faster to dynamics, while being backwards compatible with
          existing host algorithms.</t>
        </section>
      </section>
    </section>
    <section anchor="accecn_3168_updates" numbered="true" removeInRFC="false" toc="include" pn="section-4">
      <name slugifiedName="name-updates-to-rfc-3168">Updates to RFC 3168</name>
      <t indent="0" pn="section-4-1">This section clarifies which parts of RFC 3168 are updated and maps
      them to the relevant updated sections of the present AccECN specification.</t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4-2">
        <li pn="section-4-2.1">
          <t indent="0" pn="section-4-2.1.1">The whole of Section <xref target="RFC3168" sectionFormat="bare" section="6.1.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.1" derivedContent="RFC3168"/> (TCP Initialization) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> is updated by <xref target="accecn_Negotiation" format="default" sectionFormat="of" derivedContent="Section 3.1"/>
          of the present specification.</t>
        </li>
        <li pn="section-4-2.2">
          <t indent="0" pn="section-4-2.2.1">In Section <xref target="RFC3168" sectionFormat="bare" section="6.1.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.2" derivedContent="RFC3168"/> (The TCP Sender) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, all
          mentions of a congestion response to an ECN-Echo (ECE) ACK packet
          are updated by <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/> of the present
          specification to mean an increment to the sender's count of
          CE-marked packets, s.cep. And the requirements to set the CWR flag
          no longer apply, as specified in <xref target="accecn_implications_accecn_mode" format="default" sectionFormat="of" derivedContent="Section 3.1.5"/> of the present
          specification. Otherwise, the remaining requirements in Section
          <xref target="RFC3168" sectionFormat="bare" section="6.1.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.2" derivedContent="RFC3168"/> (The TCP Sender) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> still stand.</t>
          <t indent="0" pn="section-4-2.2.2">Note that <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> already updates
          a number of the requirements in Section <xref target="RFC3168" sectionFormat="bare" section="6.1.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.2" derivedContent="RFC3168"/> (The TCP Sender) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>. <xref target="RFC3168" section="6.1.2" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.2" derivedContent="RFC3168"/>
          extended
          standard TCP congestion control <xref target="RFC5681" format="default" sectionFormat="of" derivedContent="RFC5681"/> to cover
          ECN marking as well as packet drop.  Whereas, <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> enables
          experimentation with alternative responses to ECN marking, if
          specified for instance by an Experimental RFC produced by the IETF Stream. <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> also strengthened the statement that "ECT(0)
          <bcp14>SHOULD</bcp14> be used" to a "<bcp14>MUST</bcp14>" (see <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> for the details).</t>
        </li>
        <li pn="section-4-2.3">
          <t indent="0" pn="section-4-2.3.1">The whole of Section <xref target="RFC3168" sectionFormat="bare" section="6.1.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.3" derivedContent="RFC3168"/> (The TCP Receiver) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> is updated by <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/> of
          the present specification, with the exception of the last paragraph
          (about congestion response to drop and ECN in the same round trip),
          which still stands. Incidentally, this last paragraph is in the
          wrong section, because it relates to "TCP Sender" behaviour.</t>
        </li>
        <li pn="section-4-2.4">
          <t indent="0" pn="section-4-2.4.1">The following text within Section <xref target="RFC3168" sectionFormat="bare" section="6.1.5" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.5" derivedContent="RFC3168"/> (Retransmitted TCP packets) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>:</t>
          <blockquote pn="section-4-2.4.2">
            <t indent="0" pn="section-4-2.4.2.1">the TCP data receiver <bcp14>SHOULD</bcp14> ignore
          the ECN field on arriving data packets that are outside of the
          receiver's current window.</t>
          </blockquote>
          <t indent="0" pn="section-4-2.4.3">is updated by more stringent acceptability tests for any packet
          (not just data packets) in the present specification.  Specifically,
          in the normative specification of AccECN (<xref target="accecn_Spec" format="default" sectionFormat="of" derivedContent="Section 3"/>), only 'Acceptable' packets contribute to the
          ECN counters at the AccECN receiver and <xref target="accecn_Terminology" format="default" sectionFormat="of" derivedContent="Section 1.3"/> defines an Acceptable packet as one
          that passes acceptability tests equivalent in strength to those in
          both <xref target="RFC9293" format="default" sectionFormat="of" derivedContent="RFC9293"/> and <xref target="RFC5961" format="default" sectionFormat="of" derivedContent="RFC5961"/>.</t>
        </li>
        <li pn="section-4-2.5">
          <t indent="0" pn="section-4-2.5.1">Sections <xref target="RFC3168" sectionFormat="bare" section="5.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-5.2" derivedContent="RFC3168"/> (Dropped or Corrupted Packets), <xref target="RFC3168" sectionFormat="bare" section="6.1.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.1" derivedContent="RFC3168"/> (TCP Initialization), <xref target="RFC3168" sectionFormat="bare" section="6.1.4" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.4" derivedContent="RFC3168"/> (Congestion on the ACK-path), <xref target="RFC3168" sectionFormat="bare" section="6.1.5" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.5" derivedContent="RFC3168"/> (Retransmitted TCP packets), and <xref target="RFC3168" sectionFormat="bare" section="6.1.6" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-6.1.6" derivedContent="RFC3168"/> (TCP Window Probes) of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> prohibit use of ECN on
          TCP control packets and retransmissions. The present specification
          does not update that aspect of <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, but it does
          say what feedback an AccECN Data Receiver ought to provide if it
          receives an ECN-capable control packet or retransmission. This
          ensures AccECN is forward compatible with any future scheme that
          allows ECN on these packets, as provided for in <xref target="RFC8311" sectionFormat="of" section="4.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8311#section-4.3" derivedContent="RFC8311"/> and as proposed
          in <xref target="I-D.ietf-tcpm-generalized-ecn" format="default" sectionFormat="of" derivedContent="ECN++"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="accecn_Interact_Variants" numbered="true" removeInRFC="false" toc="include" pn="section-5">
      <name slugifiedName="name-interaction-with-tcp-varian">Interaction with TCP Variants</name>
      <t indent="0" pn="section-5-1">This section is informative, not normative.</t>
      <section anchor="accecn_Interaction_SYN_Cookies" numbered="true" removeInRFC="false" toc="include" pn="section-5.1">
        <name slugifiedName="name-compatibility-with-syn-cook">Compatibility with SYN Cookies</name>
        <t indent="0" pn="section-5.1-1">A TCP Server can use SYN Cookies (see <xref section="A" target="RFC4987" format="default" sectionFormat="of" derivedLink="https://rfc-editor.org/rfc/rfc4987#appendix-A" derivedContent="RFC4987"/>) to protect itself from SYN flooding attacks. It
        places minimal commonly used connection state in the SYN/ACK, and
        deliberately does not hold any state while waiting for the subsequent
        ACK (e.g., it closes the thread). Therefore, it cannot record the
        fact that it entered AccECN mode for both half-connections. Indeed, it
        cannot even remember whether it negotiated the use of Classic ECN
        <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>.</t>
        <t indent="0" pn="section-5.1-2">Nonetheless, such a Server can determine that it negotiated AccECN
        as follows. If a TCP Server using SYN Cookies supports AccECN and if
        it receives a pure ACK that acknowledges an ISN that is a valid SYN
        cookie, and if the ACK contains an ACE field with the value 0b010 to
        0b111 (decimal 2 to 7), the Server can infer the first two stages of
        the handshake:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1-3">
          <li pn="section-5.1-3.1">
            <t indent="0" pn="section-5.1-3.1.1">the TCP Client has to have requested AccECN support on the
            SYN;</t>
          </li>
          <li pn="section-5.1-3.2">
            <t indent="0" pn="section-5.1-3.2.1">then, even though the Server kept no state, it has to have
            confirmed that it supported AccECN.</t>
          </li>
        </ul>
        <t indent="0" pn="section-5.1-4">Therefore, the Server can switch itself into AccECN mode, and
        continue as if it had never forgotten that it switched itself into
        AccECN mode earlier.</t>
        <t indent="0" pn="section-5.1-5">If the pure ACK that acknowledges a SYN cookie contains an ACE
        field with the value 0b000 or 0b001, these values indicate that the
        TCP Client did not request support for AccECN; therefore, the Server
        does not enter AccECN mode for this connection. Further, 0b001 on the
        ACK implies that the Server sent an ECN-capable SYN/ACK, which was
        marked CE in the network, and the non-AccECN TCP Client fed this back
        by setting ECE on the ACK of the SYN/ACK.</t>
      </section>
      <section anchor="accecn_Interaction_Other" numbered="true" removeInRFC="false" toc="include" pn="section-5.2">
        <name slugifiedName="name-compatibility-with-tcp-expe">Compatibility with TCP Experiments and Common TCP Options</name>
        <t indent="0" pn="section-5.2-1">AccECN is compatible (at least on paper) with the most commonly
        used TCP Options: MSS, timestamp, window scaling, SACK, and TCP-AO. It
        is also compatible with Multipath TCP (MPTCP <xref target="RFC8684" format="default" sectionFormat="of" derivedContent="RFC8684"/>)
        and the experimental TCP Option TCP Fast Open (TFO <xref target="RFC7413" format="default" sectionFormat="of" derivedContent="RFC7413"/>). AccECN is friendly to all these protocols,
        because space for TCP Options is particularly scarce on the SYN, where
        AccECN consumes zero additional header space.</t>
        <t indent="0" pn="section-5.2-2">   Because option space is limited, <xref target="accecn_option_usage" format="default" sectionFormat="of" derivedContent="Section 3.2.3.3"/>
specifies which AccECN Option fields are more important to include and provides guidance on the relative importance of AccECN Options against other TCP Options.
</t>
        <t indent="0" pn="section-5.2-3">Implementers of TFO need to take careful note of the recommendation
        in <xref target="accecn_ACE_3rdACK" format="default" sectionFormat="of" derivedContent="Section 3.2.2.1"/>. That section recommends that,
        if the TCP Client has successfully negotiated AccECN, when
        acknowledging the SYN/ACK, even if it has data to send, it sends a
        pure ACK immediately before the data. Then it can reflect the IP-ECN
        field of the SYN/ACK on this pure ACK, which allows the Server to
        detect ECN mangling. Note that, as specified in <xref target="accecn_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2"/>, any data on the SYN (SYN=1, ACK=0) is not
        included in any of the byte counters held locally for each ECN
        marking, nor in the AccECN Option on the wire.</t>
        <t indent="0" pn="section-5.2-4">AccECN feedback is compatible with the ECN++ experiment <xref target="I-D.ietf-tcpm-generalized-ecn" format="default" sectionFormat="of" derivedContent="ECN++"/>, which allows TCP
        control packets and retransmissions to be ECN-capable (<xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/> was updated by <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/> to permit
        such experiments). AccECN is likely to inherently support any
        experiment with ECN-capable packets, because it feeds back the
        contents of the ECN field mechanistically, without judging whether or not a
        packet ought to use the ECN capability (<xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/>). This specification does not discuss
        implementing AccECN alongside <xref target="RFC5562" format="default" sectionFormat="of" derivedContent="RFC5562"/>, which was an
        earlier experimental protocol with narrower scope than ECN++ and a
        5-way handshake.</t>
      </section>
      <section anchor="accecn_Integrity" numbered="true" removeInRFC="false" toc="include" pn="section-5.3">
        <name slugifiedName="name-compatibility-with-feedback">Compatibility with Feedback Integrity Mechanisms</name>
        <t indent="0" pn="section-5.3-1">Three alternative mechanisms are available to assure the integrity
        of ECN and/or loss signals. AccECN is compatible with any of these
        approaches:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.3-2">
          <li pn="section-5.3-2.1">
            <t indent="0" pn="section-5.3-2.1.1">The Data Sender can test the integrity of the receiver's ECN
            (or loss) feedback by occasionally setting the IP-ECN field to a
            value normally only set by the network (and/or deliberately
            leaving a sequence number gap). Then it can test whether the Data
            Receiver's feedback faithfully reports what it expects (similar to
            paragraph 2 of <xref target="RFC3168" sectionFormat="of" section="20.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3168#section-20.2" derivedContent="RFC3168"/>). Unlike
            the ECN-nonce <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>, this approach does not
            waste the ECT(1) codepoint in the IP header, it does not require
            standardization, and it does not rely on misbehaving receivers
            volunteering to reveal feedback information that allows them to be
            detected. However, setting the CE mark by the sender might conceal
            actual congestion feedback from the network and therefore ought to
            only be done sparingly.</t>
          </li>
          <li pn="section-5.3-2.2">
            <t indent="0" pn="section-5.3-2.2.1">Networks generate congestion signals when they are becoming
            congested, so networks are more likely than Data Senders to be
            concerned about the integrity of the receiver's feedback of these
            signals. A network can enforce a congestion response to its ECN
            markings (or packet losses) using congestion exposure (ConEx)
            audit <xref target="RFC7713" format="default" sectionFormat="of" derivedContent="RFC7713"/>. Whether the receiver or a
            downstream network is suppressing congestion feedback, or the
            sender is unresponsive to the feedback, or both, ConEx audit can
            neutralize any advantage that any of these three parties would
            otherwise gain. </t>
            <t indent="0" pn="section-5.3-2.2.2">ConEx is an experimental
            change to the Data Sender that would be most useful when combined
            with AccECN. Without AccECN, the ConEx behaviour of a Data Sender
            would have to be more conservative than would be necessary if it
            had the accurate feedback of AccECN.</t>
          </li>
          <li pn="section-5.3-2.3">
            <t indent="0" pn="section-5.3-2.3.1">The Standards Track TCP authentication option (TCP-AO <xref target="RFC5925" format="default" sectionFormat="of" derivedContent="RFC5925"/>) can be used to detect any tampering with
            AccECN feedback between the Data Receiver and the Data Sender
            (whether malicious or accidental). The AccECN fields are immutable
            end to end, so they are amenable to TCP-AO protection, which
            covers TCP Options by default. However, TCP-AO is often too
            brittle to use on many end-to-end paths, where middleboxes can
            make verification fail in their attempts to improve performance or
            security, e.g., Network Address Translation (NAT) and Network Address Port Translation (NAPT), resegmentation, or shifting the sequence space.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="accecn_Properties" numbered="true" removeInRFC="false" toc="include" pn="section-6">
      <name slugifiedName="name-summary-protocol-properties">Summary: Protocol Properties</name>
      <t indent="0" pn="section-6-1">This section is informative, not normative. It describes how well the
      protocol satisfies the agreed requirements for a more Accurate ECN
      feedback protocol <xref target="RFC7560" format="default" sectionFormat="of" derivedContent="RFC7560"/>.</t>
      <dl newline="false" spacing="normal" indent="3" pn="section-6-2">
        <dt pn="section-6-2.1">Accuracy:</dt>
        <dd pn="section-6-2.2">From each ACK, the Data Sender can infer the
          number of new CE-marked segments since the previous ACK. This
          provides better accuracy on CE feedback than Classic ECN. In
          addition, if an AccECN Option is present (not blocked by the network
          path), the number of bytes marked with CE, ECT(1), and ECT(0) are
          provided.</dd>
        <dt pn="section-6-2.3">Overhead:</dt>
        <dd pn="section-6-2.4">The AccECN scheme is divided into two parts.
          The essential feedback part reuses the three flags already assigned to ECN in the
          TCP header. The supplementary feedback part adds an additional TCP Option
          consuming up to 11 bytes. However, no TCP Option space is consumed
          in the SYN.</dd>
        <dt pn="section-6-2.5">Ordering:</dt>
        <dd pn="section-6-2.6">The order in which marks arrive at the Data
          Receiver is preserved in AccECN feedback, because the Data Receiver
          is expected to send an ACK immediately whenever a different mark
          arrives.</dd>
        <dt pn="section-6-2.7">Timeliness:</dt>
        <dd pn="section-6-2.8">While the same ECN markings are arriving
          continually at the Data Receiver, it can defer ACKs as TCP does
          normally, but it will immediately send an ACK as soon as a different
          ECN marking arrives.</dd>
        <dt pn="section-6-2.9">Timeliness vs Overhead:</dt>
        <dd pn="section-6-2.10">Change-Triggered ACKs are
          intended to enable latency-sensitive uses of ECN feedback by
          capturing the timing of transitions but not wasting resources while
          the state of the signalling system is stable. Within the constraints
          of the change-triggered ACK rules, the receiver can control how
          frequently it sends AccECN TCP Options and therefore to some extent
          it can control the overhead induced by AccECN.</dd>
        <dt pn="section-6-2.11">Resilience:</dt>
        <dd pn="section-6-2.12">All information is provided based on
          counters. Therefore if ACKs are lost, the counters on the first ACK
          following the losses allow the Data Sender to immediately recover
          the number of the ECN markings that it missed. If data or ACKs
          are reordered, stale congestion information can be identified and
          ignored.</dd>
        <dt pn="section-6-2.13">Resilience against Bias:</dt>
        <dd pn="section-6-2.14">Because feedback is based on
          repetition of counters, random losses do not remove any information,
          they only delay it. Therefore, even though some ACKs are
          change-triggered, random losses will not alter the proportions of
          the different ECN markings in the feedback.</dd>
        <dt pn="section-6-2.15">Resilience vs Overhead:</dt>
        <dd pn="section-6-2.16">If space is limited in some
          segments (e.g., because more options are needed on some
          segments, such as the SACK option after loss), the Data Receiver can
          send AccECN Options less frequently or truncate fields that have not
          changed, usually down to as little as 5 bytes.</dd>
        <dt pn="section-6-2.17">Resilience vs Timeliness and Ordering:</dt>
        <dd pn="section-6-2.18">Ordering
          information and the timing of transitions cannot be communicated in
          three cases: i) during ACK loss; ii) if something on the path strips
          AccECN Options; or iii) if the Data Receiver is unable to support
          Change-Triggered ACKs. Following ACK reordering, the Data Sender can
          reconstruct the order in which feedback was sent, but not until all
          the missing feedback has arrived.</dd>
        <dt pn="section-6-2.19">Complexity:</dt>
        <dd pn="section-6-2.20">An AccECN implementation solely involves
          simple counter increments, some modulo arithmetic to communicate the
          least significant bits and allow for wrap, and some heuristics for
          safety against fields cycling due to prolonged periods of ACK loss.
          Each host needs to maintain eight additional counters. The hosts
          have to apply some additional tests to detect tampering by
          middleboxes, but in general the protocol is simple to understand and
          implement and requires few cycles per packet to
          execute.</dd>
        <dt pn="section-6-2.21">Integrity:</dt>
        <dd pn="section-6-2.22">AccECN is compatible with at least three
          approaches that can assure the integrity of ECN feedback. If AccECN
          Options are stripped, the resolution of the feedback is degraded, but
          the integrity of this degraded feedback can still be assured.</dd>
        <dt pn="section-6-2.23">Backward Compatibility:</dt>
        <dd pn="section-6-2.24">
          <t indent="0" pn="section-6-2.24.1">If only one endpoint supports
          the AccECN scheme, it will fall back to the most advanced ECN
          feedback scheme supported by the other end.</t>
          <t indent="0" pn="section-6-2.24.2">If AccECN Options are stripped by a middlebox,
          AccECN still provides basic congestion feedback in the ACE field.
          Further, AccECN can be used to detect mangling of the IP-ECN field;
          mangling of the TCP-ECN flags; blocking of ECT-marked segments; and
          blocking of segments carrying an AccECN Option. It can detect these
          conditions during TCP's three-way handshake so that it can fall back to operation
          without ECN and/or operation without AccECN Options.</t>
        </dd>
        <dt pn="section-6-2.25">Forward Compatibility:</dt>
        <dd pn="section-6-2.26">The behaviour of endpoints and
          middleboxes is carefully defined for all reserved or currently
          unused codepoints in the scheme. Then, the designers of security
          devices can understand which currently unused values might appear in the
          future. So, even if they choose to treat such values as anomalous
          while they are not widely used, any blocking will at least be under
          policy control, not hard-coded. Then, if previously unused values
          start to appear on the Internet (or in standards), such policies
          could be quickly reversed.</dd>
      </dl>
    </section>
    <section anchor="accecn_IANA_Considerations" numbered="true" removeInRFC="false" toc="include" pn="section-7">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-7-1">This document reassigns the TCP header flag at bit offset 7 to the
      AccECN protocol. This bit was previously called the Nonce Sum (NS) flag
      <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>, but RFC 3540 has been reclassified as Historic
      <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>. The flag is now defined as the following
      in the "TCP Header Flags" registry in the "Transmission Control Protocol
      (TCP) Parameters" registry group:</t>
      <table align="center" pn="table-6">
        <name slugifiedName="name-tcp-header-flag-reassignmen">TCP Header Flag Reassignment</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Bit</th>
            <th align="left" colspan="1" rowspan="1">Name</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
            <th align="left" colspan="1" rowspan="1">Assignment Notes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">7</td>
            <td align="left" colspan="1" rowspan="1">AE (Accurate ECN)</td>
            <td align="left" colspan="1" rowspan="1">RFC 9768</td>
            <td align="left" colspan="1" rowspan="1">Previously used as NS (Nonce Sum) by <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>, which is now
        Historic <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/></td>
          </tr>
        </tbody>
      </table>
      <t indent="0" pn="section-7-3">This document also defines two new TCP Options for AccECN
      from the TCP Option space. These values
      are defined as the following in the "TCP Option Kind Numbers" registry
      in the "Transmission Control Protocol (TCP) Parameters" registry group:</t>
      <table align="center" pn="table-7">
        <name slugifiedName="name-new-tcp-option-assignments">New TCP Option Assignments</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Kind</th>
            <th align="left" colspan="1" rowspan="1">Length</th>
            <th align="left" colspan="1" rowspan="1">Meaning</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">172</td>
            <td align="left" colspan="1" rowspan="1">N</td>
            <td align="left" colspan="1" rowspan="1">Accurate ECN Order 0 (AccECN0)</td>
            <td align="left" colspan="1" rowspan="1">RFC 9768</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">174</td>
            <td align="left" colspan="1" rowspan="1">N</td>
            <td align="left" colspan="1" rowspan="1">Accurate ECN Order 1 (AccECN1)</td>
            <td align="left" colspan="1" rowspan="1">RFC 9768</td>
          </tr>
        </tbody>
      </table>
      <t indent="0" pn="section-7-5">Early experimental implementations of the two AccECN Options used
      experimental option 254 per <xref target="RFC6994" format="default" sectionFormat="of" derivedContent="RFC6994"/> with the 16-bit
      magic numbers 0xACC0 and 0xACC1, respectively, for Order 0 and 1, as
      allocated in the IANA "TCP/UDP Experimental Option Experiment Identifiers (TCP/UDP ExIDs)" registry. Even earlier experimental implementations used
      the single magic number 0xACCE (16 bits). Uses of these experimental
      options <bcp14>SHOULD</bcp14> migrate to use the new option kinds (172 and 174).</t>
    </section>
    <section anchor="accecn_Security_Considerations" numbered="true" removeInRFC="false" toc="include" pn="section-8">
      <name slugifiedName="name-security-and-privacy-consid">Security and Privacy Considerations</name>
      <t indent="0" pn="section-8-1">If ever the supplementary feedback part of AccECN that is based on one of the new
      AccECN TCP Options is unusable (due for example to middlebox
      interference), the essential feedback part of AccECN's congestion feedback offers
      only limited resilience to long runs of ACK loss (see <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/>). These problems are unlikely to be due to
      malicious intervention (because if an attacker could strip a TCP Option
      or discard a long run of ACKs, it could wreak other arbitrary havoc).
      However, it would be of concern if AccECN's resilience could be
      indirectly compromised during a flooding attack. AccECN is still
      considered safe though, because if AccECN Options are not present, the
      AccECN Data Sender is then required to switch to more conservative
      assumptions about wrap of congestion indication counters (see <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/> and <xref target="accecn_Algo_ACE_Wrap" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>).</t>
      <t indent="0" pn="section-8-2"><xref target="accecn_Interaction_SYN_Cookies" format="default" sectionFormat="of" derivedContent="Section 5.1"/> describes how a TCP
      Server can negotiate AccECN and use the SYN cookie method for mitigating
      SYN flooding attacks.</t>
      <t indent="0" pn="section-8-3">There is concern that ECN feedback could be altered or suppressed,
      particularly because a misbehaving Data Receiver could increase its own
      throughput at the expense of others. AccECN is compatible with the three
      schemes known to assure the integrity of ECN feedback (see <xref target="accecn_Integrity" format="default" sectionFormat="of" derivedContent="Section 5.3"/> for details). If AccECN Options are stripped
      by an incorrectly implemented middlebox, the resolution of the feedback
      will be degraded, but the integrity of this degraded information can
      still be assured. Assuring that Data Senders respond appropriately to
      ECN feedback is possible, but the scope of the present document is
      confined to the feedback protocol and excludes the response to this
      feedback.</t>
      <t indent="0" pn="section-8-4">In <xref target="accecn_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3"/>, a Data Sender is allowed to ignore
      an unrecognized TCP AccECN Option length and read as many whole 3-octet
      fields from it as possible up to a maximum of 3, treating the remainder
      as padding. This opens up a potential covert channel of up to 29B (40 -
      (2+3*3)). However, it is really an overt channel (not hidden) and it
      is no different from the use of unknown TCP Options with unknown option
      lengths in general. Therefore, where this is of concern, it can already
      be adequately mitigated by regular TCP normalizer technology (see <xref target="accecn_middlebox_transparent_normalizers" format="default" sectionFormat="of" derivedContent="Section 3.3.2"/>).</t>
      <t indent="0" pn="section-8-5">There is a potential concern that a Data Receiver could deliberately
      omit AccECN Options pretending that they had been stripped by a
      middlebox. 
   Currently, there is no known way for a receiver to take
   advantage of this behaviour, which seems to always degrade its own
   performance.
However, the concern is mentioned here for
      completeness.</t>
      <t indent="0" pn="section-8-6">The AccECN protocol is not believed to introduce any new privacy
      concerns, because it merely counts and feeds back signals at the
      transport layer that had already been visible at the IP layer. A covert
      channel can be used to compromise privacy. However, as explained above,
      undefined TCP Options in general open up such channels, and common
      techniques are available to close them off.</t>
      <t indent="0" pn="section-8-7">A generic privacy concern of any new protocol is that for a while it
will be used by a small population of hosts, and thus those hosts could
be more easily identified.  However, it is expected that AccECN will become available
      in more operating systems over time and that it will eventually be turned on by default.
 Thus, an individual identification of a particular user is
      less of a concern than the fingerprinting of specific versions of
      operation systems. However, the latter can be done using different
      means independent of Accurate ECN.</t>
    </section>
  </middle>
  <back>
    <displayreference target="I-D.ietf-tcpm-generalized-ecn" to="ECN++"/>
    <references pn="section-9">
      <name slugifiedName="name-references">References</name>
      <references pn="section-9.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2018" target="https://www.rfc-editor.org/info/rfc2018" quoteTitle="true" derivedAnchor="RFC2018">
          <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 indent="0">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" quoteTitle="true" derivedAnchor="RFC2119">
          <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 indent="0">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="RFC2883" target="https://www.rfc-editor.org/info/rfc2883" quoteTitle="true" derivedAnchor="RFC2883">
          <front>
            <title>An Extension to the Selective Acknowledgement (SACK) Option for TCP</title>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="J. Mahdavi" initials="J." surname="Mahdavi"/>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="M. Podolsky" initials="M." surname="Podolsky"/>
            <date month="July" year="2000"/>
            <abstract>
              <t indent="0">This note defines an extension of the Selective Acknowledgement (SACK) Option for TCP. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2883"/>
          <seriesInfo name="DOI" value="10.17487/RFC2883"/>
        </reference>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" quoteTitle="true" derivedAnchor="RFC3168">
          <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 indent="0">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" quoteTitle="true" derivedAnchor="RFC5961">
          <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 indent="0">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="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <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 indent="0">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="RFC9293" target="https://www.rfc-editor.org/info/rfc9293" quoteTitle="true" derivedAnchor="RFC9293">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t indent="0">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 pn="section-9.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="I-D.ietf-tcpm-generalized-ecn" target="https://datatracker.ietf.org/doc/html/draft-ietf-tcpm-generalized-ecn-17" quoteTitle="true" derivedAnchor="ECN++">
          <front>
            <title>ECN++: Adding Explicit Congestion Notification (ECN) to TCP Control Packets</title>
            <author fullname="Marcelo Bagnulo" initials="M." surname="Bagnulo">
              <organization showOnFrontPage="true">Universidad Carlos III de Madrid</organization>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization showOnFrontPage="true">Independent</organization>
            </author>
            <date day="21" month="April" year="2025"/>
            <abstract>
              <t indent="0">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>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-generalized-ecn-17"/>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="Mandalari18" target="http://www.it.uc3m.es/amandala/ecn++/ecn_commag_2018.html" quoteTitle="true" derivedAnchor="Mandalari18">
          <front>
            <title>Measuring ECN++: Good News for ++, Bad News for ECN over Mobile</title>
            <author fullname="Anna Mandalari" initials="A." surname="Mandalari">
              <organization showOnFrontPage="true">UC3M</organization>
            </author>
            <author fullname="Andra Lutu" initials="A." surname="Lutu">
              <organization showOnFrontPage="true">Simula</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
              <organization showOnFrontPage="true">Simula</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Marcelo Bagnulo" initials="M." surname="Bagnulo">
              <organization showOnFrontPage="true">UC3M</organization>
              <address>
                <postal>
                  <street/>
                  <city/>
                  <region/>
                  <code/>
                  <country/>
                </postal>
                <phone/>
                <email/>
                <uri/>
              </address>
            </author>
            <author fullname="Özgü Alay" initials="Ö." surname="Alay">
              <organization showOnFrontPage="true">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=""/>
        </reference>
        <reference anchor="RFC3449" target="https://www.rfc-editor.org/info/rfc3449" quoteTitle="true" derivedAnchor="RFC3449">
          <front>
            <title>TCP Performance Implications of Network Path Asymmetry</title>
            <author fullname="H. Balakrishnan" initials="H." surname="Balakrishnan"/>
            <author fullname="V. Padmanabhan" initials="V." surname="Padmanabhan"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="M. Sooriyabandara" initials="M." surname="Sooriyabandara"/>
            <date month="December" year="2002"/>
            <abstract>
              <t indent="0">This document describes TCP performance problems that arise because of asymmetric effects. These problems arise in several access networks, including bandwidth-asymmetric networks and packet radio subnetworks, for different underlying reasons. However, the end result on TCP performance is the same in both cases: performance often degrades significantly because of imperfection and variability in the ACK feedback from the receiver to the sender. The document details several mitigations to these effects, which have either been proposed or evaluated in the literature, or are currently deployed in networks. These solutions use a combination of local link- layer techniques, subnetwork, and end-to-end mechanisms, consisting of: (i) techniques to manage the channel used for the upstream bottleneck link carrying the ACKs, typically using header compression or reducing the frequency of TCP ACKs, (ii) techniques to handle this reduced ACK frequency to retain the TCP sender's acknowledgment-triggered self- clocking and (iii) techniques to schedule the data and ACK packets in the reverse direction to improve performance in the presence of two-way traffic. Each technique is described, together with known issues, and recommendations for use. A summary of the recommendations is provided at the end of the document. 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="69"/>
          <seriesInfo name="RFC" value="3449"/>
          <seriesInfo name="DOI" value="10.17487/RFC3449"/>
        </reference>
        <reference anchor="RFC3540" target="https://www.rfc-editor.org/info/rfc3540" quoteTitle="true" derivedAnchor="RFC3540">
          <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 indent="0">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="RFC4987" target="https://www.rfc-editor.org/info/rfc4987" quoteTitle="true" derivedAnchor="RFC4987">
          <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 indent="0">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" quoteTitle="true" derivedAnchor="RFC5562">
          <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 indent="0">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 indent="0">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" quoteTitle="true" derivedAnchor="RFC5681">
          <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 indent="0">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" quoteTitle="true" derivedAnchor="RFC5690">
          <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 indent="0">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="RFC5925" target="https://www.rfc-editor.org/info/rfc5925" quoteTitle="true" derivedAnchor="RFC5925">
          <front>
            <title>The TCP Authentication Option</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <author fullname="R. Bonica" initials="R." surname="Bonica"/>
            <date month="June" year="2010"/>
            <abstract>
              <t indent="0">This document specifies the TCP Authentication Option (TCP-AO), which obsoletes the TCP MD5 Signature option of RFC 2385 (TCP MD5). TCP-AO specifies the use of stronger Message Authentication Codes (MACs), protects against replays even for long-lived TCP connections, and provides more details on the association of security with TCP connections than TCP MD5. TCP-AO is compatible with either a static Master Key Tuple (MKT) configuration or an external, out-of-band MKT management mechanism; in either case, TCP-AO also protects connections when using the same MKT across repeated instances of a connection, using traffic keys derived from the MKT, and coordinates MKT changes between endpoints. The result is intended to support current infrastructure uses of TCP MD5, such as to protect long-lived connections (as used, e.g., in BGP and LDP), and to support a larger set of MACs with minimal other system and operational changes. TCP-AO uses a different option identifier than TCP MD5, even though TCP-AO and TCP MD5 are never permitted to be used simultaneously. TCP-AO supports IPv6, and is fully compatible with the proposed requirements for the replacement of TCP MD5. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5925"/>
          <seriesInfo name="DOI" value="10.17487/RFC5925"/>
        </reference>
        <reference anchor="RFC6679" target="https://www.rfc-editor.org/info/rfc6679" quoteTitle="true" derivedAnchor="RFC6679">
          <front>
            <title>Explicit Congestion Notification (ECN) for RTP over UDP</title>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="P. O'Hanlon" initials="P." surname="O'Hanlon"/>
            <author fullname="K. Carlberg" initials="K." surname="Carlberg"/>
            <date month="August" year="2012"/>
            <abstract>
              <t indent="0">This memo specifies how Explicit Congestion Notification (ECN) can be used with the Real-time Transport Protocol (RTP) running over UDP, using the RTP Control Protocol (RTCP) as a feedback mechanism. It defines a new RTCP Extended Report (XR) block for periodic ECN feedback, a new RTCP transport feedback message for timely reporting of congestion events, and a Session Traversal Utilities for NAT (STUN) extension used in the optional initialisation method using Interactive Connectivity Establishment (ICE). Signalling and procedures for negotiation of capabilities and initialisation methods are also defined. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6679"/>
          <seriesInfo name="DOI" value="10.17487/RFC6679"/>
        </reference>
        <reference anchor="RFC6994" target="https://www.rfc-editor.org/info/rfc6994" quoteTitle="true" derivedAnchor="RFC6994">
          <front>
            <title>Shared Use of Experimental TCP Options</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <date month="August" year="2013"/>
            <abstract>
              <t indent="0">This document describes how the experimental TCP option codepoints can concurrently support multiple TCP extensions, even within the same connection, using a new IANA TCP experiment identifier. This approach is robust to experiments that are not registered and to those that do not use this sharing mechanism. It is recommended for all new TCP options that use these codepoints.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6994"/>
          <seriesInfo name="DOI" value="10.17487/RFC6994"/>
        </reference>
        <reference anchor="RFC7141" target="https://www.rfc-editor.org/info/rfc7141" quoteTitle="true" derivedAnchor="RFC7141">
          <front>
            <title>Byte and Packet Congestion Notification</title>
            <author fullname="B. Briscoe" initials="B." surname="Briscoe"/>
            <author fullname="J. Manner" initials="J." surname="Manner"/>
            <date month="February" year="2014"/>
            <abstract>
              <t indent="0">This document provides recommendations of best current practice for dropping or marking packets using any active queue management (AQM) algorithm, including Random Early Detection (RED), BLUE, Pre- Congestion Notification (PCN), and newer schemes such as CoDel (Controlled Delay) and PIE (Proportional Integral controller Enhanced). We give three strong recommendations: (1) packet size should be taken into account when transports detect and respond to congestion indications, (2) packet size should not be taken into account when network equipment creates congestion signals (marking, dropping), and therefore (3) in the specific case of RED, the byte- mode packet drop variant that drops fewer small packets should not be used. This memo updates RFC 2309 to deprecate deliberate preferential treatment of small packets in AQM algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="41"/>
          <seriesInfo name="RFC" value="7141"/>
          <seriesInfo name="DOI" value="10.17487/RFC7141"/>
        </reference>
        <reference anchor="RFC7323" target="https://www.rfc-editor.org/info/rfc7323" quoteTitle="true" derivedAnchor="RFC7323">
          <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 indent="0">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 indent="0">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" quoteTitle="true" derivedAnchor="RFC7413">
          <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 indent="0">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="RFC7560" target="https://www.rfc-editor.org/info/rfc7560" quoteTitle="true" derivedAnchor="RFC7560">
          <front>
            <title>Problem Statement and Requirements for Increased Accuracy in Explicit Congestion Notification (ECN) Feedback</title>
            <author fullname="M. Kuehlewind" initials="M." role="editor" surname="Kuehlewind"/>
            <author fullname="R. Scheffenegger" initials="R." surname="Scheffenegger"/>
            <author fullname="B. Briscoe" initials="B." surname="Briscoe"/>
            <date month="August" year="2015"/>
            <abstract>
              <t indent="0">Explicit Congestion Notification (ECN) is a mechanism where network nodes can mark IP packets, instead of dropping them, to indicate congestion to the endpoints. An ECN-capable receiver will feed this information back to the sender. ECN is specified for TCP in such a way that it can only feed back one congestion signal per Round-Trip Time (RTT). In contrast, ECN for other transport protocols, such as RTP/UDP and SCTP, is specified with more accurate ECN feedback. Recent new TCP mechanisms (like Congestion Exposure (ConEx) or Data Center TCP (DCTCP)) need more accurate ECN feedback in the case where more than one marking is received in one RTT. This document specifies requirements for an update to the TCP protocol to provide more accurate ECN feedback.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7560"/>
          <seriesInfo name="DOI" value="10.17487/RFC7560"/>
        </reference>
        <reference anchor="RFC7713" target="https://www.rfc-editor.org/info/rfc7713" quoteTitle="true" derivedAnchor="RFC7713">
          <front>
            <title>Congestion Exposure (ConEx) Concepts, Abstract Mechanism, and Requirements</title>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <author fullname="B. Briscoe" initials="B." surname="Briscoe"/>
            <date month="December" year="2015"/>
            <abstract>
              <t indent="0">This document describes an abstract mechanism by which senders inform the network about the congestion recently encountered by packets in the same flow. Today, network elements at any layer may signal congestion to the receiver by dropping packets or by Explicit Congestion Notification (ECN) markings, and the receiver passes this information back to the sender in transport-layer feedback. The mechanism described here enables the sender to also relay this congestion information back into the network in-band at the IP layer, such that the total amount of congestion from all elements on the path is revealed to all IP elements along the path, where it could, for example, be used to provide input to traffic management. This mechanism is called Congestion Exposure, or ConEx. The companion document, "Congestion Exposure (ConEx) Concepts and Use Cases" (RFC 6789), provides the entry point to the set of ConEx documentation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7713"/>
          <seriesInfo name="DOI" value="10.17487/RFC7713"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" quoteTitle="true" derivedAnchor="RFC8257">
          <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 indent="0">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="RFC8311" target="https://www.rfc-editor.org/info/rfc8311" quoteTitle="true" derivedAnchor="RFC8311">
          <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 indent="0">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="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" quoteTitle="true" derivedAnchor="RFC8511">
          <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 indent="0">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="RFC8684" target="https://www.rfc-editor.org/info/rfc8684" quoteTitle="true" derivedAnchor="RFC8684">
          <front>
            <title>TCP Extensions for Multipath Operation with Multiple Addresses</title>
            <author fullname="A. Ford" initials="A." surname="Ford"/>
            <author fullname="C. Raiciu" initials="C." surname="Raiciu"/>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="O. Bonaventure" initials="O." surname="Bonaventure"/>
            <author fullname="C. Paasch" initials="C." surname="Paasch"/>
            <date month="March" year="2020"/>
            <abstract>
              <t indent="0">TCP/IP communication is currently restricted to a single path per connection, yet multiple paths often exist between peers. The simultaneous use of these multiple paths for a TCP/IP session would improve resource usage within the network and thus improve user experience through higher throughput and improved resilience to network failure.</t>
              <t indent="0">Multipath TCP provides the ability to simultaneously use multiple paths between peers. This document presents a set of extensions to traditional TCP to support multipath operation. The protocol offers the same type of service to applications as TCP (i.e., a reliable bytestream), and it provides the components necessary to establish and use multiple TCP flows across potentially disjoint paths.</t>
              <t indent="0">This document specifies v1 of Multipath TCP, obsoleting v0 as specified in RFC 6824, through clarifications and modifications primarily driven by deployment experience.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8684"/>
          <seriesInfo name="DOI" value="10.17487/RFC8684"/>
        </reference>
        <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" quoteTitle="true" derivedAnchor="RFC9000">
          <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 indent="0">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="RFC9040" target="https://www.rfc-editor.org/info/rfc9040" quoteTitle="true" derivedAnchor="RFC9040">
          <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 indent="0">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="RFC9260" target="https://www.rfc-editor.org/info/rfc9260" quoteTitle="true" derivedAnchor="RFC9260">
          <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 indent="0">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 indent="0">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 indent="0">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 indent="0">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="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" quoteTitle="true" derivedAnchor="RFC9330">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <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 indent="0">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 indent="0">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="RFC9438" target="https://www.rfc-editor.org/info/rfc9438" quoteTitle="true" derivedAnchor="RFC9438">
          <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 indent="0">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 indent="0">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="RoCEv2" target="https://www.infinibandta.org/ibta-specification/" quoteTitle="true" derivedAnchor="RoCEv2">
          <front>
            <title>InfiniBand Architecture Specification</title>
            <author>
              <organization showOnFrontPage="true">InfiniBand Trade Association</organization>
            </author>
            <date year="2020"/>
          </front>
          <refcontent>Volume 1, Release 1.4</refcontent>
        </reference>
      </references>
    </references>
    <section anchor="accecn_Algo_Examples" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a">
      <name slugifiedName="name-example-algorithms">Example Algorithms</name>
      <t indent="0" pn="section-appendix.a-1">This appendix is informative, not normative. It gives example
      algorithms that would satisfy the normative requirements of the AccECN
      protocol. However, implementers are free to choose other ways to
      satisfy the requirements.</t>
      <section anchor="accecn_Algo_Option_Coding" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.1">
        <name slugifiedName="name-example-algorithm-to-encode">Example Algorithm to Encode/Decode the AccECN Option</name>
        <t indent="0" pn="section-appendix.a.1-1">The
        example algorithms below show how a Data Receiver in AccECN mode could
        encode its CE byte counter r.ceb into the ECEB field within an AccECN
        TCP Option, and how a Data Sender in AccECN mode could decode the ECEB
        field into its byte counter s.ceb. The other counters for bytes marked
        ECT(0) and ECT(1) in an AccECN Option would be similarly encoded and
        decoded.</t>
        <t indent="0" pn="section-appendix.a.1-2">It is assumed that each local byte counter is an unsigned integer
        greater than 24b (probably 32b), and that the following constant has
        been assigned:</t>
        <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.1-3">   DIVOPT = 2^24</sourcecode>
        <t indent="0" pn="section-appendix.a.1-4">Every time a CE-marked data segment arrives, the Data Receiver
        increments its local value of r.ceb by the size of the TCP Data.
        Whenever it sends an ACK with an AccECN Option, the value it writes
        into the ECEB field is</t>
        <sourcecode type="pseucocode" markers="false" pn="section-appendix.a.1-5">   ECEB = r.ceb % DIVOPT</sourcecode>
        <t indent="0" pn="section-appendix.a.1-6">where '%' is the remainder operator.</t>
        <t indent="0" pn="section-appendix.a.1-7">On the arrival of an AccECN Option, the Data Sender first makes
        sure the ACK has not been superseded in order to avoid winding the
        s.ceb counter backwards. It uses the TCP acknowledgement number and
        any SACK options <xref target="RFC2018" format="default" sectionFormat="of" derivedContent="RFC2018"/> to calculate newlyAckedB,
        the amount of new data that the ACK acknowledges in bytes (newlyAckedB
        can be zero but not negative). If newlyAckedB is zero, either the ACK
        has been superseded or CE-marked packet(s) without data could have
        arrived. To break the tie for the latter case, the Data Sender could
        use timestamps <xref target="RFC7323" format="default" sectionFormat="of" derivedContent="RFC7323"/> (if present) to work out
        newlyAckedT, the amount of new time that the ACK acknowledges. If the
        Data Sender determines that the ACK has been superseded, it ignores the
        AccECN Option. Otherwise, the Data Sender calculates the minimum
        non-negative difference d.ceb between the ECEB field and its local
        s.ceb counter, using modulo arithmetic as follows:</t>
        <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.1-8">   if ((newlyAckedB &gt; 0) || (newlyAckedT &gt; 0)) {
       d.ceb = (ECEB + DIVOPT - (s.ceb % DIVOPT)) % DIVOPT
       s.ceb += d.ceb
   }
</sourcecode>
        <t indent="0" pn="section-appendix.a.1-9">For example, if s.ceb is 33,554,433 and ECEB is 1461 (both
        decimal), then</t>
        <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.1-10">   s.ceb % DIVOPT = 1
   d.ceb = (1461 + 2^24 - 1) % 2^24
         = 1460
   s.ceb = 33,554,433 + 1460
         = 33,555,893
</sourcecode>
        <t indent="0" pn="section-appendix.a.1-11">In practice, an implementation might use heuristics to guess the
        feedback in missing ACKs. Then when it subsequently receives feedback,
        it might find that it needs to correct its earlier heuristics as part
        of the decoding process. The above decoding process does not include
        any such heuristics.</t>
      </section>
      <section anchor="accecn_Algo_ACE_Wrap" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.2">
        <name slugifiedName="name-example-algorithm-for-safet">Example Algorithm for Safety Against Long Sequences of ACK Loss</name>
        <t indent="0" pn="section-appendix.a.2-1">The example algorithms below show how a Data Receiver in AccECN
        mode could encode its CE packet counter r.cep into the ACE field, and
        how the Data Sender in AccECN mode could decode the ACE field into its
        s.cep counter. The Data Sender's algorithm includes code to
        heuristically detect a long enough unbroken string of ACK losses that
        could have concealed a cycle of the congestion counter in the ACE
        field of the next ACK to arrive.</t>
        <t indent="0" pn="section-appendix.a.2-2">Two variants of the algorithm are given: i) a more conservative
        variant for a Data Sender to use if it detects that AccECN Options are
        not available (see <xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/> and <xref target="accecn_Mbox_Interference" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2"/>); and ii) a less conservative
        variant that is feasible when complementary information is available
        from AccECN Options.</t>
        <section numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.2.1">
          <name slugifiedName="name-safety-algorithm-without-th">Safety Algorithm Without the AccECN Option</name>
          <t indent="0" pn="section-appendix.a.2.1-1">It is assumed that each local packet counter is a sufficiently
          sized unsigned integer (probably 32b) and that the following
          constant has been assigned:</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.1-2">   DIVACE = 2^3</sourcecode>
          <t indent="0" pn="section-appendix.a.2.1-3">Every time an Acceptable CE-marked packet arrives (<xref target="accecn_sec_ACE_feedback" format="default" sectionFormat="of" derivedContent="Section 3.2.2.2"/>), the Data Receiver increments
          its local value of r.cep by 1. It repeats the same value of ACE in
          every subsequent ACK until the next CE marking arrives, where</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.1-4">   ACE = r.cep % DIVACE.</sourcecode>
          <t indent="0" pn="section-appendix.a.2.1-5">If the Data Sender received an earlier value of the counter that
          had been delayed due to ACK reordering, it might incorrectly
          calculate that the ACE field had wrapped. Therefore, on the arrival
          of every ACK, the Data Sender ensures the ACK has not been
          superseded using the TCP acknowledgement number, any SACK options,
          and timestamps (if available) to calculate newlyAckedB, as in <xref target="accecn_Algo_Option_Coding" format="default" sectionFormat="of" derivedContent="Appendix A.1"/>. If the ACK has not been
          superseded, the Data Sender calculates the minimum difference d.cep
          between the ACE field and its local s.cep counter, using modulo
          arithmetic as follows:</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.1-6">   if ((newlyAckedB &gt; 0) || (newlyAckedT &gt; 0))
       d.cep = (ACE + DIVACE - (s.cep % DIVACE)) % DIVACE
</sourcecode>
          <t indent="0" pn="section-appendix.a.2.1-7"><xref target="accecn_ACE_Safety" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5"/> expects the Data Sender to
          assume that the ACE field cycled if it is the safest likely case
          under prevailing conditions. The 3-bit ACE field in an arriving ACK
          could have cycled and become ambiguous to the Data Sender if a
          sequence of ACKs goes missing that covers a stream of data long
          enough to contain 8 or more CE marks. We use the word 'missing'
          rather than 'lost', because some or all the missing ACKs might
          arrive eventually, but out of order. Even if some of the missing
          ACKs were piggybacked on data (i.e., not pure ACKs)
          retransmissions will not repair the lost AccECN information, because
          AccECN requires retransmissions to carry the latest AccECN counters,
          not the original ones.</t>
          <t indent="0" pn="section-appendix.a.2.1-8">The phrase 'under prevailing conditions' allows for
          implementation-dependent interpretation. A Data Sender might take
          account of the prevailing size of data segments and the prevailing
          CE marking rate just before the sequence of missing ACKs. However,
          we shall start with the simplest algorithm, which assumes segments
          are all full-sized, and ultra-conservatively it assumes that ECN
          marking was 100% on the forward path when ACKs on the reverse path
          started to all be dropped. Specifically, if newlyAckedB is the
          amount of data that an ACK acknowledges since the previous ACK, then
          the Data Sender could assume that this acknowledges newlyAckedPkt
          full-sized segments, where newlyAckedPkt = newlyAckedB/MSS. Then it
          could assume that the ACE field incremented by</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.1-9">    dSafer.cep = newlyAckedPkt - ((newlyAckedPkt - d.cep) % DIVACE)
</sourcecode>
          <t indent="0" pn="section-appendix.a.2.1-10">For example, imagine an ACK acknowledges newlyAckedPkt=9 more
          full-size segments than any previous ACK, and that ACE increments by
          a minimum of 2 CE marks (d.cep=2). The above formula indicates that
          it would still be safe to assume 2 CE marks (because 9 - ((9-2) % 8)
          = 2). However, if ACE increases by a minimum of 2 but acknowledges
          10 full-sized segments, then it would be necessary to assume that
          there could have been 10 CE marks (because 10 - ((10-2) % 8) =
          10).</t>
          <t indent="0" pn="section-appendix.a.2.1-11">Note that checks would need to be added to the above pseudocode
          for (d.cep &gt; newlyAckedPkt), which could occur if newlyAckedPkt
          had been wrongly estimated using an inappropriate packet size.</t>
          <t indent="0" pn="section-appendix.a.2.1-12">ACKs that acknowledge a large stretch of packets might be common
          in data centres to achieve a high packet rate or might be due to ACK
          thinning by a middlebox. In these cases, cycling of the ACE field
          would often appear to have been possible, so the above algorithm
          would be overly conservative, leading to a false high marking rate and
          poor performance. Therefore, it would be reasonable to only use
          dSafer.cep rather than d.cep if the moving average of newlyAckedPkt
          was well below 8.</t>
          <t indent="0" pn="section-appendix.a.2.1-13">Implementers could build in more heuristics to estimate
          a prevailing average segment size and prevailing ECN marking. For
          instance, newlyAckedPkt in the above formula could be replaced with
          newlyAckedPktHeur = newlyAckedPkt*p*MSS/s, where s is the prevailing
          segment size and p is the prevailing ECN marking probability.
          However, ultimately, if TCP's ECN feedback becomes inaccurate, it
          still has loss detection to fall back on. Therefore, it would seem
          safe to implement a simple algorithm, rather than a perfect one.</t>
          <t indent="0" pn="section-appendix.a.2.1-14">The simple algorithm for dSafer.cep above requires no monitoring
          of prevailing conditions and it would still be safe if, for example,
          segments were on average at least 5% of a full-sized segment as long as ECN
          marking was 5% or less. Assuming it was used, the Data Sender would
          increment its packet counter as follows:</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.1-15">   s.cep += dSafer.cep</sourcecode>
          <t indent="0" pn="section-appendix.a.2.1-16">If missing acknowledgement numbers arrive later (due to
          reordering), <xref target="accecn_ACE_Safety_S" format="default" sectionFormat="of" derivedContent="Section 3.2.2.5.2"/> says "the Data
          Sender <bcp14>MAY</bcp14> attempt to neutralize the effect of any action it took
          based on a conservative assumption that it later found to be
          incorrect". To do this, the Data Sender would have to store the
          values of all the relevant variables whenever it made assumptions,
          so that it could re-evaluate them later. Given this could become
          complex and it is not required, we do not attempt to provide an
          example of how to do this.</t>
        </section>
        <section numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.2.2">
          <name slugifiedName="name-safety-algorithm-with-the-a">Safety Algorithm With the AccECN Option</name>
          <t indent="0" pn="section-appendix.a.2.2-1">When AccECN Options are available on the ACKs before and after
          the possible sequence of ACK losses, if the Data Sender only needs
          CE-marked bytes, it will have sufficient information in AccECN
          Options without needing to process the ACE field. If for some reason
          it needs CE-marked packets, if dSafer.cep is different from d.cep,
          it can determine whether d.cep is likely to be a safe enough
          estimate by checking whether the average marked segment size (s =
          d.ceb/d.cep) is less than the MSS (where d.ceb is the amount of
          newly CE-marked bytes -- see <xref target="accecn_Algo_Option_Coding" format="default" sectionFormat="of" derivedContent="Appendix A.1"/>). Specifically, it could use
          the following algorithm:</t>
          <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.2.2-2">   SAFETY_FACTOR = 2
   if (dSafer.cep &gt; d.cep) {
       if (d.ceb &lt;= MSS * d.cep) {  % Same as (s &lt;= MSS), but no DBZ
          sSafer = d.ceb/dSafer.cep
          if (sSafer &lt; MSS/SAFETY_FACTOR)
              dSafer.cep = d.cep    % d.cep is a safe enough estimate
       } % else
           % No need for else; dSafer.cep is already correct,
           % because d.cep must have been too small
   }
</sourcecode>
          <t indent="0" pn="section-appendix.a.2.2-3">The chart below shows when the above algorithm will
replace dSafer.cep with d.cep as a safe enough estimate of the number of CE-marked packets:</t>
          <artwork align="left" pn="section-appendix.a.2.2-4">
                 ^
           sSafer|
                 |
              MSS+
                 |
                 |         dSafer.cep
                 |                  is
MSS/SAFETY_FACTOR+--------------+    safest
                 |              |
                 | d.cep is safe|
                 |    enough    |
                 +--------------------&gt;
                               MSS     s
</artwork>
          <t indent="0" pn="section-appendix.a.2.2-5">The following examples give the reasoning behind the algorithm,
          assuming MSS=1460 :</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.a.2.2-6">
            <li pn="section-appendix.a.2.2-6.1">
              <t indent="0" pn="section-appendix.a.2.2-6.1.1">if d.cep=0, dSafer.cep=8, and d.ceb=1460, then s=infinity and
              sSafer=182.5.</t>
              <t indent="0" pn="section-appendix.a.2.2-6.1.2">Therefore, even though the
              average size of 8 data segments is unlikely to have been as
              small as MSS/8, d.cep cannot have been correct, because it would
              imply an average segment size greater than the MSS.</t>
            </li>
            <li pn="section-appendix.a.2.2-6.2">
              <t indent="0" pn="section-appendix.a.2.2-6.2.1">if d.cep=2, dSafer.cep=10, and d.ceb=1460, then s=730 and
              sSafer=146.</t>
              <t indent="0" pn="section-appendix.a.2.2-6.2.2">Therefore d.cep is safe
              enough, because the average size of 10 data segments is unlikely
              to have been as small as MSS/10.</t>
            </li>
            <li pn="section-appendix.a.2.2-6.3">
              <t indent="0" pn="section-appendix.a.2.2-6.3.1">if d.cep=7, dSafer.cep=15, and d.ceb=10200, then s=1457 and
              sSafer=680.</t>
              <t indent="0" pn="section-appendix.a.2.2-6.3.2">Therefore d.cep is safe
              enough, because the average data segment size is more likely to
              have been just less than one MSS, rather than below MSS/2.</t>
            </li>
          </ul>
          <t indent="0" pn="section-appendix.a.2.2-7">If pure ACKs were allowed to be ECN-capable, missing ACKs would
          be far less likely. However, because <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>
          currently precludes this, the above algorithm assumes that pure ACKs
          are not ECN-capable.</t>
        </section>
      </section>
      <section anchor="accecn_Algo_ACE_Bytes" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.3">
        <name slugifiedName="name-example-algorithm-to-estima">Example Algorithm to Estimate Marked Bytes from Marked Packets</name>
        <t indent="0" pn="section-appendix.a.3-1">If AccECN Options are not available, the Data Sender can only decode the ACE field as a number of marked packets. Every time an ACK
        arrives, to convert the number of CE markings into an estimate of CE-marked bytes, it needs
        an average of the segment size, s_ave. Then it can add or subtract
        s_ave from the value of d.ceb as the value of d.cep increments or
        decrements. Some possible ways to calculate s_ave are outlined below.
        The precise details will depend on why an estimate of marked bytes is
        needed.</t>
        <t indent="0" pn="section-appendix.a.3-2">The implementation could keep a record of the byte numbers of all
        the boundaries between packets in flight (including control packets),
        and recalculate s_ave on every ACK. However, it would be simpler to
        merely maintain a counter packets_in_flight for the number of packets
        in flight (including control packets), which is reset once per RTT.
        Either way, it would estimate s_ave as:</t>
        <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.3-3">   s_ave ~= flightsize / packets_in_flight,</sourcecode>
        <t indent="0" pn="section-appendix.a.3-4">where flightsize is the variable that TCP already maintains for the
        number of bytes in flight and '~=' means 'approximately equal to'. To
        avoid floating point arithmetic, it could right-bit-shift by
        lg(packets_in_flight), where lg() means log base 2.</t>
        <t indent="0" pn="section-appendix.a.3-5">An alternative would be to maintain an exponentially weighted
        moving average (EWMA) of the segment size:</t>
        <sourcecode type="pseudocode" markers="false" pn="section-appendix.a.3-6">   s_ave = a * s + (1-a) * s_ave,</sourcecode>
        <t indent="0" pn="section-appendix.a.3-7">where a is the decay constant for the EWMA. However, then it is
        necessary to choose a good value for this constant, which ought to
        depend on the number of packets in flight. Also the decay constant
        needs to be power of two to avoid floating point arithmetic.</t>
      </section>
      <section anchor="accecn_Algo_Not-ECT" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.a.4">
        <name slugifiedName="name-example-algorithm-to-count-">Example Algorithm to Count Not-ECT Bytes</name>
        <t indent="0" pn="section-appendix.a.4-1">A Data Sender in AccECN mode can infer the amount of TCP payload
        data arriving at the receiver marked Not-ECT from the difference
        between the amount of newly ACKed data and the sum of the bytes with
        the other three markings, d.ceb, d.e0b, and d.e1b.</t>
        <t indent="0" pn="section-appendix.a.4-2">For this approach to be precise, it has to be assumed that spurious
        (unnecessary) retransmissions do not lead to double counting. This
        assumption is currently correct, given that RFC 3168 requires that the
        Data Sender mark retransmitted segments as Not-ECT. However, the
        converse is not true; necessary retransmissions will result in
        undercounting.</t>
        <t indent="0" pn="section-appendix.a.4-3">However, such precision is unlikely to be necessary. The only known
        use of a count of Not-ECT marked bytes is to test whether equipment on
        the path is clearing the ECN field (perhaps due to an outdated
        attempt to clear, or bleach, what used to be the IPv4 ToS byte or the
        IPv6 Traffic Class field). To detect bleaching, it will be sufficient
        to detect whether nearly all bytes arrive marked as Not-ECT. Therefore,
        there ought to be no need to keep track of the details of
        retransmissions.</t>
      </section>
    </section>
    <section anchor="accecn_flags_rationale" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-rationale-for-usage-of-tcp-">Rationale for Usage of TCP Header Flags</name>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b.1">
        <name slugifiedName="name-three-tcp-header-flags-in-t">Three TCP Header Flags in the SYN-SYN/ACK Handshake</name>
        <t indent="0" pn="section-appendix.b.1-1">AccECN uses a rather unorthodox approach to negotiate the highest
        version TCP-ECN feedback scheme that both ends support, as justified
        below. It follows from the original TCP-ECN capability negotiation
        <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, in which the Client set the 2 least
        significant of the original reserved flags in the TCP header, and fell
        back to no support for ECN if the Server responded with the 2 flags
        cleared, which had previously been the default.</t>
        <t indent="0" pn="section-appendix.b.1-2">Classic ECN used header flags rather than a TCP Option because it
        was considered more efficient to use a header flag for 1 bit of
        feedback per ACK, and this bit could be overloaded to indicate support
        for Classic ECN during the handshake. During the development of ECN, 1
        bit crept up to 2, in order to deliver the feedback reliably and to
        work round some broken hosts that reflected the reserved flags during
        the handshake.</t>
        <t indent="0" pn="section-appendix.b.1-3">In order to be backward compatible with RFC 3168, AccECN continues
        this approach, using the 3rd least significant TCP header flag that
        had previously been allocated for the ECN-nonce (now Historic). Then,
        whatever form of Server an AccECN Client encounters, the connection
        can fall back to the highest version of feedback protocol that both
        ends support, as explained in <xref target="accecn_Negotiation" format="default" sectionFormat="of" derivedContent="Section 3.1"/>.</t>
        <t indent="0" pn="section-appendix.b.1-4">If AccECN capability negotiation had used the more orthodox approach of a TCP Option, it would
still have had to set the two ECN flags in the main TCP header to be able to fall back to Classic ECN <xref target="RFC3168" format="default" sectionFormat="of" derivedContent="RFC3168"/>, or to disable ECN support, without another round
        of negotiation. Then AccECN would also have had to handle all the
        different ways that Servers currently respond to settings of the ECN
        flags in the main TCP header, including all of the conflicting cases
        where a Server might have said it supported one approach in the flags
        and another approach in a new TCP Option. And AccECN would have had to
        deal with all of the additional possibilities where a middlebox might
        have mangled the ECN flags, or removed TCP Options. Thus, usage of the
        3rd reserved TCP header flag simplified the protocol.</t>
        <t indent="0" pn="section-appendix.b.1-5">The third flag was used in a way that could be distinguished from
        the ECN-nonce, in case any nonce deployment was encountered. Previous
        usage of this flag for the ECN-nonce was integrated into the original
        ECN negotiation. This further justified the third flag's use for AccECN,
        because a non-ECN usage of this flag would have had to use it as a
        separate single bit, rather than in combination with the other 2 ECN
        flags.</t>
        <t indent="0" pn="section-appendix.b.1-6">Indeed, having overloaded the original uses of these three flags
        for its handshake, AccECN overloads all three bits again as a 3-bit
        counter.</t>
      </section>
      <section numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b.2">
        <name slugifiedName="name-four-codepoints-in-the-syn-">Four Codepoints in the SYN/ACK</name>
        <t indent="0" pn="section-appendix.b.2-1">Of the eight possible codepoints that the three TCP-ECN header flags can
        indicate on the SYN/ACK, four already indicated earlier (or broken)
        versions of ECN support, one now being Historic. In the early design of
        AccECN, an AccECN Server could use only 2 of the 4 remaining
        codepoints. They both indicated AccECN support, but one fed back that
        the SYN had arrived marked as CE. Even though ECN support on a SYN is
        not yet on the Standards Track, the idea is for either end to act as a
        mechanistic reflector, so that future capabilities can be unilaterally
        deployed without requiring 2-ended deployment (justified in <xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/>).</t>
        <t indent="0" pn="section-appendix.b.2-2">During traversal testing, it was discovered that the IP-ECN field in
        the SYN was mangled on a non-negligible proportion of paths. Therefore,
        it was necessary to allow the SYN/ACK to feed all four IP-ECN
        codepoints that the SYN could arrive with back to the Client. Without
        this, the Client could not know whether to disable ECN for the
        connection due to mangling of the IP-ECN field (also explained in
        <xref target="accecn_demb_reflector" format="default" sectionFormat="of" derivedContent="Section 2.5"/>). This development consumed the
        remaining two codepoints on the SYN/ACK that had been reserved for
        future use by AccECN in earlier draft versions of this document.</t>
      </section>
      <section anchor="accecn_space_evolution" numbered="true" removeInRFC="false" toc="include" pn="section-appendix.b.3">
        <name slugifiedName="name-space-for-future-evolution">Space for Future Evolution</name>
        <t indent="0" pn="section-appendix.b.3-1">Despite availability of usable TCP header space being extremely
        scarce, the AccECN protocol has taken all possible steps to ensure
        that there is space to negotiate possible future variants of the
        protocol, either if a variant of AccECN is required, or if a
        completely different ECN feedback approach is needed.</t>
        <dl newline="false" spacing="normal" indent="3" pn="section-appendix.b.3-2">
          <dt pn="section-appendix.b.3-2.1">Future AccECN variants:</dt>
          <dd pn="section-appendix.b.3-2.2">
            <t indent="0" pn="section-appendix.b.3-2.2.1">When the AccECN capability
            is negotiated during TCP's three-way handshake, the rows in <xref target="accecn_Tab_Negotiation" format="default" sectionFormat="of" derivedContent="Table 2"/> tagged as 'Nonce' and 'Broken'
            in the column for the capability of node B are unused by any
            current protocol defined in the RFC Series. These could be used by TCP
            Servers in the future to indicate a variant of the AccECN protocol. In
            recent measurement studies in which the response of large numbers
            of Servers to an AccECN SYN has been tested, e.g., <xref target="Mandalari18" format="default" sectionFormat="of" derivedContent="Mandalari18"/>, a very small number of SYN/ACKs arrive
            with the pattern tagged as 'Nonce', and a small but more
            significant number arrive with the pattern tagged as 'Broken'. The
            'Nonce' pattern could be a sign that a few Servers have
            implemented the ECN-nonce <xref target="RFC3540" format="default" sectionFormat="of" derivedContent="RFC3540"/>, which has now
            been reclassified as Historic <xref target="RFC8311" format="default" sectionFormat="of" derivedContent="RFC8311"/>, or it
            could be the random result of some unknown middlebox behaviour.
            The greater prevalence of the 'Broken' pattern suggests that some
            instances still exist of the broken code that reflects the
            reserved flags on the SYN.</t>
            <t indent="0" pn="section-appendix.b.3-2.2.2">The requirement
            not to reject unexpected initial values of the ACE counter (in the
            main TCP header) in the last paragraph of <xref target="accecn_sec_ACE_init_invalid" format="default" sectionFormat="of" derivedContent="Section 3.2.2.4"/> ensures that three unused
            codepoints on the ACK of the SYN/ACK, six unused values on the first
            SYN=0 data packet from the Client, and seven unused values on the first
            SYN=0 data packet from the Server could be used to declare future
            variants of the AccECN protocol. The word 'declare' is used rather
            than 'negotiate' because, at this late stage in the three-way handshake, it would
            be too late for a negotiation between the endpoints to be
            completed. A similar requirement not to reject unexpected initial
            values in AccECN TCP Options (<xref target="accecn_sec_zero_option" format="default" sectionFormat="of" derivedContent="Section 3.2.3.2.4"/>) is for the same purpose. If
            traversal of AccECN TCP Options were reliable, this would have
            enabled a far wider range of future variation of the whole AccECN
            protocol. Nonetheless, it could be used to reliably negotiate a
            wide range of variation in the semantics of the AccECN Option.</t>
          </dd>
          <dt pn="section-appendix.b.3-2.3">Future non-AccECN variants:</dt>
          <dd pn="section-appendix.b.3-2.4">
            <t indent="0" pn="section-appendix.b.3-2.4.1">Five codepoints out of
            the eight possible in the three TCP header flags used by AccECN are unused
            on the initial SYN (in the order (AE,CWR,ECE)): (0,0,1), (0,1,0),
            (1,0,0), (1,0,1), (1,1,0). <xref target="accecn_sec_forward_compat" format="default" sectionFormat="of" derivedContent="Section 3.1.3"/> ensures that the installed
            base of AccECN Servers will all assume these are equivalent to
            AccECN negotiation with (1,1,1) on the SYN. These codepoints would
            not allow fall-back to Classic ECN support for a Server that did
            not understand them, but this approach ensures they are available
            in the future, perhaps for uses other than ECN alongside the AccECN
            scheme. All possible combinations of SYN/ACK could be used in
            response except either (0,0,0) or reflection of the same values
            sent on the SYN. </t>
            <t indent="0" pn="section-appendix.b.3-2.4.2">In order to extend AccECN
            or ECN in the future, other ways could be resorted to, although their
            traversal properties are likely to be inferior. They include a new
            TCP Option; using the remaining reserved flags in the main TCP
            header (preferably extending the 3-bit combinations used by AccECN
            to 4-bit combinations, rather than burning one bit for just one
            state); a non-zero urgent pointer in combination with the URG flag
            cleared; or some other unexpected combination of fields yet to be
            invented.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="accecn_Acknowledgements" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t indent="0" pn="section-appendix.c-1">We want to thank <contact fullname="Koen De Schepper"/>, <contact fullname="Praveen Balasubramanian"/>, <contact fullname="Michael       Welzl"/>, <contact fullname="Gorry Fairhurst"/>, <contact fullname="David Black"/>, <contact fullname="Spencer Dawkins"/>,
      <contact fullname="Michael Scharf"/>, <contact fullname="Michael       Tüxen"/>, <contact fullname="Yuchung Cheng"/>, <contact fullname="Kenjiro Cho"/>, <contact fullname="Olivier Tilmans"/>,
      <contact fullname="Ilpo Järvinen"/>, <contact fullname="Neal       Cardwell"/>, <contact fullname="Yoshifumi Nishida"/>, <contact fullname="Martin Duke"/>, <contact fullname="Jonathan Morton"/>,
      <contact fullname="Vidhi Goel"/>, <contact fullname="Alex Burr"/>,
      <contact fullname="Markku Kojo"/>, <contact fullname="Grenville       Armitage"/> and <contact fullname="Wes Eddy"/> for their input and
      discussion. The idea of using the three ECN-related TCP flags as one
      field for more accurate TCP-ECN feedback was first introduced in the
      re-ECN protocol that was the ancestor of ConEx.</t>
      <t indent="0" pn="section-appendix.c-2">The following contributed implementations of AccECN that validated
      and helped to improve this specification:</t>
      <dl newline="false" spacing="normal" indent="3" pn="section-appendix.c-3">
        <dt pn="section-appendix.c-3.1">Linux:</dt>
        <dd pn="section-appendix.c-3.2">
          <t indent="0" pn="section-appendix.c-3.2.1"><contact fullname="Mirja Kühlewind"/>, <contact fullname="Ilpo Järvinen"/>, <contact fullname="Neal           Cardwell"/>, and <contact fullname="Chia-Yu Chang"/></t>
        </dd>
        <dt pn="section-appendix.c-3.3">FreeBSD:</dt>
        <dd pn="section-appendix.c-3.4">
          <t indent="0" pn="section-appendix.c-3.4.1"><contact fullname="Richard Scheffenegger"/></t>
        </dd>
        <dt pn="section-appendix.c-3.5">Apple OSs:</dt>
        <dd pn="section-appendix.c-3.6">
          <t indent="0" pn="section-appendix.c-3.6.1"><contact fullname="Vidhi Goel"/></t>
        </dd>
      </dl>
      <t indent="0" pn="section-appendix.c-4"><contact fullname="Bob Briscoe"/> was part-funded by Apple Inc, the Comcast Innovation
      Fund, the European Community under its Seventh Framework Programme
      through the Reducing Internet Transport Latency (RITE) project
      (ICT-317700) and through the Trilogy 2 project (ICT-317756), and the
      Research Council of Norway through the TimeIn project. The views
      expressed here are solely those of the authors.</t>
      <t indent="0" pn="section-appendix.c-5"><contact fullname="Mirja Kühlewind"/> was partly supported by the European Commission
      under Horizon 2020 grant agreement no. 688421 Measurement and
      Architecture for a Middleboxed Internet (MAMI), and by the Swiss State
      Secretariat for Education, Research, and Innovation under contract no.
      15.0268. This support does not imply endorsement.</t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.d">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author fullname="Bob Briscoe" initials="B." surname="Briscoe">
        <organization showOnFrontPage="true">Independent</organization>
        <address>
          <postal>
            <country>United Kingdom</country>
          </postal>
          <email>ietf@bobbriscoe.net</email>
          <uri>http://bobbriscoe.net/</uri>
        </address>
      </author>
      <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
        <organization showOnFrontPage="true">Ericsson</organization>
        <address>
          <postal>
            <country>Germany</country>
          </postal>
          <email>ietf@kuehlewind.net</email>
        </address>
      </author>
      <author fullname="Richard Scheffenegger" initials="R." surname="Scheffenegger">
        <organization showOnFrontPage="true">NetApp</organization>
        <address>
          <postal>
            <city>Vienna</city>
            <country>Austria</country>
          </postal>
          <email>Richard.Scheffenegger@netapp.com</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
