<?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.6.19 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-connect-ip-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title>Proxying IP in HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-ip-04"/>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <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="Chernyakhovsky" fullname="Alex Chernyakhovsky">
      <organization>Google LLC</organization>
      <address>
        <email>achernya@google.com</email>
      </address>
    </author>
    <author initials="M." surname="Kuehlewind" fullname="Mirja Kuehlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <date year="2023" month="January" day="18"/>
    <area>Transport</area>
    <workgroup>MASQUE</workgroup>
    <keyword>quic</keyword>
    <keyword>http</keyword>
    <keyword>datagram</keyword>
    <keyword>VPN</keyword>
    <keyword>proxy</keyword>
    <keyword>tunnels</keyword>
    <keyword>quic in udp in IP in quic</keyword>
    <keyword>turtles all the way down</keyword>
    <keyword>masque</keyword>
    <keyword>http-ng</keyword>
    <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 a proxy.</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-ip/draft-ietf-masque-connect-ip.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-masque-connect-ip/"/>.
      </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-ip"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP provides the CONNECT method (see <xref section="9.3.6" sectionFormat="of" target="HTTP"/>) for
creating a TCP <xref target="TCP"/> tunnel to a proxy and a similar mechanism for
UDP <xref target="CONNECT-UDP"/>. However, these mechanisms cannot tunnel other
protocols nor convey fields of the IP header.</t>
      <t>This document describes a protocol for tunnelling IP to an HTTP server acting
as an IP-specific proxy over HTTP. This can be used for various use cases
such as point-to-network VPN, secure point-to-point communication, or
general-purpose packet tunnelling.</t>
      <t>IP proxying operates similarly to UDP proxying <xref target="CONNECT-UDP"/>,
whereby the proxy itself is identified with an absolute URL, optionally
containing the traffic's destination. Clients generate these URLs using a
URI Template <xref target="TEMPLATE"/>, as described in <xref target="client-config"/>.</t>
      <t>This protocol supports all existing versions of HTTP by using HTTP Datagrams
<xref target="HTTP-DGRAM"/>. When using HTTP/2 <xref target="H2"/> or HTTP/3 <xref target="H3"/>, it uses
HTTP Extended CONNECT as described in <xref target="EXT-CONNECT2"/> and
<xref target="EXT-CONNECT3"/>. When using HTTP/1.x <xref target="H1"/>, it uses HTTP Upgrade
as defined in <xref section="7.8" sectionFormat="of" target="HTTP"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>In this document, we use the term "IP proxy" to refer to the HTTP server that
responds to the IP proxying request. If there are HTTP intermediaries (as defined
in <xref section="3.7" sectionFormat="of" target="HTTP"/>) between the client and the proxy, those are
referred to as "intermediaries" in this document.</t>
      <t>Note that, when the HTTP version in use does not support multiplexing streams
(such as HTTP/1.1), any reference to "stream" in this document represents the
entire connection.</t>
    </section>
    <section anchor="client-config">
      <name>Configuration of Clients</name>
      <t>Clients are configured to use IP proxying over HTTP via an URI Template
<xref target="TEMPLATE"/>. The URI template <bcp14>MAY</bcp14> contain two variables: "target" and
"ipproto" (<xref target="scope"/>). The optionality of the variables needs to be considered
when defining the template so that either the variable is self-identifying or it
is possible to exclude it in the syntax.</t>
      <t>Examples are shown below:</t>
      <figure anchor="fig-template-examples">
        <name>URI Template Examples</name>
        <artwork><![CDATA[
https://example.org/.well-known/masque/ip/{target}/{ipproto}/
https://proxy.example.org:4443/masque/ip?t={target}&i={ipproto}
https://proxy.example.org:4443/masque/ip{?target,ipproto}
https://masque.example.org/?user=bob
]]></artwork>
      </figure>
      <t>The following requirements apply to the URI Template:</t>
      <ul spacing="normal">
        <li>The URI Template <bcp14>MUST</bcp14> be a level 3 template or lower.</li>
        <li>The URI Template <bcp14>MUST</bcp14> be in absolute form, and <bcp14>MUST</bcp14> include non-empty scheme,
authority and path components.</li>
        <li>The path component of the URI Template <bcp14>MUST</bcp14> start with a slash "/".</li>
        <li>All template variables <bcp14>MUST</bcp14> be within the path or query components of the URI.</li>
        <li>The URI template <bcp14>MAY</bcp14> contain the two variables "target" and "ipproto" and <bcp14>MAY</bcp14>
contain other variables. If the "target" or "ipproto" variables are included,
their values <bcp14>MUST NOT</bcp14> be empty. Clients can instead use "*" to indicate
wildcard or no-preference values; see <xref target="scope"/>.</li>
        <li>The URI Template <bcp14>MUST NOT</bcp14> contain any non-ASCII unicode characters and <bcp14>MUST</bcp14>
