<?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-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="CONNECT-UDP Bind">Proxying Bound UDP in HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-udp-listen-07"/>
    <author initials="D." surname="Schinazi" fullname="David Schinazi">
      <organization>Google LLC</organization>
      <address>
        <postal>
          <street>1600 Amphitheatre Parkway</street>
          <city>Mountain View</city>
          <region>CA</region>
          <code>94043</code>
          <country>United States of America</country>
        </postal>
        <email>dschinazi.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Singh" fullname="Abhi Singh">
      <organization>Google LLC</organization>
      <address>
        <postal>
          <street>1600 Amphitheatre Parkway</street>
          <city>Mountain View</city>
          <region>CA</region>
          <code>94043</code>
          <country>United States of America</country>
        </postal>
        <email>abhisinghietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="16"/>
    <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 63?>

<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 71?>

<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, and List
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 sets both the "target_host" and the
"target_port" variables to the '*' character (ASCII character 0x2A). Note that
the '*' 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>The Context ID 0 was reserved by unextended connect-udp and is not used by this
extension. Once an endpoint has ascertained that the peer supports this
extension (see <xref target="hdr"/>), the endpoint <bcp14>MUST NOT</bcp14> send any datagrams with Context
ID set to 0, and <bcp14>MUST</bcp14> silently drop any received datagrams with Context ID set
to 0.</t>
      <section anchor="capsule-assign">
        <name>The COMPRESSION_ASSIGN capsule</name>
        <t>The Compression Assign capsule 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) = 0x1C0FE323,
  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> echo an identical COMPRESSION_ASSIGN
capsule back to its peer, to indicate 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.</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>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,
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-close">
        <name>The COMPRESSION_CLOSE capsule</name>
        <t>The Compression Close capsule 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) = 0x1C0FE324,
  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.</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 defined as a List of ip-port-tuples. The format of the tuple 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 = ( IP-literal / IPv4address ) ":" port
]]></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>
    </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_ASSIGN 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="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">0x1C0FE323</td>
              <td align="left">COMPRESSION_ASSIGN</td>
            </tr>
            <tr>
              <td align="left">0x1C0FE324</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>
        <t>Note that these values will be replaced by lower ones prior to publication.</t>
      </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="February" year="2021"/>
            <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 that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </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="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 471?>

<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_ASSIGN
                        Context ID = 2
                        IP Version = 0

/* 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_ASSIGN
                        Context ID = 4
                        IP Version = 4
                        IP Address = 203.0.113.11
                        UDP Port = 4321

/* 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 the rest 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"/>, and
<contact fullname="Magnus Westerlund"/> for their reviews.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
9KVplSXwo8tsaaxTxtM3MxT/B4UFyxsuWAAA

-->

</rfc>
