<?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.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-taps-impl-15" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="TAPS Implementation">Implementing Interfaces to Transport Services</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-taps-impl-15"/>
    <author initials="A." surname="Brunstrom" fullname="Anna Brunstrom" role="editor">
      <organization>Karlstad University</organization>
      <address>
        <postal>
          <street>Universitetsgatan 2</street>
          <city>651 88 Karlstad</city>
          <country>Sweden</country>
        </postal>
        <email>anna.brunstrom@kau.se</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="T." surname="Enghardt" fullname="Theresa Enghardt">
      <organization>Netflix</organization>
      <address>
        <postal>
          <street>121 Albright Way</street>
          <city>Los Gatos, CA 95032</city>
          <country>United States of America</country>
        </postal>
        <email>ietf@tenghardt.net</email>
      </address>
    </author>
    <author initials="P." surname="Tiesel" fullname="Philipp S. Tiesel">
      <organization>SAP SE</organization>
      <address>
        <postal>
          <street>Konrad-Zuse-Ring 10</street>
          <city>14469 Potsdam</city>
          <country>Germany</country>
        </postal>
        <email>philipp@tiesel.net</email>
      </address>
    </author>
    <author initials="M." surname="Welzl" fullname="Michael Welzl">
      <organization>University of Oslo</organization>
      <address>
        <postal>
          <street>PO Box 1080 Blindern</street>
          <city>0316  Oslo</city>
          <country>Norway</country>
        </postal>
        <email>michawe@ifi.uio.no</email>
      </address>
    </author>
    <date year="2023" month="March" day="09"/>
    <area>Transport</area>
    <workgroup>TAPS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Transport Services system enables applications to use transport protocols flexibly for network communication
and defines a protocol-independent Transport Services Application Programming Interface (API) that is based on an asynchronous,
event-driven interaction pattern. This document serves as a guide to implementation on how to build such a system.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The Transport Services architecture <xref target="I-D.ietf-taps-arch"/> defines a system that allows applications to flexibly use transport networking protocols. The API that such a system exposes to applications is defined as the Transport Services API <xref target="I-D.ietf-taps-interface"/>. This API is designed to be generic across multiple transport protocols and sets of protocol features.</t>
      <t>This document serves as a guide to implementation on how to build a system that provides a Transport Services API. It is the job of an implementation of a Transport Services system to turn the requests of an application into decisions on how to establish connections, and how to transfer data over those connections once established. The terminology used in this document is based on the Architecture <xref target="I-D.ietf-taps-arch"/>.</t>
    </section>
    <section anchor="implementing-connection-objects">
      <name>Implementing Connection Objects</name>
      <t>The connection objects that are exposed to applications for Transport Services are:</t>
      <ul spacing="normal">
        <li>the Preconnection, the bundle of properties that describes the application constraints on, and preferences for, the transport;</li>
        <li>the Connection, the basic object that represents a flow of data as Messages in either direction between the Local and Remote Endpoints;</li>
        <li>and the Listener, a passive waiting object that delivers new Connections.</li>
      </ul>
      <t>Preconnection objects should be implemented as bundles of properties that an application can both read and write. A Preconnection object influences a Connection only at one point in time: when the Connection is created. Connection objects represent the interface between the application and the implementation to manage transport state, and conduct data transfer. During the process of establishment (<xref target="conn-establish"/>), the Connection will not be bound to a specific transport protocol instance, since multiple candidate Protocol Stacks might be raced.</t>
      <t>Once a Preconnection has been used to create an outbound Connection or a Listener, the implementation should ensure that the copy of the properties held by the Connection or Listener cannot be mutated by the application making changes to the original Preconnection object. This may involve the implementation performing a deep-copy, copying the object with all the objects that it references.</t>
      <t>Once the Connection is established, the Transport Services implementation maps actions and events to the details of the chosen Protocol Stack. For example, the same Connection object may ultimately represent a single transport protocol instance (e.g., a TCP connection, a TLS session over TCP, a UDP flow with fully-specified Local and Remote Endpoints, a DTLS session, a SCTP stream, a QUIC stream, or an HTTP/2 stream).
The properties held by a Connection or Listener are independent of other connections that are not part of the same Connection Group.</t>
      <t>Connection establishment is only a local operation for a connectionless protocols, which serves to simplify the local send/receive functions and to filter the traffic for the specified addresses and ports <xref target="RFC8085"/> (for example using UDP or UDP-Lite transport without a connection handshake procedure).</t>
      <t>Once Initiate has been called, the Selection Properties and Endpoint information are immutable (i.e, an application is not able to later modify Selection Properties on the original Preconnection object).
Listener objects are created with a Preconnection, at which point their configuration should be considered immutable by the implementation. The process of listening is described in <xref target="listen"/>.</t>
    </section>
    <section anchor="implementing-pre-establishment">
      <name>Implementing Pre-Establishment</name>
      <t>During pre-establishment the application specifies one or more Endpoints to be used for communication as well as protocol preferences and constraints via Selection Properties and, if desired, also Connection Properties. Generally, Connection Properties should be configured as early as possible, because they can serve as input to decisions that are made by the implementation (e.g., the Capacity Profile can guide usage of a protocol offering scavenger-type congestion control).</t>
      <t>The implementation stores these properties as a part of the Preconnection object for use during connection establishment. For Selection Properties that are not provided by the application, the implementation uses the default values specified in the Transport Services API (<xref target="I-D.ietf-taps-interface"/>).</t>
      <section anchor="configuration-time-errors">
        <name>Configuration-time errors</name>
        <t>The Transport Services system should have a list of supported protocols available, which each have transport features reflecting the capabilities of the protocol. Once an application specifies its Transport Properties, the transport system matches the required and prohibited properties against the transport features of the available protocols (see Section 6.2 of <xref target="I-D.ietf-taps-interface"/> for the definition of property preferences).</t>
        <t>In the following cases, failure should be detected during pre-establishment:</t>
        <ul spacing="normal">
          <li>A request by an application for properties that cannot be satisfied by any of the available protocols. For example, if an application requires <tt>perMsgReliability</tt>, but no such feature is available in any protocol on the host running the transport system this should result in an error, e.g., when SCTP is not supported by the operating system.</li>
          <li>A request by an application for properties that are in conflict with each other, i.e., the required and prohibited properties cannot be satisfied by the same protocol. For example, if an application prohibits <tt>reliability</tt> but then requires <tt>perMsgReliability</tt>, this mismatch should result in an error.</li>
        </ul>
        <t>To avoid allocating resources that are not finally needed, it is important that configuration-time errors fail as early as possible.</t>
      </section>
      <section anchor="role-of-system-policy">
        <name>Role of system policy</name>
        <t>The properties specified during pre-establishment have a close relationship to system policy. The implementation is responsible for combining and reconciling several different sources of preferences when establishing Connections. These include, but are not limited to:</t>
        <ol spacing="normal" type="1"><li>Application preferences, i.e., preferences specified during the pre-establishment via Selection Properties.</li>
          <li>Dynamic system policy, i.e., policy compiled from internally and externally acquired information about available network interfaces, supported transport protocols, and current/previous Connections. Examples of ways to externally retrieve policy-support information are through OS-specific statistics/measurement tools and tools that reside on middleboxes and routers.</li>
          <li>Default implementation policy, i.e., predefined policy by OS or application.</li>
        </ol>
        <t>In general, any protocol or path used for a connection must conform to all three sources of constraints. A violation that occurs at any of the policy layers should cause a protocol or path to be considered ineligible for use. For an example of application preferences leading to constraints, an application may prohibit the use of metered network interfaces for a given Connection to avoid user cost. Similarly, the system policy at a given time may prohibit the use of such a metered network interface from the application's process. Lastly, the implementation itself may default to disallowing certain network interfaces unless explicitly requested by the application and allowed by the system.</t>
        <t>It is expected that the database of system policies and the method of looking up these policies will vary across various platforms. An implementation should attempt to look up the relevant policies for the system in a dynamic way to make sure it is reflecting an accurate version of the system policy, since the system's policy regarding the application's traffic may change over time due to user or administrative changes.</t>
      </section>
    </section>
    <section anchor="conn-establish">
      <name>Implementing Connection Establishment</name>
      <t>The process of establishing a network connection begins when an application expresses intent to communicate with a Remote Endpoint by calling Initiate,  at which point the Preconnection object contains all constraints or requirements the application has configured for the connection. The establishment process can be considered complete once there is at least one Protocol Stack that has completed any required setup to the point that it can transmit and receive the application's data.</t>
      <t>Connection establishment is divided into two top-level steps: Candidate Gathering (defined in Section 4.2.1 of <xref target="I-D.ietf-taps-arch"/>), to identify the paths, protocols, and endpoints to use (see <xref target="gathering"/>); and Candidate Racing (defined in Section 4.2.2 of <xref target="I-D.ietf-taps-arch"/>), in which the necessary protocol handshakes are conducted so that the transport system can select which set to use (see <xref target="racing"/>). Candidate Racing involves attempting multiple options for connection establishment, and choosing the first option to succeed as the Protocol Stack to use for the connection. These attempts are usually staggered, starting each next option after a delay, but they can also be performed in parallel or only after waiting for failures.</t>
      <t>For ease of illustration, this document structures the candidates for racing as a tree (see <xref target="tree-structure"/>).
This is not meant to restrict implementations from structuring racing candidates differently.</t>
      <t>The most simple example of this process might involve identifying the single IP address to which the implementation wishes to connect, using the system's current default path (i.e., using the default interface), and starting a TCP handshake to establish a stream to the specified IP address. However, each step may also differ depending on the requirements of the connection: if the endpoint is defined as a hostname and port, then there may be multiple resolved addresses that are available; there may also be multiple paths available, (in this case using an interface other than the default system interface); and some protocols may not need any transport handshake to be considered "established" (such as UDP), while other connections may utilize layered protocol handshakes, such as TLS over TCP.</t>
      <t>Whenever an implementation has multiple options for connection establishment, it can view the set of all individual connection establishment options as a single, aggregate connection establishment. The aggregate set conceptually includes every valid combination of endpoints, paths, and protocols. As an example, consider an implementation that initiates a TCP connection to a hostname + port endpoint, and has two valid interfaces available (Wi-Fi and LTE). The hostname resolves to a single IPv4 address on the Wi-Fi network, and resolves to the same IPv4 address on the LTE network, as well as a single IPv6 address. The aggregate set of connection establishment options can be viewed as follows:</t>
      <artwork><![CDATA[
Aggregate [Endpoint: www.example.com:80] [Interface: Any]   [Protocol: TCP]
|-> [Endpoint: 192.0.2.1:80]       [Interface: Wi-Fi] [Protocol: TCP]
|-> [Endpoint: 192.0.2.1:80]       [Interface: LTE]   [Protocol: TCP]
|-> [Endpoint: 2001:DB8::1.80]     [Interface: LTE]   [Protocol: TCP]
]]></artwork>
      <t>Any one of these sub-entries on the aggregate connection attempt would satisfy the original application intent. The concern of this section is the algorithm defining which of these options to try, when, and in what order.</t>
      <t>During Candidate Gathering (<xref target="gathering"/>), an implementation prunes and sorts branches according