only contain ASCII characters in the range 0x21-0x7E inclusive (note that
percent-encoding is allowed; see Section 2.1 of <xref target="URI"/>.</li>
        <li>The URI Template <bcp14>MUST NOT</bcp14> use Reserved Expansion ("+" operator), Fragment
Expansion ("#" operator), Label Expansion with Dot- Prefix, Path Segment
Expansion with Slash-Prefix, nor Path-Style Parameter Expansion with
Semicolon-Prefix.</li>
      </ul>
      <t>Clients <bcp14>SHOULD</bcp14> validate the requirements above; however, clients <bcp14>MAY</bcp14> use a
general-purpose URI Template implementation that lacks this specific validation.
If a client detects that any of the requirements above are not met by a URI
Template, the client <bcp14>MUST</bcp14> reject its configuration and abort the request without
sending it to the IP proxy.</t>
      <t>As with UDP proxying, some client configurations for IP proxies will only
allow the user to configure the proxy host and proxy port. Clients with such limitations
<bcp14>MAY</bcp14> attempt to access IP proxying capabilities using the default template, which is
defined as: "https://$PROXY_HOST:$PROXY_PORT/.well-known/masque/ip/{target}/{ipproto}/",
where $PROXY_HOST and $PROXY_PORT are the configured host and port of the IP proxy,
respectively. IP proxy deployments <bcp14>SHOULD</bcp14> offer service at this location if they need
to interoperate with such clients.</t>
    </section>
    <section anchor="tunnelling-ip-over-http">
      <name>Tunnelling IP over HTTP</name>
      <t>To allow negotiation of a tunnel for IP over HTTP, this document defines the
"connect-ip" HTTP Upgrade Token. The resulting IP tunnels use the Capsule
Protocol (see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>) with HTTP Datagrams in the format
defined in <xref target="payload-format"/>.</t>
      <t>To initiate an IP tunnel associated with a single HTTP stream, a client issues a
request containing the "connect-ip" upgrade token. The target of the tunnel is
indicated by the client to the UDP proxy via the "target_host" and "target_port"
variables of the URI Template; see <xref target="client-config"/>.</t>
      <t>When sending its IP proxying request, the client <bcp14>SHALL</bcp14> perform URI template
expansion to determine the path and query of its request, see <xref target="client-config"/>.</t>
      <t>A successful response indicates that the IP proxy is willing to open an IP
forwarding tunnel between it and the client. Any response other than a
successful response indicates that the tunnel has not been formed.</t>
      <t>The lifetime of the IP forwarding tunnel is tied to the IP proxying request stream.
Closing that stream (in HTTP/3 via the FIN bit on a QUIC STREAM frame, or a
QUIC RESET_STREAM frame) closes the associated IP tunnel.</t>
      <t>Along with a successful response, the IP proxy can send capsules to assign
addresses and advertise routes to the client (<xref target="capsules"/>). The client can also
assign addresses and advertise routes to the IP proxy for network-to-network
routing.</t>
      <t>By virtue of the definition of the Capsule Protocol (see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>), IP proxying requests do not carry any message content.
Similarly, successful IP proxying responses also do not carry any message
content.</t>
      <section anchor="req1">
        <name>HTTP/1.1 Request</name>
        <t>When using HTTP/1.1 <xref target="H1"/>, an IP proxying request will meet the following
requirements:</t>
        <ul spacing="normal">
          <li>the method <bcp14>SHALL</bcp14> be "GET".</li>
          <li>the request <bcp14>SHALL</bcp14> include a single Host header field containing the origin
of the IP proxy.</li>
          <li>the request <bcp14>SHALL</bcp14> include a Connection header field with value "Upgrade"
(note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="HTTP"/>).</li>
          <li>the request <bcp14>SHALL</bcp14> include an Upgrade header field with value "connect-ip".</li>
        </ul>
        <t>An IP proxying request that does not conform to these restrictions is malformed.
The recipient of such a malformed request <bcp14>MUST</bcp14> respond with an error and <bcp14>SHOULD</bcp14>
use the 400 (Bad Request) status code.</t>
      </section>
      <section anchor="resp1">
        <name>HTTP/1.1 Response</name>
        <t>The IP proxy <bcp14>SHALL</bcp14> indicate a successful response by replying with the
following requirements:</t>
        <ul spacing="normal">
          <li>the HTTP status code on the response <bcp14>SHALL</bcp14> be 101 (Switching Protocols).</li>
          <li>the response <bcp14>SHALL</bcp14> include a Connection header field with value "Upgrade"
(note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="HTTP"/>).</li>
          <li>the response <bcp14>SHALL</bcp14> include a single Upgrade header field with value
"connect-ip".</li>
          <li>the response <bcp14>SHALL</bcp14> meet the requirements of HTTP responses that start the
Capsule Protocol; see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>.</li>
        </ul>
        <t>If any of these requirements are not met, the client <bcp14>MUST</bcp14> treat this proxying
attempt as failed and abort the connection.</t>
      </section>
      <section anchor="req23">
        <name>HTTP/2 and HTTP/3 Requests</name>
        <t>When using HTTP/2 <xref target="H2"/> or HTTP/3 <xref target="H3"/>, IP proxying requests use HTTP
Extended CONNECT. This requires that servers send an HTTP Setting as specified
in <xref target="EXT-CONNECT2"/> and <xref target="EXT-CONNECT3"/> and that requests use HTTP
pseudo-header fields with the following requirements:</t>
        <ul spacing="normal">
          <li>The :method pseudo-header field <bcp14>SHALL</bcp14> be "CONNECT".</li>
          <li>The :protocol pseudo-header field <bcp14>SHALL</bcp14> be "connect-ip".</li>
          <li>The :authority pseudo-header field <bcp14>SHALL</bcp14> contain the authority of the IP
proxy.</li>
          <li>The :path and :scheme pseudo-header fields <bcp14>SHALL NOT</bcp14> be empty. Their
values <bcp14>SHALL</bcp14> contain the scheme and path from the URI Template after the URI
Template expansion process has been completed; see <xref target="client-config"/>.
Variables in the URI template can determine the scope of the request, such
as requesting full-tunnel IP packet forwarding, or a specific proxied flow;
see <xref target="scope"/>.</li>
        </ul>
        <t>An IP proxying request that does not conform to these restrictions is
malformed (see <xref section="8.1.1" sectionFormat="of" target="H2"/> and <xref section="4.1.2" sectionFormat="of" target="H3"/>).</t>
      </section>
      <section anchor="resp23">
        <name>HTTP/2 and HTTP/3 Responses</name>
        <t>The IP proxy <bcp14>SHALL</bcp14> indicate a successful response by replying with the
following requirements:</t>
        <ul spacing="normal">
          <li>the HTTP status code on the response <bcp14>SHALL</bcp14> be in the 2xx (Successful) range.</li>
          <li>the response <bcp14>SHALL</bcp14> meet the requirements of HTTP responses that start the
Capsule Protocol; see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>.</li>
        </ul>
        <t>If any of these requirements are not met, the client <bcp14>MUST</bcp14> treat this proxying
attempt as failed and abort the request.</t>
      </section>
      <section anchor="scope">
        <name>Limiting Request Scope</name>
        <t>Unlike UDP proxying requests, which require specifying a target host, IP proxying
requests can allow endpoints to send arbitrary IP packets to any host. The
client can choose to restrict a given request to a specific IP prefix or IP
protocol by adding parameters to its request. When the IP proxy knows that a
request is scoped to a target prefix or protocol, it can leverage this
information to optimize its resource allocation; for example, the IP proxy can
assign the same public IP address to two IP proxying requests that are scoped to
different prefixes and/or different protocols.</t>
        <t>The scope of the request is indicated by the client to the IP proxy via the
"target" and "ipproto" variables of the URI Template; see <xref target="client-config"/>.
Both the "target" and "ipproto" variables are optional; if they are not included,
they are considered to carry the wildcard value "*".</t>
        <dl spacing="compact">
          <dt>target:</dt>
          <dd>
            <t>The variable "target" contains a hostname or IP prefix of a specific host to
which the client wants to proxy packets. If the "target" variable is not
specified or its value is "*", the client is requesting to communicate with any
allowable host. "target" supports using DNS names, IPv6 prefixes and IPv4
prefixes. Note that IPv6 scoped addressing zone identifiers are not supported.
If the target is an IP prefix (IP address optionally followed by a
percent-encoded slash followed by the prefix length in bits), the request will
only support a single IP version. If the target is a hostname, the IP proxy is
expected to perform DNS resolution to determine which route(s) to advertise to
the client. The IP proxy <bcp14>SHOULD</bcp14> send a ROUTE_ADVERTISEMENT capsule that includes
routes for all addresses that were resolved for the requested hostname, that are
accessible to the IP proxy, and belong to an address family for which the IP proxy
also sends an Assigned Address.</t>
          </dd>
          <dt>ipproto:</dt>
          <dd>
            <t>The variable "ipproto" contains an IP protocol number, as defined in the
"Assigned Internet Protocol Numbers" IANA registry maintained at
&lt;<eref target="https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml"/>&gt;.
If present, it specifies that a client only wants to proxy a specific IP
protocol for this request. If the value is "*", or the variable is not
included, the client is requesting to use any IP protocol.</t>
          </dd>
        </dl>
        <t>Using the terms IPv6address, IPv4address, and reg-name from <xref target="URI"/>, the
"target" and "ipproto" variables <bcp14>MUST</bcp14> adhere to the format in <xref target="target-format"/>,
using notation from <xref target="ABNF"/>. Additionally:</t>
        <ul spacing="normal">
          <li>if "target" contains an IPv6 literal or prefix, the colons (":") <bcp14>MUST</bcp14> be
percent-encoded. For example, if the target host is "2001:db8::42", it will be
encoded in the URI as "2001%3Adb8%3A%3A42".</li>
          <li>If present, the IP prefix length in "target" <bcp14>SHALL</bcp14> be preceded by a
percent-encoded slash ("/"): "%2F". The IP prefix length <bcp14>MUST</bcp14> represent an
integer between 0 and the length of the IP address in bits, inclusive.</li>
          <li>"ipproto" <bcp14>MUST</bcp14> represent an integer between 0 and 255 inclusive, or the
wildcard value "*".</li>
        </ul>
        <figure anchor="target-format">
          <name>URI Template Variable Format</name>
          <artwork type="ascii-art"><![CDATA[
target = IPv6prefix / IPv4prefix / reg-name / "*"
IPv6prefix = IPv6address ["%2F" 1*3DIGIT]
IPv4prefix = IPv4address ["%2F" 1*2DIGIT]
ipproto = 1*3DIGIT / "*"
]]></artwork>
        </figure>
      </section>
      <section anchor="capsules">
        <name>Capsules</name>
        <t>This document defines multiple new capsule types that allow endpoints to
exchange IP configuration information. Both endpoints <bcp14>MAY</bcp14> send any number of
these new capsules.</t>
        <section anchor="addressassign-capsule">
          <name>ADDRESS_ASSIGN Capsule</name>
          <t>The ADDRESS_ASSIGN capsule (see <xref target="iana-types"/> for the value of the capsule
type) allows an endpoint to inform its peer of the list of IP addresses or
prefixes it has assigned to it. Every capsule contains the full list of IP
prefixes currently assigned to the receiver. Any of these addresses can be
used as the source address on IP packets originated by the receiver of this
capsule.</t>
          <figure anchor="addr-assign-format">
            <name>ADDRESS_ASSIGN Capsule Format</name>
            <artwork><![CDATA[
ADDRESS_ASSIGN Capsule {
  Type (i) = ADDRESS_ASSIGN,
  Length (i),
  Assigned Address (..) ...,
}
]]></artwork>
          </figure>
          <t>The ADDRESS_ASSIGN capsule contains a sequence of zero or more Assigned
Addresses.</t>
          <figure anchor="assigned-addr-format">
            <name>Assigned Address Format</name>
            <artwork><![CDATA[
Assigned Address {
  Request ID (i),
  IP Version (8),
  IP Address (32..128),
  IP Prefix Length (8),
}
]]></artwork>
          </figure>
          <dl spacing="compact">
            <dt>Request ID:</dt>
            <dd>
              <t>Request identifier, encoded as a variable-length integer. If this address
assignment is in response to an Address Request (see <xref target="addr_req"/>), then this
field <bcp14>SHALL</bcp14> contain the value of the corresponding field in the request.
Otherwise, this field <bcp14>SHALL</bcp14> be zero.</t>
            </dd>
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this address assignment, encoded as an unsigned 8-bit integer.
<bcp14>MUST</bcp14> be either 4 or 6.</t>
            </dd>
            <dt>IP Address:</dt>
            <dd>
              <t>Assigned IP address. If the IP Version field has value 4, the IP Address
field <bcp14>SHALL</bcp14> have a length of 32 bits. If the IP Version field has value 6, the
IP Address field <bcp14>SHALL</bcp14> have a length of 128 bits.</t>
            </dd>
            <dt>IP Prefix Length:</dt>
            <dd>
              <t>The number of bits in the IP Address that are used to define the prefix that
is being assigned, encoded as an unsigned 8-bit integer. This <bcp14>MUST</bcp14> be less than
or equal to the length of the IP Address field, in bits. If the prefix length
is equal to the length of the IP Address, the receiver of this capsule is only
allowed to send packets from a single source address. If the prefix length is
less than the length of the IP address, the receiver of this capsule is allowed
to send packets from any source address that falls within the prefix.</t>
            </dd>
          </dl>
          <t>If an ADDRESS_ASSIGN capsule does not contain an address that was previously
transmitted in another ADDRESS_ASSIGN capsule, that indicates that the address
has been removed. An ADDRESS_ASSIGN capsule can also be empty, indicating that
all addresses have been removed.</t>
          <t>In some deployments of IP proxying in HTTP, an endpoint needs to be assigned an address
by its peer before it knows what source address to set on its own packets. For
example, in the Remote Access case (<xref target="example-remote"/>) the client cannot send
IP packets until it knows what address to use. In these deployments, the
endpoint that is expecting an address assignment <bcp14>MUST</bcp14> send an ADDRESS_REQUEST
capsule. This isn't required if the endpoint does not need any address
assignment, for example when it is configured out-of-band with static addresses.</t>
          <t>While ADDRESS_ASSIGN capsules are commonly sent in response to ADDRESS_REQUEST
capsules, endpoints <bcp14>MAY</bcp14> send ADDRESS_ASSIGN capsules unprompted.</t>
        </section>
        <section anchor="addr_req">
          <name>ADDRESS_REQUEST Capsule</name>
          <t>The ADDRESS_REQUEST capsule (see <xref target="iana-types"/> for the value of the capsule
type) allows an endpoint to request assignment of IP addresses from its peer.
The capsule allows the endpoint to optionally indicate a preference for which
address it would get assigned.</t>
          <figure anchor="addr-req-format">
            <name>ADDRESS_REQUEST Capsule Format</name>
            <artwork><![CDATA[
ADDRESS_REQUEST Capsule {
  Type (i) = ADDRESS_REQUEST,
  Length (i),
  Requested Address (..) ...,
}
]]></artwork>
          </figure>
          <t>The ADDRESS_REQUEST capsule contains a sequence of one or more Requested
Addresses.</t>
          <figure anchor="requested-addr-format">
            <name>Requested Address Format</name>
            <artwork><![CDATA[
Requested Address {
  Request ID (i),
  IP Version (8),
  IP Address (32..128),
  IP Prefix Length (8),
}
]]></artwork>
          </figure>
          <dl spacing="compact">
            <dt>Request ID:</dt>
            <dd>
              <t>Request identifier, encoded as a variable-length integer. This is the
identifier of this specific address request, each request from a given endpoint
carries a different identifier. Request IDs <bcp14>MUST NOT</bcp14> be reused by an endpoint,
and <bcp14>MUST NOT</bcp14> be zero.</t>
            </dd>
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this address request, encoded as an unsigned 8-bit integer.
<bcp14>MUST</bcp14> be either 4 or 6.</t>
            </dd>
            <dt>IP Address:</dt>
            <dd>
              <t>Requested IP address. If the IP Version field has value 4, the IP Address
field <bcp14>SHALL</bcp14> have a length of 32 bits. If the IP Version field has value 6, the
IP Address field <bcp14>SHALL</bcp14> have a length of 128 bits.</t>
            </dd>
            <dt>IP Prefix Length:</dt>
            <dd>
              <t>Length of the IP Prefix requested, in bits, encoded as an unsigned 8-bit
integer. <bcp14>MUST</bcp14> be lesser or equal to the length of the IP Address field, in bits.</t>
            </dd>
          </dl>
          <t>If the IP Address is all-zero (0.0.0.0 or ::), this indicates that the sender is
requesting an address of that address family but does not have a preference for
a specific address. In that scenario, the prefix length still indicates the
sender's preference for the prefix length it is requesting.</t>
          <t>Upon receiving the ADDRESS_REQUEST capsule, an endpoint <bcp14>SHOULD</bcp14> assign an IP
address to its peer, and then respond with an ADDRESS_ASSIGN capsule to inform
the peer of the assignment. Note that the receiver of the ADDRESS_REQUEST
capsule is not required to assign the requested address, and that it can also
assign some requested addresses but not others.</t>
          <t>If an endpoint receives an ADDRESS_REQUEST capsule that contains zero Requested
Addresses, it <bcp14>MUST</bcp14> abort the IP proxying request stream.</t>
        </section>
        <section anchor="routeadvertisement-capsule">
          <name>ROUTE_ADVERTISEMENT Capsule</name>
          <t>The ROUTE_ADVERTISEMENT capsule (see <xref target="iana-types"/> for the value of the capsule
type) allows an endpoint to communicate to its peer that it is willing to route
traffic to a set of IP address ranges. This indicates that the sender has an
existing route to each address range, and notifies its peer that if the receiver
of the ROUTE_ADVERTISEMENT capsule sends IP packets for one of these ranges in
HTTP Datagrams, the sender of the capsule will forward them along its
preexisting route. Any address which is in one of the address ranges can be used
as the destination address on IP packets originated by the receiver of this
capsule.</t>
          <figure anchor="route-adv-format">
            <name>ROUTE_ADVERTISEMENT Capsule Format</name>
            <artwork><![CDATA[
ROUTE_ADVERTISEMENT Capsule {
  Type (i) = ROUTE_ADVERTISEMENT,
  Length (i),
  IP Address Range (..) ...,
}
]]></artwork>
          </figure>
          <t>The ROUTE_ADVERTISEMENT capsule contains a sequence of IP Address Ranges.</t>
          <figure anchor="addr-range-format">
            <name>IP Address Range Format</name>
            <artwork><![CDATA[
IP Address Range {
  IP Version (8),
  Start IP Address (32..128),
  End IP Address (32..128),
  IP Protocol (8),
}
]]></artwork>
          </figure>
          <dl spacing="compact">
            <dt>IP Version:</dt>
            <dd>
              <t>IP Version of this range, encoded as an unsigned 8-bit integer. <bcp14>MUST</bcp14> be
either 4 or 6.</t>
            </dd>
            <dt>Start IP Address and End IP Address:</dt>
            <dd>
              <t>Inclusive start and end IP address of the advertised range. If the IP Version
field has value 4, these fields <bcp14>SHALL</bcp14> have a length of 32 bits. If the IP
Version field has value 6, these fields <bcp14>SHALL</bcp14> have a length of 128 bits. The
Start IP Address <bcp14>MUST</bcp14> be lesser or equal to the End IP Address.</t>
            </dd>
            <dt>IP Protocol:</dt>
            <dd>
              <t>The Internet Protocol Number for traffic that can be sent to this range,
encoded as an unsigned 8-bit integer. If the value is 0, all protocols are
allowed. ICMP traffic is always allowed, regardless of the value of this field.</t>
            </dd>
          </dl>
          <t>Upon receiving the ROUTE_ADVERTISEMENT capsule, an endpoint <bcp14>MAY</bcp14> start routing IP
packets in these ranges to its peer.</t>
          <t>Each ROUTE_ADVERTISEMENT contains the full list of address ranges. If multiple
ROUTE_ADVERTISEMENT capsules are sent in one direction, each ROUTE_ADVERTISEMENT
capsule supersedes prior ones. In other words, if a given address range was
present in a prior capsule but the most recently received ROUTE_ADVERTISEMENT
capsule does not contain it, the receiver will consider that range withdrawn.</t>
          <t>If multiple ranges using the same IP protocol were to overlap, some routing
table implementations might reject them. To prevent overlap, the ranges are
ordered; this places the burden on the sender and makes verification by the
receiver much simpler. If an IP Address Range A precedes an IP address range B
in the same ROUTE_ADVERTISEMENT capsule, they <bcp14>MUST</bcp14> follow these requirements:</t>
          <ul spacing="normal">
            <li>IP Version of A <bcp14>MUST</bcp14> be lesser or equal than IP Version of B</li>
            <li>If the IP Version of A and B are equal, the IP Protocol of A <bcp14>MUST</bcp14> be lesser or
equal than IP Protocol of B.</li>
            <li>If the IP Version and IP Protocol of A and B are both equal, the End IP
Address of A <bcp14>MUST</bcp14> be strictly less than the Start IP Address of B.</li>
          </ul>
          <t>If an endpoint receives a ROUTE_ADVERTISEMENT capsule that does not meet these
requirements, it <bcp14>MUST</bcp14> abort the IP proxying request stream.</t>
        </section>
      </section>
    </section>
    <section anchor="context-identifiers">
      <name>Context Identifiers</name>
      <t>The mechanism for proxying IP in HTTP defined in this document allows future
extensions to exchange HTTP Datagrams that carry different semantics from IP
payloads. Some of these extensions can augment IP payloads with additional
data or compress IP header fields, while others can exchange data that is
completely separate from IP payloads. In order to accomplish this, all HTTP
Datagrams associated with IP proxying request streams start with a Context ID
field; see <xref target="payload-format"/>.</t>
      <t>Context IDs are 62-bit integers (0 to 2<sup>62</sup>-1). Context IDs are encoded
as variable-length integers; see <xref section="16" sectionFormat="of" target="QUIC"/>. The Context ID
value of 0 is reserved for IP payloads, while non-zero values are dynamically
allocated. Non-zero even-numbered Context IDs are client-allocated, and
odd-numbered Context IDs are proxy-allocated. The Context ID namespace is tied
to a given HTTP request; it is possible for a Context ID with the same numeric
value to be simultaneously allocated in distinct requests, potentially with
different semantics. Context IDs <bcp14>MUST NOT</bcp14> be re-allocated within a given HTTP
namespace but <bcp14>MAY</bcp14> be allocated in any order. The Context ID allocation
restrictions to the use of even-numbered and odd-numbered Context IDs exist in
order to avoid the need for synchronization between endpoints. However, once a
Context ID has been allocated, those restrictions do not apply to the use of the
Context ID; it can be used by any client or IP proxy, independent of which
endpoint initially allocated it.</t>
      <t>Registration is the action by which an endpoint informs its peer of the
semantics and format of a given Context ID. This document does not define how
registration occurs. Future extensions <bcp14>MAY</bcp14> use HTTP header fields or capsules to
register Context IDs. Depending on the method being used, it is possible for
datagrams to be received with Context IDs that have not yet been registered. For
instance, this can be due to reordering of the packet containing the datagram
and the packet containing the registration message during transmission.</t>
    </section>
    <section anchor="payload-format">
      <name>HTTP Datagram Payload Format</name>
      <t>When associated with IP proxying request streams, the HTTP Datagram Payload
field of HTTP Datagrams (see <xref target="HTTP-DGRAM"/>) has the format defined in
<xref target="dgram-format"/>. Note that when HTTP Datagrams are encoded using QUIC DATAGRAM
frames, the Context ID field defined below directly follows the Quarter Stream
ID field which is at the start of the QUIC DATAGRAM frame payload:</t>
      <figure anchor="dgram-format">
        <name>IP Proxying HTTP Datagram Format</name>
        <artwork><![CDATA[
IP Proxying HTTP Datagram Payload {
  Context ID (i),
  Payload (..),
}
]]></artwork>
      </figure>
      <dl spacing="compact">
        <dt>Context ID:</dt>
        <dd>
          <t>A variable-length integer that contains the value of the Context ID. If an
HTTP/3 datagram which carries an unknown Context ID is received, the receiver
<bcp14>SHALL</bcp14> either drop that datagram silently or buffer it temporarily (on the order
of a round trip) while awaiting the registration of the corresponding Context ID.</t>
        </dd>
        <dt>Payload:</dt>
        <dd>
          <t>The payload of the datagram, whose semantics depend on value of the previous
field. Note that this field can be empty.</t>
        </dd>
      </dl>
      <t>IP packets are encoded using HTTP Datagrams with the Context ID set to zero.
When the Context ID is set to zero, the Payload field contains a full IP packet
(from the IP Version field until the last byte of the IP Payload).</t>
      <t>Clients <bcp14>MAY</bcp14> optimistically start sending proxied IP packets before receiving the
response to its IP proxying request, noting however that those may not be
processed by the IP proxy if it responds to the request with a failure, or if the
datagrams are received by the IP proxy before the request. Since receiving
addresses and routes is required in order to know that a packet can be sent
through the tunnel, such optimistic packets might be dropped by the IP proxy if it
chooses to provide different addressing or routing information than what the
client assumed.</t>
      <t>When an endpoint receives an HTTP Datagram containing an IP packet, it
will parse the packet's IP header, perform any local policy checks (e.g., source
address validation), check their routing table to pick an outbound interface,
and then send the IP packet on that interface or pass it to a local application.</t>
      <t>In the other direction, when an endpoint receives an IP packet, it checks to see
