<?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-01" 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-01"/>
    <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://martinduke.github.io/udp-ecn/draft-duke-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/martinduke/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, Colin Perkins, and Michael Tuexen made
improvements to this draft.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
pmWpmTAvAAA=

-->

</rfc>
