<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-connect-tcp-16" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-connect-tcp-16"/>
    <author initials="B. M." surname="Schwartz" fullname="Benjamin M. Schwartz">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <date year="2026" month="October" day="16"/>
    <area>wit</area>
    <workgroup>httpbis</workgroup>
    <abstract>
      <?line 45?>

<t>TCP tunneling using HTTP CONNECT has long been part of the core HTTP specification.  However, this tunneling functionality has several important deficiencies due to the lack of a well-defined HTTP origin or path.  This specification defines an alternative HTTP proxy service configuration for TCP connections.  This configuration is described by a URI Template, similar to the CONNECT-UDP and CONNECT-IP protocols.</t>
    </abstract>
  </front>
  <middle>
    <?line 49?>

<section anchor="introduction">
      <name>Introduction</name>
      <section anchor="history">
        <name>History</name>
        <t>HTTP has used the CONNECT method for tunneling TCP connections since HTTP/1.1.  When using CONNECT, the request target specifies a host and port number, and the proxy forwards TCP payloads between the client and the target destination (<xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>). To date, this is the only mechanism defined for proxying TCP over HTTP.  In this specification, this is referred to as a "classic HTTP CONNECT proxy".</t>
        <t>HTTP/3 <xref target="RFC9114"/> uses a UDP transport, so it cannot be forwarded using the pre-existing CONNECT mechanism.  To enable forward proxying of HTTP/3, the MASQUE effort has defined proxy mechanisms that are capable of tunneling UDP datagrams <xref target="CONNECT-UDP"/>, and more generally IP datagrams <xref target="CONNECT-IP"/>.  The destination host and port number (if applicable) are encoded into the HTTP resource path, and end-to-end datagrams are wrapped into HTTP Datagrams <xref target="CAPSULE"/> on the client-proxy path.</t>
      </section>
      <section anchor="problems">
        <name>Problems</name>
        <t>HTTP clients can be configured to use proxies by selecting a proxy hostname, a port number, and whether to use a security protocol. However, classic HTTP CONNECT requests using the proxy do not carry this configuration information. Instead, they only indicate the hostname and port of the target. This prevents any HTTP server from hosting multiple distinct proxy services, as the server cannot distinguish them by path (as with distinct resources) or by origin (as in "virtual hosting").</t>
        <t>The absence of an explicit origin for the proxy also rules out the usual defenses against server port misdirection attacks (see <xref section="7.4" sectionFormat="of" target="RFC9110"/>) and creates ambiguity about the use of origin-scoped response header fields (e.g., "Alt-Svc" <xref target="ALT-SVC"/> or "Strict-Transport-Security" <xref target="HSTS"/>).</t>
        <t>Classic HTTP CONNECT requests are not extensible to carry in-stream metadata. For example, the WRAP_UP capsule <xref target="I-D.ietf-httpbis-wrap-up"/> cannot be used with classic HTTP CONNECT.</t>
      </section>
      <section anchor="overview">
        <name>Overview</name>
        <t>This specification describes an alternative mechanism for tunneling TCP in HTTP.  Like <xref target="CONNECT-UDP"/> and <xref target="CONNECT-IP"/>, the proxy service is identified by a URI Template.  Proxy interactions reuse standard HTTP components and semantics, avoiding changes to the core HTTP protocol.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>In this document, the term "proxy" refers to the HTTP server that acts upon a client's TCP tunneling request. If there are HTTP intermediaries (as defined in Section 3.7 of [HTTP]) between the client and the proxy, those are referred to as "intermediaries" or "gateways" in this document.</t>
      <t>The term "endpoint" describes an implementation of this specification in either client or proxy role.</t>
      <t>The term "templated TCP proxy" refers to a proxy that is identified by a URI Template in accordance with this specification.</t>
    </section>
    <section anchor="specification">
      <name>Specification</name>
      <t>A template-driven TCP transport proxy for HTTP is identified by a URI Template <xref target="RFC6570"/> containing variables named "target_host" and "target_port".  This URI Template and its variable values <bcp14>MUST</bcp14> meet all the same requirements as for UDP proxying (<xref section="2" sectionFormat="comma" target="CONNECT-UDP"/>), and are subject to the same validation rules.  Clients <bcp14>MUST</bcp14> substitute the destination host and port number into this template to produce a request URI.  The derived URI serves as the destination of a Capsule Protocol connection using the Upgrade Token "connect-tcp" (see registration in <xref target="new-upgrade-token"/>).</t>
      <t>When using "connect-tcp", TCP payload data is sent in the payload of new Capsule Types named DATA and FINAL_DATA (see <xref target="fig-capsules"/> and registrations in <xref target="data-capsule"/>).  The ordered concatenation of these capsule payloads, which <bcp14>MAY</bcp14> be empty, represents the TCP payload data.  A FINAL_DATA capsule additionally indicates that the sender has closed this stream, semantically equivalent to TCP FIN.  After sending a FINAL_DATA capsule, an endpoint <bcp14>MUST NOT</bcp14> send any more DATA or FINAL_DATA capsules on this data stream. See <xref target="closing-connections"/> for related requirements.</t>
      <figure anchor="fig-capsules">
        <name>DATA and FINAL_DATA Capsule Formats</name>
        <artwork><![CDATA[
DATA Capsule {
  Type (i) = 0x08,
  Length (i),  # may be zero
  TCP Payload (..),
}

FINAL_DATA Capsule {
  Type (i) = 0x09,
  Length (i),  # may be zero
  TCP Payload (..),
}
]]></artwork>
      </figure>
      <t>The boundaries between DATA and FINAL_DATA capsules are not significant, and are not expected to match TCP segments, TLS records, HTTP DATA frames, QUIC STREAM frames, etc.  Recipients <bcp14>SHOULD</bcp14> begin forwarding payload from a DATA or FINAL_DATA capsule without waiting to receive the entire capsule, especially if the capsule is large.</t>
      <t>An intermediary <bcp14>MAY</bcp14> merge and split successive DATA and FINAL_DATA capsules, subject to the following requirements:</t>
      <ul spacing="normal">
        <li>
          <t>There are no intervening capsules of other types.</t>
        </li>
        <li>
          <t>The order of payload content is preserved.</t>
        </li>
        <li>
          <t>The final emitted capsule uses the same capsule type (DATA or FINAL_DATA) as the final input capsule, and all others use the DATA capsule type.</t>
        </li>
      </ul>
      <t>For example, an intermediary holding two successive DATA capsules in its transmission buffer could merge them, saving at least 2 bytes of encapsulation overhead when they are forwarded.</t>
      <t>This protocol supports backward-compatible extensions via additional Capsule Types, as described in <xref section="3.2" sectionFormat="of" target="CAPSULE"/>.</t>
      <section anchor="in-http11">
        <name>In HTTP/1.1</name>
        <t>In HTTP/1.1 <xref target="RFC9112"/>, the client uses the proxy by issuing a request as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The method <bcp14>SHALL</bcp14> be "GET".</t>
          </li>
          <li>
            <t>The request's target <bcp14>SHALL</bcp14> correspond to the URI derived from expansion of the proxy's URI Template.</t>
          </li>
          <li>
            <t>The request <bcp14>SHALL</bcp14> include a single "Host" header field whose value identifies the proxy.</t>
          </li>
          <li>
            <t>The request <bcp14>SHALL</bcp14> include a "Connection" header field with the value "Upgrade".  (Note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="RFC9110"/>.)</t>
          </li>
          <li>
            <t>The request <bcp14>SHALL</bcp14> include an "Upgrade" header field with the value "connect-tcp".</t>
          </li>
          <li>
            <t>The request <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as recommended in <xref section="3.4" sectionFormat="comma" target="CAPSULE"/>).</t>
          </li>
        </ul>
        <t>If the request is well-formed and permissible, the proxy <bcp14>MUST</bcp14> attempt to establish the TCP connection before sending any response status code other than "100 (Continue)" (see <xref target="conveying-metadata"/>).  If the TCP connection is successful, the response <bcp14>SHALL</bcp14> be as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The HTTP status code <bcp14>SHALL</bcp14> be "101 (Switching Protocols)".</t>
          </li>
          <li>
            <t>The response <bcp14>SHALL</bcp14> include a "Connection" header field with the value "Upgrade".</t>
          </li>
          <li>
            <t>The response <bcp14>SHALL</bcp14> include a single "Upgrade" header field with the value "connect-tcp".</t>
          </li>
          <li>
            <t>The response <bcp14>SHOULD</bcp14> include a "Capsule-Protocol: ?1" header (as above).</t>
          </li>
        </ul>
        <t>If a TCP connection was not established, the proxy <bcp14>MUST NOT</bcp14> switch protocols to "connect-tcp", and the client <bcp14>MAY</bcp14> reuse this connection for additional HTTP requests.</t>
        <figure>
          <name>Templated TCP proxy example in HTTP/1.1</name>
          <artwork><![CDATA[
Client                                                 Proxy

GET /proxy?target_host=192.0.2.1&target_port=443 HTTP/1.1
Host: example.com
Connection: Upgrade
Upgrade: connect-tcp
Capsule-Protocol: ?1

** Proxy establishes a TCP connection to 192.0.2.1:443 **

                            HTTP/1.1 101 Switching Protocols
                            Connection: Upgrade
                            Upgrade: connect-tcp
                            Capsule-Protocol: ?1
                            Proxy-Status: example.com
]]></artwork>
        </figure>
      </section>
      <section anchor="in-http2-and-http3">
        <name>In HTTP/2 and HTTP/3</name>
        <t>In HTTP/2 and HTTP/3, the proxy <bcp14>MUST</bcp14> include SETTINGS_ENABLE_CONNECT_PROTOCOL in its SETTINGS frame <xref target="RFC8441"/><xref target="RFC9220"/>.  The client uses the proxy by issuing an "extended CONNECT" request as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The :method pseudo-header field <bcp14>SHALL</bcp14> be "CONNECT".</t>
          </li>
          <li>
            <t>The :protocol pseudo-header field <bcp14>SHALL</bcp14> be "connect-tcp".</t>
          </li>
          <li>
            <t>The :authority pseudo-header field <bcp14>SHALL</bcp14> contain the authority of the proxy.</t>
          </li>
          <li>
            <t>The :path and :scheme pseudo-header fields <bcp14>SHALL</bcp14> contain the path and scheme of the request URI derived from the proxy's URI Template.</t>
          </li>
        </ul>
        <t>A templated TCP proxying request that does not conform to all of these requirements represents a client error (see <xref section="15.5" sectionFormat="comma" target="RFC9110"/>) and may be malformed (see <xref section="8.1.1" sectionFormat="of" target="RFC9113"/> and <xref section="4.1.2" sectionFormat="of" target="RFC9114"/>).</t>
        <t>Additionally, the "capsule-protocol" header field <bcp14>SHOULD</bcp14> be present with a value of "?1" (as recommended in <xref section="3.4" sectionFormat="comma" target="CAPSULE"/>).</t>
        <figure>
          <name>Templated TCP proxy example in HTTP/2</name>
          <artwork><![CDATA[
HEADERS
:method = CONNECT
:scheme = https
:authority = templated-proxy.example
:path = /proxy?target_host=2001%3Adb8%3A%3A1&target_port=443
:protocol = connect-tcp
capsule-protocol = ?1
...
]]></artwork>
        </figure>
      </section>
      <section anchor="use-of-other-relevant-headers">
        <name>Use of Other Relevant Headers</name>
        <section anchor="origin-scoped-headers">
          <name>Origin-scoped Headers</name>
          <t>Ordinary HTTP headers apply only to the single resource identified in the request or response.  An origin-scoped HTTP header is a special response header that is intended to change the client's behavior for subsequent requests to any resource on this origin.</t>
          <t>Unlike classic HTTP CONNECT proxies, a templated TCP proxy has an unambiguous origin of its own.  Origin-scoped headers apply to this origin when they are associated with a templated TCP proxy response.  Here are some origin-scoped headers that could potentially be sent by a templated TCP proxy:</t>
          <ul spacing="normal">
            <li>
              <t>"Alt-Svc" <xref target="ALT-SVC"/></t>
            </li>
            <li>
              <t>"Strict-Transport-Security" <xref target="HSTS"/></t>
            </li>
            <li>
              <t>"Accept-CH" <xref target="RFC8942"/></t>
            </li>
            <li>
              <t>"Set-Cookie" <xref target="RFC6265"/>, which has configurable scope.</t>
            </li>
            <li>
              <t>"Clear-Site-Data" <xref target="CLEAR-SITE-DATA"/></t>
            </li>
          </ul>
        </section>
        <section anchor="authentication-headers">
          <name>Authentication Headers</name>
          <t>Authentication to a templated TCP proxy normally uses ordinary HTTP authentication via the "401 (Unauthorized)" response code, the "WWW-Authenticate" response header field, and the "Authorization" request header field (<xref section="11.6" sectionFormat="comma" target="RFC9110"/>).  A templated TCP proxy does not use the "407 (Proxy Authentication Required)" response code and related header fields (<xref section="11.7" sectionFormat="comma" target="RFC9110"/>) because they do not traverse HTTP gateways (see <xref target="gateway-compatibility"/>).</t>
          <t>Clients <bcp14>SHOULD</bcp14> assume that all proxy resources generated by a single template share a protection space (i.e., a realm) (<xref section="11.5" sectionFormat="comma" target="RFC9110"/>).  For many authentication schemes, this will allow the client to avoid waiting for a "401 (Unauthorized)" response before each new connection through the proxy.</t>
          <t>TLS Client Certificate authentication can also be used (see <xref target="gateway-compatibility"/>).</t>
        </section>
        <section anchor="caching-headers">
          <name>Caching Headers</name>
          <t>In HTTP/2 and HTTP/3, this specification uses the CONNECT method, which is not subject to caching (<xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>).  However, in HTTP/1.1, the method is GET, which in other usages can be cacheable.  To minimize discrepancies between HTTP versions, the following requirements apply when using HTTP/1.1:</t>
          <ul spacing="normal">
            <li>
              <t>If the response has a heuristically cacheable status code (<xref section="15.1" sectionFormat="comma" target="RFC9110"/>), it <bcp14>SHOULD</bcp14> also carry a <tt>Cache-Control: no-store</tt> header field.
              </t>
              <ul spacing="normal">
                <li>
                  <t>This can occur if the request is rejected or the connection fails.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>The proxy <bcp14>SHOULD NOT</bcp14> attach any other caching-related header fields to the response.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="closing-connections">
        <name>Closing Connections</name>
        <t>Connection termination is essentially symmetrical for proxies and their clients, which we refer to here as the "endpoints" of a request.</t>
        <t>When closing connections, endpoints are subject to the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>When an endpoint receives a valid TCP FIN, it <bcp14>MUST</bcp14> send a FINAL_DATA capsule.</t>
          </li>
          <li>
            <t>When an endpoint receives a valid FINAL_DATA capsule, it <bcp14>MUST</bcp14> send a TCP FIN.</t>
          </li>
          <li>
            <t>When a TCP connection reaches the TIME-WAIT or CLOSED state, the associated endpoint <bcp14>MUST</bcp14> close its send stream.
            </t>
            <ul spacing="normal">
              <li>
                <t>If the connection closed gracefully, the endpoint <bcp14>MUST</bcp14> close the send stream gracefully.</t>
              </li>
              <li>
                <t>Otherwise, the endpoint <bcp14>SHOULD</bcp14> close the send stream abruptly, using a mechanism appropriate to the HTTP version:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>HTTP/3: reset the stream with H3_CONNECT_ERROR; see <xref section="19.4" sectionFormat="comma" target="QUIC"/> and <xref section="8.1" sectionFormat="comma" target="RFC9114"/>.</t>
                  </li>
                  <li>
                    <t>HTTP/2: reset the stream with CONNECT_ERROR; see <xref target="RFC9113"/>, Sections 6.4 and 7.</t>
                  </li>
                  <li>
                    <t>HTTP/1.1 over TLS: TCP shutdown without a TLS closure alert; see <xref section="6.1" sectionFormat="comma" target="TLS"/>.</t>
                  </li>
                  <li>
                    <t>HTTP/1.1 without TLS: TCP RST.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>When the receive stream is closed abruptly or without a FINAL_DATA capsule received, the endpoint <bcp14>SHOULD</bcp14> send a TCP RST if the TCP subsystem permits it.</t>
          </li>
        </ul>
        <t>Any locally imposed timeout (<xref target="timeouts"/>) <bcp14>MUST</bcp14> be treated as an abrupt closure of the affected stream or connection.</t>
        <t>The mandatory behaviors above enable endpoints to detect any truncation of incoming TCP data.  The recommended behaviors propagate any TCP errors through the tunnel.</t>
        <t>In HTTP/3, endpoints <bcp14>MAY</bcp14> negotiate and use the RESET_STREAM_AT frame in order to reduce data loss during an abrupt closure <xref target="I-D.ietf-quic-reliable-stream-reset"/>.  However, RESET_STREAM_AT may not be very effective in this case, as TCP implementations will typically discard pending data when a RST is received.</t>
        <figure>
          <name>Simple graceful termination example (HTTP/3)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="480" viewBox="0 0 480 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,160" fill="none" stroke="black"/>
                <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,160" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                <path d="M 352,64 L 352,160" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,32 L 408,64" fill="none" stroke="black"/>
                <path d="M 456,64 L 456,160" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                <path d="M 264,32 L 368,32" fill="none" stroke="black"/>
                <path d="M 408,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,64 L 472,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                <path d="M 96,80 L 192,80" fill="none" stroke="black"/>
                <path d="M 288,80 L 376,80" fill="none" stroke="black"/>
                <path d="M 424,80 L 448,80" fill="none" stroke="black"/>
                <path d="M 24,96 L 56,96" fill="none" stroke="black"/>
                <path d="M 88,96 L 176,96" fill="none" stroke="black"/>
                <path d="M 296,96 L 384,96" fill="none" stroke="black"/>
                <path d="M 416,96 L 448,96" fill="none" stroke="black"/>
                <path d="M 32,112 L 56,112" fill="none" stroke="black"/>
                <path d="M 88,112 L 176,112" fill="none" stroke="black"/>
                <path d="M 296,112 L 384,112" fill="none" stroke="black"/>
                <path d="M 416,112 L 456,112" fill="none" stroke="black"/>
                <path d="M 136,128 L 168,128" fill="none" stroke="black"/>
                <path d="M 304,128 L 352,128" fill="none" stroke="black"/>
                <path d="M 24,144 L 48,144" fill="none" stroke="black"/>
                <path d="M 104,144 L 168,144" fill="none" stroke="black"/>
                <path d="M 304,144 L 344,144" 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,80 444,74.4 444,85.6" fill="black" transform="rotate(0,448,80)"/>
                <polygon class="arrowhead" points="368,112 356,106.4 356,117.6" fill="black" transform="rotate(180,360,112)"/>
                <polygon class="arrowhead" points="352,144 340,138.4 340,149.6" fill="black" transform="rotate(0,344,144)"/>
                <polygon class="arrowhead" points="352,96 340,90.4 340,101.6" fill="black" transform="rotate(0,344,96)"/>
                <polygon class="arrowhead" points="352,80 340,74.4 340,85.6" fill="black" transform="rotate(0,344,80)"/>
                <polygon class="arrowhead" points="144,128 132,122.4 132,133.6" fill="black" transform="rotate(180,136,128)"/>
                <polygon class="arrowhead" points="144,112 132,106.4 132,117.6" fill="black" transform="rotate(180,136,112)"/>
                <polygon class="arrowhead" points="128,144 116,138.4 116,149.6" fill="black" transform="rotate(0,120,144)"/>
                <polygon class="arrowhead" points="128,96 116,90.4 116,101.6" fill="black" transform="rotate(0,120,96)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <polygon class="arrowhead" points="40,112 28,106.4 28,117.6" fill="black" transform="rotate(180,32,112)"/>
                <g class="text">
                  <text x="32" y="52">TCP</text>
                  <text x="56" y="52">A</text>
                  <text x="156" y="52">Endpoint</text>
                  <text x="200" y="52">A</text>
                  <text x="308" y="52">Endpoint</text>
                  <text x="352" y="52">B</text>
                  <text x="432" y="52">TCP</text>
                  <text x="456" y="52">B</text>
                  <text x="72" y="84">"abc"</text>
                  <text x="240" y="84">DATA{"abc"}</text>
                  <text x="400" y="84">"abc"</text>
                  <text x="72" y="100">FIN</text>
                  <text x="236" y="100">FINAL_DATA{""}</text>
                  <text x="400" y="100">FIN</text>
                  <text x="72" y="116">FIN</text>
                  <text x="236" y="116">FINAL_DATA{""}</text>
                  <text x="400" y="116">FIN</text>
                  <text x="236" y="132">QUIC.STREAM{FIN}</text>
                  <text x="76" y="148">FINACK</text>
                  <text x="236" y="148">QUIC.STREAM{FIN}</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------+    +------------+     +------------+    +-------+