if the packet matches the routes mapped for an IP tunnel, and performs the same
forwarding checks as above before transmitting the packet over HTTP Datagrams.</t>
      <t>Note that endpoints will decrement the IP Hop Count (or TTL) upon
encapsulation but not decapsulation. In other words, the Hop Count is
decremented right before an IP packet is transmitted in an HTTP Datagram. This
prevents infinite loops in the presence of routing loops, and matches the
choices in IPsec <xref target="IPSEC"/>.</t>
      <t>IPv6 requires that every link have an MTU of at least 1280 bytes
<xref target="IPv6"/>. Since IP proxying in HTTP conveys IP packets in HTTP Datagrams and
those can in turn be sent in QUIC DATAGRAM frames which cannot be fragmented
<xref target="DGRAM"/>, the MTU of an IP tunnel can be limited by the MTU of
the QUIC connection that IP proxying is operating over. This can lead to
situations where the IPv6 minimum link MTU is violated. IP proxying endpoints
that support IPv6 <bcp14>MUST</bcp14> ensure that the IP tunnel link MTU is at least
1280 (i.e., that they can send HTTP Datagrams with payloads of at least 1280
bytes). This can be accomplished using various techniques:</t>
      <ul spacing="normal">
        <li>if both IP proxying endpoints know for certain that HTTP intermediaries are not in use,
