<?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.6.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-piraux-tcpls-03" category="exp" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.1 -->
  <front>
    <title abbrev="TCPLS">TCPLS: Modern Transport Services with TCP and TLS</title>
    <seriesInfo name="Internet-Draft" value="draft-piraux-tcpls-03"/>
    <author initials="M." surname="Piraux" fullname="Maxime Piraux">
      <organization>UCLouvain</organization>
      <address>
        <email>maxime.piraux@uclouvain.be</email>
      </address>
    </author>
    <author initials="F." surname="Rochet" fullname="Florentin Rochet">
      <organization>University of Namur</organization>
      <address>
        <email>florentin.rochet@unamur.be</email>
      </address>
    </author>
    <author initials="O." surname="Bonaventure" fullname="Olivier Bonaventure">
      <organization>UCLouvain</organization>
      <address>
        <email>olivier.bonaventure@uclouvain.be</email>
      </address>
    </author>
    <date year="2022" month="October" day="21"/>
    <area>Transport Area</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document specifies a protocol leveraging TCP and TLS to provide modern
transport services such as multiplexing, connection migration and multipath
in a secure manner.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/mpiraux/draft-piraux-tcpls"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The TCP/IP protocol stack continuously evolves. In the early days, most
applications were interacting with the transport layer (mainly TCP, but
also UDP) using the socket API. This is illustrated in <xref target="fig-intro-old"/>.</t>
      <figure anchor="fig-intro-old">
        <name>The classical TCP/IP protocol stack</name>
        <artwork><![CDATA[
+------------------------------+
|          Application         |
+------------------------------+
|            TCP/UDP           |
+------------------------------+
|             IPv4             |
+------------------------------+
]]></artwork>
      </figure>
      <t>The TCP/IP stack has slowly evolved and the figure above does not
anymore describe current Internet applications. IPv6 is now widely
deployed next to IPv4 in the network layer. In the transport layer,
protocols such as SCTP <xref target="RFC4960"/> or DCCP <xref target="RFC6335"/> and TCP
extensions including Multipath TCP <xref target="RFC8684"/> or tcpcrypt <xref target="RFC8548"/>
have been specified. The security aspects of the TCP/IP protocol suite
are much more important today than in the past <xref target="RFC7258"/>. Many
applications rely on TLS <xref target="RFC8446"/> and their stack is
similar to the one shown in <xref target="fig-intro-today"/>.</t>
      <figure anchor="fig-intro-today">
        <name>Today's TCP/IP protocol stack</name>
        <artwork><![CDATA[
+------------------------------+
|          Application         |
+------------------------------+
|             TLS              |
+------------------------------+
|             TCP              |
+------------------------------+
|          IPv4/IPv6           |
+------------------------------+
]]></artwork>
      </figure>
      <t>Recently, the IETF went one step further in improving the transport
layer with the QUIC protocol <xref target="RFC9000"/>. QUIC is a new secure transport
protocol primarily designed for HTTP/3. It includes the reliability and
congestion control features that are part of TCP and integrates the
security features of TLS 1.3 <xref target="RFC8446"/>. This close integration between
the reliability and security features brings a lot of benefits in QUIC.
QUIC runs above UDP to be able to pass through most middleboxes and to be
implementable in user space. While QUIC reuses TLS, it does not strictly layer
TLS on top of UDP as DTLS <xref target="I-D.ietf-tls-dtls13"/>. This organization,
illustrated in <xref target="fig-intro-quic"/> provides much more flexibility than simply
layering TLS above UDP. For example, the QUIC migration capabilities enable
an application to migrate an existing QUIC session from an IPv4 path to an
IPv6 one.</t>
      <figure anchor="fig-intro-quic">
        <name>QUIC protocol stack</name>
        <artwork><![CDATA[
+------------------------------+
|          Application         |
+------------------------------+
|..........                    |
|   TLS   |   QUIC   ..........|
|..........          |   UDP   |
+------------------------------+
|          IPv4/IPv6           |
+------------------------------+
]]></artwork>
      </figure>
      <t>In this document, we revisit how TCP and TLS 1.3 can be used to
provide modern transport services to applications. We apply a similar principle
and combine TCP and TLS 1.3 in a protocol that we call TCPLS.
TCPLS leverages the security features of TLS 1.3 like QUIC, but without
begin simply layered above a single TCP connection. In addition,
TCPLS reuses the existing TCP stacks and TCP's wider support in current
networks. A preliminary version of the TCPLS protocol is described in <xref target="CONEXT21"/>.</t>
      <figure anchor="fig-intro-tcpls">
        <name>TCPLS in the TCP/IP protocol stack</name>
        <artwork><![CDATA[
+------------------------------+
|          Application         |
+------------------------------+
|..........                    |
|   TLS   |   TCPLS  ..........|
|..........          |   TCP   |
+------------------------------+
|          IPv4/IPv6           |
+------------------------------+
]]></artwork>
      </figure>
      <t>In this document, we use the term TLS/TCP to refer to the TLS 1.3
protocol running over one TCP connection. We reserve the word TCPLS for
the protocol proposed in this document.</t>
      <t>This document is organized as follows. First, <xref target="services"/> summarizes the
different types of services that modern transports expose to application.
<xref target="overview"/> gives an overview of TCPLS and how it supports these
services. Finally, <xref target="format"/> describes the TCPLS in more details
and the TLS Extensions introduced in this document.</t>
    </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>
      <section anchor="notational-conventions">
        <name>Notational conventions</name>
        <t>This document uses the same conventions as defined in Section 1.3 of
<xref target="RFC9000"/>.</t>
        <t>This document uses network byte order (that is, big endian) values.
Fields are placed starting from the high-order bits of each byte.</t>
      </section>
    </section>
    <section anchor="services">
      <name>Modern Transport Services</name>
      <t>Application requirements and the devices they run on evolve over time. In
the early days, most applications involved single-file transfer and ran on
single-homed computers with a fixed-line network. Today, web-based applications
require exchanging multiple objects, with different priorities, on
devices that can move from one access network to another and that often
have multiple access networks available. Security is also a key requirement
of applications that evolved from only guaranteeing the confidentiality and
integrity of application messages to also preventing pervasive monitoring.</t>
      <t>With TCP and TLS/TCP, applications use a single connection that supports
