<?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-12" 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-12"/>
    <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="July" day="21"/>
    <area>wit</area>
    <workgroup>httpbis</workgroup>
    <abstract>
      <?line 38?>

<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 42?>

<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="RFC9297"/> 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="RFC7838"/>, "Strict-Transport-Security" <xref target="RFC6797"/>).</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) = $TBD1,
  Length (i),  # MAY be zero
  TCP Payload (..),
}

FINAL_DATA Capsule {
  Type (i) = $TBD2,
  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="RFC9297"/>), 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, 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="RFC9297"/>).</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="RFC9297"/>).</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="RFC7838"/></t>
            </li>
            <li>
              <t>"Strict-Transport-Security" <xref target="RFC6797"/></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="RFC9000"/> 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="RFC8446"/>.</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="RFC9000"/>).  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="RFC8446"/>).  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="RFC8305"/> 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="RFC8446"/>, 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">(TBD1)</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">(TBD2)</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 removeInRFC="true" anchor="interop-testing-1">
          <name>Interop testing</name>
          <t>For this draft version of the protocol, the Capsule Type values <tt>0x2028d7f2</tt> and <tt>0x2028d7f3</tt> shall be used provisionally for testing, under the names "DATA-12" and "FINAL_DATA-12".</t>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <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="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="RFC9297">
          <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="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="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="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="RFC9000">
          <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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <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 updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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="RFC7838">
          <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="RFC6797">
          <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="RFC8305">
          <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>
        <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>
      </references>
    </references>
    <?line 436?>

<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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
AA==

-->

</rfc>
