<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
 which is available here: http://xml2rfc.ietf.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
There has to be one entity for each item to be referenced.
An alternate method (rfc include) is described in the references. -->
<!--<!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
 -->
<!-- http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml-->
 <!--<!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">-->
<!--<!ENTITY RFC2309 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2309.xml">
 <!ENTITY RFC2481 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2481.xml">
 <!ENTITY RFC3168 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
 <!ENTITY RFC3649 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3649.xml">
 <!ENTITY RFC3742 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3742.xml">
 <!ENTITY RFC3758 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3758.xml">
 <!ENTITY RFC4340 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4340.xml">
 <!ENTITY RFC4774 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4774.xml">
 <!ENTITY RFC4960 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4960.xml">
 <!ENTITY RFC5562 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5562.xml">
 <!ENTITY RFC5670 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5670.xml">
 <!ENTITY RFC5681 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml">
 <!ENTITY RFC5696 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5696.xml">
 <!ENTITY RFC6040 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6040.xml">
 <!ENTITY RFC6458 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6458.xml">
 <!ENTITY RFC6679 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml">
 <!ENTITY RFC6789 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6789.xml">
 <!ENTITY I-D.narten-iana-considerations-rfc2434bis SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.narten-iana-considerations-rfc2434bis.xml">
 -->
