<?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-14" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Templated CONNECT-TCP">Template-Driven HTTP CONNECT Proxying for TCP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-connect-tcp-14"/>
    <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="September" day="17"/>
    <area>wit</area>
    <workgroup>httpbis</workgroup>
    <abstract>
      <?line 45?>

<t>TCP proxying using HTTP CONNECT has long been part of the core HTTP specification.  However, this proxying 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 proxying 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 proxying 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 proxying 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?>

</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 the request is malformed or impermissible, the proxy <bcp14>MUST</bcp14> return a 4XX error code.  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
]]></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 = request-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 proxy connection.</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="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 proxying 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 destination_ip_prohibited Proxy Error Type from <xref section="2.3.5" sectionFormat="of" target="PROXY-STATUS"/> can be useful when rejecting unuthorized 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 proxying.  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 proxied 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 447?>

<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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
zTmVork+3DCaOErfb5Bmj6PdGJdIiNgV5/JxnmdNBqhSWGzWKtmhW3Auv4Zi
+BC3wg/5/nOHL+IhCaIov7nqfBvKf98Cf+2H6knLIzei84U3Ngy+4PGXYGQx
UJ/4j17ZlzCCPtC63/pTfvvAut/669KHjvzdjaazLv37nXsV1PGZH9/pk+9q
L37RkSERU+iNrGjrc9cO/a72IkZ++UP1IPz2D/eOlO/cixjpe6R5mhCMsi+4
8JlevfOPbl/U3WKN4z+63baO/O5Lc2T9wQMe8sbIuu9pzFjnpFJNFbI+qB0h
wl24oP4Z8CokcqkwgD4ozX4m4QPBc+d/V2HHPxLelmnfD+6Dfxpw/21kvAXu
nX6/T1BcGYjLf6W90+fdbXA3HnzL5BXsJKlI3w/EkOPFZjf437viie6xfp+k
MvzT3Khlfu5GW7jkd7UX/x7o6oMdmmrrvttGuhctS7d4JSzd32uFgt/WXvy7
WbrFK4VCU532IaQv/uPwD3wl4uRYYH4bE4dv5g1pTkvoEaeJGGJc5IwMRKdn
su/MGWyxvsd6BwfFoFiujXj32/LKmznrrKzIfO1Kl4vC1RRnmz7SlnALl84Y
/m89Zi7KqbdTjcmSdRs8IvIg2zxtTZjsy/f1NGYLRX2X3wGcLGjorYJTASMU
PLMpJmG6MpHAxnY+na7j8hE19qHqtbgjVdu38HC26NbAW3btK5xpUXovT1WP
l5pOybpHGg0phVUiFeujS8Sxvp6HmxdQRBmktppuYx1hVX0qwVmuWn3mYpZy
3q9BMuSKbQ5OkOTinyqU6LllyOQqynXwyloOtoZKv4UKXOZwDXLMozIwXHGq
2DvqZ2oEFJ0VYBIylbUMgQZw5SJX6mWNynOCv2f059ibOJTOkFA/oxfWBRx/
kbqUvDKBdveNOj+1/gR2ja0DhVWTFyiat6lWbMgJBdi0WlnO+vpqGb4L+I5n
4qoLljEbfTtVPPdJLZqLeG+a1cO9/DU4nBDVhfq52JOhea18pm61ia7bWJkQ
jlTmp+x6CvDTFLdZjHQUTdC1Zkxc+BbrljuQ2Lh16Lu8INh5teVdQLDmzGUU
hVOdiYMzSxeIlbF/QbKE0i2PjpA6PFVMv1WOWwnnY97qdEdS/5jrMRUDpRRG
LVnLArbwAFedMkBtaip3FTgbBybKYOgJ2woiTs1lzOSt2/SQZ5IScuxjDrhF
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

-->

</rfc>
