<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-connect-tcp-13" 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-13"/>
    <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="August" 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>
      <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>
        <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="472" viewBox="0 0 472 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 256,32 L 256,64" fill="none" stroke="black"/>
                <path d="M 344,64 L 344,160" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,160" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,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 256,32 L 360,32" fill="none" stroke="black"/>
                <path d="M 400,32 L 464,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 256,64 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                <path d="M 280,80 L 368,80" fill="none" stroke="black"/>
                <path d="M 416,80 L 440,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 376,96" fill="none" stroke="black"/>
                <path d="M 408,96 L 440,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 376,112" fill="none" stroke="black"/>
                <path d="M 408,112 L 448,112" fill="none" stroke="black"/>
                <path d="M 136,128 L 168,128" fill="none" stroke="black"/>
                <path d="M 304,128 L 344,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 336,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,96 436,90.4 436,101.6" fill="black" transform="rotate(0,440,96)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="360,112 348,106.4 348,117.6" fill="black" transform="rotate(180,352,112)"/>
                <polygon class="arrowhead" points="344,144 332,138.4 332,149.6" fill="black" transform="rotate(0,336,144)"/>
                <polygon class="arrowhead" points="344,96 332,90.4 332,101.6" fill="black" transform="rotate(0,336,96)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,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="300" y="52">Endpoint</text>
                  <text x="344" y="52">B</text>
                  <text x="424" y="52">TCP</text>
                  <text x="448" y="52">B</text>
                  <text x="72" y="84">"abc"</text>
                  <text x="232" y="84">DATA{"abc"}</text>
                  <text x="392" y="84">"abc"</text>
                  <text x="72" y="100">FIN</text>
                  <text x="236" y="100">FINAL_DATA{""}</text>
                  <text x="392" y="100">FIN</text>
                  <text x="72" y="116">FIN</text>
                  <text x="236" y="116">FINAL_DATA{""}</text>
                  <text x="392" 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="472" viewBox="0 0 472 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 256,32 L 256,64" fill="none" stroke="black"/>
                <path d="M 344,64 L 344,96" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,96" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,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 256,32 L 360,32" fill="none" stroke="black"/>
                <path d="M 400,32 L 464,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 256,64 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 56,80" fill="none" stroke="black"/>
                <path d="M 88,80 L 152,80" fill="none" stroke="black"/>
                <path d="M 312,80 L 376,80" fill="none" stroke="black"/>
                <path d="M 408,80 L 440,80" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,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="300" y="52">Endpoint</text>
                  <text x="344" y="52">B</text>
                  <text x="424" y="52">TCP</text>
                  <text x="448" y="52">B</text>
                  <text x="72" y="84">RST</text>
                  <text x="232" y="84">RST_STREAM{CON_ERR}</text>
                  <text x="392" 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="472" viewBox="0 0 472 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 256,32 L 256,64" fill="none" stroke="black"/>
                <path d="M 344,64 L 344,128" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,128" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,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 256,32 L 360,32" fill="none" stroke="black"/>
                <path d="M 400,32 L 464,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 256,64 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 24,80 L 48,80" fill="none" stroke="black"/>
                <path d="M 96,80 L 184,80" fill="none" stroke="black"/>
                <path d="M 280,80 L 368,80" fill="none" stroke="black"/>
                <path d="M 416,80 L 440,80" fill="none" stroke="black"/>
                <path d="M 128,112 L 144,112" fill="none" stroke="black"/>
                <path d="M 312,112 L 376,112" fill="none" stroke="black"/>
                <path d="M 408,112 L 440,112" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,112 436,106.4 436,117.6" fill="black" transform="rotate(0,440,112)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="344,112 332,106.4 332,117.6" fill="black" transform="rotate(0,336,112)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,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="300" y="52">Endpoint</text>
                  <text x="344" y="52">B</text>
                  <text x="424" y="52">TCP</text>
                  <text x="448" y="52">B</text>
                  <text x="72" y="84">"abc"</text>
                  <text x="232" y="84">DATA{"abc"}</text>
                  <text x="392" y="84">"abc"</text>
                  <text x="164" y="100">(...</text>
                  <text x="216" y="100">timeout</text>
                  <text x="256" y="100">@</text>
                  <text x="272" y="100">A</text>
                  <text x="300" y="100">...)</text>
                  <text x="160" y="116">FIN</text>
                  <text x="192" y="116">(no</text>
                  <text x="260" y="116">close_notify</text>
                  <text x="392" 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="472" viewBox="0 0 472 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 256,32 L 256,64" fill="none" stroke="black"/>
                <path d="M 344,64 L 344,176" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,32 L 400,64" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,176" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,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 256,32 L 360,32" fill="none" stroke="black"/>
                <path d="M 400,32 L 464,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 256,64 L 360,64" fill="none" stroke="black"/>
                <path d="M 400,64 L 464,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 384,80" fill="none" stroke="black"/>
                <path d="M 416,80 L 440,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 376,128" fill="none" stroke="black"/>
                <path d="M 424,128 L 448,128" fill="none" stroke="black"/>
                <path d="M 136,144 L 168,144" fill="none" stroke="black"/>
                <path d="M 304,144 L 344,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 384,160" fill="none" stroke="black"/>
                <path d="M 416,160 L 440,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="448,160 436,154.4 436,165.6" fill="black" transform="rotate(0,440,160)"/>
                <polygon class="arrowhead" points="448,80 436,74.4 436,85.6" fill="black" transform="rotate(0,440,80)"/>
                <polygon class="arrowhead" points="360,128 348,122.4 348,133.6" fill="black" transform="rotate(180,352,128)"/>
                <polygon class="arrowhead" points="344,160 332,154.4 332,165.6" fill="black" transform="rotate(0,336,160)"/>
                <polygon class="arrowhead" points="344,80 332,74.4 332,85.6" fill="black" transform="rotate(0,336,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="300" y="52">Endpoint</text>
                  <text x="344" y="52">B</text>
                  <text x="424" y="52">TCP</text>
                  <text x="448" y="52">B</text>
                  <text x="80" y="84">FIN</text>
                  <text x="244" y="84">FINAL_DATA{""}</text>
                  <text x="400" y="84">FIN</text>
                  <text x="80" y="116">(FIN)</text>
                  <text x="400" y="116">(FIN)</text>
                  <text x="80" y="132">"abc"</text>
                  <text x="240" y="132">FINAL_DATA{"abc"}</text>
                  <text x="400" 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="400" 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="RFC9209"/> 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.</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>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion attacks</name>
        <t>A malicious client can achieve 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="RFC9209">
          <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="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 438?>

<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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
WtbpkOoOdngDP3hRgJd7L/b7u/39/t4/eZGAl4eHB5WFgYYdWBTSJ7nvVEw2
sM5rR/8dBB4BOm3HSwLwSEN4FYHzzVMgYrrFDbCgR486nYc26qwg5KdFfB58
uW1LDz3fut0HJ2gjhXot6qdUdSQuh23JboOr2B98FQ8E7DOTaQVDp+3TDea1
Ajg6ubo6fffj6OPJu+Grs5OPGpf5eHF5fnV+dH5mwaN9TlwQGxI8PNy7u5Of
X+zv77r017cxB+leBwR1zu5DOGSgQGSVm3KahjUFVKlNO5JVOwMHPh9+r01l
DaT8hXNS976sOIM3WT3fhjMGnLPBiQzyCSFt0zZq3jKse09fS+tacANa3Y+m
vJijx1/WzeLsOJDLNDWi/ABLSbtythi+io3H1AJ8Xtglsucu6lVt6W82Mt97
T/pPbHZnGTE4rhR5Iyn0vL9XA0QHLotgnzikJ/a9JxRzDP24DmjSVX8otDzR
MGPOhQ50Q2LYIjVrNEEXhukvhD4Q7zcnw+OTy1HH8vBLy/EdywovpQCm4/Hc
S3sokp7tqxboCB+9bFPk+7u7e/94MJyOn9P/0v9tKPROJQ8va1qrSRr6mlRT
v9//K9TTviqn95KbO2e0dWmdujdM8hxPfBec1/J27qtzeHnwbj3fJ+dsuaZo
bURYYIlLkHsBcpUdy9cc6hIEAkcyaWQMfR8rBh9zJox90XoqkeUDofhEVRdy
eZxA8kz8bxE4uiY3mmaFTUdAGutIiiotCJESfCpLt+E7WRfxzftkgQzavfUZ
MeeL2+SZQ5WkX8tEMqZpmXv+D3R5eouCpjrx61S2EXF9r+7h04pSok5h84vt
q/Do/caGbPJ0aRqkt/MyZSUasUoRmIlZcMdGQtSc8GiZhu2Dn9LVjO7dHT5/
MJWLTK48NiTsvirCozec4YVde3G4ryMY+jxNP8XGfvd0/+kTuNYSguawsC0v
QGqEtwWd3+WivBBFeSGKMPB+o4bv7k7EYEhCbziIzLrDyUHjc/BMK6m5dBLU
Ynub1qQnqo9xE0eiDA/hYLxPVN/8aqbb3YrbAYwFMXQ/fPgQeusw3Q2ZYO1Z
wdzuUIeMxAOxIljTtVutZmHP1kO12qnKLtloGW3iWbAlOLJBq0sxURu70ryE
DN2oD2gr0qI1Ic1PfDiJdFpXYVJk0Q2dk/pxcxryNlq7qgb9PUQKmtYk1Zy2
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
23EAAA==

-->

</rfc>
