<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.14 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-tsvwg-udp-ecn-02" category="info" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="udp-ecn">Configuring UDP Sockets for ECN for Common Platforms</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-tsvwg-udp-ecn-02"/>
    <author fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Transport and Services Working Group</workgroup>
    <keyword>udp</keyword>
    <keyword>ecn</keyword>
    <abstract>
      <?line 50?>

<t>Explicit Congestion Notification (ECN) applies to all transport protocols in
principle. However, it had limited deployment for UDP until QUIC became widely
adopted. As a result, documentation of UDP socket APIs for ECN on various
platforms is sparse. This document records the results of experimenting with
these APIs in order to get ECN working on UDP for Chromium on Apple, Linux, and
Windows platforms.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://tsvwg.github.io/udp-ecn/draft-ietf-tsvwg-udp-ecn.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-tsvwg-udp-ecn/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Transport and Services Working Group Working Group mailing list (<eref target="mailto:tsvwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/tsvwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/tsvwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/tsvwg/udp-ecn"/>.</t>
    </note>
  </front>
  <middle>
    <?line 59?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC3168"/> reserves two bits in the IP header for Explicit Congestion
Notification (ECN), which provides network feedback to endpoint congestion
controllers. This has historically mostly been relevant to TCP (<xref target="RFC9293"/>),
where any incoming ECN codepoints are internally consumed by the kernel, and
therefore imply no application interface except enabling and disabling the
capability.</t>
      <t>The Stream Control Transport Protocol (SCTP) (<xref target="RFC9260"/>) has long supported
ECN in its design. SCTP is sometimes carried over DTLS and UDP (<xref target="RFC8261"/>).
In principle, user-space implementers might have leveraged UDP ECN APIs to
deliver ECN codepoints between SCTP and the UDP socket. The author is not aware
of any such efforts.</t>
      <t><xref target="RFC6679"/> defines ECN over RTP over UDP. The author is aware of a research
implementation, but cannot confirm any commercial deployments.</t>
      <t>However, QUIC <xref target="RFC9000"/> runs over UDP and has seen wider deployment than
SCTP. The Low Latency, Low Loss, Scalable Throughput (L4S) experiment
(<xref target="RFC9330"/>) and QUIC have combined to increase interest in ECN over UDP.</t>
      <t>The Chromium Projects (<xref target="CHROMIUM"/>) provide a widely-deployed protocol library
that includes QUIC. An effort to provide ECN support for QUIC on the many
platforms on which Chromium is deployed revealed that many ECN-related UDP
socket interfaces are poorly documented.</t>
      <t>This informational document provides a record of that experience, to encourage
further support for ECN in other QUIC implementations, and indeed any consumer
of ECN codepoints that operates over UDP. It is not a standards-track document
and does not bind platforms to any API, or suggest any such API.</t>
      <t>Many socket APIs continue to reference the "ToS (Type of Service) byte" even
though <xref target="RFC2474"/> obsoleted that 25 years ago. That 8-bit field now contains a
6-bit Differentiated Services Code Point (DSCP), in addition to the ECN bits.</t>
      <t>This document focuses on the APIs for the C and C++ languages. Other languages
are likely to have different syntax and capabilities.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>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"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document is not a general tutorial on UDP socket programming, and assumes
familiarity with basic socket concepts like binding, socket options, and
common system error codes.</t>
    </section>
    <section anchor="receiving-ecn-codepoints">
      <name>Receiving ECN codepoints</name>
      <t>Network devices can change the ECN codepoint in the IP header. Since this
feedback is required at the packet sender, the packet receiver needs to extract
this codepoint from the UDP socket in order to report to the sender.</t>
      <t>There are two components to this: setting the socket to report incoming ECN
marks, and retrieving the value for each incoming packet.</t>
      <section anchor="setting-the-socket-to-report-incoming-ecn-codepoints">
        <name>Setting the socket to report incoming ECN codepoints</name>
        <section anchor="linux-apple-and-freebsd">
          <name>Linux, Apple and FreeBSD</name>
          <t>To report ECN, applications set a socket option to true using a setsockopt()
