<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.2 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-taps-impl-17" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="TAPS Implementation">Implementing Interfaces to Transport Services</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-taps-impl-17"/>
    <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="R." surname="Enghardt" fullname="Reese 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>George-Stephenson-Straße 7-13</street>
          <city>10557 Berlin</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="November" day="10"/>
    <area>Transport</area>
    <workgroup>TAPS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 100?>

<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 implementing such a system.</t>
    </abstract>
  </front>
  <middle>
    <?line 106?>

<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 implementing a system that provides a Transport Services API. This guide offers suggestions to developers, but it is not prescriptive: implementations are free to take any desired form as long as the API specification in <xref target="I-D.ietf-taps-interface"/> is honored. 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 Transport Services 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>
          <t>the Preconnection, the bundle of properties that describes the application constraints on, and preferences for, the transport;</t>
        </li>
        <li>
          <t>the Connection, the basic object that represents a flow of data as Messages in either direction between the Local and Remote Endpoints;</t>
        </li>
        <li>
          <t>and the Listener, a passive waiting object that delivers new Connections.</t>
        </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 necessarily be immediately bound to a 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 Endpoint Identifiers, a DTLS session, a SCTP stream, a QUIC stream, or an HTTP/2 stream).
The Connection 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 <tt>Initiate</tt> has been called, the Selection Properties and Endpoint information of the created Connection are immutable (i.e, an application is not able to later modify the properties of a Connection by manipulating 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>The pre-establishment phase allows applications to specify properties for the Connections that they are about to make, or to query the API about potential Connections they could make.</t>
      <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. Section 4 of <xref target="I-D.ietf-taps-interface"/> states that Connection Properties should preferably be configured during pre-establishment, 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 Services 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>
            <t>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 Services system this should result in an error.</t>
          </li>
          <li>
            <t>A request by an application for properties that are in conflict with each other, such as specifying required and prohibited properties that cannot be satisfied by any protocol. For example, if an application prohibits <tt>reliability</tt> but then requires <tt>perMsgReliability</tt>, this mismatch should result in an error.</t>
          </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>
            <t>Application preferences, i.e., preferences specified during the pre-establishment via Selection Properties.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Default implementation policy, i.e., predefined policy by OS or application.</t>
          </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. If such a violation prevents a Connection from being established, this should be communicated to the application, e.g. via the <tt>EstablishmentError</tt> event. 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.</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 <tt>Initiate</tt>, at which point the Preconnection object contains all constraints or requirements the application has configured. 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 Services 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 Identifier is 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 Identifier, 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 Identifier: www.example.com:443] [Interface: Any]   [Protocol: TCP]
|-> [Endpoint Identifier: [2001:db8:23::1]:443]        [Interface: Wi-Fi] [Protocol: TCP]
|-> [Endpoint Identifier: 192.0.2.1:443]             [Interface: LTE]   [Protocol: TCP]
|-> [Endpoint Identifier: [2001:db8:42::1]:443]        [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 Identifier. 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:443/any path |
              +==============================+
                 //                     \\
+===========================+      +===========================+
| www.example.com:443/Wi-Fi |      |  www.example.com:443/LTE  |
+===========================+      +===========================+
             ||                            //               \\
+============================+  +=====================+  +==========================+
| [2001:db8:23::1]:443/Wi-Fi |  |  192.0.2.1:443/LTE  |  | [2001:db8:42::1]:443/LTE |
+============================+  +=====================+  +==========================+
]]></artwork>
        <t>The rest of this section will use a notation scheme to represent this tree. The root node (or parent 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 its parent's 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 with the protocol closest to the application first. The above example can now be written more succinctly as:</t>
        <artwork><![CDATA[
1 [www.example.com:443, any path, TCP]
  1.1 [www.example.com:443, Wi-Fi, TCP]
    1.1.1 [[2001:db8:23::1]:443, Wi-Fi, TCP]
  1.2 [www.example.com:443, LTE, TCP]
    1.2.1 [192.0.2.1:443, LTE, TCP]
    1.2.2 [[2001:db8.42::1]:443, 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 root 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 consist of only a single node, such as a connection attempt to an IP address over a single interface with a single protocol.</t>
        <artwork><![CDATA[
1 [[2001:db8:23::1]:443, Wi-Fi, TCP]
]]></artwork>
        <t>A root 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:443, Wi-Fi, TCP]
  1.1 [[2001:db8:23::1]:443, 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 Identifer, there may be multiple endpoint candidates of different types that can be derived from the original. This creates an ordered list of the derived endpoint candidates 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 Identifer on a traditional IP network, the implementation should send all applicable DNS queries. Commonly, this will include both A (IPv4) and AAAA (IPv6) records if both address families are supported on the local interface. This can also include SRV records <xref target="RFC2782"/>, SVCB and HTTPS records <xref target="I-D.ietf-dnsop-svcb-https"/>, or other future record types. 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:443, Wi-Fi, TCP]
  1.1 [[2001:db8::1]:443, Wi-Fi, TCP]
  1.2 [192.0.2.1:443, Wi-Fi, TCP]
  1.3 [[2001:db8::2]:443, Wi-Fi, TCP]
  1.4 [[2001:db8::3]:443, 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.example.com, Wi-Fi, TCP]
  1.1 [term-printer.meeting.example.com: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 interfaces 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 the expected path round-trip-time or other available metrics.</t>
            <artwork><![CDATA[
1 [192.0.2.1:443, any path, TCP]
  1.1 [192.0.2.1:443, Wi-Fi, TCP]
  1.2 [192.0.2.1:443, LTE, TCP]
]]></artwork>
            <t>The 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:443, any path, HTTP/TCP]
  1.1 [192.0.2.8:443, any path, HTTP/HTTP Proxy/TCP]
  1.2 [192.0.2.7:10234, any path, HTTP/SOCKS/TCP]
  1.3 [www.example.com:443, any path, HTTP/TCP]
    1.3.1 [192.0.2.1:443, 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="RFC9000"/> 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:4740, any path, reliable-inorder-stream]
  1.1 [www.example.com:4740, any path, SCTP]
    1.1.1 [192.0.2.1:4740, any path, SCTP]
  1.2 [www.example.com:4740, any path, TCP]
    1.2.1 [192.0.2.1:4740, any path, TCP]
]]></artwork>
            <t>Implementations that support racing protocols and protocol options should maintain a history of which protocols and protocol options were 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>
              <t>Network Paths</t>
            </li>
            <li>
              <t>Protocol Options</t>
            </li>
            <li>
              <t>Derived Endpoints</t>
            </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 establishment process 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 protocols, 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 Endpoint Identifers being used. Adding a proxy to a connection's branch will change the Endpoint Identifer 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 attempted first. Then, branches with SCTP will be attempted first 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 would be no SCTP node in the WiFi subtree. Here, the path over WiFi will be attempted first, and, if connection establishment succeeds, TCP will be used. Thus, the Selection Property 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:443, Wi-Fi, reliable-inorder-stream]
1.1.1 [192.0.2.1:443, Wi-Fi, TCP]
1.2 [192.0.3.1:443, LTE, reliable-inorder-stream]
1.2.1 [192.0.3.1:443, LTE, SCTP]
1.2.2 [192.0.3.1:443, 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 as
specified by Selection Properties <xref target="I-D.ietf-taps-interface"/>.
Leaf nodes on branches with higher rankings represent connection attempts that will be raced first.</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>
              <t>"Interface Instance or Type" (property name <tt>interface</tt>):
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.</t>
            </li>
            <li>
              <t>"Capacity Profile" (property name <tt>connCapacityProfile</tt>):
An implementation can use the capacity profile to prefer paths that match an application's expected traffic profile. 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>
                  <t>Low Latency/Interactive:
Prefer paths with the lowest expected Round Trip Time, based on observed Round Trip Time estimates;</t>
                </li>
                <li>
                  <t>Low Latency/Non-Interactive:
Prefer paths with a low expected Round Trip Time, but can tolerate delay variation;</t>
                </li>
                <li>
                  <t>Constant-Rate Streaming:
Prefer paths that are expected to satisfy the requested stream send or receive bitrate, based on the observed maximum throughput;</t>
                </li>
                <li>
                  <t>Capacity-Seeking:
Prefer adapting to paths to determine the highest available capacity, based on the observed maximum throughput.</t>
                </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 a 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 Endpoint Identifers 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 Identifer 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 Identifer 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 Identifers 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 all of the nodes that will be used until steps like name resolution have occurred, and many of the possible branches ultimately might not be attempted.</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>
            <t>Simultaneous</t>
          </li>
          <li>
            <t>Staggered</t>
          </li>
          <li>
            <t>Failover</t>
          </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 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 preferred Protocol Stack that uses a proxy and an alternate 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 <tt>Ready</tt> 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 root 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 root 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:443, Any, TCP]
  1.1 [www.example.com:443, Wi-Fi, TCP]
    1.1.1 [192.0.2.1:443, Wi-Fi, TCP]
  1.2 [www.example.com:443, 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 three-way handshake has been completed. 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>When the <tt>Initiate</tt> action is called without any Messages being sent at the same time, depending on the
protocols involved, it is not guaranteed that the Remote Endpoint will be notified of this, and hence a passive
endpoint's application may not receive a <tt>ConnectionReceived</tt> event until it receives the first Message on the new Connection.</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 <tt>Ready</tt> 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 Services system should report an <tt>EstablishmentError</tt> to the application. An <tt>EstablishmentError</tt> event should also be generated in case the Transport Services 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 <tt>Clone</tt> action). When the underlying transport connection supports multi-streaming, the Transport Services System can map each Connection in the Connection Group to a different stream of this connection.</t>
        <t>For such streams, there is often no explicit connection
establishment procedure for the new stream prior to sending data on it (e.g., with SCTP). In this case, the same
considerations apply to determining stream establishment as apply to establishing a UDP connection, as
discussed in <xref target="determining-successful-establishment"/>.
This means that there might not
be any "establishment" message (like a TCP SYN).</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 handle the lack of an explicit handshake in the underlying protocol, 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 by the Message Framer.</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 Identifer 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 Endpoint Identifers (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 can listen for entirely new connections as well as for new sub-connections (streams of an already existing connection). A new stream arrival on an existing connection is presented to the application as a new Connection. This new Connection is grouped with all other Connections that are multiplexed via the same protocol.</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.</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 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>
              <t><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 Services 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 it from their send buffer. For example, a Transport Services 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.</t>
            </li>
            <li>
              <t><tt>msgPriority</tt>: this represents the ability to prioritize a Message over other Messages. This can be implemented by the Transport Services system by 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.</t>
            </li>
            <li>
              <t><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.</t>
            </li>
            <li>
              <t><tt>safelyReplayable</tt>: when this is true, this means that the Message can be used by a transport mechanism that might deliver 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 Services system is permitted to replay Messages, replay protection could be provided by the application.</t>
            </li>
            <li>
              <t><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 Message marked <tt>final</tt> will result in a SendError.</t>
            </li>
            <li>
              <t><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.</t>
            </li>
            <li>
              <t><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.</t>
            </li>
            <li>
              <t><tt>msgCapacityProfile</tt>: When true, this expresses a wish to override the
Generic Connection Property <tt>connCapacityProfile</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).</t>
            </li>
            <li>
              <t><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 should be set to avoid on-path IP fragmentation (<xref target="RFC8304"/>).</t>
            </li>
            <li>
              <t><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 should be set to avoid on-path IP fragmentation (<xref target="RFC8304"/>).</t>
            </li>
          </ul>
        </section>
        <section anchor="send-completion">
          <name>Send Completion</name>
          <t>The application should be notified (using a <tt>Sent</tt>, <tt>Expired</tt> or <tt>SendError</tt> event) 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 the Transport Services implementation (including the Protocol Stack) has experienced a failure related to sending; this can depend on protocol-specific timeouts.</t>
        </section>
        <section anchor="batching-sends">
          <name>Batching Sends</name>
          <t>Sending multiple Messages can incur high overhead if each needs to be enqueued separately (e.g., each Message might involve a context switch between the
application and the Transport Services System). To avoid this, the application can indicate a batch of <tt>Send</tt> 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 <tt>Receive</tt> 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. The application can also control the flow of received data by specifying the minimum and maximum number of bytes of Message content it wants to receive at one time.</t>
        <t>If a Connection finishes before a requested <tt>Receive</tt> action can be satisfied, the Transport Services system 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 application can express its preference for sending messagess as 0-RTT data by using the <tt>zeroRttMsg</tt> Selection Property on the Preconnection. Then, the application can provide the message to send as 0-RTT data via the <tt>InitiateWithSend</tt> action. In order to be sent as 0-RTT data, the message needs to be marked with the <tt>safelyReplayable</tt> send paramteter. 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. Note that the amount of data that can actually be sent as 0-RTT data varies by protocol, so any given Protocol Stack might only consume part of the saved data prior to becoming established. The implementation needs to keep track of how much data a particular Protocol Stack has consumed, and ensure that any pending 0-RTT-eligible data from the application is handled before subsequent Messages.</t>
        <t>It is also possible for Protocol Stacks within a particular leaf node to use a 0-RTT handshakes in a lower-level protocol without any safely replayable application data if a higher-level 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, without any data being provided by the application.</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. Generally, a Message Framer implements a simple
application protocol that can either be provided by the Transport Services
implementation or by the application. It is optional for Transport Services system implementations to provide Message Framers: the specification <xref target="I-D.ietf-taps-interface"/> does not prescribe any particular Message Framers to be implemented.
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 a protocol that is by default built into 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>
          <t>Header-prefixed record formats, such as a basic Type-Length-Value (TLV) structure</t>
        </li>
        <li>
          <t>Delimiter-separated formats, such as HTTP/1.1</t>
        </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 for 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 <tt>Send</tt> action in the API (<xref section="9.2" sectionFormat="of" target="I-D.ietf-taps-interface"/>).</t>
        <artwork><![CDATA[
                        MessageFramer
                              |
                              V
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 the length of the Message data 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.</t>
        <t>The parameters to the events and calls for receiving data with a framer
align with the <tt>Receive</tt> action 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)
                                 |
                                 V
             (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 the length of the Message data 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 error events in the form of <tt>SoftError</tt> events.</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 the Protocol Stack as a whole whenever the properties have been modified by the application. <xref target="RFC8303"/> and <xref target="RFC8304"/> offer guidance on how to do this for TCP, MPTCP, SCTP, UDP and UDP-Lite; see <xref target="specific-protocol-considerations"/> for a description of a back-tracking method to find the relevant protocol primitives using these documents.
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>Some Connection Properties might apply to multiple protocols within a Protocol Stack. Depending on the specific property,
it might be appropriate to apply the property across multiple protocols simultaneously, or else only apply it to one protocol.
In general, the Transport Services implementation should allow the protocol closest to the application to interpret
Connection Properties, and potentially modify the set of Connection Properties passed down to the next protocol in the
stack. For example, if the application has requested to use keepalives with the <tt>keepAlive</tt> property, and the Protocol
Stack contains both HTTP/2 and TCP, the HTTP/2 protocol can choose to enable its own keepalives to satisfy the application
request, and disable TCP-level keepalives. For cases where the application needs to have fine-grained per-protocol control,
the Transport Services implementation can expose Protocol-specific Properties.</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 must fail gracefully. The application must be informed of the error, but the Connection itself must not be terminated.</t>
      <t>When protocol instances in the Protocol Stack report generic or protocol-specific
errors, the API will deliver them to the application as <tt>SoftError</tt> events. 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 usage 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 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 Services 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>For <tt>Close</tt> (which leads to a <tt>Closed</tt> event) and <tt>Abort</tt> (which leads to a <tt>ConnectionError</tt> event),
the application might find it useful 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. When an underlying transport connection supports multi-streaming (such as SCTP), the Transport Services system can use a stream reset procedure to cause a Finish event upon a <tt>Close</tt> 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 Identifer (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>
            <t>The DNS protocol can cache resolved addresses (such as those retrieved from A and AAAA queries), associated with a Time To Live (TTL) to
be used for future hostname resolutions without requiring asking the DNS resolver again.</t>
          </li>
          <li>
            <t>TLS caches session state and tickets based on a hostname, which can be used for resuming sessions with a server.</t>
          </li>
          <li>
            <t>TCP can cache cookies for use in TCP Fast Open.</t>
          </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 Endpoint Identifers 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>
            <t>Observed Round Trip Time</t>
          </li>
          <li>
            <t>Connection establishment latency</t>
          </li>
          <li>
            <t>Connection establishment success rate</t>
          </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="RFC9040"/> provides guidance about sharing of TCP Control Block information between connections on initialization.</t>
      </section>
    </section>
    <section anchor="specific-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 definitions of
Connectedness for various types of protocols are:</t>
      <ul spacing="normal">
        <li>
          <t>Connectionless. Connectionless protocols do not establish explicit state between endpoints, and do not perform a handshake during Connection establishment.</t>
        </li>
        <li>
          <t>Connected. Connected (also called "connection-oriented") 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.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
      </ul>
      <t>Protocols also have a notion of Data Unit. Possible values for Data Unit are:</t>
      <ul spacing="normal">
        <li>
          <t>Byte-stream. Byte-stream protocols do not define any message boundaries of their own apart from the end of a stream in each direction.</t>
        </li>
        <li>
          <t>Datagram. Datagram protocols define message boundaries at the same level of transmission, such that only complete (not partial) messages are supported.</t>
        </li>
        <li>
          <t>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.</t>
        </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 presents the protocol mappings defined in <xref target="RFC8923"/>. Other protocol mappings can be provided as separate documents, following the mapping template in <xref target="appendix-mapping-template"/>.</t>
      <section anchor="tcp">
        <name>TCP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Byte-stream</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 Established 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 Services 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>
        <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 <tt>Ready</tt>.</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) 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. 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), DF in IPv4 (SET_DF.UDP) and ECN flag (SET_ECN.UDP).</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP. 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).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Connection (ABORT.UDP) 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) 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) 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) 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>
        <t>This includes: CONNECT.UDP-Lite; LISTEN.UDP-Lite; SEND.UDP-Lite; RECEIVE.UDP-Lite; ABORT.UDP-Lite; ERROR.UDP-Lite; SET_DSCP.UDP-Lite; SET_DF.UDP-Lite; SET_ECN.UDP-Lite; GET_ECN.UDP-Lite.</t>
      </section>
      <section anchor="udp-multicast-receive">
        <name>UDP Multicast Receive</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</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 <tt>EstablishmentError</tt>.  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 <tt>EstablishmentError</tt>.  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 <tt>EstablishmentError</tt> indicating that joining a multicast group failed if <tt>Initiate</tt> is called.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>The only <tt>ConnectionError</tt> 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 Identifer 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 Identifer 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. Calling <tt>Send</tt> on a UDP Multicast Receive connection causes an immediate <tt>SendError</tt>.  This is an unsupported operation.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP. The <tt>Receive</tt> 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).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Multicast Receive Connection (ABORT.UDP) 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) 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) 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) 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>
        <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's <tt>Close</tt> and <tt>Abort</tt> 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 <tt>Ready</tt> 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>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>The Security Considerations of the Transport Services Architecture <xref target="I-D.ietf-taps-arch"/> forbids gathering and racing with Protocol Stacks that do not have equivalent security properties. Therefore, implementations need to 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 anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-taps-arch">
          <front>
            <title>Architecture and Requirements 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="November" year="2023"/>
            <abstract>
              <t>   This document describes an architecture for exposing transport
   protocol features to applications for network communication.  This
   system exposes transport protocol features to applications for
   network communication.  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 a Transport Services
   Implementation can use multiple IP addresses, multiple protocols, and
   multiple paths, and provide multiple application streams.  This
   document provides the architecture and requirements.  It 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-19"/>
        </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="6" month="July" year="2023"/>
            <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-22"/>
        </reference>
        <reference anchor="RFC8305">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>Many communication protocols operating over the modern Internet use hostnames. These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics. Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly. This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs". This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe"/>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <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"/>
            <author fullname="T. Reddy" initials="T." surname="Reddy"/>
            <author fullname="P. Patil" initials="P." surname="Patil"/>
            <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"/>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen"/>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <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"/>
            <author fullname="T. Jones" initials="T." surname="Jones"/>
            <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"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="S. Radhakrishnan" initials="S." surname="Radhakrishnan"/>
            <author fullname="A. Jain" initials="A." surname="Jain"/>
            <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"/>
            <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"/>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing"/>
            <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 anchor="sec-informative-references">
        <name>Informative References</name>
        <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"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="G. Shepherd" initials="G." surname="Shepherd"/>
            <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="RFC2782">
          <front>
            <title>A DNS RR for specifying the location of services (DNS SRV)</title>
            <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
            <author fullname="P. Vixie" initials="P." surname="Vixie"/>
            <author fullname="L. Esibov" initials="L." surname="Esibov"/>
            <date month="February" year="2000"/>
            <abstract>
              <t>This document describes a DNS RR which specifies the location of the server(s) for a specific protocol and domain. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2782"/>
          <seriesInfo name="DOI" value="10.17487/RFC2782"/>
        </reference>
        <reference anchor="I-D.ietf-dnsop-svcb-https">
          <front>
            <title>Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)</title>
            <author fullname="Benjamin M. Schwartz" initials="B. M." surname="Schwartz">
              <organization>Google</organization>
            </author>
            <author fullname="Mike Bishop" initials="M." surname="Bishop">
              <organization>Akamai Technologies</organization>
            </author>
            <author fullname="Erik Nygren" initials="E." surname="Nygren">
              <organization>Akamai Technologies</organization>
            </author>
            <date day="11" month="March" year="2023"/>
            <abstract>
              <t>This document specifies the "SVCB" ("Service Binding") and "HTTPS" DNS resource record (RR) types to facilitate the lookup of information needed to make connections to network services, such as for HTTP origins.  SVCB records allow a service to be provided from multiple alternative endpoints, each with associated parameters (such as transport protocol configuration), and are extensible to support future uses (such as keys for encrypting the TLS ClientHello).  They also enable aliasing of apex domains, which is not possible with CNAME.  The HTTPS RR is a variation of SVCB for use with HTTP (see RFC 9110, "HTTP Semantics").  By providing more information to the client before it attempts to establish a connection, these records offer potential benefits to both performance and privacy.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-dnsop-svcb-https-12"/>
        </reference>
        <reference anchor="RFC6763">
          <front>
            <title>DNS-Based Service Discovery</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal"/>
            <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"/>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal"/>
            <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="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC8445">
          <front>
            <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
            <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"/>
            <author fullname="R. Mahy" initials="R." surname="Mahy"/>
            <author fullname="P. Matthews" initials="P." surname="Matthews"/>
            <author fullname="D. Wing" initials="D." surname="Wing"/>
            <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"/>
            <author fullname="P. Matthews" initials="P." surname="Matthews"/>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
            <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"/>
            <author fullname="P. Jones" initials="P." surname="Jones"/>
            <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"/>
            <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"/>
            <author fullname="M. Ganis" initials="M." surname="Ganis"/>
            <author fullname="Y. Lee" initials="Y." surname="Lee"/>
            <author fullname="R. Kuris" initials="R." surname="Kuris"/>
            <author fullname="D. Koblas" initials="D." surname="Koblas"/>
            <author fullname="L. Jones" initials="L." surname="Jones"/>
            <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"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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="RFC9040">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <date month="July" 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="RFC" value="9040"/>
          <seriesInfo name="DOI" value="10.17487/RFC9040"/>
        </reference>
        <reference anchor="RFC3124">
          <front>
            <title>The Congestion Manager</title>
            <author fullname="H. Balakrishnan" initials="H." surname="Balakrishnan"/>
            <author fullname="S. Seshan" initials="S." surname="Seshan"/>
            <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"/>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen"/>
            <author fullname="P. Lei" initials="P." surname="Lei"/>
            <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"/>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen"/>
            <author fullname="S. Loreto" initials="S." surname="Loreto"/>
            <author fullname="R. Seggelmann" initials="R." surname="Seggelmann"/>
            <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>
    <?line 1189?>

<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>
          <t>InvalidConfiguration:
The transport properties and Endpoint Identifers provided by the application are either contradictory or incomplete. Examples include the lack of a Remote Endpoint Identifer on an active open or using a multicast group address while not requesting a unidirectional receive.</t>
        </li>
        <li>
          <t>NoCandidates:
The configuration is valid, but none of the available transport protocols can satisfy the transport properties provided by the application.</t>
        </li>
        <li>
          <t>ResolutionFailed:
The remote or local specifier provided by the application can not be resolved.</t>
        </li>
        <li>
          <t>EstablishmentFailed:
The Transport Services system was unable to establish a transport-layer connection to the Remote Endpoint specified by the application.</t>
        </li>
        <li>
          <t>PolicyProhibited:
The system policy prevents the Transport Services system from performing the action requested by the application.</t>
        </li>
        <li>
          <t>NotCloneable:
The Protocol Stack is not capable of being cloned.</t>
        </li>
        <li>
          <t>MessageTooLarge:
The Message is too big for the Transport Services system to handle.</t>
        </li>
        <li>
          <t>ProtocolFailed:
The underlying Protocol Stack failed.</t>
        </li>
        <li>
          <t>InvalidMessageProperties:
The Message Properties either contradict the Transport Properties or they can not be satisfied by the Transport Services system.</t>
        </li>
        <li>
          <t>DeframingFailed:
The data that was received by the underlying Protocol Stack could not be processed by the Message Framer.</t>
        </li>
        <li>
          <t>ConnectionAborted:
The connection was aborted by the peer.</t>
        </li>
        <li>
          <t>Timeout:
Delivery of a Message was not possible after a timeout.</t>
        </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 Services 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>
              <t>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.</t>
            </li>
            <li>
              <t>Documentation: <eref target="https://developer.apple.com/documentation/network">https://developer.apple.com/documentation/network</eref></t>
            </li>
          </ul>
        </li>
        <li>
          <t>NEAT and NEATPy:
          </t>
          <ul spacing="normal">
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>Code: <eref target="https://github.com/NEAT-project/neat">https://github.com/NEAT-project/neat</eref></t>
            </li>
            <li>
              <t>Code at the Software Heritage Archive: <eref target="https://archive.softwareheritage.org/swh:1:dir:737820840f83c4ec9493a8c0cc89b3159e2e1a57;origin=https://github.com/NEAT-project/neat;visit=swh:1:snp:bbb611b04e355439d47e426e8ad5d07cdbf647e0;anchor=swh:1:rev:652ee991043ce3560a6e5715fa2a5c211139d15c">https://archive.softwareheritage.org/swh:1:dir:737820840f83c4ec9493a8c0cc89b3159e2e1a57;origin=https://github.com/NEAT-project/neat;visit=swh:1:snp:bbb611b04e355439d47e426e8ad5d07cdbf647e0;anchor=swh:1:rev:652ee991043ce3560a6e5715fa2a5c211139d15c</eref></t>
            </li>
            <li>
              <t>NEAT project: <eref target="https://www.neat-project.org">https://www.neat-project.org</eref></t>
            </li>
            <li>
              <t>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.</t>
            </li>
            <li>
              <t>Code: <eref target="https://github.com/theagilepadawan/NEATPy">https://github.com/theagilepadawan/NEATPy</eref></t>
            </li>
            <li>
              <t>Code at the Software Heritage Archive: <eref target="https://archive.softwareheritage.org/swh:1:dir:295ccd148cf918ccb9ed7ad14b5ae968a8d2c370;origin=https://github.com/theagilepadawan/NEATPy;visit=swh:1:snp:6e1a3a9dd4c532ba6c0f52c8f734c1256a06cedc;anchor=swh:1:rev:cd0788d7f7f34a0e9b8654516da7c002c44d2e95">https://archive.softwareheritage.org/swh:1:dir:295ccd148cf918ccb9ed7ad14b5ae968a8d2c370;origin=https://github.com/theagilepadawan/NEATPy;visit=swh:1:snp:6e1a3a9dd4c532ba6c0f52c8f734c1256a06cedc;anchor=swh:1:rev:cd0788d7f7f34a0e9b8654516da7c002c44d2e95</eref></t>
            </li>
          </ul>
        </li>
        <li>
          <t>PyTAPS:
          </t>
          <ul spacing="normal">
            <li>
              <t>A TAPS implementation based on Python asyncio, offering protocol-independent communication to applications on top of TCP, UDP and TLS, with support for multicast.</t>
            </li>
            <li>
              <t>Code: <eref target="https://github.com/fg-inet/python-asyncio-taps">https://github.com/fg-inet/python-asyncio-taps</eref></t>
            </li>
            <li>
              <t>Code at the Software Heritage Archive: <eref target="https://archive.softwareheritage.org/swh:1:dir:a7151096d91352b439b092ef116d04f38e52e556;origin=https://github.com/fg-inet/python-asyncio-taps;visit=swh:1:snp:4841e59b53b28bb385726e7d3a569bee0fea7fc4;anchor=swh:1:rev:63571fd7545da25142bc1a6371b8f13097cba38e">https://archive.softwareheritage.org/swh:1:dir:a7151096d91352b439b092ef116d04f38e52e556;origin=https://github.com/fg-inet/python-asyncio-taps;visit=swh:1:snp:4841e59b53b28bb385726e7d3a569bee0fea7fc4;anchor=swh:1:rev:63571fd7545da25142bc1a6371b8f13097cba38e</eref></t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+S963LbWLYm+J9PgbZ/pNRFMn3LSym7zxylLDsV6bQ1lrIy
pqsrSiABSiiTAAsALTNdnpjXmF/zMPMm8ySz7nttAKTkrDyXicnormORxMa+
rL3u61uTyWTUFu0yP0rOVutlvsrLtiivk7OyzetFOs+bpK2Syzotm3VVt8lF
Xr8v4NNROpvV+fuj5PL4/CI8mrZFVY6yal6mKxgyq9NFOynydjFp03UzKeB3
k8ffjLK0zY9Gc/jf66reHiVFuahGo2JdHyVtvWnaJ48e/fHRk1Fa5+lRePno
tqrfXdfVZi2v/QX+xsm+xM9G7/It/CA74rmXeTt5jq8fjZo2LbO/psuqhClt
Ye7r4ij5c1vNx0kDw9b5ooF/bVf4j7+MRummvanqo1GSTOD/JzC55ig5nibf
15uyaetqRZ/yAo/LMu18UVe4mXlWtFVNH1T19VHyY1ovYR5Z8nNZvM/rpmi3
9CU8l+ftUfg4b5vrFCacPKHv5/DDo+Trrx4n335rg/A31aZscfMubvMsL+mz
fJUWy6MkhVlNZzqrf32XbqZNHq/ncpqcp5vl1q3lslqttu7T4YUcr+GoYYvn
02j+b8pcvjpP63fJL+nWTf9ks85rIKtqnJyky2JR1WWRJn/86tHjZ/FSYBfa
PEsugI6A8KpFcrzK62Ke+sW1a5zhv6b4sumcNt2t6+00OS2vb9I6a93S3uZ5
k8df0GJeA2Uuiw/RSh4/eZwcL2d1cX3TdtbxqmqSl2lbAbmcHOP8nz75/Pnj
bfjXNpe5TIFO4xWcT5PLAqa7dPM/vymWxXqdXETf0RIujs+Ti9NoBS9z+Caf
XLT5+iYvm6qEf9bp//1/5ck3k8dP3XoeP/rqq2+S7/N6WZTxQl7m9Sott37e
a57Dv7Y0gf68f5omv+TLX/20fyrmN2m+dJ/TlMMVwC160yyraPrnb5Lvqw8w
uW8fJd/DzDK4zG7Sj54+/joJT9mUX1f1bRrNeIWvv83/tVgU001RTUvgMWUF
C2vh/Uf0y7PJ82lgT2k9vxn6vFBmeARMClhVNMTr0+PLyWJZ3U5WQJPAjvjj
JBG2yuwLWFnZJi/gZ8lP/LMExqGH5ecNUEre4PDAwV6cncN3l7+8efvj2euX
yZNHj78hbtfcVOukKpMXm3ZT57h9yuwcjz54cXZJjxzK0MzRGp2YHhv/R4f3
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
VSDSKAtkXgWRX2RKChD38uR/56qF3xeoAQA=

-->

</rfc>