the endpoints can pad the QUIC INITIAL packets of the underlying QUIC
connection that IP proxying is running over. (Assuming QUIC version 1 is in
use, the overhead is 1 byte type, 20 bytes maximal connection ID length, 4
bytes maximal packet number length, 1 byte DATAGRAM frame type, 8 bytes
maximal quarter stream ID, one byte for the zero Context ID, and 16 bytes for
the AEAD authentication tag, for a total of 51 bytes of overhead which
corresponds to padding QUIC INITIAL packets to 1331 bytes or more.)</li>
        <li>IP proxying endpoints can also send ICMPv6 echo requests with 1232 bytes of
data to ascertain the link MTU and tear down the tunnel if they do not receive
a response. Unless endpoints have an out of band means of guaranteeing that
the previous techniques is sufficient, they <bcp14>MUST</bcp14> use this method.</li>
      </ul>
      <t>If an endpoint is using QUIC DATAGRAM frames to convey IPv6 packets, and it
detects that the QUIC MTU is too low to allow sending 1280 bytes, it <bcp14>MUST</bcp14> abort
the IP proxying request stream.</t>
      <t>Endpoints <bcp14>MAY</bcp14> implement additional filtering policies on the IP packets they
forward.</t>
    </section>
    <section anchor="error-signalling">
      <name>Error Signalling</name>
      <t>Since IP proxying endpoints often forward IP packets onwards to other network