call.</t>
          <t>IPv6 sockets require a socket option of level IPPROTO_IPV6 and name
IPV6_RECVTCLASS.</t>
          <t>IPv4 sockets require a socket option of level IPPROTO_IP and name
IP_RECVTOS.</t>
          <t>For dual-stack sockets, on Linux hosts the application sets both the
IPV6_RECVTCLASS and IP_RECVTOS options to receive ECN codepoints on all incoming
packets. On Apple and FreeBSD hosts, the application only sets the
IPPROTO_IPV6-level socket option with name IPV6_RECVTCLASS to receive codepoints
for both v4 and v6; setting an IPPROTO_IP-level socket option on an IPv6 socket
results in an error. In particular this applies to the IPPROTO_IP-level socket
option with the name IP_RECVTOS.</t>
          <t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-POSIX"/>.</t>
        </section>
        <section anchor="windows">
          <name>Windows</name>
          <t>Windows documentation recommends using the function WSASetRecvIPEcn() to
enable ECN reporting regardless of the IP version. This function dates to
Windows 10 Build 20348, according to <xref target="WINDOWS-DOC"/>.</t>
          <t>However, this can also be accomplished by calling setsockopt() and using
options of level IPPROTO_IP and name IP_RECVECN for IPv4, and IPPROTO_IPV6
and IPV6_RECVECN for IPv6. These options are documented at
<xref target="WINDOWS-SOCKOPT"/>.</t>
          <t>For dual-stack sockets, WSASetRecvIPEcn() will not enable ECN reporting for
IPv4. This requires a separate setsockopt() call using the IP_RECVECN option.</t>
          <t>If a socket is bound to a IPv6-mapped IPv4 address (i.e. it is of the format
::ffff:&lt;IPv4 address&gt;), calls to WSASetRecvIpEcn() return error EINVAL.
These sockets should instead use an explicit setsockopt() call to set
IP_RECVECN.</t>
          <t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>
        </section>
      </section>
      <section anchor="retrieving-ecn-codepoints-on-incoming-packets">
        <name>Retrieving ECN codepoints on incoming packets</name>
        <t>All platforms described in this document require the use of a recvmsg() call to
read data from the socket to retrieve ECN information, because that information
is encoded in the control data that is returned from that function. Those
platforms all return zero or more "cmsg" that contain requested information
about the arriving packet.</t>
        <t>Examples of the technique described below can be found at <xref target="CHROMIUM-POSIX"/>
and <xref target="CHROMIUM-WINDOWS"/>.</t>
        <section anchor="linux">
          <name>Linux</name>
          <t>If the incoming packet is IPv4, Linux will include a cmsg of level IPPROTO_IP
and type IP_TOS. The cmsg data contains an unsigned char.</t>
          <t>If the incoming packet is IPv6, Linux will include a cmsg of level IPPROTO_IPV6
and type IPV6_TCLASS. The cmsg data contains an int.</t>
          <t>The resulting report contains the entire IP header byte, which includes other
fields. The ECN codepoint constitutes the two least-significant bits of this
byte.</t>
          <t>The same applies to the Linux-specific recvmmsg() call.</t>
        </section>
        <section anchor="apple-and-freebsd">
          <name>Apple and FreeBSD</name>
          <t>If a UDP message (UDP/IPv4) is received on an IPv4 socket, the ancillary data
will contain a cmsg of level IPPROTO_IP and type IP_RECVTOS. The cmsg data
contains an unsigned char.</t>
          <t>If a UDP message (UDP/IPv6 or UDP/IPv4) is received on an IPv6 socket, the
ancillary data will contain a cmsg of level IPPROTO_IPV6 and type IPV6_TCLASS.
The cmsg data contains an int.</t>
          <t>The provided data is the entire byte from the IP header, which includes other