| TCP A |    | Endpoint A |     | Endpoint B |    | TCP B |
+-+-----+    +-+----------+     +----------+-+    +-----+-+
  +---"abc"--->+--------DATA{"abc"}------->+---"abc"--->|
  +----FIN---->+------FINAL_DATA{""}------>+----FIN---->|
  |<---FIN-----+<-----FINAL_DATA{""}-------+<---FIN-----+
  |            |<----QUIC.STREAM{FIN}------+            |
  +---FINACK-->+-----QUIC.STREAM{FIN}----->|            |
  |            |                           |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>Simple TCP RST termination example (HTTP/2)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="480" viewBox="0 0 480 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,96" fill="none" stroke="black"/>
                <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,96" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                <path d="M 352,64 L 352,96" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,32 L 408,64" fill="none" stroke="black"/>
                <path d="M 456,64 L 456,96" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                <path d="M 264,32 L 368,32" fill="none" stroke="black"/>
                <path d="M 408,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,64 L 472,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 56,80" fill="none" stroke="black"/>
                <path d="M 88,80 L 160,80" fill="none" stroke="black"/>
                <path d="M 320,80 L 384,80" fill="none" stroke="black"/>
                <path d="M 416,80 L 448,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="456,80 444,74.4 444,85.6" fill="black" transform="rotate(0,448,80)"/>
                <polygon class="arrowhead" points="352,80 340,74.4 340,85.6" fill="black" transform="rotate(0,344,80)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <g class="text">
                  <text x="32" y="52">TCP</text>
                  <text x="56" y="52">A</text>
                  <text x="156" y="52">Endpoint</text>
                  <text x="200" y="52">A</text>
                  <text x="308" y="52">Endpoint</text>
                  <text x="352" y="52">B</text>
                  <text x="432" y="52">TCP</text>
                  <text x="456" y="52">B</text>
                  <text x="72" y="84">RST</text>
                  <text x="240" y="84">RST_STREAM{CON_ERR}</text>
                  <text x="400" y="84">RST</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------+    +------------+     +------------+    +-------+
| TCP A |    | Endpoint A |     | Endpoint B |    | TCP B |
+-+-----+    +-+----------+     +----------+-+    +-----+-+
  +----RST---->+----RST_STREAM{CON_ERR}--->+----RST---->|
  |            |                           |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>Timeout example (HTTP/1.1)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="480" viewBox="0 0 480 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,128" fill="none" stroke="black"/>
                <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,128" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                <path d="M 352,64 L 352,128" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,32 L 408,64" fill="none" stroke="black"/>
                <path d="M 456,64 L 456,128" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                <path d="M 264,32 L 368,32" fill="none" stroke="black"/>
                <path d="M 408,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,64 L 472,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                <path d="M 96,80 L 192,80" fill="none" stroke="black"/>
                <path d="M 288,80 L 376,80" fill="none" stroke="black"/>
                <path d="M 424,80 L 448,80" fill="none" stroke="black"/>
                <path d="M 128,112 L 144,112" fill="none" stroke="black"/>
                <path d="M 328,112 L 384,112" fill="none" stroke="black"/>
                <path d="M 416,112 L 448,112" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="456,112 444,106.4 444,117.6" fill="black" transform="rotate(0,448,112)"/>
                <polygon class="arrowhead" points="456,80 444,74.4 444,85.6" fill="black" transform="rotate(0,448,80)"/>
                <polygon class="arrowhead" points="352,112 340,106.4 340,117.6" fill="black" transform="rotate(0,344,112)"/>
                <polygon class="arrowhead" points="352,80 340,74.4 340,85.6" fill="black" transform="rotate(0,344,80)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <g class="text">
                  <text x="32" y="52">TCP</text>
                  <text x="56" y="52">A</text>
                  <text x="156" y="52">Endpoint</text>
                  <text x="200" y="52">A</text>
                  <text x="308" y="52">Endpoint</text>
                  <text x="352" y="52">B</text>
                  <text x="432" y="52">TCP</text>
                  <text x="456" y="52">B</text>
                  <text x="72" y="84">"abc"</text>
                  <text x="240" y="84">DATA{"abc"}</text>
                  <text x="400" y="84">"abc"</text>
                  <text x="172" y="100">(...</text>
                  <text x="224" y="100">timeout</text>
                  <text x="264" y="100">@</text>
                  <text x="280" y="100">A</text>
                  <text x="308" y="100">...)</text>
                  <text x="160" y="116">FIN</text>
                  <text x="192" y="116">(no</text>
                  <text x="264" y="116">close_notify)</text>
                  <text x="400" y="116">RST</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------+    +------------+     +------------+    +-------+