interfaces, they need to handle errors in the forwarding process. For example,
forwarding can fail if the endpoint does not have a route for the destination
address, or if it is configured to reject a destination prefix by policy, or if
the MTU of the outgoing link is lower than the size of the packet to be
forwarded. In such scenarios, IP proxying endpoints <bcp14>SHOULD</bcp14> use ICMP
<xref target="ICMP"/> <xref target="ICMPv6"/> to signal the forwarding error to its peer.</t>
      <t>Endpoints are free to select the most appropriate ICMP errors to send. Some
examples that are relevant for IP proxying include:</t>
      <ul spacing="normal">
        <li>For invalid source addresses, send Destination Unreachable <xref section="3.1" sectionFormat="of" target="ICMPv6"/> with code 5, "Source address failed ingress/egress policy".</li>
        <li>For unroutable destination addresses, send Destination Unreachable <xref section="3.1" sectionFormat="of" target="ICMPv6"/> with a code 0, "No route to destination", or code 1,
"Communication with destination administratively prohibited".</li>
        <li>For packets that cannot fit within the MTU of the outgoing link, send Packet
Too Big <xref section="3.2" sectionFormat="of" target="ICMPv6"/>.</li>
      </ul>
      <t>In order to receive these errors, endpoints need to be prepared to receive ICMP packets.
If an endpoint sends ROUTE_ADVERTISEMENT capsules, its routes <bcp14>SHOULD</bcp14> include an allowance
for receiving ICMP messages. If an endpoint does not send ROUTE_ADVERTISEMENT capsules,
such as a client opening an IP flow through an IP proxy, it <bcp14>SHOULD</bcp14> process proxied ICMP packets
from its peer in order to receive these errors. Note that ICMP messages can originate from
a source address different from that of the IP proxying peer.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>IP proxying in HTTP enables many different use cases that can benefit from IP packet
proxying and tunnelling. These examples are provided to help illustrate some of
the ways in which IP proxying in HTTP can be used.</t>
      <section anchor="example-remote">
        <name>Remote Access VPN</name>
        <t>The following example shows a point-to-network VPN setup, where a client
receives a set of local addresses, and can send to any remote host through
the IP proxy. Such VPN setups can be either full-tunnel or split-tunnel.</t>
        <figure anchor="diagram-tunnel">
          <name>VPN Tunnel Setup</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="512" viewBox="0 0 512 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,96" fill="none" stroke="black"/>
                <path d="M 248,32 L 248,96" fill="none" stroke="black"/>
                <path d="M 320,32 L 320,96" fill="none" stroke="black"/>
                <path d="M 416,32 L 416,96" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 248,32 L 320,32" fill="none" stroke="black"/>
                <path d="M 416,32 L 448,32" fill="none" stroke="black"/>
                <path d="M 88,48 L 240,48" fill="none" stroke="black"/>
                <path d="M 192,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 328,64 L 448,64" fill="none" stroke="black"/>
                <path d="M 88,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 8,96 L 80,96" fill="none" stroke="black"/>
                <path d="M 248,96 L 320,96" fill="none" stroke="black"/>
                <path d="M 416,96 L 448,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="456,96 444,90.4 444,101.6" fill="black" transform="rotate(0,448,96)"/>
                <polygon class="arrowhead" points="456,64 444,58.4 444,69.6" fill="black" transform="rotate(0,448,64)"/>
                <polygon class="arrowhead" points="456,32 444,26.4 444,37.6" fill="black" transform="rotate(0,448,32)"/>
                <polygon class="arrowhead" points="224,64 212,58.4 212,69.6" fill="black" transform="rotate(0,216,64)"/>
                <polygon class="arrowhead" points="200,64 188,58.4 188,69.6" fill="black" transform="rotate(180,192,64)"/>
                <g class="text">
                  <text x="100" y="36">IP</text>
                  <text x="120" y="36">A</text>
                  <text x="212" y="36">IP</text>
                  <text x="232" y="36">B</text>
                  <text x="468" y="36">IP</text>
                  <text x="488" y="36">D</text>
                  <text x="284" y="52">IP</text>
                  <text x="340" y="52">IP</text>
                  <text x="360" y="52">C</text>
                  <text x="44" y="68">Client</text>
                  <text x="100" y="68">IP</text>
                  <text x="140" y="68">Subnet</text>
                  <text x="176" y="68">C</text>
                  <text x="232" y="68">?</text>
                  <text x="288" y="68">Proxy</text>
                  <text x="468" y="68">IP</text>
                  <text x="488" y="68">E</text>
                  <text x="468" y="100">IP</text>
                  <text x="496" y="100">...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------+ IP A          IP B +--------+           +---> IP D
|        |--------------------|   IP   | IP C      |
| Client | IP Subnet C <--> ? |  Proxy |-----------+---> IP E
|        |--------------------|        |           |
+--------+                    +--------+           +---> IP ...

]]></artwork>
          </artset>
        </figure>
        <t>In this case, the client does not specify any scope in its request. The IP proxy
assigns the client an IPv4 address (192.0.2.11) and a full-tunnel route of all
IPv4 addresses (0.0.0.0/0). The client can then send to any IPv4 host using a
source address in its assigned prefix.</t>
        <figure anchor="fig-full-tunnel">
          <name>VPN Full-Tunnel Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From IP Proxy ]]