fields. The ECN codepoint constitutes the two least-significant bits of this
byte.</t>
        </section>
        <section anchor="windows-1">
          <name>Windows</name>
          <t>If the incoming packet is IPv4, the socket will include a cmsg of level
IPPROTO_IP and type IP_ECN. The cmsg data contains an int.</t>
          <t>If the incoming packet is IPv6, the socket will include a cmsg of level
IPPROTO_IPV6 and type IPV6_ECN. The cmsg data contains an int.</t>
          <t>The resulting integer solely consists of the ECN codepoint, and requires no
further bitwise operations.</t>
        </section>
      </section>
    </section>
    <section anchor="sending-ecn-codepoints">
      <name>Sending ECN codepoints</name>
      <t>Existing ECN specifications envision a particular connection consistently
sending the same ECN codepoint. It might transition that marking after
successfully completing a handshake, recognizing the path or the peer do not
support ECN, or transitioning to a new path. Therefore, using a socket option
to configure a consistent marking is generally more resource-efficient.</t>
      <t>However, some server designs receive all incoming packets on a single socket.
As the many connections that constitute this packet stream may have different
support for ECN, it is suitable to configure outgoing ECN on a per-packet basis.</t>
      <section anchor="on-a-per-socket-basis">
        <name>On a per-socket basis</name>
        <section anchor="linux-and-apple">
          <name>Linux and Apple</name>
          <t>Both Linux and Apple platforms set the outgoing ECN for IPv4 packets with a
socket option of level IPPROTO_IP and name IP_TOS.</t>
          <t>For IPv6 packets, they use level IPPROTO_IPV6 and name IPV6_TCLASS.</t>
          <t>This setsockopt() call also sets the Differentiated Services Code Point (DSCP)
bits that make up the rest of the header byte. Applications making this call will
generally want to preserve any existing DSCP setting, which might require a
getsockopt() call.</t>
          <t>For dual-stack sockets, Linux requires an additional setsockopt() call with
IP_TOS. Apple sockets do not and will return an error if this call is made.</t>
          <t>An example of the technique described above can be found at <xref target="CHROMIUM-POSIX"/>.</t>
        </section>
        <section anchor="windows-2">
          <name>Windows</name>
          <t>At the time of this writing, Windows does not provide a way to configure
marking on a per-socket basis.</t>
        </section>
      </section>
      <section anchor="on-a-per-packet-basis">
        <name>On a per-packet basis</name>
        <t>Packets can be individually marked with ECN codepoints using the control
information that accompanies a sendmsg() call.</t>
        <section anchor="linux-and-apple-1">
          <name>Linux and Apple</name>
          <t>These platforms expect a cmsg with level IPPROTO_IP and type IP_TOS if the
destination is an IPv4 address, or a IPv4-mapped IPv6 address.</t>
          <t>Otherwise, they expect a cmsg with level IPPROTO_IPV6 and type IPV6_TCLASS.</t>
          <t>The same applies to the Linux-specific sendmmsg() call.</t>
        </section>
        <section anchor="microsoft">
          <name>Microsoft</name>
          <t>Windows uses a cmsg with level IPPROTO_IP and type IP_ECN for IPv4 packets.</t>
          <t>Windows uses a cmsg with level IPPROTO_IPV6 and type IPV6_ECN for IPv6 packets.</t>
          <t>An example of the technique described above can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security implications of ECN are documented in <xref target="RFC3168"/> and <xref target="RFC9330"/>.
This document is a guide to enabling these capabilities, which incurs no
additional security considerations.</t>
      <t>Note that implementing ECN capabilities on some platforms, but not others, can
