< draft-ietf-taps-interface-03.txt   draft-ietf-taps-interface-04.txt >
TAPS Working Group B. Trammell, Ed. TAPS Working Group B. Trammell, Ed.
Internet-Draft Google Internet-Draft Google
Intended status: Standards Track M. Welzl, Ed. Intended status: Standards Track M. Welzl, Ed.
Expires: September 12, 2019 University of Oslo Expires: January 9, 2020 University of Oslo
T. Enghardt T. Enghardt
TU Berlin TU Berlin
G. Fairhurst G. Fairhurst
University of Aberdeen University of Aberdeen
M. Kuehlewind M. Kuehlewind
ETH Zurich ETH Zurich
C. Perkins C. Perkins
University of Glasgow University of Glasgow
P. Tiesel P. Tiesel
TU Berlin TU Berlin
C. Wood C. Wood
T. Pauly
Apple Inc. Apple Inc.
March 11, 2019 July 08, 2019
An Abstract Application Layer Interface to Transport Services An Abstract Application Layer Interface to Transport Services
draft-ietf-taps-interface-03 draft-ietf-taps-interface-04
Abstract Abstract
This document describes an abstract programming interface to the This document describes an abstract programming interface to the
transport layer, following the Transport Services Architecture. It transport layer, following the Transport Services Architecture. It
supports the asynchronous, atomic transmission of messages over supports the asynchronous, atomic transmission of messages over
transport protocols and network paths dynamically selected at transport protocols and network paths dynamically selected at
runtime. It is intended to replace the traditional BSD sockets API runtime. It is intended to replace the traditional BSD sockets API
as the lowest common denominator interface to the transport layer, in as the lowest common denominator interface to the transport layer, in
an environment where endpoints have multiple interfaces and potential an environment where endpoints have multiple interfaces and potential
skipping to change at page 2, line 4 skipping to change at page 2, line 4
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 September 12, 2019. This Internet-Draft will expire on January 9, 2020.
Copyright Notice Copyright Notice
Copyright (c) 2019 IETF Trust and the persons identified as the Copyright (c) 2019 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 Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 27 skipping to change at page 2, line 27
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5
3. Interface Design Principles . . . . . . . . . . . . . . . . . 6 3. Interface Design Principles . . . . . . . . . . . . . . . . . 6
4. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7 4. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 7 4.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 8
4.1.1. Server Example . . . . . . . . . . . . . . . . . . . 8 4.1.1. Server Example . . . . . . . . . . . . . . . . . . . 8
4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9 4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9
4.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 10 4.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 10
4.2. Transport Properties . . . . . . . . . . . . . . . . . . 11 4.2. Transport Properties . . . . . . . . . . . . . . . . . . 11
4.2.1. Transport Property Names . . . . . . . . . . . . . . 12 4.2.1. Transport Property Names . . . . . . . . . . . . . . 12
4.2.2. Transport Property Types . . . . . . . . . . . . . . 13 4.2.2. Transport Property Types . . . . . . . . . . . . . . 13
4.3. Scope of the Interface Definition . . . . . . . . . . . . 13 4.3. Scope of the Interface Definition . . . . . . . . . . . . 13
5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 14 5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 14
5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 14 5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 14
5.2. Specifying Transport Properties . . . . . . . . . . . . . 16 5.2. Specifying Transport Properties . . . . . . . . . . . . . 16
5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 18 5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 18
5.2.2. Preservation of Message Boundaries . . . . . . . . . 18 5.2.2. Preservation of Message Boundaries . . . . . . . . . 18
5.2.3. Configure per-Message reliability . . . . . . . . . . 18 5.2.3. Configure Per-Message Reliability . . . . . . . . . . 18
5.2.4. Preservation of data ordering . . . . . . . . . . . . 18 5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 18
5.2.5. Use 0-RTT session establishment with an idempotent 5.2.5. Use 0-RTT Session Establishment with an Idempotent
Message . . . . . . . . . . . . . . . . . . . . . . . 19 Message . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.6. Multistream Connections in Group . . . . . . . . . . 19 5.2.6. Multistream Connections in Group . . . . . . . . . . 19
5.2.7. Control checksum coverage on sending . . . . . . . . 19 5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 19
5.2.8. Control checksum coverage on receiving . . . . . . . 19 5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 19
5.2.9. Congestion control . . . . . . . . . . . . . . . . . 19 5.2.9. Congestion control . . . . . . . . . . . . . . . . . 19
5.2.10. Interface Instance or Type . . . . . . . . . . . . . 20 5.2.10. Interface Instance or Type . . . . . . . . . . . . . 20
5.2.11. Provisioning Domain Instance or Type . . . . . . . . 21 5.2.11. Provisioning Domain Instance or Type . . . . . . . . 21
5.2.12. Parallel Use of Multiple Paths . . . . . . . . . . . 21 5.2.12. Parallel Use of Multiple Paths . . . . . . . . . . . 21
5.2.13. Direction of communication . . . . . . . . . . . . . 22 5.2.13. Direction of communication . . . . . . . . . . . . . 22
5.2.14. Notification of excessive retransmissions . . . . . . 22 5.2.14. Notification of excessive retransmissions . . . . . . 22
5.2.15. Notification of ICMP soft error message arrival . . . 22 5.2.15. Notification of ICMP soft error message arrival . . . 22
5.3. Specifying Security Parameters and Callbacks . . . . . . 22 5.3. Specifying Security Parameters and Callbacks . . . . . . 22
5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 23 5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 23
5.3.2. Connection Establishment Callbacks . . . . . . . . . 24 5.3.2. Connection Establishment Callbacks . . . . . . . . . 24
6. Establishing Connections . . . . . . . . . . . . . . . . . . 24 6. Establishing Connections . . . . . . . . . . . . . . . . . . 24
6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 24 6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 24
6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 26 6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 26
6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 27 6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 27
6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 28 6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 28
7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 29 7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 29
7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 29 7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 29
7.2. Send Events . . . . . . . . . . . . . . . . . . . . . . . 30 7.2. Sending Replies . . . . . . . . . . . . . . . . . . . . . 30
7.2.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 30 7.3. Send Events . . . . . . . . . . . . . . . . . . . . . . . 30
7.2.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 30 7.3.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2.3. SendError . . . . . . . . . . . . . . . . . . . . . . 31 7.3.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 31
7.3. Message Properties . . . . . . . . . . . . . . . . . . . 31 7.3.3. SendError . . . . . . . . . . . . . . . . . . . . . . 31
7.3.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 32 7.4. Message Properties . . . . . . . . . . . . . . . . . . . 31
7.3.2. Priority . . . . . . . . . . . . . . . . . . . . . . 32 7.4.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 32
7.3.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 33 7.4.2. Priority . . . . . . . . . . . . . . . . . . . . . . 33
7.3.4. Idempotent . . . . . . . . . . . . . . . . . . . . . 33 7.4.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 33
7.3.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 33 7.4.4. Idempotent . . . . . . . . . . . . . . . . . . . . . 34
7.3.6. Corruption Protection Length . . . . . . . . . . . . 34 7.4.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 34
7.3.7. Reliable Data Transfer (Message) . . . . . . . . . . 34 7.4.6. Corruption Protection Length . . . . . . . . . . . . 35
7.3.8. Message Capacity Profile Override . . . . . . . . . . 34 7.4.7. Reliable Data Transfer (Message) . . . . . . . . . . 35
7.3.9. Singular Transmission . . . . . . . . . . . . . . . . 35 7.4.8. Message Capacity Profile Override . . . . . . . . . . 35
7.4. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 35 7.4.9. Singular Transmission . . . . . . . . . . . . . . . . 36
7.5. Batching Sends . . . . . . . . . . . . . . . . . . . . . 36 7.5. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 36
7.6. Send on Active Open: InitiateWithSend . . . . . . . . . . 36 7.6. Batching Sends . . . . . . . . . . . . . . . . . . . . . 37
7.7. Sender-side Framing . . . . . . . . . . . . . . . . . . . 37 7.7. Send on Active Open: InitiateWithSend . . . . . . . . . . 37
8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 37 8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 38
8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 37 8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 38
8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 38 8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 39
8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 38 8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 39
8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 39 8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 39
8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 39 8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 40
8.3. Message Receive Context . . . . . . . . . . . . . . . . . 40 8.3. Receive Message Properties . . . . . . . . . . . . . . . 40
8.3.1. ECN . . . . . . . . . . . . . . . . . . . . . . . . . 40 8.3.1. ECN . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 40 8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 41
8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 40 8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 41
8.4. Receiver-side De-framing over Stream Protocols . . . . . 41 9. Message Contexts . . . . . . . . . . . . . . . . . . . . . . 41
9. Managing Connections . . . . . . . . . . . . . . . . . . . . 41 10. Message Framers . . . . . . . . . . . . . . . . . . . . . . . 42
9.1. Generic Connection Properties . . . . . . . . . . . . . . 43 10.1. Defining Message Framers . . . . . . . . . . . . . . . . 43
9.1.1. Retransmission threshold before excessive 10.2. Adding Message Framers to Connections . . . . . . . . . 43
retransmission notification . . . . . . . . . . . . . 43 10.3. Framing Meta-Data . . . . . . . . . . . . . . . . . . . 43
9.1.2. Required minimum coverage of the Corruption 10.4. Message Framer Lifetime . . . . . . . . . . . . . . . . 44
Protection for receiving . . . . . . . . . . . . . . 43 10.5. Sender-side Message Framing . . . . . . . . . . . . . . 44
9.1.3. Priority (Connection) . . . . . . . . . . . . . . . . 44 10.6. Receiver-side Message Framing . . . . . . . . . . . . . 45
9.1.4. Timeout for aborting Connection . . . . . . . . . . . 44
9.1.5. Connection group transmission scheduler . . . . . . . 44 11. Managing Connections . . . . . . . . . . . . . . . . . . . . 46
9.1.6. Maximum message size concurrent with Connection 11.1. Generic Connection Properties . . . . . . . . . . . . . 47
establishment . . . . . . . . . . . . . . . . . . . . 44 11.1.1. Retransmission Threshold Before Excessive
9.1.7. Maximum Message size before fragmentation or Retransmission Notification . . . . . . . . . . . . 47
segmentation . . . . . . . . . . . . . . . . . . . . 44 11.1.2. Required Minimum Corruption Protection Coverage for
9.1.8. Maximum Message size on send . . . . . . . . . . . . 45 Receiving . . . . . . . . . . . . . . . . . . . . . 48
9.1.9. Maximum Message size on receive . . . . . . . . . . . 45 11.1.3. Priority (Connection) . . . . . . . . . . . . . . . 48
9.1.10. Capacity Profile . . . . . . . . . . . . . . . . . . 45 11.1.4. Timeout for Aborting Connection . . . . . . . . . . 48
9.1.11. Bounds on Send or Receive Rate . . . . . . . . . . . 47 11.1.5. Connection Group Transmission Scheduler . . . . . . 49
9.1.12. TCP-specific Property: User Timeout . . . . . . . . . 47 11.1.6. Maximum Message Size Concurrent with Connection
9.2. Soft Errors . . . . . . . . . . . . . . . . . . . . . . . 47 Establishment . . . . . . . . . . . . . . . . . . . 49
9.3. Excessive retransmissions . . . . . . . . . . . . . . . . 48 11.1.7. Maximum Message Size Before Fragmentation or
10. Connection Termination . . . . . . . . . . . . . . . . . . . 48 Segmentation . . . . . . . . . . . . . . . . . . . . 49
11. Connection State and Ordering of Operations and Events . . . 48 11.1.8. Maximum Message Size on Send . . . . . . . . . . . . 49
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50 11.1.9. Maximum Message Size on Receive . . . . . . . . . . 49
13. Security Considerations . . . . . . . . . . . . . . . . . . . 50 11.1.10. Capacity Profile . . . . . . . . . . . . . . . . . . 50
14. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 50 11.1.11. Bounds on Send or Receive Rate . . . . . . . . . . . 51
15. References . . . . . . . . . . . . . . . . . . . . . . . . . 50 11.1.12. TCP-specific Property: User Timeout . . . . . . . . 52
15.1. Normative References . . . . . . . . . . . . . . . . . . 50 11.2. Soft Errors . . . . . . . . . . . . . . . . . . . . . . 52
15.2. Informative References . . . . . . . . . . . . . . . . . 51 11.3. Excessive retransmissions . . . . . . . . . . . . . . . 52
Appendix A. Additional Properties . . . . . . . . . . . . . . . 53 12. Connection Termination . . . . . . . . . . . . . . . . . . . 53
A.1. Experimental Transport Properties . . . . . . . . . . . . 53 13. Connection State and Ordering of Operations and Events . . . 53
A.1.1. Cost Preferences . . . . . . . . . . . . . . . . . . 53 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 54
Appendix B. Sample API definition in Go . . . . . . . . . . . . 54 15. Security Considerations . . . . . . . . . . . . . . . . . . . 54
16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 55
17. References . . . . . . . . . . . . . . . . . . . . . . . . . 55
17.1. Normative References . . . . . . . . . . . . . . . . . . 55
17.2. Informative References . . . . . . . . . . . . . . . . . 56
Appendix A. Additional Properties . . . . . . . . . . . . . . . 57
A.1. Experimental Transport Properties . . . . . . . . . . . . 58
A.1.1. Cost Preferences . . . . . . . . . . . . . . . . . . 58
Appendix B. Sample API definition in Go . . . . . . . . . . . . 59
Appendix C. Relationship to the Minimal Set of Transport Appendix C. Relationship to the Minimal Set of Transport
Services for End Systems . . . . . . . . . . . . . . 54 Services for End Systems . . . . . . . . . . . . . . 59
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 58 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 62
1. Introduction 1. Introduction
The BSD Unix Sockets API's SOCK_STREAM abstraction, by bringing The BSD Unix Sockets API's SOCK_STREAM abstraction, by bringing
network sockets into the UNIX programming model, allowing anyone who network sockets into the UNIX programming model, allowing anyone who
knew how to write programs that dealt with sequential-access files to knew how to write programs that dealt with sequential-access files to
also write network applications, was a revolution in simplicity. The also write network applications, was a revolution in simplicity. The
simplicity of this API is a key reason the Internet won the protocol simplicity of this API is a key reason the Internet won the protocol
wars of the 1980s. SOCK_STREAM is tied to the Transmission Control wars of the 1980s. SOCK_STREAM is tied to the Transmission Control
Protocol (TCP), specified in 1981 [RFC0793]. TCP has scaled Protocol (TCP), specified in 1981 [RFC0793]. TCP has scaled
skipping to change at page 7, line 38 skipping to change at page 7, line 44
directional or unidirectional). Connections can be created from directional or unidirectional). Connections can be created from
Preconnections in three ways: by initiating the Preconnection (i.e., Preconnections in three ways: by initiating the Preconnection (i.e.,
actively opening, as in a client), through listening on the actively opening, as in a client), through listening on the
Preconnection (i.e., passively opening, as in a server), or Preconnection (i.e., passively opening, as in a server), or
rendezvousing on the Preconnection (i.e. peer to peer rendezvousing on the Preconnection (i.e. peer to peer
establishment). establishment).
Once a Connection is established, data can be sent on it in the form Once a Connection is established, data can be sent on it in the form
of Messages. The interface supports the preservation of message of Messages. The interface supports the preservation of message
boundaries both via explicit Protocol Stack support, and via boundaries both via explicit Protocol Stack support, and via
application support through a deframing callback which finds message application support through a Message Framer which finds message
boundaries in a stream. Messages are received asynchronously through boundaries in a stream. Messages are received asynchronously through
a callback registered by the application. Errors and other a callback registered by the application. Errors and other
notifications also happen asynchronously on the Connection. notifications also happen asynchronously on the Connection.
Section 5, Section 6, Section 7, Section 8, and Section 10 describe Section 5, Section 6, Section 7, Section 8, and Section 12 describe
the details of application interaction with Objects through Actions the details of application interaction with Objects through Actions
and Events in each phase of a Connection, following the phases and Events in each phase of a Connection, following the phases
described in [I-D.ietf-taps-arch]. described in [I-D.ietf-taps-arch].
4.1. Usage Examples 4.1. Usage Examples
The following usage examples illustrate how an application might use The following usage examples illustrate how an application might use
a Transport Services Interface to: a Transport Services Interface to:
o Act as a server, by listening for incoming connections, receiving o Act as a server, by listening for incoming connections, receiving
skipping to change at page 8, line 24 skipping to change at page 8, line 29
Messages, and receiving Messages, see Section 4.1.3. Messages, and receiving Messages, see Section 4.1.3.
The examples in this section presume that a transport protocol is The examples in this section presume that a transport protocol is
available between the endpoints which provides Reliable Data available between the endpoints which provides Reliable Data
Transfer, Preservation of data ordering, and Preservation of Message Transfer, Preservation of data ordering, and Preservation of Message
Boundaries. In this case, the application can choose to receive only Boundaries. In this case, the application can choose to receive only
complete messages. complete messages.
If none of the available transport protocols provides Preservation of If none of the available transport protocols provides Preservation of
Message Boundaries, but there is a transport protocol which provides Message Boundaries, but there is a transport protocol which provides
a reliable ordered octet stream, an application may receive this a reliable ordered byte stream, an application may receive this byte
octet stream as partial Messages and transform it into application- stream as partial Messages and transform it into application-layer
layer Messages. Alternatively, an application may provide a Messages. Alternatively, an application may provide a Message
Deframer, which is a function that transforms an octet stream into a Framer, which can transform a byte stream into a sequence of Messages
sequence of Messages, see Section 8.4. (Section 10.6).
4.1.1. Server Example 4.1.1. Server Example
This is an example of how an application might listen for incoming This is an example of how an application might listen for incoming
Connections using the Transport Services Interface, receive a Connections using the Transport Services Interface, receive a
request, and send a response. request, and send a response.
LocalSpecifier := NewLocalEndpoint() LocalSpecifier := NewLocalEndpoint()
LocalSpecifier.WithInterface("any") LocalSpecifier.WithInterface("any")
LocalSpecifier.WithService("https") LocalSpecifier.WithService("https")
skipping to change at page 9, line 23 skipping to change at page 9, line 23
SecurityParameters := NewSecurityParameters() SecurityParameters := NewSecurityParameters()
SecurityParameters.AddIdentity(identity) SecurityParameters.AddIdentity(identity)
SecurityParameters.AddPrivateKey(privateKey, publicKey) SecurityParameters.AddPrivateKey(privateKey, publicKey)
// Specifying a remote endpoint is optional when using Listen() // Specifying a remote endpoint is optional when using Listen()
Preconnection := NewPreconnection(LocalSpecifier, Preconnection := NewPreconnection(LocalSpecifier,
None, None,
TransportProperties, TransportProperties,
SecurityParameters) SecurityParameters)
Preconnection.Listen() Listener := Preconnection.Listen()
Preconnection -> ConnectionReceived<Connection> Listener -> ConnectionReceived<Connection>
// Only receive complete messages // Only receive complete messages
Connection.Receive() Connection.Receive()
Connection -> Received(messageDataRequest, messageContext) Connection -> Received(messageDataRequest, messageContext)
Connection.Send(messageDataResponse) Connection.Send(messageDataResponse)
Connection.Close() Connection.Close()
// Stop listening for incoming Connections // Stop listening for incoming Connections
Preconnection.Stop() Listener.Stop()
4.1.2. Client Example 4.1.2. Client Example
This is an example of how an application might connect to a remote This is an example of how an application might connect to a remote
application using the Transport Services Interface, send a request, application using the Transport Services Interface, send a request,
and receive a response. and receive a response.
RemoteSpecifier := NewRemoteEndpoint() RemoteSpecifier := NewRemoteEndpoint()
RemoteSpecifier.WithHostname("example.com") RemoteSpecifier.WithHostname("example.com")
RemoteSpecifier.WithService("https") RemoteSpecifier.WithService("https")
skipping to change at page 11, line 51 skipping to change at page 11, line 51
Connection.Close() Connection.Close()
4.2. Transport Properties 4.2. Transport Properties
Each application using the Transport Services Interface declares its Each application using the Transport Services Interface declares its
preferences for how the transport service should operate using preferences for how the transport service should operate using
properties at each stage of the lifetime of a connection. During properties at each stage of the lifetime of a connection. During
pre-establishment, Selection Properties (see Section 5.2) are used to pre-establishment, Selection Properties (see Section 5.2) are used to
specify which paths and protocol stacks can be used and are preferred specify which paths and protocol stacks can be used and are preferred
by the application, and Connection Properties (see Section 9.1) can by the application, and Connection Properties (see Section 11.1) can
be used to influence decisions made during establishment and to fine- be used to influence decisions made during establishment and to fine-
tune the eventually established connection. These Connection tune the eventually established connection. These Connection
Properties can also be used later, to monitor and fine-tune Properties can also be used later, to monitor and fine-tune
established connections. The behavior of the selected protocol established connections. The behavior of the selected protocol
stack(s) when sending Messages is controlled by Message Properties stack(s) when sending Messages is controlled by Message Properties
(see Section 7.3). (see Section 7.4).
Collectively, Selection, Connection, and Message Properties can be Collectively, Selection, Connection, and Message Properties can be
referred to as Transport Properties. All Transport Properties, referred to as Transport Properties. All Transport Properties,
regardless of the phase in which they are used, are organized within regardless of the phase in which they are used, are organized within
a single namespace. This enables setting them as defaults in earlier a single namespace. This enables setting them as defaults in earlier
stages and querying them in later stages: - Connection Properties can stages and querying them in later stages: - Connection Properties can
be set on Preconnections - Message Properties can be set on be set on Preconnections - Message Properties can be set on
Preconnections and Connections - The effect of Selection Properties Preconnections and Connections - The effect of Selection Properties
can be queried on Connections and Messages can be queried on Connections and Messages
skipping to change at page 12, line 34 skipping to change at page 12, line 34
process. process.
4.2.1. Transport Property Names 4.2.1. Transport Property Names
Transport Properties are referred to by property names. These names Transport Properties are referred to by property names. These names
are lower-case strings whereby words are separated by hyphens. These are lower-case strings whereby words are separated by hyphens. These
names serve two purposes: names serve two purposes:
o Allow different components of a TAPS implementation to pass o Allow different components of a TAPS implementation to pass
Transport Properties, e.g., between a language frontend and a Transport Properties, e.g., between a language frontend and a
policy manager. policy manager, or as a representation of properties retrieved
from a file or other storage.
o Make code of different TAPS implementations look similar. o Make code of different TAPS implementations look similar.
Transport Property Names are hierarchically organized in the form Transport Property Names are hierarchically organized in the form
[<Namespace>.]<PropertyName>. [<Namespace>.]<PropertyName>.
o The Namespace part is empty for well known, generic properties, o The Namespace part is empty for well known, generic properties,
i.e., for properties defined by an RFC which are not protocol i.e., for properties defined by an RFC which are not protocol
specific. specific.
o Protocol Specific Properties must use the protocol acronym as o Protocol Specific Properties must use the protocol acronym as
Namespace, e.g., "tcp" for TCP specific Transport Properties. For Namespace, e.g., "tcp" for TCP specific Transport Properties. For
IETF protocols, property names under these namespaces should be IETF protocols, property names under these namespaces SHOULD be
defined in an RFC. defined in an RFC.
o Vendor or implementation specific properties must use a a string o Vendor or implementation specific properties must use a a string
identifying the vendor or implementation as Namespace. identifying the vendor or implementation as Namespace.
4.2.2. Transport Property Types 4.2.2. Transport Property Types
Transport Properties can have one of a set of data types: Transport Properties can have one of a set of data types:
o Boolean: can take the values "true" and "false"; representation is o Boolean: can take the values "true" and "false"; representation is
skipping to change at page 14, line 23 skipping to change at page 14, line 28
The pre-establishment phase allows applications to specify properties The pre-establishment phase allows applications to specify properties
for the Connections they are about to make, or to query the API about for the Connections they are about to make, or to query the API about
potential connections they could make. potential connections they could make.
A Preconnection Object represents a potential Connection. It has A Preconnection Object represents a potential Connection. It has
state that describes properties of a Connection that might exist in state that describes properties of a Connection that might exist in
the future. This state comprises Local Endpoint and Remote Endpoint the future. This state comprises Local Endpoint and Remote Endpoint
Objects that denote the endpoints of the potential Connection (see Objects that denote the endpoints of the potential Connection (see
Section 5.1), the Selection Properties (see Section 5.2), any Section 5.1), the Selection Properties (see Section 5.2), any
preconfigured Connection Properties (Section 9.1), and the security preconfigured Connection Properties (Section 11.1), and the security
parameters (see Section 5.3): parameters (see Section 5.3):
Preconnection := NewPreconnection(LocalEndpoint, Preconnection := NewPreconnection(LocalEndpoint,
RemoteEndpoint, RemoteEndpoint,
TransportProperties, TransportProperties,
SecurityParams) SecurityParams)
The Local Endpoint MUST be specified if the Preconnection is used to The Local Endpoint MUST be specified if the Preconnection is used to
Listen() for incoming Connections, but is OPTIONAL if it is used to Listen() for incoming Connections, but is OPTIONAL if it is used to
Initiate() connections. The Remote Endpoint MUST be specified if the Initiate() connections. The Remote Endpoint MUST be specified if the
Preconnection is used to Initiate() Connections, but is OPTIONAL if Preconnection is used to Initiate() Connections, but is OPTIONAL if
it is used to Listen() for incoming Connections. The Local Endpoint it is used to Listen() for incoming Connections. The Local Endpoint
and the Remote Endpoint MUST both be specified if a peer-to-peer and the Remote Endpoint MUST both be specified if a peer-to-peer
Rendezvous is to occur based on the Preconnection. Rendezvous is to occur based on the Preconnection.
Framers (see Section 7.7) and deframers (see Section 8.4), if Message Framers (see Section 10), if required, should be added to the
necessary, should be bound to the Preconnection during pre- Preconnection during pre-establishment.
establishment.
5.1. Specifying Endpoints 5.1. Specifying Endpoints
The transport services API uses the Local Endpoint and Remote The transport services API uses the Local Endpoint and Remote
Endpoint types to refer to the endpoints of a transport connection. Endpoint types to refer to the endpoints of a transport connection.
Subtypes of these represent various different types of endpoint Subtypes of these represent various different types of endpoint
identifiers, such as IP addresses, DNS names, and interface names, as identifiers, such as IP addresses, DNS names, and interface names, as
well as port numbers and service names. well as port numbers and service names.
RemoteSpecifier := NewRemoteEndpoint() RemoteSpecifier := NewRemoteEndpoint()
skipping to change at page 17, line 10 skipping to change at page 17, line 10
paths that match a Prohibit, then exclude all protocols and paths paths that match a Prohibit, then exclude all protocols and paths
that do not match a Require, then sort candidates according to that do not match a Require, then sort candidates according to
Preferred properties, and then use Avoided properties as a Preferred properties, and then use Avoided properties as a
tiebreaker. Selection Properties which select paths take preference tiebreaker. Selection Properties which select paths take preference
over those which select protocols. For example, if an application over those which select protocols. For example, if an application
indicates a preference for a specific path by specifying an indicates a preference for a specific path by specifying an
interface, but also a preference for a protocol not available on this interface, but also a preference for a protocol not available on this
path, the transport system will try the path first, ignoring the path, the transport system will try the path first, ignoring the
preference. preference.
Both Selection and Connection Properties can be added to a Selection, and Connection Properties, as well as defaults for Message
Preconnection to configure the selection process, and to further Properties, can be added to a Preconnection to configure the
configure the eventually selected protocol stack(s). They are selection process, and to further configure the eventually selected
collected into a TransportProperties object to be passed into a protocol stack(s). They are collected into a TransportProperties
Preconnection object: object to be passed into a Preconnection object:
TransportProperties := NewTransportProperties() TransportProperties := NewTransportProperties()
Individual properties are then added to the TransportProperties Individual properties are then added to the TransportProperties
Object: Object:
TransportProperties.Add(property, value) TransportProperties.Add(property, value)
Selection Properties can be added to a TransportProperties object Selection Properties can be added to a TransportProperties object
using special actions for each preference level i.e, using special actions for each preference level i.e,
skipping to change at page 17, line 45 skipping to change at page 17, line 45
For an existing Connection, the Transport Properties can be queried For an existing Connection, the Transport Properties can be queried
any time by using the following call on the Connection Object: any time by using the following call on the Connection Object:
TransportProperties := Connection.GetTransportProperties() TransportProperties := Connection.GetTransportProperties()
A Connection gets its Transport Properties either by being explicitly A Connection gets its Transport Properties either by being explicitly
configured via a Preconnection, by configuration after establishment, configured via a Preconnection, by configuration after establishment,
or by inheriting them from an antecedent via cloning; see Section 6.4 or by inheriting them from an antecedent via cloning; see Section 6.4
for more. for more.
Section 9.1 provides a list of Connection Properties, while Selection Section 11.1 provides a list of Connection Properties, while
Properties are listed in the subsections below. Note that many Selection Properties are listed in the subsections below. Note that
properties are only considered during establishment, and can not be many properties are only considered during establishment, and can not
changed after a Connection is established; however, they can be be changed after a Connection is established; however, they can be
queried. Querying a Selection Property after establishment yields queried. Querying a Selection Property after establishment yields
the value Required for properties of the selected protocol and path, the value Required for properties of the selected protocol and path,
Avoid for properties avoided during selection, and Ignore for all Avoid for properties avoided during selection, and Ignore for all
other properties. other properties.
An implementation of this interface must provide sensible defaults An implementation of this interface must provide sensible defaults
for Selection Properties. The recommended defaults given for each for Selection Properties. The recommended defaults given for each
property below represent a configuration that can be implemented over property below represent a configuration that can be implemented over
TCP. An alternate set of default Protocol Selection Properties would TCP. An alternate set of default Protocol Selection Properties would
represent a configuration that can be implemented over UDP. represent a configuration that can be implemented over UDP.
skipping to change at page 18, line 31 skipping to change at page 18, line 31
Require Reliable Data Transfer. Require Reliable Data Transfer.
5.2.2. Preservation of Message Boundaries 5.2.2. Preservation of Message Boundaries
Name: preserve-msg-boundaries Name: preserve-msg-boundaries
This property specifies whether the application needs or prefers to This property specifies whether the application needs or prefers to
use a transport protocol that preserves message boundaries. The use a transport protocol that preserves message boundaries. The
recommended default is to Prefer Preservation of Message Boundaries. recommended default is to Prefer Preservation of Message Boundaries.
5.2.3. Configure per-Message reliability 5.2.3. Configure Per-Message Reliability
Name: per-msg-reliability Name: per-msg-reliability
This property specifies whether an application considers it useful to This property specifies whether an application considers it useful to
indicate its reliability requirements on a per-Message basis. This indicate its reliability requirements on a per-Message basis. This
property applies to Connections and Connection Groups. The property applies to Connections and Connection Groups. The
recommended default is to Ignore this option. recommended default is to Ignore this option.
5.2.4. Preservation of data ordering 5.2.4. Preservation of Data Ordering
Name: preserve-order Name: preserve-order
This property specifies whether the application wishes to use a This property specifies whether the application wishes to use a
transport protocol that can ensure that data is received by the transport protocol that can ensure that data is received by the
application on the other end in the same order as it was sent. The application on the other end in the same order as it was sent. The
recommended default is to Require Preservation of data ordering. recommended default is to Require Preservation of data ordering.
5.2.5. Use 0-RTT session establishment with an idempotent Message 5.2.5. Use 0-RTT Session Establishment with an Idempotent Message
Name: zero-rtt-msg Name: zero-rtt-msg
This property specifies whether an application would like to supply a This property specifies whether an application would like to supply a
Message to the transport protocol before Connection establishment, Message to the transport protocol before Connection establishment,
which will then be reliably transferred to the other side before or which will then be reliably transferred to the other side before or
during Connection establishment, potentially multiple times. See during Connection establishment, potentially multiple times (i.e.,
also Section 7.3.4. The recommended default is to Prefer this multiple copies of the message data may be passed to the Remote
option. Endpoint). See also Section 7.4.4. The recommended default is to
Ignore this option. Note that disabling this property has no effect
for protocols that are not connection-oriented and do not protect
against duplicated messages, e.g., UDP.
5.2.6. Multistream Connections in Group 5.2.6. Multistream Connections in Group
Name: multistreaming Name: multistreaming
This property specifies that the application would prefer multiple This property specifies that the application would prefer multiple
Connections within a Connection Group to be provided by streams of a Connections within a Connection Group to be provided by streams of a
single underlying transport connection where possible. The single underlying transport connection where possible. The
recommended default is to Prefer have this option. recommended default is to Prefer this option.
5.2.7. Control checksum coverage on sending 5.2.7. Full Checksum Coverage on Sending
Name: per-msg-checksum-len-send Name: per-msg-checksum-len-send
This property specifies whether the application considers it useful This property specifies whether the application desires protection
to enable, disable, or configure a checksum when sending a Message. against corruption for all data transmitted on this Connection.
The recommended default is to Ignore this option. Disabling this property may enable to control checksum coverage later
(see Section 7.4.6). The recommended default is to Require this
option.
5.2.8. Control checksum coverage on receiving 5.2.8. Full Checksum Coverage on Receiving
Name: per-msg-checksum-len-recv Name: per-msg-checksum-len-recv
This property specifies whether the application considers it useful This property specifies whether the application desires protection
configure whether to require a checksum or not when receiving. The against corruption for all data received on this Connection. The
recommended default is to Ignore this option. recommended default is to Require this option.
5.2.9. Congestion control 5.2.9. Congestion control
Name: congestion-control Name: congestion-control
This property specifies whether the application would like the This property specifies whether the application would like the
Connection to be congestion controlled or not. Note that if a Connection to be congestion controlled or not. Note that if a
Connection is not congestion controlled, an application using such a Connection is not congestion controlled, an application using such a
Connection should itself perform congestion control in accordance Connection should itself perform congestion control in accordance
with [RFC2914]. Also note that reliability is usually combined with with [RFC2914]. Also note that reliability is usually combined with
skipping to change at page 25, line 48 skipping to change at page 25, line 51
and security parameters cannot be fulfilled on a Connection for and security parameters cannot be fulfilled on a Connection for
initiation (e.g. the set of available Paths and/or Protocol Stacks initiation (e.g. the set of available Paths and/or Protocol Stacks
meeting the constraints is empty) or reconciled with the local and/or meeting the constraints is empty) or reconciled with the local and/or
remote endpoints; when the remote specifier cannot be resolved; or remote endpoints; when the remote specifier cannot be resolved; or
when no transport-layer connection can be established to the remote when no transport-layer connection can be established to the remote
endpoint (e.g. because the remote endpoint is not accepting endpoint (e.g. because the remote endpoint is not accepting
connections, the application is prohibited from opening a Connection connections, the application is prohibited from opening a Connection
by the operating system, or the establishment attempt has timed out by the operating system, or the establishment attempt has timed out
for any other reason). for any other reason).
See also Section 7.6 to combine Connection establishment and See also Section 7.7 to combine Connection establishment and
transmission of the first message in a single action. transmission of the first message in a single action.
6.2. Passive Open: Listen 6.2. Passive Open: Listen
Passive open is the Action of waiting for Connections from remote Passive open is the Action of waiting for Connections from remote
endpoints, commonly used by servers in client-server interactions. endpoints, commonly used by servers in client-server interactions.
Passive open is supported by this interface through the Listen Passive open is supported by this interface through the Listen Action
Action: and returns a Listener object:
Preconnection.Listen() Listener := Preconnection.Listen()
Before calling Listen, the caller must have initialized the Before calling Listen, the caller must have initialized the
Preconnection during the pre-establishment phase with a Local Preconnection during the pre-establishment phase with a Local
Endpoint specifier, as well as all properties necessary for Protocol Endpoint specifier, as well as all properties necessary for Protocol
Stack selection. A Remote Endpoint may optionally be specified, to Stack selection. A Remote Endpoint may optionally be specified, to
constrain what Connections are accepted. The Listen() Action constrain what Connections are accepted. The Listen() Action returns
consumes the Preconnection. Once Listen() has been called, no a Listener object. Once Listen() has been called, properties added
further properties may be added to the Preconnection, and no to the Preconnection have no effect on the Listener and the
subsequent establishment call may be made on the Preconnection. Preconnection can be disposed of or reused.
Listening continues until the global context shuts down, or until the Listening continues until the global context shuts down, or until the
Stop action is performed on the same Preconnection: Stop action is performed on the Listener object:
Preconnection.Stop() Listener.Stop()
After Stop() is called, the preconnection can be disposed of. After Stop() is called, the Listener can be disposed of.
Preconnection -> ConnectionReceived<Connection> Listener -> ConnectionReceived<Connection>
The ConnectionReceived Event occurs when a Remote Endpoint has The ConnectionReceived Event occurs when a Remote Endpoint has
established a transport-layer connection to this Preconnection (for established a transport-layer connection to this Listener (for
Connection-oriented transport protocols), or when the first Message Connection-oriented transport protocols), or when the first Message
has been received from the Remote Endpoint (for Connectionless has been received from the Remote Endpoint (for Connectionless
protocols), causing a new Connection to be created. The resulting protocols), causing a new Connection to be created. The resulting
Connection is contained within the ConnectionReceived event, and is Connection is contained within the ConnectionReceived event, and is
ready to use as soon as it is passed to the application via the ready to use as soon as it is passed to the application via the
event. event.
Preconnection -> ListenError<> Listener -> ListenError<>
A ListenError occurs either when the Preconnection cannot be A ListenError occurs either when the Properties of the Preconnection
fulfilled for listening, when the Local Endpoint (or Remote Endpoint, cannot be fulfilled for listening, when the Local Endpoint (or Remote
if specified) cannot be resolved, or when the application is Endpoint, if specified) cannot be resolved, or when the application
prohibited from listening by policy. is prohibited from listening by policy.
Preconnection -> Stopped<> Listener -> Stopped<>
A Stopped event occurs after the Preconnection has stopped listening. A Stopped event occurs after the Listener has stopped listening.
6.3. Peer-to-Peer Establishment: Rendezvous 6.3. Peer-to-Peer Establishment: Rendezvous
Simultaneous peer-to-peer Connection establishment is supported by Simultaneous peer-to-peer Connection establishment is supported by
the Rendezvous() Action: the Rendezvous() Action:
Preconnection.Rendezvous() Preconnection.Rendezvous()
The Preconnection Object must be specified with both a Local Endpoint The Preconnection Object must be specified with both a Local Endpoint
and a Remote Endpoint, and also the transport properties and security and a Remote Endpoint, and also the transport properties and security
skipping to change at page 27, line 37 skipping to change at page 27, line 37
Preconnection -> RendezvousDone<Connection> Preconnection -> RendezvousDone<Connection>
The RendezvousDone<> Event occurs when a Connection is established The RendezvousDone<> Event occurs when a Connection is established
with the Remote Endpoint. For Connection-oriented transports, this with the Remote Endpoint. For Connection-oriented transports, this
occurs when the transport-layer connection is established; for occurs when the transport-layer connection is established; for
Connectionless transports, it occurs when the first Message is Connectionless transports, it occurs when the first Message is
received from the Remote Endpoint. The resulting Connection is received from the Remote Endpoint. The resulting Connection is
contained within the RendezvousDone<> Event, and is ready to use as contained within the RendezvousDone<> Event, and is ready to use as
soon as it is passed to the application via the Event. soon as it is passed to the application via the Event.
Preconnection -> RendezvousError<msgRef, error> Preconnection -> RendezvousError<messageContext, error>
An RendezvousError occurs either when the Preconnection cannot be An RendezvousError occurs either when the Preconnection cannot be
fulfilled for listening, when the Local Endpoint or Remote Endpoint fulfilled for listening, when the Local Endpoint or Remote Endpoint
cannot be resolved, when no transport-layer connection can be cannot be resolved, when no transport-layer connection can be
established to the Remote Endpoint, or when the application is established to the Remote Endpoint, or when the application is
prohibited from rendezvous by policy. prohibited from rendezvous by policy.
When using some NAT traversal protocols, e.g., Interactive When using some NAT traversal protocols, e.g., Interactive
Connectivity Establishment (ICE) [RFC5245], it is expected that the Connectivity Establishment (ICE) [RFC5245], it is expected that the
Local Endpoint will be configured with some method of discovering NAT Local Endpoint will be configured with some method of discovering NAT
skipping to change at page 28, line 18 skipping to change at page 28, line 18
represent the concrete addresses, local and server reflexive, on represent the concrete addresses, local and server reflexive, on
which a Rendezvous() for the Preconnection will listen for incoming which a Rendezvous() for the Preconnection will listen for incoming
Connections. These resolved Preconnections will share all other Connections. These resolved Preconnections will share all other
Properties with the Preconnection from which they are derived, though Properties with the Preconnection from which they are derived, though
some Properties may be made more-specific by the resolution process. some Properties may be made more-specific by the resolution process.
This list can be passed to a peer via a signalling protocol, such as This list can be passed to a peer via a signalling protocol, such as
SIP [RFC3261] or WebRTC [RFC7478], to configure the remote. SIP [RFC3261] or WebRTC [RFC7478], to configure the remote.
6.4. Connection Groups 6.4. Connection Groups
Groups of Connections can be created using the Clone Action: Entangled Connections can be created using the Clone Action:
Connection := Connection.Clone() Connection := Connection.Clone()
Calling Clone on a Connection yields a group of two Connections: the Calling Clone on a Connection yields a group of two Connections: the
parent Connection on which Clone was called, and the resulting cloned parent Connection on which Clone was called, and the resulting cloned
Connection. These connections are "entangled" with each other, and Connection. These connections are "entangled" with each other, and
become part of a Connection Group. Calling Clone on any of these two become part of a Connection Group. Calling Clone on any of these two
Connections adds a third Connection to the Connection Group, and so Connections adds a third Connection to the Connection Group, and so
on. Connections in a Connection Group share all Protocol Properties on. Connections in a Connection Group share all Protocol Properties
that are not applicable to a Message. that are not applicable to a Message.
In addition, incoming entangled Connections can be received by
creating a Listener on an existing connection:
Listener := Connection.Listen()
Changing one of these Protocol Properties on one Connection in the Changing one of these Protocol Properties on one Connection in the
group changes it for all others. Per-Message Protocol Properties, group changes it for all others. Per-Message Protocol Properties,
however, are not entangled. For example, changing "Timeout for however, are not entangled. For example, changing "Timeout for
aborting Connection" (see Section 9.1.4) on one Connection in a group aborting Connection" (see Section 11.1.4) on one Connection in a
will automatically change this Protocol Property for all Connections group will automatically change this Protocol Property for all
in the group in the same way. However, changing "Lifetime" (see Connections in the group in the same way. However, changing
Section 7.3.1) of a Message will only affect a single Message on a "Lifetime" (see Section 7.4.1) of a Message will only affect a single
single Connection, entangled or not. Message on a single Connection, entangled or not.
If the underlying protocol supports multi-streaming, it is natural to If the underlying protocol supports multi-streaming, it is natural to
use this functionality to implement Clone. In that case, entangled use this functionality to implement Clone. In that case, entangled
Connections are multiplexed together, giving them similar treatment Connections are multiplexed together, giving them similar treatment
not only inside endpoints but also across the end-to-end Internet not only inside endpoints but also across the end-to-end Internet
path. path.
If the underlying Protocol Stack does not support cloning, or cannot If the underlying Protocol Stack does not support cloning, or cannot
create a new stream on the given Connection, then attempts to clone a create a new stream on the given Connection, then attempts to clone a
connection will result in a CloneError: Connection will result in a CloneError:
Connection -> CloneError<> Connection -> CloneError<>
The Protocol Property "Priority" operates on entangled Connections as The Protocol Property "Priority" operates on entangled Connections as
in Section 7.3.2: when allocating available network capacity among in Section 7.4.2: when allocating available network capacity among
Connections in a Connection Group, sends on Connections with higher Connections in a Connection Group, sends on Connections with higher
Priority values will be prioritized over sends on Connections with Priority values will be prioritized over sends on Connections with
lower Priority values. An ideal transport system implementation lower Priority values. An ideal transport system implementation
would assign each Connection the capacity share (M-N) x C / M, where would assign each Connection the capacity share (M-N) x C / M, where
N is the Connection's Priority value, M is the maximum Priority value N is the Connection's Priority value, M is the maximum Priority value
used by all Connections in the group and C is the total available used by all Connections in the group and C is the total available
capacity. However, the Priority setting is purely advisory, and no capacity. However, the Priority setting is purely advisory, and no
guarantees are given about the way capacity is shared. Each guarantees are given about the way capacity is shared. Each
implementation is free to implement a way to share capacity that it implementation is free to implement a way to share capacity that it
sees fit. sees fit.
7. Sending Data 7. Sending Data
Once a Connection has been established, it can be used for sending Once a Connection has been established, it can be used for sending
data. Data is sent in terms of Messages, which allow the application data. Data is sent as Messages, which allow the application to
to communicate the boundaries of the data being transferred. By communicate the boundaries of the data being transferred. By
default, Send enqueues a complete Message, and takes optional per- default, Send enqueues a complete Message, and takes optional per-
Message properties (see Section 7.1). All Send actions are Message properties (see Section 7.1). All Send actions are
asynchronous, and deliver events (see Section 7.2). Sending partial asynchronous, and deliver events (see Section 7.3). Sending partial
Messages for streaming large data is also supported (see Messages for streaming large data is also supported (see
Section 7.4). Section 7.5).
Messages are sent on a Connection using the Send action: Messages are sent on a Connection using the Send action:
Connection.Send(messageData, messageContext?, endOfMessage?) messageContext := Connection.Send(messageData, messageContext?, endOfMessage?)
where messageData is the data object to send. The optional where messageData is the data object to send.
messageContext parameter supports per-message properties and is
described in Section 7.3. The optional endOfMessage parameter The optional messageContext parameter supports per-message properties
supports partial sending and is described in Section 7.4. and is described in Section 7.4. If provided, the Message Context
object returned is identical to the one that was passed.
The optional endOfMessage parameter supports partial sending and is
described in Section 7.5.
The MessageContext returned by Send can be used to identify send
events (see Section 7.3) related to a specific message or to inspect
meta-data related to the message sent.
7.1. Basic Sending 7.1. Basic Sending
The most basic form of sending on a connection involves enqueuing a The most basic form of sending on a connection involves enqueuing a
single Data block as a complete Message, with default Message single Data block as a complete Message, with default Message
Properties. Message data is created as an array of octets, and the Properties. Message data is transferred as an array of bytes, and
resulting object contains both the byte array and the length of the the resulting object contains both the byte array and the length of
array. the array.
messageData := "hello".octets() messageData := "hello".bytes()
Connection.Send(messageData) Connection.Send(messageData)
The interpretation of a Message to be sent is dependent on the The interpretation of a Message to be sent is dependent on the
implementation, and on the constraints on the Protocol Stacks implied implementation, and on the constraints on the Protocol Stacks implied
by the Connection's transport properties. For example, a Message may by the Connection's transport properties. For example, a Message may
be a single datagram for UDP Connections; or an HTTP Request for HTTP be a single datagram for UDP Connections; or an HTTP Request for HTTP
Connections. Connections.
Some transport protocols can deliver arbitrarily sized Messages, but Some transport protocols can deliver arbitrarily sized Messages, but
other protocols constrain the maximum Message size. Applications can other protocols constrain the maximum Message size. Applications can
query the protocol property Maximum Message Size on Send to determine query the Connection Property "Maximum Message size on send"
the maximum size allowed for a single Message. If a Message is too (Section 11.1.8) to determine the maximum size allowed for a single
large to fit in the Maximum Message Size for the Connection, the Send Message. If a Message is too large to fit in the Maximum Message
will fail with a SendError event (Section 7.2.3). For example, it is Size for the Connection, the Send will fail with a SendError event
invalid to send a Message over a UDP connection that is larger than (Section 7.3.3). For example, it is invalid to send a Message over a
the available datagram sending size. UDP connection that is larger than the available datagram sending
size.
7.2. Send Events 7.2. Sending Replies
When a message is sent in response to a message received, the
application may use the Message Context of the received Message to
construct a Message Context for the reply.
replyMessageContext := requestMessageContext.reply()
By using the "replyMessageContext", the transport system is informed
that the message to be sent is a response and can map the response to
the same underlying transport connection or stream the request was
received from. The concept of Message Contexts is described in
Section 9.
7.3. Send Events
Like all Actions in this interface, the Send Action is asynchronous. Like all Actions in this interface, the Send Action is asynchronous.
There are several events that can be delivered in response to Sending There are several Events that can be delivered in response to Sending
a Message. a Message.
Note that if partial Sends are used (Section 7.4), there will still Note that if partial Sends are used (Section 7.5), there will still
be exactly one Send Event delivered for each call to Send. For be exactly one Send Event delivered for each call to Send. For
example, if a Message expired while two requests to Send data for example, if a Message expired while two requests to Send data for
that Message are outstanding, there will be two Expired events that Message are outstanding, there will be two Expired events
delivered. delivered.
7.2.1. Sent 7.3.1. Sent
Connection -> Sent<msgRef> Connection -> Sent<messageContext>
The Sent Event occurs when a previous Send Action has completed, The Sent Event occurs when a previous Send Action has completed,
i.e., when the data derived from the Message has been passed down or i.e., when the data derived from the Message has been passed down or
through the underlying Protocol Stack and is no longer the through the underlying Protocol Stack and is no longer the
responsibility of the implementation of this interface. The exact responsibility of this interface. The exact disposition of the
disposition of the Message (i.e., whether it has actually been Message (i.e., whether it has actually been transmitted, moved into a
transmitted, moved into a buffer on the network interface, moved into buffer on the network interface, moved into a kernel buffer, and so
a kernel buffer, and so on) when the Sent Event occurs is on) when the Sent Event occurs is implementation-specific. The Sent
implementation-specific. The Sent Event contains an implementation- Event contains an implementation-specific reference to the Message to
specific reference to the Message to which it applies. which it applies.
Sent Events allow an application to obtain an understanding of the Sent Events allow an application to obtain an understanding of the
amount of buffering it creates. That is, if an application calls the amount of buffering it creates. That is, if an application calls the
Send Action multiple times without waiting for a Sent Event, it has Send Action multiple times without waiting for a Sent Event, it has
created more buffer inside the transport system than an application created more buffer inside the transport system than an application
that always waits for the Sent Event before calling the next Send that always waits for the Sent Event before calling the next Send
Action. Action.
7.2.2. Expired 7.3.2. Expired
Connection -> Expired<msgRef> Connection -> Expired<messageContext>
The Expired Event occurs when a previous Send Action expired before The Expired Event occurs when a previous Send Action expired before
completion; i.e. when the Message was not sent before its Lifetime completion; i.e. when the Message was not sent before its Lifetime
(see Section 7.3.1) expired. This is separate from SendError, as it (see Section 7.4.1) expired. This is separate from SendError, as it
is an expected behavior for partially reliable transports. The is an expected behavior for partially reliable transports. The
Expired Event contains an implementation-specific reference to the Expired Event contains an implementation-specific reference to the
Message to which it applies. Message to which it applies.
7.2.3. SendError 7.3.3. SendError
Connection -> SendError<msgRef> Connection -> SendError<messageContext>
A SendError occurs when a Message could not be sent due to an error A SendError occurs when a Message could not be sent due to an error
condition: an attempt to send a Message which is too large for the condition: an attempt to send a Message which is too large for the
system and Protocol Stack to handle, some failure of the underlying system and Protocol Stack to handle, some failure of the underlying
Protocol Stack, or a set of Message Properties not consistent with Protocol Stack, or a set of Message Properties not consistent with
the Connection's transport properties. The SendError contains an the Connection's transport properties. The SendError contains an
implementation-specific reference to the Message to which it applies. implementation-specific reference to the Message to which it applies.
7.3. Message Properties 7.4. Message Properties
Applications may need to annotate the Messages they send with extra Applications may need to annotate the Messages they send with extra
information to control how data is scheduled and processed by the information to control how data is scheduled and processed by the
transport protocols in the Connection. A MessageContext object transport protocols in the Connection. Therefore a message context
contains properties for sending Messages, and can be passed to the containing these properties can be passed to the Send Action. For
Send Action. Note that these properties are per-Message, not per- other uses of the message context, see Section 9.
Send if partial Messages are sent (Section 7.4). All data blocks
associated with a single Message share properties. For example, it
would not make sense to have the beginning of a Message expire, but
allow the end of a Message to still be sent.
messageData := "hello".octets() Note that message properties are per-Message, not per-Send if partial
Messages are sent (Section 7.5). All data blocks associated with a
single Message share properties specified in the Message Contexts.
For example, it would not make sense to have the beginning of a
Message expire, but allow the end of a Message to still be sent.
A MessageContext object contains metadata for Messages to be sent or
received.
messageData := "hello".bytes()
messageContext := NewMessageContext() messageContext := NewMessageContext()
messageContext.add(parameter, value) messageContext.add(parameter, value)
Connection.Send(messageData, messageContext) Connection.Send(messageData, messageContext)
The simpler form of Send that does not take any messageContext is The simpler form of Send, which does not take any messageContext, is
equivalent to passing a default MessageContext with not values added. equivalent to passing a default MessageContext without adding any
Message Properties to it.
If an application wants to override Message Properties for a specific If an application wants to override Message Properties for a specific
message, it can acquire an empty MessageContext Object and add all message, it can acquire an empty MessageContext Object and add all
desired Message Properties to that Object. It can then reuse the desired Message Properties to that Object. It can then reuse the
same messageContext Object for sending multiple Messages with the same messageContext Object for sending multiple Messages with the
same properties. same properties.
Properties may be added to a MessageContext object only before the Properties may be added to a MessageContext object only before the
context is used for sending. Once a messageContext has been used context is used for sending. Once a messageContext has been used
with a Send call, modifying any of its properties is invalid. with a Send call, modifying any of its properties is invalid.
Message Properties may be inconsistent with the properties of the Message Properties may be inconsistent with the properties of the
Protocol Stacks underlying the Connection on which a given Message is Protocol Stacks underlying the Connection on which a given Message is
sent. For example, a Connection must provide reliability to allow sent. For example, a Connection must provide reliability to allow
setting an infinitie value for the lifetime property of a Message. setting an infinitie value for the lifetime property of a Message.
Sending a Message with Message Properties inconsistent with the Sending a Message with Message Properties inconsistent with the
Selection Properties of the Connection yields an error. Selection Properties of the Connection yields an error.
The following Message Properties are supported: The following Message Properties are supported:
7.3.1. Lifetime 7.4.1. Lifetime
Name: msg-lifetime Name: msg-lifetime
Type: Integer Type: Integer
Recommended default: infinite
Lifetime specifies how long a particular Message can wait to be sent Lifetime specifies how long a particular Message can wait to be sent
to the remote endpoint before it is irrelevant and no longer needs to to the remote endpoint before it is irrelevant and no longer needs to
be (re-)transmitted. This is a hint to the transport system - it is be (re-)transmitted. This is a hint to the transport system - it is
not guaranteed that a Message will not be sent when its Lifetime has not guaranteed that a Message will not be sent when its Lifetime has
expired. expired.
Setting a Message's Lifetime to infinite indicates that the Setting a Message's Lifetime to infinite indicates that the
application does not wish to apply a time constraint on the application does not wish to apply a time constraint on the
transmission of the Message, but it does not express a need for transmission of the Message, but it does not express a need for
reliable delivery; reliability is adjustable per Message via the reliable delivery; reliability is adjustable per Message via the
"Reliable Data Transfer (Message)" property (see Section 7.3.7). The "Reliable Data Transfer (Message)" property (see Section 7.4.7). The
type and units of Lifetime are implementation-specific. type and units of Lifetime are implementation-specific.
7.3.2. Priority 7.4.2. Priority
Name: msg-prio Name: msg-prio
Type: Integer (non-negative) Type: Integer (non-negative)
Recommended default: 100
This property represents a hierarchy of priorities. It can specify This property represents a hierarchy of priorities. It can specify
the priority of a Message, relative to other Messages sent over the the priority of a Message, relative to other Messages sent over the
same Connection. same Connection.
A Message with Priority 0 will yield to a Message with Priority 1, A Message with Priority 0 will yield to a Message with Priority 1,
which will yield to a Message with Priority 2, and so on. Priorities which will yield to a Message with Priority 2, and so on. Priorities
may be used as a sender-side scheduling construct only, or be used to may be used as a sender-side scheduling construct only, or be used to
specify priorities on the wire for Protocol Stacks supporting specify priorities on the wire for Protocol Stacks supporting
prioritization. prioritization.
Note that this property is not a per-message override of the Note that this property is not a per-message override of the
connection Priority - see Section 9.1.3. Both Priority properties connection Priority - see Section 11.1.3. Both Priority properties
may interact, but can be used independently and be realized by may interact, but can be used independently and be realized by
different mechanisms. different mechanisms.
7.3.3. Ordered 7.4.3. Ordered
Name: msg-ordered Name: msg-ordered
Type: Boolean Type: Boolean
Default: true
If true, it specifies that the receiver-side transport protocol stack If true, it specifies that the receiver-side transport protocol stack
only deliver the Message to the receiving application after the only deliver the Message to the receiving application after the
previous ordered Message which was passed to the same Connection via previous ordered Message which was passed to the same Connection via
the Send Action, when such a Message exists. If false, the Message the Send Action, when such a Message exists. If false, the Message
may be delivered to the receiving application out of order. This may be delivered to the receiving application out of order. This
property is used for protocols that support preservation of data property is used for protocols that support preservation of data
ordering, see Section 5.2.4, but allow out-of-order delivery for ordering, see Section 5.2.4, but allow out-of-order delivery for
certain messages. certain messages.
7.3.4. Idempotent 7.4.4. Idempotent
Name: idempotent Name: idempotent
Type: Boolean Type: Boolean
Default: false
If true, it specifies that a Message is safe to send to the remote If true, it specifies that a Message is safe to send to the remote
endpoint more than once for a single Send Action. It is used to mark endpoint more than once for a single Send Action. It is used to mark
data safe for certain 0-RTT establishment techniques, where data safe for certain 0-RTT establishment techniques, where
retransmission of the 0-RTT data may cause the remote application to retransmission of the 0-RTT data may cause the remote application to
receive the Message multiple times. receive the Message multiple times.
7.3.5. Final Note that for protocols that do not protect against duplicated
messages, e.g., UDP, all messages MUST be marked as Idempotent. In
order to enable protocol selection to choose such a protocol,
Idempotent MUST be added to the TransportProperties passed to the
Preconnection. If such a protocol was chosen, disabling Idempotent
on individual messages MUST result in a SendError.
7.4.5. Final
Type: Boolean Type: Boolean
Name: final Name: final
Default: false
If true, this Message is the last one that the application will send If true, this Message is the last one that the application will send
on a Connection. This allows underlying protocols to indicate to the on a Connection. This allows underlying protocols to indicate to the
Remote Endpoint that the Connection has been effectively closed in Remote Endpoint that the Connection has been effectively closed in
the sending direction. For example, TCP-based Connections can send a the sending direction. For example, TCP-based Connections can send a
FIN once a Message marked as Final has been completely sent, FIN once a Message marked as Final has been completely sent,
indicated by marking endOfMessage. Protocols that do not support indicated by marking endOfMessage. Protocols that do not support
signalling the end of a Connection in a given direction will ignore signalling the end of a Connection in a given direction will ignore
this property. this property.
Note that a Final Message must always be sorted to the end of a list Note that a Final Message must always be sorted to the end of a list
of Messages. The Final property overrides Priority and any other of Messages. The Final property overrides Priority and any other
property that would re-order Messages. If another Message is sent property that would re-order Messages. If another Message is sent
after a Message marked as Final has already been sent on a after a Message marked as Final has already been sent on a
Connection, the Send Action for the new Message will cause a Connection, the Send Action for the new Message will cause a
SendError Event. SendError Event.
7.3.6. Corruption Protection Length 7.4.6. Corruption Protection Length
Name: msg-checksum-len Name: msg-checksum-len
Type: Integer (non-negative with -1 as special value) Type: Integer (non-negative with -1 as special value)
This property specifies the length of the section of the Message, Default: full coverage
starting from byte 0, that the application requires to be delivered
without corruption due to lower layer errors. It is used to specify
options for simple integrity protection via checksums. By default,
the entire Message is protected by a checksum. A value of 0 means
that no checksum is required, and a special value (e.g. -1) can be
used to indicate the default. Only full coverage is guaranteed, any
other requests are advisory.
7.3.7. Reliable Data Transfer (Message) This property specifies the minimum length of the section of the
Message, starting from byte 0, that the application requires to be
delivered without corruption due to lower layer errors. It is used
to specify options for simple integrity protection via checksums. A
value of 0 means that no checksum is required, and -1 means that the
entire Message is protected by a checksum. Only full coverage is
guaranteed, any other requests are advisory.
7.4.7. Reliable Data Transfer (Message)
Name: msg-reliable Name: msg-reliable
Type: Boolean Type: Boolean
Default: true
When true, this property specifies that a message should be sent in When true, this property specifies that a message should be sent in
such a way that the transport protocol ensures all data is received such a way that the transport protocol ensures all data is received
on the other side without corruption. Changing the 'Reliable Data on the other side without corruption. Changing the 'Reliable Data
Transfer' property on Messages is only possible for Connections that Transfer' property on Messages is only possible for Connections that
were established with the Selection Property 'Reliable Data Transfer were established with the Selection Property 'Reliable Data Transfer
(Connection)' enabled. When this is not the case, changing it will (Connection)' enabled. When this is not the case, changing it will
generate an error. Disabling this property indicates that the generate an error. Disabling this property indicates that the
transport system may disable retransmissions or other reliability transport system may disable retransmissions or other reliability
mechanisms for this particular Message, but such disabling is not mechanisms for this particular Message, but such disabling is not
guaranteed. guaranteed.
7.3.8. Message Capacity Profile Override 7.4.8. Message Capacity Profile Override
Name: msg-capacity-profile Name: msg-capacity-profile
Type: Enumeration Type: Enumeration
This enumerated property specifies the application's preferred This enumerated property specifies the application's preferred
tradeoffs for sending this Message; it is a per-Message override of tradeoffs for sending this Message; it is a per-Message override of
the Capacity Profile protocol and path selection property (see the Capacity Profile protocol and path selection property (see
Section 9.1.10). Section 11.1.10).
The following values are valid for Transmission Profile: The following values are valid for Transmission Profile:
Default: No special optimizations of the tradeoff between delay, Default: No special optimizations of the tradeoff between delay,
delay variation, and bandwidth efficiency should be made when delay variation, and bandwidth efficiency should be made when
sending this message. sending this message.
Low Latency: Response time (latency) should be optimized at the Low Latency: Response time (latency) should be optimized at the
expense of efficiently using the available capacity when sending expense of efficiently using the available capacity when sending
this message. This can be used by the system to disable the this message. This can be used by the system to disable the
coalescing of multiple small Messages into larger packets (Nagle's coalescing of multiple small Messages into larger packets (Nagle's
algorithm); to prefer immediate acknowledgment from the peer algorithm); to prefer immediate acknowledgment from the peer
endpoint when supported by the underlying transport; to signal a endpoint when supported by the underlying transport; to signal a
preference for lower-latency, higher-loss treatment; and so on. preference for lower-latency, higher-loss treatment; and so on.
[TODO: This is inconsistent with {prop-cap-profile}} - needs to be [TODO: This is inconsistent with {prop-cap-profile}} - needs to be
fixed] fixed]
7.3.9. Singular Transmission 7.4.9. Singular Transmission
Name: singular-transmission Name: singular-transmission
Type: Boolean Type: Boolean
Default: false
This property specifies that a message should be sent and received as This property specifies that a message should be sent and received as
a single packet without transport-layer segmentation or network-layer a single packet without transport-layer segmentation or network-layer
fragmentation. Attempts to send a message with this property set fragmentation. Attempts to send a message with this property set
with a size greater to the transport's current estimate of its with a size greater to the transport's current estimate of its
maximum transmission segment size will result in a "SendError". When maximum transmission segment size will result in a "SendError". When
used with transports supporting this functionality and running over used with transports supporting this functionality and running over
IP version 4, the Don't Fragment bit will be set. IP version 4, the Don't Fragment bit will be set.
7.4. Partial Sends 7.5. Partial Sends
It is not always possible for an application to send all data It is not always possible for an application to send all data
associated with a Message in a single Send Action. The Message data associated with a Message in a single Send Action. The Message data
may be too large for the application to hold in memory at one time, may be too large for the application to hold in memory at one time,
or the length of the Message may be unknown or unbounded. or the length of the Message may be unknown or unbounded.
Partial Message sending is supported by passing an endOfMessage Partial Message sending is supported by passing an endOfMessage
boolean parameter to the Send Action. This value is always true by boolean parameter to the Send Action. This value is always true by
default, and the simpler forms of Send are equivalent to passing true default, and the simpler forms of Send are equivalent to passing true
for endOfMessage. for endOfMessage.
The following example sends a Message in two separate calls to Send. The following example sends a Message in two separate calls to Send.
messageContext := NewMessageContext() messageContext := NewMessageContext()
messageContext.add(parameter, value) messageContext.add(parameter, value)
messageData := "hel".octets() messageData := "hel".bytes()
endOfMessage := false endOfMessage := false
Connection.Send(messageData, messageContext, endOfMessage) Connection.Send(messageData, messageContext, endOfMessage)
messageData := "lo".octets() messageData := "lo".bytes()
endOfMessage := true endOfMessage := true
Connection.Send(messageData, messageContext, endOfMessage) Connection.Send(messageData, messageContext, endOfMessage)
All data sent with the same MessageContext object will be treated as All data sent with the same MessageContext object will be treated as
belonging to the same Message, and will constitute an in-order series belonging to the same Message, and will constitute an in-order series
until the endOfMessage is marked. Once the end of the Message is until the endOfMessage is marked. Once the end of the Message is
marked, the MessageContext object may be re-used as a new Message marked, the MessageContext object may be re-used as a new Message
with identical parameters. with identical parameters.
7.5. Batching Sends 7.6. Batching Sends
In order to reduce the overhead of sending multiple small Messages on To reduce the overhead of sending multiple small Messages on a
a Connection, the application may want to batch several Send actions Connection, the application may want to batch several Send actions
together. This provides a hint to the system that the sending of together. This provides a hint to the system that the sending of
these Messages should be coalesced when possible, and that sending these Messages should be coalesced when possible, and that sending
any of the batched Messages may be delayed until the last Message in any of the batched Messages may be delayed until the last Message in
the batch is enqueued. the batch is enqueued.
Connection.Batch( Connection.Batch(
Connection.Send(messageData) Connection.Send(messageData)
Connection.Send(messageData) Connection.Send(messageData)
) )
7.6. Send on Active Open: InitiateWithSend 7.7. Send on Active Open: InitiateWithSend
For application-layer protocols where the Connection initiator also For application-layer protocols where the Connection initiator also
sends the first message, the InitiateWithSend() action combines sends the first message, the InitiateWithSend() action combines
Connection initiation with a first Message sent: Connection initiation with a first Message sent:
Connection := Preconnection.InitiateWithSend(messageData, messageContext?, timeout?) Connection := Preconnection.InitiateWithSend(messageData, messageContext?, timeout?)
Whenever possible, a messageContext should be provided to declare the Whenever possible, a messageContext should be provided to declare the
message passed to InitiateWithSend as idempotent. This allows the message passed to InitiateWithSend as idempotent. This allows the
transport system to make use of 0-RTT establishment in case this is transport system to make use of 0-RTT establishment in case this is
skipping to change at page 37, line 15 skipping to change at page 38, line 15
Neither partial sends nor send batching are supported by Neither partial sends nor send batching are supported by
InitiateWithSend(). InitiateWithSend().
The Events that may be sent after InitiateWithSend() are equivalent The Events that may be sent after InitiateWithSend() are equivalent
to those that would be sent by an invocation of Initate() followed to those that would be sent by an invocation of Initate() followed
immediately by an invocation of Send(), with the caveat that a send immediately by an invocation of Send(), with the caveat that a send
failure that occurs because the Connection could not be established failure that occurs because the Connection could not be established
will not result in a SendError separate from the InitiateError will not result in a SendError separate from the InitiateError
signaling the failure of Connection establishment. signaling the failure of Connection establishment.
7.7. Sender-side Framing
Sender-side framing allows a caller to provide the interface with a
function that takes a Message of an appropriate application-layer
type and returns an array of octets, the on-the-wire representation
of the Message to be handed down to the Protocol Stack. It consists
of a Framer Object with a single Action, Frame. Since the Framer
depends on the protocol used at the application layer, it is bound to
the Preconnection during the pre-establishment phase:
Preconnection.FrameWith(Framer)
OctetArray := Framer.Frame(messageData)
Sender-side framing is a convenience feature of the interface, for
parity with receiver-side framing (see Section 8.4).
8. Receiving Data 8. Receiving Data
Once a Connection is established, it can be used for receiving data. Once a Connection is established, it can be used for receiving data.
As with sending, data is received in terms of Messages. Receiving is As with sending, data is received in terms of Messages. Receiving is
an asynchronous operation, in which each call to Receive enqueues a an asynchronous operation, in which each call to Receive enqueues a
request to receive new data from the connection. Once data has been request to receive new data from the connection. Once data has been
received, or an error is encountered, an event will be delivered to received, or an error is encountered, an event will be delivered to
complete the Receive request (see Section 8.2). complete the Receive request (see Section 8.2).
As with sending, the type of the Message to be passed is dependent on As with sending, the type of the Message to be passed is dependent on
skipping to change at page 38, line 4 skipping to change at page 38, line 35
the implementation, and on the constraints on the Protocol Stacks the implementation, and on the constraints on the Protocol Stacks
implied by the Connection's transport parameters. implied by the Connection's transport parameters.
8.1. Enqueuing Receives 8.1. Enqueuing Receives
Receive takes two parameters to specify the length of data that an Receive takes two parameters to specify the length of data that an
application is willing to receive, both of which are optional and application is willing to receive, both of which are optional and
have default values if not specified. have default values if not specified.
Connection.Receive(minIncompleteLength?, maxLength?) Connection.Receive(minIncompleteLength?, maxLength?)
By default, Receive will try to deliver complete Messages in a single By default, Receive will try to deliver complete Messages in a single
event (Section 8.2.1). event (Section 8.2.1).
The application can set a minIncompleteLength value to indicates the The application can set a minIncompleteLength value to indicates the
smallest partial Message data size in bytes that should be delivered smallest partial Message data size in bytes that should be delivered
in response to this Receive. By default, this value is infinite, in response to this Receive. By default, this value is infinite,
which means that only complete Messages should be delivered (see which means that only complete Messages should be delivered (see
Section 8.2.2 and Section 8.4 for more information on how this is Section 8.2.2 and Section 10.6 for more information on how this is
accomplished). If this value is set to some smaller value, the accomplished). If this value is set to some smaller value, the
associated receive event will be triggered only when at least that associated receive event will be triggered only when at least that
many bytes are available, or the Message is complete with fewer many bytes are available, or the Message is complete with fewer
bytes, or the system needs to free up memory. Applications should bytes, or the system needs to free up memory. Applications should
always check the length of the data delivered to the receive event always check the length of the data delivered to the receive event
and not assume it will be as long as minIncompleteLength in the case and not assume it will be as long as minIncompleteLength in the case
of shorter complete Messages or memory issues. of shorter complete Messages or memory issues.
The maxLength argument indicates the maximum size of a Message in The maxLength argument indicates the maximum size of a Message in
bytes the application is currently prepared to receive. The default bytes the application is currently prepared to receive. The default
skipping to change at page 38, line 46 skipping to change at page 39, line 31
provide backpressure to the transport stack when it is temporarily provide backpressure to the transport stack when it is temporarily
not ready to receive messages. not ready to receive messages.
8.2.1. Received 8.2.1. Received
Connection -> Received<messageData, messageContext> Connection -> Received<messageData, messageContext>
A Received event indicates the delivery of a complete Message. It A Received event indicates the delivery of a complete Message. It
contains two objects, the received bytes as messageData, and the contains two objects, the received bytes as messageData, and the
metadata and properties of the received Message as messageContext. metadata and properties of the received Message as messageContext.
See Section 8.3 for details about the received context.
The messageData object provides access to the bytes that were The messageData object provides access to the bytes that were
received for this Message, along with the length of the byte array. received for this Message, along with the length of the byte array.
The messageContext is provided to enable retrieving metadata about
the message and referring to the message, e.g., to send replies and
map responses to their requests. See Section 9 for details.
See Section 8.4 for handling Message framing in situations where the See Section 10.6 for handling Message framing in situations where the
Protocol Stack provides octet-stream transport only. Protocol Stack only provides a byte-stream transport.
8.2.2. ReceivedPartial 8.2.2. ReceivedPartial
Connection -> ReceivedPartial<messageData, messageContext, endOfMessage> Connection -> ReceivedPartial<messageData, messageContext, endOfMessage>
If a complete Message cannot be delivered in one event, one part of If a complete Message cannot be delivered in one event, one part of
the Message may be delivered with a ReceivedPartial event. In order the Message may be delivered with a ReceivedPartial event. In order
to continue to receive more of the same Message, the application must to continue to receive more of the same Message, the application must
invoke Receive again. invoke Receive again.
skipping to change at page 39, line 33 skipping to change at page 40, line 17
If the minIncompleteLength in the Receive request was set to be If the minIncompleteLength in the Receive request was set to be
infinite (indicating a request to receive only complete Messages), infinite (indicating a request to receive only complete Messages),
the ReceivedPartial event may still be delivered if one of the the ReceivedPartial event may still be delivered if one of the
following conditions is true: following conditions is true:
o the underlying Protocol Stack supports message boundary o the underlying Protocol Stack supports message boundary
preservation, and the size of the Message is larger than the preservation, and the size of the Message is larger than the
buffers available for a single message; buffers available for a single message;
o the underlying Protocol Stack does not support message boundary o the underlying Protocol Stack does not support message boundary
preservation, and the deframer (see Section 8.4) cannot determine preservation, and the Message Framer (see Section 10.6) cannot
the end of the message using the buffer space it has available; or determine the end of the message using the buffer space it has
available; or
o the underlying Protocol Stack does not support message boundary o the underlying Protocol Stack does not support message boundary
preservation, and no deframer was supplied by the application preservation, and no Message Framer was supplied by the
application
Note that in the absence of message boundary preservation or Note that in the absence of message boundary preservation or a
deframing, all bytes received on the Connection will be represented Message Framer, all bytes received on the Connection will be
as one large message of indeterminate length. represented as one large Message of indeterminate length.
8.2.3. ReceiveError 8.2.3. ReceiveError
Connection -> ReceiveError<messageContext> Connection -> ReceiveError<messageContext>
A ReceiveError occurs when data is received by the underlying A ReceiveError occurs when data is received by the underlying
Protocol Stack that cannot be fully retrieved or deframed, or when Protocol Stack that cannot be fully retrieved or parsed, or when some
some other indication is received that reception has failed. Such other indication is received that reception has failed. Such
conditions that irrevocably lead to the termination of the Connection conditions that irrevocably lead to the termination of the Connection
are signaled using ConnectionError instead (see Section 10). are signaled using ConnectionError instead (see Section 12).
The ReceiveError event passes an optional associated MessageContext. The ReceiveError event passes an optional associated MessageContext.
This may indicate that a Message that was being partially received This may indicate that a Message that was being partially received
previously, but had not completed, encountered an error and will not previously, but had not completed, encountered an error and will not
be completed. be completed.
8.3. Message Receive Context 8.3. Receive Message Properties
Each Received Message Context may contain metadata from protocols in Each Message Context may contain metadata from protocols in the
the Protocol Stack; which metadata is available is Protocol Stack Protocol Stack; which metadata is available is Protocol Stack
dependent. The following metadata values are supported: dependent. These are exposed though additional read-only Message
Properties that can be queried from the MessageContext object (see
Section 9) passed by the receive event. The following metadata
values are supported:
8.3.1. ECN 8.3.1. ECN
When available, Message metadata carries the value of the Explicit When available, Message metadata carries the value of the Explicit
Congestion Notification (ECN) field. This information can be used Congestion Notification (ECN) field. This information can be used
for logging and debugging purposes, and for building applications for logging and debugging purposes, and for building applications
which need access to information about the transport internals for which need access to information about the transport internals for
their own operation. their own operation.
8.3.2. Early Data 8.3.2. Early Data
skipping to change at page 40, line 42 skipping to change at page 41, line 31
Thus, receivers may wish to perform additional checks for early data Thus, receivers may wish to perform additional checks for early data
to ensure it is idempotent or not replayed. If TLS 1.3 is available to ensure it is idempotent or not replayed. If TLS 1.3 is available
and the recipient Message was sent as part of early data, the and the recipient Message was sent as part of early data, the
corresponding metadata carries a flag indicating as such. If early corresponding metadata carries a flag indicating as such. If early
data is enabled, applications should check this metadata field for data is enabled, applications should check this metadata field for
Messages received during connection establishment and respond Messages received during connection establishment and respond
accordingly. accordingly.
8.3.3. Receiving Final Messages 8.3.3. Receiving Final Messages
The Received Message Context can indicate whether or not this Message The Message Context can indicate whether or not this Message is the
is the Final Message on a Connection. For any Message that is marked Final Message on a Connection. For any Message that is marked as
as Final, the application can assume that there will be no more Final, the application can assume that there will be no more Messages
Messages received on the Connection once the Message has been received on the Connection once the Message has been completely
completely delivered. This corresponds to the Final property that delivered. This corresponds to the Final property that may be marked
may be marked on a sent Message Section 7.3.5. on a sent Message Section 7.4.5.
Some transport protocols and peers may not support signaling of the Some transport protocols and peers may not support signaling of the
Final property. Applications therefore should not rely on receiving Final property. Applications therefore should not rely on receiving
a Message marked Final to know that the other endpoint is done a Message marked Final to know that the other endpoint is done
sending on a connection. sending on a connection.
Any calls to Receive once the Final Message has been delivered will Any calls to Receive once the Final Message has been delivered will
result in errors. result in errors.
8.4. Receiver-side De-framing over Stream Protocols 9. Message Contexts
The Receive Event is intended to be fired once per application-layer Using the MessageContext object, the application can set and retrieve
Message sent by the remote endpoint; i.e., it is a desired property meta-data of the message, including Message Properties (see
of this interface that a Send at one end of a Connection maps to Section 7.4) and framing meta-data (see Section 10.3). Therefore, a
exactly one Receive on the other end. This is possible with Protocol MessageContext object can be passed to the Send action and is retuned
Stacks that provide message boundary preservation, but is not the by each Send and Receive related events.
case over Protocol Stacks that provide a simple octet stream
transport.
For preserving message boundaries over stream transports, this Message properties can be set and queried using the Message Context:
interface provides receiver-side de-framing. This facility is based
on the observation that, since many of our current application
protocols evolved over TCP, which does not provide message boundary
preservation, and since many of these protocols require message
boundaries to function, each application layer protocol has defined
its own framing. A Deframer allows an application to push this de-
framing down into the interface, in order to transform an octet
stream into a sequence of Messages.
Concretely, receiver-side de-framing allows a caller to provide the MessageContext.add(scope?, parameter, value)
interface with a function that takes an octet stream, as provided by PropertyValue := MessageContext.get(scope?, property)
the underlying Protocol Stack, reads and returns a single Message of
an appropriate type for the application and platform, and leaves the
octet stream at the start of the next Message to deframe. It
consists of a Deframer Object with a single Action, Deframe. Since
the Deframer depends on the protocol used at the application layer,
it is bound to the Preconnection during the pre-establishment phase:
Preconnection.DeframeWith(Deframer) To get or set Message Properties, the optional scope parameter is
left empty, for framing meta-data, the framer is passed.
{messageData} := Deframer.Deframe(OctetStream) For MessageContexts returned by send events (see Section 7.3) and
receive events (see Section 8.2), the application can query
information about the local and remote endpoint:
9. Managing Connections RemoteEndpoint := MessageContext.GetRemoteEndpoint()
LocalEndpoint := MessageContext.GetLocalEndpoint()
Message Contexts can also be used to send messages that are flagged
as a reply to other messages, see Section 7.2 for details. If the
message received was send by the remote endpoint as a reply to an
earlier message and the transports provides this information, the
MessageContext of the original request can be accessed using the
Message Context of the reply:
RequestMessageContext := MessageContext.GetOriginalRequest()
10. Message Framers
Message Framers are pieces of code that define simple transformations
between application Message data and raw transport protocol data. A
Framer can encapsulate or encode outbound Messages, and decapsulate
or decode inbound data into Messages.
Message Framers allow message boundaries to be preserved when using a
Connection object, even when using byte-stream transports. This
facility is designed based on the fact that many of the current
application protocols evolved over TCP, which does not provide
message boundary preservation, and since many of these protocols
require message boundaries to function, each application layer
protocol has defined its own framing.
While many protocols can be represented as Message Framers, for the
purposes of the Transport Services interface these are ways for
applications or application frameworks to define their own Message
parsing to be included within a Connection's Protocol Stack. As an
example, TLS can serve the purpose of framing data over TCP, but is
exposed as a protocol natively supported by the Transport Services
interface.
Most Message Framers fall into one of two categories: - Header-
prefixed record formats, such as a basic Type-Length-Value (TLV)
structure - Delimeter-separated formats, such as HTTP/1.1.
Note that while Message Framers add the most value when placed above
a protocol that otherwise does not preserve message boundaries, they
can also be used with datagram- or message-based protocols. In these
cases, they add an additional transformation to further encode or
encapsulate, and can potentially support packing multiple
application-layer Messages into individual transport datagrams.
10.1. Defining Message Framers
A Message Framer is primarily defined by the set of code that handles
events for a framer implementation, specifically how it handles
inbound and outbound data parsing.
Applications can instantiate a Message Framer upon which they will
receive framing events, or use a Message Framer defined by another
library.
framer := NewMessageFramer()
Message Framer objects will deliver events to code that is written
either as part of the application or a helper library. This piece of
code will be referred to as the "framer implementation".
10.2. Adding Message Framers to Connections
The Message Framer object can be added to one or more Preconnections
to run on top of transport protocols. Multiple Framers may be added.
If multiple Framers are added, the last one added runs first when
framing outbound messages, and last when parsing inbound data.
Preconnection.AddFramer(framer)
Framers have the ability to also dynamically modify Protocol Stacks,
as described in Section 10.4.
10.3. Framing Meta-Data
When sending Messages, applications can add specific Message values
to a MessageContext (Section 9) that is intended for a Framer. This
can be used, for example, to set the type of a Message for a TLV
format. The namespace of values is custom for each unique Message
Framer.
messageContext := NewMessageContext()
messageContext.add(framer, key, value)
Connection.Send(messageData, messageContext)
When an application receives a MessageContext in a Receive event, it
can also look to see if a value was set by a specific Message Framer.
messageContext.get(framer, key) -> value
10.4. Message Framer Lifetime
When a Connection establishment attempt begins, an event is delivered
to notify the framer implementation that a new Connection is being
created. Similarly, a stop event is delivered when a Connection is
being torn down. The framer implementation can use the Connection
object to look up specific properties of the Connection or the
network being used that may influence how to frame Messages.
MessageFramer -> Start(Connection)
MessageFramer -> Stop(Connection)
When Message Framer generates a "Start" event, the framer
implementation has the opportunity to start writing some data prior
to the Connection delivering its "Ready" event. This allows the
implementation to communicate control data to the remote endpoint
that can be used to parse Messages.
MessageFramer.MakeConnectionReady(Connection)
At any time if the implementation encounters a fatal error, it can
also cause the Connection to fail and provide an error.
MessageFramer.FailConnection(Connection, Error)
Before an implementation marks a Message Framer as ready, it can also
dynamically add a protocol or framer above it in the stack. This
allows protocols like STARTTLS, that need to add TLS conditionally,
to modify the Protocol Stack based on a handshake result.
otherFramer := NewMessageFramer()
MessageFramer.PrependFramer(Connection, otherFramer)
10.5. Sender-side Message Framing
Message Framers generate an event whenever a Connection sends a new
Message.
MessageFramer -> NewSentMessage<Connection, MessageData, MessageContext, IsEndOfMessage>
Upon receiving this event, a framer implementation is responsible for
performing any necessary transformations and sending the resulting
data to the next protocol. Implementations SHOULD ensure that there
is a way to pass the original data through without copying to improve
performance.
MessageFramer.Send(Connection, Data)
To provide an example, a simple protocol that adds a length as a
header would receive the "NewSentMessage" event, create a data
representation of the length of the Message data, and then send a
block of data that is the concatenation of the length header and the
original Message data.
10.6. Receiver-side Message Framing
In order to parse an received flow of data into Messages, the Message
Framer notifies the framer implementation whenever new data is
available to parse.
MessageFramer -> HandleReceivedData<Connection>
Upon receiving this event, the framer implementation can inspect the
inbound data. The data is parsed from a particular cursor
representing the unprocessed data. The application requests a
specific amount of data it needs to have available in order to parse.
If the data is not available, the parse fails.
MessageFramer.Parse(Connection, MinimumIncompleteLength, MaximumLength) -> (Data, MessageContext, IsEndOfMessage)
The framer implementation can directly advance the receive cursor
once it has parsed data to effectively discard data (for example,
discard a header once the content has been parsed).
To deliver a Message to the application, the framer implementation
can either directly deliever data that it has allocated, or deliver a
range of data directly from the underlying transport and
simulatenously advance the receive cursor.
MessageFramer.AdvanceReceiveCursor(Connection, Length)
MessageFramer.DeliverAndAdvanceReceiveCursor(Connection, MessageContext, Length, IsEndOfMessage)
MessageFramer.Deliver(Connection, MessageContext, Data, IsEndOfMessage)
Note that "MessageFramer.DeliverAndAdvanceReceiveCursor" allows the
framer implementation to earmark bytes as part of a Message even
before they are received by the transport. This allows the delivery
of very large Messages without requiring the implementation to
directly inspect all of the bytes.
To provide an example, a simple protocol that parses a length as a
header value would receive the "HandleReceivedData" event, and call
"Parse" with a minimum and maximum set to the length of the header
field. Once the parse succeeded, it would call
"AdvanceReceiveCursor" with the length of the header field, and then
call "DeliverAndAdvanceReceiveCursor" with the length of the body
that was parsed from the header, marking the new Message as complete.
11. Managing Connections
During pre-establishment and after establishment, connections can be During pre-establishment and after establishment, connections can be
configured and queried using Connection Properties, and asynchronous configured and queried using Connection Properties, and asynchronous
information may be available about the state of the connection via information may be available about the state of the connection via
Soft Errors. Soft Errors.
Connection Properties represent the configuration and state of the Connection Properties represent the configuration and state of the
selected Protocol Stack(s) backing a Connection. These Connection selected Protocol Stack(s) backing a Connection. These Connection
Properties may be Generic, applying regardless of transport protocol, Properties may be Generic, applying regardless of transport protocol,
or Specific, applicable to a single implementation of a single or Specific, applicable to a single implementation of a single
transport protocol stack. Generic Connection Properties are defined transport protocol stack. Generic Connection Properties are defined
in Section 9.1 below. Specific Protocol Properties are defined in a in Section 11.1 below. Specific Protocol Properties are defined in a
transport- and implementation-specific way, and must not be assumed transport- and implementation-specific way, and must not be assumed
to apply across different protocols. Attempts to set Specific to apply across different protocols. Attempts to set Specific
Protocol Properties on a protocol stack not containing that specific Protocol Properties on a protocol stack not containing that specific
protocol are simply ignored, and do not raise an error; however, too protocol are simply ignored, and do not raise an error; however, too
much reliance by an application on Specific Protocol Properties may much reliance by an application on Specific Protocol Properties may
significantly reduce the flexibility of a transport services significantly reduce the flexibility of a transport services
implementation. implementation.
The application can set and query Connection Properties on a per- The application can set and query Connection Properties on a per-
Connection basis. Connection Properties that are not read-only can Connection basis. Connection Properties that are not read-only can
skipping to change at page 42, line 34 skipping to change at page 47, line 6
Depending on the status of the connection, the queried Connection Depending on the status of the connection, the queried Connection
Properties will include different information: Properties will include different information:
o The connection state, which can be one of the following: o The connection state, which can be one of the following:
Establishing, Established, Closing, or Closed. Establishing, Established, Closing, or Closed.
o Whether the connection can be used to send data. A connection can o Whether the connection can be used to send data. A connection can
not be used for sending if the connection was created with the not be used for sending if the connection was created with the
Selection Property "Direction of Communication" set to Selection Property "Direction of Communication" set to
"unidirectional receive" or if a Message marked as "Final" was "unidirectional receive" or if a Message marked as "Final" was
sent over this connection, see Section 7.3.5. sent over this connection, see Section 7.4.5.
o Whether the connection can be used to receive data. A connection o Whether the connection can be used to receive data. A connection
can not be used for reading if the connection was created with the can not be used for reading if the connection was created with the
Selection Property "Direction of Communication" set to Selection Property "Direction of Communication" set to
"unidirectional send" or if a Message marked as "Final" was "unidirectional send" or if a Message marked as "Final" was
received, see Section 8.3.3. The latter is only supported by received, see Section 8.3.3. The latter is only supported by
certain transport protocols, e.g., by TCP as half-closed certain transport protocols, e.g., by TCP as half-closed
connection. connection.
o For Connections that are Establishing: Transport Properties that o For Connections that are Establishing: Transport Properties that
the application specified on the Preconnection, see Section 5.2. the application specified on the Preconnection, see Section 5.2.
o For Connections that are Established, Closing, or Closed: o For Connections that are Established, Closing, or Closed:
Selection (Section 5.2) and Connection Properties (Section 9.1) of Selection (Section 5.2) and Connection Properties (Section 11.1)
the actual protocols that were selected and instantiated. of the actual protocols that were selected and instantiated.
Selection Properties indicate whether or not the Connection has or Selection Properties indicate whether or not the Connection has or
offers a certain Selection Property. Note that the actually offers a certain Selection Property. Note that the actually
instantiated protocol stack may not match all Protocol Selection instantiated protocol stack may not match all Protocol Selection
Properties that the application specified on the Preconnection. Properties that the application specified on the Preconnection.
For example, a certain Protocol Selection Property that an For example, a certain Protocol Selection Property that an
application specified as Preferred may not actually be present in application specified as Preferred may not actually be present in
the chosen protocol stack because none of the currently available the chosen protocol stack because none of the currently available
transport protocols had this feature. transport protocols had this feature.
o For Connections that are Established, additional properties of the o For Connections that are Established, additional properties of the
path(s) in use. These properties can be derived from the local path(s) in use. These properties can be derived from the local
provisioning domain [RFC7556], measurements by the Protocol Stack, provisioning domain [RFC7556], measurements by the Protocol Stack,
or other sources. or other sources.
9.1. Generic Connection Properties 11.1. Generic Connection Properties
The Connection Properties defined as independent, and available on The Connection Properties defined as independent, and available on
all Connections are defined in the subsections below. all Connections are defined in the subsections below.
Note that many protocol properties have a corresponding selection Note that many protocol properties have a corresponding selection
property, which prefers protocols providing a specific transport property, which prefers protocols providing a specific transport
feature that controlled by that protocol property. [EDITOR'S NOTE: feature that controlled by that protocol property. [EDITOR'S NOTE:
todo: add these cross-references up to Section 5.2] todo: add these cross-references up to Section 5.2]
9.1.1. Retransmission threshold before excessive retransmission 11.1.1. Retransmission Threshold Before Excessive Retransmission
notification Notification
Name: retransmit-notify-threshold Name: retransmit-notify-threshold
Type: Integer Type: Integer
Default: -1
This property specifies after how many retransmissions to inform the This property specifies after how many retransmissions to inform the
application about "Excessive Retransmissions". application about "Excessive Retransmissions". The special value -1
means that this notification is disabled.
9.1.2. Required minimum coverage of the Corruption Protection for 11.1.2. Required Minimum Corruption Protection Coverage for Receiving
receiving
Name: recv-checksum-len Name: recv-checksum-len
Type: Integer Type: Integer
Default: -1
This property specifies the part of the received data that needs to This property specifies the part of the received data that needs to
be covered by a checksum. It is given in Bytes. A value of 0 means be covered by a checksum. It is given in Bytes. A value of 0 means
that no checksum is required, and a special value (e.g., -1) that no checksum is required, and the special value -1 indicates full
indicates full checksum coverage. checksum coverage.
9.1.3. Priority (Connection) 11.1.3. Priority (Connection)
Name: conn-prio Name: conn-prio
Type: Integer Type: Integer
Default: 100
This Property is a non-negative integer representing the relative This Property is a non-negative integer representing the relative
inverse priority of this Connection relative to other Connections in inverse priority of this Connection relative to other Connections in
the same Connection Group. It has no effect on Connections not part the same Connection Group. It has no effect on Connections not part
of a Connection Group. As noted in Section 6.4, this property is not of a Connection Group. As noted in Section 6.4, this property is not
entangled when Connections are cloned. entangled when Connections are cloned.
9.1.4. Timeout for aborting Connection 11.1.4. Timeout for Aborting Connection
Name: conn-timeout Name: conn-timeout
Type: Numeric Type: Numeric
Default: -1
This property specifies how long to wait before deciding that a This property specifies how long to wait before deciding that a
Connection has failed when trying to reliably deliver data to the Connection has failed when trying to reliably deliver data to the
destination. Adjusting this Property will only take effect when the destination. Adjusting this Property will only take effect when the
underlying stack supports reliability. underlying stack supports reliability. The special value -1 means
that this timeout is not scheduled to happen.
9.1.5. Connection group transmission scheduler 11.1.5. Connection Group Transmission Scheduler
Name: conn-scheduler Name: conn-scheduler
Type: Enumeration Type: Enumeration
Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260])
This property specifies which scheduler should be used among This property specifies which scheduler should be used among
Connections within a Connection Group, see Section 6.4. The set of Connections within a Connection Group, see Section 6.4. The set of
schedulers can be taken from [I-D.ietf-tsvwg-sctp-ndata]. schedulers can be taken from [RFC8260].
9.1.6. Maximum message size concurrent with Connection establishment 11.1.6. Maximum Message Size Concurrent with Connection Establishment
Name: zero-rtt-msg-max-len Name: zero-rtt-msg-max-len
Type: Integer (read only) Type: Integer (read only)
This property represents the maximum Message size that can be sent This property represents the maximum Message size that can be sent
before or during Connection establishment, see also Section 7.3.4. before or during Connection establishment, see also Section 7.4.4.
It is given in Bytes. It is given in Bytes.
9.1.7. Maximum Message size before fragmentation or segmentation 11.1.7. Maximum Message Size Before Fragmentation or Segmentation
Name: singular-transmission-msg-max-len Name: singular-transmission-msg-max-len
Type: Integer (read only) Type: Integer (read only)
This property, if applicable, represents the maximum Message size This property, if applicable, represents the maximum Message size
that can be sent without incurring network-layer fragmentation or that can be sent without incurring network-layer fragmentation or
transport layer segmentation at the sender. transport layer segmentation at the sender.
9.1.8. Maximum Message size on send 11.1.8. Maximum Message Size on Send
Name: send-msg-max-len Name: send-msg-max-len
Type: Integer (read only) Type: Integer (read only)
This property represents the maximum Message size that can be sent. This property represents the maximum Message size that can be sent.
9.1.9. Maximum Message size on receive 11.1.9. Maximum Message Size on Receive
Name: recv-msg-max-len Name: recv-msg-max-len
Type: Integer (read only) Type: Integer (read only)
This numeric property represents the maximum Message size that can be This numeric property represents the maximum Message size that can be
received. received.
9.1.10. Capacity Profile 11.1.10. Capacity Profile
Name: conn-capacity-profile Name: conn-capacity-profile
This property specifies the desired network treatment for traffic This property specifies the desired network treatment for traffic
sent by the application and the tradeoffs the application is prepared sent by the application and the tradeoffs the application is prepared
to make in path and protocol selection to receive that desired to make in path and protocol selection to receive that desired
treatment. When the capacity profile is set to a value other than treatment. When the capacity profile is set to a value other than
Default, the transport system should select paths and profiles to Default, the transport system should select paths and profiles to
optimize for the capacity profile specified. The following values optimize for the capacity profile specified. The following values
are valid for the Capacity Profile: are valid for the Capacity Profile:
Default: The application makes no representation about its expected Default: The application makes no representation about its expected
capacity profile. No special optimizations of the tradeoff capacity profile. No special optimizations of the tradeoff
between delay, delay variation, and bandwidth efficiency should be between delay, delay variation, and bandwidth efficiency should be
made when selecting and configuring transport protocol stacks. made when selecting and configuring transport protocol stacks.
Transport system implementations that map the requested capacity Transport system implementations that map the requested capacity
profile onto per-connection DSCP signaling without multiplexing profile onto per-connection DSCP signaling without multiplexing
SHOULD assign the DSCP Default Forwarding [RFC2474] PHB; when the SHOULD assign the DSCP Default Forwarding [RFC2474] PHB; when the
Connection is multiplexed, the guidelines in section 6 of Connection is multiplexed, the guidelines in Section 6 of
[RFC7657] apply. [RFC7657] apply.
Scavenger: The application is not interactive. It expects to send Scavenger: The application is not interactive. It expects to send
and/or receive data without any urgency. This can, for example, and/or receive data without any urgency. This can, for example,
be used to select protocol stacks with scavenger transmission be used to select protocol stacks with scavenger transmission
control and/or to assign the traffic to a lower-effort service. control and/or to assign the traffic to a lower-effort service.
Transport system implementations that map the requested capacity Transport system implementations that map the requested capacity
profile onto per-connection DSCP signaling without multiplexing profile onto per-connection DSCP signaling without multiplexing
SHOULD assign the DSCP Less than Best Effort [LE-PHB] PHB; when SHOULD assign the DSCP Less than Best Effort [LE-PHB] PHB; when
the Connection is multiplexed, the guidelines in section 6 of the Connection is multiplexed, the guidelines in Section 6 of
[RFC7657] apply. [RFC7657] apply.
Low Latency/Interactive: The application is interactive, and prefers Low Latency/Interactive: The application is interactive, and prefers
loss to latency. Response time should be optimized at the expense loss to latency. Response time should be optimized at the expense
of bandwidth efficiency and delay variation when sending on this of bandwidth efficiency and delay variation when sending on this
connection. This can be used by the system to disable the connection. This can be used by the system to disable the
coalescing of multiple small Messages into larger packets (Nagle's coalescing of multiple small Messages into larger packets (Nagle's
algorithm); to prefer immediate acknowledgment from the peer algorithm); to prefer immediate acknowledgment from the peer
endpoint when supported by the underlying transport; and so on. endpoint when supported by the underlying transport; and so on.
Transport system implementations that map the requested capacity Transport system implementations that map the requested capacity
profile onto per-connection DSCP signaling without multiplexing profile onto per-connection DSCP signaling without multiplexing
SHOULD assign the DSCP Expedited Forwarding [RFC3246] PHB; when SHOULD assign the DSCP Expedited Forwarding [RFC3246] PHB; when
the Connection is multiplexed, the guidelines in section 6 of the Connection is multiplexed, the guidelines in Section 6 of
[RFC7657] apply. [RFC7657] apply.
Low Latency/Non-Interactive: The application prefers loss to latency Low Latency/Non-Interactive: The application prefers loss to latency
but is not interactive. Response time should be optimized at the but is not interactive. Response time should be optimized at the
expense of bandwidth efficiency and delay variation when sending expense of bandwidth efficiency and delay variation when sending
on this connection.Transport system implementations that map the on this connection.Transport system implementations that map the
requested capacity profile onto per-connection DSCP signaling requested capacity profile onto per-connection DSCP signaling
without multiplexing SHOULD assign a DSCP Assured Forwarding without multiplexing SHOULD assign a DSCP Assured Forwarding
(AF21,AF22,AF23,AF24) [RFC2597] PHB; when the Connection is (AF21,AF22,AF23,AF24) [RFC2597] PHB; when the Connection is
multiplexed, the guidelines in section 6 of [RFC7657] apply. multiplexed, the guidelines in Section 6 of [RFC7657] apply.
Constant-Rate Streaming: The application expects to send/receive Constant-Rate Streaming: The application expects to send/receive
data at a constant rate after Connection establishment. Delay and data at a constant rate after Connection establishment. Delay and
delay variation should be minimized at the expense of bandwidth delay variation should be minimized at the expense of bandwidth
efficiency. This implies that the Connection may fail if the efficiency. This implies that the Connection may fail if the
desired rate cannot be maintained across the Path. A transport desired rate cannot be maintained across the Path. A transport
may interpret this capacity profile as preferring a circuit may interpret this capacity profile as preferring a circuit
breaker [RFC8084] to a rate-adaptive congestion controller. breaker [RFC8084] to a rate-adaptive congestion controller.
Transport system implementations that map the requested capacity Transport system implementations that map the requested capacity
profile onto per-connection DSCP signaling without multiplexing profile onto per-connection DSCP signaling without multiplexing
SHOULD assign a DSCP Assured Forwarding (AF31,AF32,AF33,AF34) SHOULD assign a DSCP Assured Forwarding (AF31,AF32,AF33,AF34)
[RFC2597] PHB; when the Connection is multiplexed, the guidelines [RFC2597] PHB; when the Connection is multiplexed, the guidelines
in section 6 of [RFC7657] apply. in Section 6 of [RFC7657] apply.
High Throughput Data: The application expects to send/receive data High Throughput Data: The application expects to send/receive data
at the maximum rate allowed by its congestion controller over a at the maximum rate allowed by its congestion controller over a
relatively long period of time. Transport system implementations relatively long period of time. Transport system implementations
that map the requested capacity profile onto per-connection DSCP that map the requested capacity profile onto per-connection DSCP
signaling without multiplexing SHOULD assign a DSCP Assured signaling without multiplexing SHOULD assign a DSCP Assured
Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per section 4.8 of Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per Section 4.8 of
[RFC4594]. When the Connection is multiplexed, the guidelines in [RFC4594]. When the Connection is multiplexed, the guidelines in
section 6 of [RFC7657] apply. Section 6 of [RFC7657] apply.
The Capacity Profile for a selected protocol stack may be modified on The Capacity Profile for a selected protocol stack may be modified on
a per-Message basis using the Transmission Profile Message Property; a per-Message basis using the Transmission Profile Message Property;
see Section 7.3.8. see Section 7.4.8.
9.1.11. Bounds on Send or Receive Rate 11.1.11. Bounds on Send or Receive Rate
Name: max-send-rate / max-recv-rate Name: max-send-rate / max-recv-rate
Type: Integer (positive) Type: Numeric / Numeric
Default: -1 / -1 (unlimited, for both values)
This property specifies an upper-bound rate that a transfer is not This property specifies an upper-bound rate that a transfer is not
expected to exceed (even if flow control and congestion control allow expected to exceed (even if flow control and congestion control allow
higher rates), and/or a lower-bound rate below which the application higher rates), and/or a lower-bound rate below which the application
does not deem a data transfer useful. It is given in bits per does not deem a data transfer useful. It is given in bits per
second. second. The special value -1 indicates that no bound is specified.
9.1.12. TCP-specific Property: User Timeout 11.1.12. TCP-specific Property: User Timeout
This property specifies, for the case TCP becomes the chosen This property specifies, for the case TCP becomes the chosen
transport protocol: transport protocol:
Advertised User Timeout (name: tcp.user-timeout-value, type: Advertised User Timeout (name: tcp.user-timeout-value, type:
Integer): Integer):
a time value to be advertised via the User Timeout Option (UTO) a time value (default: the TCP default) to be advertised via the
for the TCP at the remote endpoint to adapt its own "Timeout for User Timeout Option (UTO) for the TCP at the remote endpoint to
aborting Connection" (see Section 9.1.4) value accordingly adapt its own "Timeout for aborting Connection" (see
Section 11.1.4) value accordingly.
User Timeout Enabled (name: tcp.user-timeout, type: Boolean): a bool User Timeout Enabled (name: tcp.user-timeout, type: Boolean): a bool
ean (default false) to control whether the UTO option is enabled ean (default false) to control whether the UTO option is enabled
for a connection. This applies to both sending and receiving. for a connection. This applies to both sending and receiving.
Changeable (name: tcp.user-timeout-recv, type: Boolean): a boolean Changeable (name: tcp.user-timeout-recv, type: Boolean): a boolean
(default true) which controls whether the "Timeout for aborting (default true) which controls whether the "Timeout for aborting
Connection" (see Section 9.1.4) may be changed based on a UTO Connection" (see Section 11.1.4) may be changed based on a UTO
option received from the remote peer. This boolean becomes false option received from the remote peer. This boolean becomes false
when "Timeout for aborting Connection" (see Section 9.1.4) is when "Timeout for aborting Connection" (see Section 11.1.4) is
used. used.
All of the above parameters are optional (e.g., it is possible to All of the above parameters are optional (e.g., it is possible to
specify "User Timeout Enabled" as true, but not specify an Advertised specify "User Timeout Enabled" as true, but not specify an Advertised
User Timeout value; in this case, the TCP default will be used). User Timeout value; in this case, the TCP default will be used).
9.2. Soft Errors 11.2. Soft Errors
Asynchronous introspection is also possible, via the SoftError Event. Asynchronous introspection is also possible, via the SoftError Event.
This event informs the application about the receipt of an ICMP error This event informs the application about the receipt of an ICMP error
message related to the Connection. This will only happen if the message related to the Connection. This will only happen if the
underlying protocol stack supports access to soft errors; however, underlying protocol stack supports access to soft errors; however,
even if the underlying stack supports it, there is no guarantee that even if the underlying stack supports it, there is no guarantee that
a soft error will be signaled. a soft error will be signaled.
Connection -> SoftError<> Connection -> SoftError<>
9.3. Excessive retransmissions 11.3. Excessive retransmissions
This event notifies the application of excessive retransmissions, This event notifies the application of excessive retransmissions,
based on a configured threshold (see Section 9.1.1). This will only based on a configured threshold (see Section 11.1.1). This will only
happen if the underlying protocol stack supports reliability and, happen if the underlying protocol stack supports reliability and,
with it, such notifications. with it, such notifications.
Connection -> ExcessiveRetransmission<> Connection -> ExcessiveRetransmission<>
10. Connection Termination 12. Connection Termination
Close terminates a Connection after satisfying all the requirements Close terminates a Connection after satisfying all the requirements
that were specified regarding the delivery of Messages that the that were specified regarding the delivery of Messages that the
application has already given to the transport system. For example, application has already given to the transport system. For example,
if reliable delivery was requested for a Message handed over before if reliable delivery was requested for a Message handed over before
calling Close, the transport system will ensure that this Message is calling Close, the transport system will ensure that this Message is
indeed delivered. If the Remote Endpoint still has data to send, it indeed delivered. If the Remote Endpoint still has data to send, it
cannot be received after this call. cannot be received after this call.
Connection.Close() Connection.Close()
skipping to change at page 48, line 47 skipping to change at page 53, line 34
Connection.Abort() Connection.Abort()
A ConnectionError informs the application that data to could not be A ConnectionError informs the application that data to could not be
delivered after a timeout, or the other side has aborted the delivered after a timeout, or the other side has aborted the
Connection; however, there is no guarantee that an Abort will indeed Connection; however, there is no guarantee that an Abort will indeed
be signaled. be signaled.
Connection -> ConnectionError<> Connection -> ConnectionError<>
11. Connection State and Ordering of Operations and Events 13. Connection State and Ordering of Operations and Events
As this interface is designed to be independent of an As this interface is designed to be independent of an
implementation's concurrency model, the details of how exactly implementation's concurrency model, the details of how exactly
actions are handled, and on which threads/callbacks events are actions are handled, and on which threads/callbacks events are
dispatched, are implementation dependent. dispatched, are implementation dependent.
Each transition of connection state is associated with one of more Each transition of connection state is associated with one of more
events: events:
o Ready<> occurs when a Connection created with Initiate() or o Ready<> occurs when a Connection created with Initiate() or
skipping to change at page 50, line 5 skipping to change at page 54, line 36
o No events will occur on a Connection after it is Closed; i.e., o No events will occur on a Connection after it is Closed; i.e.,
after a Closed<> event, an InitiateError<> or ConnectionError<> on after a Closed<> event, an InitiateError<> or ConnectionError<> on
that connection. To ensure this ordering, Closed<> will not occur that connection. To ensure this ordering, Closed<> will not occur
on a Connection while other events on the Connection are still on a Connection while other events on the Connection are still
locally outstanding (i.e., known to the interface and waiting to locally outstanding (i.e., known to the interface and waiting to
be dealt with by the application). ConnectionError<> may occur be dealt with by the application). ConnectionError<> may occur
after Closed<>, but the interface must gracefully handle all cases after Closed<>, but the interface must gracefully handle all cases
where application ignores these errors. where application ignores these errors.
12. IANA Considerations 14. IANA Considerations
RFC-EDITOR: Please remove this section before publication. RFC-EDITOR: Please remove this section before publication.
This document has no Actions for IANA. Later versions of this This document has no Actions for IANA. Later versions of this
document may create IANA registries for generic transport property document may create IANA registries for generic transport property
names and transport property namespaces (see Section 4.2.1). names and transport property namespaces (see Section 4.2.1).
13. Security Considerations 15. Security Considerations
This document describes a generic API for interacting with a This document describes a generic API for interacting with a
transport services (TAPS) system. Part of this API includes transport services (TAPS) system. Part of this API includes
configuration details for transport security protocols, as discussed configuration details for transport security protocols, as discussed
in Section 5.3. It does not recommend use (or disuse) of specific in Section 5.3. It does not recommend use (or disuse) of specific
algorithms or protocols. Any API-compatible transport security algorithms or protocols. Any API-compatible transport security
protocol should work in a TAPS system. protocol should work in a TAPS system.
14. Acknowledgements 16. Acknowledgements
This work has received funding from the European Union's Horizon 2020 This work has received funding from the European Union's Horizon 2020
research and innovation programme under grant agreements No. 644334 research and innovation programme under grant agreements No. 644334
(NEAT) and No. 688421 (MAMI). (NEAT) and No. 688421 (MAMI).
This work has been supported by Leibniz Prize project funds of DFG - This work has been supported by Leibniz Prize project funds of DFG -
German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ
FE 570/4-1). FE 570/4-1).
This work has been supported by the UK Engineering and Physical This work has been supported by the UK Engineering and Physical
Sciences Research Council under grant EP/R04144X/1. Sciences Research Council under grant EP/R04144X/1.
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. Thanks to Laurent Chuat Eyeballs, that heavily influenced this work. Thanks to Laurent Chuat
and Jason Lee for initial work on the Post Sockets interface, from and Jason Lee for initial work on the Post Sockets interface, from
which this work has evolved. which this work has evolved.
15. References 17. References
15.1. Normative References 17.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", draft-ietf-taps-arch-02 (work in Transport Services", draft-ietf-taps-arch-03 (work in
progress), October 2018. progress), March 2019.
[I-D.ietf-tsvwg-rtcweb-qos] [I-D.ietf-tsvwg-rtcweb-qos]
Jones, P., Dhesikan, S., Jennings, C., and D. Druta, "DSCP Jones, P., Dhesikan, S., Jennings, C., and D. Druta, "DSCP
Packet Markings for WebRTC QoS", draft-ietf-tsvwg-rtcweb- Packet Markings for WebRTC QoS", draft-ietf-tsvwg-rtcweb-
qos-18 (work in progress), August 2016. qos-18 (work in progress), August 2016.
[I-D.ietf-tsvwg-sctp-ndata]
Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann,
"Stream Schedulers and User Message Interleaving for the
Stream Control Transmission Protocol", draft-ietf-tsvwg-
sctp-ndata-13 (work in progress), September 2017.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[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>.
15.2. Informative References 17.2. Informative References
[I-D.ietf-taps-minset] [I-D.ietf-taps-minset]
Welzl, M. and S. Gjessing, "A Minimal Set of Transport Welzl, M. and S. Gjessing, "A Minimal Set of Transport
Services for End Systems", draft-ietf-taps-minset-11 (work Services for End Systems", draft-ietf-taps-minset-11 (work
in progress), September 2018. in progress), September 2018.
[I-D.ietf-taps-transport-security] [I-D.ietf-taps-transport-security]
Wood, C., Enghardt, T., Pauly, T., Perkins, C., and K. Wood, C., Enghardt, T., Pauly, T., Perkins, C., and K.
Rose, "A Survey of Transport Security Protocols", draft- Rose, "A Survey of Transport Security Protocols", draft-
ietf-taps-transport-security-06 (work in progress), March ietf-taps-transport-security-06 (work in progress), March
skipping to change at page 53, line 20 skipping to change at page 57, line 40
[RFC8084] Fairhurst, G., "Network Transport Circuit Breakers", [RFC8084] Fairhurst, G., "Network Transport Circuit Breakers",
BCP 208, RFC 8084, DOI 10.17487/RFC8084, March 2017, BCP 208, RFC 8084, DOI 10.17487/RFC8084, March 2017,
<https://www.rfc-editor.org/info/rfc8084>. <https://www.rfc-editor.org/info/rfc8084>.
[RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, [RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind,
Ed., "Services Provided by IETF Transport Protocols and Ed., "Services Provided by IETF Transport Protocols and
Congestion Control Mechanisms", RFC 8095, Congestion Control Mechanisms", RFC 8095,
DOI 10.17487/RFC8095, March 2017, DOI 10.17487/RFC8095, March 2017,
<https://www.rfc-editor.org/info/rfc8095>. <https://www.rfc-editor.org/info/rfc8095>.
[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>.
Appendix A. Additional Properties Appendix A. Additional Properties
The interface specified by this document represents the minimal The interface specified by this document represents the minimal
common interface to an endpoint in the transport services common interface to an endpoint in the transport services
architecture [I-D.ietf-taps-arch], based upon that architecture and architecture [I-D.ietf-taps-arch], based upon that architecture and
on the minimal set of transport service features elaborated in on the minimal set of transport service features elaborated in
[I-D.ietf-taps-minset]. However, the interface has been designed [I-D.ietf-taps-minset]. However, the interface has been designed
with extension points to allow the implementation of features beyond with extension points to allow the implementation of features beyond
those in the minimal common interface: Protocol Selection Properties, those in the minimal common interface: Protocol Selection Properties,
Path Selection Properties, and Message Properties are open sets. Path Selection Properties, and Message Properties are open sets.
skipping to change at page 53, line 45 skipping to change at page 58, line 22
used to enhance transport protocol and/or path selection, or the used to enhance transport protocol and/or path selection, or the
transmission of messages given a Protocol Stack that implements them. transmission of messages given a Protocol Stack that implements them.
These are not part of the interface, and may be removed from the These are not part of the interface, and may be removed from the
final document, but are presented here to support discussion within final document, but are presented here to support discussion within
the TAPS working group as to whether they should be added to a future the TAPS working group as to whether they should be added to a future
revision of the base specification. revision of the base specification.
A.1. Experimental Transport Properties A.1. Experimental Transport Properties
The following Transport Properties might be made available in The following Transport Properties might be made available in
addition to those specified in Section 5.2, Section 9.1, and addition to those specified in Section 5.2, Section 11.1, and
Section 7.3. Section 7.4.
A.1.1. Cost Preferences A.1.1. Cost Preferences
[EDITOR'S NOTE: At IETF 103, opinions were that this property should [EDITOR'S NOTE: At IETF 103, opinions were that this property should
stay, but it was also said that this is maybe not "on the right stay, but it was also said that this is maybe not "on the right
level". If / when moving it to the main text, note that this is level". If / when moving it to the main text, note that this is
meant to be applicable to a Preconnection or a Message.] meant to be applicable to a Preconnection or a Message.]
Name: cost-preferences Name: cost-preferences
skipping to change at page 57, line 28 skipping to change at page 62, line 4
o Configurable Message Reliability: o Configurable Message Reliability:
The "Lifetime" Message Property implements a time-based way to The "Lifetime" Message Property implements a time-based way to
configure message reliability. configure message reliability.
o "Ordered message delivery (potentially slower than unordered)" and o "Ordered message delivery (potentially slower than unordered)" and
"Unordered message delivery (potentially faster than ordered)": "Unordered message delivery (potentially faster than ordered)":
The two transport features are controlled via the Message property The two transport features are controlled via the Message property
"Ordered". "Ordered".
o Request not to delay the acknowledgement (SACK) of a message: o Request not to delay the acknowledgement (SACK) of a message:
Should the protocol support it, this is one of the transport Should the protocol support it, this is one of the transport
features the transport system can use when an application uses the features the transport system can use when an application uses the
Capacity Profile Property with value "Low Latency/Interactive". Capacity Profile Property with value "Low Latency/Interactive".
o Receive data (with no message delimiting): o Receive data (with no message delimiting):
"Received" Event without using a Deframer. "Received" Event without using a Message Framer.
o Receive a message: o Receive a message:
"Received" Event. Section 5.1 of [I-D.ietf-taps-minset] discusses "Received" Event. Section 5.1 of [I-D.ietf-taps-minset] discusses
how messages can be obtained from a bytestream in case of how messages can be obtained from a bytestream in case of
implementation over TCP. Here, this is dealt with by Framers and implementation over TCP. Here, this is dealt with by Message
Deframers. Framers.
o Information about partial message arrival: o Information about partial message arrival:
"ReceivedPartial" Event. "ReceivedPartial" Event.
o Notification of send failures: o Notification of send failures:
"Expired" and "SendError" Events. "Expired" and "SendError" Events.
o Notification that the stack has no more user data to send: o Notification that the stack has no more user data to send:
Applications can obtain this information via the "Sent" Event. Applications can obtain this information via the "Sent" Event.
skipping to change at page 59, line 14 skipping to change at page 63, line 39
Colin Perkins Colin Perkins
University of Glasgow University of Glasgow
School of Computing Science School of Computing Science
Glasgow G12 8QQ Glasgow G12 8QQ
United Kingdom United Kingdom
Email: csp@csperkins.org Email: csp@csperkins.org
Philipp S. Tiesel Philipp S. Tiesel
TU Berlin TU Berlin
Marchstrasse 23 Einsteinufer 25
10587 Berlin 10587 Berlin
Germany Germany
Email: philipp@inet.tu-berlin.de Email: philipp@tiesel.net
Chris Wood Chris Wood
Apple Inc. Apple Inc.
1 Infinite Loop One Apple Park Way
Cupertino, California 95014 Cupertino, California 95014
United States of America United States of America
Email: cawood@apple.com Email: cawood@apple.com
Tommy Pauly
Apple Inc.
One Apple Park Way
Cupertino, California 95014
United States of America
Email: tpauly@apple.com
 End of changes. 185 change blocks. 
352 lines changed or deleted 600 lines changed or added

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