| TCP A |    | Endpoint A |     | Endpoint B |    | TCP B |
+-+-----+    +-+----------+     +----------+-+    +-----+-+
  +---"abc"--->+--------DATA{"abc"}------->+---"abc"--->|
  |            |   (... timeout @ A ...)   |            |
  |            +--FIN (no close_notify) -->+----RST---->|
  |            |                           |            |
]]></artwork>
          </artset>
        </figure>
        <figure>
          <name>RST after FIN example (HTTP/3)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="480" viewBox="0 0 480 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,176" fill="none" stroke="black"/>
                <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,32 L 112,64" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,176" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
                <path d="M 352,64 L 352,176" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,32 L 408,64" fill="none" stroke="black"/>
                <path d="M 456,64 L 456,176" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                <path d="M 112,32 L 216,32" fill="none" stroke="black"/>
                <path d="M 264,32 L 368,32" fill="none" stroke="black"/>
                <path d="M 408,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                <path d="M 112,64 L 216,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 368,64" fill="none" stroke="black"/>
                <path d="M 408,64 L 472,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 64,80" fill="none" stroke="black"/>
                <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                <path d="M 304,80 L 392,80" fill="none" stroke="black"/>
                <path d="M 424,80 L 448,80" fill="none" stroke="black"/>
                <path d="M 32,128 L 56,128" fill="none" stroke="black"/>
                <path d="M 104,128 L 168,128" fill="none" stroke="black"/>
                <path d="M 312,128 L 384,128" fill="none" stroke="black"/>
                <path d="M 432,128 L 456,128" fill="none" stroke="black"/>
                <path d="M 136,144 L 168,144" fill="none" stroke="black"/>
                <path d="M 304,144 L 352,144" fill="none" stroke="black"/>
                <path d="M 24,160 L 64,160" fill="none" stroke="black"/>
                <path d="M 96,160 L 168,160" fill="none" stroke="black"/>
                <path d="M 304,160 L 392,160" fill="none" stroke="black"/>
                <path d="M 424,160 L 448,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="456,160 444,154.4 444,165.6" fill="black" transform="rotate(0,448,160)"/>
                <polygon class="arrowhead" points="456,80 444,74.4 444,85.6" fill="black" transform="rotate(0,448,80)"/>
                <polygon class="arrowhead" points="368,128 356,122.4 356,133.6" fill="black" transform="rotate(180,360,128)"/>
                <polygon class="arrowhead" points="352,160 340,154.4 340,165.6" fill="black" transform="rotate(0,344,160)"/>
                <polygon class="arrowhead" points="352,80 340,74.4 340,85.6" fill="black" transform="rotate(0,344,80)"/>
                <polygon class="arrowhead" points="144,144 132,138.4 132,149.6" fill="black" transform="rotate(180,136,144)"/>
                <polygon class="arrowhead" points="144,128 132,122.4 132,133.6" fill="black" transform="rotate(180,136,128)"/>
                <polygon class="arrowhead" points="128,160 116,154.4 116,165.6" fill="black" transform="rotate(0,120,160)"/>
                <polygon class="arrowhead" points="128,80 116,74.4 116,85.6" fill="black" transform="rotate(0,120,80)"/>
                <polygon class="arrowhead" points="40,128 28,122.4 28,133.6" fill="black" transform="rotate(180,32,128)"/>
                <g class="text">
                  <text x="32" y="52">TCP</text>
                  <text x="56" y="52">A</text>
                  <text x="156" y="52">Endpoint</text>
                  <text x="200" y="52">A</text>
                  <text x="308" y="52">Endpoint</text>
                  <text x="352" y="52">B</text>
                  <text x="432" y="52">TCP</text>
                  <text x="456" y="52">B</text>
                  <text x="80" y="84">FIN</text>
                  <text x="244" y="84">FINAL_DATA{""}</text>
                  <text x="408" y="84">FIN</text>
                  <text x="80" y="116">(FIN)</text>
                  <text x="408" y="116">(FIN)</text>
                  <text x="80" y="132">"abc"</text>
                  <text x="240" y="132">FINAL_DATA{"abc"}</text>
                  <text x="408" y="132">"abc"</text>
                  <text x="236" y="148">QUIC.STREAM{FIN}</text>
                  <text x="80" y="164">RST</text>
                  <text x="236" y="164">H3_CONNECT_ERROR</text>
                  <text x="408" y="164">RST</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------+    +------------+     +------------+    +-------+