help peers identify the operating system in use by a host, which can have
privacy implications. This document aims to mitigate that possibility.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CHROMIUM" target="https://www.chromium.org/chromium-projects/">
          <front>
            <title>The Chromium Projects</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CHROMIUM-POSIX" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_posix.cc">
          <front>
            <title>udp_socket_posix.cc</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CHROMIUM-WINDOWS" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_win.cc">
          <front>
            <title>udp_socket_win.cc</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="WINDOWS-DOC" target="https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-wsasetrecvipecn">
          <front>
            <title>WSASetRecvIPEcn function (ws2tcpip.h)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="WINDOWS-SOCKOPT" target="https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options">
          <front>
            <title>MSDN - IPPROTO_IP socket options</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC9293" target="https://www.rfc-editor.org/info/rfc9293" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
        <reference anchor="RFC9260" target="https://www.rfc-editor.org/info/rfc9260" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml">
          <front>
            <title>Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart"/>
            <author fullname="M. Tüxen" initials="M." surname="Tüxen"/>
            <author fullname="K. Nielsen" initials="K." surname="Nielsen"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes the Stream Control Transmission Protocol (SCTP) and obsoletes RFC 4960. It incorporates the specification of the chunk flags registry from RFC 6096 and the specification of the I bit of DATA chunks from RFC 7053. Therefore, RFCs 6096 and 7053 are also obsoleted by this document. In addition, RFCs 4460 and 8540, which describe errata for SCTP, are obsoleted by this document.</t>
              <t>SCTP was originally designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks. It is also suited to be used for other applications, for example, WebRTC.</t>
              <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network, such as IP. It offers the following services to its users:</t>
              <t>The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9260"/>
          <seriesInfo name="DOI" value="10.17487/RFC9260"/>
        </reference>
        <reference anchor="RFC8261" target="https://www.rfc-editor.org/info/rfc8261" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8261.xml">
          <front>
            <title>Datagram Transport Layer Security (DTLS) Encapsulation of SCTP Packets</title>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen"/>
            <author fullname="R. Stewart" initials="R." surname="Stewart"/>
            <author fullname="R. Jesup" initials="R." surname="Jesup"/>
            <author fullname="S. Loreto" initials="S." surname="Loreto"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>The Stream Control Transmission Protocol (SCTP) is a transport protocol originally defined to run on top of the network protocols IPv4 or IPv6. This document specifies how SCTP can be used on top of the Datagram Transport Layer Security (DTLS) protocol. Using the encapsulation method described in this document, SCTP is unaware of the protocols being used below DTLS; hence, explicit IP addresses cannot be used in the SCTP control chunks. As a consequence, the SCTP associations carried over DTLS can only be single-homed.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8261"/>
          <seriesInfo name="DOI" value="10.17487/RFC8261"/>
        </reference>
        <reference anchor="RFC6679" target="https://www.rfc-editor.org/info/rfc6679" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml">
          <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>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="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
        <reference anchor="RFC2474" target="https://www.rfc-editor.org/info/rfc2474" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2474.xml">
          <front>
            <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
            <author fullname="K. Nichols" initials="K." surname="Nichols"/>
            <author fullname="S. Blake" initials="S." surname="Blake"/>
            <author fullname="F. Baker" initials="F." surname="Baker"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="December" year="1998"/>
            <abstract>
              <t>This document defines the IP header field, called the DS (for differentiated services) field. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2474"/>
          <seriesInfo name="DOI" value="10.17487/RFC2474"/>
        </reference>
      </references>
    </references>
    <?line 305?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank Ryan Hamilton, who provided constant advice
through this effort. Randall Meyer from Apple and Nick Grifka from Microsoft
provided useful hints about the behavior of their respective operating systems.
However, the author takes full responsibility for any errors above.</t>
      <t>Neal Cardwell, Gorry Fairhurst, Max Franke, Rodney Grimes, Will Hawkins,
Guillaume Hétier, Max Inden, Jonathan Lennox, Colin Perkins, Marten
Seemann, and Michael Tuexen made improvements to this draft.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
HCftTV58g30s/gtN20ArRy8AAA==

-->

</rfc>
