<?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-15" 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-15"/>
    <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="13"/>
    <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 in modern HTTP environments.  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 this 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 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, 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"/>, "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, we use the term "proxy" to refer to the HTTP server that acts upon the 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>
    </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.  The client <bcp14>MUST</bcp14> substitute the destination host and port number into this template to produce the 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.</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 can be extended by defining additional relevant Capsule Types.  According to the Capsule Protocol (<xref section="3.2" sectionFormat="comma" target="CAPSULE"/>), new Capsule Types should be ignored by pre-existing proxies and intermediaries.  If a new Capsule Type cannot safely be ignored, the endpoints can confirm support using a new HTTP header field.</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 containing the origin of 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.  In this section, we use the term "endpoint" to describe an implementation of this specification in either role.</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>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.2.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, template-driven 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.</t>
        <t>Template-driven 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>Clients for this specification <bcp14>MAY</bcp14> accept various configuration inputs, including:</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 template-driven 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>The full URI, including path, of a provisioning domain resource containing one or more "connect-tcp" proxy sub-dictionaries (<xref section="3" sectionFormat="comma" target="I-D.ietf-intarea-proxy-config"/>).</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>
    <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="gateway-compatibility">
        <name>Gateway Compatibility</name>
        <t>Templated TCP proxies can make use of standard HTTP gateways and path-routing 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 must:</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 must 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 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.  Any timeout imposed by the endpoint <bcp14>MUST</bcp14> be treated as an abrupt closure of the affected stream or connection (<xref target="closing-connections"/>).</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="new-upgrade-token">
        <name>New Upgrade Token</name>
        <t>IF APPROVED, IANA is requested to add the following entry to the HTTP Upgrade Token Registry:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Description</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">(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>IF APPROVED, IANA is requested to add the following entry to the "MASQUE URI Suffixes" registry:</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>IF APPROVED, IANA is requested to add the following entry to the "HTTP Capsule Types" registry:</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>
      </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="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="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="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>
    <?line 460?>

<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:
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

-->

</rfc>