| TCP A |    | Endpoint A |     | Endpoint B |    | TCP B |
+-+-----+    +-+----------+     +----------+-+    +-----+-+
  +-----FIN--->+-------FINAL_DATA{""}----->+-----FIN--->|
  |            |                           |            |
  |    (FIN)   |                           |    (FIN)   |
  |<---"abc"---+<----FINAL_DATA{"abc"}-----+<---"abc"---+
  |            |<----QUIC.STREAM{FIN}------+            |
  +-----RST--->+-----H3_CONNECT_ERROR----->+-----RST--->|
  |            |                           |            |
]]></artwork>
          </artset>
        </figure>
        <section anchor="handling-invalid-data">
          <name>Handling Invalid Data</name>
          <t>An endpoint that receives invalid data from its peer is subject to the same requirements as when receiving an abrupt closure of the receive stream (see <xref target="closing-connections"/>).  Some examples of invalid data include:</t>
          <ul spacing="normal">
            <li>
              <t>A second FINAL_DATA capsule.</t>
            </li>
            <li>
              <t>A DATA capsule after FINAL_DATA.</t>
            </li>
            <li>
              <t>Data that results in a parsing error under the Capsule Protocol.</t>
            </li>
            <li>
              <t>A capsule that is truncated by the end of the stream.</t>
            </li>
            <li>
              <t>A capsule that would require unreasonable effort to process.</t>
            </li>
          </ul>
          <t>Note that very large DATA and FINAL_DATA capsules are still valid, as they can be forwarded incrementally using a bounded memory buffer.</t>
        </section>
      </section>
    </section>
    <section anchor="additional-connection-setup-behaviors">
      <name>Additional Connection Setup Behaviors</name>
      <t>This section discusses some behaviors that are permitted or recommended in order to enhance the performance or functionality of connection setup.</t>
      <section anchor="latency-optimizations">
        <name>Latency optimizations</name>
        <t>When using this specification in HTTP/2 or HTTP/3, clients <bcp14>MAY</bcp14> start sending TCP stream content optimistically, subject to flow control limits (<xref section="5.2" sectionFormat="of" target="RFC9113"/> or <xref section="4.1" sectionFormat="of" target="QUIC"/>).  Proxies <bcp14>MUST</bcp14> buffer this "optimistic" content until the TCP stream becomes writable, and discard it if the TCP connection fails.  (Clients <bcp14>MUST NOT</bcp14> use "optimistic" behavior in HTTP/1.1, as this would interfere with reuse of the connection after an error response such as "401 (Unauthorized)".)</t>
        <t>Servers that host a proxy under this specification <bcp14>MAY</bcp14> offer support for TLS early data in accordance with <xref target="RFC8470"/>.  Clients <bcp14>MAY</bcp14> send "connect-tcp" requests in early data, and <bcp14>MAY</bcp14> include "optimistic" TCP content in early data (in HTTP/2 and HTTP/3).  At the TLS layer, proxies <bcp14>MAY</bcp14> ignore, reject, or accept the <tt>early_data</tt> extension (<xref section="4.3.10" sectionFormat="comma" target="TLS"/>).  At the HTTP layer, proxies <bcp14>MAY</bcp14> process the request immediately, return a "425 (Too Early)" response (<xref section="5.2" sectionFormat="comma" target="RFC8470"/>), or delay some or all processing of the request until the handshake completes.  For example, a proxy with limited anti-replay defenses might choose to perform DNS resolution of the <tt>target_host</tt> when a request arrives in early data, but delay the TCP connection until the TLS handshake completes.</t>
        <t>When DNS resolution of <tt>target_host</tt> produces multiple IP addresses, proxies <bcp14>SHOULD</bcp14> use a racing procedure such as Happy Eyeballs <xref target="HEv2"/> to accelerate connection establishment.  Proxies that race multiple connection attempts <bcp14>MUST</bcp14> buffer any optimistic content until a connection is selected and <bcp14>MUST NOT</bcp14> transmit any payload data on the other connections.</t>
      </section>
      <section anchor="indicating-failure">
        <name>Indicating Failure</name>
        <t>Failure to initiate a tunnel is indicated by the HTTP response status code.</t>
        <t>A 4XX status code indicates the the request is malformed or impermissible.  For example, if the proxy performs DNS resolution of <tt>target_host</tt> and receives an IP address that is disallowed by the proxy's policy, it might return 403 (Forbidden).</t>
        <t>A 5XX status code indicates a failure in the attempt, such as when a TCP connection was attempted but did not succeed.  The 502 (Bad Gateway) and 504 (Gateway Timeout) status codes are commonly used.</t>
        <t>The 429 (Too Many Requests) and 503 (Service Unavailable) status codes indicate a temporary failure, and can carry a "Retry-After" response header field.  If included, this field applies to all requests using this URI Template.</t>
      </section>
      <section anchor="conveying-metadata">
        <name>Conveying metadata</name>
        <t>This specification supports the "Expect: 100-continue" request header (<xref section="10.1.1" sectionFormat="comma" target="RFC9110"/>) in any HTTP version.  The "100 (Continue)" status code confirms receipt of a request at the proxy without waiting for the proxy-destination TCP handshake to succeed or fail.  Clients <bcp14>MAY</bcp14> send "Expect: 100-continue", and proxies <bcp14>MUST</bcp14> respect it by returning "100 (Continue)" if the request is not immediately rejected.  This allows for a few useful improvements:</t>
        <ul spacing="normal">
          <li>
            <t>Clients can provide a clearer status indication while waiting for the destination host to respond.  (TCP handshakes can hang for several minutes before failing.)</t>
          </li>
          <li>
            <t>Clients can apply separate timeouts to the tunneling request and connection establishment.</t>
          </li>
          <li>
            <t>In HTTP/2 and HTTP/3, clients have the option to delay some or all of the optimistic payload data until after confirming that the request is permissible.  This strategy reduces wasted effort when the request is rejected.</t>
          </li>
        </ul>
        <t>Proxies implementing this specification <bcp14>SHOULD</bcp14> include a "Proxy-Status" response header field <xref target="PROXY-STATUS"/> in any success or failure response (i.e., status codes 101, 2XX, 4XX, or 5XX) to support advanced client behaviors and diagnostics.  Clients and proxies <bcp14>MUST NOT</bcp14> send trailer fields on "connect-tcp" streams.</t>
      </section>
    </section>
    <section anchor="applicability">
      <name>Applicability</name>
      <section anchor="servers">
        <name>Servers</name>
        <t>For server operators, templated TCP proxies are particularly valuable in situations where virtual-hosting is needed, or where multiple proxies must share an origin.  For example, the proxy might benefit from sharing an HTTP gateway that provides DDoS defense, performs request sanitization, or enforces user authorization (<xref target="gateway-compatibility"/>).</t>
        <t>Templated TCP proxies can also be made invisible to probes from unauthorized clients:</t>
        <ul spacing="normal">
          <li>
            <t>The URI template can include a high-entropy path, similar to Capability URLs <xref target="CAPABILITY"/>.</t>
          </li>
          <li>
            <t>The proxy can require HTTP Concealed Authentication (<xref section="6.4" sectionFormat="comma" target="CONCEALED"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="clients">
        <name>Clients</name>
        <t>This specification does not require any specific type of configuration input.  Suitable configuration input types include:</t>
        <ul spacing="normal">
          <li>
            <t>A URI Template string, as described in <xref target="specification"/>.</t>
          </li>
          <li>
            <t>An IP address or hostname, with optional or required port and scheme (as often used to describe classic HTTP CONNECT proxies).  A corresponding templated TCP proxy might be found in two ways:
            </t>
            <ul spacing="normal">
              <li>
                <t>At the default template for "connect-tcp" (<xref target="fig-default"/>).</t>
              </li>
              <li>
                <t>In the "proxy" dictionary of a provisioning domain resource at the corresponding .well-known URI (<xref section="2" sectionFormat="comma" target="I-D.ietf-intarea-proxy-config"/>).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>A provisioning domain resource, configured directly or identified by a local or remote URI (e.g., using "file://" or "https://").</t>
          </li>
        </ul>
        <figure anchor="fig-default">
          <name>Registered default template</name>
          <artwork><![CDATA[
https://$PROXY_HOST:$PROXY_PORT/.well-known/masque
                 /tcp/{target_host}/{target_port}/
]]></artwork>
        </figure>
        <t>All of these input types <bcp14>MAY</bcp14> share a single input string, as they can be disambiguated reliably by parsing and probing.  However, it may be preferable to indicate the configuration input type explicitly, to reduce probing delays while supporting clients with differing capabilities.</t>
        <t>Clients <bcp14>SHOULD</bcp14> treat certain errors during classic HTTP CONNECT as indications that the proxy might only support "connect-tcp":</t>
        <ul spacing="normal">
          <li>
            <t>In HTTP/1.1: the response status code is "426 (Upgrade Required)", with an "Upgrade: connect-tcp" response header.</t>
          </li>
          <li>
            <t>In any HTTP version: the response status code is "501 (Not Implemented)".
            </t>
            <ul spacing="normal">
              <li>
                <t>Requires SETTINGS_ENABLE_CONNECT_PROTOCOL to have been negotiated in HTTP/2 or HTTP/3.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>If the client infers that classic HTTP CONNECT is not supported, it <bcp14>SHOULD</bcp14> retry the request using the registered default template for "connect-tcp" (<xref target="fig-default"/>).  If this request succeeds, the client <bcp14>SHOULD</bcp14> record a preference for "connect-tcp" to avoid further retry delays.</t>
      </section>
      <section anchor="gateway-compatibility">
        <name>Gateways</name>
        <t>Templated TCP proxy requests can traverse standard HTTP gateways to ease implementation and allow use of shared infrastructure.  However, current gateways might need modifications to support TCP proxy services.  To be compatible, a gateway <bcp14>MUST</bcp14>:</t>
        <ul spacing="normal">
          <li>
            <t>support Extended CONNECT (if acting as an HTTP/2 or HTTP/3 server).</t>
          </li>
          <li>
            <t>support HTTP/1.1 Upgrade to "connect-tcp" (if acting as an HTTP/1.1 server)
            </t>
            <ul spacing="normal">
              <li>
                <t>only after forwarding the upgrade request to the origin and observing a success response.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>forward the "connect-tcp" protocol to the origin.</t>
          </li>
          <li>
            <t>convert "connect-tcp" requests between all supported HTTP server and client versions.</t>
          </li>
          <li>
            <t>allow any "Proxy-Status" headers to traverse the gateway.</t>
          </li>
        </ul>
        <t>If the proxy relies on TLS Client Certificates for client authentication, the gateway <bcp14>MUST</bcp14> perform this authentication itself or pass the relevant information to the origin (e.g., using a "Client-Cert" request header field <xref target="RFC9440"/>).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Template-driven TCP proxying is largely subject to the same security risks as classic HTTP CONNECT.  For example, any restrictions on authorized use of the proxy (see <xref section="9.3.6" sectionFormat="comma" target="RFC9110"/>) apply equally to both.  The <tt>destination_ip_prohibited</tt> Proxy Error Type from <xref section="2.3.5" sectionFormat="of" target="PROXY-STATUS"/> can be useful when rejecting unauthorized requests.</t>
      <t>A small additional risk is posed by the use of a URI Template parser on the client side.  The template input string could be crafted to exploit any vulnerabilities in the parser implementation.  Client implementers should apply their usual precautions for code that processes untrusted inputs.</t>
      <t>See <xref section="7" sectionFormat="of" target="CONNECT-UDP"/> for a comparison of the risks of operating a TCP or UDP proxy.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion attacks</name>
        <t>A malicious client can cause highly asymmetric resource usage at the proxy by colluding with a destination server and violating the ordinary rules of TCP or HTTP.  Some example attacks, and mitigations that proxies can apply:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Connection Pileup</strong>: A malicious client can attempt to open a large number of connections to exhaust the proxy's memory, port, or file descriptor limits. When using HTTP/2 or HTTP/3, each incremental TCP connection imposes a much higher cost on the proxy than on the attacker.
            </t>
            <ul spacing="normal">
              <li>
                <t>Mitigation: Limit the number of concurrent connections per client.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Window Bloat</strong>: An attacker can grow the receive window size by simulating a "long, fat network" (<xref section="1.1" sectionFormat="comma" target="RFC7323"/>), then fill the window (from the sender) and stop acknowledging it (at the receiver).  This leaves the proxy buffering up to 1 GiB of TCP data until some timeout, while the attacker does not have to retain a large buffer.
            </t>
            <ul spacing="normal">
              <li>
                <t>Mitigation: Limit the maximum receive window for TCP and HTTP connections, and the size of userspace buffers used for forwarding data.  Alternatively, monitor the connections' send queues and limit the total buffered data per client.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>WAIT Abuse</strong>: An attacker can force the proxy into a TIME-WAIT, CLOSE-WAIT, or FIN-WAIT state until the timer expires, tying up a proxy-to-destination 4-tuple for up to four minutes after the client's connection is closed.
            </t>
            <ul spacing="normal">
              <li>
                <t>Mitigations:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Enable the PAWS optimization (<xref section="5" sectionFormat="comma" target="RFC7323"/>) across successive connections (e.g., Linux's <tt>tcp_tw_reuse=1</tt> <xref target="SYSCTL"/>).  This makes TIME-WAIT 4-tuples rapidly reusable if the destination enables TCP Timestamps, which most do.</t>
                  </li>
                  <li>
                    <t>Allocate a large range of IP addresses for TCP connections (especially in IPv6).</t>
                  </li>
                  <li>
                    <t>Limit the number of connections for each client to each destination, even if those connections are in a waiting state and the corresponding CONNECT stream is closed.</t>
                  </li>
                  <li>
                    <t>If necessary, perform an abrupt TCP closure that destroys the Transmission Control Block.  Note that reusing a 4-tuple in this way can increase the risk of interference between successive connections.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <section anchor="avoiding-http11">
        <name>Avoiding HTTP/1.1</name>
        <t>While this specification is fully functional under HTTP/1.1, performance-sensitive deployments <bcp14>SHOULD</bcp14> use HTTP/2 or HTTP/3 instead.  When using HTTP/1.1:</t>
        <ul spacing="normal">
          <li>
            <t>Each CONNECT request requires a new TCP and TLS connection, imposing a higher cost in setup latency, congestion control convergence, CPU time, and data transfer.</t>
          </li>
          <li>
            <t>The graceful and abrupt closure signals (<xref target="closing-connections"/>) are more likely to be missing or corrupted:
            </t>
            <ul spacing="normal">
              <li>
                <t>Some implementations may be unable to emit the recommended abrupt closure signals, due to limitations in their TCP and TLS subsystems.</t>
              </li>
              <li>
                <t>Faulty implementations may fail to send a TLS closure alert during graceful shutdown, or fail to report an error when the expected closure alert is not received.  These misbehaviors are not compliant with <xref target="TLS"/>, but they are common nonetheless among HTTP/1.1 implementations today.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The number of active connections through each client may be limited by the number of available TCP client ports, especially if:
            </t>
            <ul spacing="normal">
              <li>
                <t>The client only has one IP address that can be used to reach the proxy.</t>
              </li>
              <li>
                <t>The client is shared between many parties, such as when acting as a gateway or concentrator.</t>
              </li>
              <li>
                <t>The tunneled connections are often closed by the destination. This causes the client to initiate closure of the client-to-proxy connection, leaving the client in a TIME-WAIT state for up to four minutes.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="timeouts">
        <name>Timeouts</name>
        <t>Except when actively sending or receiving data, an endpoint is always waiting for an event from its peer or its TCP connection.  HTTP and TCP are designed to ensure that such an event always arrives, so the connection is never permanently stuck in any state until it is fully closed.  However, for efficient operation, it may be necessary to adjust the settings for TCP keep-alives (<xref section="3.8.4" sectionFormat="comma" target="TCP"/>), QUIC idle timeouts (<xref section="10.1" sectionFormat="comma" target="QUIC"/>), HTTP/2 PING frames (<xref section="6.7" sectionFormat="comma" target="RFC9113"/>), and other transport options.</t>
        <t>Endpoints <bcp14>MAY</bcp14> impose additional timeouts, especially as a defense against certain resource exhaustion attacks (<xref target="resource-exhaustion"/>).  However, operators should apply timeouts cautiously to minimize the impact on connections that are functioning but slow.   See <xref target="closing-connections"/> for related requirements.</t>
      </section>
      <section anchor="ip-address-sharing">
        <name>IP address sharing</name>
        <t>A TCP proxy typically uses the same IP address to establish connections on behalf of multiple clients, especially in IPv4. <xref target="RFC6269"/> provides guidance regarding difficulties that can arise from IP address sharing, including in this arrangement.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="new-upgrade-token">
        <name>New Upgrade Token</name>
        <t>IANA is requested to add the following entry to the "HTTP Upgrade Tokens" registry under "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" registry group:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Description</th>
              <th align="left">Expected Version Tokens</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">"connect-tcp"</td>
              <td align="left">Proxying of TCP payloads</td>
              <td align="left">(None)</td>
              <td align="left">(This document)</td>
            </tr>
          </tbody>
        </table>
        <section removeInRFC="true" anchor="interop-testing">
          <name>Interop testing</name>
          <t>For interoperability testing of this draft version, implementations <bcp14>SHALL</bcp14> use the value "connect-tcp-12".</t>
        </section>
      </section>
      <section anchor="iana-template">
        <name>New MASQUE Default Template</name>
        <t>IANA is requested to add the following entry to the "MASQUE URI Suffixes" registry under "Multiplexed Application Substrate over QUIC Encryption (MASQUE)" registry group:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Path Segment</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">tcp</td>
              <td align="left">TCP Proxying</td>
              <td align="left">(This document)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-capsule">
        <name>New Capsule Type</name>
        <t>IANA is requested to add the following entry to the "HTTP Capsule Types" registry under "Multiplexed Application Substrate over QUIC Encryption (MASQUE)" registry group:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Capsule Type</th>
              <th align="left">Status</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
              <th align="left">Contact</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x08</td>
              <td align="left">DATA</td>
              <td align="left">permanent</td>
              <td align="left">(This document), <xref target="specification"/></td>
              <td align="left">IETF</td>
              <td align="left">HTTPBIS</td>
            </tr>
            <tr>
              <td align="left">0x09</td>
              <td align="left">FINAL_DATA</td>
              <td align="left">permanent</td>
              <td align="left">(This document), <xref target="specification"/></td>
              <td align="left">IETF</td>
              <td align="left">HTTPBIS</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9110" to="HTTP"/>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <displayreference target="RFC9114" to="HTTP/3"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9110">
          <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="RFC9112">
          <front>
            <title>HTTP/1.1</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 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="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <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="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <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="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="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="RFC6570">
          <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="CAPSULE">
          <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="RFC8441">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <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="RFC9220">
          <front>
            <title>Bootstrapping WebSockets with HTTP/3</title>
            <author fullname="R. Hamilton" initials="R." surname="Hamilton"/>
            <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="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="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="July" year="2026"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document obsoletes RFC 8446, which specified TLS 1.3. This document obsoletes RFC 5246 (specifying TLS 1.2) and RFCs 5077, 6961, 7627, and 8422, all of which pertain to TLS 1.2 or earlier, and updates RFCs 5705 and 6066. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9846"/>
          <seriesInfo name="DOI" value="10.17487/RFC9846"/>
        </reference>
        <reference anchor="RFC8470">
          <front>
            <title>Using Early Data in HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>Using TLS early data creates an exposure to the possibility of a replay attack. This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data. Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8470"/>
          <seriesInfo name="DOI" value="10.17487/RFC8470"/>
        </reference>
        <reference anchor="PROXY-STATUS">
          <front>
            <title>The Proxy-Status HTTP Response Header Field</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P. Sikora" initials="P." surname="Sikora"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document defines the Proxy-Status HTTP response field to convey the details of an intermediary's response handling, including generated errors.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9209"/>
          <seriesInfo name="DOI" value="10.17487/RFC9209"/>
        </reference>
        <reference anchor="TCP">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CAPABILITY" target="https://www.w3.org/TR/capability-urls/">
          <front>
            <title>Good Practices for Capability URLs</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="February"/>
          </front>
        </reference>
        <reference anchor="CLEAR-SITE-DATA" target="https://www.w3.org/TR/clear-site-data/">
          <front>
            <title>Clear Site Data</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="November"/>
          </front>
        </reference>
        <reference anchor="SYSCTL" target="https://www.kernel.org/doc/html/v7.1/networking/ip-sysctl.html">
          <front>
            <title>IP Sysctl -- The Linux Kernel documentation</title>
            <author>
              <organization/>
            </author>
            <date year="2026" month="June"/>
          </front>
        </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>
        <reference anchor="ALT-SVC">
          <front>
            <title>HTTP Alternative Services</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="April" year="2016"/>
            <abstract>
              <t>This document specifies "Alternative Services" for HTTP, which allow an origin's resources to be authoritatively available at a separate network location, possibly accessed with a different protocol configuration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7838"/>
          <seriesInfo name="DOI" value="10.17487/RFC7838"/>
        </reference>
        <reference anchor="HSTS">
          <front>
            <title>HTTP Strict Transport Security (HSTS)</title>
            <author fullname="J. Hodges" initials="J." surname="Hodges"/>
            <author fullname="C. Jackson" initials="C." surname="Jackson"/>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="November" year="2012"/>
            <abstract>
              <t>This specification defines a mechanism enabling web sites to declare themselves accessible only via secure connections and/or for users to be able to direct their user agent(s) to interact with given sites only over secure connections. This overall policy is referred to as HTTP Strict Transport Security (HSTS). The policy is declared by web sites via the Strict-Transport-Security HTTP response header field and/or by other means, such as user agent configuration, for example. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6797"/>
          <seriesInfo name="DOI" value="10.17487/RFC6797"/>
        </reference>
        <reference anchor="I-D.ietf-httpbis-wrap-up">
          <front>
            <title>The HTTP Wrap Up Capsule</title>
            <author fullname="David Schinazi" initials="D." surname="Schinazi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   HTTP intermediaries sometimes need to terminate long-lived request
   streams in order to facilitate load balancing or impose data limits.
   However, Web browsers commonly cannot retry failed proxied requests
   when they cannot ascertain whether an in-progress request was acted
   on.  To avoid user-visible failures, it is best for the intermediary
   to inform the client of upcoming request stream terminations in
   advance of the actual termination so that the client can wrap up
   existing operations related to that stream and start sending new work
   to a different stream or connection.  This document specifies a new
   "WRAP_UP" capsule that allows a proxy to instruct a client that it
   should not start new requests on a tunneled connection, while still
   allowing it to finish existing requests.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-wrap-up-01"/>
        </reference>
        <reference anchor="RFC8942">
          <front>
            <title>HTTP Client Hints</title>
            <author fullname="I. Grigorik" initials="I." surname="Grigorik"/>
            <author fullname="Y. Weiss" initials="Y." surname="Weiss"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>HTTP defines proactive content negotiation to allow servers to select the appropriate response for a given request, based upon the user agent's characteristics, as expressed in request headers. In practice, user agents are often unwilling to send those request headers, because it is not clear whether they will be used, and sending them impacts both performance and privacy.</t>
              <t>This document defines an Accept-CH response header that servers can use to advertise their use of request headers for proactive content negotiation, along with a set of guidelines for the creation of such headers, colloquially known as "Client Hints."</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8942"/>
          <seriesInfo name="DOI" value="10.17487/RFC8942"/>
        </reference>
        <reference anchor="RFC6265">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="April" year="2011"/>
            <abstract>
              <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol. Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet. This document obsoletes RFC 2965. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6265"/>
          <seriesInfo name="DOI" value="10.17487/RFC6265"/>
        </reference>
        <reference anchor="I-D.ietf-quic-reliable-stream-reset">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="6" month="September" year="2026"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

   This document defines a new QUIC frame, the RESET_STREAM_AT frame,
   that allows resetting a stream, while guaranteeing delivery of stream
   data up to a certain byte offset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-11"/>
        </reference>
        <reference anchor="HEv2">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <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="CONCEALED">
          <front>
            <title>The Concealed HTTP Authentication Scheme</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="D. Oliver" initials="D." surname="Oliver"/>
            <author fullname="J. Hoyland" initials="J." surname="Hoyland"/>
            <date month="February" year="2025"/>
            <abstract>
              <t>Most HTTP authentication schemes are probeable in the sense that it is possible for an unauthenticated client to probe whether an origin serves resources that require authentication. It is possible for an origin to hide the fact that it requires authentication by not generating Unauthorized status codes; however, that only works with non-cryptographic authentication schemes: cryptographic signatures require a fresh nonce to be signed. Prior to this document, there was no existing way for the origin to share such a nonce without exposing the fact that it serves resources that require authentication. This document defines a new non-probeable cryptographic authentication scheme.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9729"/>
          <seriesInfo name="DOI" value="10.17487/RFC9729"/>
        </reference>
        <reference anchor="I-D.ietf-intarea-proxy-config">
          <front>
            <title>Communicating Proxy Configurations in Provisioning Domains</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Dragana Damjanovic" initials="D." surname="Damjanovic">
              <organization>Microsoft</organization>
            </author>
            <author fullname="Yaroslav Rosomakho" initials="Y." surname="Rosomakho">
              <organization>Zscaler</organization>
            </author>
            <date day="19" month="May" year="2026"/>
            <abstract>
              <t>   This document defines a mechanism for accessing provisioning domain
   information associated with a proxy, such as other proxy URIs that
   support different protocols and information about which destinations
   are accessible using a proxy.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/tfpauly/privacy-proxy.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-intarea-proxy-config-14"/>
        </reference>
        <reference anchor="RFC9440">
          <front>
            <title>Client-Cert HTTP Header Field</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="M. Bishop" initials="M." surname="Bishop"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document describes HTTP extension header fields that allow a TLS terminating reverse proxy (TTRP) to convey the client certificate information of a mutually authenticated TLS connection to the origin server in a common and predictable manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9440"/>
          <seriesInfo name="DOI" value="10.17487/RFC9440"/>
        </reference>
        <reference anchor="RFC7323">
          <front>
            <title>TCP Extensions for High Performance</title>
            <author fullname="D. Borman" initials="D." surname="Borman"/>
            <author fullname="B. Braden" initials="B." surname="Braden"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="R. Scheffenegger" initials="R." role="editor" surname="Scheffenegger"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>This document specifies a set of TCP extensions to improve performance over paths with a large bandwidth * delay product and to provide reliable operation over very high-speed paths. It defines the TCP Window Scale (WS) option and the TCP Timestamps (TS) option and their semantics. The Window Scale option is used to support larger receive windows, while the Timestamps option can be used for at least two distinct mechanisms, Protection Against Wrapped Sequences (PAWS) and Round-Trip Time Measurement (RTTM), that are also described herein.</t>
              <t>This document obsoletes RFC 1323 and describes changes from it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7323"/>
          <seriesInfo name="DOI" value="10.17487/RFC7323"/>
        </reference>
        <reference anchor="RFC6269">
          <front>
            <title>Issues with IP Address Sharing</title>
            <author fullname="M. Ford" initials="M." role="editor" surname="Ford"/>
            <author fullname="M. Boucadair" initials="M." surname="Boucadair"/>
            <author fullname="A. Durand" initials="A." surname="Durand"/>
            <author fullname="P. Levis" initials="P." surname="Levis"/>
            <author fullname="P. Roberts" initials="P." surname="Roberts"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The completion of IPv4 address allocations from IANA and the Regional Internet Registries (RIRs) is causing service providers around the world to question how they will continue providing IPv4 connectivity service to their subscribers when there are no longer sufficient IPv4 addresses to allocate them one per subscriber. Several possible solutions to this problem are now emerging based around the idea of shared IPv4 addressing. These solutions give rise to a number of issues, and this memo identifies those common to all such address sharing approaches. Such issues include application failures, additional service monitoring complexity, new security vulnerabilities, and so on. Solution-specific discussions are out of scope.</t>
              <t>Deploying IPv6 is the only perennial way to ease pressure on the public IPv4 address pool without the need for address sharing mechanisms that give rise to the issues identified herein. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6269"/>
          <seriesInfo name="DOI" value="10.17487/RFC6269"/>
        </reference>
      </references>
    </references>
    <?line 470?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Amos Jeffries, Tommy Pauly, Kyle Nekritz, David Schinazi, and Kazuho Oku for close review and suggested changes.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA919+XYbR3b3/3iK+uB8MSkDEDdtzMgORNEWM5TIENDYPnPm
SA2gQLYFdCO9kIIlzrPkWfJkub97b1VXN5rUjJ3kj/FJRkQvtdy6+9b9fr9T
xMXCHpru2C5Xi6iw/ZdZfG0T82o8PjdHZ2/eHB+NzXmWflzHyaWZp5kZH513
O9Fkktnr4L2Ze7jP96d06TLN1ocmL2adziydJtGS5pll0bzox7aY96+KYjWJ
8/40TRI7LfrFdNXffdyJV9mhKbIyL/Z2dp7t7HWizEaH5iYuOnk5WcZ5HqdJ
sV7RYCfH4+87N2n24TJLy9Wh0RE7nbyIktm7aJEm9NTa5p18GWXFu/8o08Lm
hyZJO6v40Py5SKc9k6dZkdl5Tn+tl/jjL51OVBZXaXbYMf2Oof9k6S9s8ku0
jBPzemBG06sbGvFXvp1ml1ES/xoVtLBD89oWkTknkBCsljTqSTId8GN2GcWL
Q4O9/+uEfuTTQWKLTieh5+jda0vzmYvvj57t7u4c8huzOCfYEgxxGP7mXsvN
h7uDXf/AftsDe/72Qdvt/U6czMOFHA3Phy9OTk/GP8vjiic/pOmM0CGaFvHU
5owPR9EqmsSLuFibtxenuQxOx39odp+a7+0kK6NsbfZ2dg9koCi7tIUcVn74
8OHNzc3gZn9AQHw4vng49YP1y2yRP8RKTo+HF/3Ryfi4/3I4HtaWc7SwUWZG
cWHNy6iIgrn3d8yb9NouJzbD3E/+lrkxWD+nwfo0RoS5Rz+PjsantSlPzs1o
nU+Lhen3zfjKmtM4KT+aP9ossQtDiF4ubVIwMoSgODD/ViaWlrL3+M6lfOAx
eDk0zsOrYrl4eP1ksPuQ8ARoThT4MF71c55+gNudTp9WEU3yAkfS6RDtmaIk
elqAWssc/1uj5KsoN0QWl2ZiichXhMMmnZuCtjFNMyvP5is7jefxlPcwMOZV
emOvbdajx+I8GH5eJlM8EvHZY+Qcz0ULEy9XRFVRUpiZpYFim9D/52ZWWlOk
PNsimn7AzJG5sYtFH48lxEN4/jSLL4nMCLVWUXFFCxhj3tqqjLyQmygx0aIg
uDHiyvsrcCtaS3ZNOEr7SubxZZnJe8rAjDIdupS7CeoP0oWZzadZPKFlTda0
0LcXJ8ZxO2IW8TJeEO7pfhzze/vynNZUMcMTXg4xmnSRD+S0lvFstrCdzlfE
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
fQAA

-->

</rfc>
