<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-connect-udp-listen-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="CONNECT-UDP Bind">Proxying Bound UDP in HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-udp-listen-08"/>
    <author initials="D." surname="Schinazi" fullname="David Schinazi">
      <organization>Google LLC</organization>
      <address>
        <email>dschinazi.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Singh" fullname="Abhi Singh">
      <organization>Google LLC</organization>
      <address>
        <email>abhisinghietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="07"/>
    <area>Transport</area>
    <workgroup>MASQUE</workgroup>
    <keyword>quic</keyword>
    <keyword>http</keyword>
    <keyword>datagram</keyword>
    <keyword>udp</keyword>
    <keyword>proxy</keyword>
    <keyword>tunnels</keyword>
    <keyword>quic in quic</keyword>
    <keyword>turtles all the way down</keyword>
    <keyword>masque</keyword>
    <keyword>http-ng</keyword>
    <keyword>listen</keyword>
    <keyword>bind</keyword>
    <abstract>
      <?line 53?>

<t>The mechanism to proxy UDP in HTTP only allows each UDP Proxying request to
transmit to a specific host and port. This is well suited for UDP
client-server protocols such as HTTP/3, but is not sufficient for some UDP
peer-to-peer protocols like WebRTC. This document proposes an extension to
UDP Proxying in HTTP that enables such use-cases.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-masque.github.io/draft-ietf-masque-connect-udp-listen/draft-ietf-masque-connect-udp-listen.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-masque-connect-udp-listen/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        MASQUE Working Group mailing list (<eref target="mailto:masque@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/masque/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/masque/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-masque/draft-ietf-masque-connect-udp-listen"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<section anchor="intro">
      <name>Introduction</name>
      <t>The mechanism to proxy UDP in HTTP <xref target="CONNECT-UDP"/> allows creating
tunnels for communicating UDP payloads <xref target="UDP"/> to a fixed host and
port. Combined with the HTTP CONNECT method (see <xref section="9.3.6" sectionFormat="of" target="HTTP"/>), it allows proxying the majority of a Web Browser's HTTP
traffic. However WebRTC <xref target="WebRTC"/> relies on ICE <xref target="ICE"/> to provide
connectivity between two Web browsers, and ICE relies on the ability to send
and receive UDP packets to multiple hosts. While in theory it might be
possible to accomplish this using multiple UDP Proxying HTTP requests, HTTP
semantics <xref target="HTTP"/> do not guarantee that distinct requests will be handled
by the same server. This can lead to the UDP packets being sent from
distinct IP addresses, thereby preventing ICE from operating correctly.
Consequently, UDP Proxying requests cannot enable WebRTC connectivity
between peers.</t>
      <t>This document describes an extension to UDP Proxying in HTTP that allows
sending and receiving UDP payloads to multiple hosts within the scope of a
single UDP Proxying HTTP request.</t>
      <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 uses terminology from <xref target="CONNECT-UDP"/> and notational
conventions from <xref target="QUIC"/>. This document uses the terms Boolean,
Integer, List, and String from <xref section="3" sectionFormat="of" target="STRUCTURED-FIELDS"/>
to specify syntax and parsing. This document uses Augmented Backus-Naur Form
and parsing/serialization behaviors from <xref target="ABNF"/>.</t>
      </section>
    </section>
    <section anchor="mechanism">
      <name>Proxied UDP Binding Mechanism</name>
      <t>In unextended UDP Proxying requests, the target host is encoded in the HTTP
request path or query. For Bound UDP Proxying, the target is either conveyed
in each HTTP Datagram (see <xref target="fmt-dgram-uncomp"/>), or registered via capsules
and then compressed (see <xref target="fmt-capsule-assign"/>).</t>
      <t>When performing URI Template Expansion of the UDP Proxying template (see
<xref section="3" sectionFormat="of" target="CONNECT-UDP"/>), the client follows the same template as
CONNECT-UDP and sets the "target_host" and the "target_port" variables to
one of its targets. It adds the connect-udp-bind header as specified in
<xref target="hdr"/> to request bind. If the proxy supports CONNECT-UDP Bind, it returns
the connect-udp-bind response header value set to true.</t>
      <t>When "target_host" and "target_port" are set to a valid target, the client
is requesting CONNECT-UDP Bind but would accept fallback to unextended
CONNECT-UDP to that target. If the client doesn't have a specific target, or
if it wants CONNECT-UDP bind without fallback, it sets both the
"target_host" and the "target_port" variables to the '<tt>*</tt>' character (ASCII
character 0x2A). Note that the '<tt>*</tt>' character <bcp14>MUST</bcp14> be percent-encoded
before sending, per <xref section="3.2.2" sectionFormat="of" target="TEMPLATE"/>.</t>
    </section>
    <section anchor="contextid">
      <name>Context Identifiers</name>
      <t>As with unextended UDP proxying, the semantics of HTTP Datagrams are
conveyed by Context IDs (see <xref section="4" sectionFormat="of" target="CONNECT-UDP"/>). Endpoints first
allocate a new Context ID (per <xref target="CONNECT-UDP"/>, clients allocate even
Context IDs while proxies allocate odd ones), and then use the
COMPRESSION_ASSIGN capsule (see <xref target="capsule-assign"/>) to convey the semantics
of the new Context ID to their peer. This process is known as registering
the Context ID.</t>
      <t>Each Context ID can have either compressed or uncompressed semantics. The
uncompressed variant encodes the target IP and port into each HTTP Datagram.
Conversely, the compressed variant exchanges the target IP and port once in
the capsule during registration, and then relies on shared state to map from
the Context ID to the IP and port.</t>
      <t>Context ID 0 was reserved by unextended connect-udp to represent UDP
payloads sent to and from the "target_host" and "target_port" from the URI
template. When the mechanism from this document is in use:</t>
      <ul spacing="normal">
        <li>
          <t>if the "target_host" and "target_port" variables are set to '<tt>*</tt>', then
context ID 0 <bcp14>MUST NOT</bcp14> be used in HTTP Datagrams.</t>
        </li>
        <li>
          <t>otherwise, HTTP Datagrams with context ID 0 have the same semantics as in
unextended connect-udp.</t>
        </li>
      </ul>
      <section anchor="capsule-assign">
        <name>The COMPRESSION_ASSIGN capsule</name>
        <t>The Compression Assign capsule (capsule type 0x11) is used to register the
semantics of a Context ID. It has the following format:</t>
        <figure anchor="fmt-capsule-assign">
          <name>Compression Assign Capsule Format</name>
          <artwork><![CDATA[
COMPRESSION_ASSIGN Capsule {
  Type (i) = 0x11,
  Length (i),
  Context ID (i),
  IP Version (8),
  [IP Address (32..128)],
  [UDP Port (16)],
}
]]></artwork>
        </figure>
        <t>It contains the following fields:</t>
        <dl>
          <dt>IP Version:</dt>
          <dd>
            <t>The IP Version of the following IP Address field. <bcp14>MUST</bcp14> be 0, 4 or 6.
Setting this to zero indicates that this capsule registers an uncompressed
context. Otherwise, the capsule registers a compressed context for the IP
address and UDP port it carries.</t>
          </dd>
          <dt>IP Address:</dt>
          <dd>
            <t>The IP Address of this context. This field is omitted if the IP Version
field is set to 0. Otherwise, it has a length of 32 bits when the
corresponding IP Version field value is 4, and 128 when the IP Version is 6.</t>
          </dd>
          <dt>UDP Port:</dt>
          <dd>
            <t>The UDP Port of this context, in network byte order. This field is omitted
if the IP Version field is set to 0.</t>
          </dd>
        </dl>
        <t>When an endpoint receives a COMPRESSION_ASSIGN capsule, it <bcp14>MUST</bcp14> either
accept or reject the corresponding registration:</t>
        <ul spacing="normal">
          <li>
            <t>if it accepts the registration, first the receiver <bcp14>MUST</bcp14> save the mapping
from Context ID to address and port (or save the fact that this context ID
is uncompressed). Second, the receiver <bcp14>MUST</bcp14> return a COMPRESSION_ACK
capsule with the Context ID set to the one from the received
COMPRESSION_ASSIGN capsule back to its peer, indicating it has accepted
the registration.</t>
          </li>
          <li>
            <t>if it rejects the registration, the receiver <bcp14>MUST</bcp14> respond by sending a
COMPRESSION_CLOSE capsule with the Context ID set to the one from the
received COMPRESSION_ASSIGN capsule.</t>
          </li>
        </ul>
        <t>As mandated in <xref section="4" sectionFormat="of" target="CONNECT-UDP"/>, clients can only allocate even
Context IDs, while proxies can only allocate odd ones. This makes the
registration capsules from this document unambiguous. For example, if a
client receives a COMPRESSION_ASSIGN capsule with an even Context ID, that
has to be an echo of a capsule that the client initially sent, indicating
that the proxy accepted the registration. Since the value 0 was reserved by
unextended connect-udp, the Context ID value of COMPRESSION_ASSIGN can never
be zero.</t>
        <t>Endpoints <bcp14>MUST NOT</bcp14> send two COMPRESSION_ASSIGN capsules with the same
Context ID. If a recipient detects a repeated Context ID, it <bcp14>MUST</bcp14> treat the
capsule as malformed. Receipt of a malformed capsule <bcp14>MUST</bcp14> be treated as an
error processing the Capsule Protocol, as defined in <xref section="3.3" sectionFormat="of" target="HTTP-DGRAM"/>.</t>
        <t>If the uncompressed context is closed, the proxy <bcp14>MUST NOT</bcp14> open new
compressed contexts. In such a case, the proxy opening contexts results in
tuples not desired by the client reaching it thereby nullifying the IP
restriction property of uncompressed compression close as described in
<xref target="restricting-ips"/>.</t>
        <t>Only one Context ID can be used per IP-port tuple. If an endpoint detects
that both it and its peer have opened a Context ID for the same tuple, the
endpoint <bcp14>MUST</bcp14> close the Context ID that was opened by the proxy. If an
endpoint receives a COMPRESSION_ASSIGN capsule whose tuple matches another
open Context ID, it <bcp14>MUST</bcp14> treat the capsule as malformed.</t>
        <t>Endpoints <bcp14>MAY</bcp14> pre-emptively use Context IDs not yet acknowledged by the peer
via COMPRESSION_ACK, knowing that those HTTP Datagrams can be dropped if
they arrive before the corresponding COMPRESSION_ASSIGN capsule, or if the
peer rejects the registration.</t>
      </section>
      <section anchor="capsule-ack">
        <name>The COMPRESSION_ACK capsule</name>
        <t>The Compression Acknowledgment capsule (capsule type 0x12) serves to confirm
registration of a context ID that was received via a COMPRESSION_ASSIGN
capsule.</t>
        <figure anchor="fmt-capsule-ack">
          <name>Compression Acknowledgment Capsule Format</name>
          <artwork><![CDATA[
COMPRESSION_ACK Capsule {
  Type (i) = 0x12,
  Length (i),
  Context ID (i),
}
]]></artwork>
        </figure>
        <t>An endpoint can only send a COMPRESSION_ACK capsule if it received a
COMPRESSION_ASSIGN capsule with the same Context ID. If an endpoint receives
COMPRESSION_ACK capsule for a context ID it did not attempt to register via
COMPRESSION_ASSIGN, that capsule is considered malformed.</t>
      </section>
      <section anchor="capsule-close">
        <name>The COMPRESSION_CLOSE capsule</name>
        <t>The Compression Close capsule (capsule type 0x13) serves two purposes. It
can be sent as a direct response to a received COMPRESSION_ASSIGN capsule,
to indicate that the registration was rejected. It can also be sent later to
indicate the closure of a previously assigned registration.</t>
        <figure anchor="fmt-capsule-close">
          <name>Compression Close Capsule Format</name>
          <artwork><![CDATA[
COMPRESSION_CLOSE Capsule {
  Type (i) = 0x13,
  Length (i),
  Context ID (i),
}
]]></artwork>
        </figure>
        <t>Once an endpoint has either sent or received a COMPRESSION_CLOSE for a given
Context ID, it <bcp14>MUST NOT</bcp14> send any further datagrams with that Context ID.
Since the value 0 was reserved by unextended connect-udp, the Context ID
value of COMPRESSION_CLOSE can never be zero.</t>
        <t>Endpoints <bcp14>MAY</bcp14> close any context regardless of which endpoint registered it.
This is useful for example, when a mapping is unused for a long time.
Another potential use is restricting some targets (see <xref target="restricting-ips"/>).</t>
        <t>Once a registration is closed, endpoints can instead use an uncompressed
Context ID to exchange UDP payloads for the given target, if such a context
has been registered (see <xref target="uncompressed"/>).</t>
      </section>
    </section>
    <section anchor="uncompressed">
      <name>Uncompressed Operation</name>
      <t>If the client wishes to send or receive uncompressed datagrams, it <bcp14>MUST</bcp14>
first send a COMPRESSION_ASSIGN capsule (see <xref target="fmt-capsule-assign"/>) to the
proxy with the IP Version set to zero. This registers the Context ID as
being uncompressed semantics: all HTTP Datagrams with this Context ID have
the following format:</t>
      <figure anchor="fmt-dgram-uncomp">
        <name>Uncompressed Bound UDP Proxying HTTP Datagram Format</name>
        <artwork><![CDATA[
Uncompressed Bound UDP Proxying Payload {
  IP Version (8),
  IP Address (32..128),
  UDP Port (16),
  UDP Payload (..),
}
]]></artwork>
      </figure>
      <t>It contains the following fields:</t>
      <dl>
        <dt>IP Version:</dt>
        <dd>
          <t>The IP Version of the following IP Address field. <bcp14>MUST</bcp14> be 4 or 6.</t>
        </dd>
        <dt>IP Address:</dt>
        <dd>
          <t>The IP Address of this proxied UDP packet. When sent from client to proxy,
this is the target host to which the proxy will send this UDP payload. When
sent from proxy to client, this represents the source IP address of the UDP
packet received by the proxy. This field has a length of 32 bits when the
corresponding IP Version field value is 4, and 128 when the IP Version is 6.</t>
        </dd>
        <dt>UDP Port:</dt>
        <dd>
          <t>The UDP Port of this proxied UDP packet in network byte order. When sent
from client to proxy, this is the target port to which the proxy will send
this UDP payload. When sent from proxy to client, this represents the source
UDP port of the UDP packet received by the proxy.</t>
        </dd>
        <dt>UDP Payload:</dt>
        <dd>
          <t>The unmodified UDP Payload of this proxied UDP packet (referred to as
"data octets" in <xref target="UDP"/>).</t>
        </dd>
      </dl>
      <t>A client <bcp14>MUST NOT</bcp14> open an uncompressed Context ID if one is already open. If
a server receives a request to open an uncompressed Context ID and it
already has one open, then the server <bcp14>MUST</bcp14> treat the second capsule as
malformed. Note that it's possible for the client to close the uncompressed
context and reopen it later with a different Context ID, as long as there
aren't two uncompressed contexts open at the same time. Only the client can
request uncompressed contexts. If a client receives a COMPRESSION_ASSIGN
capsule with the IP Version set to 0, it <bcp14>MUST</bcp14> treat it as malformed.</t>
    </section>
    <section anchor="compressed-operation">
      <name>Compressed Operation</name>
      <t>Endpoints <bcp14>MAY</bcp14> choose to compress the IP and port information per datagram
for a given target using Context IDs. This is accomplished by registering a
compressed Context ID using the COMPRESSION_ASSIGN capsule (see
<xref target="fmt-capsule-assign"/>).</t>
      <t>If the Context ID in an HTTP Datagram matches one previously registered for
compressed operation, the rest of the HTTP Datagram represents the UDP
payload:</t>
      <figure anchor="fmt-dgram-comp">
        <name>Compressed Bound UDP Proxying HTTP Datagram Format</name>
        <artwork><![CDATA[
Compressed Bound UDP Proxying Payload {
  UDP Payload (..),
}
]]></artwork>
      </figure>
      <t>It contains the following field:</t>
      <dl>
        <dt>UDP Payload:</dt>
        <dd>
          <t>The unmodified UDP Payload of this proxied UDP packet (referred to as
"data octets" in <xref target="UDP"/>).</t>
        </dd>
      </dl>
    </section>
    <section anchor="hdr">
      <name>The Connect-UDP-Bind Header Field</name>
      <t>The "Connect-UDP-Bind" header field’s value is a Boolean Structured Field
set to true. Clients and proxy both indicate support for this extension by
sending the Connect-UDP-Bind header field with a value of ?1. Once an
endpoint has both sent and received the Connect-UDP-Bind header field set to
true, this extension is enabled. Any other value type <bcp14>MUST</bcp14> be handled as if
the field were not present by the recipients (for example, if this field is
defined multiple times, its type becomes a List and therefore is to be
ignored). This document does not define any parameters for the
Connect-UDP-Bind header field value, but future documents might define
parameters. Receivers <bcp14>MUST</bcp14> ignore unknown parameters.</t>
    </section>
    <section anchor="addr-hdr">
      <name>The Proxy-Public-Address Response Header Field</name>
      <t>Upon accepting the request, the proxy <bcp14>MUST</bcp14> select at least one public IP
address to bind. The proxy <bcp14>MAY</bcp14> assign more addresses. For each selected
address, it <bcp14>MUST</bcp14> select an open port to bind to this request. From then and
until the tunnel is closed, the proxy <bcp14>SHALL</bcp14> send packets received on these
IP-port tuples to the client. The proxy <bcp14>MUST</bcp14> communicate the selected
addresses and ports to the client using the "Proxy-Public-Address" header
field. The header field is a List. Each member of the List is a String,
comprised of the ip-port tuple. The format of the String is defined using
IP-literal, IPv4address, and port from <xref section="3.2" sectionFormat="of" target="URI"/>.</t>
      <figure anchor="target-format">
        <name>Proxy Address Format</name>
        <artwork><![CDATA[
ip-port-tuple = DQUOTE ( IP-literal / IPv4address ) ":" port DQUOTE
]]></artwork>
      </figure>
      <t>When a single IP-Port tuple is provided in the Proxy-Public-Address field,
the proxy <bcp14>MUST</bcp14> use the same public IP and Port for the remainder of the
connection. When multiple tuples are provided, maintaining address stability
per address family is <bcp14>RECOMMENDED</bcp14>.</t>
      <t>Note that since the addresses are conveyed in HTTP response headers, a
subsequent change of addresses on the proxy cannot be conveyed to the client.</t>
      <t>If the proxy only shares IP addresses from a single address family, that
indicates that the proxy only supports that family. The client <bcp14>SHOULD NOT</bcp14>
attempt to register compressed contexts or send uncompressed datagrams
intended for targets whose IP address families were not indicated via the IP
addresses listed in the Proxy-Public-Address header field, as the proxy will
drop those datagrams and reject those registrations.</t>
    </section>
    <section anchor="behavior">
      <name>Proxy behavior</name>
      <t>After accepting the Connect-UDP Binding proxying request, the proxy uses an
assigned IP address and port to transmit UDP payloads received from the
client to the target IP Address and UDP Port specified in each HTTP Datagram
received from the client. The proxy uses the same ports to listen for UDP
packets from any authorized target and forwards them to the client by
encapsulating them in HTTP Datagrams, using the corresponding Context ID.</t>
      <t>If the proxy receives UDP payloads that don't correspond to any registration
(i.e., no compression for the given target was ever established and there is
no uncompressed registration), the proxy will either drop the datagram or
temporarily buffer it (see <xref section="5" sectionFormat="of" target="CONNECT-UDP"/>).</t>
      <section anchor="restricting-ips">
        <name>Restricting IPs</name>
        <t>If a client does not wish to receive datagrams from unknown senders, it can
close the uncompressed registration (or not open it in the first place). In
that scenario, the proxy effectively acts as a firewall against unwanted or
unknown IPs.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations described in <xref section="7" sectionFormat="of" target="CONNECT-UDP"/> also
apply here. Since TURN can be run over this mechanism, implementors should
review the security considerations in <xref section="21" sectionFormat="of" target="TURN"/>.</t>
      <t>Since unextended UDP Proxying requests carry the target as part of the
request, the proxy can protect unauthorized targets by rejecting requests
before creating the tunnel, and communicate the rejection reason in response
header fields. The uncompressed context allows transporting datagrams to and
from any target. Clients that keep the uncompressed context open need to be
able to receive from all targets. If the UDP proxy would reject unextended
UDP proxying requests to some targets (as recommended in <xref section="7" sectionFormat="of" target="CONNECT-UDP"/>), then for bound UDP proxying requests where the uncompressed
context is open, the UDP proxy needs to perform checks on the target of each
uncompressed context datagram it receives.</t>
      <t>Note that if the compression response (COMPRESSION_ACK OR COMPRESSION_CLOSE)
cannot be immediately sent due to flow or congestion control, an upper limit
on how many compression responses the endpoint is willing to buffer <bcp14>MUST</bcp14> be
set to prevent memory exhaustion. The proxy <bcp14>MUST</bcp14> abort the request stream if
this limit is reached.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>When moving traffic between uncompressed and compressed contexts, the
effective MTU will change. This can hinder Datagram Packetization Layer PMTU
Discovery (DPLPMTUD) between the client and the target
<xref target="DPLPMTUD"/>. To avoid that, if an endpoint intends to use
compression, it <bcp14>SHOULD</bcp14> request it as early as possible.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="iana-fields">
        <name>HTTP Fields</name>
        <t>This document will request IANA to register the following new items in the
"HTTP Field Name" registry maintained at
&lt;<eref target="https://www.iana.org/assignments/http-fields"/>&gt;:</t>
        <table anchor="iana-fields-table">
          <name>New Fields</name>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Structured Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Connect-UDP-Bind</td>
              <td align="left">Item</td>
            </tr>
            <tr>
              <td align="left">Proxy-Public-Address</td>
              <td align="left">List</td>
            </tr>
          </tbody>
        </table>
        <t>All of these new entries use the following values for these fields:</t>
        <dl spacing="compact">
          <dt>Status:</dt>
          <dd>
            <t>provisional (permanent if this document is approved)</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Comments:</dt>
          <dd>
            <t>None</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-capsules">
        <name>Capsules</name>
        <t>This document will request IANA to register the following new items to the
"HTTP Capsule Types" registry maintained at
&lt;<eref target="https://www.iana.org/assignments/masque"/>&gt;:</t>
        <table anchor="iana-capsules-table">
          <name>New Capsules</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Capsule Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x11</td>
              <td align="left">COMPRESSION_ASSIGN</td>
            </tr>
            <tr>
              <td align="left">0x13</td>
              <td align="left">COMPRESSION_ACK</td>
            </tr>
            <tr>
              <td align="left">0x14</td>
              <td align="left">COMPRESSION_CLOSE</td>
            </tr>
          </tbody>
        </table>
        <t>All of these new entries use the following values for these fields:</t>
        <dl spacing="compact">
          <dt>Status:</dt>
          <dd>
            <t>provisional (permanent if this document is approved)</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>MASQUE Working Group <eref target="mailto:masque@ietf.org">masque@ietf.org</eref></t>
          </dd>
          <dt>Notes:</dt>
          <dd>
            <t>None</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="UDP">
          <front>
            <title>User Datagram Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="August" year="1980"/>
          </front>
          <seriesInfo name="STD" value="6"/>
          <seriesInfo name="RFC" value="768"/>
          <seriesInfo name="DOI" value="10.17487/RFC0768"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="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>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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="QUIC">
          <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="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="ABNF">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="TEMPLATE">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="HTTP-DGRAM">
          <front>
            <title>HTTP Datagrams and the Capsule Protocol</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
              <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
              <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9297"/>
          <seriesInfo name="DOI" value="10.17487/RFC9297"/>
        </reference>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="WebRTC" target="https://www.w3.org/TR/webrtc/">
          <front>
            <title>WebRTC</title>
            <author>
              <organization/>
            </author>
            <date year="2021" month="January" day="26"/>
          </front>
          <seriesInfo name="W3C" value="Recommendation"/>
        </reference>
        <reference anchor="ICE">
          <front>
            <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
            <date month="July" year="2018"/>
            <abstract>
              <t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based communication. This protocol is called Interactive Connectivity Establishment (ICE). ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).</t>
              <t>This document obsoletes RFC 5245.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8445"/>
          <seriesInfo name="DOI" value="10.17487/RFC8445"/>
        </reference>
        <reference anchor="TURN">
          <front>
            <title>Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</title>
            <author fullname="T. Reddy" initials="T." role="editor" surname="Reddy"/>
            <author fullname="A. Johnston" initials="A." role="editor" surname="Johnston"/>
            <author fullname="P. Matthews" initials="P." surname="Matthews"/>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>If a host is located behind a NAT, it can be impossible for that host to communicate directly with other hosts (peers) in certain situations. In these situations, it is necessary for the host to use the services of an intermediate node that acts as a communication relay. This specification defines a protocol, called "Traversal Using Relays around NAT" (TURN), that allows the host to control the operation of the relay and to exchange packets with its peers using the relay. TURN differs from other relay control protocols in that it allows a client to communicate with multiple peers using a single relay address.</t>
              <t>The TURN protocol was designed to be used as part of the Interactive Connectivity Establishment (ICE) approach to NAT traversal, though it can also be used without ICE.</t>
              <t>This document obsoletes RFCs 5766 and 6156.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8656"/>
          <seriesInfo name="DOI" value="10.17487/RFC8656"/>
        </reference>
        <reference anchor="DPLPMTUD">
          <front>
            <title>Packetization Layer Path MTU Discovery for Datagram Transports</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="T. Jones" initials="T." surname="Jones"/>
            <author fullname="M. Tüxen" initials="M." surname="Tüxen"/>
            <author fullname="I. Rüngeler" initials="I." surname="Rüngeler"/>
            <author fullname="T. Völker" initials="T." surname="Völker"/>
            <date month="September" year="2020"/>
            <abstract>
              <t>This document specifies Datagram Packetization Layer Path MTU Discovery (DPLPMTUD). This is a robust method for Path MTU Discovery (PMTUD) for datagram Packetization Layers (PLs). It allows a PL, or a datagram application that uses a PL, to discover whether a network path can support the current size of datagram. This can be used to detect and reduce the message size when a sender encounters a packet black hole. It can also probe a network path to discover whether the maximum packet size can be increased. This provides functionality for datagram transports that is equivalent to the PLPMTUD specification for TCP, specified in RFC 4821, which it updates. It also updates the UDP Usage Guidelines to refer to this method for use with UDP datagrams and updates SCTP.</t>
              <t>The document provides implementation notes for incorporating Datagram PMTUD into IETF datagram transports or applications that use datagram transports.</t>
              <t>This specification updates RFC 4960, RFC 4821, RFC 6951, RFC 8085, and RFC 8261.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8899"/>
          <seriesInfo name="DOI" value="10.17487/RFC8899"/>
        </reference>
        <reference anchor="CONNECT-IP">
          <front>
            <title>Proxying IP in HTTP</title>
            <author fullname="T. Pauly" initials="T." role="editor" surname="Pauly"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="A. Chernyakhovsky" initials="A." surname="Chernyakhovsky"/>
            <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document describes how to proxy IP packets in HTTP. This protocol is similar to UDP proxying in HTTP but allows transmitting arbitrary IP packets. More specifically, this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy. This document updates RFC 9298.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9484"/>
          <seriesInfo name="DOI" value="10.17487/RFC9484"/>
        </reference>
      </references>
    </references>
    <?line 525?>