SETTINGS
  H3_DATAGRAM = 1

                              SETTINGS
                                ENABLE_CONNECT_PROTOCOL = 1
                                H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /vpn
:authority = proxy.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.11
                              IP Prefix Length = 32

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 0.0.0.0
                               End IP Address = 255.255.255.255
                               IP Protocol = 0) // Any

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IP Packet

                              DATAGRAM
                              Quarter Stream ID = 11
                              Context ID = 0
                              Payload = Encapsulated IP Packet
]]></artwork>
        </figure>
        <t>A setup for a split-tunnel VPN (the case where the client can only access a
specific set of private subnets) is quite similar. In this case, the advertised
route is restricted to 192.0.2.0/24, rather than 0.0.0.0/0.</t>
        <figure anchor="fig-split-tunnel">
          <name>VPN Split-Tunnel Capsule Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From IP Proxy ]]

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.42
                              IP Prefix Length = 32

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 192.0.2.0
                               End IP Address = 192.0.2.255
                               IP Protocol = 0) // Any
]]></artwork>
        </figure>
      </section>
      <section anchor="ip-flow-forwarding">
        <name>IP Flow Forwarding</name>
        <t>The following example shows an IP flow forwarding setup, where a client requests
to establish a forwarding tunnel to target.example.com using SCTP (IP protocol
132), and receives a single local address and remote address it can use for
transmitting packets. A similar approach could be used for any other IP protocol
that isn't easily proxied with existing HTTP methods, such as ICMP, ESP, etc.</t>
        <figure anchor="diagram-flow">
          <name>Proxied Flow Setup</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="440" viewBox="0 0 440 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,96" fill="none" stroke="black"/>
                <path d="M 240,32 L 240,96" fill="none" stroke="black"/>
                <path d="M 312,32 L 312,96" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 240,32 L 312,32" fill="none" stroke="black"/>
                <path d="M 88,48 L 232,48" fill="none" stroke="black"/>
                <path d="M 160,64 L 184,64" fill="none" stroke="black"/>
                <path d="M 320,64 L 392,64" fill="none" stroke="black"/>
                <path d="M 88,80 L 232,80" fill="none" stroke="black"/>
                <path d="M 8,96 L 80,96" fill="none" stroke="black"/>
                <path d="M 240,96 L 312,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="400,64 388,58.4 388,69.6" fill="black" transform="rotate(0,392,64)"/>
                <polygon class="arrowhead" points="192,64 180,58.4 180,69.6" fill="black" transform="rotate(0,184,64)"/>
                <polygon class="arrowhead" points="168,64 156,58.4 156,69.6" fill="black" transform="rotate(180,160,64)"/>
                <g class="text">
                  <text x="100" y="36">IP</text>
                  <text x="120" y="36">A</text>
                  <text x="204" y="36">IP</text>
                  <text x="224" y="36">B</text>
                  <text x="276" y="52">IP</text>
                  <text x="332" y="52">IP</text>
                  <text x="352" y="52">C</text>
                  <text x="44" y="68">Client</text>
                  <text x="124" y="68">IP</text>
                  <text x="144" y="68">C</text>
                  <text x="200" y="68">D</text>
                  <text x="280" y="68">Proxy</text>
                  <text x="412" y="68">IP</text>
                  <text x="432" y="68">D</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------+ IP A         IP B +--------+
|        |-------------------|   IP   | IP C
| Client |    IP C <--> D    |  Proxy |---------> IP D
|        |-------------------|        |
+--------+                   +--------+

]]></artwork>
          </artset>
        </figure>
        <t>In this case, the client specfies both a target hostname and an IP protocol
number in the scope of its request, indicating that it only needs to communicate
with a single host. The IP proxy is able to perform DNS resolution on behalf
of the client and allocate a specific outbound socket for the client instead of
allocating an entire IP address to the client. In this regard, the request is
similar to a traditional CONNECT proxy request.</t>
        <t>The IP proxy assigns a single IPv6 address to the client (2001:db8:1234::a) and
a route to a single IPv6 host (2001:db8:3456::b), scoped to SCTP. The client can
send and receive SCTP IP packets to the remote host.</t>
        <figure anchor="fig-flow">
          <name>Proxied SCTP Flow Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From IP Proxy ]]

SETTINGS
  H3_DATAGRAM = 1

                              SETTINGS
                                ENABLE_CONNECT_PROTOCOL = 1
                                H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?target=target.example.com&ipproto=132
:authority = proxy.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 6
                              IP Address = 2001:db8:1234::a
                              IP Prefix Length = 128

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 6
                               Start IP Address = 2001:db8:3456::b
                               End IP Address = 2001:db8:3456::b
                               IP Protocol = 132)

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated SCTP/IP Packet

                              DATAGRAM
                              Quarter Stream ID = 11
                              Context ID = 0
                              Payload = Encapsulated SCTP/IP Packet
]]></artwork>
        </figure>
      </section>
      <section anchor="proxied-connection-racing">
        <name>Proxied Connection Racing</name>
        <t>The following example shows a setup where a client is proxying UDP packets
through an IP proxy in order to control connection establishment racing
through an IP proxy, as defined in Happy Eyeballs <xref target="HEv2"/>. This example is
a variant of the proxied flow, but highlights how IP-level proxying can enable
new capabilities even for TCP and UDP.</t>
        <figure anchor="diagram-racing">
          <name>Proxied Connection Racing Setup</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="472" viewBox="0 0 472 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,32 L 8,112" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,112" fill="none" stroke="black"/>
                <path d="M 240,32 L 240,112" fill="none" stroke="black"/>
                <path d="M 312,32 L 312,112" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 240,32 L 312,32" fill="none" stroke="black"/>
                <path d="M 88,48 L 232,48" fill="none" stroke="black"/>
                <path d="M 320,48 L 424,48" fill="none" stroke="black"/>
                <path d="M 144,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 144,80 L 168,80" fill="none" stroke="black"/>
                <path d="M 88,96 L 232,96" fill="none" stroke="black"/>
                <path d="M 320,96 L 424,96" fill="none" stroke="black"/>
                <path d="M 8,112 L 80,112" fill="none" stroke="black"/>
                <path d="M 240,112 L 312,112" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="432,96 420,90.4 420,101.6" fill="black" transform="rotate(0,424,96)"/>
                <polygon class="arrowhead" points="432,48 420,42.4 420,53.6" fill="black" transform="rotate(0,424,48)"/>
                <polygon class="arrowhead" points="328,96 316,90.4 316,101.6" fill="black" transform="rotate(180,320,96)"/>
                <polygon class="arrowhead" points="328,48 316,42.4 316,53.6" fill="black" transform="rotate(180,320,48)"/>
                <polygon class="arrowhead" points="176,80 164,74.4 164,85.6" fill="black" transform="rotate(0,168,80)"/>
                <polygon class="arrowhead" points="176,64 164,58.4 164,69.6" fill="black" transform="rotate(0,168,64)"/>
                <polygon class="arrowhead" points="152,80 140,74.4 140,85.6" fill="black" transform="rotate(180,144,80)"/>
                <polygon class="arrowhead" points="152,64 140,58.4 140,69.6" fill="black" transform="rotate(180,144,64)"/>
                <g class="text">
                  <text x="100" y="36">IP</text>
                  <text x="120" y="36">A</text>
                  <text x="204" y="36">IP</text>
                  <text x="224" y="36">B</text>
                  <text x="332" y="36">IP</text>
                  <text x="352" y="36">C</text>
                  <text x="444" y="52">IP</text>
                  <text x="464" y="52">E</text>
                  <text x="44" y="68">Client</text>
                  <text x="108" y="68">IP</text>
                  <text x="128" y="68">C</text>
                  <text x="184" y="68">E</text>
                  <text x="276" y="68">IP</text>
                  <text x="128" y="84">D</text>
                  <text x="184" y="84">F</text>
                  <text x="280" y="84">Proxy</text>
                  <text x="444" y="100">IP</text>
                  <text x="464" y="100">F</text>
                  <text x="332" y="116">IP</text>
                  <text x="352" y="116">D</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------+ IP A         IP B +--------+ IP C
