diff options
Diffstat (limited to 'doc/rfc/rfc8303.txt')
-rw-r--r-- | doc/rfc/rfc8303.txt | 3139 |
1 files changed, 3139 insertions, 0 deletions
diff --git a/doc/rfc/rfc8303.txt b/doc/rfc/rfc8303.txt new file mode 100644 index 0000000..94f24d0 --- /dev/null +++ b/doc/rfc/rfc8303.txt @@ -0,0 +1,3139 @@ + + + + + + +Internet Engineering Task Force (IETF) M. Welzl +Request for Comments: 8303 University of Oslo +Category: Informational M. Tuexen +ISSN: 2070-1721 Muenster Univ. of Appl. Sciences + N. Khademi + University of Oslo + February 2018 + + + On the Usage of Transport Features + Provided by IETF Transport Protocols + +Abstract + + 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. + +Status of This Memo + + This document is not an Internet Standards Track specification; it is + published for informational purposes. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Not all documents + approved by the IESG are a candidate for any level of Internet + Standard; see Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8303. + + + + + + + + + + + +Welzl, et al. Informational [Page 1] + +RFC 8303 Transport Services February 2018 + + +Copyright Notice + + Copyright (c) 2018 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + +Table of Contents + + 1. Introduction ....................................................3 + 2. Terminology .....................................................5 + 3. Pass 1 ..........................................................6 + 3.1. Primitives Provided by TCP .................................6 + 3.1.1. Excluded Primitives or Parameters ...................9 + 3.2. Primitives Provided by MPTCP ..............................10 + 3.3. Primitives Provided by SCTP ...............................11 + 3.3.1. Excluded Primitives or Parameters ..................18 + 3.4. Primitives Provided by UDP and UDP-Lite ...................18 + 3.5. The Service of LEDBAT .....................................19 + 4. Pass 2 .........................................................20 + 4.1. CONNECTION-Related Primitives .............................21 + 4.2. DATA-Transfer-Related Primitives ..........................38 + 5. Pass 3 .........................................................41 + 5.1. CONNECTION-Related Transport Features .....................41 + 5.2. DATA-Transfer-Related Transport Features ..................47 + 5.2.1. Sending Data .......................................47 + 5.2.2. Receiving Data .....................................48 + 5.2.3. Errors .............................................49 + 6. IANA Considerations ............................................49 + 7. Security Considerations ........................................49 + 8. References .....................................................50 + 8.1. Normative References ......................................50 + 8.2. Informative References ....................................52 + Appendix A. Overview of RFCs Used as Input for Pass 1 .............54 + Appendix B. How This Document Was Developed .......................54 + Acknowledgements ..................................................56 + Authors' Addresses ................................................56 + + + + + + +Welzl, et al. Informational [Page 2] + +RFC 8303 Transport Services February 2018 + + +1. Introduction + + This specification describes how transport protocols offer transport + services, such that applications using them are no longer directly + tied to a specific protocol. Breaking this strict connection can + reduce the effort for an application programmer, yet attain greater + transport flexibility by pushing complexity into an underlying + transport services (TAPS) system. + + This design process has started with a survey of the services + provided by IETF transport protocols and congestion control + mechanisms [RFC8095]. The present document and [RFC8304] complement + this survey with an in-depth look at the defined interactions between + applications and the following unicast 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). We also define a + primitive to enable/disable and configure the Low Extra Delay + Background Transport (LEDBAT) unicast congestion control mechanism. + For UDP and UDP-Lite, the first step of the protocol analysis -- a + discussion of relevant RFC text -- is documented in [RFC8304]. + + This snapshot in time of the IETF transport protocols is published as + an RFC to document the analysis by the authors and the TAPS Working + Group; this generates a set of transport abstractions that can be + exported in a TAPS API. It provides the basis for the minimal set of + transport services that end systems supporting TAPS should implement + [TAPS-MINSET]. + + The list of primitives, events, and transport features in this + document is strictly based on the parts of protocol specifications + that describe what the protocol provides to an application using it + and how the application interacts with it. Transport protocols + provide communication between processes that operate on network + endpoints, which means that they allow for multiplexing of + communication between the same IP addresses, and this multiplexing is + achieved using port numbers. Port multiplexing is therefore assumed + to be always provided and not discussed in this document. + + Parts of a protocol that are explicitly stated as optional to + implement are not covered. Interactions between the application and + a transport protocol that are not directly related to the operation + of the protocol are also not covered. For example, there are various + ways for an application to use socket options to indicate its + interest in receiving certain notifications [RFC6458]. However, for + the purpose of identifying primitives, events, and transport + features, the ability to enable or disable the reception of + notifications is irrelevant. Similarly, "one-to-many style sockets" + + + +Welzl, et al. Informational [Page 3] + +RFC 8303 Transport Services February 2018 + + + [RFC6458] just affect the application programming style, not how the + underlying protocol operates, and they are therefore not discussed + here. The same is true for the ability to obtain the unchanged value + of a parameter that an application has previously set (e.g., via + "get" in get/set operations [RFC6458]). + + The document presents a three-pass process to arrive at a list of + transport features. In the first pass (pass 1), the relevant RFC + text is discussed per protocol. In the second pass (pass 2), this + discussion is used to derive a list of primitives and events that are + uniformly categorized across protocols. Here, an attempt is made to + present or -- where text describing primitives or events does not yet + exist -- construct primitives or events in a slightly generalized + form to highlight similarities. This is, for example, achieved by + renaming primitives or events of protocols or by avoiding a strict + 1:1 mapping between the primitives or events in the protocol + specification and primitives or events in the list. Finally, the + third pass (pass 3) presents transport features based on pass 2, + identifying which protocols implement them. + + In the list resulting from the second pass, some transport features + are missing because they are implicit in some protocols, and they + only become explicit when we consider the superset of all transport + features offered by all protocols. For example, TCP always carries + out congestion control; we have to consider it together with a + protocol like UDP (which does not have congestion control) before we + can consider congestion control as a transport feature. The complete + list of transport features across all protocols is therefore only + available after pass 3. + + Some protocols are connection oriented. Connection-oriented + protocols often use an initial call to a specific primitive to open a + connection before communication can progress and require + communication to be explicitly terminated by issuing another call to + a primitive (usually called 'Close'). A "connection" is the common + state that some transport primitives refer to, e.g., to adjust + general configuration settings. Connection establishment, + maintenance, and termination are therefore used to categorize + transport primitives of connection-oriented transport protocols in + pass 2 and pass 3. For this purpose, UDP is assumed to be used with + "connected" sockets, i.e., sockets that are bound to a specific pair + of addresses and ports [RFC8304]. + + + + + + + + + +Welzl, et al. Informational [Page 4] + +RFC 8303 Transport Services February 2018 + + +2. Terminology + + Transport 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. + + Transport Service: a set of transport features, without an + association to any given framing protocol, which provides a + complete service to an application. + + Transport Protocol: an implementation that provides one or more + transport services using a specific framing and header format on + the wire. + + Transport Protocol Component: an implementation of a transport + feature within a protocol. + + Transport Service Instance: an arrangement of transport protocols + with a selected set of features and configuration parameters that + implement a single transport service, e.g., a protocol stack (RTP + over UDP). + + Application: an entity that uses the transport layer for end-to-end + delivery of data across the network (this may also be an upper- + layer protocol or tunnel encapsulation). + + Endpoint: an entity that communicates with one or more other + endpoints using a transport protocol. + + Connection: shared state of two or more endpoints that persists + across messages that are transmitted between these endpoints. + + Primitive: a function call that is used to locally communicate + between an application and a transport endpoint. A primitive is + related to one or more transport features. + + Event: a primitive that is invoked by a transport endpoint. + + Parameter: a value passed between an application and a transport + protocol by a primitive. + + Socket: the combination of a destination IP address and a + destination port number. + + Transport Address: the combination of an IP address, transport + protocol, and the port number used by the transport protocol. + + + + +Welzl, et al. Informational [Page 5] + +RFC 8303 Transport Services February 2018 + + +3. Pass 1 + + This first iteration summarizes the relevant text parts of the RFCs + describing the protocols, focusing on what each transport protocol + provides to the application and how it is used (abstract API + descriptions, where they are available). When presenting primitives, + events, and parameters, the use of lower- and upper-case characters + is made uniform for the sake of readability. + +3.1. Primitives Provided by TCP + + The initial TCP specification [RFC0793] states: + + The Transmission Control Protocol (TCP) is intended for use as a + highly reliable host-to-host protocol between hosts in packet- + switched computer communication networks, and in interconnected + systems of such networks. + + Section 3.8 of [RFC0793] further specifies the interaction with the + application by listing several transport primitives. It is also + assumed that an Operating System provides a means for TCP to + asynchronously signal the application; the primitives representing + such signals are called 'events' in this section. This section + describes the relevant primitives. + + Open: This is either active or passive, to initiate a connection or + listen for incoming connections. All other primitives are + associated with a specific connection, which is assumed to first + have been opened. An active open call contains a socket. A + passive open call with a socket waits for a particular connection; + alternatively, a passive open call can leave the socket + unspecified to accept any incoming connection. A fully specified + passive call can later be made active by calling 'Send'. + Optionally, a timeout can be specified, after which TCP will abort + the connection if data has not been successfully delivered to the + destination (else a default timeout value is used). A procedure + for aborting the connection is used to avoid excessive + retransmissions, and an application is able to control the + threshold used to determine the condition for aborting; this + threshold may be measured in time units or as a count of + retransmission [RFC1122]. This indicates that the timeout could + also be specified as a count of retransmission. + + Also optional, for multihomed hosts, the local IP address can be + provided [RFC1122]. If it is not provided, a default choice will + be made in case of active open calls. A passive open call will + await incoming connection requests to all local addresses and then + maintain usage of the local IP address where the incoming + + + +Welzl, et al. Informational [Page 6] + +RFC 8303 Transport Services February 2018 + + + connection request has arrived. Finally, the 'options' parameter + allows the application to specify IP options such as Source Route, + Record Route, or Timestamp [RFC1122]. It is not stated on which + segments of a connection these options should be applied, but + probably on all segments, as this is also stated in a + specification given for the usage of the Source Route IP option + (Section 4.2.3.8 of [RFC1122]). Source Route is the only non- + optional IP option in this parameter, allowing an application to + specify a source route when it actively opens a TCP connection. + + Master Key Tuples (MKTs) for authentication can optionally be + configured when calling 'Open' (Section 7.1 of [RFC5925]). When + authentication is in use, complete TCP segments are authenticated, + including the TCP IPv4 pseudoheader, TCP header, and TCP data. + + TCP Fast Open (TFO) [RFC7413] allows applications to immediately + hand over a message from the active open to the passive open side + of a TCP connection together with the first message establishment + packet (the SYN). This can be useful for applications that are + sensitive to TCP's connection setup delay. [RFC7413] states that + "TCP implementations MUST NOT use TFO by default, but only use TFO + if requested explicitly by the application on a per-service-port + basis." The size of the message sent with TFO cannot be more than + TCP's maximum segment size (minus options used in the SYN). For + the active open side, it is recommended to change or replace the + connect() call in order to support a user data buffer argument + [RFC7413]. For the passive open side, the application needs to + enable the reception of Fast Open requests, e.g., via a new + TCP_FASTOPEN setsockopt() socket option before listen(). The + receiving application must be prepared to accept duplicates of the + TFO message, as the first data written to a socket can be + delivered more than once to the application on the remote host. + + Send: This is the primitive that an application uses to give the + local TCP transport endpoint a number of bytes that TCP should + reliably send to the other side of the connection. The 'urgent' + flag, if set, states that the data handed over by this send call + is urgent and this urgency should be indicated to the receiving + process in case the receiving application has not yet consumed all + non-urgent data preceding it. An optional timeout parameter can + be provided that updates the connection's timeout (see 'Open'). + Additionally, optional parameters allow the ability to indicate + the preferred outgoing MKT (current_key) and/or the preferred + incoming MKT (rnext_key) of a connection (Section 7.1 of + [RFC5925]). + + + + + + +Welzl, et al. Informational [Page 7] + +RFC 8303 Transport Services February 2018 + + + Receive: This primitive allocates a receiving buffer for a provided + number of bytes. It returns the number of received bytes provided + in the buffer when these bytes have been received and written into + the buffer by TCP. The application is informed of urgent data via + an 'urgent' flag: if it is on, there is urgent data; if it is off, + there is no urgent data or this call to 'Receive' has returned all + the urgent data. The application is also informed about the + current_key and rnext_key information carried in a recently + received segment via an optional parameter (Section 7.1 of + [RFC5925]). + + Close: This primitive closes one side of a connection. It is + semantically equivalent to "I have no more data to send" but does + not mean "I will not receive any more", as the other side may + still have data to send. This call reliably delivers any data + that has already been given to TCP (and if that fails, 'Close' + becomes 'abort'). + + Abort: This primitive causes all pending 'Send' and 'Receive' calls + to be aborted. A TCP "RESET" message is sent to the TCP endpoint + on the other side of the connection [RFC0793]. + + Close Event: TCP uses this primitive to inform an application that + the application on the other side has called the 'Close' + primitive, so the local application can also issue a 'Close' and + terminate the connection gracefully. See [RFC0793], Section 3.5. + + Abort Event: When TCP aborts a connection upon receiving a "RESET" + from the peer, it "advises the user and goes to the CLOSED state." + See [RFC0793], Section 3.4. + + User Timeout Event: This event is executed when the user timeout + (Section 3.9 of [RFC0793]) expires (see the definition of 'Open' + in this section). All queues are flushed, and the application is + informed that the connection had to be aborted due to user + timeout. + + Error_Report event: This event informs the application of "soft + errors" that can be safely ignored [RFC5461], including the + arrival of an ICMP error message or excessive retransmissions + (reaching a threshold below the threshold where the connection is + aborted). See Section 4.2.4.1 of [RFC1122]. + + Type-of-Service: Section 4.2.4.2 of the requirements for Internet + hosts [RFC1122] states that "The application layer MUST be able to + specify the Type-of-Service (TOS) for segments that are sent on a + connection." The application should be able to change the TOS + during the connection lifetime, and the TOS value should be passed + + + +Welzl, et al. Informational [Page 8] + +RFC 8303 Transport Services February 2018 + + + to the IP layer unchanged. Since then, the TOS field has been + redefined. The Differentiated Services (Diffserv) model [RFC2475] + [RFC3260] replaces this field in the IP header, assigning the six + most significant bits to carry the Differentiated Services Code + Point (DSCP) field [RFC2474]. + + Nagle: The Nagle algorithm delays sending data for some time to + increase the likelihood of sending a full-sized segment + (Section 4.2.3.4 of [RFC1122]). An application can disable the + Nagle algorithm for an individual connection. + + User Timeout Option: The User Timeout Option (UTO) [RFC5482] allows + one end of a TCP connection to advertise its current user timeout + value so that the other end of the TCP connection can adapt its + own user timeout accordingly. In addition to the configurable + value of the user timeout (see 'Send'), there are three per- + connection state variables that an application can adjust to + control the operation of the UTO: 'adv_uto' is the value of the + UTO advertised to the remote TCP peer (default: system-wide + default user timeout); 'enabled' (default false) is a boolean-type + flag that controls whether the UTO option is enabled for a + connection. This applies to both sending and receiving. + 'changeable' is a boolean-type flag (default true) that controls + whether the user timeout may be changed based on a UTO option + received from the other end of the connection. 'changeable' + becomes false when an application explicitly sets the user timeout + (see 'Send'). + + Set/Get Authentication Parameters: The preferred outgoing MKT + (current_key) and/or the preferred incoming MKT (rnext_key) of a + connection can be configured. Information about current_key and + rnext_key carried in a recently received segment can be retrieved + (Section 7.1 of [RFC5925]). + +3.1.1. Excluded Primitives or Parameters + + The 'Open' primitive can be handed optional precedence or security/ + compartment information [RFC0793], but this was not included here + because it is mostly irrelevant today [RFC7414]. + + The 'Status' primitive was not included because the initial TCP + specification describes this primitive as "implementation dependent" + and states that it "could be excluded without adverse effect" + [RFC0793]. Moreover, while a data block containing specific + information is described, it is also stated that not all of this + information may always be available. While [RFC5925] states that + 'Status' "SHOULD be augmented to allow the MKTs of a current or + pending connection to be read (for confirmation)", the same + + + +Welzl, et al. Informational [Page 9] + +RFC 8303 Transport Services February 2018 + + + information is also available via 'Receive', which, following + [RFC5925], "MUST be augmented" with that functionality. The 'Send' + primitive includes an optional 'push' flag which, if set, requires + data to be promptly transmitted to the receiver without delay + [RFC0793]; the 'Receive' primitive described in can (under some + conditions) yield the status of the 'push' flag. Because "push" + functionality is optional to implement for both the 'Send' and + 'Receive' primitives [RFC1122], this functionality is not included + here. The requirements for Internet hosts [RFC1122] also introduce + keep-alives to TCP, but these are optional to implement and hence not + considered here. The same document also describes that "some TCP + implementations have included a FLUSH call", indicating that this + call is also optional to implement; therefore, it is not considered + here. + +3.2. Primitives Provided by MPTCP + + MPTCP is an extension to TCP that allows the use of multiple paths + for a single data stream. It achieves this by creating different so- + called TCP subflows for each of the interfaces and scheduling the + traffic across these TCP subflows. The service provided by MPTCP is + described as follows in [RFC6182]: + + Multipath TCP MUST follow the same service model as TCP [RFC0793]: + in-order, reliable, and byte-oriented delivery. Furthermore, a + Multipath TCP connection SHOULD provide the application with no + worse throughput or resilience than it would expect from running a + single TCP connection over any one of its available paths. + + Further, there are some constraints on the API exposed by MPTCP, as + stated in [RFC6182]: + + A multipath-capable equivalent of TCP MUST retain some level of + backward compatibility with existing TCP APIs, so that existing + applications can use the newer transport merely by upgrading the + operating systems of the end hosts. + + As such, the primitives provided by MPTCP are equivalent to the ones + provided by TCP. Nevertheless, the MPTCP RFCs [RFC6824] and + [RFC6897] clarify some parts of TCP's primitives with respect to + MPTCP and add some extensions for better control on MPTCP's subflows. + Hereafter is a list of the clarifications and extensions the above- + cited RFCs provide to TCP's primitives. + + + + + + + + +Welzl, et al. Informational [Page 10] + +RFC 8303 Transport Services February 2018 + + + Open: "An application should be able to request to turn on or turn + off the usage of MPTCP" [RFC6897]. This functionality can be + provided through a socket option called 'tcp_multipath_enable'. + Further, MPTCP must be disabled in case the application is binding + to a specific address [RFC6897]. + + Send/Receive: The sending and receiving of data does not require any + changes to the application when MPTCP is being used [RFC6824]. + The MPTCP-layer will take one input data stream from an + application, and split it into one or more subflows, with + sufficient control information to allow it to be reassembled and + delivered reliably and in order to the recipient application. + + The use of the Urgent Pointer is special in MPTCP [RFC6824], which + states: "a TCP subflow MUST NOT use the Urgent Pointer to + interrupt an existing mapping." + + Address and Subflow Management: MPTCP uses different addresses and + allows a host to announce these addresses as part of the protocol. + The MPTCP API Considerations RFC [RFC6897] says "An application + should be able to restrict MPTCP to binding to a given set of + addresses" and thus allows applications to limit the set of + addresses that are being used by MPTCP. Further, "An application + should be able to obtain information on the pairs of addresses + used by the MPTCP subflows." + +3.3. Primitives Provided by SCTP + + TCP has a number of limitations that SCTP removes (Section 1.1 of + [RFC4960]). The following three removed limitations directly + translate into transport features that are visible to an application + using SCTP: 1) it allows for preservation of message delimiters; 2) + it does not provide in-order or reliable delivery unless the + application wants that; 3) multihoming is supported. In SCTP, + connections are called "associations" and they can be between not + only two (as in TCP) but multiple addresses at each endpoint. + + Section 10 of the SCTP base protocol specification [RFC4960] + specifies the interaction with the application (which SCTP calls the + "Upper-Layer Protocol (ULP)"). It is assumed that the Operating + System provides a means for SCTP to asynchronously signal the + application; the primitives representing such signals are called + 'events' in this section. Here, we describe the relevant primitives. + In addition to the abstract API described in Section 10 of [RFC4960], + an extension to the sockets API is described in [RFC6458]. This + covers the functionality of the base protocol [RFC4960] and some of + its extensions [RFC3758] [RFC4895] [RFC5061]. For other protocol + extensions [RFC6525] [RFC6951] [RFC7053] [RFC7496] [RFC7829] + + + +Welzl, et al. Informational [Page 11] + +RFC 8303 Transport Services February 2018 + + + [RFC8260], the corresponding extensions of the sockets API are + specified in these protocol specifications. The functionality + exposed to the ULP through all these APIs is considered here. + + The abstract API contains a 'SetProtocolParameters' primitive that + allows elements of a parameter list [RFC4960] to be adjusted; it is + stated that SCTP implementations "may allow ULP to customize some of + these protocol parameters", indicating that none of the elements of + this parameter list are mandatory to make ULP configurable. Thus, we + only consider the parameters in the abstract API that are also + covered in one of the other RFCs listed above, which leads us to + exclude the parameters 'RTO.Alpha', 'RTO.Beta', and 'HB.Max.Burst'. + For clarity, we also replace 'SetProtocolParameters' itself with + primitives that adjust parameters or groups of parameters that fit + together. + + Initialize: Initialize creates a local SCTP instance that it binds + to a set of local addresses (and, if provided, a local port + number) [RFC4960]. Initialize needs to be called only once per + set of local addresses. A number of per-association + initialization parameters can be used when an association is + created, but before it is connected (via the primitive 'Associate' + below): the maximum number of inbound streams the application is + prepared to support, the maximum number of attempts to be made + when sending the INIT (the first message of association + establishment), and the maximum retransmission timeout (RTO) value + to use when attempting an INIT [RFC6458]. At this point, before + connecting, an application can also enable UDP encapsulation by + configuring the remote UDP encapsulation port number [RFC6951]. + + Associate: This creates an association (the SCTP equivalent of a + connection) that connects the local SCTP instance and a remote + SCTP instance. To identify the remote endpoint, it can be given + one or multiple (using "connectx") sockets (Section 9.9 of + [RFC6458]). Most primitives are associated with a specific + association, which is assumed to first have been created. + Associate can return a list of destination transport addresses so + that multiple paths can later be used. One of the returned + sockets will be selected by the local endpoint as the default + primary path for sending SCTP packets to this peer, but this + choice can be changed by the application using the list of + destination addresses. Associate is also given the number of + outgoing streams to request and optionally returns the number of + negotiated outgoing streams. An optional parameter of 32 bits, + the adaptation layer indication, can be provided [RFC5061]. If + authenticated chunks are used, the chunk types required to be sent + authenticated by the peer can be provided [RFC4895]. An + 'SCTP_Cant_Str_Assoc' notification is used to inform the + + + +Welzl, et al. Informational [Page 12] + +RFC 8303 Transport Services February 2018 + + + application of a failure to create an association [RFC6458]. An + application could use sendto() or sendmsg() to implicitly set up + an association, thereby handing over a message that SCTP might + send during the association setup phase [RFC6458]. Note that this + mechanism is different from TCP's TFO mechanism: the message would + arrive only once, after at least one RTT, as it is sent together + with the third message exchanged during association setup, the + COOKIE-ECHO chunk). + + Send: This sends a message of a certain length in bytes over an + association. A number can be provided to later refer to the + correct message when reporting an error, and a stream id is + provided to specify the stream to be used inside an association + (we consider this as a mandatory parameter here for simplicity: if + not provided, the stream id defaults to 0). A condition to + abandon the message can be specified (for example limiting the + number of retransmissions or the lifetime of the user message). + This allows control of the partial reliability extension [RFC3758] + [RFC7496]. An optional maximum lifetime can specify the time + after which the message should be discarded rather than sent. A + choice (advisory, i.e., not guaranteed) of the preferred path can + be made by providing a socket, and the message can be delivered + out-of-order if the 'unordered' flag is set. An advisory flag + indicates that the peer should not delay the acknowledgement of + the user message provided [RFC7053]. Another advisory flag + indicates whether the application prefers to avoid bundling user + data with other outbound DATA chunks (i.e., in the same packet). + A payload protocol-id can be provided to pass a value that + indicates the type of payload protocol data to the peer. If + authenticated chunks are used, the key identifier for + authenticating DATA chunks can be provided [RFC4895]. + + Receive: Messages are received from an association, and optionally a + stream within the association, with their size returned. The + application is notified of the availability of data via a 'Data + Arrive' notification. If the sender has included a payload + protocol-id, this value is also returned. If the received message + is only a partial delivery of a whole message, a 'partial' flag + will indicate so, in which case the stream id and a stream + sequence number are provided to the application. + + Shutdown: This primitive gracefully closes an association, reliably + delivering any data that has already been handed over to SCTP. A + parameter lets the application control whether further receive or + send operations or both are disabled when the call is issued. A + return code informs about success or failure of this procedure. + + + + + +Welzl, et al. Informational [Page 13] + +RFC 8303 Transport Services February 2018 + + + Abort: This ungracefully closes an association, by discarding any + locally queued data and informing the peer that the association + was aborted. Optionally, an abort reason to be passed to the peer + may be provided by the application. A return code informs about + success or failure of this procedure. + + Change Heartbeat / Request Heartbeat: This allows the application to + enable/disable heartbeats and optionally specify a heartbeat + frequency as well as requesting a single heartbeat to be carried + out upon a function call, with a notification about success or + failure of transmitting the HEARTBEAT chunk to the destination. + + Configure Max. Retransmissions of an Association: The parameter + 'Association.Max.Retrans' [RFC4960] (called "sasoc_maxrxt" in the + SCTP sockets API extensions [RFC6458]) allows the configuration of + the number of unsuccessful retransmissions after which an entire + association is considered as failed; this should invoke a + 'Communication Lost' notification. + + Set Primary: This allows the ability to set a new primary default + path for an association by providing a socket. Optionally, a + default source address to be used in IP datagrams can be provided. + + Change Local Address / Set Peer Primary: This allows an endpoint to + add/remove local addresses to/from an association. In addition, + the peer can be given a hint for which address to use as the + primary address [RFC5061]. + + Configure Path Switchover: The abstract API contains a primitive + called 'Set Failure Threshold' [RFC4960]. This configures the + parameter 'Path.Max.Retrans', which determines after how many + retransmissions a particular transport address is considered as + unreachable. If there are more transport addresses available in + an association, reaching this limit will invoke a path switchover. + An extension called "SCTP-PF" adds a concept of "Potentially + Failed (PF)" paths to this method [RFC7829]. When a path is in PF + state, SCTP will not entirely give up sending on that path, but it + will preferably send data on other active paths if such paths are + available. Entering the PF state is done upon exceeding a + configured maximum number of retransmissions. Thus, for all paths + where this mechanism is used, there are two configurable error + thresholds: one to decide that a path is in PF state, and one to + decide that the transport address is unreachable. + + Set/Get Authentication Parameters: This allows an endpoint to add/ + remove key material to/from an association. In addition, the + chunk types being authenticated can be queried [RFC4895]. + + + + +Welzl, et al. Informational [Page 14] + +RFC 8303 Transport Services February 2018 + + + Add/Reset Streams, Reset Association: This allows an endpoint to add + streams to an existing association or to reset them individually. + Additionally, the association can be reset [RFC6525]. + + Status: The 'Status' primitive returns a data block with information + about a specified association, containing: an association + connection state; a destination transport address list; + destination transport address reachability states; current local + and peer receiver window sizes; current local congestion window + sizes; number of unacknowledged DATA chunks; number of DATA chunks + pending receipt; a primary path; the most recent Smoothed Round- + Trip Time (SRTT) on a primary path; RTO on a primary path; SRTT + and RTO on other destination addresses [RFC4960]; and an MTU per + path [RFC6458]. + + Enable/Disable Interleaving: This allows the negotiation of user + message interleaving support for future associations to be enabled + or disabled. For existing associations, it is possible to query + whether user message interleaving support was negotiated or not on + a particular association [RFC8260]. + + Set Stream Scheduler: This allows the ability to select a stream + scheduler per association, with a choice of: First-Come, First- + Served; Round-Robin; Round-Robin per Packet; Priority-Based; Fair + Bandwidth; and Weighted Fair Queuing [RFC8260]. + + Configure Stream Scheduler: This allows the ability to change a + parameter per stream for the schedulers: a priority value for the + Priority-Based scheduler and a weight for the Weighted Fair + Queuing scheduler. + + Enable/Disable NoDelay: This turns on/off any Nagle-like algorithm + for an association [RFC6458]. + + Configure Send Buffer Size: This controls the amount of data SCTP + may have waiting in internal buffers to be sent or retransmitted + [RFC6458]. + + Configure Receive Buffer Size: This sets the receive buffer size in + octets, thereby controlling the receiver window for an association + [RFC6458]. + + Configure Message Fragmentation: If a user message causes an SCTP + packet to exceed the maximum fragmentation size (which can be + provided by the application and is otherwise the Path MTU (PMTU) + size), then the message will be fragmented by SCTP. Disabling + message fragmentation will produce an error instead of fragmenting + the message [RFC6458]. + + + +Welzl, et al. Informational [Page 15] + +RFC 8303 Transport Services February 2018 + + + Configure Path MTU Discovery: Path MTU Discovery (PMTUD) can be + enabled or disabled per peer address of an association + (Section 8.1.12 of [RFC6458]). When it is enabled, the current + Path MTU value can be obtained. When it is disabled, the Path MTU + to be used can be controlled by the application. + + Configure Delayed SACK Timer: The time before sending a SACK can be + adjusted; delaying SACKs can be disabled; and the number of + packets that must be received before a SACK is sent without + waiting for the delay timer to expire can be configured [RFC6458]. + + Set Cookie Life Value: The cookie life value can be adjusted + (Section 8.1.2 of [RFC6458]). 'Valid.Cookie.Life' is also one of + the parameters that is potentially adjustable with + 'SetProtocolParameters' [RFC4960]. + + Set Maximum Burst: The maximum burst of packets that can be emitted + by a particular association (default 4, and values above 4 are + optional to implement) can be adjusted (Section 8.1.2 of + [RFC6458]). 'Max.Burst' is also one of the parameters that is + potentially adjustable with 'SetProtocolParameters' [RFC4960]. + + Configure RTO Calculation: The abstract API contains the following + adjustable parameters: 'RTO.Initial'; 'RTO.Min'; 'RTO.Max'; + 'RTO.Alpha'; and 'RTO.Beta'. Only the initial, minimum and + maximum RTOs are also described as configurable in the SCTP + sockets API extensions [RFC6458]. + + Set DSCP Value: The DSCP value can be set per peer address of an + association (Section 8.1.12 of [RFC6458]). + + Set IPv6 Flow Label: The flow label field can be set per peer + address of an association (Section 8.1.12 of [RFC6458]). + + Set Partial Delivery Point: This allows the ability to specify the + size of a message where partial delivery will be invoked. Setting + this to a lower value will cause partial deliveries to happen more + often [RFC6458]. + + Communication Up Notification: When a lost communication to an + endpoint is restored or when SCTP becomes ready to send or receive + user messages, this notification informs the application process + about the affected association, the type of event that has + occurred, the complete set of sockets of the peer, the maximum + number of allowed streams, and the inbound stream count (the + number of streams the peer endpoint has requested). If + interleaving is supported by both endpoints, this information is + also included in this notification. + + + +Welzl, et al. Informational [Page 16] + +RFC 8303 Transport Services February 2018 + + + Restart Notification: When SCTP has detected that the peer has + restarted, this notification is passed to the upper layer + [RFC6458]. + + Data Arrive Notification: When a message is ready to be retrieved + via the 'Receive' primitive, the application is informed by this + notification. + + Send Failure Notification / Receive Unsent Message / Receive + Unacknowledged Message: When a message cannot be delivered via an + association, the sender can be informed about it and learn whether + the message has just not been acknowledged or (e.g., in case of + lifetime expiry) if it has not even been sent. This can also + inform the sender that a part of the message has been successfully + delivered. + + Network Status Change Notification: This informs the application + about a socket becoming active/inactive [RFC4960] or "Potentially + Failed" [RFC7829]. + + Communication Lost Notification: When SCTP loses communication to an + endpoint (e.g., via heartbeats or excessive retransmission) or + detects an abort, this notification informs the application + process of the affected association and the type of event (failure + OR termination in response to a shutdown or abort request). + + Shutdown Complete Notification: When SCTP completes the shutdown + procedures, this notification is passed to the upper layer, + informing it about the affected association. + + Authentication Notification: When SCTP wants to notify the upper + layer regarding the key management related to authenticated chunks + [RFC4895], this notification is passed to the upper layer. + + Adaptation Layer Indication Notification: When SCTP completes the + association setup and the peer provided an adaptation layer + indication, this is passed to the upper layer [RFC5061] [RFC6458]. + + Stream Reset Notification: When SCTP completes the procedure for + resetting streams [RFC6525], this notification is passed to the + upper layer, informing it about the result. + + Association Reset Notification: When SCTP completes the association + reset procedure [RFC6525], this notification is passed to the + upper layer, informing it about the result. + + + + + + +Welzl, et al. Informational [Page 17] + +RFC 8303 Transport Services February 2018 + + + Stream Change Notification: When SCTP completes the procedure used + to increase the number of streams [RFC6525], this notification is + passed to the upper layer, informing it about the result. + + Sender Dry Notification: When SCTP has no more user data to send or + retransmit on a particular association, this notification is + passed to the upper layer [RFC6458]. + + Partial Delivery Aborted Notification: When a receiver has begun to + receive parts of a user message but the delivery of this message + is then aborted, this notification is passed to the upper layer + (Section 6.1.7 of [RFC6458]). + +3.3.1. Excluded Primitives or Parameters + + The 'Receive' primitive can return certain additional information, + but this is optional to implement and therefore not considered. With + a 'Communication Lost' notification, some more information may + optionally be passed to the application (e.g., identification to + retrieve unsent and unacknowledged data). SCTP "can invoke" a + 'Communication Error' notification and "may send" a 'Restart' + notification, making these two notifications optional to implement. + The list provided under 'Status' includes "etc.", indicating that + more information could be provided. The primitive 'Get SRTT Report' + returns information that is included in the information that 'Status' + provides and is therefore not discussed. The 'Destroy SCTP Instance' + API function was excluded: it erases the SCTP instance that was + created by 'Initialize' but is not a primitive as defined in this + document because it does not relate to a transport feature. The + 'Shutdown' event informs an application that the peer has sent a + SHUTDOWN, and hence no further data should be sent on this socket + (Section 6.1 of [RFC6458]). However, if an application would try to + send data on the socket, it would get an error message anyway; thus, + this event is classified as "just affecting the application + programming style, not how the underlying protocol operates" and is + not included here. + +3.4. Primitives Provided by UDP and UDP-Lite + + The set of pass 1 primitives for UDP and UDP-Lite is documented in + [RFC8304]. + + + + + + + + + + +Welzl, et al. Informational [Page 18] + +RFC 8303 Transport Services February 2018 + + +3.5. The Service of LEDBAT + + The service of the LEDBAT congestion control mechanism is described + as follows: + + LEDBAT is designed for use by background bulk-transfer + applications to be no more aggressive than standard TCP congestion + control (as specified in RFC 5681) and to yield in the presence of + competing flows, thus limiting interference with the network + performance of competing flows [RFC6817]. + + LEDBAT does not have any primitives, as LEDBAT is not a transport + protocol. According to its specification [RFC6817]: + + LEDBAT can be used as part of a transport protocol or as part of + an application, as long as the data transmission mechanisms are + capable of carrying timestamps and acknowledging data frequently. + LEDBAT can be used with TCP, Stream Control Transmission Protocol + (SCTP), and Datagram Congestion Control Protocol (DCCP), with + appropriate extensions where necessary; and it can be used with + proprietary application protocols, such as those built on top of + UDP for peer-to-peer (P2P) applications. + + At the time of writing, the appropriate extensions for TCP, SCTP, or + DCCP do not exist. + + A number of configurable parameters exist in the LEDBAT + specification: TARGET, which is the queuing delay target at which + LEDBAT tries to operate, must be set to 100 ms or less. + 'allowed_increase' (should be 1, must be greater than 0) limits the + speed at which LEDBAT increases its rate. 'gain', which according to + [RFC6817] "MUST be set to 1 or less" to avoid a faster ramp-up than + TCP Reno, determines how quickly the sender responds to changes in + queueing delay. Implementations may divide 'gain' into two + parameters: one for increase and a possibly larger one for decrease. + We call these parameters 'Gain_Inc' and 'Gain_Dec' here. + 'Base_History' is the size of the list of measured base delays, and, + according to [RFC6817], "SHOULD be 10". This list can be filtered + using a 'Filter' function, which is not prescribed [RFC6817], that + yields a list of size 'Current_Filter'. The initial and minimum + congestion windows, 'Init_CWND' and 'Min_CWND', should both be 2. + + Regarding which of these parameters should be under control of an + application, the possible range goes from exposing nothing on the one + hand to considering everything that is not prescribed with a "MUST" + in the specification as a parameter on the other hand. Function + implementations are not provided as a parameter to any of the + transport protocols discussed here; hence, we do not regard the + + + +Welzl, et al. Informational [Page 19] + +RFC 8303 Transport Services February 2018 + + + 'Filter' function as a parameter. However, to avoid unnecessarily + limiting future implementations, we consider all other parameters + above as tunable parameters that should be exposed. + +4. Pass 2 + + This pass categorizes the primitives from pass 1 based on whether + they relate to a connection or to data transmission. Primitives are + presented following the nomenclature + "CATEGORY.[SUBCATEGORY].PRIMITIVENAME.PROTOCOL". The CATEGORY can be + CONNECTION or DATA. Within the CONNECTION category, ESTABLISHMENT, + AVAILABILITY, MAINTENANCE, and TERMINATION subcategories can be + considered. The DATA category does not have any SUBCATEGORY. The + PROTOCOL name "UDP(-Lite)" is used when primitives are equivalent for + UDP and UDP-Lite; the PROTOCOL name "TCP" refers to both TCP and + MPTCP. We present "connection" as a general protocol-independent + concept and use it to refer to, e.g., TCP connections (identifiable + by a unique pair of IP addresses and TCP port numbers), SCTP + associations (identifiable by multiple IP address and port number + pairs), as well UDP and UDP-Lite connections (identifiable by a + unique socket pair). + + Some minor details are omitted for the sake of generalization -- + e.g., SCTP's 'Close' [RFC4960] returns success or failure and lets + the application control whether further receive or send operations, + or both, are disabled [RFC6458]. This is not described in the same + way for TCP [RFC0793], but these details play no significant role for + the primitives provided by either TCP or SCTP (for the sake of being + generic, it could be assumed that both receive and send operations + are disabled in both cases). + + The TCP 'Send' and 'Receive' primitives include usage of an 'urgent' + parameter. This parameter controls a mechanism that is required to + implement the "synch signal" used by telnet [RFC0854], but [RFC6093] + states that "new applications SHOULD NOT employ the TCP urgent + mechanism." Because pass 2 is meant as a basis for the creation of + future systems, the "urgent" mechanism is excluded. This also + concerns the notification 'Urgent Pointer Advance' in the + 'Error_Report' (Section 4.2.4.1 of [RFC1122]). + + Since LEDBAT is a congestion control mechanism and not a protocol, it + is not currently defined when to enable/disable or configure the + mechanism. For instance, it could be a one-time choice upon + connection establishment or when listening for incoming connections, + in which case it should be categorized under CONNECTION.ESTABLISHMENT + or CONNECTION.AVAILABILITY, respectively. To avoid unnecessarily + + + + + +Welzl, et al. Informational [Page 20] + +RFC 8303 Transport Services February 2018 + + + limiting future implementations, it was decided to place it under + CONNECTION.MAINTENANCE, with all parameters that are described in the + specification [RFC6817] made configurable. + +4.1. CONNECTION-Related Primitives + + ESTABLISHMENT: + + Active creation of a connection from one transport endpoint to one or + more transport endpoints. Interfaces to UDP and UDP-Lite allow both + connection-oriented and connection-less usage of the API [RFC8085]. + + o CONNECT.TCP: + + Pass 1 primitive/event: 'Open' (active) or 'Open' (passive) with + socket, followed by 'Send' + + Parameters: 1 local IP address (optional); 1 destination transport + address (for active open; else the socket and the local IP address + of the succeeding incoming connection request will be maintained); + timeout (optional); options (optional); MKT configuration + (optional); and user message (optional) + + Comments: if the local IP address is not provided, a default + choice will automatically be made. The timeout can also be a + retransmission count. The options are IP options to be used on + all segments of the connection. At least the Source Route option + is mandatory for TCP to provide. 'MKT configuration' refers to + the ability to configure MKTs for authentication. The user + message may be transmitted to the peer application immediately + upon reception of the TCP SYN packet. To benefit from the lower + latency this provides as part of the experimental TFO mechanism, + its length must be at most the TCP's maximum segment size (minus + TCP options used in the SYN). The message may also be delivered + more than once to the application on the remote host. + + o CONNECT.SCTP: + + Pass 1 primitive/event: 'Initialize', followed by 'Enable/Disable + Interleaving' (optional), followed by 'Associate' + + Parameters: list of local SCTP port number / IP address pairs + ('Initialize'); one or several sockets (identifying the peer); + outbound stream count; maximum allowed inbound stream count; + adaptation layer indication (optional); chunk types required to be + authenticated (optional); request interleaving on/off; maximum + + + + + +Welzl, et al. Informational [Page 21] + +RFC 8303 Transport Services February 2018 + + + number of INIT attempts (optional); maximum init. RTO for INIT + (optional); user message (optional); and remote UDP port number + (optional) + + Returns: socket list or failure + + Comments: 'Initialize' needs to be called only once per list of + local SCTP port number / IP address pairs. One socket will + automatically be chosen; it can later be changed in MAINTENANCE. + The user message may be transmitted to the peer application + immediately upon reception of the packet containing the + COOKIE-ECHO chunk. To benefit from the lower latency this + provides, its length must be limited such that it fits into the + packet containing the COOKIE-ECHO chunk. If a remote UDP port + number is provided, SCTP packets will be encapsulated in UDP. + + o CONNECT.MPTCP: + + This is similar to CONNECT.TCP except for one additional boolean + parameter that allows the ability to enable or disable MPTCP for a + particular connection or socket (default: enabled). + + o CONNECT.UDP(-Lite): + + Pass 1 primitive/event: 'Connect' followed by 'Send' + + Parameters: 1 local IP address (default (ANY) or specified); 1 + destination transport address; 1 local port (default (OS chooses) + or specified); and 1 destination port (default (OS chooses) or + specified). + + Comments: associates a transport address creating a UDP(-Lite) + socket connection. This can be called again with a new transport + address to create a new connection. The CONNECT function allows + an application to receive errors from messages sent to a transport + address. + + AVAILABILITY: + + Preparing to receive incoming connection requests. + + o LISTEN.TCP: + + Pass 1 primitive/event: 'Open' (passive) + + Parameters: 1 local IP address (optional); 1 socket (optional); + timeout (optional); buffer to receive a user message (optional); + and MKT configuration (optional) + + + +Welzl, et al. Informational [Page 22] + +RFC 8303 Transport Services February 2018 + + + Comments: if the socket and/or local IP address is provided, this + waits for incoming connections from only and/or to only the + provided address. Else this waits for incoming connections + without this/these constraint(s). ESTABLISHMENT can later be + performed with 'Send'. If a buffer is provided to receive a user + message, a user message can be received from a TFO-enabled sender + before the TCP's connection handshake is completed. This message + may arrive multiple times. 'MKT configuration' refers to the + ability to configure MKTs for authentication. + + o LISTEN.SCTP: + + Pass 1 primitive/event: 'Initialize', followed by the + 'Communication Up' or 'Restart' notification and possibly the + 'Adaptation Layer' notification + + Parameters: list of local SCTP port number / IP address pairs + (initialize) + + Returns: socket list; outbound stream count; inbound stream count; + adaptation layer indication; chunks required to be authenticated; + and interleaving supported on both sides yes/no + + Comments: 'Initialize' needs to be called only once per list of + local SCTP port number / IP address pairs. 'Communication Up' can + also follow a 'Communication Lost' notification, indicating that + the lost communication is restored. If the peer has provided an + adaptation layer indication, an 'Adaptation Layer' notification is + issued. + + o LISTEN.MPTCP: + + This is similar to LISTEN.TCP except for one additional boolean + parameter that allows the ability to enable or disable MPTCP for a + particular connection or socket (default: enabled). + + o LISTEN.UDP(-Lite): + + Pass 1 primitive/event: 'Receive' + + Parameters: 1 local IP address (default (ANY) or specified); 1 + destination transport address; local port (default (OS chooses) or + specified); and destination port (default (OS chooses) or + specified) + + Comments: the 'Receive' function registers the application to + listen for incoming UDP(-Lite) datagrams at an endpoint. + + + + +Welzl, et al. Informational [Page 23] + +RFC 8303 Transport Services February 2018 + + + MAINTENANCE: + + Adjustments made to an open connection, or notifications about it. + These are out-of-band messages to the protocol that can be issued at + any time, at least after a connection has been established and before + it has been terminated (with one exception: CHANGE_TIMEOUT.TCP can + only be issued for an open connection when DATA.SEND.TCP is called). + In some cases, these primitives can also be immediately issued during + ESTABLISHMENT or AVAILABILITY, without waiting for the connection to + be opened (e.g., CHANGE_TIMEOUT.TCP can be done using TCP's 'Open' + primitive). For UDP and UDP-Lite, these functions may establish a + setting per connection but may also be changed per datagram message. + + o CHANGE_TIMEOUT.TCP: + + Pass 1 primitive/event: 'Open' or 'Send' combined with unspecified + control of per-connection state variables + + Parameters: timeout value (optional); adv_uto (optional); boolean + uto_enabled (optional, default false); and boolean changeable + (optional, default true) + + Comments: when sending data, an application can adjust the + connection's timeout value (the time after which the connection + will be aborted if data could not be delivered). If 'uto_enabled' + is true, the 'timeout value' (or, if provided, the value + 'adv_uto') will be advertised for the TCP on the other side of the + connection to adapt its own user timeout accordingly. + 'uto_enabled' controls whether the UTO option is enabled for a + connection. This applies to both sending and receiving. + 'changeable' controls whether the user timeout may be changed + based on a UTO option received from the other end of the + connection; it becomes false when the 'timeout value' is used. + + o CHANGE_TIMEOUT.SCTP: + + Pass 1 primitive/event: 'Change Heartbeat' combined with + 'Configure Max. Retransmissions of an Association' + + Parameters: 'Change Heartbeat': heartbeat frequency and 'Configure + Max. Retransmissions of an Association': Association.Max.Retrans + + Comments: 'Change Heartbeat' can enable/disable heartbeats in SCTP + as well as change their frequency. The parameter + 'Association.Max.Retrans' defines after how many unsuccessful + transmissions of any packets (including heartbeats) the + + + + + +Welzl, et al. Informational [Page 24] + +RFC 8303 Transport Services February 2018 + + + association will be terminated; thus, these two primitives/ + parameters together can yield a similar behavior for SCTP + associations as CHANGE_TIMEOUT.TCP does for TCP connections. + + o DISABLE_NAGLE.TCP: + + Pass 1 primitive/event: not specified + + Parameters: one boolean value + + Comments: the Nagle algorithm delays data transmission to increase + the chance of sending a full-sized segment. An application must + be able to disable this algorithm for a connection. + + o DISABLE_NAGLE.SCTP: + + Pass 1 primitive/event: 'Enable/Disable NoDelay' + + Parameters: one boolean value + + Comments: Nagle-like algorithms delay data transmission to + increase the chance of sending a full-sized packet. + + o REQUEST_HEARTBEAT.SCTP: + + Pass 1 primitive/event: 'Request Heartbeat' + + Parameters: socket + + Returns: success or failure + + Comments: requests an immediate heartbeat on a path, returning + success or failure. + + o ADD_PATH.MPTCP: + + Pass 1 primitive/event: not specified + + Parameters: local IP address and optionally the local port number + + Comments: the application specifies the local IP address and port + number that must be used for a new subflow. + + + + + + + + + +Welzl, et al. Informational [Page 25] + +RFC 8303 Transport Services February 2018 + + + o ADD_PATH.SCTP: + + Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' + + Parameters: local IP address + + o REM_PATH.MPTCP: + + Pass 1 primitive/event: not specified + + Parameters: local IP address; local port number; remote IP + address; and remote port number + + Comments: the application removes the subflow specified by the IP/ + port-pair. The MPTCP implementation must trigger a removal of the + subflow that belongs to this IP/port-pair. + + o REM_PATH.SCTP: + + Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' + + Parameters: local IP address + + o SET_PRIMARY.SCTP: + + Pass 1 primitive/event: 'Set Primary' + + Parameters: socket + + Returns: result of attempting this operation + + Comments: update the current primary address to be used, based on + the set of available sockets of the association. + + o SET_PEER_PRIMARY.SCTP: + + Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' + + Parameters: local IP address + + Comments: this is only advisory for the peer. + + + + + + + + + + +Welzl, et al. Informational [Page 26] + +RFC 8303 Transport Services February 2018 + + + o CONFIG_SWITCHOVER.SCTP: + + Pass 1 primitive/event: 'Configure Path Switchover' + + Parameters: primary max retrans (number of retransmissions after + which a path is considered inactive) and PF max retrans (number of + retransmissions after which a path is considered to be + "Potentially Failed", and others will be preferably used) + (optional) + + o STATUS.SCTP: + + Pass 1 primitive/event: 'Status', 'Enable/Disable Interleaving', + and 'Network Status Change' notification + + Returns: data block with information about a specified + association, containing: association connection state; destination + transport address list; destination transport address reachability + states; current local and peer receiver window sizes; current + local 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; MTU per path; and interleaving + supported yes/no + + Comments: the 'Network Status Change' notification informs the + application about a socket becoming active/inactive; this only + affects the programming style, as the same information is also + available via 'Status'. + + o STATUS.MPTCP: + + Pass 1 primitive/event: not specified + + Returns: list of pairs of tuples of IP address and TCP port number + of each subflow. The first of the pair is the local IP and port + number, while the second is the remote IP and port number. + + o SET_DSCP.TCP: + + Pass 1 primitive/event: not specified + + Parameters: DSCP value + + Comments: this allows an application to change the DSCP value for + outgoing segments. + + + + + +Welzl, et al. Informational [Page 27] + +RFC 8303 Transport Services February 2018 + + + o SET_DSCP.SCTP: + + Pass 1 primitive/event: 'Set DSCP value' + + Parameters: DSCP value + + Comments: this allows an application to change the DSCP value for + outgoing packets on a path. + + o SET_DSCP.UDP(-Lite): + + Pass 1 primitive/event: 'Set_DSCP' + + Parameter: DSCP value + + Comments: this allows an application to change the DSCP value for + outgoing UDP(-Lite) datagrams. [RFC7657] and [RFC8085] provide + current guidance on using this value with UDP. + + o ERROR.TCP: + + Pass 1 primitive/event: 'Error_Report' + + Returns: reason (encoding not specified) and subreason (encoding + not specified) + + Comments: soft errors that can be ignored without harm by many + applications; an application should be able to disable these + notifications. The reported conditions include at least: ICMP + error message arrived and excessive retransmissions. + + o ERROR.UDP(-Lite): + + Pass 1 primitive/event: 'Error_Report' + + Returns: Error report + + Comments: this returns soft errors that may be ignored without + harm by many applications; an application must connect to be able + receive these notifications. + + + + + + + + + + + +Welzl, et al. Informational [Page 28] + +RFC 8303 Transport Services February 2018 + + + o SET_AUTH.TCP: + + Pass 1 primitive/event: not specified + + Parameters: current_key and rnext_key + + Comments: current_key and rnext_key are the preferred outgoing MKT + and the preferred incoming MKT, respectively, for a segment that + is sent on the connection. + + o SET_AUTH.SCTP: + + Pass 1 primitive/event: 'Set/Get Authentication Parameters' + + Parameters: key_id; key; and hmac_id + + o GET_AUTH.TCP: + + Pass 1 primitive/event: not specified + + Parameters: current_key and rnext_key + + Comments: current_key and rnext_key are the preferred outgoing MKT + and the preferred incoming MKT, respectively, that were carried on + a recently received segment. + + o GET_AUTH.SCTP: + + Pass 1 primitive/event: 'Set/Get Authentication Parameters' + + Parameters: key_id and chunk_list + + o RESET_STREAM.SCTP: + + Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' + + Parameters: sid and direction + + o RESET_STREAM-EVENT.SCTP: + + Pass 1 primitive/event: 'Stream Reset' notification + + Parameters: information about the result of RESET_STREAM.SCTP + + Comments: this is issued when the procedure for resetting streams + has completed. + + + + + +Welzl, et al. Informational [Page 29] + +RFC 8303 Transport Services February 2018 + + + o RESET_ASSOC.SCTP: + + Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' + + Parameters: information related to the extension, as defined in + [RFC3260] + + o RESET_ASSOC-EVENT.SCTP: + + Pass 1 primitive/event: 'Association Reset' notification + + Parameters: information about the result of RESET_ASSOC.SCTP + + Comments: this is issued when the procedure for resetting an + association has completed. + + o ADD_STREAM.SCTP: + + Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' + + Parameters: number of outgoing and incoming streams to be added + + o ADD_STREAM-EVENT.SCTP: + + Pass 1 primitive/event: 'Stream Change' notification + + Parameters: information about the result of ADD_STREAM.SCTP + + Comments: this is issued when the procedure for adding a stream + has completed. + + o SET_STREAM_SCHEDULER.SCTP: + + Pass 1 primitive/event: 'Set Stream Scheduler' + + Parameters: scheduler identifier + + Comments: choice of First-Come, First-Served; Round-Robin; Round- + Robin per Packet; Priority-Based; Fair Bandwidth; and Weighted + Fair Queuing. + + + + + + + + + + + +Welzl, et al. Informational [Page 30] + +RFC 8303 Transport Services February 2018 + + + o CONFIGURE_STREAM_SCHEDULER.SCTP: + + Pass 1 primitive/event: 'Configure Stream Scheduler' + + Parameters: priority + + Comments: the priority value only applies when Priority-Based or + Weighted Fair Queuing scheduling is chosen with + SET_STREAM_SCHEDULER.SCTP. The meaning of the parameter differs + between these two schedulers, but in both cases, it realizes some + form of prioritization regarding how bandwidth is divided among + streams. + + o SET_FLOWLABEL.SCTP: + + Pass 1 primitive/event: 'Set IPv6 Flow Label' + + Parameters: flow label + + Comments: this allows an application to change the IPv6 header's + flow label field for outgoing packets on a path. + + o AUTHENTICATION_NOTIFICATION-EVENT.SCTP: + + Pass 1 primitive/event: 'Authentication' notification + + Returns: information regarding key management + + o CONFIG_SEND_BUFFER.SCTP: + + Pass 1 primitive/event: 'Configure Send Buffer Size' + + Parameters: size value in octets + + o CONFIG_RECEIVE_BUFFER.SCTP: + + Pass 1 primitive/event: 'Configure Receive Buffer Size' + + Parameters: size value in octets + + Comments: this controls the receiver window. + + + + + + + + + + +Welzl, et al. Informational [Page 31] + +RFC 8303 Transport Services February 2018 + + + o CONFIG_FRAGMENTATION.SCTP: + + Pass 1 primitive/event: 'Configure Message Fragmentation' + + Parameters: one boolean value (enable/disable) and maximum + fragmentation size (optional; default: PMTU) + + Comments: if fragmentation is enabled, messages exceeding the + maximum fragmentation size will be fragmented. If fragmentation + is disabled, trying to send a message that exceeds the maximum + fragmentation size will produce an error. + + o CONFIG_PMTUD.SCTP: + + Pass 1 primitive/event: 'Configure Path MTU Discovery' + + Parameters: one boolean value (PMTUD on/off) and PMTU value + (optional) + + Returns: PMTU value + + Comments: this returns a meaningful PMTU value when PMTUD is + enabled (the boolean is true), and the PMTU value can be set if + PMTUD is disabled (the boolean is false). + + o CONFIG_DELAYED_SACK.SCTP: + + Pass 1 primitive/event: 'Configure Delayed SACK Timer' + + Parameters: one boolean value (delayed SACK on/off); timer value + (optional); and number of packets to wait for (default 2) + + Comments: if delayed SACK is enabled, SCTP will send a SACK either + upon receiving the provided number of packets or when the timer + expires, whatever occurs first. + + o CONFIG_RTO.SCTP: + + Pass 1 primitive/event: 'Configure RTO Calculation' + + Parameters: init (optional); min (optional); and max (optional) + + Comments: this adjusts the initial, minimum, and maximum RTO + values. + + + + + + + +Welzl, et al. Informational [Page 32] + +RFC 8303 Transport Services February 2018 + + + o SET_COOKIE_LIFE.SCTP: + + Pass 1 primitive/event: 'Set Cookie Life Value' + + Parameters: cookie life value + + o SET_MAX_BURST.SCTP: + + Pass 1 primitive/event: 'Set Maximum Burst' + + Parameters: max burst value + + Comments: not all implementations allow values above the default + of 4. + + o SET_PARTIAL_DELIVERY_POINT.SCTP: + + Pass 1 primitive/event: 'Set Partial Delivery Point' + + Parameters: partial delivery point (integer) + + Comments: this parameter must be smaller or equal to the socket + receive buffer size. + + o SET_CHECKSUM_ENABLED.UDP: + + Pass 1 primitive/event: 'Checksum_Enabled' + + Parameters: 0 when zero checksum is used at sender, 1 for checksum + at sender (default) + + o SET_CHECKSUM_REQUIRED.UDP: + + Pass 1 primitive/event: 'Require_Checksum' + + Parameter: 0 to allow zero checksum, 1 when a non-zero checksum is + required (default) at the receiver + + o SET_CHECKSUM_COVERAGE.UDP-Lite: + + Pass 1 primitive/event: 'Set_Checksum_Coverage' + + Parameters: coverage length at sender (default maximum coverage) + + + + + + + + +Welzl, et al. Informational [Page 33] + +RFC 8303 Transport Services February 2018 + + + o SET_MIN_CHECKSUM_COVERAGE.UDP-Lite: + + Pass 1 primitive/event: 'Set_Min_Coverage' + + Parameter: coverage length at receiver (default minimum coverage) + + o SET_DF.UDP(-Lite): + + Pass 1 primitive event: 'Set_DF' + + Parameter: 0 when DF is not set (default) in the IPv4 header, 1 + when DF is set + + o GET_MMS_S.UDP(-Lite): + + Pass 1 primitive event: 'Get_MM_S' + + Comments: this retrieves the maximum transport-message size that + may be sent using a non-fragmented IP packet from the configured + interface. + + o GET_MMS_R.UDP(-Lite): + + Pass 1 primitive event: 'Get_MMS_R' + + Comments: this retrieves the maximum transport-message size that + may be received from the configured interface. + + o SET_TTL.UDP(-Lite) (IPV6_UNICAST_HOPS): + + Pass 1 primitive/event: 'Set_TTL' and 'Set_IPV6_Unicast_Hops' + + Parameters: IPv4 TTL value or IPv6 Hop Count value + + Comments: this allows an application to change the IPv4 TTL of + IPv6 Hop Count value for outgoing UDP(-Lite) datagrams. + + o GET_TTL.UDP(-Lite) (IPV6_UNICAST_HOPS): + + Pass 1 primitive/event: 'Get_TTL' and 'Get_IPV6_Unicast_Hops' + + Returns: IPv4 TTL value or IPv6 Hop Count value + + Comments: this allows an application to read the IPv4 TTL of the + IPv6 Hop Count value from a received UDP(-Lite) datagram. + + + + + + +Welzl, et al. Informational [Page 34] + +RFC 8303 Transport Services February 2018 + + + o SET_ECN.UDP(-Lite): + + Pass 1 primitive/event: 'Set_ECN' + + Parameters: ECN value + + Comments: this allows a UDP(-Lite) application to set the Explicit + Congestion Notification (ECN) code point field for outgoing + UDP(-Lite) datagrams. It defaults to sending '00'. + + o GET_ECN.UDP(-Lite): + + Pass 1 primitive/event: 'Get_ECN' + + Parameters: ECN value + + Comments: this allows a UDP(-Lite) application to read the ECN + code point field from a received UDP(-Lite) datagram. + + o SET_IP_OPTIONS.UDP(-Lite): + + Pass 1 primitive/event: 'Set_IP_Options' + + Parameters: options + + Comments: this allows a UDP(-Lite) application to set IP options + for outgoing UDP(-Lite) datagrams. These options can at least be + the Source Route, Record Route, and Timestamp option. + + o GET_IP_OPTIONS.UDP(-Lite): + + Pass 1 primitive/event: 'Get_IP_Options' + + Returns: options + + Comments: this allows a UDP(-Lite) application to receive any IP + options that are contained in a received UDP(-Lite) datagram. + + o CONFIGURE.LEDBAT: + + Pass 1 primitive/event: N/A + + Parameters: enable (boolean); target; allowed_increase; gain_inc; + gain_dec; base_history; current_filter; init_cwnd; and min_cwnd + + Comments: 'enable' is a newly invented parameter that enables or + disables the whole LEDBAT service. + + + + +Welzl, et al. Informational [Page 35] + +RFC 8303 Transport Services February 2018 + + + TERMINATION: + + Gracefully or forcefully closing a connection or being informed about + this event happening. + + o CLOSE.TCP: + + Pass 1 primitive/event: 'Close' + + Comments: this terminates the sending side of a connection after + reliably delivering all remaining data. + + o CLOSE.SCTP: + + Pass 1 primitive/event: 'Shutdown' + + Comments: this terminates a connection after reliably delivering + all remaining data. + + o ABORT.TCP: + + Pass 1 primitive/event: 'Abort' + + Comments: this terminates a connection without delivering + remaining data and sends an error message to the other side. + + o ABORT.SCTP: + + Pass 1 primitive/event: 'Abort' + + Parameters: abort reason to be given to the peer (optional) + + Comments: this terminates a connection without delivering + remaining data and sends an error message to the other side. + + o ABORT.UDP(-Lite): + + Pass 1 primitive event: 'Close' + + Comments: this terminates a connection without delivering + remaining data. No further UDP(-Lite) datagrams are sent/received + for this transport service instance. + + + + + + + + + +Welzl, et al. Informational [Page 36] + +RFC 8303 Transport Services February 2018 + + + o TIMEOUT.TCP: + + Pass 1 primitive/event: 'User Timeout' event + + Comments: the application is informed that the connection is + aborted. This event is executed on expiration of the timeout set + in CONNECTION.ESTABLISHMENT.CONNECT.TCP (possibly adjusted in + CONNECTION.MAINTENANCE.CHANGE_TIMEOUT.TCP). + + o TIMEOUT.SCTP: + + Pass 1 primitive/event: 'Communication Lost' event + + Comments: the application is informed that the connection is + aborted. This event is executed on expiration of the timeout that + should be enabled by default (see the beginning of Section 8.3 in + [RFC4960]) and was possibly adjusted in + CONNECTION.MAINTENANCE.CHANGE_TIMEOOUT.SCTP. + + o ABORT-EVENT.TCP: + + Pass 1 primitive/event: not specified + + o ABORT-EVENT.SCTP: + + Pass 1 primitive/event: 'Communication Lost' event + + Returns: abort reason from the peer (if available) + + Comments: the application is informed that the other side has + aborted the connection using CONNECTION.TERMINATION.ABORT.SCTP. + + o CLOSE-EVENT.TCP: + + Pass 1 primitive/event: not specified + + o CLOSE-EVENT.SCTP: + + Pass 1 primitive/event: 'Shutdown Complete' event + + Comments: the application is informed that + CONNECTION.TERMINATION.CLOSE.SCTP was successfully completed. + + + + + + + + + +Welzl, et al. Informational [Page 37] + +RFC 8303 Transport Services February 2018 + + +4.2. DATA-Transfer-Related Primitives + + All primitives in this section refer to an existing connection, i.e., + a connection that was either established or made available for + receiving data (although this is optional for the primitives of + UDP(-Lite)). In addition to the listed parameters, all sending + primitives contain a reference to a data block, and all receiving + primitives contain a reference to available buffer space for the + data. Note that CONNECT.TCP and LISTEN.TCP in the ESTABLISHMENT and + AVAILABILITY categories also allow to transfer data (an optional user + message) before the connection is fully established. + + o SEND.TCP: + + Pass 1 primitive/event: 'Send' + + Parameters: timeout (optional); current_key (optional); and + rnext_key (optional) + + Comments: this gives TCP a data block for reliable transmission to + the TCP on the other side of the connection. The timeout can be + configured with this call (see also + CONNECTION.MAINTENANCE.CHANGE_TIMEOUT.TCP). 'current_key' and + 'rnext_key' are authentication parameters that can be configured + with this call (see also CONNECTION.MAINTENANCE.SET_AUTH.TCP). + + o SEND.SCTP: + + Pass 1 primitive/event: 'Send' + + Parameters: stream number; context (optional); socket (optional); + unordered flag (optional); no-bundle flag (optional); payload + protocol-id (optional); pr-policy (optional) pr-value (optional); + sack-immediately flag (optional); and key-id (optional) + + Comments: this gives SCTP a data block for transmission to the + SCTP on the other side of the connection (SCTP association). The + 'stream number' denotes the stream to be used. The 'context' + number can later be used to refer to the correct message when an + error is reported. The 'socket' can be used to state which path + should be preferred, if there are multiple paths available (see + also CONNECTION.MAINTENANCE.SETPRIMARY.SCTP). The data block can + be delivered out of order if the 'unordered' flag is set. The + 'no-bundle flag' can be set to indicate a preference to avoid + bundling. The 'payload protocol-id' is a number that will, if + provided, be handed over to the receiving application. Using + pr-policy and pr-value, the level of reliability can be + controlled. The 'sack-immediately' flag can be used to indicate + + + +Welzl, et al. Informational [Page 38] + +RFC 8303 Transport Services February 2018 + + + that the peer should not delay the sending of a SACK corresponding + to the provided user message. If specified, the provided key-id + is used for authenticating the user message. + + o SEND.UDP(-Lite): + + Pass 1 primitive/event: 'Send' + + Parameters: IP address and port number of the destination endpoint + (optional if connected) + + Comments: this provides a message for unreliable transmission + using UDP(-Lite) to the specified transport address. The IP + address and port number may be omitted for connected UDP(-Lite) + sockets. All CONNECTION.MAINTENANCE.SET_*.UDP(-Lite) primitives + apply per message sent. + + o RECEIVE.TCP: + + Pass 1 primitive/event: 'Receive' + + Parameters: current_key (optional) and rnext_key (optional) + + Comments: 'current_key' and 'rnext_key' are authentication + parameters that can be read with this call (see also + CONNECTION.MAINTENANCE.GET_AUTH.TCP). + + o RECEIVE.SCTP: + + Pass 1 primitive/event: 'Data Arrive' notification, followed by + 'Receive' + + Parameters: stream number (optional) + + Returns: stream sequence number (optional) and partial flag + (optional) + + Comments: if the 'stream number' is provided, the call to receive + only receives data on one particular stream. If a partial message + arrives, this is indicated by the 'partial flag', and then the + 'stream sequence number' must be provided such that an application + can restore the correct order of data blocks that comprise an + entire message. + + + + + + + + +Welzl, et al. Informational [Page 39] + +RFC 8303 Transport Services February 2018 + + + o RECEIVE.UDP(-Lite): + + Pass 1 primitive/event: 'Receive' + + Parameters: buffer for received datagram + + Comments: all CONNECTION.MAINTENANCE.GET_*.UDP(-Lite) primitives + apply per message received. + + o SENDFAILURE-EVENT.SCTP: + + Pass 1 primitive/event: 'Send Failure' notification, optionally + followed by 'Receive Unsent Message' or 'Receive Unacknowledged + Message' + + Returns: cause code; context; and unsent or unacknowledged message + (optional) + + Comments: 'cause code' indicates the reason of the failure, and + 'context' is the context number if such a number has been provided + in DATA.SEND.SCTP, for later use with 'Receive Unsent Message' or + 'Receive Unacknowledged Message', respectively. These primitives + can be used to retrieve the unsent or unacknowledged message (or + part of the message, in case a part was delivered) if desired. + + o SEND_FAILURE.UDP(-Lite): + + Pass 1 primitive/event: 'Send' + + Comments: this may be used to probe for the effective PMTU when + using in combination with the 'MAINTENANCE.SET_DF' primitive. + + o SENDER_DRY-EVENT.SCTP: + + Pass 1 primitive/event: 'Sender Dry' notification + + Comments: this informs the application that the stack has no more + user data to send. + + o PARTIAL_DELIVERY_ABORTED-EVENT.SCTP: + + Pass 1 primitive/event: 'Partial Delivery Aborted' notification + + Comments: this informs the receiver of a partial message that the + further delivery of the message has been aborted. + + + + + + +Welzl, et al. Informational [Page 40] + +RFC 8303 Transport Services February 2018 + + +5. Pass 3 + + This section presents the superset of all transport features in all + protocols that were discussed in the preceding sections, based on the + list of primitives in pass 2 but also on text in pass 1 to include + transport features that can be configured in one protocol and are + static properties in another (congestion control, for example). + Again, some minor details are omitted for the sake of generalization + -- e.g., TCP may provide various different IP options, but only + source route is mandatory to implement, and this detail is not + visible in the pass 3 transport feature "Specify IP options". As + before, "UDP(-Lite)" represents both UDP and UDP-Lite, and "TCP" + refers to both TCP and MPTCP. + +5.1. CONNECTION-Related Transport Features + + ESTABLISHMENT: + Active creation of a connection from one transport endpoint to one or + more transport endpoints. + + o Connect + Protocols: TCP, SCTP, and UDP(-Lite) + + o Specify which IP options must always be used + Protocols: TCP and UDP(-Lite) + + o Request multiple streams + Protocols: SCTP + + o Limit the number of inbound streams + Protocols: SCTP + + o Specify number of attempts and/or timeout for the first + establishment message + Protocols: TCP and SCTP + + o Obtain multiple sockets + Protocols: SCTP + + o Disable MPTCP + Protocols: MPTCP + + + + + + + + + + +Welzl, et al. Informational [Page 41] + +RFC 8303 Transport Services February 2018 + + + o Configure authentication + Protocols: TCP and SCTP + Comments: with TCP, this allows the configuration of MKTs. In + SCTP, this allows the specification of which chunk types must + always be authenticated. DATA, ACK, etc., are different 'chunks' + in SCTP; one or more chunks may be included in a single packet. + + o Indicate an Adaptation Layer (via an adaptation code point) + Protocols: SCTP + + o Request to negotiate interleaving of user messages + Protocols: SCTP + + o Hand over a message to reliably transfer (possibly multiple times) + before connection establishment + Protocols: TCP + + o Hand over a message to reliably transfer during connection + establishment + Protocols: SCTP + + o Enable UDP encapsulation with a specified remote UDP port number + Protocols: SCTP + + AVAILABILITY: + + Preparing to receive incoming connection requests. + + o Listen, 1 specified local interface + Protocols: TCP, SCTP, and UDP(-Lite) + + o Listen, N specified local interfaces + Protocols: SCTP + + o Listen, all local interfaces + Protocols: TCP, SCTP, and UDP(-Lite) + + o Obtain requested number of streams + Protocols: SCTP + + o Limit the number of inbound streams + Protocols: SCTP + + o Specify which IP options must always be used + Protocols: TCP and UDP(-Lite) + + + + + + +Welzl, et al. Informational [Page 42] + +RFC 8303 Transport Services February 2018 + + + o Disable MPTCP + Protocols: MPTCP + + o Configure authentication + Protocols: TCP and SCTP + Comments: with TCP, this allows the configuration of MKTs. In + SCTP, this allows the specification of which chunk types must + always be authenticated. DATA, ACK, etc., are different 'chunks' + in SCTP; one or more chunks may be included in a single packet. + + o Indicate an Adaptation Layer (via an adaptation code point) + Protocols: SCTP + + MAINTENANCE: + + Adjustments made to an open connection, or notifications about it. + + o Change timeout for aborting connection (using retransmit limit or + time value) + Protocols: TCP and SCTP + + o Suggest timeout to the peer + Protocols: TCP + + o Disable Nagle algorithm + Protocols: TCP and SCTP + + o Request an immediate heartbeat, returning success/failure + Protocols: SCTP + + o Notification of excessive retransmissions (early warning below + abortion threshold) + Protocols: TCP + + o Add path + Protocols: MPTCP and SCTP + MPTCP Parameters: source-IP; source-Port; destination-IP; and + destination-Port + SCTP Parameters: local IP address + + o Remove path + Protocols: MPTCP and SCTP + MPTCP Parameters: source-IP; source-Port; destination-IP; and + destination-Port + SCTP Parameters: local IP address + + + + + + +Welzl, et al. Informational [Page 43] + +RFC 8303 Transport Services February 2018 + + + o Set primary path + Protocols: SCTP + + o Suggest primary path to the peer + Protocols: SCTP + + o Configure Path Switchover + Protocols: SCTP + + o Obtain status (query or notification) + Protocols: SCTP and MPTCP + SCTP parameters: association connection state; destination + transport address list; destination transport address reachability + states; current local and peer receiver window sizes; current + local 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; MTU per path; and interleaving + supported yes/no + MPTCP parameters: subflow-list (identified by source-IP; + source-Port; destination-IP; and destination-Port) + + o Specify DSCP field + Protocols: TCP, SCTP, and UDP(-Lite) + + o Notification of ICMP error message arrival + Protocols: TCP and UDP(-Lite) + + o Change authentication parameters + Protocols: TCP and SCTP + + o Obtain authentication information + Protocols: TCP and SCTP + + o Reset Stream + Protocols: SCTP + + o Notification of Stream Reset + Protocols: STCP + + o Reset Association + Protocols: SCTP + + o Notification of Association Reset + Protocols: STCP + + o Add Streams + Protocols: SCTP + + + +Welzl, et al. Informational [Page 44] + +RFC 8303 Transport Services February 2018 + + + o Notification of Added Stream + Protocols: STCP + + o Choose a scheduler to operate between streams of an association + Protocols: SCTP + + o Configure priority or weight for a scheduler + Protocols: SCTP + + o Specify IPv6 flow label field + Protocols: SCTP + + o Configure send buffer size + Protocols: SCTP + + o Configure receive buffer (and rwnd) size + Protocols: SCTP + + o Configure message fragmentation + Protocols: SCTP + + o Configure PMTUD + Protocols: SCTP + + o Configure delayed SACK timer + Protocols: SCTP + + o Set Cookie life value + Protocols: SCTP + + o Set maximum burst + Protocols: SCTP + + o Configure size where messages are broken up for partial delivery + Protocols: SCTP + + o Disable checksum when sending + Protocols: UDP + + o Disable checksum requirement when receiving + Protocols: UDP + + o Specify checksum coverage used by the sender + Protocols: UDP-Lite + + o Specify minimum checksum coverage required by receiver + Protocols: UDP-Lite + + + + +Welzl, et al. Informational [Page 45] + +RFC 8303 Transport Services February 2018 + + + o Specify DF field + Protocols: UDP(-Lite) + + o Get max. transport-message size that may be sent using a non- + fragmented IP packet from the configured interface + Protocols: UDP(-Lite) + + o Get max. transport-message size that may be received from the + configured interface + Protocols: UDP(-Lite) + + o Specify TTL/Hop Count field + Protocols: UDP(-Lite) + + o Obtain TTL/Hop Count field + Protocols: UDP(-Lite) + + o Specify ECN field + Protocols: UDP(-Lite) + + o Obtain ECN field + Protocols: UDP(-Lite) + + o Specify IP options + Protocols: UDP(-Lite) + + o Obtain IP options + Protocols: UDP(-Lite) + + o Enable and configure "Low Extra Delay Background Transfer" + Protocols: A protocol implementing the LEDBAT congestion control + mechanism + + TERMINATION: + + Gracefully or forcefully closing a connection, or being informed + about this event happening. + + o Close after reliably delivering all remaining data, causing an + event informing the application on the other side + Protocols: TCP and SCTP + Comments: a TCP endpoint locally only closes the connection for + sending; it may still receive data afterwards. + + o Abort without delivering remaining data, causing an event that + informs the application on the other side + Protocols: TCP and SCTP + + + + +Welzl, et al. Informational [Page 46] + +RFC 8303 Transport Services February 2018 + + + Comments: in SCTP, a reason can optionally be given by the + application on the aborting side, which can then be received by + the application on the other side. + + o Abort without delivering remaining data, not causing an event that + informs the application on the other side + Protocols: UDP(-Lite) + + o Timeout event when data could not be delivered for too long + Protocols: TCP and SCTP + Comments: the timeout is configured with CONNECTION.MAINTENANCE + "Change timeout for aborting connection (using retransmit limit or + time value)". + +5.2. DATA-Transfer-Related Transport Features + + All transport features in this section refer to an existing + connection, i.e., a connection that was either established or made + available for receiving data. Note that TCP allows the transfer of + data (a single optional user message, possibly arriving multiple + times) before the connection is fully established. Reliable data + transfer entails delay -- e.g., for the sender to wait until it can + transmit data or due to retransmission in case of packet loss. + +5.2.1. Sending Data + + All transport features in this section are provided by DATA.SEND from + pass 2. DATA.SEND is given a data block from the application, which + here we call a "message" if the beginning and end of the data block + can be identified at the receiver, and "data" otherwise. + + o Reliably transfer data, with congestion control + Protocols: TCP + + o Reliably transfer a message, with congestion control + Protocols: SCTP + + o Unreliably transfer a message, with congestion control + Protocols: SCTP + + o Unreliably transfer a message, without congestion control + Protocols: UDP(-Lite) + + o Configurable Message Reliability + Protocols: SCTP + + + + + + +Welzl, et al. Informational [Page 47] + +RFC 8303 Transport Services February 2018 + + + o Choice of stream + Protocols: SCTP + + o Choice of path (destination address) + Protocols: SCTP + + o Ordered message delivery (potentially slower than unordered) + Protocols: SCTP + + o Unordered message delivery (potentially faster than ordered) + Protocols: SCTP and UDP(-Lite) + + o Request not to bundle messages + Protocols: SCTP + + o Specifying a 'payload protocol-id' (handed over as such by the + receiver) + Protocols: SCTP + + o Specifying a key identifier to be used to authenticate a message + Protocols: SCTP + + o Request not to delay the acknowledgement (SACK) of a message + Protocols: SCTP + +5.2.2. Receiving Data + + All transport features in this section are provided by DATA.RECEIVE + from pass 2. DATA.RECEIVE fills a buffer provided by the + application, with what here we call a "message" if the beginning and + end of the data block can be identified at the receiver, and "data" + otherwise. + + o Receive data (with no message delimiting) + Protocols: TCP + + o Receive a message + Protocols: SCTP and UDP(-Lite) + + o Choice of stream to receive from + Protocols: SCTP + + o Information about partial message arrival + Protocols: SCTP + Comments: in SCTP, partial messages are combined with a stream + sequence number so that the application can restore the correct + order of data blocks an entire message consists of. + + + + +Welzl, et al. Informational [Page 48] + +RFC 8303 Transport Services February 2018 + + +5.2.3. Errors + + This section describes sending failures that are associated with a + specific call to DATA.SEND from pass 2. + + o Notification of an unsent (part of a) message + Protocols: SCTP and UDP(-Lite) + + o Notification of an unacknowledged (part of a) message + Protocols: SCTP + + o Notification that the stack has no more user data to send + Protocols: SCTP + + o Notification to a receiver that a partial message delivery has + been aborted + Protocols: SCTP + +6. IANA Considerations + + This document does not require any IANA actions. + +7. Security Considerations + + Authentication, confidentiality protection, and integrity protection + are identified as transport features [RFC8095]. These transport + features are generally provided by a protocol or layer on top of the + transport protocol; none of the transport protocols considered in + this document provides these transport features on its own. + Therefore, these transport features are not considered in this + document, with the exception of native authentication capabilities of + TCP and SCTP for which the security considerations in [RFC5925] and + [RFC4895] apply. + + Security considerations for the use of UDP and UDP-Lite are provided + in the referenced RFCs. Security guidance for application usage is + provided in the UDP Guidelines [RFC8085]. + + + + + + + + + + + + + + +Welzl, et al. Informational [Page 49] + +RFC 8303 Transport Services February 2018 + + +8. References + +8.1. Normative References + + [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, + RFC 793, DOI 10.17487/RFC0793, September 1981, + <https://www.rfc-editor.org/info/rfc793>. + + [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - + Communication Layers", STD 3, RFC 1122, + DOI 10.17487/RFC1122, October 1989, + <https://www.rfc-editor.org/info/rfc1122>. + + [RFC3758] Stewart, R., Ramalho, M., Xie, Q., Tuexen, M., and P. + Conrad, "Stream Control Transmission Protocol (SCTP) + Partial Reliability Extension", RFC 3758, + DOI 10.17487/RFC3758, May 2004, + <https://www.rfc-editor.org/info/rfc3758>. + + [RFC4895] Tuexen, M., Stewart, R., Lei, P., and E. Rescorla, + "Authenticated Chunks for the Stream Control Transmission + Protocol (SCTP)", RFC 4895, DOI 10.17487/RFC4895, August + 2007, <https://www.rfc-editor.org/info/rfc4895>. + + [RFC4960] Stewart, R., Ed., "Stream Control Transmission Protocol", + RFC 4960, DOI 10.17487/RFC4960, September 2007, + <https://www.rfc-editor.org/info/rfc4960>. + + [RFC5061] Stewart, R., Xie, Q., Tuexen, M., Maruyama, S., and M. + Kozuka, "Stream Control Transmission Protocol (SCTP) + Dynamic Address Reconfiguration", RFC 5061, + DOI 10.17487/RFC5061, September 2007, + <https://www.rfc-editor.org/info/rfc5061>. + + [RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", + RFC 5482, DOI 10.17487/RFC5482, March 2009, + <https://www.rfc-editor.org/info/rfc5482>. + + [RFC5925] Touch, J., Mankin, A., and R. Bonica, "The TCP + Authentication Option", RFC 5925, DOI 10.17487/RFC5925, + June 2010, <https://www.rfc-editor.org/info/rfc5925>. + + [RFC6182] Ford, A., Raiciu, C., Handley, M., Barre, S., and J. + Iyengar, "Architectural Guidelines for Multipath TCP + Development", RFC 6182, DOI 10.17487/RFC6182, March 2011, + <https://www.rfc-editor.org/info/rfc6182>. + + + + + +Welzl, et al. Informational [Page 50] + +RFC 8303 Transport Services February 2018 + + + [RFC6458] Stewart, R., Tuexen, M., Poon, K., Lei, P., and V. + Yasevich, "Sockets API Extensions for the Stream Control + Transmission Protocol (SCTP)", RFC 6458, + DOI 10.17487/RFC6458, December 2011, + <https://www.rfc-editor.org/info/rfc6458>. + + [RFC6525] Stewart, R., Tuexen, M., and P. Lei, "Stream Control + Transmission Protocol (SCTP) Stream Reconfiguration", + RFC 6525, DOI 10.17487/RFC6525, February 2012, + <https://www.rfc-editor.org/info/rfc6525>. + + [RFC6817] Shalunov, S., Hazel, G., Iyengar, J., and M. Kuehlewind, + "Low Extra Delay Background Transport (LEDBAT)", RFC 6817, + DOI 10.17487/RFC6817, December 2012, + <https://www.rfc-editor.org/info/rfc6817>. + + [RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, + "TCP Extensions for Multipath Operation with Multiple + Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, + <https://www.rfc-editor.org/info/rfc6824>. + + [RFC6897] Scharf, M. and A. Ford, "Multipath TCP (MPTCP) Application + Interface Considerations", RFC 6897, DOI 10.17487/RFC6897, + March 2013, <https://www.rfc-editor.org/info/rfc6897>. + + [RFC6951] Tuexen, M. and R. Stewart, "UDP Encapsulation of Stream + Control Transmission Protocol (SCTP) Packets for End-Host + to End-Host Communication", RFC 6951, + DOI 10.17487/RFC6951, May 2013, + <https://www.rfc-editor.org/info/rfc6951>. + + [RFC7053] Tuexen, M., Ruengeler, I., and R. Stewart, "SACK- + IMMEDIATELY Extension for the Stream Control Transmission + Protocol", RFC 7053, DOI 10.17487/RFC7053, November 2013, + <https://www.rfc-editor.org/info/rfc7053>. + + [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP + Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, + <https://www.rfc-editor.org/info/rfc7413>. + + [RFC7496] Tuexen, M., Seggelmann, R., Stewart, R., and S. Loreto, + "Additional Policies for the Partially Reliable Stream + Control Transmission Protocol Extension", RFC 7496, + DOI 10.17487/RFC7496, April 2015, + <https://www.rfc-editor.org/info/rfc7496>. + + + + + + +Welzl, et al. Informational [Page 51] + +RFC 8303 Transport Services February 2018 + + + [RFC7829] Nishida, Y., Natarajan, P., Caro, A., Amer, P., and K. + Nielsen, "SCTP-PF: A Quick Failover Algorithm for the + Stream Control Transmission Protocol", RFC 7829, + DOI 10.17487/RFC7829, April 2016, + <https://www.rfc-editor.org/info/rfc7829>. + + [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage + Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, + March 2017, <https://www.rfc-editor.org/info/rfc8085>. + + [RFC8260] Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann, + "Stream Schedulers and User Message Interleaving for the + Stream Control Transmission Protocol", RFC 8260, + DOI 10.17487/RFC8260, November 2017, + <https://www.rfc-editor.org/info/rfc8260>. + + [RFC8304] Fairhurst, G. and T. Jones, "Transport Features of the + User Datagram Protocol (UDP) and Lightweight UDP (UDP- + Lite)", RFC 8304, DOI 10.17487/RFC8304, February 2018, + <https://www.rfc-editor.org/info/rfc8304>. + +8.2. Informative References + + [RFC0854] Postel, J. and J. Reynolds, "Telnet Protocol + Specification", STD 8, RFC 854, DOI 10.17487/RFC0854, May + 1983, <https://www.rfc-editor.org/info/rfc854>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, + "Definition of the Differentiated Services Field (DS + Field) in the IPv4 and IPv6 Headers", RFC 2474, + DOI 10.17487/RFC2474, December 1998, + <https://www.rfc-editor.org/info/rfc2474>. + + [RFC2475] Blake, S., Black, D., Carlson, M., Davies, E., Wang, Z., + and W. Weiss, "An Architecture for Differentiated + Services", RFC 2475, DOI 10.17487/RFC2475, December 1998, + <https://www.rfc-editor.org/info/rfc2475>. + + [RFC3260] Grossman, D., "New Terminology and Clarifications for + Diffserv", RFC 3260, DOI 10.17487/RFC3260, April 2002, + <https://www.rfc-editor.org/info/rfc3260>. + + + + + +Welzl, et al. Informational [Page 52] + +RFC 8303 Transport Services February 2018 + + + [RFC5461] Gont, F., "TCP's Reaction to Soft Errors", RFC 5461, + DOI 10.17487/RFC5461, February 2009, + <https://www.rfc-editor.org/info/rfc5461>. + + [RFC6093] Gont, F. and A. Yourtchenko, "On the Implementation of the + TCP Urgent Mechanism", RFC 6093, DOI 10.17487/RFC6093, + January 2011, <https://www.rfc-editor.org/info/rfc6093>. + + [RFC7414] Duke, M., Braden, R., Eddy, W., Blanton, E., and A. + Zimmermann, "A Roadmap for Transmission Control Protocol + (TCP) Specification Documents", RFC 7414, + DOI 10.17487/RFC7414, February 2015, + <https://www.rfc-editor.org/info/rfc7414>. + + [RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services + (Diffserv) and Real-Time Communication", RFC 7657, + DOI 10.17487/RFC7657, November 2015, + <https://www.rfc-editor.org/info/rfc7657>. + + [RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, + Ed., "Services Provided by IETF Transport Protocols and + Congestion Control Mechanisms", RFC 8095, + DOI 10.17487/RFC8095, March 2017, + <https://www.rfc-editor.org/info/rfc8095>. + + [TAPS-MINSET] + Welzl, M. and S. Gjessing, "A Minimal Set of Transport + Services for TAPS Systems", Work in Progress, draft-ietf- + taps-minset-01, February 2018. + + + + + + + + + + + + + + + + + + + + + + +Welzl, et al. Informational [Page 53] + +RFC 8303 Transport Services February 2018 + + +Appendix A. Overview of RFCs Used as Input for Pass 1 + + TCP: [RFC0793], [RFC1122], [RFC5482], [RFC5925], and + [RFC7413]. + + MPTCP: [RFC6182], [RFC6824], and [RFC6897]. + + SCTP: RFCs without a sockets API specification: + [RFC3758], [RFC4895], [RFC4960], and [RFC5061]. + + RFCs that include a sockets API specification: + [RFC6458], [RFC6525], [RFC6951], [RFC7053], [RFC7496], + and [RFC7829]. + + UDP(-Lite): See [RFC8304]. + + LEDBAT: [RFC6817]. + +Appendix B. How This Document Was Developed + + This section gives an overview of the method that was used to develop + this document. It was given to contributors for guidance, and it can + be helpful for future updates or extensions. + + This document is only concerned with transport features that are + explicitly exposed to applications via primitives. It also strictly + follows RFC text: if a transport feature is truly relevant for an + application, the RFCs should say so, and they should describe how to + use and configure it. Thus, the approach followed for developing + this document was to identify the right RFCs, then analyze and + process their text. + + Primitives that "MAY" be implemented by a transport protocol were + excluded. To be included, the minimum requirement level for a + primitive to be implemented by a protocol was "SHOULD". Where style + requirement levels as described in [RFC2119] are not used, primitives + were excluded when they are described in conjunction with statements + like, e.g., "some implementations also provide" or "an implementation + may also". Excluded primitives or parameters were briefly described + in a dedicated subsection. + + Pass 1: This began by identifying text that talks about primitives. + An API specification, abstract or not, obviously describes primitives + -- but we are not *only* interested in API specifications. The text + describing the 'Send' primitive in the API specified in [RFC0793], + + + + + + +Welzl, et al. Informational [Page 54] + +RFC 8303 Transport Services February 2018 + + + for instance, does not say that data transfer is reliable. TCP's + reliability is clear, however, from this text in Section 1 of + [RFC0793]: + + The Transmission Control Protocol (TCP) is intended for use as a + highly reliable host-to-host protocol between hosts in packet- + switched computer communication networks, and in interconnected + systems of such networks. + + Some text for the pass 1 subsections was developed by copying and + pasting all the relevant text parts from the relevant RFCs then + adjusting the terminology to match that in Section 2 and shortening + phrasing to match the general style of the document. An effort was + made to formulate everything as a primitive description such that the + primitive descriptions became as complete as possible (e.g., the + 'SEND.TCP' primitive in pass 2 is explicitly described as reliably + transferring data); text that is relevant for the primitives + presented in this pass but still does not fit directly under any + primitive was used in a subsection's introduction. + + Pass 2: The main goal of this pass is unification of primitives. As + input, only text from pass 1 was used (no exterior sources). The + list in pass 2 is not arranged by protocol (i.e., "first protocol X, + here are all the primitives; then protocol Y, here are all the + primitives, ...") but by primitive (i.e., "primitive A, implemented + this way in protocol X, this way in protocol Y, ..."). It was a goal + to obtain as many similar pass 2 primitives as possible. For + instance, this was sometimes achieved by not always maintaining a 1:1 + mapping between pass 1 and pass 2 primitives, renaming primitives, + etc. For every new primitive, the already-existing primitives were + considered to try to make them as coherent as possible. + + For each primitive, the following style was used: + + o PRIMITIVENAME.PROTOCOL: + Pass 1 primitive/event: + Parameters: + Returns: + Comments: + + The entries "Parameters", "Returns", and "Comments" were skipped when + a primitive had no parameters, no described return value, or no + comments seemed necessary, respectively. Optional parameters are + followed by "(optional)". When known, default values were provided. + + Pass 3: The main point of this pass is to identify transport features + that are the result of static properties of protocols, for which all + protocols have to be listed together; this is then the final list of + + + +Welzl, et al. Informational [Page 55] + +RFC 8303 Transport Services February 2018 + + + all available transport features. This list was primarily based on + text from pass 2, with additional input from pass 1 (but no external + sources). + +Acknowledgements + + The authors would like to thank (in alphabetical order) Bob Briscoe, + Spencer Dawkins, Aaron Falk, David Hayes, Karen Nielsen, Tommy Pauly, + Joe Touch, and Brian Trammell for providing valuable feedback on this + document. We especially thank Christoph Paasch for providing input + related to Multipath TCP and Gorry Fairhurst and Tom Jones for + providing input related to UDP(-Lite). This work has received + funding from the European Union's Horizon 2020 research and + innovation programme under grant agreement No. 644334 (NEAT). + +Authors' Addresses + + Michael Welzl + University of Oslo + PO Box 1080 Blindern + Oslo N-0316 + Norway + + Email: michawe@ifi.uio.no + + + Michael Tuexen + Muenster University of Applied Sciences + Stegerwaldstrasse 39 + Steinfurt 48565 + Germany + + Email: tuexen@fh-muenster.de + + + Naeem Khademi + University of Oslo + PO Box 1080 Blindern + Oslo N-0316 + Norway + + Email: naeemk@ifi.uio.no + + + + + + + + + +Welzl, et al. Informational [Page 56] + |