<section anchor="example">
      <name>Example</name>
      <t>In the example below, the client is configured with URI Template
"https://example.org/.well-known/masque/udp/{target_host}/{target_port}/"
and listens for traffic on the proxy, eventually decides that it no longer
wants to listen for connections from new targets, and limits its
communication with only 203.0.113.11:4321 and no other UDP target.</t>
      <artwork><![CDATA[
 Client                                             Server

 STREAM(44): HEADERS            -------->
   :method = CONNECT
   :protocol = connect-udp
   :scheme = https
   :path = /.well-known/masque/udp/%2A/%2A/
   :authority = proxy.example.org
   connect-udp-bind = ?1
   capsule-protocol = ?1

            <--------  STREAM(44): HEADERS
                         :status = 200
                         connect-udp-bind = ?1
                         capsule-protocol = ?1
                         proxy-public-address = "192.0.2.45:54321",  \
                                            "[2001:db8::1234]:54321"

// Register Context ID 2 to be used for uncompressed UDP payloads
// to/from any target.

 CAPSULE                       -------->
   Type = COMPRESSION_ASSIGN
   Context ID = 2
   IP Version = 0

// Proxy confirms registration.

            <-------- CAPSULE
                        Type = COMPRESSION_ACK
                        Context ID = 2

// Target talks to Client using the uncompressed context.

            <--------  DATAGRAM
                         Quarter Stream ID = 11
                         Context ID = 2
                         IP Version = 4
                         IP Address = 192.0.2.42
                         UDP Port = 1234
                         UDP Payload = Encapsulated UDP Payload

// Client responds on the same uncompressed context.

 DATAGRAM                       -------->
   Quarter Stream ID = 11
   Context ID = 2
   IP Version = 4
   IP Address = 192.0.2.42
   UDP Port = 1234
   UDP Payload = Encapsulated UDP Payload

// Another target talks to Client using the uncompressed context.

            <--------  DATAGRAM
                         Quarter Stream ID = 11
                         Context ID = 2
                         IP Version = 4
                         IP Address = 203.0.113.11
                         UDP Port = 4321
                         UDP Payload = Encapsulated UDP Payload

// Client responds on the same uncompressed context.

 DATAGRAM                       -------->
   Quarter Stream ID = 11
   Context ID = 2
   IP Version = 4
   IP Address = 203.0.113.11
   UDP Port = 4321
   UDP Payload = Encapsulated UDP Payload

// Register 203.0.113.11:4321 to compress it in the future.

 CAPSULE                       -------->
   Type = COMPRESSION_ASSIGN
   Context ID = 4
   IP Version = 4
   IP Address = 203.0.113.11
   UDP Port = 4321


// Proxy confirms registration.

            <-------- CAPSULE
                        Type = COMPRESSION_ACK
                        Context ID = 4

// Omit IP and Port for future packets intended for
// 203.0.113.11:4321 hereon.

 DATAGRAM                       -------->
   Context ID = 4
   UDP Payload = Encapsulated UDP Payload

            <--------  DATAGRAM
                        Context ID = 4
                        UDP Payload = Encapsulated UDP Payload

// Request packets without a corresponding compressed Context
// to be dropped by closing the uncompressed Context.

 CAPSULE                       -------->
   Type = COMPRESSION_CLOSE
   Context ID = 2

// Context ID 4 = 203.0.113.11:4321 traffic is accepted,
// and other traffic is dropped at the proxy.
]]></artwork>
    </section>
    <section anchor="comparison-with-connect-ip">
      <name>Comparison with CONNECT-IP</name>
      <t>While the use-cases described in <xref target="intro"/> could be supported using IP
Proxying in HTTP <xref target="CONNECT-IP"/>, it would require that every HTTP
Datagram carries a complete IP header. This would lead to both
inefficiencies in the wire encoding and reduction in available Maximum
Transmission Unit (MTU). Furthermore, Web browsers would need to support
IPv4 and IPv6 header generation, parsing, validation and error handling.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This proposal is the result of many conversations with MASQUE working group
participants. In particular, the authors would like to thank <contact fullname="Marius Kleidl"/>, <contact fullname="Tommy Pauly"/>, <contact fullname="Lucas Pardue"/>, <contact fullname="Ben Schwartz"/>,
<contact fullname="Marten Seemann"/>, and <contact fullname="Magnus Westerlund"/> for their reviews.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