|        |-------------------|        |<------------> IP E
| Client |  IP C <--> E      |   IP   |
|        |     D <--> F      |  Proxy |
|        |-------------------|        |<------------> IP F
+--------+                   +--------+ IP D

]]></artwork>
          </artset>
        </figure>
        <t>As with proxied flows, the client specfies both a target hostname and an IP
protocol number in the scope of its request. When the IP proxy performs DNS
resolution on behalf of the client, it can send the various remote address
options to the client as separate routes. It can also ensure that the client has
both IPv4 and IPv6 addresses assigned.</t>
        <t>The IP proxy assigns the client both an IPv4 address (192.0.2.3) and an IPv6
address (2001:db8:1234::a) to the client, as well as an IPv4 route
(198.51.100.2) and an IPv6 route (2001:db8:3456::b), which represent the resolved
addresses of the target hostname, scoped to UDP. The client can send and recieve
UDP IP packets to the either of the IP proxy addresses to enable Happy Eyeballs
through the IP proxy.</t>
        <figure anchor="fig-listen">
          <name>Proxied Connection Racing Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From IP Proxy ]]

SETTINGS
  H3_DATAGRAM = 1

                              SETTINGS
                                ENABLE_CONNECT_PROTOCOL = 1
                                H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /proxy?ipproto=17
:authority = proxy.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

                              STREAM(44): CAPSULE
                              Capsule Type = ADDRESS_ASSIGN
                              IP Version = 4
                              IP Address = 192.0.2.3
                              IP Prefix Length = 32
                              IP Version = 6
                              IP Address = 2001:db8::1234:1234
                              IP Prefix Length = 128

                              STREAM(44): CAPSULE
                              Capsule Type = ROUTE_ADVERTISEMENT
                              (IP Version = 4
                               Start IP Address = 198.51.100.2
                               End IP Address = 198.51.100.2
                               IP Protocol = 17),
                              (IP Version = 6
                               Start IP Address = 2001:db8:3456::b
                               End IP Address = 2001:db8:3456::b
                               IP Protocol = 17)
...

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv6 Packet

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated IPv4 Packet

]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="extensibility-considerations">
      <name>Extensibility Considerations</name>
      <t>Extensions to IP proxying in HTTP can define behavior changes to this mechanism. Such
extensions <bcp14>SHOULD</bcp14> define new capsule types to exchange configuration information
if needed. It is <bcp14>RECOMMENDED</bcp14> for extensions that modify addressing to specify
that their extension capsules be sent before the ADDRESS_ASSIGN capsule and that
they do not take effect until the ADDRESS_ASSIGN capsule is parsed. This allows
modifications to address assignement to operate atomically. Similarly,
extensions that modify routing <bcp14>SHOULD</bcp14> behave similarly with regards to the
ROUTE_ADVERTISEMENT capsule.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>There are significant risks in allowing arbitrary clients to establish a tunnel
that permits sending to arbitrary hosts, as that could allow bad actors to send traffic and have it
attributed to the IP proxy. IP proxies <bcp14>SHOULD</bcp14> restrict its use
to authenticated users. The HTTP Authorization header <xref target="HTTP"/> <bcp14>MAY</bcp14> be
used to authenticate clients. More complex authentication schemes are out of
scope for this document but can be implemented using extensions.</t>
      <t>Falsifying IP source addresses in sent traffic has been common for denial of
service attacks. Implementations of this mechanism need to ensure that they do
not facilitate such attacks. In particular, there are scenarios where an
endpoint knows that its peer is only allowed to send IP packets from a given
prefix. For example, that can happen through out of band configuration
information, or when allowed prefixes are shared via ADDRESS_ASSIGN capsules. In
such scenarios, endpoints <bcp14>MUST</bcp14> follow the recommendations from
<xref target="BCP38"/> to prevent source address spoofing.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-upgrade-token">
        <name>HTTP Upgrade Token</name>
        <t>This document will request IANA to register "connect-ip" in the HTTP Upgrade
Token Registry maintained at
&lt;<eref target="https://www.iana.org/assignments/http-upgrade-tokens"/>&gt;.</t>
        <dl spacing="compact">
          <dt>Value:</dt>
          <dd>
            <t>connect-ip</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Proxying of IP Payloads</t>
          </dd>
          <dt>Expected Version Tokens:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>References:</dt>
          <dd>
            <t>This document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-uri">
        <name>Updates to masque Well-Known URI</name>
        <t>This document will request IANA to update the entry for the "masque"
URI suffix in the "Well-Known URIs" registry maintained at
&lt;<eref target="https://www.iana.org/assignments/well-known-uris"/>&gt;.</t>
        <t>IANA is requested to update the "Reference" field to include this
document in addition to previous values from that field.</t>
        <dl spacing="compact">
          <dt>IANA is requested to add the following sentence to the "Related Information"</dt>
          <dd>
            <t/>
          </dd>
          <dt>field:</dt>
          <dd>
            <t>Includes all resources identified with the path prefix "/.well-known/masque/ip/".</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-types">
        <name>Capsule Type Registrations</name>
        <t>This document will request IANA to add the following values to the "HTTP