a single bytestream in each direction.
Some TCP applications such as HTTP/2 <xref target="RFC7540"/> use multiple
streams, but these are mapped to a single TCP connection which leads
to Head-of-Line (HoL) blocking when packet losses occur. SCTP <xref target="RFC4960"/>
supports multiple truly-concurrent streams and QUIC adopted a similar
approach to prevent HoL blocking.</t>
      <t>Modern transport services also changed the utilization of the underlying network.
With TCP, when a host creates a connection, it is bound to the
IP addresses used by the client and the server during the handshake. When the
client moves and receives a different IP address, it has to reestablish all TCP
connections bound to the previous address.
When the client and the server are dual-stack, they cannot easily switch from
one address family to another. Happy Eyeballs <xref target="RFC8305"/> provides a partial
answer to this problem for web applications with heuristics that clients can
use to probe TCP connections with different address families.
With Multipath TCP, the client and the
server can learn other addresses of the remote host and combine several
TCP connections within a single Multipath TCP connection that is exposed to
the application. This supports various use cases <xref target="RFC8041"/>. QUIC <xref target="RFC9000"/>
enables applications to migrate from one network path to another, but not
to simultaneously use different paths.</t>
    </section>
    <section anchor="overview">
      <name>TCPLS Overview</name>
      <t>In order for TCPLS to be widely compatible with middleboxes that inspect TCP
segments and TLS records, TCPLS does not modify the TCP connection establishment
and only adds a TLS extension to the TLS handshake. <xref target="fig-overview-handshake"/>
illustrates the opening of a TCPLS session which starts with the TCP
3-way handshake, followed by the TLS handshake. In
the Extensions of the ClientHello and in the server EncryptedExtensions, the
tcpls TLS Extension is introduced to announce the support of TCPLS.</t>
      <figure anchor="fig-overview-handshake">
        <name>Starting a TCPLS session</name>
        <artwork><![CDATA[
Client                                   Server
 |                    SYN                    |
 |------------------------------------------>|
 |                  SYN+ACK                  |
 |<------------------------------------------|
 |       ACK, TLS ClientHello + tcpls        |
 |------------------------------------------>|
 |  TLS ServerHello, TLS EncryptedExtensions |
 |                          + tcpls, ...     |
 |<------------------------------------------|
 |               TLS Finished                |
 |------------------------------------------>|
 |                                           |
]]></artwork>
      </figure>
      <t>TCP/TLS offers a single encrypted bytestream service to the application.
To achieve this, TLS records are used to encrypt and secure chunks of
the application bytestream and are then sent through the TCP bytestream.
TCPLS leverages TLS records differently. TCPLS defines its own framing
that allows encoding application data and control information. A TCPLS frame
is the basic unit of information for TCPLS. A TCPLS frame always fits in a
single record. One or more TCPLS frames can be encoded in a TLS record.
This TLS record is then reliably transported by a TCP connection.
<xref target="fig-tcpls-frames"/> illustrates the relationship between
TCPLS frames and TLS records.</t>
      <figure anchor="fig-tcpls-frames">
        <name>The first TLS record contains two TCPLS frames</name>
        <artwork><![CDATA[
  TCPLS Data     TCP Control      TCPLS Data
  abcdef         0010010          mnopq...
  <--------->   <----------->    <------------>
 /                          /
/                          /
|                         /
|                        /
|                      /
|                    /
|                  /
|                 /
+----------------+     +-----------------+
|   TLS record n |     | TLS record n+1  |  ....
+----------------+     +-----------------+
]]></artwork>
      </figure>
      <section anchor="multiple-streams">
        <name>Multiple Streams</name>
        <t>TCPLS extends the service provided by TCP with streams. Streams are
independent bidirectional bytestreams that can be used by applications to
concurrently convey several objects over a TCPLS session.
Streams can be opened by the client and by the server.</t>
        <t>Streams are identified by a 32-bit unsigned integer. The parity of this number
indicates the initiator of the stream. The client opens even-numbered
streams while the server opens odd-numbered streams. Streams are opened in
sequence, e.g. a client that has opened stream 0 will use stream 2 as the
next one.</t>
        <t>Data is exchanged using Stream frames whose format is
described in <xref target="stream-frame"/>. Each Stream frame carries a chunk of data of
a given stream. Applications can mark the end of a stream to close it.</t>
        <t>TCPLS enables the receiver to decrypt and process TLS records in
zero copy similarly to TLS 1.3 under circumstances discussed in
<xref target="zero-copy-receive-path"/>.</t>
        <t>Similarly to HTTP/2 <xref target="RFC7540"/>, conveying several streams on a single TCP
connection introduces Head-of-Line (HoL) blocking between the streams. To
alleviate this, TCPLS provides means to the application to choose the degree
of HoL blocking resilience it needs for its application objects by spreading
streams among different underlying TCP connections.</t>
      </section>
      <section anchor="multiple-tcp-connections">
        <name>Multiple TCP connections</name>
        <t>TCPLS is not restricted to using a single TCP connection to exchange frames.
A TCPLS session starts with the TCP connection that was used to transport the
TLS handshake. After this handshake, other TCP connections can be added
to a TCPLS session, either to spread the load or for failover. TCPLS manages
the utilization of the underlying TCP connections within a TCPLS session.</t>
        <t>Multipath TCP enables both the client and the server to establish additional
TCP connections. However, experience has shown that additional subflows are only
established by the clients. TCPLS focuses on this deployment and only allows
clients to create additional TCP connections.</t>
        <t>Using Multipath TCP, a client can try establishing a new TCP connection at
any time. If a server wishes to restrict the number of TCP connections that
correspond to one Multipath TCP connection, it has to respond with RST to
the in excess connection attempts.</t>
        <t>TCPLS takes another approach. To control the number of connections that a
client can establish, a TCPLS server supplies unique tokens. A client includes
one of the server supplied tokens when it attaches a new TCP connection to a
TCPLS session. Each token can only be used once, hence limiting the amount of
additional TCP connections.</t>
        <t>TCPLS endpoints can advertise their local addresses, allowing new TCP
connections for a given TCPLS session to be established between new pairs of
addresses. When an endpoint is no more willing new TCP connections to use one
of its advertised addresses, it can remove this address from the TCPLS session.</t>
        <section anchor="joining-tcp-connections">
          <name>Joining TCP connections</name>
          <t>The TCPLS server provides tokens to the client in order to join new TCP