to the Selection Property preferences (Section 6.2 of <xref target="I-D.ietf-taps-interface"/>.
It first excludes all protocols and paths that match a Prohibit property or do not
match all Require properties. Then it will sort branches according to Preferred
properties, Avoided properties, and possibly other criteria.</t>
      <section anchor="tree-structure">
        <name>Structuring Candidates as a Tree</name>
        <t>As noted above, the consideration of multiple candidates in a gathering and racing process can be conceptually structured as a tree; this terminological convention is used throughout this document.</t>
        <t>Each leaf node of the tree represents a single, coherent connection attempt, with an endpoint, a network path, and a set of protocols that can directly negotiate and send data on the network. Each node in the tree that is not a leaf represents a connection attempt that is either underspecified, or else includes multiple distinct options. For example, when connecting on an IP network, a connection attempt to a hostname and port is underspecified, because the connection attempt requires a resolved IP address as its Remote Endpoint. In this case, the node represented by the connection attempt to the hostname is a parent node, with child nodes for each IP address. Similarly, an implementation that is allowed to connect using multiple interfaces will have a parent node of the tree for the decision between the network paths, with a branch for each interface.</t>
        <t>The example aggregate connection attempt above can be drawn as a tree by grouping the addresses resolved on the same interface into branches:</t>
        <artwork><![CDATA[
                             ||
              +=============================+
              | www.example.com:80/any path |
              +=============================+
                 //                     \\
+==========================+       +==========================+
| www.example.com:80/Wi-Fi |       |  www.example.com:80/LTE  |
+==========================+       +==========================+
             ||                      //                    \\
  +====================+  +====================+  +======================+
  | 192.0.2.1:80/Wi-Fi |  |  192.0.2.1:80/LTE  |  |  2001:DB8::1.80/LTE  |
  +====================+  +====================+  +======================+
]]></artwork>
        <t>The rest of this section will use a notation scheme to represent this tree. The parent (or trunk) node of the tree will be represented by a single integer, such as "1". ("1" is used assuming that this is the first connection made by the system; future connections created by the application would allocate numbers in an increasing manner.) Each child of that node will have an integer that identifies it, from 1 to the number of children. That child node will be uniquely identified by concatenating its integer to it's parents identifier with a dot in between, such as "1.1" and "1.2". Each node will be summarized by a tuple of three elements: endpoint, path (labeled here by interface), and protocol. In protocol stacks, the layers are separated by '/' and ordered top-down. The above example can now be written more succinctly as:</t>
        <artwork><![CDATA[
1 [www.example.com:80, any path, TCP]
  1.1 [www.example.com:80, Wi-Fi, TCP]
    1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [www.example.com:80, LTE, TCP]
    1.2.1 [192.0.2.1:80, LTE, TCP]
    1.2.2 [2001:DB8::1.80, LTE, TCP]
]]></artwork>
        <t>When an implementation is asked to establish a single connection, only one of the leaf nodes in the candidate set is needed to transfer data. Thus, once a single leaf node becomes ready to use, then the connection establishment tree is considered ready. One way to implement this is by having every leaf node update the state of its parent node when it becomes ready, until the trunk node of the tree is ready, which then notifies the application that the connection as a whole is ready to use.</t>
        <t>A connection establishment tree may be degenerate, and only have a single leaf node, such as a connection attempt to an IP address over a single interface with a single protocol.</t>
        <artwork><![CDATA[
1 [192.0.2.1:80, Wi-Fi, TCP]
]]></artwork>
        <t>A parent node may also only have one child (or leaf) node, such as a when a hostname resolves to only a single IP address.</t>
        <artwork><![CDATA[
1 [www.example.com:80, Wi-Fi, TCP]
  1.1 [192.0.2.1:80, Wi-Fi, TCP]
]]></artwork>
        <section anchor="branch-types">
          <name>Branch Types</name>
          <t>There are three types of branching from a parent node into one or more child nodes. Any parent node of the tree must only use one type of branching.</t>
          <section anchor="derived-endpoints">
            <name>Derived Endpoints</name>
            <t>If a connection originally targets a single endpoint, there may be multiple endpoints of different types that can be derived from the original. This creates an ordered list of the derived endpoints according to application preference, system policy and expected performance.</t>
            <t>DNS hostname-to-address resolution is the most common method of endpoint derivation. When trying to connect to a hostname endpoint on a traditional IP network, the implementation should send DNS queries for both A (IPv4) and AAAA (IPv6) records if both are supported on the local interface. The algorithm for ordering and racing these addresses should follow the recommendations in Happy Eyeballs <xref target="RFC8305"/>.</t>
            <artwork><![CDATA[
1 [www.example.com:80, Wi-Fi, TCP]
  1.1 [2001:DB8::1.80, Wi-Fi, TCP]
  1.2 [192.0.2.1:80, Wi-Fi, TCP]
  1.3 [2001:DB8::2.80, Wi-Fi, TCP]
  1.4 [2001:DB8::3.80, Wi-Fi, TCP]
]]></artwork>
            <t>DNS-Based Service Discovery <xref target="RFC6763"/> can also provide an endpoint derivation step. When trying to connect to a named service, the client may discover one or more hostname and port pairs on the local network using multicast DNS <xref target="RFC6762"/>. These hostnames should each be treated as a branch that can be attempted independently from other hostnames. Each of these hostnames might resolve to one or more addresses, which would create multiple layers of branching.</t>
            <artwork><![CDATA[
1 [term-printer._ipp._tcp.meeting.ietf.org, Wi-Fi, TCP]
  1.1 [term-printer.meeting.ietf.org:631, Wi-Fi, TCP]
    1.1.1 [31.133.160.18.631, Wi-Fi, TCP]
]]></artwork>
            <t>Applications can influence which derived endpoints are allowed and preferred via Selection Properties set on the Preconnection. For example, setting a preference for <tt>useTemporaryLocalAddress</tt> would prefer the use of IPv6 over IPv4, and requiring <tt>useTemporaryLocalAddress</tt> would eliminate IPv4 options, since IPv4 does not support temporary addresses.</t>
          </section>
          <section anchor="network-paths">
            <name>Network Paths</name>
            <t>If a client has multiple network paths available to it, e.g., a mobile client with intefaces for both Wi-Fi and Cellular connectivity, it can attempt a connection over any of the paths. This represents a branch point in the connection establishment. Similar to a derived endpoint, the paths should be ranked based on preference, system policy, and performance. Attempts should be started on one path (e.g., a specific interface), and then successively on other paths (or interfaces) after delays based on expected path round-trip-time or other available metrics.</t>
            <artwork><![CDATA[
1 [192.0.2.1:80, any path, TCP]
  1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [192.0.2.1:80, LTE, TCP]
]]></artwork>
            <t>This same approach applies to any situation in which the client is aware of multiple links or views of the network. A single interface may be shared by
multiple network paths, each with a coherent set of addresses, routes, DNS server, and more. A path may also represent a virtual interface service such as a Virtual Private Network (VPN).</t>
            <t>The list of available paths should be constrained by any requirements the application sets, as well as by the system policy.</t>
          </section>
          <section anchor="protocol-options">
            <name>Protocol Options</name>
            <t>Differences in possible protocol compositions and options can also provide a branching point in connection establishment. This allows clients to be resilient to situations in which a certain protocol is not functioning on a server or network.</t>
            <t>This approach is commonly used for connections with optional proxy server configurations. A single connection might have several options available: an HTTP-based proxy, a SOCKS-based proxy, or no proxy. As above, these options should be ranked based on preference, system policy, and performance and attempted in succession.</t>
            <artwork><![CDATA[
1 [www.example.com:80, any path, HTTP/TCP]
  1.1 [192.0.2.8:80, any path, HTTP/HTTP Proxy/TCP]
  1.2 [192.0.2.7:10234, any path, HTTP/SOCKS/TCP]
  1.3 [www.example.com:80, any path, HTTP/TCP]
    1.3.1 [192.0.2.1:80, any path, HTTP/TCP]
]]></artwork>
            <t>This approach also allows a client to attempt different sets of application and transport protocols that, when available, could provide preferable features. For example, the protocol options could involve QUIC <xref target="I-D.ietf-quic-transport"/> over UDP on one branch, and HTTP/2 <xref target="RFC7540"/> over TLS over TCP on the other:</t>
            <artwork><![CDATA[
1 [www.example.com:443, any path, HTTP]
  1.1 [www.example.com:443, any path, HTTP3/QUIC/UDP]
    1.1.1 [192.0.2.1:443, any path, HTTP3/QUIC/UDP]
  1.2 [www.example.com:443, any path, HTTP2/TLS/TCP]
    1.2.1 [192.0.2.1:443, any path, HTTP2/TLS/TCP]
]]></artwork>
            <t>Another example is racing SCTP with TCP:</t>
            <artwork><![CDATA[
1 [www.example.com:80, any path, reliable-inorder-stream]
  1.1 [www.example.com:80, any path, SCTP]
    1.1.1 [192.0.2.1:80, any path, SCTP]
  1.2 [www.example.com:80, any path, TCP]
    1.2.1 [192.0.2.1:80, any path, TCP]
]]></artwork>
            <t>Implementations that support racing protocols and protocol options should maintain a history of which protocols and protocol options successfully established, on a per-network and per-endpoint basis (see <xref target="performance-caches"/>). This information can influence future racing decisions to prioritize or prune branches.</t>
          </section>
        </section>
        <section anchor="branching-order-of-operations">
          <name>Branching Order-of-Operations</name>
          <t>Branch types ought to occur in a specific order relative to one another to avoid creating leaf nodes with invalid or incompatible settings. In the example above, it would be invalid to branch for derived endpoints (the DNS results for www.example.com) before branching between interface paths, since there are situations when the results will be different across networks due to private names or different supported IP versions. Implementations need to be careful to branch in a consistent order that results in usable leaf nodes whenever there are multiple branch types that could be used from a single node.</t>
          <t>This document recommends the following order of operations for branching:</t>
          <ol spacing="normal" type="1"><li>Network Paths</li>
            <li>Protocol Options</li>
            <li>Derived Endpoints</li>
          </ol>
          <t>where a lower number indicates higher precedence and therefore higher placement in the tree. Branching between paths is the first in the list because results across multiple interfaces are likely not related to one another: endpoint resolution may return different results, especially when using locally resolved host and service names, and which protocols are supported and preferred may differ across interfaces. Thus, if multiple paths are attempted, the overall connection can be seen as a race between the available paths or interfaces.</t>
          <t>Protocol options are next checked in order. Whether or not a set of protocol, or protocol-specific options, can successfully connect is generally not dependent on which specific IP address is used. Furthermore, the Protocol Stacks being attempted may influence or altogether change the endpoints being used. Adding a proxy to a connection's branch will change the endpoint to the proxy's IP address or hostname. Choosing an alternate protocol may also modify the ports that should be selected.</t>
          <t>Branching for derived endpoints is the final step, and may have multiple layers of derivation or resolution, such as DNS service resolution and DNS hostname resolution.</t>
          <t>For example, if the application has indicated both a preference for WiFi over LTE and for a feature only available in SCTP, branches will be first sorted accord to path selection, with WiFi at the top. Then, branches with SCTP will be sorted to the top within their subtree according to the properties influencing protocol selection. However, if the implementation has current cache information that SCTP is not available on the path over WiFi, there is no SCTP node in the WiFi subtree. Here, the path over WiFi will be tried first, and, if connection establishment succeeds, TCP will be used. So the Selection Property of preferring WiFi takes precedence over the Property that led to a preference for SCTP.</t>
          <artwork><![CDATA[
1. [www.example.com:80, any path, reliable-inorder-stream]
1.1 [192.0.2.1:80, Wi-Fi, reliable-inorder-stream]
1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
1.2 [192.0.3.1:80, LTE, reliable-inorder-stream]
1.2.1 [192.0.3.1:80, LTE, SCTP]
1.2.2 [192.0.3.1:80, LTE, TCP]
]]></artwork>
        </section>
        <section anchor="branch-sorting">
          <name>Sorting Branches</name>
          <t>Implementations should sort the branches of the tree of connection options in order of their preference rank, from most preferred to least preferred.
Leaf nodes on branches with higher rankings represent connection attempts that will be raced first.
Implementations should order the branches to reflect the preferences expressed by the application for its new connection, including Selection Properties, which are specified in <xref target="I-D.ietf-taps-interface"/>.</t>
          <t>In addition to the properties provided by the application, an implementation may include additional criteria such as cached performance estimates, see <xref target="performance-caches"/>, or system policy, see <xref target="role-of-system-policy"/>, in the ranking.
Two examples of how Selection and Connection Properties may be used to sort branches are provided below:</t>
          <ul spacing="normal">
            <li>"Interface Instance or Type":
If the application specifies an interface type to be preferred or avoided, implementations should accordingly rank the paths.
If the application specifies an interface type to be required or prohibited, an implementation is expected to exclude the non-conforming paths.</li>
            <li>
              <t>"Capacity Profile":
An implementation can use the Capacity Profile to prefer paths that match an application's expected traffic pattern. This match will use cached performance estimates, see <xref target="performance-caches"/>. Some examples of path preferences based on Capacity Profiles include:  </t>
              <ul spacing="normal">
                <li>Low Latency/Interactive:
Prefer paths with the lowest expected Round Trip Time, based on observed round trip time estimates;</li>
                <li>Low Latency/Non-Interactive:
Prefer paths with a low expected Round Trip Time, but can tolerate delay variation;</li>
                <li>Constant-Rate Streaming:
Prefer paths that are expected to satisfy the requested Stream Send or Stream Receive Bitrate, based on the observed maximum throughput;</li>
                <li>Capacity-Seeking:
Prefer adapting to paths to determine the highest available capacity, based on the observed maximum throughput.</li>
              </ul>
            </li>
          </ul>
          <t>As another example, branch sorting can also be influenced by bounds on the Send or Receive rate (Selection Properties <tt>minSendRate</tt> / <tt>minRecvRate</tt> / <tt>maxSendRate</tt> / <tt>maxRecvRate</tt>): if the application indicates a bound on the expected Send or Receive bitrate, an implementation may prefer a path that can likely provide the desired bandwidth, based on cached maximum throughput, see <xref target="performance-caches"/>. The application may know the Send or Receive Bitrate from metadata in adaptive HTTP streaming, such as MPEG-DASH.</t>
          <t>Implementations process the Properties (Section 6.2 of <xref target="I-D.ietf-taps-interface"/>) in the following order: Prohibit, Require, Prefer, Avoid.
If Selection Properties contain any prohibited properties, the implementation should first purge branches containing nodes with these properties. For required properties, it should only keep branches that satisfy these requirements. Finally, it should order the branches according to the preferred properties, and finally use any avoided properties as a tiebreaker.
When ordering branches, an implementation can give more weight to properties that the application has explicitly set, than to the properties that are default.</t>
          <t>The available protocols and paths on a specific system and in a specific context can change; therefore, the result of sorting and the outcome of racing may vary, even when using the same Selection and Connection Properties. However, an implementation ought to provide a consistent outcome to applications, e.g., by preferring protocols and paths that are already used by existing Connections that specified similar Properties.</t>
        </section>
      </section>
      <section anchor="gathering">
        <name>Candidate Gathering</name>
        <t>The step of gathering candidates involves identifying which paths, protocols, and endpoints may be used for a given Connection. This list is determined by the requirements, prohibitions, and preferences of the application as specified in the Selection Properties.</t>
        <section anchor="gathering-endpoint-candidates">
          <name>Gathering Endpoint Candidates</name>
          <t>Both Local and Remote Endpoint Candidates must be discovered during connection establishment.  To support Interactive Connectivity Establishment (ICE) <xref target="RFC8445"/>, or similar protocols that involve out-of-band indirect signalling to exchange candidates with the Remote Endpoint, it is important to query the set of candidate Local Endpoints, and provide the Protocol Stack with a set of candidate Remote Endpoints, before the Local Endpoint attempts to establish connections.</t>
          <section anchor="local-endpoint-candidates">
            <name>Local Endpoint candidates</name>
            <t>The set of possible Local Endpoints is gathered.  In the simple case, this merely enumerates the local interfaces and protocols, and allocates ephemeral source ports.  For example, a system that has WiFi and Ethernet and supports IPv4 and IPv6 might gather four candidate Local Endpoints (IPv4 on Ethernet, IPv6 on Ethernet, IPv4 on WiFi, and IPv6 on WiFi) that can form the source for a transient.</t>
            <t>If NAT traversal is required, the process of gathering Local Endpoints becomes broadly equivalent to the ICE candidate gathering phase (see Section 5.1.1. of <xref target="RFC8445"/>).  The endpoint determines its server reflexive Local Endpoints (i.e., the translated address of a Local Endpoint, on the other side of a NAT, e.g via a STUN sever <xref target="RFC5389"/>) and relayed Local Endpoints (e.g., via a TURN server <xref target="RFC5766"/> or other relay), for each interface and network protocol.  These are added to the set of candidate Local Endpoints for this connection.</t>
            <t>Gathering Local Endpoints is primarily a local operation, although it might involve exchanges with a STUN server to derive server reflexive Local Endpoints, or with a TURN server or other relay to derive relayed Local Endpoints.  However, it does not involve communication with the Remote Endpoint.</t>
          </section>
          <section anchor="remote-endpoint-candidates">
            <name>Remote Endpoint Candidates</name>
            <t>The Remote Endpoint is typically a name that needs to be resolved into a set of possible addresses that can be used for communication.  Resolving the Remote Endpoint is the process of recursively performing such name lookups, until fully resolved, to return the set of candidates for the Remote Endpoint of this connection.</t>
            <t>How this resolution is done will depend on the type of the Remote Endpoint, and can also be specific to each Local Endpoint.  A common case is when the Remote Endpoint is a DNS name, in which case it is resolved to give a set of IPv4 and IPv6 addresses representing that name.  Some types of Remote Endpoint might require more complex resolution.  Resolving the Remote Endpoint for a peer-to-peer connection might involve communication with a rendezvous server, which in turn contacts the peer to gain consent to communicate and retrieve its set of candidate Local Endpoints, which are returned and form the candidate remote addresses for contacting that peer.</t>
            <t>Resolving the Remote Endpoint is not a local operation.  It will involve a directory service, and can require communication with the Remote Endpoint to rendezvous and exchange peer addresses.  This can expose some or all of the candidate Local Endpoints to the Remote Endpoint.</t>
          </section>
        </section>
      </section>
      <section anchor="racing">
        <name>Candidate Racing</name>
        <t>The primary goal of the Candidate Racing process is to successfully negotiate a Protocol Stack to an endpoint over an interface to connect a single leaf node of the tree with as little delay and as few unnecessary connections attempts as possible. Optimizing these two factors improves the user experience, while minimizing network load.</t>
        <t>This section covers the dynamic aspect of connection establishment. The tree described above is a useful conceptual and architectural model. However, an implementation is unable to know the full tree before it is formed and many of the possible branches ultimately might not be used.</t>
        <t>There are three different approaches to racing the attempts for different nodes of the connection establishment tree:</t>
        <ol spacing="normal" type="1"><li>Simultaneous</li>
          <li>Staggered</li>
          <li>Failover</li>
        </ol>
        <t>Each approach is appropriate in different use-cases and branch types. However, to avoid consuming unnecessary network resources, implementations should not use simultaneous racing as a default approach.</t>
        <t>The timing algorithms for racing should remain independent across branches of the tree. Any timer or racing logic is isolated to a given parent node, and is not ordered precisely with regards to other children of other nodes.</t>
        <section anchor="simultaneous">
          <name>Simultaneous</name>
          <t>Simultaneous racing is when multiple alternate branches are started without waiting for any one branch to make progress before starting the next alternative. This means the attempts are effectively simultaneous. Simultaneous racing should be avoided by implementations, since it consumes extra network resources and establishes state that might not be used.</t>
        </section>
        <section anchor="staggered">
          <name>Staggered</name>
          <t>Staggered racing can be used whenever a single node of the tree has multiple child nodes. Based on the order determined when building the tree, the first child node will be initiated immediately, followed by the next child node after some delay. Once that second child node is initiated, the third child node (if present) will begin after another delay, and so on until all child nodes have been initiated, or one of the child nodes successfully completes its negotiation.</t>
          <t>Staggered racing attempts can proceed in parallel. Implementations should not terminate an earlier child connection attempt upon starting a secondary child.</t>
          <t>If a child node fails to establish connectivity (as in <xref target="determining-successful-establishment"/>) before the delay time has expired for the next child, the next child should be started immediately.</t>
          <t>Staggered racing between IP addresses for a generic Connection should follow the Happy Eyeballs algorithm described in <xref target="RFC8305"/>. <xref target="RFC8421"/> provides guidance for racing when performing Interactive Connectivity Establishment (ICE).</t>
          <t>Generally, the delay before starting a given child node ought to be based on the length of time the previously started child node is expected to take before it succeeds or makes progress in connection establishment. Algorithms like Happy Eyeballs choose a delay based on how long the transport connection handshake is expected to take. When performing staggered races in multiple branch types (such as racing between network interfaces, and then racing between IP addresses), a longer delay may be chosen for some branch types. For example, when racing between network interfaces, the delay should also take into account the amount of time it takes to prepare the network interface (such as radio association) and name resolution over that interface, in addition to the delay that would be added for a single transport connection handshake.</t>
          <t>Since the staggered delay can be chosen based on dynamic information, such as predicted round-trip time, implementations should define upper and lower bounds for delay times. These bounds are implementation-specific, and may differ based on which branch type is being used.</t>
        </section>
        <section anchor="failover">
          <name>Failover</name>
          <t>If an implementation or application has a strong preference for one branch over another, the branching node may choose to wait until one child has failed before starting the next. Failure of a leaf node is determined by its protocol negotiation failing or timing out; failure of a parent branching node is determined by all of its children failing.</t>
          <t>An example in which failover is recommended is a race between a Protocol Stack that uses a proxy and a Protocol Stack that bypasses the proxy. Failover is useful in case the proxy is down or misconfigured, but any more aggressive type of racing may end up unnecessarily avoiding a proxy that was preferred by policy.</t>
        </section>
      </section>
      <section anchor="completing-establishment">
        <name>Completing Establishment</name>
        <t>The process of connection establishment completes when one leaf node of the tree has successfully completed negotiation with the Remote Endpoint, or else all nodes of the tree have failed to connect. The first leaf node to complete its connection is then used by the application to send and receive data. This is signalled to the application using the Ready event in the API (<xref section="7.1" sectionFormat="of" target="I-D.ietf-taps-interface"/>).</t>
        <t>Successes and failures of a given attempt should be reported up to parent nodes (towards the trunk of the tree). For example, in the following case, if 1.1.1 fails to connect, it reports the failure to 1.1. Since 1.1 has no other child nodes, it also has failed and reports that failure to 1. Because 1.2 has not yet failed, 1 is not considered to have failed. Since 1.2 has not yet started, it is started and the process continues. Similarly, if 1.1.1 successfully connects, then it marks 1.1 as connected, which propagates to the trunk node 1. At this point, the connection as a whole is considered to be successfully connected and ready to process application data.</t>
        <artwork><![CDATA[
1 [www.example.com:80, Any, TCP]
  1.1 [www.example.com:80, Wi-Fi, TCP]
    1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [www.example.com:80, LTE, TCP]
...
]]></artwork>
        <t>If a leaf node has successfully completed its connection, all other attempts should be made ineligible for use by the application for the original request.
New connection attempts that involve transmitting data on the network ought not to be started after another leaf node has already successfully completed, because the connection as a whole has now been established.
An implementation could choose to let certain handshakes and negotiations complete to gather metrics that influence future connections.
Keeping additional connections is generally not recommended, because those attempts were slower to connect and may exhibit less desirable properties.</t>
        <section anchor="determining-successful-establishment">
          <name>Determining Successful Establishment</name>
          <t>On a per-protocol basis, implementations may select different criteria by which a leaf node is considered to be successfully connected. If the only protocol being used is a transport protocol with a clear handshake, like TCP, then the obvious choice is to declare that node "connected" when the last packet of the three-way handshake has been received. If the only protocol being used is an connectionless protocol, like UDP, the implementation may consider the node fully "connected" the moment it determines a route is present, before sending any packets on the network, see further <xref target="connectionless-racing"/>.</t>
          <t>For Protocol Stacks with multiple handshakes, the decision becomes more nuanced. If the Protocol Stack involves both TLS and TCP, an implementation could determine that a leaf node is connected after the TCP handshake is complete, or it can wait for the TLS handshake to complete as well. The benefit of declaring completion when the TCP handshake finishes, and thus stopping the race for other branches of the tree, is reduced burden on the network and Remote Endpoints from further connection attempts that are likely to be abandoned. On the other hand, by waiting until the TLS handshake is complete, an implementation avoids the scenario in which a TCP handshake completes quickly, but TLS negotiation is either very slow or fails altogether in particular network conditions or to a particular endpoint. To avoid the issue of TLS possibly failing, the implementation should not generate a Ready event for the Connection until the TLS handshake is complete.</t>
          <t>If all of the leaf nodes fail to connect during racing, i.e. none of the configurations that satisfy all requirements given in the Transport Properties actually work over the available paths, then the transport system should report an EstablishmentError to the application. An EstablishmentError event should also be generated in case the transport system finds no usable candidates to race.</t>
        </section>
      </section>
      <section anchor="establish-mux">
        <name>Establishing multiplexed connections</name>
        <t>Multiplexing several Connections over a single underlying transport connection requires that the Connections to be multiplexed belong to the same Connection Group (as is indicated by the application using the Clone call). When the underlying transport connection supports multi-streaming, the Transport Services System can map each Connection in the Connection Group to a different stream.
Thus, when the Connections that are offered to an application by the Transport Services API are multiplexed,
the Transport Services implementation can establish a new Connection by simply beginning to use
a new stream of an already established transport Connection and there is no need for a connection establishment
procedure. This, then, also means that there may not
be any "establishment" message (like a TCP SYN), but the application can simply start sending
or receiving. Therefore, when the Initiate action of a Transport Services API is called without Messages being
handed over, it cannot be guaranteed that the Remote Endpoint will have any way to know about this, and hence
a passive endpoint's ConnectionReceived event might not be delivered until data is received.
Instead, delivering the ConnectionReceived event could be delayed until the first Message arrives.</t>
      </section>
      <section anchor="connectionless-racing">
        <name>Handling connectionless protocols</name>
        <t>While protocols that use an explicit handshake to validate a Connection to a peer can be used for racing multiple establishment attempts in parallel, connectionless protocols such as raw UDP do not offer a way to validate the presence of a peer or the usability of a Connection without application feedback. An implementation should consider such a Protocol Stack to be established as soon as the Transport Services system has selected a path on which to send data.</t>
        <t>However, this can cause a problem if a specific peer is not reachable over the network using the connectionless protocol, or data cannot be exchanged with the peer for any other reason. To mitigate this, an application can use a Message Framer (<xref target="message-framers"/>) on top of a connectionless protocol to only mark a specific connection attempt as ready when some data has been received, or after some application-level handshake has been performed.</t>
      </section>
      <section anchor="listen">
        <name>Implementing listeners</name>
        <t>When an implementation is asked to Listen, it registers with the system to wait for incoming traffic to the Local Endpoint. If no Local Endpoint is specified, the implementation should use an ephemeral port.</t>
        <t>If the Selection Properties do not require a single network interface or path, but allow the use of multiple paths, the Listener object should register for incoming traffic on all of the network interfaces or paths that conform to the Properties. The set of available paths can change over time, so the implementation should monitor network path changes, and change the registration of the Listener across all usable paths as appropriate. When using multiple paths, the Listener is generally expected to use the same port for listening on each.</t>
        <t>If the Selection Properties allow multiple protocols to be used for listening, and the implementation supports it, the Listener object should support receiving inbound connections for each eligible protocol on each eligible path.</t>
        <section anchor="implementing-listeners-for-connected-protocols">
          <name>Implementing listeners for Connected Protocols</name>
          <t>Connected protocols such as TCP and TLS-over-TCP have a strong mapping between the Local and Remote Endpoints (four-tuple) and their protocol connection state. These map into Connection objects. Whenever a new inbound handshake is being started, the Listener should generate a new Connection object and pass it to the application.</t>
        </section>
        <section anchor="implementing-listeners-for-connectionless-protocols">
          <name>Implementing listeners for Connectionless Protocols</name>
          <t>Connectionless protocols such as UDP and UDP-lite generally do not provide the same mechanisms that connected protocols do to offer Connection objects.  Implementations should wait for incoming packets for connectionless protocols on a listening port and should perform four-tuple matching of packets to existing Connection objects if possible. If a matching Connection object does not exist, an incoming packet from a connectionless protocol should cause a new Connection object to be created.</t>
        </section>
        <section anchor="implementing-listeners-for-multiplexed-protocols">
          <name>Implementing listeners for Multiplexed Protocols</name>
          <t>Protocols that provide multiplexing of streams into a single four-tuple can listen both for entirely new connections (a new HTTP/2 stream on a new TCP connection, for example) and for new sub-connections (a new HTTP/2 stream on an existing connection). If the abstraction of Connection presented to the application is mapped to the multiplexed stream, then the Listener should deliver new Connection objects in the same way for either case. The implementation should allow the application to introspect the Connection Group marked on the Connections to determine the grouping of the multiplexing.</t>
        </section>
      </section>
    </section>
    <section anchor="implementing-sending-and-receiving-data">
      <name>Implementing Sending and Receiving Data</name>
      <t>The most basic mapping for sending a Message is an abstraction of datagrams, in which the transport protocol naturally deals in discrete packets (such as UDP). Each Message here corresponds to a single datagram. Generally, these will be short enough that sending and receiving will always use a complete Message.</t>
      <t>For protocols that expose byte-streams (such as TCP), the only delineation provided by the protocol is the end of the stream in a given direction. Each Message in this case corresponds to the entire stream of bytes in a direction. These Messages may be quite long, in which case they can be sent in multiple parts.</t>
      <t>Protocols that provide the framing (such as length-value protocols, or protocols that use delimiters like HTTP/1.1) may support Message sizes that do not fit within a single datagram. Each Message for framing protocols corresponds to a single frame, which may be sent either as a complete Message in the underlying protocol, or in multiple parts.</t>
      <t>Messages themselves generally consist of bytes passed in the messageData parameter intended to be processed at an application layer. However, Message objects presented through the API
can carry associated Message Properties passed through the messageContext parameter.
When these are Protocol Specific Properties, they can include metadata that exists separately from a byte
encoding. For example, these Properties can include name-value pairs of information, like HTTP header fields. In such cases, Messages might be "empty",
insofar as they contain zero bytes in the messageData parameter, but can still include data in the messageContext that is interpreted by the Protocol Stack.</t>
      <section anchor="sending-messages">
        <name>Sending Messages</name>
        <t>The effect of the application sending a Message is determined by the top-level protocol in the established Protocol Stack. That is, if the top-level protocol provides an abstraction of framed messages over a connection, the receiving application will be able to obtain multiple Messages on that connection, even if the framing protocol is built on a byte-stream protocol like TCP.</t>
        <section anchor="msg-properties">
          <name>Message Properties</name>
          <t>The API allows various properties to be associated with each Message, which should be implemented as discussed below.</t>
          <ul spacing="normal">
            <li>
              <tt>msgLifetime</tt>: this should be implemented by removing the Message from the queue of pending Messages after the Lifetime has expired. A queue of pending Messages within the transport system implementation that have yet to be handed to the Protocol Stack can always support this property, but once a Message has been sent into the send buffer of a protocol, only certain protocols may support removing a message. For example, an implementation cannot remove bytes from a TCP send buffer, while it can remove data from a SCTP send buffer using the partial reliability extension <xref target="RFC8303"/>. When there is no standing queue of Messages within the system, and the Protocol Stack does not support the removal of a Message from the stack's send buffer, this property may be ignored.</li>
            <li>
              <tt>msgPriority</tt>: this represents the ability to prioritize a Message over other Messages. This can be implemented by the system re-ordering Messages that have yet to be handed to the Protocol Stack, or by giving relative priority hints to protocols that support priorities per Message. For example, an implementation of HTTP/2 could choose to send Messages of different Priority on streams of different priority.</li>
            <li>
              <tt>msgOrdered</tt>: when this is false, this disables the requirement of in-order-delivery for protocols that support configurable ordering. When the Protocol Stack does not support configurable ordering, this property may be ignored.</li>
            <li>
              <tt>safelyReplayable</tt>: when this is true, this means that the Message can be used by a transport mechanism that might transfer it multiple times -- e.g., as a result of racing multiple transports or as part of TCP Fast Open. Also, protocols that do not protect against duplicated messages, such as UDP (when used directly, without a protocol layered atop), can only be used with Messages that are Safely Replayable. When a transport system is permitted to replay messages, replay protection could be provided by the application.</li>
            <li>
              <tt>final</tt>: when this is true, this means that the sender will not send any further messages. The Connection need not be closed (in case the Protocol Stack supports half-close operation, like TCP). Any messages sent after a Final message will result in a SendError.</li>
            <li>
              <tt>msgChecksumLen</tt>: when this is set to any value other than <tt>Full Coverage</tt>, it sets the minimum protection in protocols that allow limiting the checksum length (e.g. UDP-Lite). If the Protocol Stack does not support checksum length limitation, this property may be ignored.</li>
            <li>
              <tt>msgReliable</tt>: When true, the property specifies that the Message must be reliably transmitted. When false, and if unreliable transmission is supported by the underlying protocol, then the Message should be unreliably transmitted. If the underlying
protocol does not support unreliable transmission, the Message should be reliably transmitted.</li>
            <li>
              <tt>msgCapacityProfile</tt>: When true, this expresses a wish to override the
Generic Connection Property <tt>Capacity Profile</tt> for this Message. Depending on the
value, this can, for example, be implemented by changing the DSCP value of the
associated packet (note that the guidelines in Section 6 of <xref target="RFC7657"/> apply; e.g.,
the DSCP value should not be changed for different packets within a reliable
transport protocol session or DCCP connection).</li>
            <li>
              <tt>noFragmentation</tt>: Setting this avoids network-layer fragmentation. Messages exceeding the transport's current estimate of its maximum packet size (the <tt>singularTransmissionMsgMaxLen</tt> Connection Property) can result in transport segmentation when permitted, or generate an error. When used with transports running over IP version 4 the Don't Fragment bit will be set to avoid on-path IP fragmentation (<xref target="RFC8304"/>).</li>
            <li>
              <tt>noSegmentation</tt>: When set, this property limits the message size to the transport's current estimate of its maximum packet size (the <tt>singularTransmissionMsgMaxLen</tt> Connection Property). Messages larger than this size generate an error. Setting this avoids transport-layer segmentation and network-layer fragmentation. When used with transports running over IP version 4 the Don't Fragment bit will be set to avoid on-path IP fragmentation (<xref target="RFC8304"/>).</li>
          </ul>
        </section>
        <section anchor="send-completion">
          <name>Send Completion</name>
          <t>The application should be notified whenever a Message or partial Message has been consumed by the Protocol Stack, or has failed to send. The time at which a Message is considered to have been consumed by the Protocol Stack may vary depending on the protocol. For example, for a basic datagram protocol like UDP, this may correspond to the time when the packet is sent into the interface driver. For a protocol that buffers data in queues, like TCP, this may correspond to when the data has entered the send buffer. The time at which a message failed to send is when Transport Services implementation (including the Protocol Stack) has not successfully sent the entire Message content or partial Message content on any open candidate connection; this can depend on protocol-specific timeouts.</t>
        </section>
        <section anchor="batching-sends">
          <name>Batching Sends</name>
          <t>Since sending a Message may involve a context switch between the application and the Transport Services system, sending patterns that involve multiple small Messages can incur high overhead if each needs to be enqueued separately. To avoid this, the application can indicate a batch of Send actions through the API. When this is used, the implementation can defer the processing of Messages until the batch is complete.</t>
        </section>
      </section>
      <section anchor="receiving-messages">
        <name>Receiving Messages</name>
        <t>Similar to sending, receiving a Message is determined by the top-level protocol in the established Protocol Stack. The main difference with receiving is that the size and boundaries of the Message are not known beforehand. The application can communicate in its Receive action the parameters for the Message, which can help the Transport Services implementation know how much data to deliver and when. For example, if the application only wants to receive a complete Message, the implementation should wait until an entire Message (datagram, stream, or frame) is read before delivering any Message content to the application. This requires the implementation to understand where messages end, either via a supplied Message Framer or because the top-level protocol in the established Protocol Stack preserves message boundaries. If the top-level protocol only supports a byte-stream and no framers were supported, the application can control the flow of received data by specifying the minimum number of bytes of Message content it wants to receive at one time.</t>
        <t>If a Connection finishes before a requested Receive action can be satisfied, the Transport Services API should deliver any partial Message content outstanding, or if none is available, an indication that there will be no more received Messages.</t>
      </section>
      <section anchor="fastopen">
        <name>Handling of data for fast-open protocols</name>
        <t>Several protocols allow sending higher-level protocol or application data during their protocol establishment, such as TCP Fast Open <xref target="RFC7413"/> and TLS 1.3 <xref target="RFC8446"/>. This approach is referred to as sending Zero-RTT (0-RTT) data. This is a desirable feature, but poses challenges to an implementation that uses racing during connection establishment.</t>
        <t>The amount of data that can be sent as 0-RTT data varies by protocol and can be queried by the application using the <tt>zeroRttMsgMaxLen</tt> Connection Property. An implementation can set this property according to the protocols that it will race based on the given Selection Properties when the application requests to establish a connection.</t>
        <t>If the application has 0-RTT data to send during handshake(s), it needs to provide this data before the handshakes have begun. If the application wants to send 0-RTT data, it must indicate this to the implementation by setting the <tt>Safely Replayable</tt> send parameter to true when sending the data. In general, 0-RTT data may be replayed (for example, if a TCP SYN contains data, and the SYN is retransmitted, the data will be retransmitted as well but may be considered as a new connection instead of a retransmission). When racing connections, different leaf nodes have the opportunity to send the same data independently. If data is truly safely replayable, this is permissible.</t>
        <t>Once the application has provided its 0-RTT data, a Transport Services implementation should keep a copy of this data and provide it to each new leaf node that is started and for which a protocol instance supporting 0-RTT is being used.</t>
        <t>It is also possible for Protocol Stacks within a particular leaf node to use 0-RTT handshakes without any safely replayable application data if a protocol in the stack has idempotent handshake data to send. For example, TCP Fast Open could use a Client Hello from TLS as its 0-RTT data, shortening the cumulative handshake time.</t>
        <t>0-RTT handshakes often rely on previous state, such as TCP Fast Open cookies, previously established TLS tickets, or out-of-band distributed pre-shared keys (PSKs). Implementations should be aware of security concerns around using these tokens across multiple addresses or paths when racing. In the case of TLS, any given ticket or PSK should only be used on one leaf node, since servers will likely reject duplicate tickets in order to prevent replays (see section-8.1 <xref target="RFC8446"/>). If implementations have multiple tickets available from a previous connection, each leaf node attempt can use a different ticket. In effect, each leaf node will send the same early application data, yet encoded (encrypted) differently on the wire.</t>
      </section>
    </section>
    <section anchor="message-framers">
      <name>Implementing Message Framers</name>
      <t>Message Framers are functions that define
simple transformations between application Message data and raw transport
protocol data. A Framer can encapsulate or encode outbound Messages,
decapsulate or decode inbound data into Messages, and implement parts of
protocols that do not directly map to application Messages (such as
protocol handshakes or preludes before Message exchange).</t>
      <t>While many protocols can be represented as Message Framers, for the
purposes of the Transport Services API, these are ways for applications
or application frameworks to define their own Message parsing to be
included within a Connection's Protocol Stack. As an example, TLS
is exposed as a protocol that is natively supported by the Transport Services
API, even though it could also serve the purpose of framing data over TCP.</t>
      <t>Most Message Framers fall into one of two categories:</t>
      <ul spacing="normal">
        <li>Header-prefixed record formats, such as a basic Type-Length-Value (TLV) structure</li>
        <li>Delimiter-separated formats, such as HTTP/1.1.</li>
      </ul>
      <t>Common Message Framers can be provided by a Transport Services implementation,
but an implementation ought to allow custom Message Framers to be defined by
the application or some other piece of software. This section describes one
possible API for defining Message Framers, as an example.</t>
      <section anchor="defining-message-framers">
        <name>Defining Message Framers</name>
        <t>A Message Framer is primarily defined by the code that handles events
for a framer implementation, specifically how it handles inbound and outbound data
parsing. The function that implements custom framing logic will be referred to
as the "framer implementation", which may be provided by a Transport Services
implementation or the application itself. The Message Framer refers to the object
or function within the main Connection implementation that delivers events
to the custom framer implementation whenever data is ready to be parsed or framed.</t>
        <t>The API examples in this section use the notation conventions for the Transport
Services API defined in <xref section="1.1" sectionFormat="of" target="I-D.ietf-taps-interface"/>.</t>
        <t>The Transport Services implementation needs to ensure that all of the
events and actions taken on a Message Framer are synchronized to ensure
consistent behavior. For example, some of the actions defined below (such as
PrependFramer and StartPassthrough) modify how data flows in a protocol
stack, and require synchronization with sending and parsing data in the
Message Framer.</t>
        <t>When a Connection establishment attempt begins, an event can be delivered to
notify the framer implementation that a new Connection is being created.
Similarly, a stop event can be delivered when a Connection is being torn down.
The framer implementation can use the Connection object to look up specific
properties of the Connection or the network being used that may influence how
to frame Messages.</t>
        <artwork><![CDATA[
MessageFramer -> Start<connection>
MessageFramer -> Stop<connection>
]]></artwork>
        <t>When a Message Framer generates a <tt>Start</tt> event, the framer implementation
has the opportunity to start writing some data prior to the Connection delivering
its <tt>Ready</tt> event. This allows the implementation to communicate control data to the
Remote Endpoint that can be used to parse Messages.</t>
        <t>Once the framer implementation has completed its setup or handshake, it can indicate to
the application that it is ready to handling data with this call.</t>
        <artwork><![CDATA[
MessageFramer.MakeConnectionReady(connection)
]]></artwork>
        <t>Similarly, when a Message Framer generates a <tt>Stop</tt> event, the framer implementation has the opportunity to write some final data or clear up its local state before the <tt>Closed</tt> event is delivered to the Application. The framer implementation can indicate that it has finished with this call.</t>
        <artwork><![CDATA[
MessageFramer.MakeConnectionClosed(connection)
]]></artwork>
        <t>At any time if the implementation encounters a fatal error, it can also cause the Connection
to fail and provide an error.</t>
        <artwork><![CDATA[
MessageFramer.FailConnection(connection, error)
]]></artwork>
        <t>Should the framer implementation deem the candidate selected during racing unsuitable, it can signal this to the Transport Services API by failing the Connection prior to marking it as ready.
If there are no other candidates available, the Connection will fail. Otherwise, the Connection will select a different candidate and the Message Framer will generate a new <tt>Start</tt> event.</t>
        <t>Before an implementation marks a Message Framer as ready, it can also dynamically
add a protocol or framer above it in the stack. This allows protocols that need to add TLS conditionally,
like STARTTLS <xref target="RFC3207"/>, to modify the Protocol Stack based on a handshake result.</t>
        <artwork><![CDATA[
otherFramer := NewMessageFramer()
MessageFramer.PrependFramer(connection, otherFramer)
]]></artwork>
        <t>A Message Framer might also choose to go into a passthrough mode once an initial exchange or handshake has been completed, such as the STARTTLS case mentioned above.
This can also be useful for proxy protocols like SOCKS <xref target="RFC1928"/> or HTTP CONNECT <xref target="RFC7230"/>. In such cases, a Message Framer implementation can intercept
sending and receiving of messages at first, but then indicate that no more processing is needed.</t>
        <artwork><![CDATA[
MessageFramer.StartPassthrough()
]]></artwork>
      </section>
      <section anchor="send-framing">
        <name>Sender-side Message Framing</name>
        <t>Message Framers generate an event whenever a Connection sends a new Message. The parameters to the event
align with the Send call in the API (<xref section="9.2" sectionFormat="of" target="I-D.ietf-taps-interface"/>).</t>
        <artwork><![CDATA[
MessageFramer -> NewSentMessage<connection, messageData, messageContext, endOfMessage>
]]></artwork>
        <t>Upon receiving this event, a framer implementation is responsible for
performing any necessary transformations and sending the resulting data back to the Message Framer, which will in turn send it to the next protocol.
To improve performance, implementations should ensure that there is a way to pass the original data
through without copying.</t>
        <artwork><![CDATA[
MessageFramer.Send(connection, messageData)
]]></artwork>
        <t>To provide an example, a simple protocol that adds a length as a header would receive
the <tt>NewSentMessage</tt> event, create a data representation of the length of the Message
data, and then send a block of data that is the concatenation of the length header and the original
Message data.</t>
      </section>
      <section anchor="receive-framing">
        <name>Receiver-side Message Framing</name>
        <t>In order to parse a received flow of data into Messages, the Message Framer
notifies the framer implementation whenever new data is available to parse.
The parameters to the the events and calls for receiving data with a framer
align with the Receive call in the API (<xref section="9.3" sectionFormat="of" target="I-D.ietf-taps-interface"/>).</t>
        <artwork><![CDATA[
MessageFramer -> HandleReceivedData<connection>
]]></artwork>
        <t>Upon receiving this event, the framer implementation can inspect the inbound data. The
data is parsed from a particular cursor representing the unprocessed data. The
application requests a specific amount of data it needs to have available in order to parse.
If the data is not available, the parse fails.</t>
        <artwork><![CDATA[
MessageFramer.Parse(connection, minimumIncompleteLength, maximumLength) -> (messageData, messageContext, endOfMessage)
]]></artwork>
        <t>The framer implementation can directly advance the receive cursor once it has
parsed data to effectively discard data (for example, discard a header
once the content has been parsed).</t>
        <t>To deliver a Message to the application, the framer implementation can either directly
deliver data that it has allocated, or deliver a range of data directly from the underlying
transport and simultaneously advance the receive cursor.</t>
        <artwork><![CDATA[
MessageFramer.AdvanceReceiveCursor(connection, length)
MessageFramer.DeliverAndAdvanceReceiveCursor(connection, messageContext, length, endOfMessage)
MessageFramer.Deliver(connection, messageContext, messageData, endOfMessage)
]]></artwork>
        <t>Note that <tt>MessageFramer.DeliverAndAdvanceReceiveCursor</tt> allows the framer implementation
to earmark bytes as part of a Message even before they are received by the transport. This allows the delivery
of very large Messages without requiring the implementation to directly inspect all of the bytes.</t>
        <t>To provide an example, a simple protocol that parses a length as a header value would
receive the <tt>HandleReceivedData</tt> event, and call <tt>Parse</tt> with a minimum and maximum
set to the length of the header field. Once the parse succeeded, it would call
<tt>AdvanceReceiveCursor</tt> with the length of the header field, and then call
<tt>DeliverAndAdvanceReceiveCursor</tt> with the length of the body that was parsed from
the header, marking the new Message as complete.</t>
      </section>
    </section>
    <section anchor="implementing-connection-management">
      <name>Implementing Connection Management</name>
      <t>Once a Connection is established, the Transport Services API allows applications to interact with the Connection by modifying or inspecting
Connection Properties. A Connection can also generate events in the form of Soft Errors.</t>
      <t>The set of Connection Properties that are supported for setting and getting on a Connection are described in <xref target="I-D.ietf-taps-interface"/>. For
any properties that are generic, and thus could apply to all protocols being used by a Connection, the Transport Services implementation should store the properties
in storage common to all protocols, and notify all protocol instances in the Protocol Stack whenever the properties have been modified by the application.
For Protocol-specific Properties, such as the User Timeout that applies to TCP, the Transport Services implementation only needs to update the relevant protocol instance.</t>
      <t>If an error is encountered in setting a property (for example, if the application tries to set a TCP-specific property on a Connection that is
not using TCP), the action should fail gracefully. The application may be informed of the error, but the Connection itself should not be terminated.</t>
      <t>The Transport Services API should allow protocol instances in the Protocol Stack to pass up arbitrary generic or protocol-specific
errors that can be delivered to the application as Soft Errors. These allow the application to be informed of ICMP errors, and other similar events.</t>
      <section anchor="pooled-connections">
        <name>Pooled Connection</name>
        <t>For applications that do not need in-order delivery of Messages, the Transport Services implementation may distribute Messages of a single Connection across several underlying transport connections or multiple streams of multi-streaming connections between endpoints, as long as all of these satisfy the Selection Properties.
The Transport Services implementation will then hide this connection management and only expose a single Connection object, which we here call a "Pooled Connection". This is in contrast to Connection Groups, which explicitly expose combined treatment of Connections, giving the application control over multiplexing, for example.</t>
        <t>Pooled Connections can be useful when the application using the Transport Services system implements a protocol such as HTTP, which employs request/response pairs and does not require in-order delivery of responses.
This enables implementations of Transport Services systems to realize transparent connection coalescing, connection migration, and to perform per-message endpoint and path selection by choosing among multiple underlying connections.</t>
      </section>
      <section anchor="handling-path-changes">
        <name>Handling Path Changes</name>
        <t>When a path change occurs, e.g., when the IP address of an interface changes or a new interface becomes available, the Transport Services implementation is responsible for notifying the Protocol Instance of the change. The path change may interrupt connectivity on a path for an active connection or provide an opportunity for a transport that supports multipath or migration to adapt to the new paths. Note that, in the model of the Transport Services API, migration is considered a part of multipath connectivity; it is just a limiting policy on multipath usage. If the <tt>multipath</tt> Selection Property is set to <tt>Disabled</tt>, migration is disallowed.</t>
        <t>For protocols that do not support multipath or migration, the Protocol Instances should be informed of the path change, but should not be forcibly disconnected if the previously used path becomes unavailable. There are many common user scenarios that can lead to a path becoming temporarily unavailable, and then recovering before the transport protocol reaches a timeout error. These are particularly common using mobile devices. Examples include: an Ethernet cable becoming unplugged and then plugged back in; a device losing a Wi-Fi signal while a user is in an elevator, and reattaching when the user leaves the elevator; and a user losing the radio signal while riding a train through a tunnel. If the device is able to rejoin a network with the same IP address, a stateful transport connection can generally resume. Thus, while it is useful for a Protocol Instance to be aware of a temporary loss of connectivity, the Transport Services implementation should not aggressively close connections in these scenarios.</t>
        <t>If the Protocol Stack includes a transport protocol that supports multipath connectivity, the Transport Services implementation should also inform the Protocol Instance about potentially new paths that become permissible based on the <tt>multipath</tt> Selection Property and the <tt>multipathPolicy</tt> Connection Property choices made by the application.
A protocol can then establish new subflows over new paths while an active path is still available or, if migration is supported, also after a break has been detected, and should attempt to tear down subflows over paths that are no longer used. The Connection Property <tt>multipathPolicy</tt> of the Transport Services API
allows an application to indicate when and how different paths should be used. However, detailed handling of these policies is still implementation-specific.
For example, if the <tt>multipath</tt> Selection Property is set to <tt>active</tt>, the decision about when to create a new path or to announce a new path or set of paths to the Remote Endpoint, e.g., in the form of additional IP addresses, is implementation-specific.
If the Protocol Stack includes a transport protocol that does not support multipath, but does support migrating between paths, the update to the set of available paths can trigger the connection to be migrated.</t>
        <t>In the case of a Pooled Connection <xref target="pooled-connections"/>, the Transport Services implementation may add connections over new paths to the pool if permissible based on the multipath policy and Selection Properties.
In the case that a previously used path becomes unavailable, the transport system may disconnect all connections that require this path, but should not disconnect the pooled connection object exposed to the application.
The strategy to do so is implementation-specific, but should be consistent with the behavior of multipath transports.</t>
      </section>
    </section>
    <section anchor="implementing-connection-termination">
      <name>Implementing Connection Termination</name>
      <t>With TCP, when an application closes a connection, this
means that it has no more data to send (but expects all data that has been
handed over to be reliably delivered). However, with TCP only, "close" does
not mean that the application will stop receiving data. This is related to TCP's ability to
support half-closed connections.</t>
      <t>SCTP is an example of a protocol that does not support such half-closed connections.
Hence, with SCTP, the meaning of "close" is stricter: an application has no more data
to send (but expects all data that has been handed over to be reliably delivered), and will
also not receive any more data.</t>
      <t>Implementing a protocol independent transport system means that the exposed
semantics must be the strictest subset of the semantics of all supported protocols.
Hence, as is common with all reliable transport protocols, after a Close action, the
application can expect to have its reliability requirements honored regarding the data
provided to the Transport Services API, but it cannot expect to be able to read any
more data after calling Close.</t>
      <t>Abort differs from Close only in that no guarantees are given regarding any data
that the application sent to the Transport Services API before calling Abort.</t>
      <t>As explained in <xref target="establish-mux"/>, when a new stream is multiplexed on an already
existing connection of a Transport Protocol Instance, there is no need for a connection
establishment procedure. Because the Connections that are offered by a Transport Services implementation
can be implemented as streams that are multiplexed on a transport protocol's connection,
it can therefore not be guaranteed an Initiate action from one endpoint
provokes a ConnectionReceived event at its peer.</t>
      <t>For Close (provoking a Finished event) and Abort (provoking a ConnectionError event), the
same logic applies: while it is desirable to be informed when a peer closes or aborts a
Connection, whether this is possible depends on the underlying protocol, and no guarantees
can be given. With SCTP, the transport system can use the stream reset procedure to cause
a Finish event upon a Close action from the peer <xref target="NEAT-flow-mapping"/>.</t>
    </section>
    <section anchor="cached-state">
      <name>Cached State</name>
      <t>Beyond a single Connection's lifetime, it is useful for an implementation to keep state and history. This cached
state can help improve future Connection establishment due to re-using results and credentials, and favoring paths and protocols that performed well in the past.</t>
      <t>Cached state may be associated with different endpoints for the same Connection, depending on the protocol generating the cached content.
For example, session tickets for TLS are associated with specific endpoints, and thus should be cached based on a Connection's
hostname endpoint (if applicable). However, performance characteristics of a path are more likely tied to the IP address
and subnet being used.</t>
      <section anchor="protocol-state-caches">
        <name>Protocol state caches</name>
        <t>Some protocols will have long-term state to be cached in association with endpoints. This state often has some time after which
it is expired, so the implementation should allow each protocol to specify an expiration for cached content.</t>
        <t>Examples of cached protocol state include:</t>
        <ul spacing="normal">
          <li>The DNS protocol can cache resolution answers (A and AAAA queries, for example), associated with a Time To Live (TTL) to
be used for future hostname resolutions without requiring asking the DNS resolver again.</li>
          <li>TLS caches session state and tickets based on a hostname, which can be used for resuming sessions with a server.</li>
          <li>TCP can cache cookies for use in TCP Fast Open.</li>
        </ul>
        <t>Cached protocol state is primarily used during Connection establishment for a single Protocol Stack, but may be used to influence an
implementation's preference between several candidate Protocol Stacks. For example, if two IP address endpoints are otherwise
equally preferred, an implementation may choose to attempt a connection to an address for which it has a TCP Fast Open cookie.</t>
        <t>Applications can use the Transport Services API to request that a Connection Group maintain a separate cache for
protocol state. Connections in the group will not use cached state
from connections outside the group, and connections outside the group will not
use state cached from connections inside the group. This may be necessary, for
example, if application-layer identifiers rotate and clients wish to avoid
linkability via trackable TLS tickets or TFO cookies.</t>
      </section>
      <section anchor="performance-caches">
        <name>Performance caches</name>
        <t>In addition to protocol state, Protocol Instances should provide data into a performance-oriented cache to help guide future protocol and path selection. Some performance information can be gathered generically across several protocols to allow predictive comparisons between protocols on given paths:</t>
        <ul spacing="normal">
          <li>Observed Round Trip Time</li>
          <li>Connection Establishment latency</li>
          <li>Connection Establishment success rate</li>
        </ul>
        <t>These items can be cached on a per-address and per-subnet granularity, and averaged between different values. The information should be cached on a per-network basis, since it is expected that different network attachments will have different performance characteristics. Besides Protocol Instances, other system entities may also provide data into performance-oriented caches. This could for instance be signal strength information reported by radio modems like Wi-Fi and mobile broadband or information about the battery-level of the device. Furthermore, the system may cache the observed maximum throughput on a path as an estimate of the available bandwidth.</t>
        <t>An implementation should use this information, when possible, to influence preference between candidate paths, endpoints, and protocol options. Eligible options that historically had significantly better performance than others should be selected first when gathering candidates (see <xref target="gathering"/>) to ensure better performance for the application.</t>
        <t>The reasonable lifetime for cached performance values will vary depending on the nature of the value. Certain information, like the connection establishment success rate to a Remote Endpoint using a given Protocol Stack, can be stored for a long period of time (hours or longer), since it is expected that the capabilities of the Remote Endpoint are not changing very quickly. On the other hand, the Round Trip Time observed by TCP over a particular network path may vary over a relatively short time interval. For such values, the implementation should remove them from the cache more quickly, or treat older values with less confidence/weight.</t>
        <t><xref target="I-D.ietf-tcpm-2140bis"/> provides guidance about sharing of TCP Control Block information between connections on initialization.</t>
      </section>
    </section>
    <section anchor="specific-transport-protocol-considerations">
      <name>Specific Transport Protocol Considerations</name>
      <t>Each protocol that is supported by a Transport Services implementation should have a well-defined API mapping.
API mappings for a protocol are important for Connections in which a given protocol is the "top" of the Protocol Stack.
For example, the mapping of the <tt>Send</tt> function for TCP applies to Connections in which the application directly sends over TCP.</t>
      <t>Each protocol has a notion of Connectedness. Possible values for Connectedness are:</t>
      <ul spacing="normal">
        <li>Connectionless. Connectionless protocols do not establish explicit state between endpoints, and do not perform a handshake during Connection establishment.</li>
        <li>Connected. Connected protocols establish state between endpoints, and perform a handshake during Connection establishment. The handshake may be 0-RTT to send data or resume a session, but bidirectional traffic is required to confirm connectedness.</li>
        <li>Multiplexing Connected. Multiplexing Connected protocols share properties with Connected protocols, but also explictly support opening multiple application-level flows. This means that they can support cloning new Connection objects without a new explicit handshake.</li>
      </ul>
      <t>Protocols also have a notion of Data Unit. Possible values for Data Unit are:</t>
      <ul spacing="normal">
        <li>Byte-stream. Byte-stream protocols do not define any Message boundaries of their own apart from the end of a stream in each direction.</li>
        <li>Datagram. Datagram protocols define Message boundaries at the same level of transmission, such that only complete (not partial) Messages are supported.</li>
        <li>Message. Message protocols support Message boundaries that can be sent and received either as complete or partial Messages. Maximum Message lengths can be defined, and Messages can be partially reliable.</li>
      </ul>
      <t>Below, terms in capitals with a dot (e.g., "CONNECT.SCTP") refer to the primitives with the same name in section 4 of <xref target="RFC8303"/>. For further implementation details, the description of these primitives in <xref target="RFC8303"/> points to section 3 of <xref target="RFC8303"/> and section 3 of <xref target="RFC8304"/>, which refers back to the relevant specifications for each protocol. This back-tracking method applies to all elements of <xref target="RFC8923"/> (see appendix D of <xref target="I-D.ietf-taps-interface"/>): they are listed in appendix A of <xref target="RFC8923"/> with an implementation hint in the same style, pointing back to section 4 of <xref target="RFC8303"/>.</t>
      <t>This document defines the API mappings for protocols defined in <xref target="RFC8923"/>. Other protocol mappings can be provided as separate documents, following the mapping template <xref target="appendix-mapping-template"/>.</t>
      <section anchor="tcp">
        <name>TCP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Byte-stream</t>
        <t>API mappings for TCP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>TCP connections between two hosts map directly to Connection objects.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>CONNECT.TCP. Calling <tt>Initiate</tt> on a TCP Connection causes it to reserve a local port, and send a SYN to the Remote Endpoint.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>CONNECT.TCP with parameter <tt>user message</tt>. Early safely replayable data is sent on a TCP Connection in the SYN, as TCP Fast Open data.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A TCP Connection is ready once the three-way handshake is complete.</t>
          </dd>
          <dt>EstablishmentError:</dt>
          <dd>
            <t>Failure of CONNECT.TCP. TCP can throw various errors during connection setup. Specifically, it is important to handle a RST being sent by the peer during the handshake.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>Once established, TCP throws errors whenever the connection is disconnected, such as due to receiving a RST from the peer.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.TCP. Calling <tt>Listen</tt> for TCP binds a local port and prepares it to receive inbound SYN packets from peers.</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>TCP Listeners will deliver new connections once they have replied to an inbound SYN with a SYN-ACK.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a TCP Connection creates a new Connection with equivalent parameters. These Connections, and Connections generated via later calls to <tt>Clone</tt> on an Establied Connection, form a Connection Group. To realize entanglement for these Connections, with the exception of <tt>connPriority</tt>, changing a Connection Property on one of them must affect the Connection Properties of the others too. No guarantees of honoring the Connection Property <tt>connPriority</tt> are given, and thus it is safe for an implementation of a transport system to ignore this property. When it is reasonable to assume that Connections traverse the same path (e.g., when they share the same encapsulation), support for it can also experimentally be implemented using a congestion control coupling mechanism (see for example <xref target="TCP-COUPLING"/> or <xref target="RFC3124"/>).</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.TCP. TCP does not on its own preserve Message boundaries. Calling <tt>Send</tt> on a TCP connection lays out the bytes on the TCP send stream without any other delineation. Any Message marked as Final will cause TCP to send a FIN once the Message has been completely written, by calling CLOSE.TCP immediately upon successful termination of SEND.TCP. Note that transmitting a Message marked as Final should not cause the <tt>Closed</tt> event to be delivered to the application, as it will still be possible to receive data until the peer closes or aborts the TCP connection.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>With RECEIVE.TCP, TCP delivers a stream of bytes without any Message delineation. All data delivered in the <tt>Received</tt> or <tt>ReceivedPartial</tt> event will be part of a single stream-wide Message that is marked Final (unless a Message Framer is used). EndOfMessage will be delivered when the TCP Connection has received a FIN (CLOSE-EVENT.TCP) from the peer. Note that reception of a FIN should not cause the <tt>Closed</tt> event to be delivered to the application, as it will still be possible for the application to send data.</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a TCP Connection indicates that the Connection should be gracefully closed (CLOSE.TCP) by sending a FIN to the peer. It will then still be possible to receive data until the peer closes or aborts the TCP connection. The <tt>Closed</tt> event will be issued upon reception of a FIN.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a TCP Connection indicates that the Connection should be immediately closed by sending a RST to the peer (ABORT.TCP).</t>
          </dd>
          <dt>CloseGroup:</dt>
          <dd>
            <t>Calling <tt>CloseGroup</tt> on a TCP Connection (CLOSE.TCP) is identical to calling <tt>Close</tt> on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
          <dt>AbortGroup:</dt>
          <dd>
            <t>Calling <tt>AbortGroup</tt> on a TCP Connection (ABORT.TCP) is identical to calling <tt>Abort</tt> on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
        </dl>
      </section>
      <section anchor="mptcp">
        <name>MPTCP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Byte-stream</t>
        <t>The Transport Services API mappings for MPTCP are identical to TCP. MPTCP adds support for multipath properties,
such as <tt>multipath</tt> and <tt>multipathPolicy</tt>, and actions for managing paths, such as <tt>AddRemote</tt> and <tt>RemoveRemote</tt>.</t>
      </section>
      <section anchor="udp">
        <name>UDP</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>API mappings for UDP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>UDP Connections represent a pair of specific IP addresses and ports on two hosts.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>CONNECT.UDP. Calling <tt>Initiate</tt> on a UDP Connection causes it to reserve a local port, but does not generate any traffic.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>Early data on a UDP Connection does not have any special meaning. The data is sent whenever the Connection is Ready.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A UDP Connection is ready once the system has reserved a local port and has a path to send to the Remote Endpoint.</t>
          </dd>
          <dt>EstablishmentError:</dt>
          <dd>
            <t>UDP Connections can only generate errors on initiation due to port conflicts on the local system.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>UDP Connections can only generate connection errors in response to <tt>Abort</tt> calls. (Once in use, UDP Connections can also generate <tt>SoftError</tt> Events (ERROR.UDP(-Lite)) upon receiving ICMP notifications indicating failures in the network.)</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.UDP. Calling <tt>Listen</tt> for UDP binds a local port and prepares it to receive inbound UDP datagrams from peers.</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>UDP Listeners will deliver new connections once they have received traffic from a new Remote Endpoint.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a UDP Connection creates a new Connection with equivalent parameters. The two Connections are otherwise independent.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.UDP(-Lite). Calling <tt>Send</tt> on a UDP connection sends the data as the payload of a complete UDP datagram. Marking Messages as Final does not change anything in the datagram's contents. Upon sending a UDP datagram, some relevant fields and flags in the IP header can be controlled: DSCP (SET_DSCP.UDP(-Lite)), DF in IPv4 (SET_DF.UDP(-Lite)) and ECN flag (SET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP(-Lite). UDP only delivers complete Messages to <tt>Received</tt>, each of which represents a single datagram received in a UDP packet. Upon receiving a UDP datagram, the ECN flag from the IP header can be obtained (GET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Connection (ABORT.UDP(-Lite)) releases the local port reservation. The Connection then issues a <tt>Closed</tt> event.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a UDP Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt>, except that the Connection will send a <tt>ConnectionError</tt> Event rather than a <tt>Closed</tt> Event.</t>
          </dd>
          <dt>CloseGroup:</dt>
          <dd>
            <t>Calling <tt>CloseGroup</tt> on a UDP Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt> on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
          <dt>AbortGroup:</dt>
          <dd>
            <t>Calling <tt>AbortGroup</tt> on a UDP Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt> on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
        </dl>
      </section>
      <section anchor="udp-lite">
        <name>UDP-Lite</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>The Transport Services API mappings for UDP-Lite are identical to UDP. In addition,
UDP-Lite supports the <tt>msgChecksumLen</tt> and <tt>recvChecksumLen</tt> Properties
that allow an application to specify the minimum number of bytes in a message that
need to be covered by a checksum.</t>
      </section>
      <section anchor="udp-multicast-receive">
        <name>UDP Multicast Receive</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>API mappings for Receiving Multicast UDP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>Established UDP Multicast Receive connections represent a pair of specific IP addresses and ports.  The <tt>direction</tt> Selection Property must be set to <tt>unidirectional receive</tt>, and the Local Endpoint must be configured with a group IP address and a port.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>Calling <tt>Initiate</tt> on a UDP Multicast Receive Connection causes an immediate EstablishmentError.  This is an unsupported operation.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>Calling <tt>InitiateWithSend</tt> on a UDP Multicast Receive Connection causes an immediate EstablishmentError.  This is an unsupported operation.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A UDP Multicast Receive Connection is ready once the system has received traffic for the appropriate group and port.</t>
          </dd>
          <dt>EstablishmentError:</dt>
          <dd>
            <t>UDP Multicast Receive Connections generate an EstablishmentError indicating that joining a multicast group failed if <tt>Initiate</tt> is called.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>The only ConnectionError generated by a UDP Multicast Receive Connection is in response to an <tt>Abort</tt> call.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.UDP. Calling <tt>Listen</tt> for UDP Multicast Receive binds a local port, prepares it to receive inbound UDP datagrams from peers, and issues a multicast host join.  If a Remote Endpoint with an address is supplied, the join is Source-specific Multicast, and the path selection is based on the route to the Remote Endpoint.  If a Remote Endpoint is not supplied, the join is Any-source Multicast, and the path selection is based on the outbound route to the group supplied in the Local Endpoint.</t>
          </dd>
        </dl>
        <t>There are cases where it is required to open multiple connections for the same address(es).
For example, one Connection might be opened for a multicast group to for a multicast control bus,
and another application later opens a separate Connection to the same group to send signals to and/or receive signals from the common bus.
In such cases, the Transport Services system needs to explicitly enable re-use of the same set of addresses (equivalent to setting SO_REUSEADDR
in the socket API).</t>
        <dl>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>UDP Multicast Receive Listeners will deliver new connections once they have received traffic from a new Remote Endpoint.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a UDP Multicast Receive Connection creates a new Connection with equivalent parameters. The two Connections are otherwise independent.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.UDP(-Lite). Calling <tt>Send</tt> on a UDP Multicast Receive connection causes an immediate SendError.  This is an unsupported operation.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP(-Lite). The Receive operation in a UDP Multicast Receive connection only delivers complete Messages to <tt>Received</tt>, each of which represents a single datagram received in a UDP packet. Upon receiving a UDP datagram, the ECN flag from the IP header can be obtained (GET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) releases the local port reservation and leaves the group. The Connection then issues a <tt>Closed</tt> Event.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt>, except that the Connection will send a <tt>ConnectionError</tt> Event rather than a <tt>Closed</tt> Event.</t>
          </dd>
          <dt>CloseGroup:</dt>
          <dd>
            <t>Calling <tt>CloseGroup</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt> on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
          <dt>AbortGroup:</dt>
          <dd>
            <t>Calling <tt>AbortGroup</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt>
on this Connection and on all Connections in the same ConnectionGroup.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sctp">
        <name>SCTP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Message</t>
        <t>API mappings for SCTP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>Connection objects can be mapped to an SCTP association or a stream in an SCTP association. Mapping Connection objects to SCTP streams is called "stream mapping" and has additional requirements as follows. The following explanation assumes a client-server communication model.</t>
          </dd>
        </dl>
        <t>Stream mapping requires an association to already be in place between the client and the server, and it requires the server to understand that a new incoming stream should be represented as a new Connection Object by the Transport Services system. A new SCTP stream is created by sending an SCTP message with a new stream id. Thus, to implement stream mapping, the Transport Services API must provide a newly created Connection Object to the application upon the reception of such a message. The necessary semantics to implement a Transport Services system Close and Abort primitives are provided by the stream reconfiguration (reset) procedure described in <xref target="RFC6525"/>. This also allows to re-use a stream id after resetting ("closing") the stream. To implement this functionality, SCTP stream reconfiguration <xref target="RFC6525"/> must be supported by both the client and the server side.</t>
        <t>To avoid head-of-line blocking, stream mapping should only be implemented when both sides support message interleaving <xref target="RFC8260"/>. This allows a sender to schedule transmissions between multiple streams without risking that transmission of a large message on one stream might block transmissions on other streams for a long time.</t>
        <t>To avoid conflicts between stream ids, the following procedure is recommended: the first Connection, for which the SCTP association has been created, must always use stream id zero. All additional Connections are assigned to unused stream ids in growing order. To avoid a conflict when both endpoints map new Connections simultaneously, the peer which initiated association must use even stream ids whereas the remote side must map its Connections to odd stream ids. Both sides maintain a status map of the assigned stream ids. Generally, new streams should consume the lowest available (even or odd, depending on the side) stream id; this rule is relevant when lower ids become available because Connection objects associated with the streams are closed.</t>
        <t>SCTP stream mapping as described here has been implemented in a research prototype; a desription of this implementation is given in <xref target="NEAT-flow-mapping"/>.</t>
        <dl>
          <dt>Initiate:</dt>
          <dd>
            <t>If this is the only Connection object that is assigned to the SCTP Association or stream mapping is
not used, CONNECT.SCTP is called. Else, unless the Selection Property <tt>activeReadBeforeSend</tt>
is Preferred or Required, a new stream is used: if there are enough streams
available, <tt>Initiate</tt> is a local operation that assigns a new stream id to the Connection object.
The number of streams is negotiated as a parameter of the prior CONNECT.SCTP call, and it represents a
trade-off between local resource usage and the number of Connection objects that can be mapped
without requiring a reconfiguration signal. When running out of streams, ADD_STREAM.SCTP must be called.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>If this is the only Connection object that is assigned to the SCTP association or stream mapping is not used, CONNECT.SCTP is called with the "user message" parameter. Else, a new stream
is used (see <tt>Initiate</tt> for how to handle running out of streams), and this just sends the first message
on a new stream.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t><tt>Initiate</tt> or <tt>InitiateWithSend</tt> returns without an error, i.e. SCTP's four-way handshake has completed. If an association with the peer already exists, stream mapping is used and enough streams are available, a Connection Object instantly becomes Ready after calling <tt>Initiate</tt> or <tt>InitiateWithSend</tt>.</t>
          </dd>
          <dt>EstablishmentError:</dt>
          <dd>
            <t>Failure of CONNECT.SCTP.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>TIMEOUT.SCTP or ABORT-EVENT.SCTP.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.SCTP. If an association with the peer already exists and stream mapping is used, <tt>Listen</tt> just expects to receive a new message with a new stream id (chosen in accordance with the stream id assignment procedure described above).</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>LISTEN.SCTP returns without an error (a result of successful CONNECT.SCTP from the peer), or, in case of stream mapping, the first message has arrived on a new stream (in this case, <tt>Receive</tt> is also invoked).</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on an SCTP association creates a new Connection object and assigns it a new stream id in accordance with the stream id assignment procedure described above. If there are not enough streams available, ADD_STREAM.SCTP must be called.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.SCTP. Message Properties such as <tt>msgLifetime</tt> and <tt>msgOrdered</tt> map to parameters of this primitive.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.SCTP. The "partial flag" of RECEIVE.SCTP invokes a <tt>ReceivedPartial</tt> event.</t>
          </dd>
        </dl>
        <t>Close:
If this is the only Connection object that is assigned to the SCTP association, CLOSE.SCTP is called, and the <tt>Closed</tt> event will be delivered to the application upon the ensuing CLOSE-EVENT.SCTP. Else, the Connection object is one out of several Connection objects that are assigned to the same SCTP assocation, and RESET_STREAM.SCTP must be called, which informs the peer that the stream will no longer be used for mapping and can be used by future <tt>Initiate</tt>, <tt>InitiateWithSend</tt> or <tt>Listen</tt> calls. At the peer, the event RESET_STREAM-EVENT.SCTP will fire, which the peer must answer by issuing RESET_STREAM.SCTP too. The resulting local RESET_STREAM-EVENT.SCTP informs the Transport Services system that the stream id can now be re-used by the next <tt>Initiate</tt>, <tt>InitiateWithSend</tt> or <tt>Listen</tt> calls, and invokes a <tt>Closed</tt> event towards the application.</t>
        <t>Abort:
If this is the only Connection object that is assigned to the SCTP association, ABORT.SCTP is called. Else, the Connection object is one out of several Connection objects that are assigned to the same SCTP assocation, and shutdown proceeds as described under <tt>Close</tt>.</t>
        <t>CloseGroup:
Calling <tt>CloseGroup</tt> calls CLOSE.SCTP, closing all Connections in the SCTP association.</t>
        <t>AbortGroup:
Calling <tt>AbortGroup</tt> calls ABORT.SCTP, immediately closing all Connections in the SCTP association.</t>
        <t>In addition to the API mappings described above, when there are multiple Connection objects assigned to the same SCTP association, SCTP can support Connection properties such as <tt>connPriority</tt>and <tt>connScheduler</tt> where CONFIGURE_STREAM_SCHEDULER.SCTP can be called to adjust the priorities of streams in the SCTP association.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>RFC-EDITOR: Please remove this section before publication.</t>
      <t>This document has no actions for IANA.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t><xref target="I-D.ietf-taps-arch"/> outlines general security consideration and requirements for any system that implements the Transport Services archtecture. <xref target="I-D.ietf-taps-interface"/> provides further discussion on security and privacy implications of the Transport Services API. This document provides additional guidance on implementation specifics for the Transport Services API and as such the security considerations in both of these documents apply. The next two subsections discuss further considerations that are specific to mechanisms specified in this document.</t>
      <section anchor="considerations-for-candidate-gathering">
        <name>Considerations for Candidate Gathering</name>
        <t>Implementations should avoid downgrade attacks that allow network interference to cause the implementation to select less secure, or entirely insecure, combinations of paths and protocols.</t>
      </section>
      <section anchor="considerations-for-candidate-racing">
        <name>Considerations for Candidate Racing</name>
        <t>See <xref target="fastopen"/> for security considerations around racing with 0-RTT data.</t>
        <t>An attacker that knows a particular device is racing several options during connection establishment may be able to block packets for the first connection attempt, thus inducing the device to fall back to a secondary attempt. This is a problem if the secondary attempts have worse security properties that enable further attacks. Implementations should ensure that all options have equivalent security properties to avoid incentivizing attacks.</t>
        <t>Since results from the network can determine how a connection attempt tree is built, such as when DNS returns a list of resolved endpoints, it is possible for the network to cause an implementation to consume significant on-device resources. Implementations should limit the maximum amount of state allowed for any given node, including the number of child nodes, especially when the state is based on results from the network.</t>
      </section>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This work has received funding from the European Union's Horizon 2020 research and
innovation programme under grant agreement No. 644334 (NEAT) and No. 815178 (5GENESIS).</t>
      <t>This work has been supported by Leibniz Prize project funds of DFG - German
Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ FE 570/4-1).</t>
      <t>This work has been supported by the UK Engineering and Physical Sciences
Research Council under grant EP/R04144X/1.</t>
      <t>This work has been supported by the Research Council of Norway under its "Toppforsk"
programme through the "OCARINA" project.</t>
      <t>Thanks to Colin Perkins, Tom Jones, Karl-Johan Grinnemo, Gorry Fairhurst, for their contributions to the design of this specification.
Thanks also to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric Kinnear for their implementation and design efforts, including Happy Eyeballs, that heavily influenced this work.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.ietf-taps-arch">
          <front>
            <title>An Architecture for Transport Services</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Brian Trammell" initials="B." surname="Trammell">
              <organization>Google Switzerland GmbH</organization>
            </author>
            <author fullname="Anna Brunstrom" initials="A." surname="Brunstrom">
              <organization>Karlstad University</organization>
            </author>
            <author fullname="Gorry Fairhurst" initials="G." surname="Fairhurst">
              <organization>University of Aberdeen</organization>
            </author>
            <author fullname="Colin Perkins" initials="C." surname="Perkins">
              <organization>University of Glasgow</organization>
            </author>
            <date day="9" month="March" year="2023"/>
            <abstract>
              <t>   This document describes an architecture for exposing transport
   protocol features to applications for network communication, a
   Transport Services system.  The Transport Services Application
   Programming Interface (API) is based on an asynchronous, event-driven
   interaction pattern.  This API uses messages for representing data
   transfer to applications, and describes how implementations can use
   multiple IP addresses, multiple protocols, and multiple paths, and
   provide multiple application streams.  This document further defines
   common terminology and concepts to be used in definitions of a
   Transport Service API and a Transport Services implementation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-taps-arch-16"/>
        </reference>
        <reference anchor="I-D.ietf-taps-interface">
          <front>
            <title>An Abstract Application Layer Interface to Transport Services</title>
            <author fullname="Brian Trammell" initials="B." surname="Trammell">
              <organization>Google Switzerland GmbH</organization>
            </author>
            <author fullname="Michael Welzl" initials="M." surname="Welzl">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Reese Enghardt" initials="R." surname="Enghardt">
              <organization>Netflix</organization>
            </author>
            <author fullname="Gorry Fairhurst" initials="G." surname="Fairhurst">
              <organization>University of Aberdeen</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Colin Perkins" initials="C." surname="Perkins">
              <organization>University of Glasgow</organization>
            </author>
            <author fullname="Philipp S. Tiesel" initials="P. S." surname="Tiesel">
              <organization>SAP SE</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <date day="24" month="October" year="2022"/>
            <abstract>
              <t>   This document describes an abstract application programming
   interface, API, to the transport layer that enables the selection of
   transport protocols and network paths dynamically at runtime.  This
   API enables faster deployment of new protocols and protocol features
   without requiring changes to the applications.  The specified API
   follows the Transport Services architecture by providing
   asynchronous, atomic transmission of messages.  It is intended to
   replace the BSD sockets API as the common interface to the transport
   layer, in an environment where endpoints could select from multiple
   interfaces and potential transport protocols.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-taps-interface-18"/>
        </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="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="RFC8421">
          <front>
            <title>Guidelines for Multihomed and IPv4/IPv6 Dual-Stack Interactive Connectivity Establishment (ICE)</title>
            <author fullname="P. Martinsen" initials="P." surname="Martinsen">
              <organization/>
            </author>
            <author fullname="T. Reddy" initials="T." surname="Reddy">
              <organization/>
            </author>
            <author fullname="P. Patil" initials="P." surname="Patil">
              <organization/>
            </author>
            <date month="July" year="2018"/>
            <abstract>
              <t>This document provides guidelines on how to make Interactive Connectivity Establishment (ICE) conclude faster in multihomed and IPv4/IPv6 dual-stack scenarios where broken paths exist.  The provided guidelines are backward compatible with the original ICE specification (see RFC 5245).</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="217"/>
          <seriesInfo name="RFC" value="8421"/>
          <seriesInfo name="DOI" value="10.17487/RFC8421"/>
        </reference>
        <reference anchor="RFC8303">
          <front>
            <title>On the Usage of Transport Features Provided by IETF Transport Protocols</title>
            <author fullname="M. Welzl" initials="M." surname="Welzl">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="N. Khademi" initials="N." surname="Khademi">
              <organization/>
            </author>
            <date month="February" year="2018"/>
            <abstract>
              <t>This document describes how the transport protocols Transmission Control Protocol (TCP), MultiPath TCP (MPTCP), Stream Control Transmission Protocol (SCTP), User Datagram Protocol (UDP), and Lightweight User Datagram Protocol (UDP-Lite) expose services to applications and how an application can configure and use the features that make up these services.  It also discusses the service provided by the Low Extra Delay Background Transport (LEDBAT) congestion control mechanism.  The description results in a set of transport abstractions that can be exported in a transport services (TAPS) API.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8303"/>
          <seriesInfo name="DOI" value="10.17487/RFC8303"/>
        </reference>
        <reference anchor="RFC8304">
          <front>
            <title>Transport Features of the User Datagram Protocol (UDP) and Lightweight UDP (UDP-Lite)</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="T. Jones" initials="T." surname="Jones">
              <organization/>
            </author>
            <date month="February" year="2018"/>
            <abstract>
              <t>This is an informational document that describes the transport protocol interface primitives provided by the User Datagram Protocol (UDP) and the Lightweight User Datagram Protocol (UDP-Lite) transport protocols.  It identifies the datagram services exposed to applications and how an application can configure and use the features offered by the Internet datagram transport service.  RFC 8303 documents the usage of transport features provided by IETF transport protocols, describing the way UDP, UDP-Lite, and other transport protocols expose their services to applications and how an application can configure and use the features that make up these services.  This document provides input to and context for that document, as well as offers a road map to documentation that may help users of the UDP and UDP-Lite protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8304"/>
          <seriesInfo name="DOI" value="10.17487/RFC8304"/>
        </reference>
        <reference anchor="RFC7413">
          <front>
            <title>TCP Fast Open</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng">
              <organization/>
            </author>
            <author fullname="J. Chu" initials="J." surname="Chu">
              <organization/>
            </author>
            <author fullname="S. Radhakrishnan" initials="S." surname="Radhakrishnan">
              <organization/>
            </author>
            <author fullname="A. Jain" initials="A." surname="Jain">
              <organization/>
            </author>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document describes an experimental TCP mechanism called TCP Fast Open (TFO).  TFO allows data to be carried in the SYN and SYN-ACK packets and consumed by the receiving end during the initial connection handshake, and saves up to one full round-trip time (RTT) compared to the standard TCP, which requires a three-way handshake (3WHS) to complete before data can be exchanged.  However, TFO deviates from the standard TCP semantics, since the data in the SYN could be replayed to an application in some rare circumstances.  Applications should not use TFO unless they can tolerate this issue, as detailed in the Applicability section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7413"/>
          <seriesInfo name="DOI" value="10.17487/RFC7413"/>
        </reference>
        <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="RFC8923">
          <front>
            <title>A Minimal Set of Transport Services for End Systems</title>
            <author fullname="M. Welzl" initials="M." surname="Welzl">
              <organization/>
            </author>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing">
              <organization/>
            </author>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document recommends a minimal set of Transport Services offered by end systems and gives guidance on choosing among the available mechanisms and protocols. It is based on the set of transport features in RFC 8303.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8923"/>
          <seriesInfo name="DOI" value="10.17487/RFC8923"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.ietf-quic-transport">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="14" month="January" 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="Internet-Draft" value="draft-ietf-quic-transport-34"/>
        </reference>
        <reference anchor="I-D.ietf-tcpm-2140bis">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="Dr. Joseph D. Touch" initials="J. D." surname="Touch">
              <organization>Independent</organization>
            </author>
            <author fullname="Michael Welzl" initials="M." surname="Welzl">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Safiqul Islam" initials="S." surname="Islam">
              <organization>University of Oslo</organization>
            </author>
            <date day="12" month="April" year="2021"/>
            <abstract>
              <t>This memo provides guidance to TCP implementers that is intended to help improve connection convergence to steady-state operation without affecting interoperability.  It updates and replaces RFC 2140's description of sharing TCP state, as typically represented in TCP Control Blocks, among similar concurrent or consecutive connections.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-2140bis-11"/>
        </reference>
        <reference anchor="NEAT-flow-mapping">
          <front>
            <title>Transparent Flow Mapping for NEAT</title>
            <author>
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <seriesInfo name="IFIP NETWORKING 2017 Workshop on Future of Internet Transport (FIT 2017)" value=""/>
        </reference>
        <reference anchor="TCP-COUPLING">
          <front>
            <title>ctrlTCP: Reducing Latency through Coupled, Heterogeneous Multi-Flow TCP Congestion Control</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
          <seriesInfo name="IEEE INFOCOM Global Internet Symposium (GI) workshop (GI 2018)" value=""/>
        </reference>
        <reference anchor="RFC8085">
          <front>
            <title>UDP Usage Guidelines</title>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="G. Shepherd" initials="G." surname="Shepherd">
              <organization/>
            </author>
            <date month="March" year="2017"/>
            <abstract>
              <t>The User Datagram Protocol (UDP) provides a minimal message-passing transport that has no inherent congestion control mechanisms.  This document provides guidelines on the use of UDP for the designers of applications, tunnels, and other protocols that use UDP.  Congestion control guidelines are a primary focus, but the document also provides guidance on other topics, including message sizes, reliability, checksums, middlebox traversal, the use of Explicit Congestion Notification (ECN), Differentiated Services Code Points (DSCPs), and ports.</t>
              <t>Because congestion control is critical to the stable operation of the Internet, applications and other protocols that choose to use UDP as an Internet transport must employ mechanisms to prevent congestion collapse and to establish some degree of fairness with concurrent traffic.  They may also need to implement additional mechanisms, depending on how they use UDP.</t>
              <t>Some guidance is also applicable to the design of other protocols (e.g., protocols layered directly on IP or via IP-based tunnels), especially when these protocols do not themselves provide congestion control.</t>
              <t>This document obsoletes RFC 5405 and adds guidelines for multicast UDP usage.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="145"/>
          <seriesInfo name="RFC" value="8085"/>
          <seriesInfo name="DOI" value="10.17487/RFC8085"/>
        </reference>
        <reference anchor="RFC6763">
          <front>
            <title>DNS-Based Service Discovery</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal">
              <organization/>
            </author>
            <date month="February" year="2013"/>
            <abstract>
              <t>This document specifies how DNS resource records are named and structured to facilitate service discovery.  Given a type of service that a client is looking for, and a domain in which the client is looking for that service, this mechanism allows clients to discover a list of named instances of that desired service, using standard DNS queries. This mechanism is referred to as DNS-based Service Discovery, or DNS-SD.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6763"/>
          <seriesInfo name="DOI" value="10.17487/RFC6763"/>
        </reference>
        <reference anchor="RFC6762">
          <front>
            <title>Multicast DNS</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal">
              <organization/>
            </author>
            <date month="February" year="2013"/>
            <abstract>
              <t>As networked devices become smaller, more portable, and more ubiquitous, the ability to operate with less configured infrastructure is increasingly important.  In particular, the ability to look up DNS resource record data types (including, but not limited to, host names) in the absence of a conventional managed DNS server is useful.</t>
              <t>Multicast DNS (mDNS) provides the ability to perform DNS-like operations on the local link in the absence of any conventional Unicast DNS server.  In addition, Multicast DNS designates a portion of the DNS namespace to be free for local use, without the need to pay any annual fee, and without the need to set up delegations or otherwise configure a conventional DNS server to answer for those names.</t>
              <t>The primary benefits of Multicast DNS names are that (i) they require little or no administration or configuration to set them up, (ii) they work when no infrastructure is present, and (iii) they work during infrastructure failures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6762"/>
          <seriesInfo name="DOI" value="10.17487/RFC6762"/>
        </reference>
        <reference anchor="RFC8445">
          <front>
            <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg">
              <organization/>
            </author>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <date month="July" year="2018"/>
            <abstract>
              <t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based communication.  This protocol is called Interactive Connectivity Establishment (ICE).  ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).</t>
              <t>This document obsoletes RFC 5245.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8445"/>
          <seriesInfo name="DOI" value="10.17487/RFC8445"/>
        </reference>
        <reference anchor="RFC5389">
          <front>
            <title>Session Traversal Utilities for NAT (STUN)</title>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <author fullname="R. Mahy" initials="R." surname="Mahy">
              <organization/>
            </author>
            <author fullname="P. Matthews" initials="P." surname="Matthews">
              <organization/>
            </author>
            <author fullname="D. Wing" initials="D." surname="Wing">
              <organization/>
            </author>
            <date month="October" year="2008"/>
            <abstract>
              <t>Session Traversal Utilities for NAT (STUN) is a protocol that serves as a tool for other protocols in dealing with Network Address Translator (NAT) traversal.  It can be used by an endpoint to determine the IP address and port allocated to it by a NAT.  It can also be used to check connectivity between two endpoints, and as a keep-alive protocol to maintain NAT bindings.  STUN works with many existing NATs, and does not require any special behavior from them.</t>
              <t>STUN is not a NAT traversal solution by itself.  Rather, it is a tool to be used in the context of a NAT traversal solution.  This is an important change from the previous version of this specification (RFC 3489), which presented STUN as a complete solution.</t>
              <t>This document obsoletes RFC 3489.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5389"/>
          <seriesInfo name="DOI" value="10.17487/RFC5389"/>
        </reference>
        <reference anchor="RFC5766">
          <front>
            <title>Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</title>
            <author fullname="R. Mahy" initials="R." surname="Mahy">
              <organization/>
            </author>
            <author fullname="P. Matthews" initials="P." surname="Matthews">
              <organization/>
            </author>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <date month="April" year="2010"/>
            <abstract>
              <t>If a host is located behind a NAT, then in certain situations it can be impossible for that host to communicate directly with other hosts (peers).  In these situations, it is necessary for the host to use the services of an intermediate node that acts as a communication relay.  This specification defines a protocol, called TURN (Traversal Using Relays around NAT), that allows the host to control the operation of the relay and to exchange packets with its peers using the relay.  TURN differs from some other relay control protocols in that it allows a client to communicate with multiple peers using a single relay address.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5766"/>
          <seriesInfo name="DOI" value="10.17487/RFC5766"/>
        </reference>
        <reference anchor="RFC7657">
          <front>
            <title>Differentiated Services (Diffserv) and Real-Time Communication</title>
            <author fullname="D. Black" initials="D." role="editor" surname="Black">
              <organization/>
            </author>
            <author fullname="P. Jones" initials="P." surname="Jones">
              <organization/>
            </author>
            <date month="November" year="2015"/>
            <abstract>
              <t>This memo describes the interaction between Differentiated Services (Diffserv) network quality-of-service (QoS) functionality and real- time network communication, including communication based on the Real-time Transport Protocol (RTP).  Diffserv is based on network nodes applying different forwarding treatments to packets whose IP headers are marked with different Diffserv Codepoints (DSCPs). WebRTC applications, as well as some conferencing applications, have begun using the Session Description Protocol (SDP) bundle negotiation mechanism to send multiple traffic streams with different QoS requirements using the same network 5-tuple.  The results of using multiple DSCPs to obtain different QoS treatments within a single network 5-tuple have transport protocol interactions, particularly with congestion control functionality (e.g., reordering).  In addition, DSCP markings may be changed or removed between the traffic source and destination.  This memo covers the implications of these Diffserv aspects for real-time network communication, including WebRTC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7657"/>
          <seriesInfo name="DOI" value="10.17487/RFC7657"/>
        </reference>
        <reference anchor="RFC3207">
          <front>
            <title>SMTP Service Extension for Secure SMTP over Transport Layer Security</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="February" year="2002"/>
            <abstract>
              <t>This document describes an extension to the SMTP (Simple Mail Transfer Protocol) service that allows an SMTP server and client to use TLS (Transport Layer Security) to provide private, authenticated communication over the Internet.  This gives SMTP agents the ability to protect some or all of their communications from eavesdroppers and attackers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3207"/>
          <seriesInfo name="DOI" value="10.17487/RFC3207"/>
        </reference>
        <reference anchor="RFC1928">
          <front>
            <title>SOCKS Protocol Version 5</title>
            <author fullname="M. Leech" initials="M." surname="Leech">
              <organization/>
            </author>
            <author fullname="M. Ganis" initials="M." surname="Ganis">
              <organization/>
            </author>
            <author fullname="Y. Lee" initials="Y." surname="Lee">
              <organization/>
            </author>
            <author fullname="R. Kuris" initials="R." surname="Kuris">
              <organization/>
            </author>
            <author fullname="D. Koblas" initials="D." surname="Koblas">
              <organization/>
            </author>
            <author fullname="L. Jones" initials="L." surname="Jones">
              <organization/>
            </author>
            <date month="March" year="1996"/>
            <abstract>
              <t>This memo describes a protocol that is an evolution of the previous version of the protocol, version 4 [1]. This new protocol stems from active discussions and prototype implementations.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1928"/>
          <seriesInfo name="DOI" value="10.17487/RFC1928"/>
        </reference>
        <reference anchor="RFC7230">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7230"/>
          <seriesInfo name="DOI" value="10.17487/RFC7230"/>
        </reference>
        <reference anchor="RFC3124">
          <front>
            <title>The Congestion Manager</title>
            <author fullname="H. Balakrishnan" initials="H." surname="Balakrishnan">
              <organization/>
            </author>
            <author fullname="S. Seshan" initials="S." surname="Seshan">
              <organization/>
            </author>
            <date month="June" year="2001"/>
            <abstract>
              <t>This document describes the Congestion Manager (CM), an end-system module that enables an ensemble of multiple concurrent streams from a sender destined to the same receiver and sharing the same congestion properties to perform proper congestion avoidance and control, and allows applications to easily adapt to network congestion.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3124"/>
          <seriesInfo name="DOI" value="10.17487/RFC3124"/>
        </reference>
        <reference anchor="RFC6525">
          <front>
            <title>Stream Control Transmission Protocol (SCTP) Stream Reconfiguration</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="P. Lei" initials="P." surname="Lei">
              <organization/>
            </author>
            <date month="February" year="2012"/>
            <abstract>
              <t>Many applications that use the Stream Control Transmission Protocol (SCTP) want the ability to "reset" a stream.  The intention of resetting a stream is to set the numbering sequence of the stream back to 'zero' with a corresponding notification to the application layer that the reset has been performed.  Applications requiring this feature want it so that they can "reuse" streams for different purposes but still utilize the stream sequence number so that the application can track the message flows.  Thus, without this feature, a new use of an old stream would result in message numbers greater than expected, unless there is a protocol mechanism to "reset the streams back to zero".  This document also includes methods for resetting the transmission sequence numbers, adding additional streams, and resetting all stream sequence numbers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6525"/>
          <seriesInfo name="DOI" value="10.17487/RFC6525"/>
        </reference>
        <reference anchor="RFC8260">
          <front>
            <title>Stream Schedulers and User Message Interleaving for the Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="S. Loreto" initials="S." surname="Loreto">
              <organization/>
            </author>
            <author fullname="R. Seggelmann" initials="R." surname="Seggelmann">
              <organization/>
            </author>
            <date month="November" year="2017"/>
            <abstract>
              <t>The Stream Control Transmission Protocol (SCTP) is a message-oriented transport protocol supporting arbitrarily large user messages.  This document adds a new chunk to SCTP for carrying payload data.  This allows a sender to interleave different user messages that would otherwise result in head-of-line blocking at the sender.  The interleaving of user messages is required for WebRTC data channels.</t>
              <t>Whenever an SCTP sender is allowed to send user data, it may choose from multiple outgoing SCTP streams.  Multiple ways for performing this selection, called stream schedulers, are defined in this document.  A stream scheduler can choose to either implement, or not implement, user message interleaving.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8260"/>
          <seriesInfo name="DOI" value="10.17487/RFC8260"/>
        </reference>
      </references>
    </references>
    <section anchor="appendix-mapping-template">
      <name>API Mapping Template</name>
      <t>Any protocol mapping for the Transport Services API should follow a common template.</t>
      <t>Connectedness: (Connectionless/Connected/Multiplexing Connected)</t>
      <t>Data Unit: (Byte-stream/Datagram/Message)</t>
      <t>Connection Object:</t>
      <t>Initiate:</t>
      <t>InitiateWithSend:</t>
      <t>Ready:</t>
      <t>EstablishmentError:</t>
      <t>ConnectionError:</t>
      <t>Listen:</t>
      <t>ConnectionReceived:</t>
      <t>Clone:</t>
      <t>Send:</t>
      <t>Receive:</t>
      <t>Close:</t>
      <t>Abort:</t>
      <t>CloseGroup:</t>
      <t>AbortGroup:</t>
    </section>
    <section anchor="appendix-reasons-errors">
      <name>Reasons for errors</name>
      <t>The Transport Services API <xref target="I-D.ietf-taps-interface"/> allows for the several generic error types to specify a more detailed reason about why an error occurred. This appendix lists some of the possible reasons.</t>
      <ul spacing="normal">
        <li>InvalidConfiguration:
The transport properties and endpoints provided by the application are either contradictory or incomplete. Examples include the lack of a Remote Endpoint on an active open or using a multicast group address while not requesting a unidirectional receive.</li>
        <li>NoCandidates:
The configuration is valid, but none of the available transport protocols can satisfy the transport properties provided by the application.</li>
        <li>ResolutionFailed:
The remote or local specifier provided by the application can not be resolved.</li>
        <li>EstablishmentFailed:
The Transport Services system was unable to establish a transport-layer connection to the Remote Endpoint specified by the application.</li>
        <li>PolicyProhibited:
The system policy prevents the transport system from performing the action requested by the application.</li>
        <li>NotCloneable:
The Protocol Stack is not capable of being cloned.</li>
        <li>MessageTooLarge:
The message size is too big for the transport system to handle.</li>
        <li>ProtocolFailed:
The underlying Protocol Stack failed.</li>
        <li>InvalidMessageProperties:
The Message Properties either contradict the Transport Properties or they can not be satisfied by the transport system.</li>
        <li>DeframingFailed:
The data that was received by the underlying Protocol Stack could not be processed by the Message Framer.</li>
        <li>ConnectionAborted:
The connection was aborted by the peer.</li>
        <li>Timeout:
Delivery of a message was not possible after a timeout.</li>
      </ul>
    </section>
    <section anchor="appendix-implementations">
      <name>Existing Implementations</name>
      <t>This appendix gives an overview of existing implementations, at the time of writing, of transport systems that are (to some degree) in line with this document.</t>
      <ul spacing="normal">
        <li>
          <t>Apple's Network.framework:
          </t>
          <ul spacing="normal">
            <li>Network.framework is a transport-level API built for C, Objective-C, and Swift. It a connect-by-name API that supports transport security protocols. It provides userspace implementations of TCP, UDP, TLS, DTLS, proxy protocols, and allows extension via custom framers.</li>
            <li>Documentation: <eref target="https://developer.apple.com/documentation/network">https://developer.apple.com/documentation/network</eref></li>
          </ul>
        </li>
        <li>
          <t>NEAT and NEATPy:
          </t>
          <ul spacing="normal">
            <li>NEAT is the output of the European H2020 research project "NEAT"; it is a user-space library for protocol-independent communication on top of TCP, UDP and SCTP, with many more features, such as a policy manager.</li>
            <li>Code: <eref target="https://github.com/NEAT-project/neat">https://github.com/NEAT-project/neat</eref></li>
            <li>NEAT project: <eref target="https://www.neat-project.org">https://www.neat-project.org</eref></li>
            <li>NEATPy is a Python shim over NEAT which updates the NEAT API to be in line with version 6 of the Transport Services API draft.</li>
            <li>Code: <eref target="https://github.com/theagilepadawan/NEATPy">https://github.com/theagilepadawan/NEATPy</eref></li>
          </ul>
        </li>
        <li>
          <t>PyTAPS:
          </t>
          <ul spacing="normal">
            <li>A TAPS implementation based on Python asyncio, offering protocol-independent communication to applications on top of TCP, UDP and TLS, with support for multicast.</li>
            <li>Code: <eref target="https://github.com/fg-inet/python-asyncio-taps">https://github.com/fg-inet/python-asyncio-taps</eref></li>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S963bbWJYm+J9PgXb8CKmTpK9xSUV3dSlk2aEOXzSWImOm
qmulQAKUkCYBFgBaZjg9a16jX6+fZPb97AOAlByZXVWzJldVpiUBB+eyz77v
b08mk1FbtMv8KDlbrZf5Ki/borxOzso2rxfpPG+Stkou67Rs1lXdJhd5/aGA
347S2azOPxwll8fnF+HVtC2qcpRV8zJdwZBZnS7aSZG3i0mbrptJAc9NHn8z
ytI2PxrN4b+vq3p7lBTlohqNinV9lLT1pmmfPHr0x0dPRmmdp0fh46Pbqn5/
XVebtXz2V/gZJ/sSfzd6n2/hgeyI517m7eQ5fn40atq0zP6cLqsSprSFua+L
o+Sf22o+ThoYts4XDfxru8J//MtolG7am6o+GiXJBP4/gck1R8nxNPmx3pRN
W1cr+i0v8Lgs084f6go3M8+KtqrpF1V9fZT8nNZLmEeW/FIWH/K6Kdot/RHe
y/P2KPw6b5vrFCacPKG/z+HBo+Tbbx4n339vg/Bfqk3Z4uZd3OZZXtLv8lVa
LI+SFGY1nems/vF9upk2ebyey2lynm6WW7eWy2q12rrfDi/keA1HDVs8n0bz
f1vm8qfztH6f/Jpu3fRPNuu8BrKqxslJuiwWVV0WafLHbx49fhYvBXahzbPk
AugICK9aJMervC7mqV9cu8YZ/mOKH5vOadPjdZ2W1zdpnbV+aTd5nTdp/Cda
zhugzWXxMVrL4yePk+PlrC6ub9rOSl5VTfIybSsgmJNjXMHTJ1++ArwP/9jm
MpcpUGq8hvNpclnkTb50Kzi/KZbFep1cRH+jJVwcnycXp9EKfq7KOs0m/7Rp
8sk7vCGPH7lFPH727Ns/JudV22TpKp7+y7xepeXWz3bNX/7Hlj7bn+3rafJr
vvzNT/Z1Mb9J86X7PU00kD5uzNtmWUWTPn+b/Fh9hKl+/yj5cVmUGVxiN+tH
Tx9/m4S3bMpvqvo2jWa8ws/f5v9YLIrppqimJfCWsoKFtfD9I3rybPJ8GthS
Ws9vhn5fKBM8AuYELGp4iH/dFPNJq0yqO858vZo8efzs0axo+E9vTo8vJ4tl
dTtZAQ3D4fCvk0TYMLM7YH1lm7yAx5LX/FgC36eX5fEG6CpvcFrA8V6cncPf
Ln99++7nszcvkyePHn9H3LG5qdZJVSYvNu2mznHblTk6nn7w4uySXjmUoZkD
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

-->

</rfc>
