draft-ietf-taps-impl-07.txt   draft-ietf-taps-impl-08.txt 
TAPS Working Group A. Brunstrom, Ed. TAPS Working Group A. Brunstrom, Ed.
Internet-Draft Karlstad University Internet-Draft Karlstad University
Intended status: Informational T. Pauly, Ed. Intended status: Informational T. Pauly, Ed.
Expires: 14 January 2021 Apple Inc. Expires: 6 May 2021 Apple Inc.
T. Enghardt T. Enghardt
Netflix Netflix
K-J. Grinnemo K-J. Grinnemo
Karlstad University Karlstad University
T. Jones T. Jones
University of Aberdeen University of Aberdeen
P. Tiesel P. Tiesel
TU Berlin TU Berlin
C. Perkins C. Perkins
University of Glasgow University of Glasgow
M. Welzl M. Welzl
University of Oslo University of Oslo
13 July 2020 2 November 2020
Implementing Interfaces to Transport Services Implementing Interfaces to Transport Services
draft-ietf-taps-impl-07 draft-ietf-taps-impl-08
Abstract Abstract
The Transport Services (TAPS) system enables applications to use The Transport Services (TAPS) system enables applications to use
transport protocols flexibly for network communication and defines a transport protocols flexibly for network communication and defines a
protocol-independent TAPS Application Programming Interface (API) protocol-independent TAPS Application Programming Interface (API)
that is based on an asynchronous, event-driven interaction pattern. that is based on an asynchronous, event-driven interaction pattern.
This document serves as a guide to implementation on how to build This document serves as a guide to implementation on how to build
such a system. such a system.
skipping to change at page 1, line 48 skipping to change at page 1, line 48
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 14 January 2021. This Internet-Draft will expire on 6 May 2021.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
skipping to change at page 2, line 34 skipping to change at page 2, line 34
3.1. Configuration-time errors . . . . . . . . . . . . . . . . 5 3.1. Configuration-time errors . . . . . . . . . . . . . . . . 5
3.2. Role of system policy . . . . . . . . . . . . . . . . . . 6 3.2. Role of system policy . . . . . . . . . . . . . . . . . . 6
4. Implementing Connection Establishment . . . . . . . . . . . . 7 4. Implementing Connection Establishment . . . . . . . . . . . . 7
4.1. Candidate Gathering . . . . . . . . . . . . . . . . . . . 8 4.1. Candidate Gathering . . . . . . . . . . . . . . . . . . . 8
4.1.1. Gathering Endpoint Candidates . . . . . . . . . . . . 8 4.1.1. Gathering Endpoint Candidates . . . . . . . . . . . . 8
4.1.2. Structuring Options as a Tree . . . . . . . . . . . . 9 4.1.2. Structuring Options as a Tree . . . . . . . . . . . . 9
4.1.3. Branch Types . . . . . . . . . . . . . . . . . . . . 11 4.1.3. Branch Types . . . . . . . . . . . . . . . . . . . . 11
4.1.4. Branching Order-of-Operations . . . . . . . . . . . . 13 4.1.4. Branching Order-of-Operations . . . . . . . . . . . . 13
4.1.5. Sorting Branches . . . . . . . . . . . . . . . . . . 14 4.1.5. Sorting Branches . . . . . . . . . . . . . . . . . . 14
4.2. Candidate Racing . . . . . . . . . . . . . . . . . . . . 16 4.2. Candidate Racing . . . . . . . . . . . . . . . . . . . . 16
4.2.1. Immediate . . . . . . . . . . . . . . . . . . . . . . 16 4.2.1. Simultaneous . . . . . . . . . . . . . . . . . . . . 16
4.2.2. Delayed . . . . . . . . . . . . . . . . . . . . . . . 17 4.2.2. Staggered . . . . . . . . . . . . . . . . . . . . . . 17
4.2.3. Failover . . . . . . . . . . . . . . . . . . . . . . 17 4.2.3. Failover . . . . . . . . . . . . . . . . . . . . . . 18
4.3. Completing Establishment . . . . . . . . . . . . . . . . 18 4.3. Completing Establishment . . . . . . . . . . . . . . . . 18
4.3.1. Determining Successful Establishment . . . . . . . . 19 4.3.1. Determining Successful Establishment . . . . . . . . 19
4.4. Establishing multiplexed connections . . . . . . . . . . 19 4.4. Establishing multiplexed connections . . . . . . . . . . 20
4.5. Handling racing with "unconnected" protocols . . . . . . 20 4.5. Handling racing with "unconnected" protocols . . . . . . 20
4.6. Implementing listeners . . . . . . . . . . . . . . . . . 20 4.6. Implementing listeners . . . . . . . . . . . . . . . . . 20
4.6.1. Implementing listeners for Connected Protocols . . . 21 4.6.1. Implementing listeners for Connected Protocols . . . 21
4.6.2. Implementing listeners for Unconnected Protocols . . 21 4.6.2. Implementing listeners for Unconnected Protocols . . 21
4.6.3. Implementing listeners for Multiplexed Protocols . . 21 4.6.3. Implementing listeners for Multiplexed Protocols . . 21
5. Implementing Sending and Receiving Data . . . . . . . . . . . 21 5. Implementing Sending and Receiving Data . . . . . . . . . . . 22
5.1. Sending Messages . . . . . . . . . . . . . . . . . . . . 22 5.1. Sending Messages . . . . . . . . . . . . . . . . . . . . 22
5.1.1. Message Properties . . . . . . . . . . . . . . . . . 22 5.1.1. Message Properties . . . . . . . . . . . . . . . . . 22
5.1.2. Send Completion . . . . . . . . . . . . . . . . . . . 23 5.1.2. Send Completion . . . . . . . . . . . . . . . . . . . 24
5.1.3. Batching Sends . . . . . . . . . . . . . . . . . . . 24 5.1.3. Batching Sends . . . . . . . . . . . . . . . . . . . 24
5.2. Receiving Messages . . . . . . . . . . . . . . . . . . . 24 5.2. Receiving Messages . . . . . . . . . . . . . . . . . . . 24
5.3. Handling of data for fast-open protocols . . . . . . . . 24 5.3. Handling of data for fast-open protocols . . . . . . . . 25
6. Implementing Message Framers . . . . . . . . . . . . . . . . 25 6. Implementing Message Framers . . . . . . . . . . . . . . . . 26
6.1. Defining Message Framers . . . . . . . . . . . . . . . . 26 6.1. Defining Message Framers . . . . . . . . . . . . . . . . 26
6.2. Sender-side Message Framing . . . . . . . . . . . . . . . 27 6.2. Sender-side Message Framing . . . . . . . . . . . . . . . 28
6.3. Receiver-side Message Framing . . . . . . . . . . . . . . 27 6.3. Receiver-side Message Framing . . . . . . . . . . . . . . 28
7. Implementing Connection Management . . . . . . . . . . . . . 28 7. Implementing Connection Management . . . . . . . . . . . . . 29
7.1. Pooled Connection . . . . . . . . . . . . . . . . . . . . 29 7.1. Pooled Connection . . . . . . . . . . . . . . . . . . . . 30
7.2. Handling Path Changes . . . . . . . . . . . . . . . . . . 29 7.2. Handling Path Changes . . . . . . . . . . . . . . . . . . 30
8. Implementing Connection Termination . . . . . . . . . . . . . 30 8. Implementing Connection Termination . . . . . . . . . . . . . 31
9. Cached State . . . . . . . . . . . . . . . . . . . . . . . . 31 9. Cached State . . . . . . . . . . . . . . . . . . . . . . . . 32
9.1. Protocol state caches . . . . . . . . . . . . . . . . . . 31 9.1. Protocol state caches . . . . . . . . . . . . . . . . . . 33
9.2. Performance caches . . . . . . . . . . . . . . . . . . . 32 9.2. Performance caches . . . . . . . . . . . . . . . . . . . 33
10. Specific Transport Protocol Considerations . . . . . . . . . 33 10. Specific Transport Protocol Considerations . . . . . . . . . 34
10.1. TCP . . . . . . . . . . . . . . . . . . . . . . . . . . 34 10.1. TCP . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.2. UDP . . . . . . . . . . . . . . . . . . . . . . . . . . 35 10.2. MPTCP . . . . . . . . . . . . . . . . . . . . . . . . . 37
10.3. UDP Multicast Receive . . . . . . . . . . . . . . . . . 37 10.3. UDP . . . . . . . . . . . . . . . . . . . . . . . . . . 37
10.4. TLS . . . . . . . . . . . . . . . . . . . . . . . . . . 38 10.4. UDP-Lite . . . . . . . . . . . . . . . . . . . . . . . . 38
10.5. DTLS . . . . . . . . . . . . . . . . . . . . . . . . . . 40 10.5. UDP Multicast Receive . . . . . . . . . . . . . . . . . 38
10.6. HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . 40 10.6. SCTP . . . . . . . . . . . . . . . . . . . . . . . . . . 40
10.7. QUIC . . . . . . . . . . . . . . . . . . . . . . . . . . 41 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42
10.8. HTTP/2 transport . . . . . . . . . . . . . . . . . . . . 42 12. Security Considerations . . . . . . . . . . . . . . . . . . . 42
10.9. SCTP . . . . . . . . . . . . . . . . . . . . . . . . . . 42 12.1. Considerations for Candidate Gathering . . . . . . . . . 43
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 44 12.2. Considerations for Candidate Racing . . . . . . . . . . 43
12. Security Considerations . . . . . . . . . . . . . . . . . . . 45 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 43
12.1. Considerations for Candidate Gathering . . . . . . . . . 45 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 43
12.2. Considerations for Candidate Racing . . . . . . . . . . 45 14.1. Normative References . . . . . . . . . . . . . . . . . . 44
13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 45 14.2. Informative References . . . . . . . . . . . . . . . . . 45
14. References . . . . . . . . . . . . . . . . . . . . . . . . . 46 Appendix A. API Mapping Template . . . . . . . . . . . . . . . . 46
14.1. Normative References . . . . . . . . . . . . . . . . . . 46 Appendix B. Additional Properties . . . . . . . . . . . . . . . 47
14.2. Informative References . . . . . . . . . . . . . . . . . 47 B.1. Properties Affecting Sorting of Branches . . . . . . . . 47
Appendix A. Additional Properties . . . . . . . . . . . . . . . 48 Appendix C. Reasons for errors . . . . . . . . . . . . . . . . . 47
A.1. Properties Affecting Sorting of Branches . . . . . . . . 48 Appendix D. Existing Implementations . . . . . . . . . . . . . . 48
Appendix B. Reasons for errors . . . . . . . . . . . . . . . . . 49 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 49
Appendix C. Existing Implementations . . . . . . . . . . . . . . 50
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 51
1. Introduction 1. Introduction
The Transport Services architecture [I-D.ietf-taps-arch] defines a The Transport Services architecture [I-D.ietf-taps-arch] defines a
system that allows applications to use transport networking protocols system that allows applications to use transport networking protocols
flexibly. The interface such a system exposes to applications is flexibly. The interface such a system exposes to applications is
defined as the Transport Services API [I-D.ietf-taps-interface]. defined as the Transport Services API [I-D.ietf-taps-interface].
This API is designed to be generic across multiple transport This API is designed to be generic across multiple transport
protocols and sets of protocols features. protocols and sets of protocols features.
skipping to change at page 16, line 23 skipping to change at page 16, line 23
This section covers the dynamic aspect of connection establishment. This section covers the dynamic aspect of connection establishment.
The tree described above is a useful conceptual and architectural The tree described above is a useful conceptual and architectural
model. However, an implementation is unable to know the full tree model. However, an implementation is unable to know the full tree
before it is formed and many of the possible branches ultimately before it is formed and many of the possible branches ultimately
might not be used. might not be used.
There are three different approaches to racing the attempts for There are three different approaches to racing the attempts for
different nodes of the connection establishment tree: different nodes of the connection establishment tree:
1. Immediate 1. Simultaneous
2. Delayed 2. Staggered
3. Failover 3. Failover
Each approach is appropriate in different use-cases and branch types. Each approach is appropriate in different use-cases and branch types.
However, to avoid consuming unnecessary network resources, However, to avoid consuming unnecessary network resources,
implementations should not use immediate racing as a default implementations should not use simultaneous racing as a default
approach. approach.
The timing algorithms for racing should remain independent across The timing algorithms for racing should remain independent across
branches of the tree. Any timers or racing logic is isolated to a branches of the tree. Any timers or racing logic is isolated to a
given parent node, and is not ordered precisely with regards to other given parent node, and is not ordered precisely with regards to other
children of other nodes. children of other nodes.
4.2.1. Immediate 4.2.1. Simultaneous
Immediate racing is when multiple alternate branches are started Simultaneous racing is when multiple alternate branches are started
without waiting for any one branch to make progress before starting without waiting for any one branch to make progress before starting
the next alternative. This means the attempts are effectively the next alternative. This means the attempts are effectively
simultaneous. Immediate racing should be avoided by implementations, simultaneous. Simultaneous racing should be avoided by
since it consumes extra network resources and establishes state that implementations, since it consumes extra network resources and
might not be used. establishes state that might not be used.
4.2.2. Delayed 4.2.2. Staggered
Delayed racing can be used whenever a single node of the tree has Staggered racing can be used whenever a single node of the tree has
multiple child nodes. Based on the order determined when building multiple child nodes. Based on the order determined when building
the tree, the first child node will be initiated immediately, the tree, the first child node will be initiated immediately,
followed by the next child node after some delay. Once that second followed by the next child node after some delay. Once that second
child node is initiated, the third child node (if present) will begin child node is initiated, the third child node (if present) will begin
after another delay, and so on until all child nodes have been after another delay, and so on until all child nodes have been
initiated, or one of the child nodes successfully completes its initiated, or one of the child nodes successfully completes its
negotiation. negotiation.
Delayed racing attempts occur in parallel. Implementations should Staggered racing attempts can proceed in parallel. Implementations
not terminate an earlier child connection attempt upon starting a should not terminate an earlier child connection attempt upon
secondary child. starting a secondary child.
The delay between starting child nodes should be based on the If a child node fails to connect before the delay time has expired
properties of the previously started child node. For example, if the for the next child, the next child should be started immediately.
first child represents an IP address with a known route, and the
second child represents another IP address, the delay between
starting the first and second IP addresses can be based on the
expected retransmission cadence for the first child's connection
(derived from historical round-trip-time). Alternatively, if the
first child represents a branch on a Wi-Fi interface, and the second
child represents a branch on an LTE interface, the delay should be
based on the expected time in which the branch for the first
interface would be able to establish a connection, based on link
quality and historical round-trip-time.
Any delay should have a defined minimum and maximum value based on Staggered racing between IP addresses for a generic Connection should
the branch type. Generally, branches between paths and protocols follow the Happy Eyeballs algorithm described in [RFC8305].
should have longer delays than branches between derived endpoints. [RFC8421] provides guidance for racing when performing Interactive
The maximum delay should be considered with regards to how long a Connectivity Establishment (ICE).
user is expected to wait for the connection to complete.
If a child node fails to connect before the delay timer has fired for Generally, the delay before starting a given child node ought to be
the next child, the next child should be started immediately. based on the length of time the previously started child node is
expected to take before it succeeds or makes progress in connection
establishment. Algorithms like Happy Eyeballs choose a delay based
on how long the transport connection handshake is expected to take.
When performing staggered races in multiple branch types (such as
racing between network interfaces, and then racing between IP
addresses), a longer delay may be chosen for some branch types. For
example, when racing between network interfaces, the delay should
also take into account the amount of time it takes to prepare the
network interface (such as radio association) and name resolution
over that interface, in addition to the delay that would be added for
a single transport connection handshake.
Since the staggered delay can be chosen based on dynamic information,
such as predicted round-trip time, implementations should define
upper and lower bounds for delay times. These bounds are
implementation-specific, and may differ based on which branch type is
being used.
4.2.3. Failover 4.2.3. Failover
If an implementation or application has a strong preference for one If an implementation or application has a strong preference for one
branch over another, the branching node may choose to wait until one branch over another, the branching node may choose to wait until one
child has failed before starting the next. Failure of a leaf node is child has failed before starting the next. Failure of a leaf node is
determined by its protocol negotiation failing or timing out; failure determined by its protocol negotiation failing or timing out; failure
of a parent branching node is determined by all of its children of a parent branching node is determined by all of its children
failing. failing.
skipping to change at page 24, line 42 skipping to change at page 25, line 8
content it wants to receive at one time. content it wants to receive at one time.
If a Connection becomes finished before a requested Receive action If a Connection becomes finished before a requested Receive action
can be satisfied, the implementation should deliver any partial can be satisfied, the implementation should deliver any partial
Message content outstanding, or if none is available, an indication Message content outstanding, or if none is available, an indication
that there will be no more received Messages. that there will be no more received Messages.
5.3. Handling of data for fast-open protocols 5.3. Handling of data for fast-open protocols
Several protocols allow sending higher-level protocol or application Several protocols allow sending higher-level protocol or application
data within the first packet of their protocol establishment, such as data during their protocol establishment, such as TCP Fast Open
TCP Fast Open [RFC7413] and TLS 1.3 [RFC8446]. This approach is [RFC7413] and TLS 1.3 [RFC8446]. This approach is referred to as
referred to as sending Zero-RTT (0-RTT) data. This is a desirable sending Zero-RTT (0-RTT) data. This is a desirable property, but
property, but poses challenges to an implementation that uses racing poses challenges to an implementation that uses racing during
during connection establishment. connection establishment.
The amount of data that can be sent as 0-RTT data varies by protocol
and can be queried by the application using the "Maximum Message Size
Concurrent with Connection Establishment" Connection Property. An
implementation can set this property according to the protocols that
it will race based on the given Selection Properties when the
application requests to establish a connection.
If the application has 0-RTT data to send in any protocol handshakes, If the application has 0-RTT data to send in any protocol handshakes,
it needs to provide this data before the handshakes have begun. When it needs to provide this data before the handshakes have begun. When
racing, this means that the data should be provided before the racing, this means that the data should be provided before the
process of connection establishment has begun. If the application process of connection establishment has begun. If the application
wants to send 0-RTT data, it must indicate this to the implementation wants to send 0-RTT data, it must indicate this to the implementation
by setting the "Safely Replayable" send parameter to true when by setting the "Safely Replayable" send parameter to true when
sending the data. In general, 0-RTT data may be replayed (for sending the data. In general, 0-RTT data may be replayed (for
example, if a TCP SYN contains data, and the SYN is retransmitted, example, if a TCP SYN contains data, and the SYN is retransmitted,
the data will be retransmitted as well but may be considered as a new the data will be retransmitted as well but may be considered as a new
skipping to change at page 29, line 40 skipping to change at page 30, line 23
These Pooled Connections can use multiple connections or multiple These Pooled Connections can use multiple connections or multiple
streams of multi-streaming connections between endpoints, as long as streams of multi-streaming connections between endpoints, as long as
all of these satisfy the requirements, and prohibitions specified in all of these satisfy the requirements, and prohibitions specified in
the Selection Properties of the Pooled Connection. This enables the Selection Properties of the Pooled Connection. This enables
implementations to realize transparent connection coalescing, implementations to realize transparent connection coalescing,
connection migration, and to perform per-message endpoint and path connection migration, and to perform per-message endpoint and path
selection by choosing among these underlying connections. selection by choosing among these underlying connections.
7.2. Handling Path Changes 7.2. Handling Path Changes
When a path change occurs, the Transport Services implementation is When a path change occurs, e.g., when the IP address of an interface
responsible for notifying Protocol Instances in the Protocol Stack. changes or a new interface becomes available, the Transport Services
If the Protocol Stack includes a transport protocol that supports implementation is responsible for notifying the application of the
multipath connectivity, an update to the available paths should change. The path change may interrupt connectivity on a path for an
inform the Protocol Instance of the new set of paths that are active connection or provide an opportunity for a transport that
permissible based on the Selection Properties passed by the supports multipath or migration to adapt to the new paths.
application. A multipath protocol can establish new subflows over
new paths, and should tear down subflows over paths that are no For protocols that do not support multipath or migration, the
longer available. Pooled Connections Section 7.1 may add or remove Protocol Instances should be informed of the path change, but should
underlying transport connections in a similar manner. If the not be forcibly disconnected if the previously used path becomes
Protocol Stack includes a transport protocol that does not support unavailable.
multipath, but support migrating between paths, the update to
available paths can be used as the trigger to migrating the If the Protocol Stack includes a transport protocol that also
connection. For protocols that do not support multipath or supports multipath connectivity with migration support, the Transport
migration, the Protocol Instances may be informed of the path change, Services implementation should also inform the Protocol Instance of
but should not be forcibly disconnected if the previously used path potentially new paths that become permissible based on the Selection
becomes unavailable. An exception to this case is if the System Properties passed by the application. A protocol can then establish
Policy changes to prohibit traffic from the Connection based on its new subflows over new paths while an active path is still available
properties, in which case the Protocol Stack should be disconnected. or, if migration is supported, also after a break has been detected,
and should attempt to tear down subflows over paths that are no
longer used. The Transport Services API provides an interface to set
a multipath policy that indicates when and how different paths should
be used. However, detailed handling of these policies is still
implementation-specific. The decision about when to create a new
path or to announce a new path or set of paths to the remote
endpoint, e.g., in the form of additional IP addresses, is
implementation-specific or could be be supported by future API
extensions. If the Protocol Stack includes a transport protocol that
does not support multipath, but does support migrating between paths,
the update to the set of available paths can trigger the connection
to be migrated.
In case of Pooled Connections Section 7.1, the transport system may
add connections over new paths or different protocols to the pool if
permissible based on the multipath policy and Selection Properties.
In case a previously used path becomes unavailable, the transport
system may disconnect all connections that require this path, but
should not disconnect the pooled connection object exposed to the
application. The strategy how is implementation-specific, but should
be consistent with the behavior of multipath transports.
8. Implementing Connection Termination 8. Implementing Connection Termination
With TCP, when an application closes a connection, this means that it With TCP, when an application closes a connection, this means that it
has no more data to send (but expects all data that has been handed has no more data to send (but expects all data that has been handed
over to be reliably delivered). However, with TCP only, "close" does over to be reliably delivered). However, with TCP only, "close" does
not mean that the application will stop receiving data. This is not mean that the application will stop receiving data. This is
related to TCP's ability to support half-closed connections. related to TCP's ability to support half-closed connections.
SCTP is an example of a protocol that does not support such half- SCTP is an example of a protocol that does not support such half-
skipping to change at page 33, line 18 skipping to change at page 34, line 37
over a relatively short time interval. For such values, the over a relatively short time interval. For such values, the
implementation should remove them from the cache more quickly, or implementation should remove them from the cache more quickly, or
treat older values with less confidence/weight. treat older values with less confidence/weight.
[I-D.ietf-tcpm-2140bis] provides guidance about sharing of TCP [I-D.ietf-tcpm-2140bis] provides guidance about sharing of TCP
Control Block information between connections on initialization. Control Block information between connections on initialization.
10. Specific Transport Protocol Considerations 10. Specific Transport Protocol Considerations
Each protocol that can run as part of a Transport Services Each protocol that can run as part of a Transport Services
implementation defines both its API mapping as well as implementation implementation should have a well-defined API mapping. API mappings
details. API mappings for a protocol apply most to Connections in for a protocol apply most to Connections in which the given protocol
which the given protocol is the "top" of the Protocol Stack. For is the "top" of the Protocol Stack. For example, the mapping of the
example, the mapping of the "Send" function for TCP applies to "Send" function for TCP applies to Connections in which the
Connections in which the application directly sends over TCP. If application directly sends over TCP.
HTTP/2 is used on top of TCP, the HTTP/2 mappings take precendence.
Each protocol has a notion of Connectedness. Possible values for Each protocol has a notion of Connectedness. Possible values for
Connectedness are: Connectedness are:
* Unconnected. Unconnected protocols do not establish explicit * Unconnected. Unconnected protocols do not establish explicit
state between endpoints, and do not perform a handshake during state between endpoints, and do not perform a handshake during
Connection establishment. Connection establishment.
* Connected. Connected protocols establish state between endpoints, * Connected. Connected protocols establish state between endpoints,
and perform a handshake during Connection establishment. The and perform a handshake during Connection establishment. The
skipping to change at page 34, line 20 skipping to change at page 35, line 38
sent and received either as complete or partial Messages. Maximum sent and received either as complete or partial Messages. Maximum
Message lengths can be defined, and Messages can be partially Message lengths can be defined, and Messages can be partially
reliable. reliable.
Below, terms in capitals with a dot (e.g., "CONNECT.SCTP") refer to Below, terms in capitals with a dot (e.g., "CONNECT.SCTP") refer to
the primitives with the same name in section 4 of [RFC8303]. For the primitives with the same name in section 4 of [RFC8303]. For
further implementation details, the description of these primitives further implementation details, the description of these primitives
in [RFC8303] points to section 3 of [RFC8303] and section 3 of in [RFC8303] points to section 3 of [RFC8303] and section 3 of
[RFC8304], which refers back to the relevant specifications for each [RFC8304], which refers back to the relevant specifications for each
protocol. This back-tracking method applies to all elements of protocol. This back-tracking method applies to all elements of
[I-D.ietf-taps-minset] (see appendix D of [I-D.ietf-taps-interface]): [RFC8923] (see appendix D of [I-D.ietf-taps-interface]): they are
they are listed in appendix A of [I-D.ietf-taps-minset] with an listed in appendix A of [RFC8923] with an implementation hint in the
implementation hint in the same style, pointing back to section 4 of same style, pointing back to section 4 of [RFC8303].
[RFC8303].
This document defines the API mappings for protocols defined in
[RFC8923]. Other protocol mappings can be provided as separate
documents, following the mapping template Appendix A.
10.1. TCP 10.1. TCP
Connectedness: Connected Connectedness: Connected
Data Unit: Byte-stream Data Unit: Byte-stream
API mappings for TCP are as follows: API mappings for TCP are as follows:
Connection Object: TCP connections between two hosts map directly to Connection Object: TCP connections between two hosts map directly to
skipping to change at page 35, line 40 skipping to change at page 37, line 12
Close: Calling "Close" on a TCP Connection indicates that the Close: Calling "Close" on a TCP Connection indicates that the
Connection should be gracefully closed (CLOSE.TCP) by sending a Connection should be gracefully closed (CLOSE.TCP) by sending a
FIN to the peer and waiting for a FIN-ACK before delivering the FIN to the peer and waiting for a FIN-ACK before delivering the
"Closed" event. "Closed" event.
Abort: Calling "Abort" on a TCP Connection indicates that the Abort: Calling "Abort" on a TCP Connection indicates that the
Connection should be immediately closed by sending a RST to the Connection should be immediately closed by sending a RST to the
peer (ABORT.TCP). peer (ABORT.TCP).
10.2. UDP 10.2. MPTCP
Connectedness: Connected
Data Unit: Byte-stream
API mappings for MPTCP are identical to TCP. MPTCP adds support for
multipath properties, such as "Multi-Paths Transport" and "Policy for
using Multi-Path Transports".
10.3. UDP
Connectedness: Unconnected Connectedness: Unconnected
Data Unit: Datagram Data Unit: Datagram
API mappings for UDP are as follows: API mappings for UDP are as follows:
Connection Object: UDP connections represent a pair of specific IP Connection Object: UDP connections represent a pair of specific IP
addresses and ports on two hosts. addresses and ports on two hosts.
skipping to change at page 37, line 5 skipping to change at page 38, line 31
"Received", each of which represents a single datagram received in "Received", each of which represents a single datagram received in
a UDP packet. Upon receiving a UDP datagram, the ECN flag from a UDP packet. Upon receiving a UDP datagram, the ECN flag from
the IP header can be obtained (GET_ECN.UDP(-Lite)). the IP header can be obtained (GET_ECN.UDP(-Lite)).
Close: Calling "Close" on a UDP Connection (ABORT.UDP(-Lite)) Close: Calling "Close" on a UDP Connection (ABORT.UDP(-Lite))
releases the local port reservation. releases the local port reservation.
Abort: Calling "Abort" on a UDP Connection (ABORT.UDP(-Lite)) is Abort: Calling "Abort" on a UDP Connection (ABORT.UDP(-Lite)) is
identical to calling "Close". identical to calling "Close".
10.3. UDP Multicast Receive 10.4. UDP-Lite
Connectedness: Unconnected
Data Unit: Datagram
API mappings for UDP-Lite are identical to UDP. Properties that
require checksum coverage are not supported by UDP-Lite, such as
"Corruption Protection Length", "Full Checksum Coverage on Sending",
"Required Minimum Corruption Protection Coverage for Receiving", and
"Full Checksum Coverage on Receiving".
10.5. UDP Multicast Receive
Connectedness: Unconnected Connectedness: Unconnected
Data Unit: Datagram Data Unit: Datagram
API mappings for Receiving Multicast UDP are as follows: API mappings for Receiving Multicast UDP are as follows:
Connection Object: Established UDP Multicast Receive connections Connection Object: Established UDP Multicast Receive connections
represent a pair of specific IP addresses and ports. The represent a pair of specific IP addresses and ports. The
"unidirectional receive" transport property is required, and the "unidirectional receive" transport property is required, and the
skipping to change at page 38, line 22 skipping to change at page 40, line 16
a UDP packet. Upon receiving a UDP datagram, the ECN flag from a UDP packet. Upon receiving a UDP datagram, the ECN flag from
the IP header can be obtained (GET_ECN.UDP(-Lite)). the IP header can be obtained (GET_ECN.UDP(-Lite)).
Close: Calling "Close" on a UDP Multicast Receive Connection Close: Calling "Close" on a UDP Multicast Receive Connection
(ABORT.UDP(-Lite)) releases the local port reservation and leaves (ABORT.UDP(-Lite)) releases the local port reservation and leaves
the group. the group.
Abort: Calling "Abort" on a UDP Multicast Receive Connection Abort: Calling "Abort" on a UDP Multicast Receive Connection
(ABORT.UDP(-Lite)) is identical to calling "Close". (ABORT.UDP(-Lite)) is identical to calling "Close".
10.4. TLS 10.6. SCTP
The mapping of a TLS stream abstraction into the application is
equivalent to the contract provided by TCP (see Section 10.1), and
builds upon many of the actions of TCP connections.
Connectedness: Connected
Data Unit: Byte-stream
Connection Object: Connection objects represent a single TLS
connection running over a TCP connection between two hosts.
Initiate: Calling "Initiate" on a TLS Connection causes it to first
initiate a TCP connection. Once the TCP protocol is Ready, the
TLS handshake will be performed as a client (starting by sending a
"client_hello", and so on).
InitiateWithSend: Early safely replayable data is supported by TLS
1.3, and sends encrypted application data in the first TLS message
when performing session resumption. For older versions of TLS, or
if a session is not being resumed, the initial data will be
delayed until the TLS handshake is complete. TCP Fast Open can
also be enabled automatically.
Ready: A TLS Connection is ready once the underlying TCP connection
is Ready, and TLS handshake is also complete and keys have been
established to encrypt application data.
InitiateError: In addition to TCP initiation errors, TLS can
generate errors during its handshake. Examples of error include a
failure of the peer to successfully authenticate, the peer
rejecting the local authentication, or a failure to match versions
or algorithms.
ConnectionError: TLS connections will generate TCP errors, or errors
due to failures to rekey or decrypt received messages.
Listen: Calling "Listen" for TLS listens on TCP, and sets up
received connections to perform server-side TLS handshakes.
ConnectionReceived: TLS Listeners will deliver new connections once
they have successfully completed both TCP and TLS handshakes.
Clone: As with TCP, calling "Clone" on a TLS Connection creates a
new Connection with equivalent parameters. The two Connections
are otherwise independent.
Send: Like TCP, TLS does not preserve message boundaries. Although
application data is framed natively in TLS, there is not a general
guarantee that these TLS messages represent semantically
meaningful application stream boundaries. Rather, sending data on
a TLS Connection only guarantees that the application data will be
transmitted in an encrypted form. Marking Messages as Final
causes a "close_notify" to be generated once the data has been
written.
Receive: Like TCP, TLS delivers a stream of bytes without any
Message delineation. The data is decrypted prior to being
delivered to the application. If a "close_notify" is received,
the stream-wide Message will be delivered with EndOfMessage set.
Close: Calling "Close" on a TLS Connection indicates that the
Connection should be gracefully closed by sending a "close_notify"
to the peer and waiting for a corresponding "close_notify" before
delivering the "Closed" event.
Abort: Calling "Abort" on a TCP Connection indicates that the
Connection should be immediately closed by sending a
"close_notify", optionally preceded by "user_canceled", to the
peer. Implementations do not need to wait to receive
"close_notify" before delivering the "Closed" event.
10.5. DTLS
DTLS follows the same behavior as TLS (Section 10.4), with the
notable exception of not inheriting behavior directly from TCP.
Differences from TLS are detailed below, and all cases not explicitly
mentioned should be considered the same as TLS.
Connectedness: Connected
Data Unit: Datagram
Connection Object: Connection objects represent a single DTLS
connection running over a set of UDP ports between two hosts.
Initiate: Calling "Initiate" on a DTLS Connection causes it reserve
a UDP local port, and begin sending handshake messages to the peer
over UDP. These messages are reliable, and will be automatically
retransmitted.
Ready: A DTLS Connection is ready once the TLS handshake is complete
and keys have been established to encrypt application data.
Send: Sending over DTLS does preserve message boundaries in the same
way that UDP datagrams do. Marking a Message as Final does send a
"close_notify" like TLS.
Receive: Receiving over DTLS delivers one decrypted Message for each
received DTLS datagram. If a "close_notify" is received, a
Message will be delivered that is marked as Final.
10.6. HTTP
HTTP requests and responses map naturally into Messages, since they
are delineated chunks of data with metadata that can be sent over a
transport. To that end, HTTP can be seen as the most prevalent
framing protocol that runs on top of streams like TCP, TLS, etc.
In order to use a transport Connection that provides HTTP Message
support, the establishment and closing of the connection can be
treated as it would without the framing protocol. Sending and
receiving of Messages, however, changes to treat each Message as a
well-delineated HTTP request or response, with the content of the
Message representing the body, and the Headers being provided in
Message metadata.
Connectedness: Multiplexing Connected
Data Unit: Message
Connection Object: Connection objects represent a flow of HTTP
messages between a client and a server, which may be an HTTP/1.1
connection over TCP, or a single stream in an HTTP/2 connection.
Initiate: Calling "Initiate" on an HTTP connection intiates a TCP or
TLS connection as a client.
Clone: Calling "Clone" on an HTTP Connection opens a new stream on
an existing HTTP/2 connection when possible. If the underlying
version does not support multiplexed streams, calling "Clone"
simply creates a new parallel connection.
Send: When an application sends an HTTP Message, it is expected to
provide HTTP header values as a MessageContext in a canonical
form, along with any associated HTTP message body as the Message
data. The HTTP header values are encoded in the specific version
format upon sending.
Receive: HTTP Connections deliver Messages in which HTTP header
values attached to MessageContexts, and HTTP bodies in Message
data.
Close: Calling "Close" on an HTTP Connection will only close the
underlying TLS or TCP connection if the HTTP version does not
support multiplexing. For HTTP/2, for example, closing the
connection only closes a specific stream.
10.7. QUIC
QUIC provides a multi-streaming interface to an encrypted transport.
Each stream can be viewed as equivalent to a TLS stream over TCP, so
a natural mapping is to present each QUIC stream as an individual
Connection. The protocol for the stream will be considered Ready
whenever the underlying QUIC connection is established to the point
that this stream's data can be sent. For streams after the first
stream, this will likely be an immediate operation.
Closing a single QUIC stream, presented to the application as a
Connection, does not imply closing the underlying QUIC connection
itself. Rather, the implementation may choose to close the QUIC
connection once all streams have been closed (often after some
timeout), or after an individual stream Connection sends an Abort.
Connectedness: Multiplexing Connected
Data Unit: Stream
Connection Object: Connection objects represent a single QUIC stream
on a QUIC connection.
10.8. HTTP/2 transport
Similar to QUIC (Section 10.7), HTTP/2 provides a multi-streaming
interface. This will generally use HTTP as the unit of Messages over
the streams, in which each stream can be represented as a transport
Connection. The lifetime of streams and the HTTP/2 connection should
be managed as described for QUIC.
It is possible to treat each HTTP/2 stream as a raw byte-stream
instead of a carrier for HTTP messages, in which case the Messages
over the streams can be represented similarly to the TCP stream (one
Message per direction, see Section 10.1).
Connectedness: Multiplexing Connected
Data Unit: Stream
Connection Object: Connection objects represent a single HTTP/2
stream on a HTTP/2 connection.
10.9. SCTP
Connectedness: Connected Connectedness: Connected
Data Unit: Message Data Unit: Message
API mappings for SCTP are as follows: API mappings for SCTP are as follows:
Connection Object: Connection objects represent a flow of SCTP Connection Object: Connection objects represent a flow of SCTP
messages between a client and a server, which may be an SCTP messages between a client and a server, which may be an SCTP
association or a stream in a SCTP association. How to map association or a stream in a SCTP association. How to map
skipping to change at page 46, line 16 skipping to change at page 44, line 4
Sciences Research Council under grant EP/R04144X/1. Sciences Research Council under grant EP/R04144X/1.
This work has been supported by the Research Council of Norway under This work has been supported by the Research Council of Norway under
its "Toppforsk" programme through the "OCARINA" project. its "Toppforsk" programme through the "OCARINA" project.
Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric
Kinnear for their implementation and design efforts, including Happy Kinnear for their implementation and design efforts, including Happy
Eyeballs, that heavily influenced this work. Eyeballs, that heavily influenced this work.
14. References 14. References
14.1. Normative References 14.1. Normative References
[I-D.ietf-taps-arch] [I-D.ietf-taps-arch]
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G.,
Perkins, C., Tiesel, P., and C. Wood, "An Architecture for Perkins, C., Tiesel, P., and C. Wood, "An Architecture for
Transport Services", Work in Progress, Internet-Draft, Transport Services", Work in Progress, Internet-Draft,
draft-ietf-taps-arch-07, 9 March 2020, draft-ietf-taps-arch-08, 13 July 2020,
<http://www.ietf.org/internet-drafts/draft-ietf-taps-arch- <http://www.ietf.org/internet-drafts/draft-ietf-taps-arch-
07.txt>. 08.txt>.
[I-D.ietf-taps-interface] [I-D.ietf-taps-interface]
Trammell, B., Welzl, M., Enghardt, T., Fairhurst, G., Trammell, B., Welzl, M., Enghardt, T., Fairhurst, G.,
Kuehlewind, M., Perkins, C., Tiesel, P., Wood, C., and T. Kuehlewind, M., Perkins, C., Tiesel, P., Wood, C., and T.
Pauly, "An Abstract Application Layer Interface to Pauly, "An Abstract Application Layer Interface to
Transport Services", Work in Progress, Internet-Draft, Transport Services", Work in Progress, Internet-Draft,
draft-ietf-taps-interface-06, 9 March 2020, draft-ietf-taps-interface-09, 27 July 2020,
<http://www.ietf.org/internet-drafts/draft-ietf-taps-
interface-06.txt>.
[I-D.ietf-taps-minset]
Welzl, M. and S. Gjessing, "A Minimal Set of Transport
Services for End Systems", Work in Progress, Internet-
Draft, draft-ietf-taps-minset-11, 27 September 2018,
<http://www.ietf.org/internet-drafts/draft-ietf-taps- <http://www.ietf.org/internet-drafts/draft-ietf-taps-
minset-11.txt>. interface-09.txt>.
[RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP
Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014,
<https://www.rfc-editor.org/info/rfc7413>. <https://www.rfc-editor.org/info/rfc7413>.
[RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
DOI 10.17487/RFC7540, May 2015, DOI 10.17487/RFC7540, May 2015,
<https://www.rfc-editor.org/info/rfc7540>. <https://www.rfc-editor.org/info/rfc7540>.
skipping to change at page 47, line 26 skipping to change at page 45, line 5
[RFC8304] Fairhurst, G. and T. Jones, "Transport Features of the [RFC8304] Fairhurst, G. and T. Jones, "Transport Features of the
User Datagram Protocol (UDP) and Lightweight UDP (UDP- User Datagram Protocol (UDP) and Lightweight UDP (UDP-
Lite)", RFC 8304, DOI 10.17487/RFC8304, February 2018, Lite)", RFC 8304, DOI 10.17487/RFC8304, February 2018,
<https://www.rfc-editor.org/info/rfc8304>. <https://www.rfc-editor.org/info/rfc8304>.
[RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: [RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2:
Better Connectivity Using Concurrency", RFC 8305, Better Connectivity Using Concurrency", RFC 8305,
DOI 10.17487/RFC8305, December 2017, DOI 10.17487/RFC8305, December 2017,
<https://www.rfc-editor.org/info/rfc8305>. <https://www.rfc-editor.org/info/rfc8305>.
[RFC8421] Martinsen, P., Reddy, T., and P. Patil, "Guidelines for
Multihomed and IPv4/IPv6 Dual-Stack Interactive
Connectivity Establishment (ICE)", BCP 217, RFC 8421,
DOI 10.17487/RFC8421, July 2018,
<https://www.rfc-editor.org/info/rfc8421>.
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
<https://www.rfc-editor.org/info/rfc8446>. <https://www.rfc-editor.org/info/rfc8446>.
[RFC8923] Welzl, M. and S. Gjessing, "A Minimal Set of Transport
Services for End Systems", RFC 8923, DOI 10.17487/RFC8923,
October 2020, <https://www.rfc-editor.org/info/rfc8923>.
14.2. Informative References 14.2. Informative References
[I-D.ietf-quic-transport] [I-D.ietf-quic-transport]
Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed
and Secure Transport", Work in Progress, Internet-Draft, and Secure Transport", Work in Progress, Internet-Draft,
draft-ietf-quic-transport-29, 9 June 2020, draft-ietf-quic-transport-32, 20 October 2020,
<http://www.ietf.org/internet-drafts/draft-ietf-quic- <http://www.ietf.org/internet-drafts/draft-ietf-quic-
transport-29.txt>. transport-32.txt>.
[I-D.ietf-tcpm-2140bis] [I-D.ietf-tcpm-2140bis]
Touch, J., Welzl, M., and S. Islam, "TCP Control Block Touch, J., Welzl, M., and S. Islam, "TCP Control Block
Interdependence", Work in Progress, Internet-Draft, draft- Interdependence", Work in Progress, Internet-Draft, draft-
ietf-tcpm-2140bis-05, 29 April 2020, <http://www.ietf.org/ ietf-tcpm-2140bis-05, 29 April 2020, <http://www.ietf.org/
internet-drafts/draft-ietf-tcpm-2140bis-05.txt>. internet-drafts/draft-ietf-tcpm-2140bis-05.txt>.
[NEAT-flow-mapping] [NEAT-flow-mapping]
"Transparent Flow Mapping for NEAT", Workshop on Future of "Transparent Flow Mapping for NEAT", Workshop on Future of
Internet Transport (FIT 2017) , 2017. Internet Transport (FIT 2017) , 2017.
skipping to change at page 48, line 30 skipping to change at page 46, line 20
(Diffserv) and Real-Time Communication", RFC 7657, (Diffserv) and Real-Time Communication", RFC 7657,
DOI 10.17487/RFC7657, November 2015, DOI 10.17487/RFC7657, November 2015,
<https://www.rfc-editor.org/info/rfc7657>. <https://www.rfc-editor.org/info/rfc7657>.
[RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive
Connectivity Establishment (ICE): A Protocol for Network Connectivity Establishment (ICE): A Protocol for Network
Address Translator (NAT) Traversal", RFC 8445, Address Translator (NAT) Traversal", RFC 8445,
DOI 10.17487/RFC8445, July 2018, DOI 10.17487/RFC8445, July 2018,
<https://www.rfc-editor.org/info/rfc8445>. <https://www.rfc-editor.org/info/rfc8445>.
Appendix A. Additional Properties Appendix A. API Mapping Template
Any protocol mapping for the Transport Services API should follow a
common template.
Connectedness: (Unconnected/Connected/Multiplexing Connected)
Data Unit: (Byte-stream/Datagram/Message)
Connection Object:
Initiate:
InitiateWithSend:
Ready:
InitiateError:
ConnectionError:
Listen:
ConnectionReceived:
Clone:
Send:
Receive:
Close:
Abort:
Appendix B. Additional Properties
This appendix discusses implementation considerations for additional This appendix discusses implementation considerations for additional
parameters and properties that could be used to enhance transport parameters and properties that could be used to enhance transport
protocol and/or path selection, or the transmission of messages given protocol and/or path selection, or the transmission of messages given
a Protocol Stack that implements them. These are not part of the a Protocol Stack that implements them. These are not part of the
interface, and may be removed from the final document, but are interface, and may be removed from the final document, but are
presented here to support discussion within the TAPS working group as presented here to support discussion within the TAPS working group as
to whether they should be added to a future revision of the base to whether they should be added to a future revision of the base
specification. specification.
A.1. Properties Affecting Sorting of Branches B.1. Properties Affecting Sorting of Branches
In addition to the Protocol and Path Selection Properties discussed In addition to the Protocol and Path Selection Properties discussed
in Section 4.1.5, the following properties under discussion can in Section 4.1.5, the following properties under discussion can
influence branch sorting: influence branch sorting:
* Bounds on Send or Receive Rate: If the application indicates a * Bounds on Send or Receive Rate: If the application indicates a
bound on the expected Send or Receive bitrate, an implementation bound on the expected Send or Receive bitrate, an implementation
may prefer a path that can likely provide the desired bandwidth, may prefer a path that can likely provide the desired bandwidth,
based on cached maximum throughput, see Section 9.2. The based on cached maximum throughput, see Section 9.2. The
application may know the Send or Receive Bitrate from metadata in application may know the Send or Receive Bitrate from metadata in
adaptive HTTP streaming, such as MPEG-DASH. adaptive HTTP streaming, such as MPEG-DASH.
* Cost Preferences: If the application indicates a preference to * Cost Preferences: If the application indicates a preference to
avoid expensive paths, and some paths are associated with a avoid expensive paths, and some paths are associated with a
monetary cost, an implementation should decrease the ranking of monetary cost, an implementation should decrease the ranking of
such paths. If the application indicates that it prohibits using such paths. If the application indicates that it prohibits using
expensive paths, paths that are associated with a cost should be expensive paths, paths that are associated with a cost should be
purged from the decision tree. purged from the decision tree.
Appendix B. Reasons for errors Appendix C. Reasons for errors
The Transport Services API [I-D.ietf-taps-interface] allows for the The Transport Services API [I-D.ietf-taps-interface] allows for the
several generic error types to specify a more detailed reason as to several generic error types to specify a more detailed reason as to
why an error occurred. This appendix lists some of the possible why an error occurred. This appendix lists some of the possible
reasons. reasons.
* InvalidConfiguration: The transport properties and endpoints * InvalidConfiguration: The transport properties and endpoints
provided by the application are either contradictory or provided by the application are either contradictory or
incomplete. Examples include the lack of a remote endpoint on an incomplete. Examples include the lack of a remote endpoint on an
active open or using a multicast group address while not active open or using a multicast group address while not
skipping to change at page 50, line 9 skipping to change at page 48, line 37
contradictory to the transport properties or they can not be contradictory to the transport properties or they can not be
satisfied by the transport system. satisfied by the transport system.
* DeframingFailed: The data that was received by the underlying * DeframingFailed: The data that was received by the underlying
protocol stack could not be deframed. protocol stack could not be deframed.
* ConnectionAborted: The connection was aborted by the peer. * ConnectionAborted: The connection was aborted by the peer.
* Timeout: Delivery of a message was not possible after a timeout. * Timeout: Delivery of a message was not possible after a timeout.
Appendix C. Existing Implementations Appendix D. Existing Implementations
This appendix gives an overview of existing implementations, at the This appendix gives an overview of existing implementations, at the
time of writing, of transport systems that are (to some degree) in time of writing, of transport systems that are (to some degree) in
line with this document. line with this document.
* Apple's Network.framework: * Apple's Network.framework:
- Network.framework is a transport-level API built for C, - Network.framework is a transport-level API built for C,
Objective-C, and Swift. It a connect-by-name API that supports Objective-C, and Swift. It a connect-by-name API that supports
transport security protocols. It provides userspace transport security protocols. It provides userspace
 End of changes. 42 change blocks. 
322 lines changed or deleted 224 lines changed or added

This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/