connections to the TCPLS session. <xref target="join-connections"/> illustrates a client
and server first establishing a new TCPLS session as described in <xref target="overview"/>.
Then the server sends a token over this connection using the New Token
frame. Each token has a sequence number (e.g. 1) and a value (e.g. "abc").
The client uses this token to open a new TCP connection and initiates the
TCPLS handshake. It adds the token inside the TCPLS Join TLS extension in the
ClientHello.</t>
          <figure anchor="join-connections">
            <name>Joining a new TCP connection</name>
            <artwork><![CDATA[
              <-1.TCPLS Handshake->
       .----------------------------------.
       |             <-2.New Token(1,abc) |
       v                                  v
+--------+                             +--------+
| Client |                             | Server |
+--------+                             +--------+
       ^                                  ^
       | 3.TCPLS Hsh. + tcpls_join(abc)-> |      Legend:
       .----------------------------------.        --- TCP connection
]]></artwork>
          </figure>
          <t>When receiving a TCPLS Join Extension, the server validates the token and
associates the TCP connection to the TCPLS session.</t>
          <t>Each TCP connection that is part of a TCPLS session is identified by a 32-bit
unsigned integer called its Connection ID. The first TCP connection of a session
corresponds to Connection ID 0. When joining a new connection,
the sequence number of the token, i.e. 1 in our example, becomes the
Connection ID of the connection. The Connection ID enables the Client and
the Server to identify a specific TCP connection within a given TCPLS
session.</t>
        </section>
        <section anchor="robust-session-establishment">
          <name>Robust session establishment</name>
          <t>The TCPLS protocol also supports robust session establishment, where a
multihomed or dual-stack client can establish a TCPLS session when at least
one network path to the server can be established. This guarantees robustness
against network failures and lowers the overall latency of a session
establishment.</t>
          <t><xref target="fig-robust-session-establishment"/> illustrates a dual-homed client that
robustly establish a TCPLS session over two local addresses. In this example,
the path from IP b towards the server exhibits a higher delay.</t>
          <figure anchor="fig-robust-session-establishment">
            <name>Robust session establishment example</name>
            <artwork><![CDATA[
Client @ IP a                 Server                 Client @ IP b
 |             SYN              |             SYN              |
 |----------------------------->|               /--------------|
 |           SYN+ACK            |<-------------/               |
 |<-----------------------------|           SYN+ACK            |
 | ACK, TLS CH + tcpls          |--------------\               |
 |----------------------------->|               \------------->|
 |      TLS SH, EE + tcpls,     |             ACK              |
 |        tcpls_token(abc), ... |<-----------------------------|
 |<-----------------------------|TLS CH + tcpls,tcpls_join(abc)|
 | TLS Finished                 |<-----------------------------|
 |----------------------------->|                              |
 | TCPLS session established and 2nd connection can be joined. |
                               ...
]]></artwork>
          </figure>
          <t>The client starts by opening a TCP connection on from each of its local
addresses. The TCP connection from IP "a" towards the server completes faster
than the other. The client then starts a TCPLS Handshake on
this connection. When the other connection is established, the client
waits for receiving a TCPLS token allowing to join it to the session being
established. In addition to the New Token frame, the TCPLS protocol enables
the server to provide one such token during the handshake using the TCPLS Token
TLS extension. The server uses this extension when sending its
EncryptedExtensions over the faster connection to provide the TCPLS token
"abc". As soon as the client has received this token, it uses
it over the other connection to join it to the session.
When the TLS handshake completes over the fastest connection, the TCPLS session
is established and the other connection can be joined to the session.</t>
        </section>
        <section anchor="failover">
          <name>Failover</name>
          <t>TCPLS supports two types of failover. In make-before-break, the client
creates a TCP connection using the procedure described in
<xref target="joining-tcp-connections"/> but only uses it once the initial connection fails.</t>
          <t>In break-before-make, the
client creates the initial TCP connection and uses it for the TCPLS handshake
and the data. The server advertises one or more tokens over this connection.
Upon failure of the initial TCP connection, the client initiates a
second TCP connection using the server-provided token.</t>
          <t>In both cases, some records sent by the client or the server might be
in transit when the failure occurs. Some of these records could have been
partially received but not yet delivered to the TCPLS layer when the
underlying TCP connection fails. Other records could have already been received,
decrypted and data of their frames could have been delivered to the
application. To prevent data losses and duplication, TCPLS includes its own
acknowledgments.</t>
          <t>A TCPLS receiver acknowledges the received records using the ACK
frame. Records are acknowledged after the record protection has been
successfully removed. This enables the sender to know which records have been
received. TCPLS enables the endpoint to send acknowledgments for a TCP
connection over any connections, e.g. not only the receiving connection.</t>
        </section>
        <section anchor="migration">
          <name>Migration</name>
          <t>To migrate from a given TCP connection, an endpoint stops transmitting
over this TCP connection and sends the following frames on other TCP
connections. It leverages the acknowledgments to retransmit the frames of
TLS records that have not been yet acknowledged.</t>
          <t>When an endpoint abortfully closes a TCP connection, its peer leverages the
acknowlegments to retransmit the TLS records that were not acknowlegded.</t>
        </section>
        <section anchor="multipath">
          <name>Multipath</name>
          <t>TCPLS also supports the utilization of different TCP connections, over
different paths or interfaces, to improve throughput or spread stream frames
over different TCP connections.
When the endpoints have opened several TCP connections, they can send frames
over the connections. TCPLS can send all the stream frames belonging to a
given stream over one or more underlying TCP connections. The latter enables
bandwidth aggregation by using TCP connections established over different
network paths.</t>
        </section>
      </section>
      <section anchor="record-protection">
        <name>Record protection</name>
        <t>When adding new TCP connections to a TCPLS session, an endpoint does not
complete the TLS handshake. TCPLS provides a nonce construction for TLS
record protection that is used for all connections of a session. This
reduces the cryptographic cost of adding connections. The endpoints <bcp14>SHOULD</bcp14> send
TLS messages to form an apparent complete TLS handshake to middleboxes.</t>
        <t>In order to use the TLS session over multiple connections, TCPLS adds a
record sequence number space per connection that is maintained independently at
both sides. Each record sent over a TCPLS session is identified by the
Connection ID of its connection and its record sequence number. Each record
nonce is constructed as defined in <xref target="fig-record-nonce"/>.</t>
        <figure anchor="fig-record-nonce">
          <name>TCPLS TLS record nonce construction</name>
          <artwork><![CDATA[
N                  N-32                   64                    0
+---------------------------------------------------------------+
|                    client/server_write_iv                     |
+---------------------------------------------------------------+
         XOR                                        XOR
+-------------------+                      +--------------------+
|   Connection ID   |                      | Conn. record sequ. |
+-------------------+                      +--------------------+
]]></artwork>
        </figure>
        <t>This construction guarantees that every TLS record sent over the TLS session