<!ENTITY RFC5290 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5290.xml">
<!ENTITY RFC7305 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7305.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
 please see http://xml2rfc.ietf.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
 (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="3"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
 (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="yes" ?>
<!-- do not keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<rfc category="info" docName="draft-gjessing-taps-minset-02" ipr="trust200902">
    <!--	noModificationTrust200902 noDerivativesTrust200902 pre5378Trust200902">-->
    
    <!-- updates="6298"> -->
    
    <!-- ipr="full3978"> -->
    
    <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN"
     they will automatically be output with "(if approved)" -->
    
    <!-- ***** FRONT MATTER ***** -->
    
    <front>
        <!-- The abbreviated title is used in the page header - it is only necessary if the
         full title is longer than 39 characters -->
        
        <!-- <title abbrev="Abbreviated Title">Coupled congestion control</title> -->
        
        <title abbrev="Minimal TAPS Transport Services">A Minimal Set of Transport Services for TAPS Systems</title>
        
        <!-- add 'role="editor"' below for the editors if appropriate -->
        
        <!-- Another author who claims to be an editor -->
        
        
        <author fullname="Stein Gjessing" initials="S." surname="Gjessing">
            <organization>University of Oslo</organization>
            
            <address>
                <postal>
                    <street>PO Box 1080 Blindern</street>
                    
                    <!-- Reorder these if your country does things differently -->
                    
                    <code>N-0316</code>
                    
                    <city>Oslo</city>
                    
                    <region></region>
                    
                    <country>Norway</country>
                </postal>
                
                <phone>+47 22 85 24 44</phone>
                
                <email>steing@ifi.uio.no</email>
                
                <!-- uri and facsimile elements may also be added -->
            </address>
        </author>
        
        
        <author fullname="Michael Welzl" initials="M." surname="Welzl">
            <organization>University of Oslo</organization>
            
            <address>
                <postal>
                    <street>PO Box 1080 Blindern</street>
                    
                    <!-- Reorder these if your country does things differently -->
                    
                    <code>N-0316</code>
                    
                    <city>Oslo</city>
                    
                    <region></region>
                    
                    <country>Norway</country>
                </postal>
                
                <phone>+47 22 85 24 20</phone>
                
                <email>michawe@ifi.uio.no</email>
                
                <!-- uri and facsimile elements may also be added -->
            </address>
        </author>
        
        <!-- <date day="06" month="June" year="2015" /> -->
        <date year="2016" />
        
        <!-- If the month and year are both specified and are the current ones, xml2rfc will fill
         in the current day for you. If only the current year is specified, xml2rfc will fill
         in the current day and month for you. If the year is not the current one, it is
         necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the
         purpose of calculating the expiry date).  With drafts it is normally sufficient to
         specify just the year. -->
        
        <!-- Meta-data Declarations -->
        
        <area>Transport</area>
        
        <workgroup>TAPS</workgroup>
        
        <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.
         If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->
        
        <keyword>taps, transport services</keyword>
        
        <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->
        
        <abstract>
            <t>This draft recommends a minimal set of IETF Transport Services offered by end systems supporting TAPS, and gives guidance on choosing among the available mechanisms and protocols. It is based on the set of transport services given in the TAPS document draft-ietf-taps-transports-usage-00.</t>
        </abstract>
    </front>
    
    <middle>
        <!--    <section title="Definitions" anchor='sec-def'>
         <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
         "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
         document are to be interpreted as described in <xref
         target="RFC2119">RFC 2119</xref>.</t>
         
         <t><list style="hanging" hangIndent="6">
         <t hangText="Wha'ever:">
         <vspace />
         Wha'ever is short for Whatever.</t>
         </list></t>
         
         </section>
         -->
        
        <section anchor="sec-intro" title="Introduction">
            <t>An application has an intended usage and demands for transport services, and the task of any system that implements TAPS is to offer these services to its applications, i.e. the applications running on top of TAPS, without binding an application to a particular transport protocol.</t>
            
            
            
            <t>The present draft is based on <xref target="TAPS1"></xref> and  <xref target="TAPS2"></xref>  and follows the same terminology (also listed below). The purpose of these two drafts is, according to the TAPS charter, to "Define a set of Transport Services, identifying the
                services provided by existing IETF protocols and congestion
                control mechanisms." This is item 1 in the list of working group tasks.
                Also according to the TAPS charter, the working group will then "Specify the subset of those Transport Services, as identified
                in item 1, that end systems supporting TAPS will provide, and
                give guidance on choosing among available mechanisms and
                protocols. Note that not all the capabilities of IETF Transport
                protocols need to be exposed as Transport Services."
                Hence it is necessary to minimize the number of services that are offered. We begin this by grouping the transport service features.</t>
            
            
            
            
            <t>Following <xref target="TAPS2"></xref>, we divide the transport service features into two main groups as follows:
                <list style="numbers">
                    <t>CONNECTION related transport service features <vspace />
                        - ESTABLISHMENT<vspace />
                        - AVAILABILITY<vspace />
                        - MAINTENANCE<vspace />
                        - TERMINATION<vspace />
                    </t>
                    <t>DATA Transfer Related transport service features <vspace />
                        - Sending Data<vspace />
                        - Receiving Data<vspace />
                        - Errors<vspace />
                    </t>
                </list>
            </t>
            
            
            <t>Because QoS is out of scope of TAPS, this document assumes a "best effort" service
                model <xref target="RFC5290"></xref>, <xref target="RFC7305"></xref>. Applications using a TAPS system can therefore not make any assumptions
                about e.g. the time it will take to send a message. There are however certain requirements
                that are strictly kept by transport protocols today, and these must also be kept by a TAPS system.
                Some of these requirements relate to transport service features that we call "Functional".
            </t>
            
            
            <t>Functional transport service features provide functionality that cannot be used without the application knowing
                about them, or else they violate assumptions that might cause the application to fail.
                For example, unordered message delivery is a functional transport service feature: it cannot be used without
                the application knowing about it because the application's assumption could be that
                messages arrive in order.
            </t>
            
            <t>"Change DSCP" and "Disable Nagle algorithm" are what we call "Optimizing" transport service features:
                if a TAPS system autonomously decides to enable or disable them, an
                application will not fail, but a TAPS system may be able to
                communicate more efficiently if the application is in control of this
                optimizing transport service feature.  "Change DSCP" and "Disable Nagle algorithm" are examples of
                transport service features that require application-specific knowledge (about delay/bandwidth
                requirements and the length of future data
                blocks that are to be transmitted, respectively).
            </t>
            
            <t>To summarize, transport service features that this memo recommends to offer to applications are divided into two groups as follows:
                <list style="symbols">
                    <t>Functional<vspace />
                        This transport service feature has to be specified by the application, since if not, it cannot be used or the application logic may break.</t>
                    <t>Optimizing <vspace />
                        This transport service feature may be specified by the application, and when specified can optimize the performance of the application.</t>
                </list>
            </t>
            
            <t>
                The transport service features of IETF transport protocols that are not exposed to the TAPS user because they include
                functionality that could be transparently utilized by a TAPS system are called "Automatable".
            </t>
            
            
            <t>
                Finally, some transport service features are aggregated or slightly changed in the TAPS API. These transport service features are marked as "ADDED". The corresponding transport service feature(s) is/are automatable, and they are listed immediately below the "ADDED" transport service feature.
            </t>
            
            
            <t>
                This document also sketches how some of the TAPS transport services can be implemented. Wherever it is not obvious how to implement a service
                via TCP or UDP [**UDP: NOT YET**], a brief discussion is included.
                IETF transport services are
                presented following the nomenclature "CATEGORY.[SUBCATEGORY].SERVICENAME.PROTOCOL".
            </t>
        </section>
        
        
        <section title="Terminology">
            
            <t>The following terms are used throughout this document, and in
                subsequent documents produced by TAPS that describe the composition and
                decomposition of transport services.</t>
            
            <t><list style="hanging">
                <t hangText='Transport Service Feature:'>
                    a specific end-to-end feature that the transport layer provides to
                    an application. Examples include confidentiality, reliable delivery, ordered
                    delivery, message-versus-stream orientation, etc.</t>
                <t hangText='Transport Service:'>
                    a set of Transport Features, without an association to any given
                    framing protocol, which provides a complete service to an application.</t>
                <t hangText='Transport Protocol:'>
                    an implementation that provides one or more different transport services
                    using a specific framing and header format on the wire.</t>
                <t hangText='Transport Service Instance:'>
                    an arrangement of transport protocols with a selected set of features
                    and configuration parameters that implements a single transport service,
                    e.g., a protocol stack (RTP over UDP).</t>
                <t hangText='Application:'>
                    an entity that uses the transport layer for end-to-end delivery data
                    across the network (this may also be an upper layer protocol or tunnel
                    encapsulation).</t>
                <t hangText='Application-specific knowledge:'>
                    knowledge that only applications have.</t>
                <t hangText='Endpoint:'>
                    an entity that communicates with one or more other endpoints using
                    a transport protocol.</t>
                <t hangText='Connection:'>
                    shared state of two or more endpoints that persists
                    across messages that are transmitted between these endpoints.</t>
                <t hangText='Socket:'>
                    the combination of a destination IP address and a destination port number.</t>
            </list></t>
            
        </section>
        
        
        
        
        <section anchor="super" title="The Superset of Transport Service Features">
            
            <t>
                This section is based on the classification of the transport service features in
                pass 3 of <xref target="TAPS2"></xref>.
                
<!--
 Old text:
 As noted earlier, whether the usage of
                automatable transport service features can be automatized in a TAPS system depends on
                how much network-specific information an application wants to manipulate.
 -->
                For every transport service feature, a brief explanation of the classification is
                provided. Some more general decisions affect multiple transport service features (e.g.
                the decision that multi-streaming is automatable); the rationale for such decisions
                is provided in <xref target="Discussion"/>.
            </t>
            
            <t>
                
            </t>
            
            <section anchor="conn-super" title="CONNECTION Related Transport Service Features">
                
                <t>ESTABLISHMENT:<vspace />
                    
                    <list style="symbols">
                        <t>Connect <vspace />
                            Protocols: TCP, SCTP <vspace />
                            Functional because the notion of a connection is often reflected in applications
                            as an expectation to be able to communicate after a "Connect" succeeded,
                            with a communication sequence relating to this transport service feature that is defined by the
                            application protocol.<vspace />
                            Implementation: via CONNECT.TCP or CONNECT.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        
                        <t>Specify IP Options<vspace />
                            Protocols: TCP<vspace />
                            Automatable because IP Options relate to knowledge about the network, not the application.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Request multiple streams<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because using multi-streaming does not require application-specific knowledge.<vspace />
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                        <t>Obtain multiple sockets<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because the usage of multiple paths to communicate to the same end host relates to knowledge about
                            the network, not the application.<vspace />
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                    </list></t>
                
                <t>AVAILABILITY:<vspace />
                    
                    <list style="symbols">
                        <t>Listen<vspace />
                            Protocols: All<vspace />
                            Functional because the notion of accepting connection requests is often reflected
                            in applications as an expectation to be able to communicate after a "Listen" succeeded,
                            with a communication sequence relating to this transport service feature that is defined by the
                            application protocol.<vspace />
                            ADDED. This differs from the 3 automatable transport service features below in that it leaves the choice
                            of interfaces for listening open.<vspace />
                            Implementation: by listening on all interfaces via LISTEN.TCP (not providing a local IP address)
                            or LISTEN.SCTP (providing SCTP port number / address pairs for all local IP addresses).<vspace blankLines='1'/>
                        </t>
                        <t>Listen, 1 specified local interface<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Automatable because decisions about local interfaces relate to knowledge about the
                            network and the Operating System, not the application.<vspace />
                        </t>
                        <t>Listen, N specified local interfaces<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because decisions about local interfaces relate to knowledge about the
                            network and the Operating System, not the application.<vspace />
                        </t>
                        <t>Listen, all local interfaces<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Automatable because decisions about local interfaces relate to knowledge about the
                            network and the Operating System, not the application.<vspace />
                        </t>
                        <t>Obtain requested number of streams<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because using multi-streaming does not require application-specific knowledge.<vspace />
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                    </list></t>
                
                <t>MAINTENANCE:<vspace />
                    
                    <list style="symbols">
                        <t>Change timeout for aborting connection (using retransmit limit or time value)<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Functional because this is closely related to potentially assumed reliable data delivery.<vspace />
                            Implementation: via CHANGE-TIMEOUT.TCP or CHANGE-TIMEOUT.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Control advertising timeout for aborting connection to remote endpoint<vspace />
                            Protocols: TCP<vspace />
                            Functional because this is closely related to potentially assumed reliable data delivery.<vspace />
                            Implementation: via CHANGE-TIMEOUT.TCP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Disable Nagle algorithm<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Optimizing because this decision depends on knowledge about the size of future data blocks
                            and the delay between them.<vspace />
                            Implementation: via DISABLE-NAGLE.TCP and [**Not yet included in <xref target="TAPS2"/> FOR SCTP**].<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Request an immediate heartbeat, returning success/failure<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because this informs about network-specific knowledge.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Set protocol parameters<vspace />
                            Protocols: SCTP<vspace />
                            SCTP parameters: RTO.Initial; RTO.Min;
                            RTO.Max; Max.Burst; RTO.Alpha; RTO.Beta; Valid.Cookie.Life;
                            Association.Max.Retrans; Path.Max.Retrans; Max.Init.Retransmits;
                            HB.interval; HB.Max.Burst<vspace />
                            Automatable because these parameters relate to knowledge about
                            the network, not the application.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Notification of Excessive Retransmissions (early warning below abortion threshold)<vspace />
                            Protocols: TCP<vspace />
                            Optimizing because it is an early warning to the application, informing it of an impending
                            functional event.<vspace />
                            Implementation: via ERROR.TCP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Notification of ICMP error message arrival<vspace />
                            Protocols: TCP<vspace />
                            Optimizing because these messages can inform about success or failure of functional
                            transport service features
                            (e.g., host unreachable relates to "Connect")<vspace />
                            Implementation: via ERROR.TCP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Status (query or notification)<vspace />
                            Protocols: SCTP<vspace />
                            SCTP parameters: association
                            connection state; socket list; socket reachability states;
                            current receiver window size; current congestion
                            window sizes; number of unacknowledged DATA chunks; number of DATA chunks
                            pending receipt; primary path; most recent SRTT on primary path; RTO on
                            primary path; SRTT and RTO on other destination addresses;
                            socket becoming active / inactive<vspace />
                            Automatable because these parameters relate to knowledge about
                            the network, not the application.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Set primary path<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because it requires using multiple sockets, but
                            obtaining multiple sockets in the CONNECTION.ESTABLISHMENT category is
                            automatable.<vspace />
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                        <t>Change DSCP<vspace />
                            Protocols: TCP<vspace />
                            Optimizing because choosing a suitable DSCP value requires application-specific knowledge.<vspace />
                            Implementation: via CHANGE-DSCP.TCP and [**Not yet included in <xref target="TAPS2"/> FOR SCTP**]<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        
                    </list></t>
                
                <t>TERMINATION:<vspace />
                    
                    <list style="symbols">
                        <t>Close after reliably delivering all remaining data, causing an event informing the application on the other side<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Functional because the notion of a connection is often reflected in applications
                            as an expectation to have all outstanding data delivered and no longer be able
                            to communicate after a "Close" succeeded,
                            with a communication sequence relating to this transport service feature that is defined by the
                            application protocol.<vspace />
                            Implementation: via CLOSE.TCP and CLOSE.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Abort without delivering remaining data, causing an event informing the application on the other side<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Functional because the notion of a connection is often reflected in applications
                            as an expectation to potentially not have all outstanding data delivered and no longer be able
                            to communicate after an "Abort" succeeded,
                            with a communication sequence relating to this transport service feature that is defined by the
                            application protocol.<vspace />
                            Implementation: via ABORT.TCP and ABORT.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Timeout event when data could not be delivered for too long<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Functional because this notifies that potentially assumed reliable data delivery is no longer provided.
                            Implementation: via TIMEOUT.TCP and TIMEOUT.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        
                    </list></t>
                
            </section>
            
            
            <section anchor="data-pass3" title="DATA Transfer Related Transport Service Features">
                
                
                <section anchor="data-sending-pass3" title="Sending Data">
                    
                    <t><list style="symbols">
                        <t>Reliably transfer data<vspace />
                            Protocols: TCP, SCTP<vspace />
                            Functional because this is closely tied to properties of the data that an application
                            sends or expects to receive.<vspace />
                            Implementation: via SEND.TCP and SEND.SCTP.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Message identification<vspace />
                            Protocols: SCTP<vspace />
                            Functional because this is closely tied to properties of the data that an application
                            sends or expects to receive.<vspace />
                            Implementation: via SEND.SCTP.<vspace />
                            Fall-back to TCP: By using SEND.TCP and providing a means to let the application
                            query whether messages can be identified or not.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Choice of stream<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because it requires using multiple streams, but
                            requesting multiple streams in the CONNECTION.ESTABLISHMENT category is
                            automatable.
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                        <t>Choice of path (destination address)<vspace />
                            Protocols: SCTP<vspace />
                            Automatable because it requires using multiple sockets, but
                            obtaining multiple sockets in the CONNECTION.ESTABLISHMENT category is
                            automatable.
                            Implementation: see <xref target="Discussion"/>.
                            <vspace blankLines='1'/>
                        </t>
                        <t>Message lifetime<vspace />
                            Protocols: SCTP<vspace />
                            Optimizing because only applications know about the time criticality of their communication.<vspace />
                            Implementation: via SEND.SCTP.<vspace />
                            Fall-back to TCP: By using SEND.TCP and ignoring the lifetime request:
                            based on the assumption of the best-effort
                            service model, unnecessarily delivering data does
                            not violate application expectations. Moreover, it is not possible to associate the requested
                            lifetime to a "message" in TCP anyway.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Choice between unordered (potentially faster) or ordered delivery of messages<vspace />
                            Protocols: SCTP<vspace />
                            Functional because this is closely tied to properties of the data that an application
                            sends or expects to receive.<vspace />
                            Implementation: via SEND.SCTP.<vspace />
                            Fall-back to TCP: By using SEND.TCP and always sending data ordered:
                            based on the assumption of the best-effort
                            service model, ordered delivery may just be slower and does
                            not violate application expectations. Moreover, it is not possible to associate the requested
                            delivery order to a "message" in TCP anyway.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Request not to bundle messages<vspace />
                            Protocols: SCTP<vspace />
                            Optimizing because this decision depends on knowledge about the size of future data blocks
                            and the delay between them.<vspace />
                            Implementation: via SEND.SCTP.<vspace />
                            Fall-back to TCP: By using SEND.TCP and DISABLE-NAGLE.TCP to disable the Nagle algorithm when
                            the request is made and enable it again when the request is no longer made.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                        <t>Specifying a "payload protocol-id" (handed over as such by the receiver)<vspace />
                            Protocols: SCTP<vspace />
                            Functional because it allows to send extra application data with every message, for the sake
                            of identification of data, which by itself is application-specific.<vspace />
                            Implementation: SEND.SCTP.<vspace />
                            Fall-back to TCP: Not possible.<vspace />
                            <vspace blankLines='1'/>
                        </t>
                    </list></t>
                    
                    
                </section>
                
                <section anchor="data-receiving-pass3" title="Receiving Data">
                    
                    <t>
                        <list style="symbols">
                            <t>Receive data<vspace />
                                Protocols: TCP, SCTP<vspace />
                                Functional because a TAPS system must be able to send and receive data.<vspace />
                                Implementation: via RECEIVE.SCTP and RECEIVE.TCP <vspace />
                                <vspace blankLines='1'/>
                            </t>
                            <t>Choice of stream to receive from<vspace />
                                Protocols: SCTP<vspace />
                                Automatable because it requires using multiple streams, but
                                requesting multiple streams in the CONNECTION.ESTABLISHMENT category is
                                automatable.<vspace />
                                Implementation: see <xref target="Discussion"/>.
                                <vspace blankLines='1'/>
                            </t>
                            <t>Message identification<vspace />
                                Protocols: SCTP<vspace />
                                Functional because this is closely tied to properties of the data that an application
                                sends or expects to receive.<vspace />
                                Implementation: via RECEIVE.SCTP.<vspace />
                                Fall-back to TCP: By using RECEIVE.TCP and providing a means to let the application
                                query whether messages can be identified or not.<vspace />
                                <vspace blankLines='1'/>
                            </t>
                            <t>Information about partial message arrival<vspace />
                                Protocols: SCTP<vspace />
                                Functional because this is closely tied to properties of the data that an application
                                sends or expects to receive.<vspace />
                                Implementation: via RECEIVE.SCTP.<vspace />
                                Fall-back to TCP: Not possible (do not provide this event).<vspace />
                                <vspace blankLines='1'/>
                            </t>
                        </list>
                    </t>
                </section>
                
                
                <section anchor="data-errors-pass3" title="Errors">
                    
                    <t>
                        <list style="symbols">
                            <t>Notification of send failures<vspace />
                                Protocols: TCP, SCTP<vspace />
                                Functional because this notifies that potentially assumed reliable data delivery is no longer provided.<vspace />
                                ADDED. This differs from the 2 automatable transport service features below in that it does not distinugish between
                                unsent and unacknowledged messages.<vspace />
                                Implementation: via SENDFAILURE-EVENT.SCTP.<vspace />
                                Fall-back to TCP: Not possible (do not provide this event).<vspace blankLines='1'/>
                            </t>
                            <t>Notification of unsent messages<vspace />
                                Protocols: SCTP<vspace />
                                Automatable because the distinction between unsent and unacknowledged is network-specific. <vspace />
                            </t>
                            <t>Notification of unacknowledged messages<vspace />
                                Protocols: SCTP<vspace />
                                Automatable because the distinction between unsent and unacknowledged is network-specific. <vspace />
                            </t>
                        </list>
                    </t>
                </section>
                
            </section>
            
        </section>
        
        
        
        
        
        <section anchor="Discussion" title="Discussion">
            
            <t>Some of transport service features in <xref target="super"/> were designated as "automatable"
                on the basis of a broader decision that affects multiple transport
                service features. These decisions are explained here:
                <list style="symbols">
                    <t>All transport service features that are related to multi-streaming were removed.
                        The decision on whether to use multi-streaming or not does not depend on application-specific
                        knowledge. This means that a connection that is exhibited to an application could be
                        implemented by using a single stream of an SCTP association instead of mapping it to
                        a complete SCTP association. This could be achieved by using more than one stream when
                        an SCTP association is first established (CONNECT.SCTP parameter "outbound stream count"),
                        an internal stream number could be maintained by the TAPS system, and this stream number
                        would then be used when sending data (SEND.SCTP parameter "stream number"). Closing or aborting
                        a connection could then simply free the stream number for future use.
                    </t>
                    <t>All transport service features that are related to usage of multiple paths or the choice
                        of the network interface were removed. Choosing a path or an interface does not depend
                        on application-specific knowledge. For example, "Listen" could always listen on all available
                        interfaces and "Connect" could use the default interface for the destination IP address.
                    </t>
                </list>
            </t>
            
            
            
        </section>
        
        <section anchor="Conclusion" title="Conclusion">
            
            <t>By decoupling applications from transport protocols, a TAPS system provides a different abstraction level
                than the Berkeley sockets interface. As with high- vs. low-level programming languages, a higher abstraction
                level allows more freedom for automatization below the interface, yet it takes some control away from
                the application programmer. This is the design trade-off that a TAPS system developer is facing, and
                this document provides guidance on the design of this abstraction level. Some transport service features
                are currently rarely offered by APIs, yet they must be offered or they can never be used ("functional" transport
                service features). Other transport service features are offered by the APIs of the protocols covered here,
                but not exposing them in a TAPS API would allow for more freedom to automate protocol usage in a TAPS system.
            </t>
            
            <t>The eventual recommendations are:
                <list style="symbols">
                    <t>A TAPS system should expose all functional transport service features that are
                        offered by the transport protocols that it uses because these transport service features could otherwise
                        not be utilized by the TAPS system. It can still be possible to implement a TAPS system
                        that does not offer all functional transport service features, e.g. for the sake of uniform application
                        operation across a broader set of protocols, but then the corresponding functionality of
                        transport protocols is not exploited. If a protocol that provides a functional transport service feature
                        is not available, a TAPS system should automatically fall back to a different protocol (e.g. TCP
                        or UDP) whenever possible to reduce the potential for protocol dependence in applications.</t>
                    <t>A TAPS system should exhibit all application-specific optimizing transport service features. If an
                        application-specific optimizing transport service feature is only available in a subset of the transport
                        protocols used by the TAPS system, it should be acceptable for the TAPS system
                        to ignore its usage when the transport protocol that is currently used does not
                        provide it because
                        of the performance-optimizing nature of the transport service feature and the initially mentioned
                        assumption of "best effort" operation.
                    </t>
                    <t>By hiding automatable transport service features from the application, a TAPS system can
                        gain opportunities
                        to automatize network-related functionality. This can facilitate using the TAPS system
                        for the application programmer and it allows for optimizations that may not be possible
                        for an application. For instance, a kernel-level TAPS system that hides SCTP
                        multi-streaming from applications could theoretically map application-level connections
                        from multiple
                        applications onto the same SCTP association. Similarly, system-wide configurations
                        regarding the usage of multiple interfaces could be exploited if the choice of the
                        interface is not given to the application. However, if an application wants to
                        directly expose such choices to its user, not offering this functionality can become a
                        disadvantage of a TAPS system. This is a trade-off that must be considered
                        in TAPS system design.</t>
                </list>
            </t>
        </section>
        
        <!--   </section>   -->
        
        
        <section anchor="Acknowledgements" title="Acknowledgements">
            <t>This work has received funding from the European Union's Horizon 2020 research
                and innovation programme under grant agreement No. 644334 (NEAT). The views expressed are solely those of the author(s).</t>
            
        </section>
        
        <!-- Possibly a 'Contributors' section ... -->
        
        <section anchor="IANA" title="IANA Considerations">
            <t>XX RFC ED - PLEASE REMOVE THIS SECTION XXX</t>
            
            <t>This memo includes no request to IANA.</t>
        </section>
        
        <section anchor="Security" title="Security Considerations">
            <t>Security will be considered in future versions of this document.</t>
        </section>
        
    </middle>
    
    <!--  *****BACK MATTER ***** -->
    
    <back>
        <!-- References split into informative and normative -->
        
        <!-- There are 2 ways to insert reference entries from the citation libraries:
         1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
         2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
         (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")
         
         Both are cited textually in the same manner: by using xref elements.
         If you use the PI option, xml2rfc will, by default, try to find included files in the same
         directory as the including file. You can also define the XML_LIBRARY environment variable
         with a value containing a set of directories to search.  These can be either in the local
         filing system or remote ones accessed by http (http://domain/dir/... ).-->
        
        <!--
         <references title="Normative References">
         
         </references>
         -->
        
        <references title="Informative References">
            <!--&RFC2119;-->
            
            &RFC5290;
            &RFC7305;
            
            
            
            <reference anchor="TAPS1" target="">
                <front>
                    <title>Services provided by IETF transport protocols and congestion control mechanisms</title>
                    
                    <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"></author>
                    
                    <author fullname="B. Trammell" initials="B." surname="Trammell"></author>
                    
                    <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"></author>
                    
                    <date month="July" year="2016" />
                </front>
                
                <seriesInfo name="Internet-draft"
                value="draft-ietf-taps-transports-11" />
            </reference>
            
            
            
            <reference anchor="TAPS2" target="">
                <front>
                    <title>An Approach to Identify Services Provided by IETF Transport Protocols and Congestion Control Mechanisms</title>
                    
                    <author fullname="Michael Welzl" initials="M." surname="Welzl"></author>
                    
                    <author initials="M." surname="Tuexen" fullname="Michael Tuexen"></author>
                    
                    <author fullname="Naeem Khademi" initials="N." surname="Khademi"></author>
                    
                    <date month="June" year="2015" />
                </front>
                
                <seriesInfo name="Internet-draft"
                value="draft-ietf-taps-transports-usage-00" />
            </reference>
            
        </references>
        
        
        
        <!-- Change Log
         v00 2006-03-15  EBD   Initial version
         
         -->
        
        <section title="Revision information">
            <t>   XXX RFC-Ed please remove this section prior to publication.</t>
            
            <t>-02: implementation suggestions added, discussion section added, terminology extended, DELETED category removed,
                various other fixes; list of Transport Service Features adjusted to -01 version of
                <xref target="TAPS2"/> except that MPTCP is not included.</t>
        </section>


    </back>
</rfc>