Capsule Types" registry maintained at
&lt;<eref target="https://www.iana.org/assignments/http-capsule-protocol/http-capsule-protocol.xhtml"/>&gt;.</t>
        <table anchor="iana-capsules-table">
          <name>New Capsules</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x1ECA6A00</td>
              <td align="left">ADDRESS_ASSIGN</td>
              <td align="left">Address Assignment</td>
              <td align="left">This Document</td>
            </tr>
            <tr>
              <td align="left">0x1ECA6A01</td>
              <td align="left">ADDRESS_REQUEST</td>
              <td align="left">Address Request</td>
              <td align="left">This Document</td>
            </tr>
            <tr>
              <td align="left">0x1ECA6A02</td>
              <td align="left">ROUTE_ADVERTISEMENT</td>
              <td align="left">Route Advertisement</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="H1" to="HTTP/1.1"/>
    <displayreference target="H2" to="HTTP/2"/>
    <displayreference target="H3" to="HTTP/3"/>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="H1">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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 specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns. </t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="H2">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="H3">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <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="TCP">
          <front>
            <title>Transmission Control Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel">
              <organization/>
            </author>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="RFC" value="793"/>
          <seriesInfo name="DOI" value="10.17487/RFC0793"/>
        </reference>
        <reference anchor="TEMPLATE">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Hadley" initials="M." surname="Hadley">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="D. Orchard" initials="D." surname="Orchard">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="L. Pardue" initials="L." surname="Pardue">
              <organization/>
            </author>
            <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="EXT-CONNECT2">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus">
              <organization/>
            </author>
            <date month="September" year="2018"/>
            <abstract>
              <t>This document defines a mechanism for running the WebSocket Protocol (RFC 6455) over a single stream of an HTTP/2 connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8441"/>
          <seriesInfo name="DOI" value="10.17487/RFC8441"/>
        </reference>
        <reference anchor="EXT-CONNECT3">
          <front>
            <title>Bootstrapping WebSockets with HTTP/3</title>
            <author fullname="R. Hamilton" initials="R." surname="Hamilton">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The mechanism for running the WebSocket Protocol over a single stream of an HTTP/2 connection is equally applicable to HTTP/3, but the HTTP-version-specific details need to be specified. This document describes how the mechanism is adapted for HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9220"/>
          <seriesInfo name="DOI" value="10.17487/RFC9220"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <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>
        <reference anchor="ABNF">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="November" year="1997"/>
            <abstract>
              <t>In the early days of the Arpanet, each specification contained its own definition of ABNF.  This included the email specifications, RFC733 and then RFC822 which have come to be the common citations for defining ABNF.  The current document separates out that definition, to permit selective reference.  Predictably, it also provides some modifications and enhancements.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2234"/>
          <seriesInfo name="DOI" value="10.17487/RFC2234"/>
        </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">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <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="IPv6">
          <front>
            <title>Internet Protocol, Version 6 (IPv6) Specification</title>
            <author fullname="S. Deering" initials="S." surname="Deering">
              <organization/>
            </author>
            <author fullname="R. Hinden" initials="R." surname="Hinden">
              <organization/>
            </author>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document specifies version 6 of the Internet Protocol (IPv6). It obsoletes RFC 2460.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="86"/>
          <seriesInfo name="RFC" value="8200"/>
          <seriesInfo name="DOI" value="10.17487/RFC8200"/>
        </reference>
        <reference anchor="DGRAM">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear">
              <organization/>
            </author>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="ICMP">
          <front>
            <title>Internet Control Message Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel">
              <organization/>
            </author>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="792"/>
          <seriesInfo name="DOI" value="10.17487/RFC0792"/>
        </reference>
        <reference anchor="ICMPv6">
          <front>
            <title>Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification</title>
            <author fullname="A. Conta" initials="A." surname="Conta">
              <organization/>
            </author>
            <author fullname="S. Deering" initials="S." surname="Deering">
              <organization/>
            </author>
            <author fullname="M. Gupta" initials="M." role="editor" surname="Gupta">
              <organization/>
            </author>
            <date month="March" year="2006"/>
            <abstract>
              <t>This document describes the format of a set of control messages used in ICMPv6 (Internet Control Message Protocol).  ICMPv6 is the Internet Control Message Protocol for Internet Protocol version 6 (IPv6).  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="89"/>
          <seriesInfo name="RFC" value="4443"/>
          <seriesInfo name="DOI" value="10.17487/RFC4443"/>
        </reference>
        <reference anchor="BCP38">
          <front>
            <title>Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing</title>
            <author fullname="P. Ferguson" initials="P." surname="Ferguson">
              <organization/>
            </author>
            <author fullname="D. Senie" initials="D." surname="Senie">
              <organization/>
            </author>
            <date month="May" year="2000"/>
            <abstract>
              <t>This paper discusses a simple, effective, and straightforward method for using ingress traffic filtering to prohibit DoS (Denial of Service) attacks which use forged IP addresses to be propagated from 'behind' an Internet Service Provider's (ISP) aggregation point.  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="38"/>
          <seriesInfo name="RFC" value="2827"/>
          <seriesInfo name="DOI" value="10.17487/RFC2827"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <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="IPSEC">
          <front>
            <title>Security Architecture for the Internet Protocol</title>
            <author fullname="S. Kent" initials="S." surname="Kent">
              <organization/>
            </author>
            <author fullname="K. Seo" initials="K." surname="Seo">
              <organization/>
            </author>
            <date month="December" year="2005"/>
            <abstract>
              <t>This document describes an updated version of the "Security Architecture for IP", which is designed to provide security services for traffic at the IP layer.  This document obsoletes RFC 2401 (November 1998).  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4301"/>
          <seriesInfo name="DOI" value="10.17487/RFC4301"/>
        </reference>
        <reference anchor="HEv2">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>Many communication protocols operating over the modern Internet use hostnames.  These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics.  Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly.  This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs".  This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="PROXY-REQS">
          <front>
            <title>Requirements for a MASQUE Protocol to Proxy IP Traffic</title>
            <author fullname="Alex Chernyakhovsky" initials="A." surname="Chernyakhovsky">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Dallas McCall" initials="D." surname="McCall">
              <organization>Google LLC</organization>
            </author>
            <author fullname="David Schinazi" initials="D." surname="Schinazi">
              <organization>Google LLC</organization>
            </author>
            <date day="27" month="August" year="2021"/>
            <abstract>
              <t>   There is interest among MASQUE working group participants in
   designing a protocol that can proxy IP traffic over HTTP.  This
   document describes the set of requirements for such a protocol.

   Discussion of this work is encouraged to happen on the MASQUE IETF
   mailing list masque@ietf.org or on the GitHub repository which
   contains the draft: https://github.com/ietf-wg-masque/draft-ietf-
   masque-ip-proxy-reqs.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-ip-proxy-reqs-03"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The design of this method was inspired by discussions in the MASQUE working
group around <xref target="PROXY-REQS"/>. The authors would
like to thank participants in those discussions for their feedback.
Additionally, <contact fullname="Alejandro Sedeño"/> provided valuable feedback on the
document.</t>
      <t>Most of the text on client configuration is based on the corresponding text in
<xref target="CONNECT-UDP"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1921YjyZXoe3xFWHVmDLYkkKCrqunG3SpQdbGmLhiotr08
Xr0SKQTpSmXKmSkojKu/5fzC+YWZHzv7FrdUStAXr+PxMTPugsyMiB07dux7
7Oj1eqpO68wc6M5pWXy8S/MrfXKq01y/urg47ahpMcmTObyelsms7qWmnvXm
SfWXpelNijw3E3i26O3uq5sDvaeq5eU8raq0yOu7BTQ6GV+8VJOkNldFeXeg
q3qqktIkB/qiTPJqUZS1ur060G9G5799P1b5cn5pygM1hQYHCrqvTF4tqwNd
l0ujbky+hMdaX5XFcgHwcqsOPOHBOr8ryg8I/zf4AT6fJ2kGzxnerxH2flFe
4ZuknFzDm+u6XlQHOzv4IT5Kb0zffraDD3Yuy+K2MjvcxQ42vUrr6+UlNCZc
3F4JOnY2IQjbZTCrqg4Gjdv3ud9+WmzsaePL/nU9zzrqg7m7Lcop4qqn/7JM
J/QLDku/AHqTqzKZ0x/fnr6lfxe4+PRbvYTusso1RlpYThf4DxOG67FelkA5
lU6yTNfXRt8md3pa3Ob0koFzI/fyK5Us6+uiJLDgfxr6grW96OvTZJnd0RMm
tYtiPr8LnpYF0qeZpnVR0gNYnSRP/5rUQGgHerRYZEaf5JM+vTS86vUC23+d
4Mv+pJjHox739Tksd578NQ0GPk5u0mn8AoY60N8UxRUM8fr1ET2r6tIYWMnB
091dPZovrmHlTAIPAebyA2CBvpqkNZD8m2KZ1wlg7dvU3PJszBWBfTTiz4op
jPz5/u7+nvwNDXCzvM/T2gA0NdKNLmYwkinTSRJOcloJrES1X1/h09XJjvr6
6NqU+V3y4bq4qT6EuB5l5mPb2xjFDQTI6MmE2319Ra9XB37T1/+xNNeZuU3z
aTDom7T8c9J8FY84hqlWVZGH482xWf+Da/a1kY9aR/4d7DZTZst45OQqX1bN
d48Ymtr1b127eOy8KOfQ+ob406vBATU9PNBnL48+HwyG9Oc0rRZZAguLjHVn
0B/gp8PGp3stn2LzV3uND/dbPtxTqtfr6eQSCDSZ1EpdXKcV7MjJcm7yWk9N
NSnTSyCm6+JW1wXvedzUi2TywdSV5fp9TQ3hdV1MikynlarSOXJIbPX++JRb
IquVFl19uayRDwCzBG4NvH2e1jV+kJSXKTwow3H66k0Bm6VamEk6A4rOsrsu
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

-->

</rfc>