is protected with a unique nonce. As in TLS 1.3, the per-connection record
sequence is implicit.</t>
      </section>
      <section anchor="closing-a-tcpls-session">
        <name>Closing a TCPLS session</name>
        <t>Endpoints notify their peers that they do not intend to send more data over
a given TCPLS session by sending a TLS Alert "close_notify". The alert can
be sent over one or more TCP connections of the session. The alert <bcp14>MUST</bcp14> be
sent before closing the last TCP connection of the TCPLS session.
The endpoint <bcp14>MAY</bcp14> close its side of the TCP connections after sending the alert.</t>
        <t>When all TCP connections of a session are closed and the TLS Alert
"close_notify" was exchanged in both directions, the TCPLS session is
considered as closed.</t>
        <t>We leave defining an abortful and idle session closure mechanisms for future
versions of this document.</t>
      </section>
      <section anchor="zero-copy-receive-path">
        <name>Zero-Copy Receive Path</name>
        <t>TCPLS enables the receiver to process TLS records in a zero-copy manner
under several conditions. When they are met, the application data carried
in TCPLS frames can be decrypted at the right place in the application
buffers.</t>
        <t>First, zero-copy can be achieved when Stream frames of a given stream
arrive in order. When using several TCP connections, out-of-order Stream frames
cannot be processed in zero copy. A Multipath scheduling algorithm
may target the minimization of out-of-order packets.</t>
        <t>Second, the composition
of TCPLS frames in a TLS record is impactful. The sender <bcp14>SHOULD</bcp14> encode a
single Stream Data frame as the first frame of the record, followed by
control-related frames if needed.
When the sender encodes several Stream frames, the frame at the start of
the record <bcp14>SHOULD</bcp14> be the largest, in order to maximise the use of zero copy.
When several Stream frames are included in a record, they <bcp14>SHOULD</bcp14> belong to
different streams.</t>
      </section>
    </section>
    <section anchor="format">
      <name>TCPLS Protocol</name>
      <section anchor="tcpls-tls-extensions">
        <name>TCPLS TLS Extensions</name>
        <t>This document specifies three TLS extensions used by TCPLS. The first,
"tcpls", is used to announce the support of TCPLS. The second,
"tcpls_join", is used to join a TCP connection to a TCPLS session. The third,
"tcpls_token", is used to provide a token to the client before the handshake
completes. Their types are defined as follows.</t>
        <artwork><![CDATA[
enum {
    tcpls(TBD1),
    tcpls_join(TBD2),
    tcpls_token(TBD3),
    (65535)
} ExtensionType;
]]></artwork>
        <t>The table below indicates the TLS messages where these extensions can appear.
"CH" indicates ClientHello while "EE" indicates EncryptedExtensions.</t>
        <table anchor="tcpls-tls-extensions-allowed-tls-messages">
          <name>TLS messages allowed to carry TCPLS TLS Extensions</name>
          <thead>
            <tr>
              <th align="left">Extension</th>
              <th align="left">Allowed TLS messages</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">tcpls</td>
              <td align="left">CH, EE</td>
            </tr>
            <tr>
              <td align="left">tcpls_join</td>
              <td align="left">CH</td>
            </tr>
            <tr>
              <td align="left">tcpls_token</td>
              <td align="left">EE</td>
            </tr>
          </tbody>
        </table>
        <section anchor="tcpls">
          <name>TCPLS</name>
          <t>The "tcpls" extension is used by the client and the server to announce
their support of TCPLS. The extension contains no value. When it is present
in both the ClientHello and the EncryptedExtensions, the endpoints <bcp14>MUST</bcp14> use
TCPLS after completing the TLS handshake.</t>
        </section>
        <section anchor="tcpls-join">
          <name>TCPLS Join</name>
          <artwork><![CDATA[
struct {
    opaque token<32>;
} TCPLSJoin;
]]></artwork>
          <t>The "tcpls_join" extension is used by the client to join the TCP connection
on which it is sent to a TCPLS session. The extension contains a token
provided by the server. The client <bcp14>MUST NOT</bcp14> send more than one
"tcpls_join" extension in its ClientHello. When receiving a ClientHello with
this extension, the server checks that the token is valid and joins the TCP
connection to the corresponding TCPLS session. When the token is not valid,
the server <bcp14>MUST</bcp14> abort the handshake with an illegal_parameter alert.</t>
        </section>
        <section anchor="tcpls-token">
          <name>TCPLS Token</name>
          <artwork><![CDATA[
struct {
    opaque token<32>;
} TCPLSToken;
]]></artwork>
          <t>The "tcpls_token" extension is used by the server to provide a token to the
client during the TLS handshake. When receiving this
extension, the client associates the token value as the first token of the TCPLS
session, i.e. with a sequence number of 1. The server <bcp14>MUST NOT</bcp14> send this
extension when the corresponding ClientHello contains
a "tcpls_join" extension.</t>
        </section>
      </section>
      <section anchor="tcpls-frames">
        <name>TCPLS Frames</name>
        <t>TCPLS uses TLS Application Data records to exchange TCPLS frames. After
decryption, the record payload consists of a sequence of TCPLS frames.
<xref target="fig-parsing-tcpls-frames"/> illustrates the manner in which TCPLS frames
are parsed from a decrypted TLS record.
The receiver processes the frames starting from the last one to the first one.
The fields of each frames are also parsed from the end towards the beginning
of the TLS Application Data content. The parsing of a frame starts with the
last byte indicating the frame type and then with type-specific
fields preceeding it, forming a Type-Value unit.
Such ordering enables a zero-copy processing of the type-specific fields as
explained in <xref target="zero-copy-receive-path"/>.</t>
        <figure anchor="fig-parsing-tcpls-frames">
          <name>Parsing TCPLS frames inside a TLS record starts from the end.</name>
          <artwork><![CDATA[
                       First frame start
                                   |
0         First frame end          | n
+---------------------|------------|-+
|                     v            v |
|      *------------* *------------* |
| .... | Value |Type| | Value |Type| |
|      *------------* *------------* |
+------------------------------------+
        Decrypted TLS record
]]></artwork>
        </figure>
        <t><xref target="tcpls-frame-types"/> lists the
frames specified in this document.</t>
        <table anchor="tcpls-frame-types">
          <name>TCPLS frames</name>
          <thead>
            <tr>
              <th align="left">Type value</th>
              <th align="left">Frame name</th>
              <th align="left">Rules</th>
              <th align="left">Definition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x00</td>
              <td align="left">Padding</td>
              <td align="left">N</td>
              <td align="left">
                <xref target="padding-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x01</td>
              <td align="left">Ping</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="ping-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x02-0x03</td>
              <td align="left">Stream</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="stream-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x04</td>
              <td align="left">ACK</td>
              <td align="left">N</td>
              <td align="left">
                <xref target="ack-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x05</td>
              <td align="left">New Token</td>
              <td align="left">S</td>
              <td align="left">
                <xref target="new-token-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x06</td>
              <td align="left">Connection Reset</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="connection-reset-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x07</td>
              <td align="left">New Address</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="new-address-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x08</td>
              <td align="left">Remove Address</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="remove-address-frame"/></td>
            </tr>
            <tr>
              <td align="left">0x09</td>
              <td align="left">Stream Change</td>
              <td align="left">Cs</td>
              <td align="left">
                <xref target="stream-change-frame"/></td>
            </tr>
          </tbody>
        </table>
        <t>The "Rules" column in <xref target="tcpls-frame-types"/> indicates special requirements
regarding certain frames.</t>
        <dl>
          <dt>N:</dt>
          <dd>
            <t>Non-ack-eliciting. Receiving this frame does not elicit the sending of a
TCPLS acknowledgment.</t>
          </dd>
          <dt>S:</dt>
          <dd>
            <t>Server only. This frame <bcp14>MUST NOT</bcp14> be sent by the client.</t>
          </dd>
          <dt>Cs:</dt>
          <dd>
            <t>Connection-specific semantics. This frame is not idempotent and has specific
semantics based on the TCP connection over which it is exchanged.</t>
          </dd>
        </dl>
        <section anchor="padding-frame">
          <name>Padding frame</name>
          <t>This frame has no semantic value. It can be used to mitigate traffic
analysis on the TLS records of a TCPLS session. The Padding frame has no
content.</t>
          <figure anchor="padding-frame-format">
            <name>Padding frame format</name>
            <artwork><![CDATA[
Padding frame {
    Type (8) = 0x00,
}
]]></artwork>
          </figure>
        </section>
        <section anchor="ping-frame">
          <name>Ping frame</name>
          <t>This frame is used to elicit an acknowledgment from its peer. It has no
content. When an endpoint receives a Ping frame, it acknowledges the TLS
record that contains this frame. This frame can be used by an endpoint to check
that its peer can receive TLS records over a particular TCP connection.</t>
          <figure anchor="ping-frame-format">
            <name>Ping frame format</name>
            <artwork><![CDATA[
Ping frame {
    Type (8) = 0x01,
}
]]></artwork>
          </figure>
        </section>
        <section anchor="stream-frame">
          <name>Stream frame</name>
          <t>This frame is used to carry chunks of data of a given stream.</t>
          <figure anchor="stream-frame-format">
            <name>Stream frame format</name>
            <artwork><![CDATA[
Stream frame {
    Stream Data (...),
    Length (16),
    Offset (64),
    Stream ID (32),
    FIN (1),
    Type (7) = 0x01,
}
]]></artwork>
          </figure>
          <dl>
            <dt>FIN:</dt>
            <dd>
              <t>The last bit of the frame type bit indicates that this Stream frame
ends the stream when its value is 1. The last byte of the stream is at the sum of the
Offset and Length fields of this frame.</t>
            </dd>
            <dt>Stream ID:</dt>
            <dd>
              <t>A 32-bit unsigned integer indicating the ID of the stream this frame
relates to.</t>
            </dd>
            <dt>Offset:</dt>
            <dd>
              <t>A 64-bit unsigned integer indicating the offset in bytes of the carried
data in the stream.</t>
            </dd>
            <dt>Length:</dt>
            <dd>
              <t>A 16-bit unsigned integer indicating the length of the Stream Data field.</t>
            </dd>
          </dl>
        </section>
        <section anchor="ack-frame">
          <name>ACK frame</name>
          <t>This frame is sent by the receiver to acknowledge the receipt of TLS records on
a particular TCP connection of the TCPLS session. Although the reliability
of the data exchange on a connection is handled by TCP, there are situations
such as the failure of a TCP connection where a sender does not know whether the
TLS frames that it sent have been correctly received by the peer. The ACK frame
allows a TCPLS receiver to indicate the highest TLS record sequence number
received on a specific connection. The ACK frame can be sent over any TCP
connection of a TCPLS session.</t>
          <figure anchor="ack-frame-format">
            <name>ACK frame format</name>
            <artwork><![CDATA[
ACK frame {
    Highest Record Sequence Received (64),
    Connection ID (32),
    Type (8) = 0x04,
}
]]></artwork>
          </figure>
          <dl>
            <dt>Connection ID:</dt>
            <dd>
              <t>A 32-bit unsigned integer indicating the TCP connection for which the
acknowledgment was sent.</t>
            </dd>
            <dt>Highest Record Sequence Received:</dt>
            <dd>
              <t>A 64-bit unsigned integer indicating the highest TLS record sequence
number received on the connection indicated by the Connection ID.</t>
            </dd>
          </dl>
        </section>
        <section anchor="new-token-frame">
          <name>New Token frame</name>
          <t>This frame is used by the server to provide tokens to the client. Each token
can be used to join a new TCP connection to the TCPLS session, as described
in <xref target="joining-tcp-connections"/>. Clients <bcp14>MUST NOT</bcp14> send New Token frames.</t>
          <figure anchor="new-token-frame-format">
            <name>New Token frame format</name>
            <artwork><![CDATA[
New Token frame {
    Token (256),
    Sequence (8),
    Type (8) = 0x05,
}
]]></artwork>
          </figure>
          <dl>
            <dt>Sequence:</dt>
            <dd>
              <t>A 8-bit unsigned integer indicating the sequence number of this token</t>
            </dd>
            <dt>Token:</dt>
            <dd>
              <t>A 32-byte opaque value that can be used as a token by the client.</t>
            </dd>
          </dl>
          <t>By controlling the amount of tokens given to the client, the server can
control the number of active TCP connections of a TCPLS session. The server <bcp14>SHOULD</bcp14>
replenish the tokens when TCP connections are removed from the TCPLS session.</t>
        </section>
        <section anchor="connection-reset-frame">
          <name>Connection Reset frame</name>
          <t>This frame is used by the receiver to inform the sender that a TCP
connection has been reset.</t>
          <figure anchor="connection-reset-format">
            <name>Connection Reset format</name>
            <artwork><![CDATA[
Connection Reset frame {
    Connection ID (32)
    Type (8) = 0x06,
}
]]></artwork>
          </figure>
          <dl>
            <dt>Connection ID:</dt>
            <dd>
              <t>A 32-bit unsigned integer indicating the ID of the connection that failed.</t>
            </dd>
          </dl>
        </section>
        <section anchor="new-address-frame">
          <name>New Address frame</name>
          <t>This frame is used by an endpoint to add a new local address to the TCPLS
session. This address can then be used to establish new TCP connections.
The server advertises addresses that the client can use as destination when
adding TCP connections. The client advertises address that it can use as source
when adding TCP connections.</t>
          <figure anchor="new-address-format">
            <name>New Address format</name>
            <artwork><![CDATA[
New Address frame {
    Port (16),
    Address (..),
    Address Version (8),
    Address ID (8),
    Type (8) = 0x07,
}
]]></artwork>
          </figure>
          <dl>
            <dt>Address ID:</dt>
            <dd>
              <t>A 8-bit identifier for this address. For a given Address ID, an endpoint
receiving a frame with a content that differs from previously received frames
<bcp14>MUST</bcp14> ignore the frame. An endpoint receiving a frame for an Address ID that was
previously removed <bcp14>MUST</bcp14> ignore the frame.</t>
            </dd>
            <dt>Address Version:</dt>
            <dd>
              <t>A 8-bit value identifying the Internet address version of this address. The
number 4 indicates IPv4 while 6 indicates IPv6.</t>
            </dd>
            <dt>Address:</dt>
            <dd>
              <t>The address value. Its size depends on its version. IPv4 addresses are 32-bit
long while IPv6 addresses are 128-bit long.</t>
            </dd>
            <dt>Port:</dt>
            <dd>
              <t>A 16-bit value indicating the TCP port used with this address.</t>
            </dd>
          </dl>
        </section>
        <section anchor="remove-address-frame">
          <name>Remove Address frame</name>
          <t>This frame is used by an endpoint to announce that it is not willing to use a
given address to establish new TCP connections. After receiving this frame, a
client <bcp14>MUST NOT</bcp14> establish new TCP connections to the given address. After
receiving this frame, an endpoint <bcp14>MUST</bcp14> close all TCP connections using the
given address.</t>
          <figure anchor="remove-address-format">
            <name>Remove Address format</name>
            <artwork><![CDATA[
Remove Address frame {
    Address ID (8),
    Type (8) = 0x08,
}
]]></artwork>
          </figure>
          <dl>
            <dt>Address ID:</dt>
            <dd>
              <t>A 8-bit identifier for the address to remove. An endpoint receiving a frame
for an address that was nonexistent or already removed <bcp14>MUST</bcp14> ignore the frame.</t>
            </dd>
          </dl>
        </section>
        <section anchor="stream-change-frame">
          <name>Stream Change frame</name>
          <t>This frame is used by a sender to announce the Stream ID and Offset
of the next record over a given TCP connection. It can be used to make
explicit a change in stream scheduling over a connection to the receiver,
enabling a zero-copy receive path as explained in <xref target="zero-copy-receive-path"/>.
The hint contained in this frame relates to the connection over which it
was exchanged.</t>
          <figure anchor="stream-change-format">
            <name>Stream Change format</name>
            <artwork><![CDATA[
Stream Change frame {
    Type (8) = 0x09,
    Next Offset (64),
    Next Record Stream ID (32),
}
]]></artwork>
          </figure>
          <dl>
            <dt>Next Record Stream ID:</dt>
            <dd>
              <t>A 32-bit unsigned integer indicating the Stream ID of the Stream frame in the
next record .</t>
            </dd>
            <dt>Next Offset:</dt>
            <dd>
              <t>A 64-bit unsigned integer indicating the Offset of the Stream frame in the
next record.</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>When issuing tokens to the client as presented in <xref target="joining-tcp-connections"/>,
the server <bcp14>SHOULD</bcp14> ensure that their values appear as random to observers and
cannot be correlated together for a given TCPLS session.</t>
      <t>The security considerations for TLS apply to TCPLS.
The next versions of this document will elaborate on other security
considerations following the guidelines of <xref target="RFC3552"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to create a new "TCPLS" heading for the new registry
described in <xref target="tcpls-frames"/>. New registrations in TCPLS registries follow
the "Specification Required" policy of <xref target="RFC8126"/>.</t>
      <section anchor="tcpls-tls-extensions-1">
        <name>TCPLS TLS Extensions</name>
        <t>IANA is requested to add the following entries to the existing "TLS
ExtensionType Values" registry.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Extension Name</th>
              <th align="left">TLS 1.3</th>
              <th align="left">Recommended</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TBD1</td>
              <td align="left">tcpls</td>
              <td align="left">CH, EE</td>
              <td align="left">N</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">TBD2</td>
              <td align="left">tcpls_join</td>
              <td align="left">CH</td>
              <td align="left">N</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">TBD3</td>
              <td align="left">tcpls_token</td>
              <td align="left">EE</td>
              <td align="left">N</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>Note that "Recommended" is set to N as these extensions are intended for
uses as described in this document.</t>
      </section>
      <section anchor="tcpls-frames-1">
        <name>TCPLS Frames</name>
        <t>IANA is requested to create a new registry "TCPLS Frames Types" under the
"TCPLS" heading.</t>
        <t>The registry governs an 8-bit space. Entries in this registry must include a
"Frame name" field containing a short mnemonic for the frame type. The
initial content of the registry is present in <xref target="tcpls-frame-types"/>, without
the "Rules" column.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <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="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton">
              <organization/>
            </author>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <author fullname="T. Narten" initials="T." surname="Narten">
              <organization/>
            </author>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters.  To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper.  For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed.  This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC4960">
          <front>
            <title>Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." role="editor" surname="Stewart">
              <organization/>
            </author>
            <date month="September" year="2007"/>
            <abstract>
              <t>This document obsoletes RFC 2960 and RFC 3309.  It describes the Stream Control Transmission Protocol (SCTP).  SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.</t>
              <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network such as IP.  It offers the following services to its users:</t>
              <t>--  acknowledged error-free non-duplicated transfer of user data,</t>
              <t>--  data fragmentation to conform to discovered path MTU size,</t>
              <t>--  sequenced delivery of user messages within multiple streams, with an option for order-of-arrival delivery of individual user messages,</t>
              <t>--  optional bundling of multiple user messages into a single SCTP packet, and</t>
              <t>--  network-level fault tolerance through supporting of multi-homing at either or both ends of an association.</t>
              <t> The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4960"/>
          <seriesInfo name="DOI" value="10.17487/RFC4960"/>
        </reference>
        <reference anchor="RFC6335">
          <front>
            <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton">
              <organization/>
            </author>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="J. Touch" initials="J." surname="Touch">
              <organization/>
            </author>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund">
              <organization/>
            </author>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <date month="August" year="2011"/>
            <abstract>
              <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry.  It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
              <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP).  It also updates the DNS SRV specification to clarify what a service name is and how it is registered.  This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="165"/>
          <seriesInfo name="RFC" value="6335"/>
          <seriesInfo name="DOI" value="10.17487/RFC6335"/>
        </reference>
        <reference anchor="RFC7258">
          <front>
            <title>Pervasive Monitoring Is an Attack</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell">
              <organization/>
            </author>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig">
              <organization/>
            </author>
            <date month="May" year="2014"/>
            <abstract>
              <t>Pervasive monitoring is a technical attack that should be mitigated in the design of IETF protocols, where possible.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="188"/>
          <seriesInfo name="RFC" value="7258"/>
          <seriesInfo name="DOI" value="10.17487/RFC7258"/>
        </reference>
        <reference anchor="RFC8041">
          <front>
            <title>Use Cases and Operational Experience with Multipath TCP</title>
            <author fullname="O. Bonaventure" initials="O." surname="Bonaventure">
              <organization/>
            </author>
            <author fullname="C. Paasch" initials="C." surname="Paasch">
              <organization/>
            </author>
            <author fullname="G. Detal" initials="G." surname="Detal">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document discusses both use cases and operational experience with Multipath TCP (MPTCP) in real networks.  It lists several prominent use cases where Multipath TCP has been considered and is being used.  It also gives insight to some heuristics and decisions that have helped to realize these use cases and suggests possible improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8041"/>
          <seriesInfo name="DOI" value="10.17487/RFC8041"/>
        </reference>
        <reference anchor="RFC8305">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <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="RFC8548">
          <front>
            <title>Cryptographic Protection of TCP Streams (tcpcrypt)</title>
            <author fullname="A. Bittau" initials="A." surname="Bittau">
              <organization/>
            </author>
            <author fullname="D. Giffin" initials="D." surname="Giffin">
              <organization/>
            </author>
            <author fullname="M. Handley" initials="M." surname="Handley">
              <organization/>
            </author>
            <author fullname="D. Mazieres" initials="D." surname="Mazieres">
              <organization/>
            </author>
            <author fullname="Q. Slack" initials="Q." surname="Slack">
              <organization/>
            </author>
            <author fullname="E. Smith" initials="E." surname="Smith">
              <organization/>
            </author>
            <date month="May" year="2019"/>
            <abstract>
              <t>This document specifies "tcpcrypt", a TCP encryption protocol designed for use in conjunction with the TCP Encryption Negotiation Option (TCP-ENO).  Tcpcrypt coexists with middleboxes by tolerating resegmentation, NATs, and other manipulations of the TCP header.  The protocol is self-contained and specifically tailored to TCP implementations, which often reside in kernels or other environments in which large external software dependencies can be undesirable. Because the size of TCP options is limited, the protocol requires one additional one-way message latency to perform key exchange before application data can be transmitted.  However, the extra latency can be avoided between two hosts that have recently established a previous tcpcrypt connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8548"/>
          <seriesInfo name="DOI" value="10.17487/RFC8548"/>
        </reference>
        <reference anchor="RFC8684">
          <front>
            <title>TCP Extensions for Multipath Operation with Multiple Addresses</title>
            <author fullname="A. Ford" initials="A." surname="Ford">
              <organization/>
            </author>
            <author fullname="C. Raiciu" initials="C." surname="Raiciu">
              <organization/>
            </author>
            <author fullname="M. Handley" initials="M." surname="Handley">
              <organization/>
            </author>
            <author fullname="O. Bonaventure" initials="O." surname="Bonaventure">
              <organization/>
            </author>
            <author fullname="C. Paasch" initials="C." surname="Paasch">
              <organization/>
            </author>
            <date month="March" year="2020"/>
            <abstract>
              <t>TCP/IP communication is currently restricted to a single path per connection, yet multiple paths often exist between peers. The simultaneous use of these multiple paths for a TCP/IP session would improve resource usage within the network and thus improve user experience through higher throughput and improved resilience to network failure.</t>
              <t>Multipath TCP provides the ability to simultaneously use multiple paths between peers. This document presents a set of extensions to traditional TCP to support multipath operation. The protocol offers the same type of service to applications as TCP (i.e., a reliable bytestream), and it provides the components necessary to establish and use multiple TCP flows across potentially disjoint paths.</t>
              <t>This document specifies v1 of Multipath TCP, obsoleting v0 as specified in RFC 6824, through clarifications and modifications primarily driven by deployment experience.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8684"/>
          <seriesInfo name="DOI" value="10.17487/RFC8684"/>
        </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">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <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="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe">
              <organization/>
            </author>
            <author fullname="R. Peon" initials="R." surname="Peon">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <date month="May" year="2015"/>
            <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 perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </reference>
        <reference anchor="RFC3552">
          <front>
            <title>Guidelines for Writing RFC Text on Security Considerations</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <author fullname="B. Korver" initials="B." surname="Korver">
              <organization/>
            </author>
            <date month="July" year="2003"/>
            <abstract>
              <t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak.  This document provides guidelines to RFC authors on how to write a good Security Considerations section.   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="72"/>
          <seriesInfo name="RFC" value="3552"/>
          <seriesInfo name="DOI" value="10.17487/RFC3552"/>
        </reference>
        <reference anchor="I-D.ietf-tls-dtls13">
          <front>
            <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>RTFM, Inc.</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>Arm Limited</organization>
            </author>
            <author fullname="Nagendra Modadugu" initials="N." surname="Modadugu">
              <organization>Google, Inc.</organization>
            </author>
            <date day="30" month="April" year="2021"/>
            <abstract>
              <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.

 The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.

 This document obsoletes RFC 6347.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-dtls13-43"/>
        </reference>
        <reference anchor="CONEXT21">
          <front>
            <title>TCPLS - Modern Transport Services with TCP and TLS</title>
            <author initials="F." surname="Rochet">
              <organization/>
            </author>
            <author initials="E." surname="Assogba">
              <organization/>
            </author>
            <author initials="M." surname="Piraux">
              <organization/>
            </author>
            <author initials="K." surname="Edeline">
              <organization/>
            </author>
            <author initials="B." surname="Donnet">
              <organization/>
            </author>
            <author initials="O." surname="Bonaventure">
              <organization/>
            </author>
            <date year="2021" month="December"/>
          </front>
          <seriesInfo name="Proceedings of the 17th International Conference on emerging Networking EXperiments and Technologies (CoNEXT'21)" value=""/>
        </reference>
      </references>
    </references>
    <section anchor="alternative-designs">
      <name>Alternative Designs</name>
      <t>In this section, we discuss alternatives to mechanisms defined in this document.</t>
      <section anchor="securing-new-tcp-connections-with-new-session-tickets">
        <name>Securing new TCP connections with New Session Tickets</name>
        <t>When adding a new TCP connection to a TCPLS session, endpoints derive a
Initial Vector based on the technique presented in <xref target="record-protection"/>.
An alternative is to use New Session Tickets to derive separate
cryptographic protection materials based on a pre-shared key sent by the
server. In this mode of operation, the server provides New Session Tickets
to control the amount of additional TCP connections that can be opened by
the client. The server could encode the Connection ID in the ticket value.</t>
        <t>Using this mechanism differs from our proposal in several ways. While it
enables to use an existing TLS mechanism for this purpose, it has a number
of differences. First, it requires the server to compute pre-shared keys
which could be more costly than computing the TCPLS tokens defined in
<xref target="joining-tcp-connections"/>. Second, when used to establish a TLS session,
additional TLS messages must be computed and exchanged to complete the
handshake, which the current mechanism does not require.
Third, TLS New Session Tickets have a lifetime that is separated from the
session they are exchanged over. This is unneeded in the context of TCPLS
and may require additional protocol specification and guidance to
implementers.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This work has been partially supported by the ``Programme de
recherche d'interet general WALINNOV - MQUIC project (convention number
1810018)'' and European Union through the NGI Pointer programme for the TCPLS
project (Horizon 2020 Framework Programme, Grant agreement number 871528).
The authors thank Quentin De Coninck and Louis Navarre for their
comments on the first version of this draft.</t>
    </section>
    <section numbered="false" anchor="change-log">
      <name>Change log</name>
      <section numbered="false" anchor="since-draft-piraux-tcpls-02">
        <name>Since draft-piraux-tcpls-02</name>
        <ul spacing="normal">
          <li>Adds the TCPLS Token TLS extension to enable fast robust session
establishment.</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-piraux-tcpls-01">
        <name>Since draft-piraux-tcpls-01</name>
        <ul spacing="normal">
          <li>Change frames and fields order to enable zero-copy receiver.</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-piraux-tcpls-00">
        <name>Since draft-piraux-tcpls-00</name>
        <ul spacing="normal">
          <li>Added the addresses exchange mechanism with New Address and Remove Address
frames.</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81963bbSJLm/3yKXPlH2V0krYvtcqm767RKtsfesWWNperq
nlsNSCYltEGADYCSWZb3WfbvvMbOi01c8wKAkjyzc07z1ClTIJAZGRkRGfFF
ZGI8Hps2bwt3aHfOj0/fnh3ad9Xc1aU9r7OyWVV1a89cfZXPXGOv8/bSwl02
K+f2/O3Zjsmm09pd6bM7Zl7NymwJjc3rbNGOV3mdrT+N29mqaMa7B2aWte6i
qjeH1n1aGZOv6kPb1uum3d/d/X5332S1yw6jno/gb3Nd1R8v6mq9OjQf3Qb+
mh/aN2ULNLp2/AL7MaZpgaRfsqIqoe+Na0yzzOr2l7+uq9Y1h7aszCo/tP/U
VrORbaDl2i0a+LZZ4pd/MSZbt5dVfWjs2Fj48BjeZZ/ypbOnNAi6XtUXWZn/
mrV5VR7an47fVuurLC/pN7fM8uLQLumhCY/8D+tZwbdMpi5t/FVR1a5s89J+
qGaXrh1qv8yvXN3k7cZWC3uSLdd13NNCW5jU1MIf1iXe0uvpfZFf5a62P1Zl
dgUPrGt338FU/OhkGh5Nh2TKql5CC1cOeGc/vDp+/uTJM/26tw9fTV4uOvc8
+f7Zrnx9dnDwVL5+t//0uT65+2RPvx7s6g3Pnz7xNzx7/kS+fr+7q4199/SJ
fj14+nQfv74Zv5jkrl2MWxDAOfxv7wAvH78/efmn833qxFo/+fgZ27wEiXk1
iedFr76c2KOmqS6mWXL53SQWEr369xP7cu6KvHTJ5R8n9kVVlp2W30968yNq
SZoFt91fLenpxtW5a5D5h/YUBMS5eV5eNChJ7aWze9/BM6xFJABZYY+rcuFA
ombOViVIgKsv4Al74lrUQPz68k8raHUJNDbcl5tdllVRXUBP9uFxhUz9Zn/v
EREwB10/tC/czC2nIH37u/t7Bj7j8dhm06atsxno7fll3lgwGmts1DYrN8sX
2FhmV3UF2loVtnCgBBmREo3RthXecpXPnV0SZ0zrOdMoZ5r17NJmjV2uizZf
Fe4TtDKyM2T/DEdtl/lFTeOndvm2rL0EoQUSGjeDuQCNhtvrCZO+zOfzAuT+
ATKvruZragcH4pC8x29OA+VglGYfsTfQ0XW1boqNdVdVceWaCTxN0+CyGq7O
sw1Yo2XVtCZbrYp8RiTBxMJ0gHjAJAGzkAE00/hcGGuRbYC7D0FfS2gJSBjZ
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
JBdghMhIeLdAUSmkLoWujE9a/icxNdsiepYAAA==

-->

</rfc>
