draft-ietf-taps-interface-10.txt | draft-ietf-taps-interface-11.txt | |||
---|---|---|---|---|
TAPS Working Group B. Trammell, Ed. | TAPS Working Group B. Trammell, Ed. | |||
Internet-Draft Google Switzerland GmbH | Internet-Draft Google Switzerland GmbH | |||
Intended status: Standards Track M. Welzl, Ed. | Intended status: Standards Track M. Welzl, Ed. | |||
Expires: 6 May 2021 University of Oslo | Expires: August 26, 2021 University of Oslo | |||
T. Enghardt | T. Enghardt | |||
Netflix | Netflix | |||
G. Fairhurst | G. Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
M. Kuehlewind | M. Kuehlewind | |||
Ericsson | Ericsson | |||
C. Perkins | C. Perkins | |||
University of Glasgow | University of Glasgow | |||
P. Tiesel | P. Tiesel | |||
TU Berlin | TU Berlin | |||
C.A. Wood | C. Wood | |||
Cloudflare | Cloudflare | |||
T. Pauly | T. Pauly | |||
Apple Inc. | Apple Inc. | |||
2 November 2020 | K. Rose | |||
Akamai Technologies, Inc. | ||||
February 22, 2021 | ||||
An Abstract Application Layer Interface to Transport Services | An Abstract Application Layer Interface to Transport Services | |||
draft-ietf-taps-interface-10 | draft-ietf-taps-interface-11 | |||
Abstract | Abstract | |||
This document describes an abstract application programming | This document describes an abstract application programming | |||
interface, API, to the transport layer, following the Transport | interface, API, to the transport layer, following the Transport | |||
Services Architecture. It supports the asynchronous, atomic | Services Architecture. It supports the asynchronous, atomic | |||
transmission of messages over transport protocols and network paths | transmission of messages over transport protocols and network paths | |||
dynamically selected at runtime. It is intended to replace the | dynamically selected at runtime. It is intended to replace the | |||
traditional BSD sockets API as the common interface to the transport | traditional BSD sockets API as the common interface to the transport | |||
layer, in an environment where endpoints could select from multiple | layer, in an environment where endpoints could select from multiple | |||
skipping to change at page 2, line 10 ¶ | skipping to change at page 2, line 10 ¶ | |||
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 6 May 2021. | This Internet-Draft will expire on August 26, 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as described in Section 4.e of the Trust Legal Provisions and are | include Simplified BSD License text as described in Section 4.e of | |||
provided without warranty as described in the Simplified BSD License. | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 | 1.1. Terminology and Notation . . . . . . . . . . . . . . . . 5 | |||
3. Overview of Interface Design . . . . . . . . . . . . . . . . 6 | 1.2. Specification of Requirements . . . . . . . . . . . . . . 6 | |||
4. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2. Overview of Interface Design . . . . . . . . . . . . . . . . 6 | |||
4.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 8 | 3. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
4.1.1. Server Example . . . . . . . . . . . . . . . . . . . 8 | 3.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 8 | |||
4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9 | 3.1.1. Server Example . . . . . . . . . . . . . . . . . . . 9 | |||
4.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 10 | 3.1.2. Client Example . . . . . . . . . . . . . . . . . . . 10 | |||
4.2. Transport Properties . . . . . . . . . . . . . . . . . . 11 | 3.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 11 | |||
4.2.1. Transport Property Names . . . . . . . . . . . . . . 12 | 3.2. Transport Properties . . . . . . . . . . . . . . . . . . 12 | |||
4.2.2. Transport Property Types . . . . . . . . . . . . . . 13 | 3.2.1. Transport Property Names . . . . . . . . . . . . . . 12 | |||
4.3. Scope of the Interface Definition . . . . . . . . . . . . 14 | 3.2.2. Transport Property Types . . . . . . . . . . . . . . 13 | |||
5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 15 | 3.3. Scope of the Interface Definition . . . . . . . . . . . . 14 | |||
5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 16 | 4. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 15 | |||
5.1.1. Using Multicast Endpoints . . . . . . . . . . . . . . 17 | 4.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 16 | |||
5.1.2. Endpoint Aliases . . . . . . . . . . . . . . . . . . 17 | 4.1.1. Using Multicast Endpoints . . . . . . . . . . . . . . 17 | |||
5.1.3. Endpoint Examples . . . . . . . . . . . . . . . . . . 18 | 4.1.2. Endpoint Aliases . . . . . . . . . . . . . . . . . . 17 | |||
5.2. Specifying Transport Properties . . . . . . . . . . . . . 19 | 4.1.3. Endpoint Examples . . . . . . . . . . . . . . . . . . 18 | |||
5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 22 | 4.2. Specifying Transport Properties . . . . . . . . . . . . . 19 | |||
5.2.2. Preservation of Message Boundaries . . . . . . . . . 22 | 4.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 22 | |||
5.2.3. Configure Per-Message Reliability . . . . . . . . . . 22 | 4.2.2. Preservation of Message Boundaries . . . . . . . . . 22 | |||
5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 23 | 4.2.3. Configure Per-Message Reliability . . . . . . . . . . 22 | |||
5.2.5. Use 0-RTT Session Establishment with a Safely | 4.2.4. Preservation of Data Ordering . . . . . . . . . . . . 22 | |||
4.2.5. Use 0-RTT Session Establishment with a Safely | ||||
Replayable Message . . . . . . . . . . . . . . . . . 23 | Replayable Message . . . . . . . . . . . . . . . . . 23 | |||
5.2.6. Multistream Connections in Group . . . . . . . . . . 23 | 4.2.6. Multistream Connections in Group . . . . . . . . . . 23 | |||
5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 24 | 4.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 23 | |||
5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 24 | 4.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 23 | |||
5.2.9. Congestion control . . . . . . . . . . . . . . . . . 24 | 4.2.9. Congestion control . . . . . . . . . . . . . . . . . 24 | |||
5.2.10. Keep alive . . . . . . . . . . . . . . . . . . . . . 25 | 4.2.10. Keep alive . . . . . . . . . . . . . . . . . . . . . 24 | |||
5.2.11. Interface Instance or Type . . . . . . . . . . . . . 25 | 4.2.11. Interface Instance or Type . . . . . . . . . . . . . 24 | |||
5.2.12. Provisioning Domain Instance or Type . . . . . . . . 26 | 4.2.12. Provisioning Domain Instance or Type . . . . . . . . 25 | |||
5.2.13. Use Temporary Local Address . . . . . . . . . . . . . 27 | 4.2.13. Use Temporary Local Address . . . . . . . . . . . . . 26 | |||
5.2.14. Multi-Paths Transport . . . . . . . . . . . . . . . . 27 | 4.2.14. Multi-Paths Transport . . . . . . . . . . . . . . . . 27 | |||
5.2.15. Advertisement of Alternative Addresses . . . . . . . 28 | 4.2.15. Advertisement of Alternative Addresses . . . . . . . 28 | |||
5.2.16. Direction of communication . . . . . . . . . . . . . 28 | 4.2.16. Direction of communication . . . . . . . . . . . . . 28 | |||
5.2.17. Notification of ICMP soft error message arrival . . . 29 | 4.2.17. Notification of ICMP soft error message arrival . . . 29 | |||
5.2.18. Initiating side is not the first to write . . . . . . 29 | 4.2.18. Initiating side is not the first to write . . . . . . 29 | |||
5.3. Specifying Security Parameters and Callbacks . . . . . . 30 | 4.3. Specifying Security Parameters and Callbacks . . . . . . 29 | |||
5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 30 | 4.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 30 | |||
5.3.2. Connection Establishment Callbacks . . . . . . . . . 31 | 4.3.2. Connection Establishment Callbacks . . . . . . . . . 31 | |||
6. Establishing Connections . . . . . . . . . . . . . . . . . . 32 | 5. Establishing Connections . . . . . . . . . . . . . . . . . . 31 | |||
6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 32 | 5.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 31 | |||
6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 33 | 5.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 33 | |||
6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 34 | 5.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 34 | |||
6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 36 | 5.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 36 | |||
7. Managing Connections . . . . . . . . . . . . . . . . . . . . 38 | 6. Managing Connections . . . . . . . . . . . . . . . . . . . . 37 | |||
7.1. Generic Connection Properties . . . . . . . . . . . . . . 40 | 6.1. Generic Connection Properties . . . . . . . . . . . . . . 39 | |||
7.1.1. Required Minimum Corruption Protection Coverage for | 6.1.1. Required Minimum Corruption Protection Coverage for | |||
Receiving . . . . . . . . . . . . . . . . . . . . . . 40 | Receiving . . . . . . . . . . . . . . . . . . . . . . 39 | |||
7.1.2. Connection Priority . . . . . . . . . . . . . . . . . 40 | 6.1.2. Connection Priority . . . . . . . . . . . . . . . . . 39 | |||
7.1.3. Timeout for Aborting Connection . . . . . . . . . . . 40 | 6.1.3. Timeout for Aborting Connection . . . . . . . . . . . 40 | |||
7.1.4. Timeout for keep alive packets . . . . . . . . . . . 41 | 6.1.4. Timeout for keep alive packets . . . . . . . . . . . 40 | |||
7.1.5. Connection Group Transmission Scheduler . . . . . . . 41 | 6.1.5. Connection Group Transmission Scheduler . . . . . . . 40 | |||
7.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 41 | 6.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 41 | |||
7.1.7. Policy for using Multi-Path Transports . . . . . . . 43 | 6.1.7. Policy for using Multi-Path Transports . . . . . . . 42 | |||
7.1.8. Bounds on Send or Receive Rate . . . . . . . . . . . 44 | 6.1.8. Bounds on Send or Receive Rate . . . . . . . . . . . 43 | |||
7.1.9. Group Connection Limit . . . . . . . . . . . . . . . 44 | 6.1.9. Group Connection Limit . . . . . . . . . . . . . . . 43 | |||
7.1.10. Read-only Connection Properties . . . . . . . . . . . 44 | 6.1.10. Isolate Session . . . . . . . . . . . . . . . . . . . 44 | |||
7.2. TCP-specific Properties: User Timeout Option (UTO) . . . 45 | 6.1.11. Read-only Connection Properties . . . . . . . . . . . 44 | |||
7.2.1. Advertised User Timeout . . . . . . . . . . . . . . . 46 | 6.2. TCP-specific Properties: User Timeout Option (UTO) . . . 45 | |||
7.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 46 | 6.2.1. Advertised User Timeout . . . . . . . . . . . . . . . 46 | |||
7.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 46 | 6.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 46 | |||
7.3. Connection Lifecycle Events . . . . . . . . . . . . . . . 47 | 6.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 46 | |||
7.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . . 47 | 6.3. Connection Lifecycle Events . . . . . . . . . . . . . . . 46 | |||
7.3.2. Path change . . . . . . . . . . . . . . . . . . . . . 47 | 6.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . . 47 | |||
8. Data Transfer . . . . . . . . . . . . . . . . . . . . . . . . 47 | 6.3.2. Path change . . . . . . . . . . . . . . . . . . . . . 47 | |||
8.1. Messages and Framers . . . . . . . . . . . . . . . . . . 47 | 7. Data Transfer . . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
8.1.1. Message Contexts . . . . . . . . . . . . . . . . . . 48 | 7.1. Messages and Framers . . . . . . . . . . . . . . . . . . 47 | |||
8.1.2. Message Framers . . . . . . . . . . . . . . . . . . . 48 | 7.1.1. Message Contexts . . . . . . . . . . . . . . . . . . 47 | |||
8.1.3. Message Properties . . . . . . . . . . . . . . . . . 50 | 7.1.2. Message Framers . . . . . . . . . . . . . . . . . . . 48 | |||
8.2. Sending Data . . . . . . . . . . . . . . . . . . . . . . 56 | 7.1.3. Message Properties . . . . . . . . . . . . . . . . . 50 | |||
8.2.1. Basic Sending . . . . . . . . . . . . . . . . . . . . 56 | ||||
8.2.2. Send Events . . . . . . . . . . . . . . . . . . . . . 57 | 7.2. Sending Data . . . . . . . . . . . . . . . . . . . . . . 56 | |||
8.2.3. Partial Sends . . . . . . . . . . . . . . . . . . . . 58 | 7.2.1. Basic Sending . . . . . . . . . . . . . . . . . . . . 56 | |||
8.2.4. Batching Sends . . . . . . . . . . . . . . . . . . . 58 | 7.2.2. Send Events . . . . . . . . . . . . . . . . . . . . . 57 | |||
8.2.5. Send on Active Open: InitiateWithSend . . . . . . . . 59 | 7.2.3. Partial Sends . . . . . . . . . . . . . . . . . . . . 58 | |||
8.2.6. Priority in TAPS . . . . . . . . . . . . . . . . . . 59 | 7.2.4. Batching Sends . . . . . . . . . . . . . . . . . . . 58 | |||
8.3. Receiving Data . . . . . . . . . . . . . . . . . . . . . 60 | 7.2.5. Send on Active Open: InitiateWithSend . . . . . . . . 59 | |||
8.3.1. Enqueuing Receives . . . . . . . . . . . . . . . . . 60 | 7.2.6. Priority in TAPS . . . . . . . . . . . . . . . . . . 59 | |||
8.3.2. Receive Events . . . . . . . . . . . . . . . . . . . 61 | 7.3. Receiving Data . . . . . . . . . . . . . . . . . . . . . 60 | |||
8.3.3. Receive Message Properties . . . . . . . . . . . . . 63 | 7.3.1. Enqueuing Receives . . . . . . . . . . . . . . . . . 60 | |||
9. Connection Termination . . . . . . . . . . . . . . . . . . . 64 | 7.3.2. Receive Events . . . . . . . . . . . . . . . . . . . 61 | |||
10. Connection State and Ordering of Operations and Events . . . 65 | 7.3.3. Receive Message Properties . . . . . . . . . . . . . 63 | |||
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 66 | 8. Connection Termination . . . . . . . . . . . . . . . . . . . 64 | |||
12. Privacy and Security Considerations . . . . . . . . . . . . . 66 | 9. Connection State and Ordering of Operations and Events . . . 65 | |||
13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 68 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 66 | |||
14. References . . . . . . . . . . . . . . . . . . . . . . . . . 68 | 11. Privacy and Security Considerations . . . . . . . . . . . . . 66 | |||
14.1. Normative References . . . . . . . . . . . . . . . . . . 68 | 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 68 | |||
14.2. Informative References . . . . . . . . . . . . . . . . . 69 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 69 | |||
Appendix A. Convenience Functions . . . . . . . . . . . . . . . 72 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 69 | |||
A.1. Adding Preference Properties . . . . . . . . . . . . . . 72 | 13.2. Informative References . . . . . . . . . . . . . . . . . 70 | |||
A.2. Transport Property Profiles . . . . . . . . . . . . . . . 73 | Appendix A. Implementation Mapping . . . . . . . . . . . . . . . 72 | |||
A.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 73 | A.1. Types . . . . . . . . . . . . . . . . . . . . . . . . . . 73 | |||
A.2.2. reliable-message . . . . . . . . . . . . . . . . . . 73 | A.2. Events and Errors . . . . . . . . . . . . . . . . . . . . 73 | |||
A.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 74 | A.3. Time Duration . . . . . . . . . . . . . . . . . . . . . . 73 | |||
Appendix B. Relationship to the Minimal Set of Transport Services | Appendix B. Convenience Functions . . . . . . . . . . . . . . . 73 | |||
for End Systems . . . . . . . . . . . . . . . . . . . . . 74 | B.1. Adding Preference Properties . . . . . . . . . . . . . . 74 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 77 | B.2. Transport Property Profiles . . . . . . . . . . . . . . . 74 | |||
B.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 74 | ||||
B.2.2. reliable-message . . . . . . . . . . . . . . . . . . 74 | ||||
B.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 75 | ||||
Appendix C. Relationship to the Minimal Set of Transport | ||||
Services for End Systems . . . . . . . . . . . . . . 75 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 79 | ||||
1. Introduction | 1. Introduction | |||
This document specifies a modern abstract application programming | This document specifies a modern abstract application programming | |||
interface (API) atop the high-level architecture for transport | interface (API) atop the high-level architecture for transport | |||
services defined in [I-D.ietf-taps-arch]. It supports the | services defined in [I-D.ietf-taps-arch]. It supports the | |||
asynchronous, atomic transmission of messages over transport | asynchronous, atomic transmission of messages over transport | |||
protocols and network paths dynamically selected at runtime. It is | protocols and network paths dynamically selected at runtime. It is | |||
intended to replace the traditional BSD sockets API as the common | intended to replace the traditional BSD sockets API as the common | |||
interface to the transport layer, in environments where an endpoint | interface to the transport layer, in environments where an endpoint | |||
skipping to change at page 5, line 10 ¶ | skipping to change at page 5, line 14 ¶ | |||
requiring changes to the applications. This flexibility enables | requiring changes to the applications. This flexibility enables | |||
faster deployment of new features and protocols. It can also support | faster deployment of new features and protocols. It can also support | |||
applications by offering racing and fallback mechanisms, which | applications by offering racing and fallback mechanisms, which | |||
otherwise need to be separately implemented in each application. | otherwise need to be separately implemented in each application. | |||
It derives specific path and protocol selection properties and | It derives specific path and protocol selection properties and | |||
supported transport features from the analysis provided in [RFC8095], | supported transport features from the analysis provided in [RFC8095], | |||
[RFC8923], and [RFC8922]. The design encourages implementations | [RFC8923], and [RFC8922]. The design encourages implementations | |||
underneath the interface to dynamically choose a transport protocol | underneath the interface to dynamically choose a transport protocol | |||
depending on an application's choices rather than statically binding | depending on an application's choices rather than statically binding | |||
applications to a protocol at compile time. The transport system | applications to a protocol at compile time. The Transport Services | |||
implementations should provide applications with a way to override | system implementations should provide applications with a way to | |||
transport selection and instantiate a specific stack, e.g., to | override transport selection and instantiate a specific stack, e.g., | |||
support servers wishing to listen to a specific protocol. This | to support servers wishing to listen to a specific protocol. This | |||
specific transport stack choice is discouraged for general use, | specific transport stack choice is discouraged for general use, | |||
because it can reduce the portability. | because it can reduce the portability. | |||
2. Terminology and Notation | 1.1. Terminology and Notation | |||
This API is described in terms of Objects with which an application | This API is described in terms of Objects with which an application | |||
can interact; Actions the application can perform on these Objects; | can interact; Actions the application can perform on these Objects; | |||
Events, which an Object can send to an application asynchronously; | Events, which an Object can send to an application asynchronously; | |||
and Parameters associated with these Actions and Events. | and Parameters associated with these Actions and Events. | |||
The following notations, which can be combined, are used in this | The following notations, which can be combined, are used in this | |||
document: | document: | |||
* An Action creates an Object: | o An Action creates an Object: | |||
Object := Action() | Object := Action() | |||
* An Action creates an array of Objects: | o An Action creates an array of Objects: | |||
[]Object := Action() | []Object := Action() | |||
* An Action is performed on an Object: | o An Action is performed on an Object: | |||
Object.Action() | Object.Action() | |||
* An Object sends an Event: | o An Object sends an Event: | |||
Object -> Event<> | Object -> Event<> | |||
* An Action takes a set of Parameters; an Event contains a set of | o An Action takes a set of Parameters; an Event contains a set of | |||
Parameters. Action and Event parameters whose names are suffixed | Parameters. Action and Event parameters whose names are suffixed | |||
with a question mark are optional. | with a question mark are optional. | |||
Action(param0, param1?, ...) / Event<param0, param1, ...> | Action(param0, param1?, ...) / Event<param0, param1, ...> | |||
Actions associated with no Object are Actions on the abstract | Actions associated with no Object are Actions on the abstract | |||
interface itself; they are equivalent to Actions on a per-application | interface itself; they are equivalent to Actions on a per-application | |||
global context. | global context. | |||
The way these abstract concepts map into concrete implementations of | We also make use of the following basic types: | |||
this API in a given language on a given platform largely depends on | ||||
the features of the language and the platform. Actions could be | ||||
implemented as functions or method calls, for instance, and Events | ||||
could be implemented via event queues, handler functions or classes, | ||||
communicating sequential processes, or other asynchronous calling | ||||
conventions. | ||||
This specification treats Events and Errors similarly. Errors, just | o Boolean: Instances take the value "true" or "false". | |||
as any other Events, may occur asynchronously in network | ||||
applications. However, it is recommended that implementations of | o Integer: Instances take positive or negative numeric integer | |||
this interface also return Errors immediately, according to the error | values, or sometimes special non-numeric (symbolic) values. | |||
handling idioms of the implementation platform, for errors that can | ||||
be immediately detected, such as inconsistency in Transport | o Numeric: Instances take positive or negative numeric values, or | |||
Properties. An error can provide an optional reason to the | sometimes special non-numeric (symbolic) values. | |||
application with further details about why the error occurred. | ||||
o Enumeration: A family of types in which each instance takes one of | ||||
a fixed, predefined set of values specific to a given enumerated | ||||
type. | ||||
o Tuple: An ordered grouping of multiple value types, represented as | ||||
a comma-separated list in parentheses, e.g., "(Enumeration, | ||||
Preference)". Instances take a sequence of values each valid for | ||||
the corresponding value type. The composition of types and their | ||||
order depends on the property and is fixed for the property. | ||||
o Array: Denoted []Type, an instance takes a value for each of zero | ||||
or more elements in a sequence of the given Type. An array may be | ||||
of fixed or variable length. | ||||
o Collection: An unordered grouping of one or more values of the | ||||
same type. | ||||
For guidance on how these abstract concepts may be implemented in | ||||
languages in accordance with native design patterns and language and | ||||
platform features, see Appendix A. | ||||
1.2. Specification of Requirements | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. Overview of Interface Design | 2. Overview of Interface Design | |||
The design of the interface specified in this document is based on a | The design of the interface specified in this document is based on a | |||
set of principles, themselves an elaboration on the architectural | set of principles, themselves an elaboration on the architectural | |||
design principles defined in [I-D.ietf-taps-arch]. The interface | design principles defined in [I-D.ietf-taps-arch]. The interface | |||
defined in this document provides: | defined in this document provides: | |||
* Access to a variety of transport protocols, independent of the the | o Access to a variety of transport protocols, independent of the the | |||
Protocol Stacks that will be used at runtime, such that all common | Protocol Stacks that will be used at runtime, such that all common | |||
features of these protocol stacks are made available to the | features of these protocol stacks are made available to the | |||
application in a transport-independent way to the degree possible, | application in a transport-independent way to the degree possible, | |||
enabling applications written to a single API to make use of | enabling applications written to a single API to make use of | |||
transport protocols in terms of the features they provide; | transport protocols in terms of the features they provide; | |||
* Message-orientation, as opposed to stream-orientation, using | o Message-orientation, as opposed to stream-orientation, using | |||
application-assisted framing and deframing where the underlying | application-assisted framing and deframing where the underlying | |||
transport does not provide these; | transport does not provide these; | |||
* Asynchronous Connection establishment, transmission, and | o Asynchronous Connection establishment, transmission, and | |||
reception, allowing concurrent operations during establishment and | reception, allowing concurrent operations during establishment and | |||
supporting event-driven application interactions with the | supporting event-driven application interactions with the | |||
transport layer, in line with developments in modern platforms and | transport layer, in line with developments in modern platforms and | |||
programming languages; | programming languages; | |||
* Explicit support for transport-specific features to be applied | o Explicit support for transport-specific features to be applied | |||
should that particular transport be part of a chosen Protocol | should that particular transport be part of a chosen Protocol | |||
Stack. | Stack. | |||
* Explicit support for security properties as first-order transport | o Explicit support for security properties as first-order transport | |||
features, and for configuration of cryptographic identities and | features, and for configuration of cryptographic identities and | |||
transport security parameters persistent across multiple | transport security parameters persistent across multiple | |||
Connections; and | Connections; and | |||
* Explicit support for multistreaming and multipath transport | o Explicit support for multistreaming and multipath transport | |||
protocols, and the grouping of related Connections into Connection | protocols, and the grouping of related Connections into Connection | |||
Groups through cloning of Connections, to allow applications to | Groups through cloning of Connections, to allow applications to | |||
take full advantage of new transport protocols supporting these | take full advantage of new transport protocols supporting these | |||
features. | features. | |||
4. API Summary | 3. API Summary | |||
The Transport Services API is the basic common abstract application | The Transport Services API is the basic common abstract application | |||
programming interface to the Transport Services Architecture defined | programming interface to the Transport Services Architecture defined | |||
in the TAPS Architecture [I-D.ietf-taps-arch]. | in the TAPS Architecture [I-D.ietf-taps-arch]. | |||
An application primarily interacts with this API through two Objects: | An application primarily interacts with this API through two Objects: | |||
Preconnections and Connections. A Preconnection represents a set of | Preconnections and Connections. A Preconnection represents a set of | |||
properties and constraints on the selection and configuration of | properties and constraints on the selection and configuration of | |||
paths and protocols to establish a Connection with a Remote Endpoint. | paths and protocols to establish a Connection with a Remote Endpoint. | |||
A Connection represents a transport Protocol Stack on which data can | A Connection represents a transport Protocol Stack on which data can | |||
be sent to and/or received from a Remote Endpoint (i.e., depending on | be sent to and/or received from a Remote Endpoint (i.e., depending on | |||
the kind of transport, connections can be bi-directional or | the kind of transport, connections can be bi-directional or | |||
unidirectional). Connections can be created from Preconnections in | unidirectional). Connections can be created from Preconnections in | |||
three ways: by initiating the Preconnection (i.e., actively opening, | three ways: by initiating the Preconnection (i.e., actively opening, | |||
as in a client), through listening on the Preconnection (i.e., | as in a client), through listening on the Preconnection (i.e., | |||
passively opening, as in a server), or rendezvousing on the | passively opening, as in a server), or rendezvousing on the | |||
Preconnection (i.e. peer to peer establishment). | Preconnection (i.e. peer to peer establishment). | |||
Once a Connection is established, data can be sent and received on it | Once a Connection is established, data can be sent and received on it | |||
in the form of Messages. The interface supports the preservation of | in the form of Messages. The interface supports the preservation of | |||
message boundaries both via explicit Protocol Stack support, and via | message boundaries both via explicit Protocol Stack support, and via | |||
application support through a Message Framer 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 | |||
event handlers registered by the application. Errors and other | event handlers registered by the application. Errors and other | |||
notifications also happen asynchronously on the Connection. It is | notifications also happen asynchronously on the Connection. It is | |||
not necessary for an application to handle all Events; some Events | not necessary for an application to handle all Events; some Events | |||
may have implementation-specific default handlers. The application | may have implementation-specific default handlers. The application | |||
should not assume that ignoring Events (e.g., Errors) is always safe. | should not assume that ignoring Events (e.g., Errors) is always safe. | |||
Section 5, Section 6, Section 8.2, Section 8.3, and Section 9 | Section 4, Section 5, Section 7.2, Section 7.3, and Section 8 | |||
describe the details of application interaction with Objects through | describe the details of application interaction with Objects through | |||
Actions and Events in each phase of a Connection, following the | Actions and Events in each phase of a Connection, following the | |||
phases (Pre-Establishment, Establishment, Data Transfer, and | phases (Pre-Establishment, Establishment, Data Transfer, and | |||
Termination) described in Section 4.1 of [I-D.ietf-taps-arch]. | Termination) described in Section 4.1 of [I-D.ietf-taps-arch]. | |||
4.1. Usage Examples | 3.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: | |||
* Act as a server, by listening for incoming connections, receiving | o Act as a server, by listening for incoming connections, receiving | |||
requests, and sending responses, see Section 4.1.1. | requests, and sending responses, see Section 3.1.1. | |||
* Act as a client, by connecting to a Remote Endpoint using | o Act as a client, by connecting to a Remote Endpoint using | |||
Initiate, sending requests, and receiving responses, see | Initiate, sending requests, and receiving responses, see | |||
Section 4.1.2. | Section 3.1.2. | |||
* Act as a peer, by connecting to a Remote Endpoint using Rendezvous | o Act as a peer, by connecting to a Remote Endpoint using Rendezvous | |||
while simultaneously waiting for incoming Connections, sending | while simultaneously waiting for incoming Connections, sending | |||
Messages, and receiving Messages, see Section 4.1.3. | Messages, and receiving Messages, see Section 3.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 Local and Remote Endpoints that provides | available between the Local and Remote Endpoints that provides | |||
Reliable Data Transfer, Preservation of data ordering, and | Reliable Data Transfer, Preservation of data ordering, and | |||
Preservation of Message Boundaries. In this case, the application | Preservation of Message Boundaries. In this case, the application | |||
can choose to receive only complete messages. | can choose to receive only 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 that provides a | Message Boundaries, but there is a transport protocol that provides a | |||
reliable ordered byte stream, an application could receive this byte | reliable ordered byte stream, an application could receive this byte | |||
stream as partial Messages and transform it into application-layer | stream as partial Messages and transform it into application-layer | |||
Messages. Alternatively, an application might provide a Message | Messages. Alternatively, an application might provide a Message | |||
Framer, which can transform a sequence of Messages into a byte stream | Framer, which can transform a sequence of Messages into a byte stream | |||
and vice versa (Section 8.1.2). | and vice versa (Section 7.1.2). | |||
4.1.1. Server Example | 3.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, and receive a | Connections using the Transport Services Interface, and 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") | |||
TransportProperties := NewTransportProperties() | TransportProperties := NewTransportProperties() | |||
TransportProperties.Require(preserve-msg-boundaries) | TransportProperties.Require(preserve-msg-boundaries) | |||
// Reliable Data Transfer and Preserve Order are Required by default | // Reliable Data Transfer and Preserve Order are Required by default | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
SecurityParameters.Set('identity', identity) | SecurityParameters.Set(identity, myIdentity) | |||
SecurityParameters.Set('keypair', privateKey, publicKey) | SecurityParameters.Set(key-pair, myPrivateKey, myPublicKey) | |||
// Specifying a remote endpoint is optional when using Listen() | // Specifying a remote endpoint is optional when using Listen() | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
TransportProperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
Listener := Preconnection.Listen() | Listener := Preconnection.Listen() | |||
Listener -> ConnectionReceived<Connection> | Listener -> ConnectionReceived<Connection> | |||
skipping to change at page 9, line 40 ¶ | skipping to change at page 10, line 5 ¶ | |||
//---- Receive event handler begin ---- | //---- Receive event handler begin ---- | |||
Connection.Send(messageDataResponse) | Connection.Send(messageDataResponse) | |||
Connection.Close() | Connection.Close() | |||
// Stop listening for incoming Connections | // Stop listening for incoming Connections | |||
// (this example supports only one Connection) | // (this example supports only one Connection) | |||
Listener.Stop() | Listener.Stop() | |||
//---- Receive event handler end ---- | //---- Receive event handler end ---- | |||
4.1.2. Client Example | 3.1.2. Client Example | |||
This is an example of how an application might open two Connections | This is an example of how an application might open two Connections | |||
to a remote application using the Transport Services Interface, and | to a remote application using the Transport Services Interface, and | |||
send a request as well as receive a response on each of them. | send a request as well as receive a response on each of them. | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
TransportProperties := NewTransportProperties() | TransportProperties := NewTransportProperties() | |||
skipping to change at page 10, line 44 ¶ | skipping to change at page 11, line 5 ¶ | |||
C.Receive() | C.Receive() | |||
//---- Ready event handler for any Connection C end ---- | //---- Ready event handler for any Connection C end ---- | |||
Connection -> Received<messageDataResponse, messageContext> | Connection -> Received<messageDataResponse, messageContext> | |||
Connection2 -> Received<messageDataResponse, messageContext> | Connection2 -> Received<messageDataResponse, messageContext> | |||
// Close the Connection in a Receive event handler | // Close the Connection in a Receive event handler | |||
Connection.Close() | Connection.Close() | |||
Connection2.Close() | Connection2.Close() | |||
4.1.3. Peer Example | 3.1.3. Peer Example | |||
This is an example of how an application might establish a connection | This is an example of how an application might establish a connection | |||
with a peer using Rendezvous(), send a Message, and receive a | with a peer using Rendezvous(), send a Message, and receive a | |||
Message. | Message. | |||
LocalSpecifier := NewLocalEndpoint() | // Configure local candidates: a port on the local host and via a STUN server | |||
LocalSpecifier.WithPort(9876) | HostCandidate := NewLocalEndpoint() | |||
HostCandidate.WithPort(9876) | ||||
RemoteSpecifier := NewRemoteEndpoint() | ||||
RemoteSpecifier.WithHostname("example.com") | ||||
RemoteSpecifier.WithPort(9877) | ||||
TransportProperties := NewTransportProperties() | StunCandidate := NewLocalEndpoint() | |||
TransportProperties.Require(preserve-msg-boundaries) | StunCandidate.WithStunServer(address, port, credentials) | |||
// Reliable Data Transfer and Preserve Order are Required by default | ||||
SecurityParameters := NewSecurityParameters() | LocalCandidates = [HostCandidate, StunCandidate] | |||
SecurityParameters.Set('identity', identity) | ||||
SecurityParameters.Set('keypair', privateKey, publicKey) | ||||
TrustCallback := New Callback({ | // Configure transport and security properties | |||
// Verify identity of the remote endpoint, return the result | TransportProperties := ... | |||
}) | SecurityParameters := ... | |||
SecurityParameters.SetTrustVerificationCallback(trustCallback) | ||||
// Both local and remote endpoint must be specified | Preconnection := NewPreconnection(LocalCandidates, | |||
Preconnection := NewPreconnection(LocalSpecifier, | [], // No remote candidates yet | |||
RemoteSpecifier, | TransportProperties, | |||
TransportProperties, | SecurityParameters) | |||
SecurityParameters) | ||||
Preconnection.Rendezvous() | // Resolve the LocalCandidates. The Preconnection.Resolve() call | |||
// resolves both local and remote candidates but, since the remote | ||||
// candidates have not yet been specified, the ResolvedRemote list | ||||
// returned will be empty and is not used. | ||||
ResolvedLocal, ResolvedRemote = Preconnection.Resolve() | ||||
Preconnection -> RendezvousDone<Connection> | // ...Send the ResolvedLocal list to peer via signalling channel | |||
// ...Receive a list of RemoteCandidates from peer via signalling channel | ||||
//---- Ready event handler begin ---- | Preconnection.AddRemote(RemoteCandidates) | |||
Connection.Send(messageDataRequest) | Preconnection.Rendezvous() | |||
// Only receive complete messages | Preconnection -> RendezvousDone<Connection> | |||
Connection.Receive() | ||||
//---- Ready event handler end ---- | ||||
Connection -> Received<messageDataResponse, messageContext> | //---- Ready event handler begin ---- | |||
Connection.Send(messageDataRequest) | ||||
Connection.Receive() | ||||
//---- Ready event handler end ---- | ||||
// Close the Connection in a Receive event handler | Connection -> Received<messageDataResponse, messageContext> | |||
Connection.Close() | ||||
4.2. Transport Properties | // Close the Connection in a Receive event handler | |||
Connection.Close() | ||||
3.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 using | properties at each stage of the lifetime of a connection using | |||
Transport Properties, as defined in [I-D.ietf-taps-arch]. | Transport Properties, as defined in [I-D.ietf-taps-arch]. | |||
Transport Properties are divided into Selection, Connection, and | Transport Properties are divided into Selection, Connection, and | |||
Message Properties. Selection Properties (see The behavior of the | Message Properties. Selection Properties (see Section 4.2) can only | |||
selected protocol stack(s) when sending Messages is controlled by | be set during pre-establishment. They are only used to specify which | |||
Message Properties (see Section 5.2) can only be set during pre- | paths and protocol stacks can be used and are preferred by the | |||
establishment. They are only used to specify which paths and | application. Although Connection Properties (see Section 6.1) can be | |||
protocol stacks can be used and are preferred by the application. | set during pre-establishment, they may be changed later. They are | |||
Although Connection Properties (see Section 7.1) can be set during | used to inform decisions made during establishment and to fine-tune | |||
pre-establishment, they may be changed later. They are used to | the established connection. | |||
inform decisions made during establishment and to fine-tune the | The behavior of the selected protocol stack(s) when sending Messages | |||
established connection.Section 8.1.3). | is controlled by Message Properties (see Section 7.1.3). | |||
All Transport Properties, regardless of the phase in which they are | All Transport Properties, regardless of the phase in which they are | |||
used, are organized within a single namespace. This enables setting | used, are organized within a single namespace. This enables setting | |||
them as defaults at earlier stages and querying them in later stages: | them as defaults at earlier stages and querying them in later stages: | |||
* Connection Properties can be set on Preconnections and Connections | o Connection Properties can be set on Preconnections and Connections | |||
* Message Properties can be set on Preconnections, Connections and | o Message Properties can be set on Preconnections, Connections and | |||
Messages | Messages | |||
* The effect of Selection Properties can be queried on Connections | o The effect of Selection Properties can be queried on Connections | |||
and Messages | and Messages | |||
Note that configuring Connection Properties and Message Properties on | Note that configuring Connection Properties and Message Properties on | |||
Preconnections is preferred over setting them later. Early | Preconnections is preferred over setting them later. Early | |||
specification of Connection Properties allows their use as additional | specification of Connection Properties allows their use as additional | |||
input to the selection process. Protocol Specific Properties, which | input to the selection process. Protocol Specific Properties, which | |||
enable configuration of specialized features of a specific protocol, | enable configuration of specialized features of a specific protocol, | |||
see Section 3.2 of [I-D.ietf-taps-arch], are not used as an input to | see Section 3.2 of [I-D.ietf-taps-arch], are not used as an input to | |||
the selection process but only support configuration if the | the selection process but only support configuration if the | |||
respective protocol has been selected. | respective protocol has been selected. | |||
4.2.1. Transport Property Names | 3.2.1. Transport Property Names | |||
Transport Properties are referred to by property names. For the | Transport Properties are referred to by property names. For the | |||
purposes of this document, these names are alphanumeric strings in | purposes of this document, these names are alphanumeric strings in | |||
which words may be separated by hyphens. These names serve two | which words may be separated by hyphens. These names serve two | |||
purposes: | purposes: | |||
* Allowing different components of a TAPS implementation to pass | o Allowing 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, or as a representation of properties retrieved | policy manager, or as a representation of properties retrieved | |||
from a file or other storage. | from a file or other storage. | |||
* Making the code of different TAPS implementations look similar. | o Making the code of different TAPS implementations look similar. | |||
While individual programming languages may preclude strict | While individual programming languages may preclude strict | |||
adherence to the aforementioned naming convention (for instance, | adherence to the aforementioned naming convention (for instance, | |||
by prohibiting the use of hyphens in symbols), users interacting | by prohibiting the use of hyphens in symbols), users interacting | |||
with multiple implementations will still benefit from the | with multiple implementations will still benefit from the | |||
consistency resulting from the use of visually similar symbols. | consistency resulting from the use of visually similar symbols. | |||
Transport Property Names are hierarchically organized in the form | Transport Property Names are hierarchically organized in the form | |||
[<Namespace>.]<PropertyName>. | [<Namespace>.]<PropertyName>. | |||
* The Namespace component MUST be empty for well-known, generic | o The Namespace component MUST be empty for well-known, generic | |||
properties, i.e., for properties that are not specific to a | properties, i.e., for properties that are not specific to a | |||
protocol and are defined in an RFC. | protocol and are defined in an RFC. | |||
* Protocol Specific Properties MUST use the protocol acronym as the | o Protocol Specific Properties MUST use the protocol acronym as the | |||
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. | |||
* Vendor or implementation specific properties MUST use a string | o Vendor or implementation specific properties MUST use a string | |||
identifying the vendor or implementation as the Namespace. | identifying the vendor or implementation as the Namespace. | |||
Namespaces for each of the keywords provided in the IANA protocol | Namespaces for each of the keywords provided in the IANA protocol | |||
numbers registry (see https://www.iana.org/assignments/protocol- | numbers registry (see https://www.iana.org/assignments/protocol- | |||
numbers/protocol-numbers.xhtml), reformatted where necessary to | numbers/protocol-numbers.xhtml), reformatted where necessary to | |||
conform to an implementation's naming conventions, are reserved for | conform to an implementation's naming conventions, are reserved for | |||
Protocol Specific Properties and MUST NOT be used for vendor or | Protocol Specific Properties and MUST NOT be used for vendor or | |||
implementation-specific properties. | implementation-specific properties. | |||
4.2.2. Transport Property Types | 3.2.2. Transport Property Types | |||
Transport Properties can have one of a set of data types: | ||||
* Boolean: can take the values "true" and "false"; representation is | ||||
implementation-dependent. | ||||
* Integer: can take positive or negative numeric integer values; | ||||
range and representation is implementation-dependent. | ||||
* Numeric: can take positive or negative numeric values; range and | ||||
representation is implementation-dependent. | ||||
* Enumeration: can take one value of a finite set of values, | ||||
dependent on the property itself. The representation is | ||||
implementation dependent. | ||||
* Preference: can take one of five values (Prohibit, Avoid, Ignore, | ||||
Prefer, Require) for the level of preference of a given property | ||||
during protocol selection; see Section 5.2. When querying, a | ||||
Preference is of type Boolean, with "true" indicating that the | ||||
Selection Property has been applied. | ||||
* Tuple: An ordered grouping of multiple value types. In this this | Transport Properties each have a type, which can be: | |||
document, it is written as a list in brackets, e.g., | ||||
"(Enumeration, Preference)" The composition of types and their | ||||
order depends on the property and is fixed for the property. The | ||||
actual representation is implementation-dependent. | ||||
* Collection: An unordered grouping of one or more values of the | o One of the basic types described in Section 1.1; or | |||
same type. The actual representation, e.g. as a set or an array, | ||||
is implementation-dependent. | ||||
For types Integer and Numeric, special values can be defined per | o Preference, which is an Enumeration with five possible values: | |||
property; it is up to implementations how these special values are | Prohibit, Avoid, Ignore, Prefer, or Require. Each of these | |||
represented (e.g., by using -1 for an otherwise non-negative value). | denotes a level of preference of a given property during protocol | |||
selection. (See Section 4.2.) The Preference type is used only | ||||
on Preconnections, and only for Selection Properties. | ||||
4.3. Scope of the Interface Definition | 3.3. Scope of the Interface Definition | |||
This document defines a language- and platform-independent interface | This document defines a language- and platform-independent interface | |||
to a Transport Services system. Given the wide variety of languages | to a Transport Services system. Given the wide variety of languages | |||
and language conventions used to write applications that use the | and language conventions used to write applications that use the | |||
transport layer to connect to other applications over the Internet, | transport layer to connect to other applications over the Internet, | |||
this independence makes this interface necessarily abstract. | this independence makes this interface necessarily abstract. | |||
There is no interoperability benefit in tightly defining how the | There is no interoperability benefit in tightly defining how the | |||
interface is presented to application programmers across diverse | interface is presented to application programmers across diverse | |||
platforms. However, maintaining the "shape" of the abstract | platforms. However, maintaining the "shape" of the abstract | |||
interface across different platforms reduces the effort for | interface across different platforms reduces the effort for | |||
programmers who learn the transport services interface to then apply | programmers who learn the transport services interface to then apply | |||
their knowledge to another platform. | their knowledge to another platform. | |||
We therefore make the following recommendations: | We therefore make the following recommendations: | |||
* Actions, Events, and Errors in implementations of this interface | o Actions, Events, and Errors in implementations of this interface | |||
SHOULD use the names given for them in the document, subject to | SHOULD use the names given for them in the document, subject to | |||
capitalization, punctuation, and other typographic conventions in | capitalization, punctuation, and other typographic conventions in | |||
the language of the implementation, unless the implementation | the language of the implementation, unless the implementation | |||
itself uses different names for substantially equivalent objects | itself uses different names for substantially equivalent objects | |||
for networking by convention. | for networking by convention. | |||
* Implementations of this interface SHOULD implement each Selection | o Implementations of this interface SHOULD implement each Selection | |||
Property, Connection Property, and Message Context Property | Property, Connection Property, and Message Context Property | |||
specified in this document. Each interface SHOULD be implemented | specified in this document. Each interface SHOULD be implemented | |||
even when in a specific implementation/platform it will always | even when in a specific implementation/platform it will always | |||
result in no operation, e.g. there is no action when the API | result in no operation, e.g. there is no action when the API | |||
specifies a Property that is not available in a transport protocol | specifies a Property that is not available in a transport protocol | |||
implemented on a specific platform. For example, if TCP is the | implemented on a specific platform. For example, if TCP is the | |||
only underlying transport protocol, the Message Property | only underlying transport protocol, the Message Property | |||
"msgOrdered" can be implemented (trivially, as a no-op) as | "msgOrdered" can be implemented (trivially, as a no-op) as | |||
disabling the requirement for ordering will not have any effect on | disabling the requirement for ordering will not have any effect on | |||
delivery order for Connections over TCP. Similarly, the "msg- | delivery order for Connections over TCP. Similarly, the "msg- | |||
lifetime" Message Property can be implemented but ignored, as the | lifetime" Message Property can be implemented but ignored, as the | |||
description of this Property states that "it is not guaranteed | description of this Property states that "it is not guaranteed | |||
that a Message will not be sent when its Lifetime has expired". | that a Message will not be sent when its Lifetime has expired". | |||
* Implementations may use other representations for Transport | o Implementations may use other representations for Transport | |||
Property Names, e.g., by providing constants, but should provide a | Property Names, e.g., by providing constants, but should provide a | |||
straight-forward mapping between their representation and the | straight-forward mapping between their representation and the | |||
property names specified here. | property names specified here. | |||
5. Pre-Establishment Phase | 4. Pre-Establishment Phase | |||
The Pre-Establishment phase allows applications to specify properties | The Pre-Establishment phase allows applications to specify properties | |||
for the Connections that they are about to make, or to query the API | for the Connections that they are about to make, or to query the API | |||
about potential Connections they could make. | about 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 the properties of a Connection that might exist | state that describes the properties of a Connection that might exist | |||
in the future. This state comprises Local Endpoint and Remote | in the future. This state comprises Local Endpoint and Remote | |||
Endpoint Objects that denote the endpoints of the potential | Endpoint Objects that denote the endpoints of the potential | |||
Connection (see Section 5.1), the Selection Properties (see | Connection (see Section 4.1), the Selection Properties (see | |||
Section 5.2), any preconfigured Connection Properties (Section 7.1), | Section 4.2), any preconfigured Connection Properties (Section 6.1), | |||
and the security parameters (see Section 5.3): | and the security parameters (see Section 4.3): | |||
Preconnection := NewPreconnection(LocalEndpoint?, | Preconnection := NewPreconnection([]LocalEndpoint, | |||
RemoteEndpoint?, | []RemoteEndpoint, | |||
TransportProperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
The Local Endpoint MUST be specified if the Preconnection is used to | At least one Local Endpoint MUST be specified if the Preconnection is | |||
Listen() for incoming Connections, but is OPTIONAL if it is used to | used to Listen() for incoming Connections, but the list of Local | |||
Initiate() connections. If no Local Endpoint is specified, the | Endpoints MAY be empty if the Preconnection is used to Initiate() | |||
Transport System will assign an ephemeral local port to the | connections. If no Local Endpoint is specified, the Transport | |||
Connection on the appropriate interface(s). The Remote Endpoint MUST | Services system will assign an ephemeral local port to the Connection | |||
on the appropriate interface(s). At least one Remote Endpoint MUST | ||||
be specified if the Preconnection is used to Initiate() Connections, | be specified if the Preconnection is used to Initiate() Connections, | |||
but is OPTIONAL if it is used to Listen() for incoming Connections. | but the list of Remote Endpoints MAY be empty if the Preconnection is | |||
The Local Endpoint and the Remote Endpoint MUST both be specified if | used to Listen() for incoming Connections. At least one Local | |||
a peer-to-peer Rendezvous is to occur based on the Preconnection. | Endpoint and one Remote Endpoint MUST be specified if a peer-to-peer | |||
Rendezvous is to occur based on the Preconnection. | ||||
If more than one Local Endpoint is specified on a Preconnection, then | ||||
all the Local Endpoints on the Preconnection MUST represent the same | ||||
host. For example, they might correspond to different interfaces on | ||||
a multi-homed host, of they might correspond to local interfaces and | ||||
a STUN server that can be resolved to a server reflexive address for | ||||
a Preconnection used to make a peer-to-peer Rendezvous(). | ||||
If more than one Remote Endpoint is specified on the Preconnection, | ||||
then all the Remote Endpoints on the Preconnection SHOULD represent | ||||
the same host. For example, the Remote Endpoints might represent | ||||
various network interfaces of a host, or a server reflexive address | ||||
that can be used to reach a host, or a set of hosts that provide | ||||
equivalent local balanced service. | ||||
In most cases, it is expected that a single Remote Endpoint will be | ||||
specified by name, and a later call to Initiate() on the | ||||
Preconnection (see Section 5.1) will internally resolve that name to | ||||
a list of concrete endpoints. Specifying multiple Remote Endpoints | ||||
on a Preconnection allows applications to override this for more | ||||
detailed control. | ||||
Transport Properties MUST always be specified while security | Transport Properties MUST always be specified while security | |||
parameters are OPTIONAL. | parameters are OPTIONAL. | |||
If Message Framers are used (see Section 8.1.2), they MUST be added | If Message Framers are used (see Section 7.1.2), they MUST be added | |||
to the Preconnection during pre-establishment. | to the Preconnection during pre-establishment. | |||
5.1. Specifying Endpoints | 4.1. Specifying Endpoints | |||
The transport services API uses the Local Endpoint and Remote | The transport services API uses the Local Endpoint and Remote | |||
Endpoint Objects to refer to the endpoints of a transport connection. | Endpoint Objects to refer to the endpoints of a transport connection. | |||
Endpoints can be created as either Remote or Local: | Endpoints can be created as either Remote or Local: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
A single Endpoint Object represents the identity of a network host. | A single Endpoint Object represents the identity of a network host. | |||
That endpoint can be more or less specific depending on which | That endpoint can be more or less specific depending on which | |||
identifiers are set. For example, an Endpoint that only specifies a | identifiers are set. For example, an Endpoint that only specifies a | |||
hostname may in fact end up corresponding to several different IP | hostname may in fact end up corresponding to several different IP | |||
addresses on different hosts. | addresses on different hosts. | |||
An Endpoint Object can be configured with the following identifiers: | An Endpoint Object can be configured with the following identifiers: | |||
* Hostname (string) | o Hostname (string) | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
* Port (a 16-bit integer) or a Service (string) that maps to a port | o Port (a 16-bit integer) or a Service (string) that maps to a port | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
* IP address (IPv4 or IPv6 address) | o IP address (IPv4 or IPv6 address) | |||
RemoteSpecifier.WithIPv4Address(192.0.2.21) | RemoteSpecifier.WithIPv4Address(192.0.2.21) | |||
RemoteSpecifier.WithIPv6Address(2001:db8:4920:e29d:a420:7461:7073:0a) | RemoteSpecifier.WithIPv6Address(2001:db8:4920:e29d:a420:7461:7073:0a) | |||
* Interface (string name) | o Interface (string name) | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
An Endpoint cannot have multiple identifiers of a same type set. | An Endpoint cannot have multiple identifiers of a same type set. | |||
That is, an endpoint cannot have two IP addresses specified. Two | That is, an endpoint cannot have two IP addresses specified. Two | |||
separate IP addresses are represented as two Endpoint Objects. If a | separate IP addresses are represented as two Endpoint Objects. If a | |||
Preconnection specifies a Remote Endpoint with a specific IP address | Preconnection specifies a Remote Endpoint with a specific IP address | |||
set, it will only establish Connections to that IP address. If, on | set, it will only establish Connections to that IP address. If, on | |||
the other hand, the Remote Endpoint specifies a hostname but no | the other hand, the Remote Endpoint specifies a hostname but no | |||
addresses, the Connection can perform name resolution and attempt | addresses, the Connection can perform name resolution and attempt | |||
using any address derived from the original hostname of the Remote | using any address derived from the original hostname of the Remote | |||
Endpoint. | Endpoint. | |||
The Transport Services API resolves names internally, when the | The Transport Services API resolves names internally, when the | |||
Initiate(), Listen(), or Rendezvous() method is called to establish a | Initiate(), Listen(), or Rendezvous() method is called to establish a | |||
Connection. Privacy considerations for the timing of this resolution | Connection. Privacy considerations for the timing of this resolution | |||
are given in Section 12. | are given in Section 11. | |||
The Resolve() action on a Preconnection can be used by the | The Resolve() action on a Preconnection can be used by the | |||
application to force early binding when required, for example with | application to force early binding when required, for example with | |||
some Network Address Translator (NAT) traversal protocols (see | some Network Address Translator (NAT) traversal protocols (see | |||
Section 6.3). | Section 5.3). | |||
5.1.1. Using Multicast Endpoints | 4.1.1. Using Multicast Endpoints | |||
Specifying a multicast group address on a Local Endpoint will | Specifying a multicast group address on a Local Endpoint will | |||
indicate to the transport system that the resulting connection will | indicate to the transport system that the resulting connection will | |||
be used to receive multicast messages. The Remote Endpoint can be | be used to receive multicast messages. The Remote Endpoint can be | |||
used to filter incoming multicast from specific senders. Such a | used to filter incoming multicast from specific senders. Such a | |||
Preconnection will only support calling Listen(), not Initiate(). | Preconnection will only support calling Listen(), not Initiate(). | |||
The accepted Connections are receive-only. | The accepted Connections are receive-only. | |||
Similarly, specifying a multicast group address on the Remote | Similarly, specifying a multicast group address on the Remote | |||
Endpoint will indicate that the resulting connection will be used to | Endpoint will indicate that the resulting connection will be used to | |||
send multicast messages. | send multicast messages. | |||
5.1.2. Endpoint Aliases | 4.1.2. Endpoint Aliases | |||
An Endpoint can have an alternative definition when using different | An Endpoint can have an alternative definition when using different | |||
protocols. For example, a server that supports both TLS/TCP and QUIC | protocols. For example, a server that supports both TLS/TCP and QUIC | |||
may be accessible on two different port numbers depending on which | may be accessible on two different port numbers depending on which | |||
protocol is used. | protocol is used. | |||
To support this, Endpoint Objects can specify "aliases". An Endpoint | To support this, Endpoint Objects can specify "aliases". An Endpoint | |||
can have multiple aliases set. | can have multiple aliases set. | |||
RemoteSpecifier.AddAlias(AlternateRemoteSpecifier) | RemoteSpecifier.AddAlias(AlternateRemoteSpecifier) | |||
skipping to change at page 18, line 21 ¶ | skipping to change at page 18, line 21 ¶ | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
QUICRemoteSpecifier := NewRemoteEndpoint() | QUICRemoteSpecifier := NewRemoteEndpoint() | |||
QUICRemoteSpecifier.WithHostname("example.com") | QUICRemoteSpecifier.WithHostname("example.com") | |||
QUICRemoteSpecifier.WithPort(8443) | QUICRemoteSpecifier.WithPort(8443) | |||
QUICRemoteSpecifier.WithProtocol(QUIC) | QUICRemoteSpecifier.WithProtocol(QUIC) | |||
RemoteSpecifier.AddAlias(QUICRemoteSpecifier) | RemoteSpecifier.AddAlias(QUICRemoteSpecifier) | |||
5.1.3. Endpoint Examples | 4.1.3. Endpoint Examples | |||
The following examples of Endpoints show common usage patterns. | The following examples of Endpoints show common usage patterns. | |||
Specify a Remote Endpoint using a hostname and service name: | Specify a Remote Endpoint using a hostname and service name: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
Specify a Remote Endpoint using an IPv6 address and remote port: | Specify a Remote Endpoint using an IPv6 address and remote port: | |||
skipping to change at page 18, line 52 ¶ | skipping to change at page 18, line 52 ¶ | |||
Specify a Local Endpoint using a local interface name and local port: | Specify a Local Endpoint using a local interface name and local port: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
LocalSpecifier.WithPort(443) | LocalSpecifier.WithPort(443) | |||
As an alternative to specifying an interface name for the Local | As an alternative to specifying an interface name for the Local | |||
Endpoint, an application can express more fine-grained preferences | Endpoint, an application can express more fine-grained preferences | |||
using the "Interface Instance or Type" Selection Property, see | using the "Interface Instance or Type" Selection Property, see | |||
Section 5.2.11. However, if the application specifies Selection | Section 4.2.11. However, if the application specifies Selection | |||
Properties that are inconsistent with the Local Endpoint, this will | Properties that are inconsistent with the Local Endpoint, this will | |||
result in an Error once the application attempts to open a | result in an Error once the application attempts to open a | |||
Connection. | Connection. | |||
Specify a Local Endpoint using a STUN server: | Specify a Local Endpoint using a STUN server: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithStunServer(address, port, credentials) | LocalSpecifier.WithStunServer(address, port, credentials) | |||
Specify a Local Endpoint using a Any-Source Multicast group to join | Specify a Local Endpoint using a Any-Source Multicast group to join | |||
skipping to change at page 19, line 30 ¶ | skipping to change at page 19, line 30 ¶ | |||
Source-Specific Multicast requires setting both a Local and Remote | Source-Specific Multicast requires setting both a Local and Remote | |||
Endpoint: | Endpoint: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithIPv4Address(232.1.1.1) | LocalSpecifier.WithIPv4Address(232.1.1.1) | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithIPv4Address(192.0.2.22) | RemoteSpecifier.WithIPv4Address(192.0.2.22) | |||
5.2. Specifying Transport Properties | 4.2. Specifying Transport Properties | |||
A Preconnection Object holds properties reflecting the application's | A Preconnection Object holds properties reflecting the application's | |||
requirements and preferences for the transport. These include | requirements and preferences for the transport. These include | |||
Selection Properties for selecting protocol stacks and paths, as well | Selection Properties for selecting protocol stacks and paths, as well | |||
as Connection Properties for configuration of the detailed operation | as Connection Properties for configuration of the detailed operation | |||
of the selected Protocol Stacks. | of the selected Protocol Stacks. | |||
The protocol(s) and path(s) selected as candidates during | The protocol(s) and path(s) selected as candidates during | |||
establishment are determined and configured using these properties. | establishment are determined and configured using these properties. | |||
Since there could be paths over which some transport protocols are | Since there could be paths over which some transport protocols are | |||
unable to operate, or remote endpoints that support only specific | unable to operate, or remote endpoints that support only specific | |||
network addresses or transports, transport protocol selection is | network addresses or transports, transport protocol selection is | |||
necessarily tied to path selection. This may involve choosing | necessarily tied to path selection. This may involve choosing | |||
between multiple local interfaces that are connected to different | between multiple local interfaces that are connected to different | |||
access networks. | access networks. | |||
Most Selection Properties are represented as preferences, which can | Most Selection Properties are represented as Preferences, which can | |||
have one of five preference levels: | take one of five values: | |||
+============+========================================+ | +------------+------------------------------------------------------+ | |||
| Preference | Effect | | | Preference | Effect | | |||
+============+========================================+ | +------------+------------------------------------------------------+ | |||
| Require | Select only protocols/paths providing | | | Require | Select only protocols/paths providing the property, | | |||
| | the property, fail otherwise | | | | fail otherwise | | |||
+------------+----------------------------------------+ | | | | | |||
| Prefer | Prefer protocols/paths providing the | | | Prefer | Prefer protocols/paths providing the property, | | |||
| | property, proceed otherwise | | | | proceed otherwise | | |||
+------------+----------------------------------------+ | | | | | |||
| Ignore | No preference | | | Ignore | No preference | | |||
+------------+----------------------------------------+ | | | | | |||
| Avoid | Prefer protocols/paths not providing | | | Avoid | Prefer protocols/paths not providing the property, | | |||
| | the property, proceed otherwise | | | | proceed otherwise | | |||
+------------+----------------------------------------+ | | | | | |||
| Prohibit | Select only protocols/paths not | | | Prohibit | Select only protocols/paths not providing the | | |||
| | providing the property, fail otherwise | | | | property, fail otherwise | | |||
+------------+----------------------------------------+ | +------------+------------------------------------------------------+ | |||
Table 1: Selection Property Preference Levels | Table 1: Selection Property Preference Levels | |||
In addition, the pseudo-level "Default" can be used to reset the | ||||
property to the default level used by the implementation. This level | ||||
will never show up when querying the value of a preference: the | ||||
effective preference must be returned instead. | ||||
The implementation MUST ensure an outcome that is consistent with all | The implementation MUST ensure an outcome that is consistent with all | |||
application requirements expressed using Require and Prohibit. While | application requirements expressed using Require and Prohibit. While | |||
preferences expressed using Prefer and Avoid influence protocol and | preferences expressed using Prefer and Avoid influence protocol and | |||
path selection as well, outcomes can vary given the same Selection | path selection as well, outcomes can vary given the same Selection | |||
Properties, because the available protocols and paths can differ | Properties, because the available protocols and paths can differ | |||
across systems and contexts. However, implementations are | across systems and contexts. However, implementations are | |||
RECOMMENDED to seek to provide a consistent outcome to an | RECOMMENDED to seek to provide a consistent outcome to an | |||
application, given the same set of Selection Properties. | application, given the same set of Selection Properties. | |||
Note that application preferences can conflict with each other. For | Note that application preferences can conflict with each other. For | |||
skipping to change at page 21, line 12 ¶ | skipping to change at page 21, line 4 ¶ | |||
the path first, ignoring the protocol preference if a specific | the path first, ignoring the protocol preference if a specific | |||
protocol does not work on the path. | protocol does not work on the path. | |||
Selection and Connection Properties, as well as defaults for Message | Selection and Connection Properties, as well as defaults for Message | |||
Properties, can be added to a Preconnection to configure the | Properties, can be added to a Preconnection to configure the | |||
selection process and to further configure the eventually selected | selection process and to further configure the eventually selected | |||
protocol stack(s). They are collected into a TransportProperties | protocol stack(s). They are collected into a TransportProperties | |||
object to be passed into a Preconnection object: | object to be passed into a Preconnection object: | |||
TransportProperties := NewTransportProperties() | TransportProperties := NewTransportProperties() | |||
Individual properties are then set on the TransportProperties Object. | Individual properties are then set on the TransportProperties Object. | |||
Setting a Transport Property to a value overrides the previous value | Setting a Transport Property to a value overrides the previous value | |||
of this Transport Property. | of this Transport Property. | |||
TransportProperties.Set(property, value) | TransportProperties.Set(property, value) | |||
Selection Properties of type "Preference" might often be frequently | To aid readability, implementations MAY provide additional | |||
used. Implementations MAY therefore provide additional convenience | convenience functions to simplify use of Selection Properties: see | |||
functions to simplify use, see Appendix A.1 for examples. In | Appendix B.1 for examples. In addition, implementations MAY provide | |||
addition, implementations MAY provide a mechanism to create | a mechanism to create TransportProperties objects that are | |||
TransportProperties objects that are preconfigured for common use | preconfigured for common use cases as outlined in Appendix B.2. | |||
cases as outlined in Appendix A.2. | ||||
For an existing Connection, the Transport Properties can be queried | ||||
any time by using the following call on the Connection Object: | ||||
TransportProperties := Connection.GetTransportProperties() | Transport Properties for an established connection can be queried via | |||
the Connection object, as outlined in Section 6. | ||||
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 5.4 | |||
for more. | for more. | |||
Section 7.1 provides a list of Connection Properties, while Selection | Section 6.1 provides a list of Connection Properties, while Selection | |||
Properties are listed in the subsections below. Many properties are | Properties are listed in the subsections below. Many properties are | |||
only considered during establishment, and can not be changed after a | only considered during establishment, and can not be changed after a | |||
Connection is established; however, they can still be queried. The | Connection is established; however, they can still be queried. The | |||
return type of a queried Selection Property is Boolean, where "true" | return type of a queried Selection Property is Boolean, where "true" | |||
means that the Selection Property has been applied and "false" means | means that the Selection Property has been applied and "false" means | |||
that the Selection Property has not been applied. Note that "true" | that the Selection Property has not been applied. Note that "true" | |||
does not mean that a request has been honored. For example, if | does not mean that a request has been honored. For example, if | |||
"Congestion control" was requested with preference level "Prefer", | "Congestion control" was requested with preference level "Prefer", | |||
but congestion control could not be supported, querying the | but congestion control could not be supported, querying the | |||
"congestionControl" property yields the value "false". If the | "congestionControl" property yields the value "false". If the | |||
skipping to change at page 22, line 18 ¶ | skipping to change at page 22, line 5 ¶ | |||
TCP. If these default values are used and TCP is not supported by a | TCP. If these default values are used and TCP is not supported by a | |||
Transport Services implementation, then an application using the | Transport Services implementation, then an application using the | |||
default set of Properties might not succeed in establishing a | default set of Properties might not succeed in establishing a | |||
connection. Using the same default values for independent Transport | connection. Using the same default values for independent Transport | |||
Services implementations can be beneficial when applications are | Services implementations can be beneficial when applications are | |||
ported between different implementations/platforms, even if this | ported between different implementations/platforms, even if this | |||
default could lead to a connection failure when TCP is not available. | default could lead to a connection failure when TCP is not available. | |||
If default values other than those recommended below are used, it is | If default values other than those recommended below are used, it is | |||
recommended to clearly document any differences. | recommended to clearly document any differences. | |||
5.2.1. Reliable Data Transfer (Connection) | 4.2.1. Reliable Data Transfer (Connection) | |||
Name: reliability | Name: reliability | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies whether the application needs to use a | This property specifies whether the application needs to use a | |||
transport protocol that ensures that all data is received at the | transport protocol that ensures that all data is received at the | |||
Remote Endpoint without corruption. When reliable data transfer is | Remote Endpoint without corruption. When reliable data transfer is | |||
enabled, this also entails being notified when a Connection is closed | enabled, this also entails being notified when a Connection is closed | |||
or aborted. | or aborted. | |||
5.2.2. Preservation of Message Boundaries | 4.2.2. Preservation of Message Boundaries | |||
Name: preserveMsgBoundaries | Name: preserveMsgBoundaries | |||
Type: Preference | Type: Preference | |||
Default: Prefer | Default: Prefer | |||
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. | use a transport protocol that preserves message boundaries. | |||
5.2.3. Configure Per-Message Reliability | 4.2.3. Configure Per-Message Reliability | |||
Name: perMsgReliability | Name: perMsgReliability | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
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. | property applies to Connections and Connection Groups. | |||
5.2.4. Preservation of Data Ordering | 4.2.4. Preservation of Data Ordering | |||
Name: preserveOrder | Name: preserveOrder | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
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. | application on the other end in the same order as it was sent. | |||
5.2.5. Use 0-RTT Session Establishment with a Safely Replayable Message | 4.2.5. Use 0-RTT Session Establishment with a Safely Replayable Message | |||
Name: zeroRttMsg | Name: zeroRttMsg | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
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 | |||
that will then be reliably transferred to the other side before or | that will then be reliably transferred to the other side before or | |||
during Connection establishment. This Message can potentially be | during Connection establishment. This Message can potentially be | |||
received multiple times (i.e., multiple copies of the message data | received multiple times (i.e., multiple copies of the message data | |||
may be passed to the Remote Endpoint). See also Section 8.1.3.4. | may be passed to the Remote Endpoint). See also Section 7.1.3.4. | |||
Note that disabling this property has no effect for protocols that | Note that disabling this property has no effect for protocols that | |||
are not connection-oriented and do not protect against duplicated | are not connection-oriented and do not protect against duplicated | |||
messages, e.g., UDP. | messages, e.g., UDP. | |||
5.2.6. Multistream Connections in Group | 4.2.6. Multistream Connections in Group | |||
Name: multistreaming | Name: multistreaming | |||
Type: Preference | Type: Preference | |||
Default: Prefer | Default: Prefer | |||
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. | single underlying transport connection where possible. | |||
5.2.7. Full Checksum Coverage on Sending | 4.2.7. Full Checksum Coverage on Sending | |||
Name: perMsgChecksumLenSend | Name: perMsgChecksumLenSend | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies the application's need for protection against | This property specifies the application's need for protection against | |||
corruption for all data transmitted on this Connection. Disabling | corruption for all data transmitted on this Connection. Disabling | |||
this property could enable later control of the sender checksum | this property could enable later control of the sender checksum | |||
coverage (see Section 8.1.3.6). | coverage (see Section 7.1.3.6). | |||
5.2.8. Full Checksum Coverage on Receiving | 4.2.8. Full Checksum Coverage on Receiving | |||
Name: perMsgChecksumLenRecv | Name: perMsgChecksumLenRecv | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies the application's need for protection against | This property specifies the application's need for protection against | |||
corruption for all data received on this Connection. Disabling this | corruption for all data received on this Connection. Disabling this | |||
property could enable later control of the required minimum receiver | property could enable later control of the required minimum receiver | |||
checksum coverage (see Section 7.1.1). | checksum coverage (see Section 6.1.1). | |||
5.2.9. Congestion control | 4.2.9. Congestion control | |||
Name: congestionControl | Name: congestionControl | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
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] or use a circuit breaker in accordance with [RFC8084], | with [RFC2914] or use a circuit breaker in accordance with [RFC8084], | |||
whichever is appropriate. Also note that reliability is usually | whichever is appropriate. Also note that reliability is usually | |||
combined with congestion control in protocol implementations, | combined with congestion control in protocol implementations, | |||
rendering "reliable but not congestion controlled" a request that is | rendering "reliable but not congestion controlled" a request that is | |||
unlikely to succeed. If the Connection is congestion controlled, | unlikely to succeed. If the Connection is congestion controlled, | |||
performing additional congestion control in the application can have | performing additional congestion control in the application can have | |||
negative performance implications. | negative performance implications. | |||
5.2.10. Keep alive | 4.2.10. Keep alive | |||
Name: keepAlive | Name: keepAlive | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether the application would like the | This property specifies whether the application would like the | |||
Connection to send keep-alive packets or not. Note that if a | Connection to send keep-alive packets or not. Note that if a | |||
Connection determines that keep-alive packets are being sent, the | Connection determines that keep-alive packets are being sent, the | |||
applicaton should itself avoid generating additional keep alive | applicaton should itself avoid generating additional keep alive | |||
messages. Note that when supported, the system will use the default | messages. Note that when supported, the system will use the default | |||
period for generation of the keep alive-packets. (See also | period for generation of the keep alive-packets. (See also | |||
Section 7.1.4). | Section 6.1.4). | |||
5.2.11. Interface Instance or Type | 4.2.11. Interface Instance or Type | |||
Name: interface | Name: interface | |||
Type: Collection of (Preference, Enumeration) | Type: Collection of (Preference, Enumeration) | |||
Default: Empty (not setting a preference for any interface) | Default: Empty (not setting a preference for any interface) | |||
This property allows the application to select any specific network | This property allows the application to select any specific network | |||
interfaces or categories of interfaces it wants to "Require", | interfaces or categories of interfaces it wants to "Require", | |||
"Prohibit", "Prefer", or "Avoid". Note that marking a specific | "Prohibit", "Prefer", or "Avoid". Note that marking a specific | |||
interface as "Require" strictly limits path selection to that single | interface as "Require" strictly limits path selection to that single | |||
interface, and often leads to less flexible and resilient connection | interface, and often leads to less flexible and resilient connection | |||
establishment. | establishment. | |||
In contrast to other Selection Properties, this property is a tuple | In contrast to other Selection Properties, this property is a tuple | |||
skipping to change at page 26, line 13 ¶ | skipping to change at page 25, line 38 ¶ | |||
might wish to always prohibit cellular. | might wish to always prohibit cellular. | |||
The set of interface types is expected to change over time as new | The set of interface types is expected to change over time as new | |||
access technologies become available. The taxonomy of interface | access technologies become available. The taxonomy of interface | |||
types on a given Transport Services system is implementation- | types on a given Transport Services system is implementation- | |||
specific. | specific. | |||
Interface types should not be treated as a proxy for properties of | Interface types should not be treated as a proxy for properties of | |||
interfaces such as metered or unmetered network access. If an | interfaces such as metered or unmetered network access. If an | |||
application needs to prohibit metered interfaces, this should be | application needs to prohibit metered interfaces, this should be | |||
specified via Provisioning Domain attributes (see Section 5.2.12) or | specified via Provisioning Domain attributes (see Section 4.2.12) or | |||
another specific property. | another specific property. | |||
5.2.12. Provisioning Domain Instance or Type | 4.2.12. Provisioning Domain Instance or Type | |||
Name: pvd | Name: pvd | |||
Type: Collection of (Preference, Enumeration) | Type: Collection of (Preference, Enumeration) | |||
Default: Empty (not setting a preference for any PvD) | Default: Empty (not setting a preference for any PvD) | |||
Similar to interface instances and types (see Section 5.2.11), this | Similar to interface instances and types (see Section 4.2.11), this | |||
property allows the application to control path selection by | property allows the application to control path selection by | |||
selecting which specific Provisioning Domain (PvD) or categories of | selecting which specific Provisioning Domain (PvD) or categories of | |||
PVDs it wants to "Require", "Prohibit", "Prefer", or "Avoid". | PVDs it wants to "Require", "Prohibit", "Prefer", or "Avoid". | |||
Provisioning Domains define consistent sets of network properties | Provisioning Domains define consistent sets of network properties | |||
that may be more specific than network interfaces [RFC7556]. | that may be more specific than network interfaces [RFC7556]. | |||
As with interface instances and types, this property is a tuple of an | As with interface instances and types, this property is a tuple of an | |||
(Enumerated) PvD identifier and a preference, and can either be | (Enumerated) PvD identifier and a preference, and can either be | |||
implemented directly as such, or for making one preference available | implemented directly as such, or for making one preference available | |||
for each interface and interface type available on the system. | for each interface and interface type available on the system. | |||
skipping to change at page 27, line 5 ¶ | skipping to change at page 26, line 29 ¶ | |||
Categories or types of PvDs are also defined to be implementation- | Categories or types of PvDs are also defined to be implementation- | |||
and system-specific. These can be useful to identify a service that | and system-specific. These can be useful to identify a service that | |||
is provided by a PvD. For example, if an application wants to use a | is provided by a PvD. For example, if an application wants to use a | |||
PvD that provides a Voice-Over-IP service on a Cellular network, it | PvD that provides a Voice-Over-IP service on a Cellular network, it | |||
can use the relevant PvD type to require a PvD that provides this | can use the relevant PvD type to require a PvD that provides this | |||
service, without needing to look up a particular instance. While | service, without needing to look up a particular instance. While | |||
this does restrict path selection, it is broader than requiring | this does restrict path selection, it is broader than requiring | |||
specific PvD instances or interface instances, and should be | specific PvD instances or interface instances, and should be | |||
preferred over these options. | preferred over these options. | |||
5.2.13. Use Temporary Local Address | 4.2.13. Use Temporary Local Address | |||
Name: useTemporaryLocalAddress | Name: useTemporaryLocalAddress | |||
Type: Preference | Type: Preference | |||
Default: Avoid for Listeners and Rendezvous Connections. Prefer for | Default: Avoid for Listeners and Rendezvous Connections. Prefer for | |||
other Connections. | other Connections. | |||
This property allows the application to express a preference for the | This property allows the application to express a preference for the | |||
use of temporary local addresses, sometimes called "privacy" | use of temporary local addresses, sometimes called "privacy" | |||
skipping to change at page 27, line 27 ¶ | skipping to change at page 27, line 5 ¶ | |||
prevent linking connections over time when a stable address, | prevent linking connections over time when a stable address, | |||
sometimes called "permanent" address, is not needed. There are some | sometimes called "permanent" address, is not needed. There are some | |||
caveats to note when specifying this property. First, if an | caveats to note when specifying this property. First, if an | |||
application Requires the use of temporary addresses, the resulting | application Requires the use of temporary addresses, the resulting | |||
Connection cannot use IPv4, because temporary addresses do not exist | Connection cannot use IPv4, because temporary addresses do not exist | |||
in IPv4. Second, temporary local addresses might involve trading off | in IPv4. Second, temporary local addresses might involve trading off | |||
privacy for performance. For instance, temporary addresses can | privacy for performance. For instance, temporary addresses can | |||
interfere with resumption mechanisms that some protocols rely on to | interfere with resumption mechanisms that some protocols rely on to | |||
reduce initial latency. | reduce initial latency. | |||
5.2.14. Multi-Paths Transport | 4.2.14. Multi-Paths Transport | |||
Name: multipath | Name: multipath | |||
Type: Enumeration | Type: Enumeration | |||
Default: Disabled for connections created through initiate and | Default: Disabled for connections created through initiate and | |||
rendezvous, Passive for listeners | rendezvous, Passive for listeners | |||
This property specifies whether and how applications want to take | This property specifies whether and how applications want to take | |||
advantage of transferring data across multiple paths between the same | advantage of transferring data across multiple paths between the same | |||
skipping to change at page 28, line 6 ¶ | skipping to change at page 27, line 31 ¶ | |||
established, even if the chosen transport supports using multiple | established, even if the chosen transport supports using multiple | |||
paths. | paths. | |||
Active: The connection will negotiate the use of multiple paths if | Active: The connection will negotiate the use of multiple paths if | |||
the chosen transport supports this. | the chosen transport supports this. | |||
Passive: The connection will support the use of multiple paths if | Passive: The connection will support the use of multiple paths if | |||
the remote endpoint requests it. | the remote endpoint requests it. | |||
The policy for using multiple paths is specified using the separate | The policy for using multiple paths is specified using the separate | |||
"multipath-policy" property, see Section 7.1.7 below. To enable the | "multipath-policy" property, see Section 6.1.7 below. To enable the | |||
peer endpoint to initiate additional paths towards a local address | peer endpoint to initiate additional paths towards a local address | |||
other than the one initially used, it is necessary to set the | other than the one initially used, it is necessary to set the | |||
Alternative Addresses property (see Section 5.2.15 below). | Alternative Addresses property (see Section 4.2.15 below). | |||
Setting this property to "Active", can have privacy implications: It | Setting this property to "Active", can have privacy implications: It | |||
enables the transport to establish connectivity using alternate paths | enables the transport to establish connectivity using alternate paths | |||
that might result in users being linkable across the multiple paths, | that might result in users being linkable across the multiple paths, | |||
even if the Advertisement of Alternative Addresses property (see | even if the Advertisement of Alternative Addresses property (see | |||
Section 5.2.15 below) is set to false. | Section 4.2.15 below) is set to false. | |||
Enumeration values other than "Disabled" are interpreted as a | Enumeration values other than "Disabled" are interpreted as a | |||
preference for choosing protocols that can make use of multiple | preference for choosing protocols that can make use of multiple | |||
paths. The "Disabled" value implies a requirement not to use | paths. The "Disabled" value implies a requirement not to use | |||
multiple paths in parallel but does not prevent choosing a protocol | multiple paths in parallel but does not prevent choosing a protocol | |||
that is capable of using multiple paths, e.g., it does not prevent | that is capable of using multiple paths, e.g., it does not prevent | |||
choosing TCP, but prevents sending the "MP_CAPABLE" option in the TCP | choosing TCP, but prevents sending the "MP_CAPABLE" option in the TCP | |||
handshake. | handshake. | |||
5.2.15. Advertisement of Alternative Addresses | 4.2.15. Advertisement of Alternative Addresses | |||
Name: advertises-altaddr | Name: advertises-altaddr | |||
Type: Boolean | Type: Boolean | |||
Default: False | Default: False | |||
This property specifies whether alternative addresses, e.g., of other | This property specifies whether alternative addresses, e.g., of other | |||
interfaces, should be advertised to the peer endpoint by the protocol | interfaces, should be advertised to the peer endpoint by the protocol | |||
stack. Advertising these addresses enables the peer-endpoint to | stack. Advertising these addresses enables the peer-endpoint to | |||
establish additional connectivity, e.g., for connection migration or | establish additional connectivity, e.g., for connection migration or | |||
using multiple paths. | using multiple paths. | |||
Note that this can have privacy implications because it might result | Note that this can have privacy implications because it might result | |||
in users being linkable across the multiple paths. Also, note that | in users being linkable across the multiple paths. Also, note that | |||
setting this to false does not prevent the local transport system | setting this to false does not prevent the local Transport Services | |||
from _establishing_ connectivity using alternate paths (see | system from _establishing_ connectivity using alternate paths (see | |||
Section 5.2.14 above); it only prevents _proactive advertisement_ of | Section 4.2.14 above); it only prevents _proactive advertisement_ of | |||
addresses. | addresses. | |||
5.2.16. Direction of communication | 4.2.16. Direction of communication | |||
Name: direction | Name: direction | |||
Type: Enumeration | Type: Enumeration | |||
Default: Bidirectional | Default: Bidirectional | |||
This property specifies whether an application wants to use the | This property specifies whether an application wants to use the | |||
connection for sending and/or receiving data. Possible values are: | connection for sending and/or receiving data. Possible values are: | |||
Bidirectional: The connection must support sending and receiving | Bidirectional: The connection must support sending and receiving | |||
data | data | |||
Unidirectional send: The connection must support sending data, and | Unidirectional send: The connection must support sending data, and | |||
the application cannot use the connection to receive any data | the application cannot use the connection to receive any data | |||
Unidirectional receive: The connection must support receiving data, | Unidirectional receive: The connection must support receiving data, | |||
skipping to change at page 29, line 21 ¶ | skipping to change at page 29, line 5 ¶ | |||
the application cannot use the connection to receive any data | the application cannot use the connection to receive any data | |||
Unidirectional receive: The connection must support receiving data, | Unidirectional receive: The connection must support receiving data, | |||
and the application cannot use the connection to send any data | and the application cannot use the connection to send any data | |||
Since unidirectional communication can be supported by transports | Since unidirectional communication can be supported by transports | |||
offering bidirectional communication, specifying unidirectional | offering bidirectional communication, specifying unidirectional | |||
communication may cause a transport stack that supports bidirectional | communication may cause a transport stack that supports bidirectional | |||
communication to be selected. | communication to be selected. | |||
5.2.17. Notification of ICMP soft error message arrival | 4.2.17. Notification of ICMP soft error message arrival | |||
Name: softErrorNotify | Name: softErrorNotify | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
be informed when an ICMP error message arrives that does not force | be informed when an ICMP error message arrives that does not force | |||
termination of a connection. When set to true, received ICMP errors | termination of a connection. When set to true, received ICMP errors | |||
are available as SoftErrors, see Section 7.3.1. Note that even if a | are available as SoftErrors, see Section 6.3.1. Note that even if a | |||
protocol supporting this property is selected, not all ICMP errors | protocol supporting this property is selected, not all ICMP errors | |||
will necessarily be delivered, so applications cannot rely upon | will necessarily be delivered, so applications cannot rely upon | |||
receiving them [RFC8085]. | receiving them [RFC8085]. | |||
5.2.18. Initiating side is not the first to write | 4.2.18. Initiating side is not the first to write | |||
Name: activeReadBeforeSend | Name: activeReadBeforeSend | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
The most common client-server communication pattern involves the | The most common client-server communication pattern involves the | |||
client actively opening a connection, then sending data to the | client actively opening a connection, then sending data to the | |||
server. The server listens (passive open), reads, and then answers. | server. The server listens (passive open), reads, and then answers. | |||
This property specifies whether an application wants to diverge from | This property specifies whether an application wants to diverge from | |||
this pattern - either by actively opening with Initiate(), | this pattern - either by actively opening with Initiate(), | |||
immediately followed by reading, or passively opening with Listen(), | immediately followed by reading, or passively opening with Listen(), | |||
immediately followed by writing. This property is ignored when | immediately followed by writing. This property is ignored when | |||
establishing connections using Rendezvous(). Requiring this property | establishing connections using Rendezvous(). Requiring this property | |||
limits the choice of mappings to underlying protocols, which can | limits the choice of mappings to underlying protocols, which can | |||
reduce efficiency. For example, it prevents the transport system | reduce efficiency. For example, it prevents the Transport Services | |||
from mapping Connections to SCTP streams, where the first transmitted | system from mapping Connections to SCTP streams, where the first | |||
data takes the role of an active open signal [I-D.ietf-taps-impl]. | transmitted data takes the role of an active open signal | |||
[I-D.ietf-taps-impl]. | ||||
5.3. Specifying Security Parameters and Callbacks | 4.3. Specifying Security Parameters and Callbacks | |||
Most security parameters, e.g., TLS ciphersuites, local identity and | Most security parameters, e.g., TLS ciphersuites, local identity and | |||
private key, etc., may be configured statically. Others are | private key, etc., may be configured statically. Others are | |||
dynamically configured during connection establishment. Security | dynamically configured during connection establishment. Security | |||
parameters and callbacks are partitioned based on their place in the | parameters and callbacks are partitioned based on their place in the | |||
lifetime of connection establishment. Similar to Transport | lifetime of connection establishment. Similar to Transport | |||
Properties, both parameters and callbacks are inherited during | Properties, both parameters and callbacks are inherited during | |||
cloning (see Section 6.4). | cloning (see Section 5.4). | |||
5.3.1. Pre-Connection Parameters | 4.3.1. Pre-Connection Parameters | |||
Common parameters such as TLS ciphersuites are known to | Common parameters such as TLS ciphersuites are known to | |||
implementations. Clients should use common safe defaults for these | implementations. Clients should use common safe defaults for these | |||
values whenever possible. However, as discussed in [RFC8922], many | values whenever possible. However, as discussed in [RFC8922], many | |||
transport security protocols require specific security parameters and | transport security protocols require specific security parameters and | |||
constraints from the client at the time of configuration and actively | constraints from the client at the time of configuration and actively | |||
during a handshake. These configuration parameters need to be | during a handshake. These configuration parameters need to be | |||
specified in the pre-connection phase and are created as follows: | specified in the pre-connection phase and are created as follows: | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
Security configuration parameters and sample usage follow: | Security configuration parameters and sample usage follow: | |||
* Local identity and private keys: Used to perform private key | o Local identity and private keys: Used to perform private key | |||
operations and prove one's identity to the Remote Endpoint. | operations and prove one's identity to the Remote Endpoint. | |||
(Note, if private keys are not available, e.g., since they are | (Note, if private keys are not available, e.g., since they are | |||
stored in hardware security modules (HSMs), handshake callbacks | stored in hardware security modules (HSMs), handshake callbacks | |||
must be used. See below for details.) | must be used. See below for details.) | |||
SecurityParameters.Set('identity', identity) | SecurityParameters.Set(identity, myIdentity) | |||
SecurityParameters.Set('keypair', privateKey, publicKey) | SecurityParameters.Set(key-pair, myPrivateKey, myPublicKey) | |||
* Supported algorithms: Used to restrict what parameters are used by | o Supported algorithms: Used to restrict what parameters are used by | |||
underlying transport security protocols. When not specified, | underlying transport security protocols. When not specified, | |||
these algorithms should use known and safe defaults for the | these algorithms should use known and safe defaults for the | |||
system. Parameters include: ciphersuites, supported groups, and | system. Parameters include: ciphersuites, supported groups, and | |||
signature algorithms. These parameters take a collection of | signature algorithms. These parameters take a collection of | |||
supported algorithms as parameter. | supported algorithms as parameter. | |||
SecurityParameters.Set('supported-group', 'secp256k1') | SecurityParameters.Set(supported-group, "secp256k1") | |||
SecurityParameters.Set('ciphersuite, 'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256') | SecurityParameters.Set(ciphersuite, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256") | |||
SecurityParameters.Set('signature-algorithm', 'ed25519') | SecurityParameters.Set(signature-algorithm, "ed25519") | |||
* Pre-Shared Key import: Used to install pre-shared keying material | o Pre-Shared Key import: Used to install pre-shared keying material | |||
established out-of-band. Each pre-shared keying material is | established out-of-band. Each pre-shared keying material is | |||
associated with some identity that typically identifies its use or | associated with some identity that typically identifies its use or | |||
has some protocol-specific meaning to the Remote Endpoint. | has some protocol-specific meaning to the Remote Endpoint. | |||
SecurityParameters.Set('pre-shared-key', key, identity) | SecurityParameters.Set(pre-shared-key, key, identity) | |||
* Session cache management: Used to tune session cache capacity, | o Session cache management: Used to tune session cache capacity, | |||
lifetime, and other policies. | lifetime, and other policies. | |||
SecurityParameters.Set('max-cached-sessions', 16) | SecurityParameters.Set(max-cached-sessions, 16) | |||
SecurityParameters.Set('cached-session-lifetime-seconds', 3600) | SecurityParameters.Set(cached-session-lifetime-seconds, 3600) | |||
Representation of Security Parameters in implementations should | ||||
parallel that chosen for Transport Property names as recommended in | ||||
Section 3.3. | ||||
5.3.2. Connection Establishment Callbacks | 4.3.2. Connection Establishment Callbacks | |||
Security decisions, especially pertaining to trust, are not static. | Security decisions, especially pertaining to trust, are not static. | |||
Once configured, parameters may also be supplied during connection | Once configured, parameters may also be supplied during connection | |||
establishment. These are best handled as client-provided callbacks. | establishment. These are best handled as client-provided callbacks. | |||
Security handshake callbacks that may be invoked during connection | Security handshake callbacks that may be invoked during connection | |||
establishment include: | establishment include: | |||
* Trust verification callback: Invoked when a Remote Endpoint's | o Trust verification callback: Invoked when a Remote Endpoint's | |||
trust must be validated before the handshake protocol can | trust must be validated before the handshake protocol can | |||
continue. | continue. | |||
TrustCallback := NewCallback({ | TrustCallback := NewCallback({ | |||
// Handle trust, return the result | // Handle trust, return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(trustCallback) | SecurityParameters.SetTrustVerificationCallback(trustCallback) | |||
* Identity challenge callback: Invoked when a private key operation | o Identity challenge callback: Invoked when a private key operation | |||
is required, e.g., when local authentication is requested by a | is required, e.g., when local authentication is requested by a | |||
remote. | remote. | |||
ChallengeCallback := NewCallback({ | ChallengeCallback := NewCallback({ | |||
// Handle challenge | // Handle challenge | |||
}) | }) | |||
SecurityParameters.SetIdentityChallengeCallback(challengeCallback) | SecurityParameters.SetIdentityChallengeCallback(challengeCallback) | |||
6. Establishing Connections | 5. Establishing Connections | |||
Before a Connection can be used for data transfer, it needs to be | Before a Connection can be used for data transfer, it needs to be | |||
established. Establishment ends the pre-establishment phase; all | established. Establishment ends the pre-establishment phase; all | |||
transport properties and cryptographic parameter specification must | transport properties and cryptographic parameter specification must | |||
be complete before establishment, as these will be used to select | be complete before establishment, as these will be used to select | |||
candidate Paths and Protocol Stacks for the Connection. | candidate Paths and Protocol Stacks for the Connection. | |||
Establishment may be active, using the Initiate() Action; passive, | Establishment may be active, using the Initiate() Action; passive, | |||
using the Listen() Action; or simultaneous for peer-to-peer, using | using the Listen() Action; or simultaneous for peer-to-peer, using | |||
the Rendezvous() Action. These Actions are described in the | the Rendezvous() Action. These Actions are described in the | |||
subsections below. | subsections below. | |||
6.1. Active Open: Initiate | 5.1. Active Open: Initiate | |||
Active open is the Action of establishing a Connection to a Remote | Active open is the Action of establishing a Connection to a Remote | |||
Endpoint presumed to be listening for incoming Connection requests. | Endpoint presumed to be listening for incoming Connection requests. | |||
Active open is used by clients in client-server interactions. Active | Active open is used by clients in client-server interactions. Active | |||
open is supported by this interface through the Initiate Action: | open is supported by this interface through the Initiate Action: | |||
Connection := Preconnection.Initiate(timeout?) | Connection := Preconnection.Initiate(timeout?) | |||
The timeout parameter specifies how long to wait before aborting | The timeout parameter specifies how long to wait before aborting | |||
Active open. Before calling Initiate, the caller must have populated | Active open. Before calling Initiate, the caller must have populated | |||
skipping to change at page 32, line 41 ¶ | skipping to change at page 32, line 22 ¶ | |||
necessary for candidate selection. | necessary for candidate selection. | |||
The Initiate() Action returns a Connection object. Once Initiate() | The Initiate() Action returns a Connection object. Once Initiate() | |||
has been called, any changes to the Preconnection MUST NOT have any | has been called, any changes to the Preconnection MUST NOT have any | |||
effect on the Connection. However, the Preconnection can be reused, | effect on the Connection. However, the Preconnection can be reused, | |||
e.g., to Initiate another Connection. | e.g., to Initiate another Connection. | |||
Once Initiate is called, the candidate Protocol Stack(s) may cause | Once Initiate is called, the candidate Protocol Stack(s) may cause | |||
one or more candidate transport-layer connections to be created to | one or more candidate transport-layer connections to be created to | |||
the specified remote endpoint. The caller may immediately begin | the specified remote endpoint. The caller may immediately begin | |||
sending Messages on the Connection (see Section 8.2) after calling | sending Messages on the Connection (see Section 7.2) after calling | |||
Initiate(); note that any data marked "Safely Replayable" that is | Initiate(); note that any data marked "Safely Replayable" that is | |||
sent while the Connection is being established may be sent multiple | sent while the Connection is being established may be sent multiple | |||
times or on multiple candidates. | times or on multiple candidates. | |||
The following Events may be sent by the Connection after Initiate() | The following Events may be sent by the Connection after Initiate() | |||
is called: | is called: | |||
Connection -> Ready<> | Connection -> Ready<> | |||
The Ready Event occurs after Initiate has established a transport- | The Ready Event occurs after Initiate has established a transport- | |||
layer connection on at least one usable candidate Protocol Stack over | layer connection on at least one usable candidate Protocol Stack over | |||
at least one candidate Path. No Receive Events (see Section 8.3) | at least one candidate Path. No Receive Events (see Section 7.3) | |||
will occur before the Ready Event for Connections established using | will occur before the Ready Event for Connections established using | |||
Initiate. | Initiate. | |||
Connection -> EstablishmentError<reason?> | Connection -> EstablishmentError<reason?> | |||
An EstablishmentError occurs either when the set of transport | An EstablishmentError occurs either when the set of transport | |||
properties and security parameters cannot be fulfilled on a | properties and security parameters cannot be fulfilled on a | |||
Connection for initiation (e.g., the set of available Paths and/or | Connection for initiation (e.g., the set of available Paths and/or | |||
Protocol Stacks meeting the constraints is empty) or reconciled with | Protocol Stacks meeting the constraints is empty) or reconciled with | |||
the Local and/or Remote Endpoints; when the remote specifier cannot | the Local and/or Remote Endpoints; when the remote specifier cannot | |||
be resolved; or when no transport-layer connection can be established | be resolved; or when no transport-layer connection can be established | |||
to the Remote Endpoint (e.g., because the Remote Endpoint is not | to the Remote Endpoint (e.g., because the Remote Endpoint is not | |||
accepting connections, the application is prohibited from opening a | accepting connections, the application is prohibited from opening a | |||
Connection by the operating system, or the establishment attempt has | Connection by the operating system, or the establishment attempt has | |||
timed out for any other reason). | timed out for any other reason). | |||
Connection establishment and transmission of the first message can be | Connection establishment and transmission of the first message can be | |||
combined in a single action Section 8.2.5. | combined in a single action Section 7.2.5. | |||
6.2. Passive Open: Listen | 5.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 Action | Passive open is supported by this interface through the Listen Action | |||
and returns a Listener object: | and returns a Listener object: | |||
Listener := 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 | |||
skipping to change at page 34, line 38 ¶ | skipping to change at page 34, line 18 ¶ | |||
Parameters of the Preconnection cannot be fulfilled for listening or | Parameters of the Preconnection cannot be fulfilled for listening or | |||
cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | |||
if specified), when the Local Endpoint (or Remote Endpoint, if | if specified), when the Local Endpoint (or Remote Endpoint, if | |||
specified) cannot be resolved, or when the application is prohibited | specified) cannot be resolved, or when the application is prohibited | |||
from listening by policy. | from listening by policy. | |||
Listener -> Stopped<> | Listener -> Stopped<> | |||
A Stopped Event occurs after the Listener has stopped listening. | A Stopped Event occurs after the Listener has stopped listening. | |||
6.3. Peer-to-Peer Establishment: Rendezvous | 5.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 | A Preconnection Object used in a Rendezvous() MUST have both the | |||
and a Remote Endpoint, and also the transport properties and security | Local Endpoint candidates and the Remote Endpoint candidates | |||
parameters needed for Protocol Stack selection. | specified, along with the transport properties and security | |||
parameters needed for Protocol Stack selection, before the | ||||
Rendezvous() Action is initiated. | ||||
The Rendezvous() Action causes the Preconnection to listen on the | The Rendezvous() Action listens on the Local Endpoint candidates for | |||
Local Endpoint for an incoming Connection from the Remote Endpoint, | an incoming Connection from the Remote Endpoint candidates, while | |||
while also simultaneously trying to establish a Connection from the | also simultaneously trying to establish a Connection from the Local | |||
Local Endpoint to the Remote Endpoint. | Endpoint candidates to the Remote Endpoint candidates. | |||
If there are multiple Local Endpoints or Remote Endpoints configured, | If there are multiple Local Endpoints or Remote Endpoints configured, | |||
then initiating a rendezvous action will systematically probe the | then initiating a Rendezvous() action will systematically probe the | |||
reachability of those endpoints following an approach such as that | reachability of those endpoint candidates following an approach such | |||
used in Interactive Connectivity Establishment (ICE) [RFC5245]. | as that used in Interactive Connectivity Establishment (ICE) | |||
[RFC5245]. | ||||
If the endpoints are suspected to be behind a NAT, Rendezvous() can | If the endpoints are suspected to be behind a NAT, Rendezvous() can | |||
be initiated using Local and Remote Endpoints that support a method | be initiated using Local Endpoints that support a method of | |||
of discovering NAT bindings such as Session Traversal Utilities for | discovering NAT bindings such as Session Traversal Utilities for NAT | |||
NAT (STUN) [RFC8489] or Traversal Using Relays around NAT (TURN) | (STUN) [RFC8489] or Traversal Using Relays around NAT (TURN) | |||
[RFC5766]. In this case, the Local Endpoint will resolve to a | [RFC5766]. In this case, the Local Endpoint will resolve to a | |||
mixture of local and server reflexive addresses. The Resolve() | mixture of local and server reflexive addresses. The Resolve() | |||
action on the Preconnection can be used to discover these bindings: | action on the Preconnection can be used to discover these bindings: | |||
[]Preconnection := Preconnection.Resolve() | []LocalEndpoint, []RemoteEndpoint := Preconnection.Resolve() | |||
The Resolve() call returns lists of Local Endpoints and Remote | ||||
The Resolve() call returns a list of Preconnection Objects, that | Endpoints, that represent the concrete addresses, local and server | |||
represent the concrete addresses, local and server reflexive, on | reflexive, on which a Rendezvous() for the Preconnection will listen | |||
which a Rendezvous() for the Preconnection will listen for incoming | for incoming Connections, and to which it will attempt to establish | |||
Connections. These resolved Preconnections will share all other | connections. | |||
Properties with the Preconnection from which they are derived, though | ||||
some Properties may be made more-specific by the resolution process. | ||||
An application that uses Rendezvous() to establish a peer-to-peer | An application that uses Rendezvous() to establish a peer-to-peer | |||
connection in the presence of NATs will configure the Preconnection | connection in the presence of NATs will configure the Preconnection | |||
object with a Local Endpoint that supports NAT binding discovery. It | object with at least one a Local Endpoint that supports NAT binding | |||
will then Resolve() on that endpoint, and pass the resulting list of | discovery. It will then Resolve() the Preconnection, and pass the | |||
candidate local addresses to the peer via a signalling protocol, for | resulting list of Local Endpoint candidates to the peer via a | |||
example as part of an ICE [RFC5245] exchange within SIP [RFC3261] or | signalling protocol, for example as part of an ICE [RFC5245] exchange | |||
WebRTC [RFC7478]. The peer will, via the same signalling channel, | within SIP [RFC3261] or WebRTC [RFC7478]. The peer will then, via | |||
return the remote endpoint candidates. These remote endpoint | the same signalling channel, return the Remote Endpoint candidates. | |||
candidates are then configured on the Preconnection, allowing the | The set of Remote Endpoint candidates are then configured onto the | |||
Rendezvous() Action to be initiated. | Preconnection: | |||
The Rendezvous() Action returns a Connection object. Once | Preconnection.AddRemote([]RemoteEndpoint) | |||
Rendezvous() has been called, any changes to the Preconnection MUST | ||||
NOT have any effect on the Connection. However, the Preconnection | The Rendezvous() Action can be initiated once both the Local Endpoint | |||
can be reused, e.g., for Rendezvous of another Connection. | candidates and the Remote Endpoint candidates retrieved from the peer | |||
via the signalling channel have been added to the Preconnection. | ||||
If successful, the Rendezvous() Action returns a Connection object | ||||
via a RendezvousDone<> Event: | ||||
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. Changes made | |||
to a Preconnection after Rendezvous() has been called do not have any | ||||
Preconnection -> EstablishmentError<reason?> | effect on existing Connections. | |||
An EstablishmentError occurs either when the Properties and Security | An EstablishmentError occurs either when the Properties and Security | |||
Parameters of the Preconnection cannot be fulfilled for rendezvous or | Parameters of the Preconnection cannot be fulfilled for rendezvous or | |||
cannot be reconciled with the Local and/or Remote Endpoints, when the | cannot be reconciled with the Local and/or Remote Endpoints, when the | |||
Local Endpoint or Remote Endpoint cannot be resolved, when no | Local Endpoint or Remote Endpoint cannot be resolved, when no | |||
transport-layer connection can be established to the Remote Endpoint, | transport-layer connection can be established to the Remote Endpoint, | |||
or when the application is prohibited from rendezvous by policy. | or when the application is prohibited from rendezvous by policy: | |||
When using some NAT traversal protocols, e.g., Interactive | ||||
Connectivity Establishment (ICE) [RFC5245], it is expected that the | ||||
Local Endpoint will be configured with some method of discovering NAT | ||||
bindings, e.g., a Session Traversal Utilities for NAT (STUN) server. | ||||
In this case, the Local Endpoint may resolve to a mixture of local | ||||
and server reflexive addresses. The Resolve() action on the | ||||
Preconnection can be used to discover these bindings: | ||||
[]Preconnection := Preconnection.Resolve() | ||||
The Resolve() call returns a list of Preconnection Objects, that | Preconnection -> EstablishmentError<reason?> | |||
represent the concrete addresses, local and server reflexive, on | ||||
which a Rendezvous() for the Preconnection will listen for incoming | ||||
Connections. These resolved Preconnections will share all other | ||||
Properties with the Preconnection from which they are derived, though | ||||
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 | ||||
SIP [RFC3261] or WebRTC [RFC7478], to configure the remote endpoint. | ||||
6.4. Connection Groups | 5.4. Connection Groups | |||
Entangled 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 Connections: the | Calling Clone on a Connection yields a group of Connections: the | |||
parent Connection on which Clone was called, and a resulting cloned | parent Connection on which Clone was called, and a resulting cloned | |||
Connection. The connections within a group are "entangled" with each | Connection. The connections within a group are "entangled" with each | |||
other, and become part of a Connection Group. Calling Clone on any | other, and become part of a Connection Group. Calling Clone on any | |||
of these Connections adds another Connection to the Connection Group, | of these Connections adds another Connection to the Connection Group, | |||
and so on. "Entangled" Connections share all Connection Properties | and so on. "Entangled" Connections share all Connection Properties | |||
except "Connection Priority" (see Section 7.1.2) . Like all other | except "Connection Priority" (see Section 6.1.2) . Like all other | |||
Properties, Connection Priority is copied to the new Connection when | Properties, Connection Priority is copied to the new Connection when | |||
calling Clone(), but it is not entangled: Changing Connection | calling Clone(), but it is not entangled: Changing Connection | |||
Priority on one Connection does not change it on the other | Priority on one Connection does not change it on the other | |||
Connections in the same Connection Group. | Connections in the same Connection Group. | |||
The stack of Message Framers associated with a Connection are also | The stack of Message Framers associated with a Connection are also | |||
copied to the cloned Connection when calling Clone. In other words, | copied to the cloned Connection when calling Clone. In other words, | |||
a cloned Connection has the same stack of Message Framers as the | a cloned Connection has the same stack of Message Framers as the | |||
Connection from which they are Cloned, but these Framers may | Connection from which they are Cloned, but these Framers may | |||
internally maintain per-Connection state. | internally maintain per-Connection state. | |||
skipping to change at page 37, line 37 ¶ | skipping to change at page 36, line 44 ¶ | |||
Connections will belong to the same group if the application | Connections will belong to the same group if the application | |||
previously called Clone. Passive Connections can also be added to | previously called Clone. Passive Connections can also be added to | |||
the same group - e.g., when a Listener receives a new Connection that | the same group - e.g., when a Listener receives a new Connection that | |||
is just a new stream of an already active multi-streaming protocol | is just a new stream of an already active multi-streaming protocol | |||
instance. | instance. | |||
Changing one of the Connection Properties on one Connection in the | Changing one of the Connection Properties on one Connection in the | |||
group changes it for all others. Message Properties, however, are | group changes it for all others. Message Properties, however, are | |||
not entangled. For example, changing "Timeout for aborting | not entangled. For example, changing "Timeout for aborting | |||
Connection" (see Section 7.1.3) on one Connection in a group will | Connection" (see Section 6.1.3) on one Connection in a group will | |||
automatically change this Connection Property for all Connections in | automatically change this Connection Property for all Connections in | |||
the group in the same way. However, changing "Lifetime" (see | the group in the same way. However, changing "Lifetime" (see | |||
Section 8.1.3.1) of a Message will only affect a single Message on a | Section 7.1.3.1) of a Message will only affect a single Message on a | |||
single Connection, entangled or not. | 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. | |||
Note that calling Clone() can result in on-the-wire signaling, e.g., | Note that calling Clone() can result in on-the-wire signaling, e.g., | |||
to open a new connection, depending on the underlying Protocol Stack. | to open a new connection, depending on the underlying Protocol Stack. | |||
When Clone() leads to multiple connections being opened instead of | When Clone() leads to multiple connections being opened instead of | |||
multi-streaming, the transport system will ensure consistency of | multi-streaming, the Transport Services system will ensure | |||
Connection Properties by uniformly applying them to all underlying | consistency of Connection Properties by uniformly applying them to | |||
connections in a group. Even in such a case, there are possibilities | all underlying connections in a group. Even in such a case, there | |||
for a transport system to implement prioritization within a | are possibilities for a Transport Services system to implement | |||
Connection Group [TCP-COUPLING] [RFC8699]. | prioritization within a Connection Group [TCP-COUPLING] [RFC8699]. | |||
Attempts to clone a Connection can result in a CloneError: | Attempts to clone a Connection can result in a CloneError: | |||
Connection -> CloneError<reason?> | Connection -> CloneError<reason?> | |||
The Connection Priority Connection Property operates on entangled | The Connection Priority Connection Property operates on entangled | |||
Connections using the same approach as in Section 8.1.3.2: when | Connections using the same approach as in Section 7.1.3.2: when | |||
allocating available network capacity among Connections in a | allocating available network capacity among Connections in a | |||
Connection Group, sends on Connections with lower Priority values | Connection Group, sends on Connections with lower Priority values | |||
will be prioritized over sends on Connections with higher Priority | will be prioritized over sends on Connections with higher Priority | |||
values. Capacity will be shared among these Connections according to | values. Capacity will be shared among these Connections according to | |||
the Connection Group Transmission Scheduler property (Section 7.1.5). | the Connection Group Transmission Scheduler property (Section 6.1.5). | |||
See Section 8.2.6 for more. | See Section 7.2.6 for more. | |||
7. Managing Connections | 6. 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 7.1 below. Specific Protocol Properties are defined in a | in Section 6.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 can | much reliance by an application on Specific Protocol Properties can | |||
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 | |||
be set during pre-establishment (see Section 5.2), as well as on | be set during pre-establishment (see Section 4.2), as well as on | |||
connections directly using the SetProperty action: | connections directly using the SetProperty action: | |||
Connection.SetProperty(property, value) | Connection.SetProperty(property, value) | |||
Note that changing one of the Connection Properties on one Connection | Note that changing one of the Connection Properties on one Connection | |||
in a Connection Group will also change it for all other Connections | in a Connection Group will also change it for all other Connections | |||
of that group; see further Section 6.4. | of that group; see further Section 5.4. | |||
At any point, the application can query Connection Properties. | At any point, the application can query Connection Properties. | |||
ConnectionProperties := Connection.GetProperties() | ConnectionProperties := Connection.GetProperties() | |||
value := ConnectionProperties.Get(property) | ||||
if ConnectionProperties.Has(boolean_or_preference_property) then ... | ||||
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: | |||
* 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. | |||
* 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 8.1.3.5. | sent over this connection. See Section 7.1.3.5. | |||
* Whether the connection can be used to receive data. A connection | o Whether the connection can be used to receive data. A connection | |||
cannot be used for reading if the connection was created with the | cannot 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.3. The latter is only supported by | received. See Section 7.3.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. | |||
* For Connections that are Establishing: Transport Properties that | o For Connections that are Established or Closing: Transport | |||
the application specified on the Preconnection, see Section 5.2. | Properties that the application specified on the Preconnection. | |||
See Section 4.2. Selection properties of type "Preference" will | ||||
be exposed as boolean values indicating whether or not the | ||||
property applies to the selected transport. | ||||
* 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 7.1) of | Selection (Section 4.2) and Connection Properties (Section 6.1) of | |||
the actual protocols that were selected and instantiated. | 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. The actually instantiated | offers a certain Selection Property. The actually instantiated | |||
protocol stack might not match all Protocol Selection Properties | protocol stack might not match all Protocol Selection Properties | |||
that the application specified on the Preconnection. For example, | that the application specified on the Preconnection. For example, | |||
a certain Protocol Selection Property that an application | a certain Protocol Selection Property that an application | |||
specified as Preferred might not actually be present in the chosen | specified as Preferred might not actually be present in the chosen | |||
protocol stack because none of the currently available transport | protocol stack because none of the currently available transport | |||
protocols had this feature. | protocols had this feature. | |||
* 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. | |||
7.1. Generic Connection Properties | 6.1. Generic Connection Properties | |||
Generic Connection Properties are defined independent of the chosen | Generic Connection Properties are defined independent of the chosen | |||
protocol stack and therefore available on all Connections. | protocol stack and therefore available on all Connections. | |||
Many Connection Properties have a corresponding Selection Property | Many Connection Properties have a corresponding Selection Property | |||
that enables applications to express their preference for protocols | that enables applications to express their preference for protocols | |||
providing a supporting transport feature. | providing a supporting transport feature. | |||
7.1.1. Required Minimum Corruption Protection Coverage for Receiving | 6.1.1. Required Minimum Corruption Protection Coverage for Receiving | |||
Name: recvChecksumLen | Name: recvChecksumLen | |||
Type: Integer, with special value "Full Coverage" | Type: Integer, with special value "Full Coverage" | |||
Default: Full Coverage | Default: Full Coverage | |||
This property specifies the minimum number of bytes in a received | This property specifies the minimum number of bytes in a received | |||
message that need to be covered by a checksum. A special value of 0 | message that need to be covered by a checksum. A special value of 0 | |||
means that no checksum is permitted. A receiving Endpoint will not | means that no checksum is permitted. A receiving Endpoint will not | |||
forward messages to the application that have less coverage. The | forward messages to the application that have less coverage. The | |||
application is responsible for handling any corruption within the | application is responsible for handling any corruption within the | |||
non-protected part of the message [RFC8085]. | non-protected part of the message [RFC8085]. | |||
7.1.2. Connection Priority | 6.1.2. Connection Priority | |||
Name: connPrio | Name: connPrio | |||
Type: Integer | Type: Integer | |||
Default: 100 | Default: 100 | |||
This Property is a non-negative integer representing the relative | This Property is a non-negative integer representing the relative | |||
inverse priority (i.e., a lower value reflects a higher priority) of | inverse priority (i.e., a lower value reflects a higher priority) of | |||
this Connection relative to other Connections in the same Connection | this Connection relative to other Connections in the same Connection | |||
Group. It has no effect on Connections not part of a Connection | Group. It has no effect on Connections not part of a Connection | |||
Group. As noted in Section 6.4, this property is not entangled when | Group. As noted in Section 5.4, this property is not entangled when | |||
Connections are cloned, i.e., changing the Priority on one Connection | Connections are cloned, i.e., changing the Priority on one Connection | |||
in a Connection Group does not change it on the other Connections in | in a Connection Group does not change it on the other Connections in | |||
the same Connection Group. No guarantees of a specific behavior | the same Connection Group. No guarantees of a specific behavior | |||
regarding Connection Priority are given; a transport system may | regarding Connection Priority are given; a Transport Services system | |||
ignore this property. See Section 8.2.6 for more details. | may ignore this property. See Section 7.2.6 for more details. | |||
7.1.3. Timeout for Aborting Connection | 6.1.3. Timeout for Aborting Connection | |||
Name: connTimeout | Name: connTimeout | |||
Type: Numeric, with special value "Disabled" | Type: Numeric, with special value "Disabled" | |||
Default: Disabled | Default: Disabled | |||
This property specifies how long to wait before deciding that an | This property specifies how long to wait before deciding that an | |||
active Connection has failed when trying to reliably deliver data to | active Connection has failed when trying to reliably deliver data to | |||
the Remote Endpoint. Adjusting this Property will only take effect | the Remote Endpoint. Adjusting this Property will only take effect | |||
when the underlying stack supports reliability. The special value | when the underlying stack supports reliability. The special value | |||
"Disabled" means that this timeout is not scheduled to happen. | "Disabled" means that no timeout is scheduled. | |||
7.1.4. Timeout for keep alive packets | 6.1.4. Timeout for keep alive packets | |||
Name: keepaliveTimeout | Name: keepAliveTimeout | |||
Type: Numeric, with special value "Default" | Type: Numeric, with special value "Disabled" | |||
Default: Default | Default: Implementation-defined | |||
A transport system can request a protocol that supports sending keep | A Transport Services system can request a protocol that supports | |||
alive packets Section 5.2.10. This property specifies the maximum | sending keep alive packets Section 4.2.10. This property specifies | |||
time an idle connection (one for which no transport packets have been | the maximum length of time an idle connection (one for which no | |||
sent) should wait before the Local Endpoint sends a keep-alive packet | transport packets have been sent) should wait before the Local | |||
to the Remote Endpoint. Adjusting this Property will only take | Endpoint sends a keep-alive packet to the Remote Endpoint. Adjusting | |||
effect when the underlying stack supports sending keep-alive packets. | this Property will only take effect when the underlying stack | |||
Guidance on setting this value for datagram transports is provided in | supports sending keep-alive packets. Guidance on setting this value | |||
[RFC8085]. The special value "Default" means that this timeout will | for datagram transports is provided in [RFC8085]. A value greater | |||
use the default for the selected transport. A value greater than the | than the connection timeout (Section 6.1.3), or the special value | |||
connection timeout (Section 7.1.3) will disable the sending of keep- | "Disabled", will disable the sending of keep-alive packets. | |||
alive packets. | ||||
7.1.5. Connection Group Transmission Scheduler | 6.1.5. Connection Group Transmission Scheduler | |||
Name: connScheduler | Name: connScheduler | |||
Type: Enumeration | Type: Enumeration | |||
Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260]) | 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 5.4. The set of | |||
schedulers can be taken from [RFC8260]. | schedulers can be taken from [RFC8260]. | |||
7.1.6. Capacity Profile | 6.1.6. Capacity Profile | |||
Name: connCapacityProfile | Name: connCapacityProfile | |||
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 configure | Default, the Transport Services system SHOULD select paths and | |||
protocols to optimize the tradeoff between delay, delay variation, | configure protocols to optimize the tradeoff between delay, delay | |||
and efficient use of the available capacity based on the capacity | variation, and efficient use of the available capacity based on the | |||
profile specified. How this is realized is implementation-specific. | capacity profile specified. How this is realized is implementation- | |||
The Capacity Profile MAY also be used to set markings on the wire for | specific. The Capacity Profile MAY also be used to set markings on | |||
Protocol Stacks supporting this. Recommendations for use with DSCP | the wire for Protocol Stacks supporting this. Recommendations for | |||
are provided below for each profile; note that when a Connection is | use with DSCP are provided below for each profile; note that when a | |||
multiplexed, the guidelines in Section 6 of [RFC7657] apply. | Connection is multiplexed, the guidelines in Section 6 of [RFC7657] | |||
apply. | ||||
The following values are valid for the Capacity Profile: | The following values are valid for the Capacity Profile: | |||
Default: The application provides no information about its expected | Default: The application provides no information about its expected | |||
capacity profile. Transport system implementations that map the | capacity profile. Transport Services system implementations that | |||
requested capacity profile onto per-connection DSCP signaling | map the requested capacity profile onto per-connection DSCP | |||
SHOULD assign the DSCP Default Forwarding [RFC2474] Per Hop | signaling SHOULD assign the DSCP Default Forwarding [RFC2474] Per | |||
Behaviour (PHB). | Hop Behaviour (PHB). | |||
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 Services system implementations that map the requested | |||
profile onto per-connection DSCP signaling SHOULD assign the DSCP | capacity profile onto per-connection DSCP signaling SHOULD assign | |||
Less than Best Effort [RFC8622] PHB. | the DSCP Less than Best Effort [RFC8622] PHB. | |||
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 delay variation and efficient use of the available capacity | of delay variation and efficient use of the available capacity | |||
when sending on this connection. This can be used by the system | when sending on this connection. This can be used by the system | |||
to disable the coalescing of multiple small Messages into larger | to disable the coalescing of multiple small Messages into larger | |||
packets (Nagle's algorithm); to prefer immediate acknowledgment | packets (Nagle's algorithm); to prefer immediate acknowledgment | |||
from the peer endpoint when supported by the underlying transport; | from the peer endpoint when supported by the underlying transport; | |||
and so on. Transport system implementations that map the | and so on. Transport Services 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 | |||
(AF41,AF42,AF43,AF44) [RFC2597] PHB. Inelastic traffic that is | (AF41,AF42,AF43,AF44) [RFC2597] PHB. Inelastic traffic that is | |||
expected to conform to the configured network service rate could | expected to conform to the configured network service rate could | |||
be mapped to the DSCP Expedited Forwarding [RFC3246] or [RFC5865] | be mapped to the DSCP Expedited Forwarding [RFC3246] or [RFC5865] | |||
PHBs. | PHBs. | |||
Low Latency/Non-Interactive: The application prefers loss to | Low Latency/Non-Interactive: The application prefers loss to | |||
latency, but is not interactive. Response time should be | latency, but is not interactive. Response time should be | |||
optimized at the expense of delay variation and efficient use of | optimized at the expense of delay variation and efficient use of | |||
skipping to change at page 43, line 19 ¶ | skipping to change at page 42, line 32 ¶ | |||
might fail if the desired rate cannot be maintained across the | might fail if the desired rate cannot be maintained across the | |||
Path. A transport can interpret this capacity profile as | Path. A transport can interpret this capacity profile as | |||
preferring a circuit breaker [RFC8084] to a rate-adaptive | preferring a circuit breaker [RFC8084] to a rate-adaptive | |||
congestion controller. Transport system implementations that map | congestion controller. Transport system implementations that map | |||
the requested capacity profile onto per-connection DSCP signaling | the requested capacity profile onto per-connection DSCP signaling | |||
without multiplexing SHOULD assign a DSCP Assured Forwarding | without multiplexing SHOULD assign a DSCP Assured Forwarding | |||
(AF31,AF32,AF33,AF34) [RFC2597] PHB. | (AF31,AF32,AF33,AF34) [RFC2597] PHB. | |||
Capacity-Seeking: The application expects to send/receive data at | Capacity-Seeking: The application expects to send/receive data at | |||
the maximum rate allowed by its congestion controller over a | the maximum rate allowed by its congestion controller over a | |||
relatively long period of time. Transport system implementations | relatively long period of time. Transport Services system | |||
that map the requested capacity profile onto per-connection DSCP | implementations that map the requested capacity profile onto per- | |||
signaling without multiplexing SHOULD assign a DSCP Assured | connection DSCP signaling without multiplexing SHOULD assign a | |||
Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per Section 4.8 of | DSCP Assured Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per | |||
[RFC4594]. | Section 4.8 of [RFC4594]. | |||
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 8.1.3.8. | see Section 7.1.3.8. | |||
7.1.7. Policy for using Multi-Path Transports | 6.1.7. Policy for using Multi-Path Transports | |||
Name: multipath-policy | Name: multipath-policy | |||
Type: Enumeration | Type: Enumeration | |||
Default: Handover | Default: Handover | |||
This property specifies the local policy for transferring data across | This property specifies the local policy for transferring data across | |||
multiple paths between the same end hosts if Parallel Use of Multiple | multiple paths between the same end hosts if Parallel Use of Multiple | |||
Paths is not set to Disabled (see Section 5.2.14). Possible values | Paths is not set to Disabled (see Section 4.2.14). Possible values | |||
are: | are: | |||
Handover: The connection ought only to attempt to migrate between | Handover: The connection ought only to attempt to migrate between | |||
different paths when the original path is lost or becomes | different paths when the original path is lost or becomes | |||
unusable. The thresholds used to declare a path unusable are | unusable. The thresholds used to declare a path unusable are | |||
implementation specific. | implementation specific. | |||
Interactive: The connection ought only to attempt to minimize the | Interactive: The connection ought only to attempt to minimize the | |||
latency for interactive traffic patterns by transmitting data | latency for interactive traffic patterns by transmitting data | |||
across multiple paths when this is beneficial. The goal of | across multiple paths when this is beneficial. The goal of | |||
skipping to change at page 44, line 16 ¶ | skipping to change at page 43, line 30 ¶ | |||
scheduling algorithm is implementation-specific. | scheduling algorithm is implementation-specific. | |||
Aggregate: The connection ought to attempt to use multiple paths in | Aggregate: The connection ought to attempt to use multiple paths in | |||
parallel to maximize available capacity and possibly overcome the | parallel to maximize available capacity and possibly overcome the | |||
capacity limitations of the individual paths. The actual strategy | capacity limitations of the individual paths. The actual strategy | |||
is implementation specific. | is implementation specific. | |||
Note that this is a local choice - the Remote Endpoint can choose a | Note that this is a local choice - the Remote Endpoint can choose a | |||
different policy. | different policy. | |||
7.1.8. Bounds on Send or Receive Rate | 6.1.8. Bounds on Send or Receive Rate | |||
Name: minSendRate / minRecvRate / maxSendRate / maxRecvRate | Name: minSendRate / minRecvRate / maxSendRate / maxRecvRate | |||
Type: Numeric (with special value "Unlimited") / Numeric (with | Type: Numeric (with special value "Unlimited") / Numeric (with | |||
special value "Unlimited") / Numeric (with special value | special value "Unlimited") / Numeric (with special value | |||
"Unlimited") / Numeric (with special value "Unlimited") | "Unlimited") / Numeric (with special value "Unlimited") | |||
Default: Unlimited / Unlimited / Unlimited / Unlimited | Default: Unlimited / Unlimited / Unlimited / Unlimited | |||
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 it will be useful. These are specified in bits per | does not deem it will be useful. These are specified in bits per | |||
second. The special value "Unlimited" indicates that no bound is | second. The special value "Unlimited" indicates that no bound is | |||
specified. | specified. | |||
7.1.9. Group Connection Limit | 6.1.9. Group Connection Limit | |||
Name: groupConnLimit | Name: groupConnLimit | |||
Type: Numeric (with special value "Unlimited") | Type: Numeric (with special value "Unlimited") | |||
Default: Unlimited | Default: Unlimited | |||
This property controls the number of Connections that can be accepted | This property controls the number of Connections that can be accepted | |||
from a peer as new members of the Connection's group. Similar to | from a peer as new members of the Connection's group. Similar to | |||
SetNewConnectionLimit(), this limits the number of ConnectionReceived | SetNewConnectionLimit(), this limits the number of ConnectionReceived | |||
Events that will occur, but constrained to the group of the | Events that will occur, but constrained to the group of the | |||
Connection associated with this property. For a multi-streaming | Connection associated with this property. For a multi-streaming | |||
transport, this limits the number of allowed streams. | transport, this limits the number of allowed streams. | |||
7.1.10. Read-only Connection Properties | 6.1.10. Isolate Session | |||
Name: isolateSession | ||||
Type: Boolean | ||||
Default: false | ||||
When set to true, this property will initiate new Connections using | ||||
as little cached information (such as session tickets or cookies) as | ||||
possible from previous connections that are not entangled with it. | ||||
Any state generated by this Connection will only be shared with | ||||
entangled connections. Cloned Connections will use saved state from | ||||
within the Connection Group. | ||||
Note that this does not guarantee no leakage of information, as | ||||
implementations may not be able to fully isolate all caches (e.g. | ||||
RTT estimates). Note that this property may degrade connection | ||||
performance. | ||||
6.1.11. Read-only Connection Properties | ||||
The following generic Connection Properties are read-only, i.e. they | The following generic Connection Properties are read-only, i.e. they | |||
cannot be changed by an application. | cannot be changed by an application. | |||
7.1.10.1. Maximum Message Size Concurrent with Connection Establishment | 6.1.11.1. Maximum Message Size Concurrent with Connection Establishment | |||
Name: zeroRttMsgMaxLen | Name: zeroRttMsgMaxLen | |||
Type: Integer | Type: Integer | |||
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 8.1.3.4. | before or during Connection establishment, see also Section 7.1.3.4. | |||
It is given in Bytes. | It is given in Bytes. | |||
7.1.10.2. Maximum Message Size Before Fragmentation or Segmentation | 6.1.11.2. Maximum Message Size Before Fragmentation or Segmentation | |||
Name: singularTransmissionMsgMaxLen | Name: singularTransmissionMsgMaxLen | |||
Type: Integer | Type: Integer | |||
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. It exposes the Maximum | transport layer segmentation at the sender. It exposes the Maximum | |||
Packet Size (MPS) as described in Datagram PLPMTUD | Packet Size (MPS) as described in Datagram PLPMTUD | |||
[I-D.ietf-tsvwg-datagram-plpmtud]. | [I-D.ietf-tsvwg-datagram-plpmtud]. | |||
7.1.10.3. Maximum Message Size on Send | 6.1.11.3. Maximum Message Size on Send | |||
Name: sendMsgMaxLen | Name: sendMsgMaxLen | |||
Type: Integer | Type: Integer | |||
This property represents the maximum Message size that an application | This property represents the maximum Message size that an application | |||
can send. | can send. | |||
7.1.10.4. Maximum Message Size on Receive | 6.1.11.4. Maximum Message Size on Receive | |||
Name: recvMsgMaxLen | Name: recvMsgMaxLen | |||
Type: Integer | Type: Integer | |||
This numeric property represents the maximum Message size that an | This numeric property represents the maximum Message size that an | |||
application can receive. | application can receive. | |||
7.2. TCP-specific Properties: User Timeout Option (UTO) | 6.2. TCP-specific Properties: User Timeout Option (UTO) | |||
These properties specify configurations for the User Timeout Option | These properties specify configurations for the User Timeout Option | |||
(UTO), in the case that TCP becomes the chosen transport protocol. | (UTO), in the case that TCP becomes the chosen transport protocol. | |||
Implementation is optional and useful only if TCP is implemented in | Implementation is optional and useful only if TCP is implemented in | |||
the transport system. | the Transport Services system. | |||
These TCP-specific properties are included here because the feature | These TCP-specific properties are included here because the feature | |||
"Suggest timeout to the peer" is part of the minimal set of transport | "Suggest timeout to the peer" is part of the minimal set of transport | |||
services [RFC8923], where this feature was categorized as | services [RFC8923], where this feature was categorized as | |||
"functional". This means that when an implementation offers this | "functional". This means that when an implementation offers this | |||
feature, it has to expose an interface to it to the application. | feature, it has to expose an interface to it to the application. | |||
Otherwise, the implementation might violate assumptions by the | Otherwise, the implementation might violate assumptions by the | |||
application, which could cause the application to fail. | application, which could cause the application to fail. | |||
All of the below properties are optional (e.g., it is possible to | All of the below properties are optional (e.g., it is possible to | |||
skipping to change at page 46, line 16 ¶ | skipping to change at page 46, line 4 ¶ | |||
"Suggest timeout to the peer" is part of the minimal set of transport | "Suggest timeout to the peer" is part of the minimal set of transport | |||
services [RFC8923], where this feature was categorized as | services [RFC8923], where this feature was categorized as | |||
"functional". This means that when an implementation offers this | "functional". This means that when an implementation offers this | |||
feature, it has to expose an interface to it to the application. | feature, it has to expose an interface to it to the application. | |||
Otherwise, the implementation might violate assumptions by the | Otherwise, the implementation might violate assumptions by the | |||
application, which could cause the application to fail. | application, which could cause the application to fail. | |||
All of the below properties are optional (e.g., it is possible to | All of the below properties 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). | |||
These properties reflect the API extension specified in Section 3 of | These properties reflect the API extension specified in Section 3 of | |||
[RFC5482]. | [RFC5482]. | |||
7.2.1. Advertised User Timeout | 6.2.1. Advertised User Timeout | |||
Name: tcp.userTimeoutValue | Name: tcp.userTimeoutValue | |||
Type: Integer | Type: Integer | |||
Default: the TCP default | Default: the TCP default | |||
This time value is advertised via the TCP User Timeout Option (UTO) | This time value is advertised via the TCP User Timeout Option (UTO) | |||
[RFC5482] at the Remote Endpoint to adapt its own "Timeout for | [RFC5482] at the Remote Endpoint to adapt its own "Timeout for | |||
aborting Connection" (see Section 7.1.3) value. | aborting Connection" (see Section 6.1.3) value. | |||
7.2.2. User Timeout Enabled | 6.2.2. User Timeout Enabled | |||
Name: tcp.userTimeout | Name: tcp.userTimeout | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property controls whether the UTO option is enabled for a | This property controls whether the UTO option is enabled for a | |||
connection. This applies to both sending and receiving. | connection. This applies to both sending and receiving. | |||
7.2.3. Timeout Changeable | 6.2.3. Timeout Changeable | |||
Name: tcp.userTimeoutRecv | Name: tcp.userTimeoutRecv | |||
Type: Boolean | Type: Boolean | |||
Default: true | Default: true | |||
This property controls whether the "Timeout for aborting Connection" | This property controls whether the "Timeout for aborting Connection" | |||
(see Section 7.1.3) may be changed based on a UTO option received | (see Section 6.1.3) may be changed based on a UTO option received | |||
from the remote peer. This boolean becomes false when "Timeout for | from the remote peer. This boolean becomes false when "Timeout for | |||
aborting Connection" (see Section 7.1.3) is used. | aborting Connection" (see Section 6.1.3) is used. | |||
7.3. Connection Lifecycle Events | 6.3. Connection Lifecycle Events | |||
During the lifetime of a connection there are events that can occur | During the lifetime of a connection there are events that can occur | |||
when configured. | when configured. | |||
7.3.1. Soft Errors | 6.3.1. 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 and contents of | This event informs the application about the receipt and contents of | |||
an ICMP error message related to the Connection. This will only | an ICMP error message related to the Connection. This will only | |||
happen if the underlying protocol stack supports access to soft | happen if the underlying protocol stack supports access to soft | |||
errors; however, even if the underlying stack supports it, there is | errors; however, even if the underlying stack supports it, there is | |||
no guarantee that a soft error will be signaled. | no guarantee that a soft error will be signaled. | |||
Connection -> SoftError<> | Connection -> SoftError<> | |||
7.3.2. Path change | 6.3.2. Path change | |||
This event notifies the application when at least one of the paths | This event notifies the application when at least one of the paths | |||
underlying a Connection has changed. Changes occur on a single path | underlying a Connection has changed. Changes occur on a single path | |||
when the PMTU changes as well as when multiple paths are used and | when the PMTU changes as well as when multiple paths are used and | |||
paths are added or removed, or a handover has been performed. | paths are added or removed, or a handover has been performed. | |||
Connection -> PathChange<> | Connection -> PathChange<> | |||
8. Data Transfer | 7. Data Transfer | |||
Data is sent and received as Messages, which allows the application | Data is sent and received as Messages, which allows the application | |||
to communicate the boundaries of the data being transferred. | to communicate the boundaries of the data being transferred. | |||
8.1. Messages and Framers | 7.1. Messages and Framers | |||
Each Message has an optional Message Context, which allows to add | Each Message has an optional Message Context, which allows to add | |||
Message Properties, identify Send Events related to a specific | Message Properties, identify Send Events related to a specific | |||
Message or to inspect meta-data related to the Message sent. Framers | Message or to inspect meta-data related to the Message sent. Framers | |||
can be used to extend or modify the message data with additional | can be used to extend or modify the message data with additional | |||
information that can be processed at the receiver to detect message | information that can be processed at the receiver to detect message | |||
boundaries. | boundaries. | |||
8.1.1. Message Contexts | 7.1.1. Message Contexts | |||
Using the MessageContext object, the application can set and retrieve | Using the MessageContext object, the application can set and retrieve | |||
meta-data of the message, including Message Properties (see | meta-data of the message, including Message Properties (see | |||
Section 8.1.3) and framing meta-data (see Section 8.1.2.2). | Section 7.1.3) and framing meta-data (see Section 7.1.2.2). | |||
Therefore, a MessageContext object can be passed to the Send action | Therefore, a MessageContext object can be passed to the Send action | |||
and is returned by each Send and Receive related event. | and is returned by each Send and Receive related event. | |||
Message Properties can be set and queried using the Message Context: | Message Properties can be set and queried using the Message Context: | |||
MessageContext.add(scope?, parameter, value) | MessageContext.add(scope?, parameter, value) | |||
PropertyValue := MessageContext.get(scope?, property) | PropertyValue := MessageContext.get(scope?, property) | |||
To get or set Message Properties, the optional scope parameter is | To get or set Message Properties, the optional scope parameter is | |||
left empty. To get or set meta-data for a Framer, the application | left empty. To get or set meta-data for a Framer, the application | |||
has to pass a reference to this Framer as the scope parameter. | has to pass a reference to this Framer as the scope parameter. | |||
For MessageContexts returned by send Events (see Section 8.2.2) and | For MessageContexts returned by send Events (see Section 7.2.2) and | |||
receive Events (see Section 8.3.2), the application can query | receive Events (see Section 7.3.2), the application can query | |||
information about the local and Remote Endpoint: | information about the local and Remote Endpoint: | |||
RemoteEndpoint := MessageContext.GetRemoteEndpoint() | RemoteEndpoint := MessageContext.GetRemoteEndpoint() | |||
LocalEndpoint := MessageContext.GetLocalEndpoint() | LocalEndpoint := MessageContext.GetLocalEndpoint() | |||
8.1.2. Message Framers | 7.1.2. Message Framers | |||
Although most applications communicate over a network using well- | Although most applications communicate over a network using well- | |||
formed Messages, the boundaries and metadata of the Messages are | formed Messages, the boundaries and metadata of the Messages are | |||
often not directly communicated by the transport protocol itself. | often not directly communicated by the transport protocol itself. | |||
For example, HTTP applications send and receive HTTP messages over a | For example, HTTP applications send and receive HTTP messages over a | |||
byte-stream transport, requiring that the boundaries of HTTP messages | byte-stream transport, requiring that the boundaries of HTTP messages | |||
be parsed from the stream of bytes. | be parsed from the stream of bytes. | |||
Message Framers allow extending a Connection's Protocol Stack to | Message Framers allow extending a Connection's Protocol Stack to | |||
define how to encapsulate or encode outbound Messages, and how to | define how to encapsulate or encode outbound Messages, and how to | |||
skipping to change at page 49, line 44 ¶ | skipping to change at page 49, line 41 ¶ | |||
a protocol that otherwise does not preserve message boundaries, they | a protocol that otherwise does not preserve message boundaries, they | |||
can also be used with datagram- or message-based protocols. In these | can also be used with datagram- or message-based protocols. In these | |||
cases, they add an additional transformation to further encode or | cases, they add an additional transformation to further encode or | |||
encapsulate, and can potentially support packing multiple | encapsulate, and can potentially support packing multiple | |||
application-layer Messages into individual transport datagrams. | application-layer Messages into individual transport datagrams. | |||
The API to implement a Message Framer can vary depending on the | The API to implement a Message Framer can vary depending on the | |||
implementation; guidance on implementing Message Framers can be found | implementation; guidance on implementing Message Framers can be found | |||
in [I-D.ietf-taps-impl]. | in [I-D.ietf-taps-impl]. | |||
8.1.2.1. Adding Message Framers to Connections | 7.1.2.1. Adding Message Framers to Connections | |||
The Message Framer object can be added to one or more Preconnections | The Message Framer object can be added to one or more Preconnections | |||
to run on top of transport protocols. Multiple Framers may be added | to run on top of transport protocols. Multiple Framers may be added | |||
to a preconnection; in this case, the Framers operate as a framing | to a Preconnection; in this case, the Framers operate as a framing | |||
stack, i.e. the last one added runs first when framing outbound | stack, i.e. the last one added runs first when framing outbound | |||
messages, and last when parsing inbound data. | messages, and last when parsing inbound data. | |||
The following example adds a basic HTTP Message Framer to a | The following example adds a basic HTTP Message Framer to a | |||
Preconnection: | Preconnection: | |||
framer := NewHTTPMessageFramer() | framer := NewHTTPMessageFramer() | |||
Preconnection.AddFramer(framer) | Preconnection.AddFramer(framer) | |||
Since Message Framers pass from Preconnection to Listener or | Since Message Framers pass from Preconnection to Listener or | |||
Connection, addition of Framers must happen before any operation that | Connection, addition of Framers must happen before any operation that | |||
may result in the creation of a Connection. | may result in the creation of a Connection. | |||
8.1.2.2. Framing Meta-Data | 7.1.2.2. Framing Meta-Data | |||
When sending Messages, applications can add Framer-specific key/value | When sending Messages, applications can add Framer-specific key/value | |||
pairs to a MessageContext (Section 8.1.1). This mechanism can be | pairs to a MessageContext (Section 7.1.1). This mechanism can be | |||
used, for example, to set the type of a Message for a TLV format. | 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. | The namespace of values is custom for each unique Message Framer. | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(framer, key, value) | messageContext.add(framer, key, value) | |||
Connection.Send(messageData, messageContext) | Connection.Send(messageData, messageContext) | |||
When an application receives a MessageContext in a Receive event, it | 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. | can also look to see if a value was set by a specific Message Framer. | |||
messageContext.get(framer, key) -> value | messageContext.get(framer, key) -> value | |||
For example, if an HTTP Message Framer is used, the values could | For example, if an HTTP Message Framer is used, the values could | |||
correspond to HTTP headers: | correspond to HTTP headers: | |||
httpFramer := NewHTTPMessageFramer() | httpFramer := NewHTTPMessageFramer() | |||
... | ... | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(httpFramer, "accept", "text/html") | messageContext.add(httpFramer, "accept", "text/html") | |||
8.1.3. Message Properties | 7.1.3. Message Properties | |||
Applications needing to annotate the Messages they send with extra | Applications needing to annotate the Messages they send with extra | |||
information (for example, to control how data is scheduled and | information (for example, to control how data is scheduled and | |||
processed by the transport protocols supporting the Connection) can | processed by the transport protocols supporting the Connection) can | |||
include this information in the Message Context passed to the Send | include this information in the Message Context passed to the Send | |||
Action. For other uses of the message context, see Section 8.1.1. | Action. For other uses of the message context, see Section 7.1.1. | |||
Message Properties are per-Message, not per-Send if partial Messages | Message Properties are per-Message, not per-Send if partial Messages | |||
are sent (Section 8.2.3). All data blocks associated with a single | are sent (Section 7.2.3). All data blocks associated with a single | |||
Message share properties specified in the Message Contexts. For | Message share properties specified in the Message Contexts. For | |||
example, it would not make sense to have the beginning of a Message | 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. | expire, but allow the end of a Message to still be sent. | |||
A MessageContext object contains metadata for the Messages to be sent | A MessageContext object contains metadata for the Messages to be sent | |||
or received. | or received. | |||
messageData := "hello" | messageData := "hello" | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
skipping to change at page 51, line 48 ¶ | skipping to change at page 51, line 45 ¶ | |||
example, if "Reliable Data Transfer (Connection)" is set to "Require" | example, if "Reliable Data Transfer (Connection)" is set to "Require" | |||
and a protocol with configurable per-Message reliability is used, | and a protocol with configurable per-Message reliability is used, | |||
setting "Reliable Data Transfer (Message)" to "false" for a | setting "Reliable Data Transfer (Message)" to "false" for a | |||
particular Message will allow this Message to be unreliably | particular Message will allow this Message to be unreliably | |||
delivered. Changing the Reliable Data Transfer property on Messages | delivered. Changing the Reliable Data Transfer property on Messages | |||
is only possible for Connections that were established enabling the | is only possible for Connections that were established enabling the | |||
Selection Property "Configure Per-Message Reliability". | Selection Property "Configure Per-Message Reliability". | |||
The following Message Properties are supported: | The following Message Properties are supported: | |||
8.1.3.1. Lifetime | 7.1.3.1. Lifetime | |||
Name: msgLifetime | Name: msgLifetime | |||
Type: Numeric | Type: Numeric | |||
Default: infinite | ||||
Default: infinite | ||||
The Lifetime specifies how long a particular Message can wait to be | The Lifetime specifies how long a particular Message can wait to be | |||
sent to the Remote Endpoint before it is irrelevant and no longer | sent to the Remote Endpoint before it is irrelevant and no longer | |||
needs to be (re-)transmitted. This is a hint to the transport system | needs to be (re-)transmitted. This is a hint to the Transport | |||
- it is not guaranteed that a Message will not be sent when its | Services system - it is not guaranteed that a Message will not be | |||
Lifetime has expired. | sent when its Lifetime has 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 8.1.3.7). | "Reliable Data Transfer (Message)" property (see Section 7.1.3.7). | |||
The type and units of Lifetime are implementation-specific. | The type and units of Lifetime are implementation-specific. | |||
8.1.3.2. Priority | 7.1.3.2. Priority | |||
Name: msgPrio | Name: msgPrio | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
Default: 100 | 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 7.1.2. The Priority properties may | connection Priority - see Section 6.1.2. The Priority properties may | |||
interact, but can be used independently and be realized by different | interact, but can be used independently and be realized by different | |||
mechanisms; see Section 8.2.6. | mechanisms; see Section 7.2.6. | |||
8.1.3.3. Ordered | 7.1.3.3. Ordered | |||
Name: msgOrdered | Name: msgOrdered | |||
Type: Boolean | Type: Boolean | |||
Default: the queried Boolean value of the Selection Property | Default: the queried Boolean value of the Selection Property | |||
"reliability" (Section 5.2.1) | "reliability" (Section 4.2.1) | |||
The order in which Messages were submitted for transmission via the | The order in which Messages were submitted for transmission via the | |||
Send Action will be preserved on delivery via Receive<> events for | Send Action will be preserved on delivery via Receive<> events for | |||
all Messages on a Connection that have this Message Property set to | all Messages on a Connection that have this Message Property set to | |||
true. | true. | |||
If false, the Message is delivered to the receiving application | If false, the Message is delivered to the receiving application | |||
without preserving the ordering. This property is used for protocols | without preserving the ordering. This property is used for protocols | |||
that support preservation of data ordering, see Section 5.2.4, but | that support preservation of data ordering, see Section 4.2.4, but | |||
allow out-of-order delivery for certain messages, e.g., by | allow out-of-order delivery for certain messages, e.g., by | |||
multiplexing independent messages onto different streams. | multiplexing independent messages onto different streams. | |||
8.1.3.4. Safely Replayable | 7.1.3.4. Safely Replayable | |||
Name: safelyReplayable | Name: safelyReplayable | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
If true, Safely Replayable specifies that a Message is safe to send | If true, Safely Replayable specifies that a Message is safe to send | |||
to the Remote Endpoint more than once for a single Send Action. It | to the Remote Endpoint more than once for a single Send Action. It | |||
marks the data as safe for certain 0-RTT establishment techniques, | marks the data as safe for certain 0-RTT establishment techniques, | |||
where retransmission of the 0-RTT data may cause the remote | where retransmission of the 0-RTT data may cause the remote | |||
application to receive the Message multiple times. | application to receive the Message multiple times. | |||
For protocols that do not protect against duplicated messages, e.g., | For protocols that do not protect against duplicated messages, e.g., | |||
UDP, all messages need to be marked as "Safely Replayable". To | UDP, all messages need to be marked as "Safely Replayable". To | |||
enable protocol selection to choose such a protocol, "Safely | enable protocol selection to choose such a protocol, "Safely | |||
Replayable" needs to be added to the TransportProperties passed to | Replayable" needs to be added to the TransportProperties passed to | |||
the Preconnection. If such a protocol was chosen, disabling "Safely | the Preconnection. If such a protocol was chosen, disabling "Safely | |||
Replayable" on individual messages MUST result in a SendError. | Replayable" on individual messages MUST result in a SendError. | |||
8.1.3.5. Final | 7.1.3.5. Final | |||
Name: final | Name: final | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
If true, this indicates a Message is the last that the application | If true, this indicates a Message is the last that the application | |||
will send on a Connection. This allows underlying protocols to | will send on a Connection. This allows underlying protocols to | |||
indicate to the Remote Endpoint that the Connection has been | indicate to the Remote Endpoint that the Connection has been | |||
skipping to change at page 54, line 12 ¶ | skipping to change at page 54, line 12 ¶ | |||
do not support signalling the end of a Connection in a given | do not support signalling the end of a Connection in a given | |||
direction will ignore this property. | direction will ignore this property. | |||
A Final Message must always be sorted to the end of a list of | A Final Message must always be sorted to the end of a list of | |||
Messages. The Final property overrides Priority and any other | 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. | |||
8.1.3.6. Sending Corruption Protection Length | 7.1.3.6. Sending Corruption Protection Length | |||
Name: msgChecksumLen | Name: msgChecksumLen | |||
Type: Integer (non-negative with special value "Full Coverage") | Type: Integer (non-negative with special value "Full Coverage") | |||
Default: Full Coverage | Default: Full Coverage | |||
This property specifies the minimum length of the section of a sent | This property specifies the minimum length of the section of a sent | |||
Message, starting from byte 0, that the application requires to be | Message, starting from byte 0, that the application requires to be | |||
delivered without corruption due to lower layer errors. It is used | delivered without corruption due to lower layer errors. It is used | |||
to specify options for simple integrity protection via checksums. A | to specify options for simple integrity protection via checksums. A | |||
value of 0 means that no checksum is required, and "Full Coverage" | value of 0 means that no checksum is required, and "Full Coverage" | |||
means that the entire Message needs to be protected by a checksum. | means that the entire Message needs to be protected by a checksum. | |||
Only "Full Coverage" is guaranteed, any other requests are advisory, | Only "Full Coverage" is guaranteed, any other requests are advisory, | |||
which may result in "Full Coverage" being applied. | which may result in "Full Coverage" being applied. | |||
8.1.3.7. Reliable Data Transfer (Message) | 7.1.3.7. Reliable Data Transfer (Message) | |||
Name: msgReliable | Name: msgReliable | |||
Type: Boolean | Type: Boolean | |||
Default: the queried Boolean value of the Selection Property | Default: the queried Boolean value of the Selection Property | |||
"reliability" (Section 5.2.1) | "reliability" (Section 4.2.1) | |||
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 enabling the Selection Property "Configure Per- | were established enabling the Selection Property "Configure Per- | |||
Message Reliability". When this is not the case, changing | Message Reliability". When this is not the case, changing | |||
"msgReliable" will generate an error. | "msgReliable" will generate an error. | |||
Disabling this property indicates that the transport system may | Disabling this property indicates that the Transport Services system | |||
disable retransmissions or other reliability mechanisms for this | may disable retransmissions or other reliability mechanisms for this | |||
particular Message, but such disabling is not guaranteed. | particular Message, but such disabling is not guaranteed. | |||
8.1.3.8. Message Capacity Profile Override | 7.1.3.8. Message Capacity Profile Override | |||
Name: msgCapacityProfile | Name: msgCapacityProfile | |||
Type: Enumeration | Type: Enumeration | |||
Default: inherited from the Connection Property | Default: inherited from the Connection Property | |||
"connCapacityProfile" (Section 7.1.6) | "connCapacityProfile" (Section 6.1.6) | |||
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 connection property (see Section 7.1.6). | the Capacity Profile connection property (see Section 6.1.6). | |||
8.1.3.9. No Network-Layer Fragmentation | 7.1.3.9. No Network-Layer Fragmentation | |||
Name: noFragmentation | Name: noFragmentation | |||
Type: Boolean | Type: Boolean | |||
Default: false | 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 network-layer fragmentation, if possible. | a single packet without network-layer fragmentation, if possible. | |||
This only takes effect when the transport uses a network layer that | This only takes effect when the transport uses a network layer that | |||
supports this functionality. When it does take effect, setting this | supports this functionality. When it does take effect, setting this | |||
property to true will cause the Don't Fragment bit to be set in the | property to true will cause the Don't Fragment bit to be set in the | |||
IP header, and attempts to send a message with this property set to a | IP header, and attempts to send a message with this property set to a | |||
size greater than the transport's current estimate of its maximum | size greater than the transport's current estimate of its maximum | |||
packet size ("singularTransmissionMsgMaxLen") will result in a | packet size ("singularTransmissionMsgMaxLen") will result in a | |||
"SendError". | "SendError". | |||
8.1.3.10. No Segmentation | 7.1.3.10. No Segmentation | |||
Name: noTransportFragmentation | Name: noTransportFragmentation | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
When set to true, this property requests the network layer at the | When set to true, this property requests the network layer at the | |||
sending endpoint to not fragment the packets generated by the | sending endpoint to not fragment the packets generated by the | |||
transport layer. When running over IPv4, setting this property to | transport layer. When running over IPv4, setting this property to | |||
true will also cause the Don't Fragment bit to be set in the IP | true will also cause the Don't Fragment bit to be set in the IP | |||
header. When this property is set, an attempt to send a message size | header. When this property is set, an attempt to send a message size | |||
greater than the transport's current estimate of its maximum packet | greater than the transport's current estimate of its maximum packet | |||
size (singularTransmissionMsgMaxLen) will result in a SendError. | size (singularTransmissionMsgMaxLen) will result in a SendError. | |||
This only takes effect when the transport and network layer support | This only takes effect when the transport and network layer support | |||
this functionality. | this functionality. | |||
8.2. Sending Data | 7.2. 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 | |||
Messages. By default, Send enqueues a complete Message, and takes | Messages. By default, Send enqueues a complete Message, and takes | |||
optional per-Message properties (see Section 8.2.1). All Send | optional per-Message properties (see Section 7.2.1). All Send | |||
actions are asynchronous, and deliver Events (see Section 8.2.2). | actions are asynchronous, and deliver Events (see Section 7.2.2). | |||
Sending partial Messages for streaming large data is also supported | Sending partial Messages for streaming large data is also supported | |||
(see Section 8.2.3). | (see Section 7.2.3). | |||
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?) | Connection.Send(messageData, messageContext?, endOfMessage?) | |||
where messageData is the data object to send, and messageContext | where messageData is the data object to send, and messageContext | |||
allows adding Message Properties, identifying Send Events related to | allows adding Message Properties, identifying Send Events related to | |||
a specific Message or inspecting meta-data related to the Message | a specific Message or inspecting meta-data related to the Message | |||
sent (see Section 8.1.1). | sent (see Section 7.1.1). | |||
The optional endOfMessage parameter supports partial sending and is | The optional endOfMessage parameter supports partial sending and is | |||
described in Section 8.2.3. | described in Section 7.2.3. | |||
8.2.1. Basic Sending | 7.2.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. | Properties. | |||
messageData := "hello" | messageData := "hello" | |||
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 Connection Property "Maximum Message size on send" | query the Connection Property "Maximum Message size on send" | |||
(Section 7.1.10.3) to determine the maximum size allowed for a single | (Section 6.1.11.3) to determine the maximum size allowed for a single | |||
Message. If a Message is too large to fit in the Maximum Message | Message. If a Message is too large to fit in the Maximum Message | |||
Size for the Connection, the Send will fail with a SendError event | Size for the Connection, the Send will fail with a SendError event | |||
(Section 8.2.2.3). For example, it is invalid to send a Message over | (Section 7.2.2.3). For example, it is invalid to send a Message over | |||
a UDP connection that is larger than the available datagram sending | a UDP connection that is larger than the available datagram sending | |||
size. | size. | |||
8.2.2. Send Events | 7.2.2. 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. Exactly one Event (Sent, Expired, or SendError) will be | a Message. Exactly one Event (Sent, Expired, or SendError) will be | |||
delivered in response to each call to Send. | delivered in response to each call to Send. | |||
Note that if partial Sends are used (Section 8.2.3), there will still | Note that if partial Sends are used (Section 7.2.3), 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. | |||
The interface should allow the application to correlate which Send | The interface should allow the application to correlate which Send | |||
Action resulted in a particular Send Event. The manner in which this | Action resulted in a particular Send Event. The manner in which this | |||
correlation is indicated is implementation-specific. | correlation is indicated is implementation-specific. | |||
8.2.2.1. Sent | 7.2.2.1. Sent | |||
Connection -> Sent<messageContext> | 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 this interface. The exact disposition of the | responsibility of this interface. The exact disposition of the | |||
Message (i.e., whether it has actually been transmitted, moved into a | Message (i.e., whether it has actually been transmitted, moved into a | |||
buffer on the network interface, moved into a kernel buffer, and so | buffer on the network interface, moved into a kernel buffer, and so | |||
on) when the Sent Event occurs is implementation-specific. The Sent | on) when the Sent Event occurs is implementation-specific. The Sent | |||
Event contains a reference to the Message to which it applies. | Event contains a reference to the Message to 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 Services system than an | |||
that always waits for the Sent Event before calling the next Send | application that always waits for the Sent Event before calling the | |||
Action. | next Send Action. | |||
8.2.2.2. Expired | 7.2.2.2. Expired | |||
Connection -> Expired<messageContext> | 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 8.1.3.1) expired. This is separate from SendError, as | (see Section 7.1.3.1) expired. This is separate from SendError, as | |||
it is an expected behavior for partially reliable transports. The | it is an expected behavior for partially reliable transports. The | |||
Expired Event contains a reference to the Message to which it | Expired Event contains a reference to the Message to which it | |||
applies. | applies. | |||
8.2.2.3. SendError | 7.2.2.3. SendError | |||
Connection -> SendError<messageContext, reason?> | Connection -> SendError<messageContext, reason?> | |||
A SendError occurs when a Message was not sent due to an error | A SendError occurs when a Message was not 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 a | the Connection's transport properties. The SendError contains a | |||
reference to the Message to which it applies. | reference to the Message to which it applies. | |||
8.2.3. Partial Sends | 7.2.3. 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. | |||
skipping to change at page 58, line 45 ¶ | skipping to change at page 58, line 45 ¶ | |||
Connection.Send(messageData, messageContext, endOfMessage) | Connection.Send(messageData, messageContext, endOfMessage) | |||
messageData := "lo" | messageData := "lo" | |||
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. | until the endOfMessage is marked. | |||
8.2.4. Batching Sends | 7.2.4. Batching Sends | |||
To reduce the overhead of sending multiple small Messages on a | To reduce the overhead of sending multiple small Messages on a | |||
Connection, the application could batch several Send Actions | Connection, the application could 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 ought to be coalesced when possible, and that sending | these Messages ought to be coalesced when possible, and that sending | |||
any of the batched Messages can be delayed until the last Message in | any of the batched Messages can be delayed until the last Message in | |||
the batch is enqueued. | the batch is enqueued. | |||
The semantics for starting and ending a batch can be implementation- | The semantics for starting and ending a batch can be implementation- | |||
specific, but need to allow multiple Send Actions to be enqueued. | specific, but need to allow multiple Send Actions to be enqueued. | |||
Connection.StartBatch() | Connection.StartBatch() | |||
Connection.Send(messageData) | Connection.Send(messageData) | |||
Connection.Send(messageData) | Connection.Send(messageData) | |||
Connection.EndBatch() | Connection.EndBatch() | |||
8.2.5. Send on Active Open: InitiateWithSend | 7.2.5. 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 "Safely Replayable". This | Message passed to InitiateWithSend as "Safely Replayable". This | |||
allows the transport system to make use of 0-RTT establishment in | allows the Transport Services system to make use of 0-RTT | |||
case this is supported by the available protocol stacks. When the | establishment in case this is supported by the available protocol | |||
selected stack(s) do not support transmitting data upon connection | stacks. When the selected stack(s) do not support transmitting data | |||
establishment, InitiateWithSend is identical to Initiate() followed | upon connection establishment, InitiateWithSend is identical to | |||
by Send(). | Initiate() followed by Send(). | |||
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 Initiate() followed | to those that would be sent by an invocation of Initiate() 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. | |||
8.2.6. Priority in TAPS | 7.2.6. Priority in TAPS | |||
The Transport Services interface provides two properties to allow a | The Transport Services interface provides two properties to allow a | |||
sender to signal the relative priority of data transmission: the | sender to signal the relative priority of data transmission: the | |||
Priority Message Property Section 8.1.3.2, and the Connection | Priority Message Property Section 7.1.3.2, and the Connection | |||
Priority Connection Property Section 7.1.2. These properties are | Priority Connection Property Section 6.1.2. These properties are | |||
designed to allow the expression and implementation of a wide variety | designed to allow the expression and implementation of a wide variety | |||
of approaches to transmission priority in the transport and | of approaches to transmission priority in the transport and | |||
application layer, including those which do not appear on the wire | application layer, including those which do not appear on the wire | |||
(affecting only sender-side transmission scheduling) as well as those | (affecting only sender-side transmission scheduling) as well as those | |||
that do (e.g. [I-D.ietf-httpbis-priority]. | that do (e.g. [I-D.ietf-httpbis-priority]. | |||
A Transport Services system gives no guarantees about how its | A Transport Services system gives no guarantees about how its | |||
expression of relative priorities will be realized; for example, if a | expression of relative priorities will be realized; for example, if a | |||
transport stack that only provides a single in-order reliable stream | transport stack that only provides a single in-order reliable stream | |||
is selected, prioritization information can only be ignored. | is selected, prioritization information can only be ignored. | |||
skipping to change at page 60, line 21 ¶ | skipping to change at page 60, line 18 ¶ | |||
worse with respect to those connections and messages than an | worse with respect to those connections and messages than an | |||
equivalent configuration in which all prioritization properties are | equivalent configuration in which all prioritization properties are | |||
left at their defaults. | left at their defaults. | |||
The Transport Services interface does order Connection Priority over | The Transport Services interface does order Connection Priority over | |||
the Priority Message Property. In the absense of other externalities | the Priority Message Property. In the absense of other externalities | |||
(e.g., transport-layer flow control), a priority 1 Message on a | (e.g., transport-layer flow control), a priority 1 Message on a | |||
priority 0 Connection will be sent before a priority 0 Message on a | priority 0 Connection will be sent before a priority 0 Message on a | |||
priority 1 Connection in the same group. | priority 1 Connection in the same group. | |||
8.3. Receiving Data | 7.3. 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 | |||
(unless the "Direction of Communication" property is set to | (unless the "Direction of Communication" property is set to | |||
"unidirectional send"). As with sending, the data is received in | "unidirectional send"). As with sending, the data is received in | |||
Messages. Receiving is an asynchronous operation, in which each call | Messages. Receiving is an asynchronous operation, in which each call | |||
to Receive enqueues a request to receive new data from the | to Receive enqueues a request to receive new data from the | |||
connection. Once data has been received, or an error is encountered, | connection. Once data has been received, or an error is encountered, | |||
an event will be delivered to complete any pending Receive requests | an event will be delivered to complete any pending Receive requests | |||
(see Section 8.3.2). If Messages arrive at the transport system | (see Section 7.3.2). If Messages arrive at the Transport Services | |||
before Receive requests are issued, ensuing Receive requests will | system before Receive requests are issued, ensuing Receive requests | |||
first operate on these Messages before awaiting any further Messages. | will first operate on these Messages before awaiting any further | |||
Messages. | ||||
8.3.1. Enqueuing Receives | 7.3.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.3.2.1). | event (Section 7.3.2.1). | |||
The application can set a minIncompleteLength value to indicate the | The application can set a minIncompleteLength value to indicate 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.3.2.2 and Section 8.1.2 for more information on how this is | Section 7.3.2.2 and Section 7.1.2 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 that the application is currently prepared to receive. The | bytes that the application is currently prepared to receive. The | |||
default value for maxLength is infinite. If an incoming Message is | default value for maxLength is infinite. If an incoming Message is | |||
larger than the minimum of this size and the maximum Message size on | larger than the minimum of this size and the maximum Message size on | |||
receive for the Connection's Protocol Stack, it will be delivered via | receive for the Connection's Protocol Stack, it will be delivered via | |||
ReceivedPartial events (Section 8.3.2.2). | ReceivedPartial events (Section 7.3.2.2). | |||
Note that maxLength does not guarantee that the application will | Note that maxLength does not guarantee that the application will | |||
receive that many bytes if they are available; the interface could | receive that many bytes if they are available; the interface could | |||
return ReceivedPartial events with less data than maxLength according | return ReceivedPartial events with less data than maxLength according | |||
to implementation constraints. Note also that maxLength and | to implementation constraints. Note also that maxLength and | |||
minIncompleteLength are intended only to manage buffering, and are | minIncompleteLength are intended only to manage buffering, and are | |||
not interpreted as a receiver preference for message reordering. | not interpreted as a receiver preference for message reordering. | |||
8.3.2. Receive Events | 7.3.2. Receive Events | |||
Each call to Receive will be paired with a single Receive Event, | Each call to Receive will be paired with a single Receive Event, | |||
which can be a success or an error. This allows an application to | which can be a success or an error. This allows an application to | |||
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. | |||
The interface should allow the application to correlate which call to | The interface should allow the application to correlate which call to | |||
Receive resulted in a particular Receive Event. The manner in which | Receive resulted in a particular Receive Event. The manner in which | |||
this correlation is indicated is implementation-specific. | this correlation is indicated is implementation-specific. | |||
8.3.2.1. Received | 7.3.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. | |||
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 messageContext is provided to enable retrieving metadata about | |||
the message and referring to the message, e.g., to send replies and | the message and referring to the message, e.g., to send replies and | |||
map responses to their requests. See Section 8.1.1 for details. | map responses to their requests. See Section 7.1.1 for details. | |||
See Section 8.1.2 for handling Message framing in situations where | See Section 7.1.2 for handling Message framing in situations where | |||
the Protocol Stack only provides a byte-stream transport. | the Protocol Stack only provides a byte-stream transport. | |||
8.3.2.2. ReceivedPartial | 7.3.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 can be delivered with a ReceivedPartial event. To | the Message can be delivered with a ReceivedPartial event. To | |||
continue to receive more of the same Message, the application must | continue to receive more of the same Message, the application must | |||
invoke Receive again. | invoke Receive again. | |||
Multiple invocations of ReceivedPartial deliver data for the same | Multiple invocations of ReceivedPartial deliver data for the same | |||
Message by passing the same MessageContext, until the endOfMessage | Message by passing the same MessageContext, until the endOfMessage | |||
skipping to change at page 62, line 31 ¶ | skipping to change at page 62, line 31 ¶ | |||
ReceivedPartial may deliver them in a sequence like this: A1, B1, B2, | ReceivedPartial may deliver them in a sequence like this: A1, B1, B2, | |||
A2, A3, B3, because the messageContext allows the application to | A2, A3, B3, because the messageContext allows the application to | |||
identify the pieces as belonging to Message A and B, respectively. | identify the pieces as belonging to Message A and B, respectively. | |||
However, a sequence like: A1, A3 will never occur. | However, a sequence like: A1, A3 will never occur. | |||
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: | |||
* 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; | |||
* the underlying Protocol Stack does not support message boundary | o the underlying Protocol Stack does not support message boundary | |||
preservation, and the Message Framer (see Section 8.1.2) cannot | preservation, and the Message Framer (see Section 7.1.2) cannot | |||
determine the end of the message using the buffer space it has | determine the end of the message using the buffer space it has | |||
available; or | available; or | |||
* the underlying Protocol Stack does not support message boundary | o the underlying Protocol Stack does not support message boundary | |||
preservation, and no Message Framer was supplied by the | preservation, and no Message Framer was supplied by the | |||
application | application | |||
Note that in the absence of message boundary preservation or a | Note that in the absence of message boundary preservation or a | |||
Message Framer, all bytes received on the Connection will be | Message Framer, all bytes received on the Connection will be | |||
represented as one large Message of indeterminate length. | represented as one large Message of indeterminate length. | |||
8.3.2.3. ReceiveError | 7.3.2.3. ReceiveError | |||
Connection -> ReceiveError<messageContext, reason?> | Connection -> ReceiveError<messageContext, reason?> | |||
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 parsed, or when some | Protocol Stack that cannot be fully retrieved or parsed, or when some | |||
other indication is received that reception has failed. In contrast, | other indication is received that reception has failed. In contrast, | |||
conditions that irrevocably lead to the termination of the Connection | conditions that irrevocably lead to the termination of the Connection | |||
are instead signaled using ConnectionError (see Section 9). | are instead signaled using ConnectionError (see Section 8). | |||
The ReceiveError event passes an optional associated MessageContext. | The ReceiveError event passes an optional associated MessageContext. | |||
This can indicate that a Message that was being partially received | This can 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.3. Receive Message Properties | 7.3.3. Receive Message Properties | |||
Each Message Context may contain metadata from protocols in the | Each Message Context may contain metadata from protocols in the | |||
Protocol Stack; which metadata is available is Protocol Stack | Protocol Stack; which metadata is available is Protocol Stack | |||
dependent. These are exposed though additional read-only Message | dependent. These are exposed though additional read-only Message | |||
Properties that can be queried from the MessageContext object (see | Properties that can be queried from the MessageContext object (see | |||
Section 8.1.1) passed by the receive event. The following metadata | Section 7.1.1) passed by the receive event. The following metadata | |||
values are supported: | values are supported: | |||
8.3.3.1. UDP(-Lite)-specific Property: ECN | 7.3.3.1. UDP(-Lite)-specific Property: 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, and for building applications that need | for logging and debugging, and for building applications that need | |||
access to information about the transport internals for their own | access to information about the transport internals for their own | |||
operation. This property is specific to UDP and UDP-Lite because | operation. This property is specific to UDP and UDP-Lite because | |||
these protocols do not implement congestion control, and hence expose | these protocols do not implement congestion control, and hence expose | |||
this functionality to the application. | this functionality to the application. | |||
8.3.3.2. Early Data | 7.3.3.2. Early Data | |||
In some cases it can be valuable to know whether data was read as | In some cases it can be valuable to know whether data was read as | |||
part of early data transfer (before connection establishment has | part of early data transfer (before connection establishment has | |||
finished). This is useful if applications need to treat early data | finished). This is useful if applications need to treat early data | |||
separately, e.g., if early data has different security properties | separately, e.g., if early data has different security properties | |||
than data sent after connection establishment. In the case of TLS | than data sent after connection establishment. In the case of TLS | |||
1.3, client early data can be replayed maliciously (see [RFC8446]). | 1.3, client early data can be replayed maliciously (see [RFC8446]). | |||
Thus, receivers might wish to perform additional checks for early | Thus, receivers might wish to perform additional checks for early | |||
data to ensure it is safely replayable. If TLS 1.3 is available and | data to ensure it is safely replayable. If TLS 1.3 is available and | |||
the recipient Message was sent as part of early data, the | 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.3. Receiving Final Messages | 7.3.3.3. Receiving Final Messages | |||
The Message Context can indicate whether or not this Message is the | The Message Context can indicate whether or not this Message is the | |||
Final Message on a Connection. For any Message that is marked as | Final Message on a Connection. For any Message that is marked as | |||
Final, the application can assume that there will be no more Messages | Final, the application can assume that there will be no more Messages | |||
received on the Connection once the Message has been completely | received on the Connection once the Message has been completely | |||
delivered. This corresponds to the Final property that may be marked | delivered. This corresponds to the Final property that may be marked | |||
on a sent Message, see Section 8.1.3.5. | on a sent Message, see Section 7.1.3.5. | |||
Some transport protocols and peers do not support signaling of the | Some transport protocols and peers do 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 sending endpoint is done | a Message marked Final to know that the sending 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. | |||
9. Connection Termination | 8. 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 Services system. For | |||
if reliable delivery was requested for a Message handed over before | example, if reliable delivery was requested for a Message handed over | |||
calling Close, the Closed Event will signify that this Message has | before calling Close, the Closed Event will signify that this Message | |||
indeed been delivered. If the Remote Endpoint still has data to | has indeed been delivered. This action does not affect any other | |||
send, it cannot be received after this call. | Connection that is entangled with this one in a Connection Group. | |||
Connection.Close() | Connection.Close() | |||
The Closed Event informs the application that the Remote Endpoint has | The Closed Event informs the application that the Remote Endpoint has | |||
closed the Connection. There is no guarantee that a remote Close | closed the Connection. There is no guarantee that a remote Close | |||
will indeed be signaled. | will indeed be signaled. | |||
Connection -> Closed<> | Connection -> Closed<> | |||
Abort terminates a Connection without delivering any remaining data: | Abort terminates a Connection without delivering any remaining data. | |||
This action does not affect any other Connection that is entangled | ||||
with this one in a Connection Group. | ||||
Connection.Abort() | Connection.Abort() | |||
AbortGroup terminates a Connection and also terminates any other | ||||
Connections that are entangled with this one in a Connection Group. | ||||
For example, all of the Connections in a group might be streams of a | ||||
single session for a multistreaming protocol; aborting the entire | ||||
group would close the underlying session. See also Section 5.4. | ||||
Connection.AbortGroup() | ||||
A ConnectionError informs the application that: 1) data could not be | A ConnectionError informs the application that: 1) data could not be | |||
delivered to the peer after a timeout, or 2) the Connection has been | delivered to the peer after a timeout, or 2) the Connection has been | |||
aborted (e.g., because the peer has called Abort). There is no | aborted (e.g., because the peer has called Abort). There is no | |||
guarantee that an Abort will indeed be signaled. | guarantee that an Abort will indeed be signaled. | |||
Connection -> ConnectionError<reason?> | Connection -> ConnectionError<reason?> | |||
10. Connection State and Ordering of Operations and Events | 9. Connection State and Ordering of Operations and Events | |||
This interface is designed to be independent of an implementation's | This interface is designed to be independent of an implementation's | |||
concurrency model. The details of how exactly actions are handled, | concurrency model. The details of how exactly actions are handled, | |||
and how events are dispatched, are implementation dependent. | and how events are 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: | |||
* Ready<> occurs when a Connection created with Initiate() or | o Ready<> occurs when a Connection created with Initiate() or | |||
InitiateWithSend() transitions to Established state. | InitiateWithSend() transitions to Established state. | |||
* ConnectionReceived<> occurs when a Connection created with | o ConnectionReceived<> occurs when a Connection created with | |||
Listen() transitions to Established state. | Listen() transitions to Established state. | |||
* RendezvousDone<> occurs when a Connection created with | o RendezvousDone<> occurs when a Connection created with | |||
Rendezvous() transitions to Established state. | Rendezvous() transitions to Established state. | |||
* Closed<> occurs when a Connection transitions to Closed state | o Closed<> occurs when a Connection transitions to Closed state | |||
without error. | without error. | |||
* InitiateError<> occurs when a Connection created with Initiate() | o InitiateError<> occurs when a Connection created with Initiate() | |||
transitions from Establishing state to Closed state due to an | transitions from Establishing state to Closed state due to an | |||
error. | error. | |||
* ConnectionError<> occurs when a Connection transitions to Closed | o ConnectionError<> occurs when a Connection transitions to Closed | |||
state due to an error in all other circumstances. | state due to an error in all other circumstances. | |||
The following diagram shows the possible states of a Connection and | The following diagram shows the possible states of a Connection and | |||
the events that occur upon a transition from one state to another. | the events that occur upon a transition from one state to another. | |||
(*) (**) | (*) (**) | |||
Establishing -----> Established -----> Closed | Establishing -----> Established -----> Closed | |||
| ^ | | ^ | |||
| | | | | | |||
+-----------------------------------+ | +-----------------------------------+ | |||
InitiateError<> | InitiateError<> | |||
(*) Ready<>, ConnectionReceived<>, RendezvousDone<> | (*) Ready<>, ConnectionReceived<>, RendezvousDone<> | |||
(**) Closed<>, ConnectionError<> | (**) Closed<>, ConnectionError<> | |||
Figure 2: Connection State Diagram | Figure 2: Connection State Diagram | |||
The interface provides the following guarantees about the ordering of | The interface provides the following guarantees about the ordering of | |||
operations: | operations: | |||
* Sent<> events will occur on a Connection in the order in which the | o Sent<> events will occur on a Connection in the order in which the | |||
Messages were sent (i.e., delivered to the kernel or to the | Messages were sent (i.e., delivered to the kernel or to the | |||
network interface, depending on implementation). | network interface, depending on implementation). | |||
* Received<> will never occur on a Connection before it is | o Received<> will never occur on a Connection before it is | |||
Established; i.e. before a Ready<> event on that Connection, or a | Established; i.e. before a Ready<> event on that Connection, or a | |||
ConnectionReceived<> or RendezvousDone<> containing that | ConnectionReceived<> or RendezvousDone<> containing that | |||
Connection. | Connection. | |||
* 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<> | after a Closed<> event, an InitiateError<> or ConnectionError<> | |||
will not occur on that connection. To ensure this ordering, | will not occur on that connection. To ensure this ordering, | |||
Closed<> will not occur on a Connection while other events on the | Closed<> will not occur on a Connection while other events on the | |||
Connection are still locally outstanding (i.e., known to the | Connection are still locally outstanding (i.e., known to the | |||
interface and waiting to be dealt with by the application). | interface and waiting to be dealt with by the application). | |||
11. IANA Considerations | 10. 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 3.2.1). | |||
12. Privacy and Security Considerations | 11. Privacy and 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 4.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 ought to work in a TAPS system. Security considerations for | protocol ought to work in a TAPS system. Security considerations for | |||
these protocols are discussed in the respective specifications. | these protocols are discussed in the respective specifications. | |||
The described API is used to exchange information between an | The described API is used to exchange information between an | |||
application and the transport system. While it is not necessarily | application and the Transport Services system. While it is not | |||
expected that both systems are implemented by the same authority, it | necessarily expected that both systems are implemented by the same | |||
is expected that the transport system implementation is either | authority, it is expected that the Transport Services system | |||
provided as a library that is selected by the application from a | implementation is either provided as a library that is selected by | |||
trusted party, or that it is part of the operating system that the | the application from a trusted party, or that it is part of the | |||
application also relies on for other tasks. | operating system that the application also relies on for other tasks. | |||
In either case, the TAPS API is an internal interface that is used to | In either case, the Transport Services API is an internal interface | |||
change information locally between two systems. However, as the | that is used to change information locally between two systems. | |||
transport system is responsible for network communication, it is in | However, as the Transport Services system is responsible for network | |||
the position to potentially share any information provided by the | communication, it is in the position to potentially share any | |||
application with the network or another communication peer. Most of | information provided by the application with the network or another | |||
the information provided over the TAPS API are useful to configure | communication peer. Most of the information provided over the | |||
and select protocols and paths and are not necessarily privacy | Transport Services API are useful to configure and select protocols | |||
sensitive. Still, some information could be privacy sensitive | and paths and are not necessarily privacy sensitive. Still, some | |||
because it might reveal usage characteristics and habits of the user | information could be privacy sensitive because it might reveal usage | |||
of an application. | characteristics and habits of the user of an application. | |||
Of course any communication over a network reveals usage | Of course any communication over a network reveals usage | |||
characteristics, as all packets, as well as their timing and size, | characteristics, as all packets, as well as their timing and size, | |||
are part of the network-visible wire image [RFC8546]. However, the | are part of the network-visible wire image [RFC8546]. However, the | |||
selection of a protocol and its configuration also impacts which | selection of a protocol and its configuration also impacts which | |||
information is visible, potentially in clear text, and which other | information is visible, potentially in clear text, and which other | |||
entities can access it. In most cases, information provided for | entities can access it. In most cases, information provided for | |||
protocol and path selection should not directly translate to | protocol and path selection should not directly translate to | |||
information that can be observed by network devices on the path. | information that can be observed by network devices on the path. | |||
However, there might be specific configuration information that is | However, there might be specific configuration information that is | |||
intended for path exposure, e.g., a DiffServ codepoint setting, that | intended for path exposure, e.g., a DiffServ codepoint setting, that | |||
is either provided directly by the application or indirectly | is either provided directly by the application or indirectly | |||
configured for a traffic profile. | configured for a traffic profile. | |||
Applications should be aware that communication attempts can lead to | Applications should be aware that communication attempts can lead to | |||
more than one connection establishment. This is the case, for | more than one connection establishment. This is the case, for | |||
example, when the transport system also executes name resolution, | example, when the Transport Services system also executes name | |||
when support mechanisms such as TURN or ICE are used to establish | resolution, when support mechanisms such as TURN or ICE are used to | |||
connectivity, if protocols or paths are raised, or if a path fails | establish connectivity, if protocols or paths are raised, or if a | |||
and fallback or re-establishment is supported in the transport | path fails and fallback or re-establishment is supported in the | |||
system. | Transport Services system. | |||
Applications should also take care to not assume that all data | ||||
received using the Transport Services API is always complete or well- | ||||
formed. Specifically, messages that are received partially | ||||
Section 7.3.2.2 could be a source of truncation attacks if | ||||
applications do not distinguish between partial messages and complete | ||||
messages. | ||||
The interface explicitly does not require the application to resolve | The interface explicitly does not require the application to resolve | |||
names, though there is a tradeoff between early and late binding of | names, though there is a tradeoff between early and late binding of | |||
addresses to names. Early binding allows the API implementation to | addresses to names. Early binding allows the API implementation to | |||
reduce connection setup latency, at the cost of potentially limited | reduce connection setup latency, at the cost of potentially limited | |||
scope for alternate path discovery during Connection establishment, | scope for alternate path discovery during Connection establishment, | |||
as well as potential additional information leakage about application | as well as potential additional information leakage about application | |||
interest when used with a resolution method (such as DNS without TLS) | interest when used with a resolution method (such as DNS without TLS) | |||
which does not protect query confidentiality. | which does not protect query confidentiality. | |||
These communication activities are not different from what is used | These communication activities are not different from what is used | |||
today. However, the goal of a TAPS transport system is to support | today. However, the goal of a Transport Services system is to | |||
such mechanisms as a generic service within the transport layer. | support such mechanisms as a generic service within the transport | |||
This enables applications to more dynamically benefit from | layer. This enables applications to more dynamically benefit from | |||
innovations and new protocols in the transport, although it reduces | innovations and new protocols in the transport, although it reduces | |||
transparency of the underlying communication actions to the | transparency of the underlying communication actions to the | |||
application itself. The TAPS API is designed such that protocol and | application itself. The TAPS API is designed such that protocol and | |||
path selection can be limited to a small and controlled set if | path selection can be limited to a small and controlled set if | |||
required by the application for functional or security purposes. | required by the application for functional or security purposes. | |||
Further, TAPS implementations should provide an interface to poll | Further, TAPS implementations should provide an interface to poll | |||
information about which protocol and path is currently in use as well | information about which protocol and path is currently in use as well | |||
as provide logging about the communication events of each connection. | as provide logging about the communication events of each connection. | |||
13. Acknowledgements | 12. 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 | |||
skipping to change at page 68, line 29 ¶ | skipping to change at page 69, line 5 ¶ | |||
its "Toppforsk" programme through the "OCARINA" project. | its "Toppforsk" programme through the "OCARINA" project. | |||
Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | |||
Kinnear for their implementation and design efforts, including Happy | Kinnear for their implementation and design efforts, including Happy | |||
Eyeballs, that heavily influenced this work. 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. Thanks to Maximilian Franke for asking | which this work has evolved. Thanks to Maximilian Franke for asking | |||
good questions based on implementation experience and for | good questions based on implementation experience and for | |||
contributing text, e.g., on multicast. | contributing text, e.g., on multicast. | |||
14. References | 13. References | |||
14.1. Normative References | 13.1. Normative References | |||
[I-D.ietf-taps-arch] | [I-D.ietf-taps-arch] | |||
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., | Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., | |||
Perkins, C., Tiesel, P., and C. Wood, "An Architecture for | Perkins, C., Tiesel, P., and C. Wood, "An Architecture for | |||
Transport Services", Work in Progress, Internet-Draft, | Transport Services", draft-ietf-taps-arch-09 (work in | |||
draft-ietf-taps-arch-08, 13 July 2020, | progress), November 2020. | |||
<http://www.ietf.org/internet-drafts/draft-ietf-taps-arch- | ||||
08.txt>. | ||||
[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>. | |||
[RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | [RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | |||
RFC 2914, DOI 10.17487/RFC2914, September 2000, | RFC 2914, DOI 10.17487/RFC2914, September 2000, | |||
<https://www.rfc-editor.org/info/rfc2914>. | <https://www.rfc-editor.org/info/rfc2914>. | |||
skipping to change at page 69, line 31 ¶ | skipping to change at page 70, line 5 ¶ | |||
[RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | [RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | |||
Transport Features Provided by IETF Transport Protocols", | Transport Features Provided by IETF Transport Protocols", | |||
RFC 8303, DOI 10.17487/RFC8303, February 2018, | RFC 8303, DOI 10.17487/RFC8303, February 2018, | |||
<https://www.rfc-editor.org/info/rfc8303>. | <https://www.rfc-editor.org/info/rfc8303>. | |||
[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>. | |||
14.2. Informative References | 13.2. Informative References | |||
[I-D.ietf-httpbis-priority] | [I-D.ietf-httpbis-priority] | |||
Oku, K. and L. Pardue, "Extensible Prioritization Scheme | Oku, K. and L. Pardue, "Extensible Prioritization Scheme | |||
for HTTP", Work in Progress, Internet-Draft, draft-ietf- | for HTTP", draft-ietf-httpbis-priority-03 (work in | |||
httpbis-priority-02, 1 October 2020, <http://www.ietf.org/ | progress), January 2021. | |||
internet-drafts/draft-ietf-httpbis-priority-02.txt>. | ||||
[I-D.ietf-taps-impl] | [I-D.ietf-taps-impl] | |||
Brunstrom, A., Pauly, T., Enghardt, T., Grinnemo, K., | Brunstrom, A., Pauly, T., Enghardt, T., Grinnemo, K., | |||
Jones, T., Tiesel, P., Perkins, C., and M. Welzl, | Jones, T., Tiesel, P., Perkins, C., and M. Welzl, | |||
"Implementing Interfaces to Transport Services", Work in | "Implementing Interfaces to Transport Services", draft- | |||
Progress, Internet-Draft, draft-ietf-taps-impl-07, 13 July | ietf-taps-impl-08 (work in progress), November 2020. | |||
2020, <http://www.ietf.org/internet-drafts/draft-ietf- | ||||
taps-impl-07.txt>. | ||||
[I-D.ietf-tsvwg-datagram-plpmtud] | [I-D.ietf-tsvwg-datagram-plpmtud] | |||
Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | |||
T. Voelker, "Packetization Layer Path MTU Discovery for | T. Voelker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", Work in Progress, Internet-Draft, | Datagram Transports", draft-ietf-tsvwg-datagram-plpmtud-22 | |||
draft-ietf-tsvwg-datagram-plpmtud-22, 10 June 2020, | (work in progress), June 2020. | |||
<http://www.ietf.org/internet-drafts/draft-ietf-tsvwg- | ||||
datagram-plpmtud-22.txt>. | ||||
[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | |||
"Definition of the Differentiated Services Field (DS | "Definition of the Differentiated Services Field (DS | |||
Field) in the IPv4 and IPv6 Headers", RFC 2474, | Field) in the IPv4 and IPv6 Headers", RFC 2474, | |||
DOI 10.17487/RFC2474, December 1998, | DOI 10.17487/RFC2474, December 1998, | |||
<https://www.rfc-editor.org/info/rfc2474>. | <https://www.rfc-editor.org/info/rfc2474>. | |||
[RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | [RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | |||
"Assured Forwarding PHB Group", RFC 2597, | "Assured Forwarding PHB Group", RFC 2597, | |||
DOI 10.17487/RFC2597, June 1999, | DOI 10.17487/RFC2597, June 1999, | |||
<https://www.rfc-editor.org/info/rfc2597>. | <https://www.rfc-editor.org/info/rfc2597>. | |||
[RFC3246] Davie, B., Charny, A., Bennet, J.C.R., Benson, K., Le | [RFC3246] Davie, B., Charny, A., Bennet, J., Benson, K., Le Boudec, | |||
Boudec, J.Y., Courtney, W., Davari, S., Firoiu, V., and D. | J., Courtney, W., Davari, S., Firoiu, V., and D. | |||
Stiliadis, "An Expedited Forwarding PHB (Per-Hop | Stiliadis, "An Expedited Forwarding PHB (Per-Hop | |||
Behavior)", RFC 3246, DOI 10.17487/RFC3246, March 2002, | Behavior)", RFC 3246, DOI 10.17487/RFC3246, March 2002, | |||
<https://www.rfc-editor.org/info/rfc3246>. | <https://www.rfc-editor.org/info/rfc3246>. | |||
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | |||
A., Peterson, J., Sparks, R., Handley, M., and E. | A., Peterson, J., Sparks, R., Handley, M., and E. | |||
Schooler, "SIP: Session Initiation Protocol", RFC 3261, | Schooler, "SIP: Session Initiation Protocol", RFC 3261, | |||
DOI 10.17487/RFC3261, June 2002, | DOI 10.17487/RFC3261, June 2002, | |||
<https://www.rfc-editor.org/info/rfc3261>. | <https://www.rfc-editor.org/info/rfc3261>. | |||
skipping to change at page 72, line 28 ¶ | skipping to change at page 72, line 39 ¶ | |||
Wood, "A Survey of the Interaction between Security | Wood, "A Survey of the Interaction between Security | |||
Protocols and Transport Services", RFC 8922, | Protocols and Transport Services", RFC 8922, | |||
DOI 10.17487/RFC8922, October 2020, | DOI 10.17487/RFC8922, October 2020, | |||
<https://www.rfc-editor.org/info/rfc8922>. | <https://www.rfc-editor.org/info/rfc8922>. | |||
[RFC8923] Welzl, M. and S. Gjessing, "A Minimal Set of Transport | [RFC8923] Welzl, M. and S. Gjessing, "A Minimal Set of Transport | |||
Services for End Systems", RFC 8923, DOI 10.17487/RFC8923, | Services for End Systems", RFC 8923, DOI 10.17487/RFC8923, | |||
October 2020, <https://www.rfc-editor.org/info/rfc8923>. | October 2020, <https://www.rfc-editor.org/info/rfc8923>. | |||
[TCP-COUPLING] | [TCP-COUPLING] | |||
"ctrlTCP: Reducing Latency through Coupled, Heterogeneous | Islam, S., Welzl, M., Hiorth, K., Hayes, D., Armitage, G., | |||
Multi-Flow TCP Congestion Control", IEEE INFOCOM Global | and S. Gjessing, "ctrlTCP: Reducing Latency through | |||
Internet Symposium (GI) workshop (GI 2018) , 15 April | Coupled, Heterogeneous Multi-Flow TCP Congestion Control", | |||
2018. | IEEE INFOCOM Global Internet Symposium (GI) workshop (GI | |||
2018) , 2018. | ||||
Appendix A. Convenience Functions | Appendix A. Implementation Mapping | |||
A.1. Adding Preference Properties | The way the concepts from this abstract interface map into concrete | |||
APIs in a given language on a given platform largely depends on the | ||||
features and norms of the language and the platform. Actions could | ||||
be implemented as functions or method calls, for instance, and Events | ||||
could be implemented via event queues, handler functions or classes, | ||||
communicating sequential processes, or other asynchronous calling | ||||
conventions. | ||||
A.1. Types | ||||
The basic types mentioned in Section 1.1 typically have natural | ||||
correspondences in practical programming languages, perhaps | ||||
constrained by implementation-specific limitations. For example: | ||||
o An Integer can typically be represented in C by an "int" or | ||||
"long", subject to the underlying platform's ranges for each. To | ||||
accommodate special values, a C function that returns a non- | ||||
negative "int" on success may return -1 on failure. In Python, | ||||
such a function might return "None" or raise an exception. | ||||
o In C, a Tuple may be represented as a "struct" with one member for | ||||
each of the value types in the ordered grouping. In Python, by | ||||
contrast, a Tuple may be represented natively as a "tuple", a | ||||
sequence of dynamically-typed elements. | ||||
o A Collection may be represented as a "std::set" in C++ or as a | ||||
"set" in Python. In C, it may be represented as an array or as a | ||||
higher-level data structure with appropriate accessors defined. | ||||
A.2. Events and Errors | ||||
This specification treats Events and Errors similarly. Errors, just | ||||
as any other Events, may occur asynchronously in network | ||||
applications. However, implementations of this interface may report | ||||
Errors synchronously, according to the error handling idioms of the | ||||
implementation platform, where they can be immediately detected, such | ||||
as by throwing an exception when attempting to initiate a connection | ||||
with inconsistent Transport Properties. An error can provide an | ||||
optional reason to the application with further details about why the | ||||
error occurred. | ||||
A.3. Time Duration | ||||
Time duration types are implementation-specific. For instance, it | ||||
could be a number of seconds, number of milliseconds, or a "struct | ||||
timeval" in C or a user-defined "Duration" class in C++. | ||||
Appendix B. Convenience Functions | ||||
B.1. Adding Preference Properties | ||||
As Selection Properties of type "Preference" will be set on a | As Selection Properties of type "Preference" will be set on a | |||
TransportProperties object quite frequently, implementations should | TransportProperties object quite frequently, implementations should | |||
provide special actions for adding each preference level i.e, | provide special actions for adding each preference level i.e, | |||
"TransportProperties.Set(some_property, avoid)" is equivalent to | "TransportProperties.Set(some_property, avoid)" is equivalent to | |||
"TransportProperties.Avoid(some_property)": | "TransportProperties.Avoid(some_property)": | |||
TransportProperties.Require(property) | TransportProperties.Require(property) | |||
TransportProperties.Prefer(property) | TransportProperties.Prefer(property) | |||
TransportProperties.Ignore(property) | TransportProperties.Ignore(property) | |||
TransportProperties.Avoid(property) | TransportProperties.Avoid(property) | |||
TransportProperties.Prohibit(property) | TransportProperties.Prohibit(property) | |||
TransportProperties.Default(property) | ||||
A.2. Transport Property Profiles | B.2. Transport Property Profiles | |||
To ease the use of the interface specified by this document, | To ease the use of the interface specified by this document, | |||
implementations should provide a mechanism to create Transport | implementations should provide a mechanism to create Transport | |||
Property objects (see Section 5.2) that are pre-configured with | Property objects (see Section 4.2) that are pre-configured with | |||
frequently used sets of properties. Implementations should at least | frequently used sets of properties. Implementations should at least | |||
offer short-hands to specify the following property profiles: | offer short-hands to specify the following property profiles: | |||
A.2.1. reliable-inorder-stream | B.2.1. reliable-inorder-stream | |||
This profile provides reliable, in-order transport service with | This profile provides reliable, in-order transport service with | |||
congestion control. TCP is an example of a protocol that provides | congestion control. TCP is an example of a protocol that provides | |||
this service. It should consist of the following properties: | this service. It should consist of the following properties: | |||
+=======================+=========+ | +-----------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+=======================+=========+ | ||||
| reliability | require | | ||||
+-----------------------+---------+ | +-----------------------+---------+ | |||
| reliability | require | | ||||
| | | | ||||
| preserveOrder | require | | | preserveOrder | require | | |||
+-----------------------+---------+ | | | | | |||
| congestionControl | require | | | congestionControl | require | | |||
+-----------------------+---------+ | | | | | |||
| preserveMsgBoundaries | ignore | | | preserveMsgBoundaries | ignore | | |||
+-----------------------+---------+ | +-----------------------+---------+ | |||
Table 2 | B.2.2. reliable-message | |||
A.2.2. reliable-message | ||||
This profile provides message-preserving, reliable, in-order | This profile provides message-preserving, reliable, in-order | |||
transport service with congestion control. SCTP is an example of a | transport service with congestion control. SCTP is an example of a | |||
protocol that provides this service. It should consist of the | protocol that provides this service. It should consist of the | |||
following properties: | following properties: | |||
+=======================+=========+ | +-----------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+=======================+=========+ | ||||
| reliability | require | | ||||
+-----------------------+---------+ | +-----------------------+---------+ | |||
| reliability | require | | ||||
| | | | ||||
| preserveOrder | require | | | preserveOrder | require | | |||
+-----------------------+---------+ | | | | | |||
| congestionControl | require | | | congestionControl | require | | |||
+-----------------------+---------+ | | | | | |||
| preserveMsgBoundaries | require | | | preserveMsgBoundaries | require | | |||
+-----------------------+---------+ | +-----------------------+---------+ | |||
Table 3 | B.2.3. unreliable-datagram | |||
A.2.3. unreliable-datagram | ||||
This profile provides unreliable datagram transport service. An | This profile provides unreliable datagram transport service. An | |||
example of a protocol that provides this service is UDP. It consists | example of a protocol that provides this service is UDP. It consists | |||
of the following properties: | of the following properties: | |||
+=======================+=========+ | +-----------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+=======================+=========+ | ||||
| reliability | ignore | | ||||
+-----------------------+---------+ | +-----------------------+---------+ | |||
| reliability | ignore | | ||||
| | | | ||||
| preserveOrder | ignore | | | preserveOrder | ignore | | |||
+-----------------------+---------+ | | | | | |||
| congestionControl | ignore | | | congestionControl | ignore | | |||
+-----------------------+---------+ | | | | | |||
| preserveMsgBoundaries | require | | | preserveMsgBoundaries | require | | |||
+-----------------------+---------+ | | | | | |||
| safely replayable | true | | | safely replayable | true | | |||
+-----------------------+---------+ | +-----------------------+---------+ | |||
Table 4 | ||||
Applications that choose this Transport Property Profile for latency | Applications that choose this Transport Property Profile for latency | |||
reasons should also consider setting an appropriate Capacity Profile | reasons should also consider setting an appropriate Capacity Profile | |||
Property, see Section 7.1.6 and could benefit from controlling | Property, see Section 6.1.6 and could benefit from controlling | |||
checksum coverage, see Section 5.2.7 and Section 5.2.8. | checksum coverage, see Section 4.2.7 and Section 4.2.8. | |||
Appendix B. Relationship to the Minimal Set of Transport Services for | Appendix C. Relationship to the Minimal Set of Transport Services for | |||
End Systems | End Systems | |||
[RFC8923] identifies a minimal set of transport services that end | [RFC8923] identifies a minimal set of transport services that end | |||
systems should offer. These services make all non-security-related | systems should offer. These services make all non-security-related | |||
transport features of TCP, MPTCP, UDP, UDP-Lite, SCTP and LEDBAT | transport features of TCP, MPTCP, UDP, UDP-Lite, SCTP and LEDBAT | |||
available that 1) require interaction with the application, and 2) do | available that 1) require interaction with the application, and 2) do | |||
not get in the way of a possible implementation over TCP (or, with | not get in the way of a possible implementation over TCP (or, with | |||
limitations, UDP). The following text explains how this minimal set | limitations, UDP). The following text explains how this minimal set | |||
is reflected in the present API. For brevity, it is based on the | is reflected in the present API. For brevity, it is based on the | |||
list in Section 4.1 of [RFC8923], updated according to the discussion | list in Section 4.1 of [RFC8923], updated according to the discussion | |||
in Section 5 of [RFC8923]. The present API covers all elements of | in Section 5 of [RFC8923]. The present API covers all elements of | |||
this section except "Notification of Excessive Retransmissions (early | this section except "Notification of Excessive Retransmissions (early | |||
warning below abortion threshold)". This list is a subset of the | warning below abortion threshold)". This list is a subset of the | |||
transport features in Appendix A of [RFC8923], which refers to the | transport features in Appendix A of [RFC8923], which refers to the | |||
primitives in "pass 2" (Section 4) of [RFC8303] for further details | primitives in "pass 2" (Section 4) of [RFC8303] for further details | |||
on the implementation with TCP, MPTCP, UDP, UDP-Lite, SCTP and | on the implementation with TCP, MPTCP, UDP, UDP-Lite, SCTP and | |||
LEDBAT. | LEDBAT. | |||
* Connect: "Initiate" Action (Section 6.1). | o Connect: "Initiate" Action (Section 5.1). | |||
* Listen: "Listen" Action (Section 6.2). | o Listen: "Listen" Action (Section 5.2). | |||
* Specify number of attempts and/or timeout for the first | o Specify number of attempts and/or timeout for the first | |||
establishment message: "timeout" parameter of "Initiate" | establishment message: "timeout" parameter of "Initiate" | |||
(Section 6.1) or "InitiateWithSend" Action (Section 8.2.5). | (Section 5.1) or "InitiateWithSend" Action (Section 7.2.5). | |||
* Disable MPTCP: "Parallel Use of Multiple Paths" Property | o Disable MPTCP: "Parallel Use of Multiple Paths" Property | |||
(Section 5.2.14). | (Section 4.2.14). | |||
* Hand over a message to reliably transfer (possibly multiple times) | o Hand over a message to reliably transfer (possibly multiple times) | |||
before connection establishment: "InitiateWithSend" Action | before connection establishment: "InitiateWithSend" Action | |||
(Section 8.2.5). | (Section 7.2.5). | |||
* Change timeout for aborting connection (using retransmit limit or | o Change timeout for aborting connection (using retransmit limit or | |||
time value): "Timeout for Aborting Connection" property, using a | time value): "Timeout for Aborting Connection" property, using a | |||
time value (Section 7.1.3). | time value (Section 6.1.3). | |||
* Timeout event when data could not be delivered for too long: | o Timeout event when data could not be delivered for too long: | |||
"ConnectionError" Event (Section 9). | "ConnectionError" Event (Section 8). | |||
* Suggest timeout to the peer: "TCP-specific Property: User Timeout" | o Suggest timeout to the peer: "TCP-specific Property: User Timeout" | |||
(Section 7.2). | (Section 6.2). | |||
* Notification of ICMP error message arrival: "Notification of ICMP | o Notification of ICMP error message arrival: "Notification of ICMP | |||
soft error message arrival" property (Section 5.2.17). | soft error message arrival" property (Section 4.2.17). | |||
* Choose a scheduler to operate between streams of an association: | o Choose a scheduler to operate between streams of an association: | |||
"Connection Group Transmission Scheduler" property | "Connection Group Transmission Scheduler" property | |||
(Section 7.1.5). | (Section 6.1.5). | |||
* Configure priority or weight for a scheduler: "Connection | o Configure priority or weight for a scheduler: "Connection | |||
Priority" property (Section 7.1.2). | Priority" property (Section 6.1.2). | |||
* "Specify checksum coverage used by the sender" and "Disable | o "Specify checksum coverage used by the sender" and "Disable | |||
checksum when sending": "Corruption Protection Length" property | checksum when sending": "Corruption Protection Length" property | |||
(Section 8.1.3.6) and "Full Checksum Coverage on Sending" property | (Section 7.1.3.6) and "Full Checksum Coverage on Sending" property | |||
(Section 5.2.7). | (Section 4.2.7). | |||
* "Specify minimum checksum coverage required by receiver" and | o "Specify minimum checksum coverage required by receiver" and | |||
"Disable checksum requirement when receiving": "Required Minimum | "Disable checksum requirement when receiving": "Required Minimum | |||
Corruption Protection Coverage for Receiving" property | Corruption Protection Coverage for Receiving" property | |||
(Section 7.1.1) and "Full Checksum Coverage on Receiving" property | (Section 6.1.1) and "Full Checksum Coverage on Receiving" property | |||
(Section 5.2.8). | (Section 4.2.8). | |||
* "Specify DF field": "No Network-Layer Fragmentation" property | o "Specify DF field": "No Network-Layer Fragmentation" property | |||
(Section 8.1.3.9). | (Section 7.1.3.9). | |||
* "Request not to bundle messages": "No Transport-Layer | o "Request not to bundle messages": "No Transport-Layer | |||
Fragmentation" property (Section 8.1.3.10). | Fragmentation" property (Section 7.1.3.10). | |||
* Get max. transport-message size that may be sent using a non- | o Get max. transport-message size that may be sent using a non- | |||
fragmented IP packet from the configured interface: "Maximum | fragmented IP packet from the configured interface: "Maximum | |||
Message Size Before Fragmentation or Segmentation" property | Message Size Before Fragmentation or Segmentation" property | |||
(Section 7.1.10.2). | (Section 6.1.11.2). | |||
* Get max. transport-message size that may be received from the | o Get max. transport-message size that may be received from the | |||
configured interface: "Maximum Message Size on Receive" property | configured interface: "Maximum Message Size on Receive" property | |||
(Section 7.1.10.4). | (Section 6.1.11.4). | |||
* Obtain ECN field: "ECN" is a defined UDP(-Lite)-specific read-only | o Obtain ECN field: "ECN" is a defined UDP(-Lite)-specific read-only | |||
Message Property of the MessageContext object (Section 8.3.3.1). | Message Property of the MessageContext object (Section 7.3.3.1). | |||
* "Specify DSCP field", "Disable Nagle algorithm", "Enable and | o "Specify DSCP field", "Disable Nagle algorithm", "Enable and | |||
configure a "Low Extra Delay Background Transfer"": as suggested | configure a "Low Extra Delay Background Transfer"": as suggested | |||
in Section 5.5 of [RFC8923], these transport features are | in Section 5.5 of [RFC8923], these transport features are | |||
collectively offered via the "Capacity Profile" property | collectively offered via the "Capacity Profile" property | |||
(Section 7.1.6). Per-Message control is offered via the "Message | (Section 6.1.6). Per-Message control is offered via the "Message | |||
Capacity Profile Override" property (Section 8.1.3.8). | Capacity Profile Override" property (Section 7.1.3.8). | |||
* Close after reliably delivering all remaining data, causing an | o Close after reliably delivering all remaining data, causing an | |||
event informing the application on the other side: this is offered | event informing the application on the other side: this is offered | |||
by the "Close" Action with slightly changed semantics in line with | by the "Close" Action with slightly changed semantics in line with | |||
the discussion in Section 5.2 of [RFC8923] (Section 9). | the discussion in Section 5.2 of [RFC8923] (Section 8). | |||
* "Abort without delivering remaining data, causing an event | o "Abort without delivering remaining data, causing an event | |||
informing the application on the other side" and "Abort without | informing the application on the other side" and "Abort without | |||
delivering remaining data, not causing an event informing the | delivering remaining data, not causing an event informing the | |||
application on the other side": this is offered by the "Abort" | application on the other side": this is offered by the "Abort" | |||
action without promising that this is signaled to the other side. | action without promising that this is signaled to the other side. | |||
If it is, a "ConnectionError" Event will fire at the peer | If it is, a "ConnectionError" Event will fire at the peer | |||
(Section 9). | (Section 8). | |||
* "Reliably transfer data, with congestion control", "Reliably | o "Reliably transfer data, with congestion control", "Reliably | |||
transfer a message, with congestion control" and "Unreliably | transfer a message, with congestion control" and "Unreliably | |||
transfer a message": data is transferred via the "Send" action | transfer a message": data is transferred via the "Send" action | |||
(Section 8.2). Reliability is controlled via the "Reliable Data | (Section 7.2). Reliability is controlled via the "Reliable Data | |||
Transfer (Connection)" (Section 5.2.1) property and the "Reliable | Transfer (Connection)" (Section 4.2.1) property and the "Reliable | |||
Data Transfer (Message)" Message Property (Section 8.1.3.7). | Data Transfer (Message)" Message Property (Section 7.1.3.7). | |||
Transmitting data as a message or without delimiters is controlled | Transmitting data as a message or without delimiters is controlled | |||
via Message Framers (Section 8.1.2). The choice of congestion | via Message Framers (Section 7.1.2). The choice of congestion | |||
control is provided via the "Congestion control" property | control is provided via the "Congestion control" property | |||
(Section 5.2.9). | (Section 4.2.9). | |||
* Configurable Message Reliability: the "Lifetime" Message Property | o Configurable Message Reliability: the "Lifetime" Message Property | |||
implements a time-based way to configure message reliability | implements a time-based way to configure message reliability | |||
(Section 8.1.3.1). | (Section 7.1.3.1). | |||
* "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)": | |||
these two transport features are controlled via the Message | these two transport features are controlled via the Message | |||
Property "Ordered" (Section 8.1.3.3). | Property "Ordered" (Section 7.1.3.3). | |||
* 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 apply when an application uses | features the Transport Services system can apply when an | |||
the "Capacity Profile" Property (Section 7.1.6) or the "Message | application uses the "Capacity Profile" Property (Section 6.1.6) | |||
Capacity Profile Override" Message Property (Section 8.1.3.8) with | or the "Message Capacity Profile Override" Message Property | |||
value "Low Latency/Interactive". | (Section 7.1.3.8) with value "Low Latency/Interactive". | |||
* Receive data (with no message delimiting): "Received" Event | o Receive data (with no message delimiting): "Received" Event | |||
(Section 8.3.2.1). See Section 8.1.2 for handling Message framing | (Section 7.3.2.1). See Section 7.1.2 for handling Message framing | |||
in situations where the Protocol Stack only provides a byte-stream | in situations where the Protocol Stack only provides a byte-stream | |||
transport. | transport. | |||
* Receive a message: "Received" Event (Section 8.3.2.1), using | o Receive a message: "Received" Event (Section 7.3.2.1), using | |||
Message Framers (Section 8.1.2). | Message Framers (Section 7.1.2). | |||
* Information about partial message arrival: "ReceivedPartial" Event | o Information about partial message arrival: "ReceivedPartial" Event | |||
(Section 8.3.2.2). | (Section 7.3.2.2). | |||
* Notification of send failures: "Expired" Event (Section 8.2.2.2) | o Notification of send failures: "Expired" Event (Section 7.2.2.2) | |||
and "SendError" Event (Section 8.2.2.3). | and "SendError" Event (Section 7.2.2.3). | |||
* 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 | |||
(Section 8.2.2.1). | (Section 7.2.2.1). | |||
* Notification to a receiver that a partial message delivery has | o Notification to a receiver that a partial message delivery has | |||
been aborted: "ReceiveError" Event (Section 8.3.2.3). | been aborted: "ReceiveError" Event (Section 7.3.2.3). | |||
Authors' Addresses | Authors' Addresses | |||
Brian Trammell (editor) | Brian Trammell (editor) | |||
Google Switzerland GmbH | Google Switzerland GmbH | |||
Gustav-Gull-Platz 1 | Gustav-Gull-Platz 1 | |||
CH- 8004 Zurich | 8004 Zurich | |||
Switzerland | Switzerland | |||
Email: ietf@trammell.ch | Email: ietf@trammell.ch | |||
Michael Welzl (editor) | Michael Welzl (editor) | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
0316 Oslo | 0316 Oslo | |||
Norway | Norway | |||
Email: michawe@ifi.uio.no | Email: michawe@ifi.uio.no | |||
Theresa Enghardt | Theresa Enghardt | |||
Netflix | Netflix | |||
skipping to change at page 78, line 15 ¶ | skipping to change at page 79, line 26 ¶ | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
0316 Oslo | 0316 Oslo | |||
Norway | Norway | |||
Email: michawe@ifi.uio.no | Email: michawe@ifi.uio.no | |||
Theresa Enghardt | Theresa Enghardt | |||
Netflix | Netflix | |||
121 Albright Way | 121 Albright Way | |||
Los Gatos, CA 95032, | Los Gatos, CA 95032 | |||
United States of America | United States of America | |||
Email: ietf@tenghardt.net | Email: ietf@tenghardt.net | |||
Godred Fairhurst | Godred Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
Fraser Noble Building | Fraser Noble Building | |||
Aberdeen, AB24 3UE | Aberdeen, AB24 3UE | |||
Scotland | ||||
Email: gorry@erg.abdn.ac.uk | Email: gorry@erg.abdn.ac.uk | |||
URI: http://www.erg.abdn.ac.uk/ | URI: http://www.erg.abdn.ac.uk/ | |||
Mirja Kuehlewind | Mirja Kuehlewind | |||
Ericsson | Ericsson | |||
Ericsson-Allee 1 | Ericsson-Allee 1 | |||
Herzogenrath | Herzogenrath | |||
Germany | Germany | |||
skipping to change at page 79, line 12 ¶ | skipping to change at page 80, line 23 ¶ | |||
TU Berlin | TU Berlin | |||
Einsteinufer 25 | Einsteinufer 25 | |||
10587 Berlin | 10587 Berlin | |||
Germany | Germany | |||
Email: philipp@tiesel.net | Email: philipp@tiesel.net | |||
Christopher A. Wood | Christopher A. Wood | |||
Cloudflare | Cloudflare | |||
101 Townsend St | 101 Townsend St | |||
San Francisco, | San Francisco | |||
United States of America | United States of America | |||
Email: caw@heapingbits.net | Email: caw@heapingbits.net | |||
Tommy Pauly | Tommy Pauly | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014, | Cupertino, California 95014 | |||
United States of America | United States of America | |||
Email: tpauly@apple.com | Email: tpauly@apple.com | |||
Kyle Rose | ||||
Akamai Technologies, Inc. | ||||
145 Broadway | ||||
Cambridge, MA | ||||
United States of America | ||||
Email: krose@krose.org | ||||
End of changes. 426 change blocks. | ||||
794 lines changed or deleted | 881 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |