rfc9622.original | rfc9622.txt | |||
---|---|---|---|---|
TAPS Working Group B. Trammell, Ed. | Internet Engineering Task Force (IETF) B. Trammell, Ed. | |||
Internet-Draft Google Switzerland GmbH | Request for Comments: 9622 Google Switzerland GmbH | |||
Intended status: Standards Track M. Welzl, Ed. | Category: Standards Track M. Welzl, Ed. | |||
Expires: 18 September 2024 University of Oslo | ISSN: 2070-1721 University of Oslo | |||
R. Enghardt | R. Enghardt | |||
Netflix | Netflix | |||
G. Fairhurst | G. Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
M. Kuehlewind | M. Kühlewind | |||
Ericsson | Ericsson | |||
C. Perkins | C. S. Perkins | |||
University of Glasgow | University of Glasgow | |||
P. Tiesel | P.S. Tiesel | |||
SAP SE | SAP SE | |||
T. Pauly | T. Pauly | |||
Apple Inc. | Apple Inc. | |||
17 March 2024 | December 2024 | |||
An Abstract Application Layer Interface to Transport Services | An Abstract Application Programming Interface (API) for Transport | |||
draft-ietf-taps-interface-26 | Services | |||
Abstract | Abstract | |||
This document describes an abstract application programming | This document describes an abstract Application Programming Interface | |||
interface, API, to the transport layer that enables the selection of | (API) to the transport layer that enables the selection of transport | |||
transport protocols and network paths dynamically at runtime. This | protocols and network paths dynamically at runtime. This API enables | |||
API enables faster deployment of new protocols and protocol features | faster deployment of new protocols and protocol features without | |||
without requiring changes to the applications. The specified API | requiring changes to the applications. The specified API follows the | |||
follows the Transport Services architecture by providing | Transport Services architecture by providing asynchronous, atomic | |||
asynchronous, atomic transmission of messages. It is intended to | transmission of messages. It is intended to replace the BSD Socket | |||
replace the BSD sockets API as the common interface to the transport | API as the common interface to the transport layer, in an environment | |||
layer, in an environment where endpoints could select from multiple | where endpoints could select from multiple network paths and | |||
network paths and potential transport protocols. | potential transport protocols. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 18 September 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9622. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2024 IETF Trust and the persons identified as the | Copyright (c) 2024 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 Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction | |||
1.1. Terminology and Notation . . . . . . . . . . . . . . . . 5 | 1.1. Terminology and Notation | |||
1.2. Specification of Requirements . . . . . . . . . . . . . . 7 | 1.2. Specification of Requirements | |||
2. Overview of the API Design . . . . . . . . . . . . . . . . . 7 | 2. Overview of the API Design | |||
3. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 3. API Summary | |||
3.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Usage Examples | |||
3.1.1. Server Example . . . . . . . . . . . . . . . . . . . 10 | 3.1.1. Server Example | |||
3.1.2. Client Example . . . . . . . . . . . . . . . . . . . 11 | 3.1.2. Client Example | |||
3.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 13 | 3.1.3. Peer Example | |||
4. Transport Properties . . . . . . . . . . . . . . . . . . . . 14 | 4. Transport Properties | |||
4.1. Transport Property Names . . . . . . . . . . . . . . . . 15 | 4.1. Transport Property Names | |||
4.2. Transport Property Types . . . . . . . . . . . . . . . . 16 | 4.2. Transport Property Types | |||
5. Scope of the API Definition . . . . . . . . . . . . . . . . . 17 | 5. Scope of the API Definition | |||
6. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 18 | 6. Preestablishment Phase | |||
6.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 19 | 6.1. Specifying Endpoints | |||
6.1.1. Using Multicast Endpoints . . . . . . . . . . . . . . 21 | 6.1.1. Using Multicast Endpoints | |||
6.1.2. Constraining Interfaces for Endpoints . . . . . . . . 23 | 6.1.2. Constraining Interfaces for Endpoints | |||
6.1.3. Protocol-Specific Endpoints . . . . . . . . . . . . . 23 | 6.1.3. Protocol-Specific Endpoints | |||
6.1.4. Endpoint Examples . . . . . . . . . . . . . . . . . . 24 | 6.1.4. Endpoint Examples | |||
6.1.5. Multicast Examples . . . . . . . . . . . . . . . . . 25 | 6.1.5. Multicast Examples | |||
6.2. Specifying Transport Properties . . . . . . . . . . . . . 27 | 6.2. Specifying Transport Properties | |||
6.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 30 | 6.2.1. Reliable Data Transfer (Connection) | |||
6.2.2. Preservation of Message Boundaries . . . . . . . . . 30 | 6.2.2. Preservation of Message Boundaries | |||
6.2.3. Configure Per-Message Reliability . . . . . . . . . . 30 | 6.2.3. Configure Per-Message Reliability | |||
6.2.4. Preservation of Data Ordering . . . . . . . . . . . . 31 | 6.2.4. Preservation of Data Ordering | |||
6.2.5. Use 0-RTT Session Establishment with a Safely | 6.2.5. Use 0-RTT Session Establishment with a Safely | |||
Replayable Message . . . . . . . . . . . . . . . . . 31 | Replayable Message | |||
6.2.6. Multistream Connections in Group . . . . . . . . . . 31 | 6.2.6. Multistream Connections in a Group | |||
6.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 31 | 6.2.7. Full Checksum Coverage on Sending | |||
6.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 32 | 6.2.8. Full Checksum Coverage on Receiving | |||
6.2.9. Congestion control . . . . . . . . . . . . . . . . . 32 | 6.2.9. Congestion Control | |||
6.2.10. Keep alive . . . . . . . . . . . . . . . . . . . . . 32 | 6.2.10. Keep-Alive Packets | |||
6.2.11. Interface Instance or Type . . . . . . . . . . . . . 33 | 6.2.11. Interface Instance or Type | |||
6.2.12. Provisioning Domain Instance or Type . . . . . . . . 34 | 6.2.12. Provisioning Domain Instance or Type | |||
6.2.13. Use Temporary Local Address . . . . . . . . . . . . . 35 | 6.2.13. Use Temporary Local Address | |||
6.2.14. Multipath Transport . . . . . . . . . . . . . . . . . 35 | 6.2.14. Multipath Transport | |||
6.2.15. Advertisement of Alternative Addresses . . . . . . . 36 | 6.2.15. Advertisement of Alternative Addresses | |||
6.2.16. Direction of communication . . . . . . . . . . . . . 36 | 6.2.16. Direction of Communication | |||
6.2.17. Notification of ICMP soft error message arrival . . . 37 | 6.2.17. Notification of ICMP Soft Error Message Arrival | |||
6.2.18. Initiating side is not the first to write . . . . . . 37 | 6.2.18. Initiating Side Is Not the First to Write | |||
6.3. Specifying Security Parameters and Callbacks . . . . . . 38 | 6.3. Specifying Security Parameters and Callbacks | |||
6.3.1. Allowed security protocols . . . . . . . . . . . . . 39 | 6.3.1. Allowed Security Protocols | |||
6.3.2. Certificate bundles . . . . . . . . . . . . . . . . . 40 | 6.3.2. Certificate Bundles | |||
6.3.3. Pinned server certificate . . . . . . . . . . . . . . 40 | 6.3.3. Pinned Server Certificate | |||
6.3.4. Application-layer protocol negotiation . . . . . . . 40 | 6.3.4. Application-Layer Protocol Negotiation | |||
6.3.5. Groups, ciphersuites, and signature algorithms . . . 41 | 6.3.5. Groups, Ciphersuites, and Signature Algorithms | |||
6.3.6. Session cache options . . . . . . . . . . . . . . . . 41 | 6.3.6. Session Cache Options | |||
6.3.7. Pre-shared key . . . . . . . . . . . . . . . . . . . 41 | 6.3.7. Pre-Shared Key | |||
6.3.8. Connection Establishment Callbacks . . . . . . . . . 42 | 6.3.8. Connection Establishment Callbacks | |||
7. Establishing Connections . . . . . . . . . . . . . . . . . . 42 | 7. Establishing Connections | |||
7.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 43 | 7.1. Active Open: Initiate | |||
7.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 44 | 7.2. Passive Open: Listen | |||
7.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 45 | 7.3. Peer-to-Peer Establishment: Rendezvous | |||
7.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 47 | 7.4. Connection Groups | |||
7.5. Adding and Removing Endpoints on a Connection . . . . . . 49 | 7.5. Adding and Removing Endpoints on a Connection | |||
8. Managing Connections . . . . . . . . . . . . . . . . . . . . 50 | 8. Managing Connections | |||
8.1. Generic Connection Properties . . . . . . . . . . . . . . 51 | 8.1. Generic Connection Properties | |||
8.1.1. Required Minimum Corruption Protection Coverage for | 8.1.1. Required Minimum Corruption Protection Coverage for | |||
Receiving . . . . . . . . . . . . . . . . . . . . . . 52 | Receiving | |||
8.1.2. Connection Priority . . . . . . . . . . . . . . . . . 52 | 8.1.2. Connection Priority | |||
8.1.3. Timeout for Aborting Connection . . . . . . . . . . . 52 | 8.1.3. Timeout for Aborting Connection | |||
8.1.4. Timeout for keep alive packets . . . . . . . . . . . 53 | 8.1.4. Timeout for Keep-Alive Packets | |||
8.1.5. Connection Group Transmission Scheduler . . . . . . . 53 | 8.1.5. Connection Group Transmission Scheduler | |||
8.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 53 | 8.1.6. Capacity Profile | |||
8.1.7. Policy for using Multipath Transports . . . . . . . . 55 | 8.1.7. Policy for Using Multipath Transports | |||
8.1.8. Bounds on Send or Receive Rate . . . . . . . . . . . 56 | 8.1.8. Bounds on Send or Receive Rate | |||
8.1.9. Group Connection Limit . . . . . . . . . . . . . . . 56 | 8.1.9. Group Connection Limit | |||
8.1.10. Isolate Session . . . . . . . . . . . . . . . . . . . 57 | 8.1.10. Isolate Session | |||
8.1.11. Read-only Connection Properties . . . . . . . . . . . 57 | 8.1.11. Read-Only Connection Properties | |||
8.2. TCP-specific Properties: User Timeout Option (UTO) . . . 59 | 8.2. TCP-Specific Properties: User Timeout Option (UTO) | |||
8.2.1. Advertised User Timeout . . . . . . . . . . . . . . . 59 | 8.2.1. Advertised User Timeout | |||
8.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 60 | 8.2.2. User Timeout Enabled | |||
8.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 60 | 8.2.3. Timeout Changeable | |||
8.3. Connection Lifecycle Events | ||||
8.3. Connection Lifecycle Events . . . . . . . . . . . . . . . 60 | 8.3.1. Soft Errors | |||
8.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . . 60 | 8.3.2. Path Change | |||
8.3.2. Path change . . . . . . . . . . . . . . . . . . . . . 60 | 9. Data Transfer | |||
9. Data Transfer . . . . . . . . . . . . . . . . . . . . . . . . 61 | 9.1. Messages and Framers | |||
9.1. Messages and Framers . . . . . . . . . . . . . . . . . . 61 | 9.1.1. Message Contexts | |||
9.1.1. Message Contexts . . . . . . . . . . . . . . . . . . 61 | 9.1.2. Message Framers | |||
9.1.2. Message Framers . . . . . . . . . . . . . . . . . . . 61 | 9.1.3. Message Properties | |||
9.1.3. Message Properties . . . . . . . . . . . . . . . . . 64 | 9.2. Sending Data | |||
9.2. Sending Data . . . . . . . . . . . . . . . . . . . . . . 70 | 9.2.1. Basic Sending | |||
9.2.1. Basic Sending . . . . . . . . . . . . . . . . . . . . 70 | 9.2.2. Send Events | |||
9.2.2. Send Events . . . . . . . . . . . . . . . . . . . . . 71 | 9.2.3. Partial Sends | |||
9.2.3. Partial Sends . . . . . . . . . . . . . . . . . . . . 72 | 9.2.4. Batching Sends | |||
9.2.4. Batching Sends . . . . . . . . . . . . . . . . . . . 73 | 9.2.5. Send on Active Open: InitiateWithSend | |||
9.2.5. Send on Active Open: InitiateWithSend . . . . . . . . 73 | 9.2.6. Priority and the Transport Services API | |||
9.2.6. Priority and the Transport Services API . . . . . . . 74 | 9.3. Receiving Data | |||
9.3. Receiving Data . . . . . . . . . . . . . . . . . . . . . 74 | 9.3.1. Enqueuing Receives | |||
9.3.1. Enqueuing Receives . . . . . . . . . . . . . . . . . 75 | 9.3.2. Receive Events | |||
9.3.2. Receive Events . . . . . . . . . . . . . . . . . . . 75 | 9.3.3. Receive Message Properties | |||
9.3.3. Receive Message Properties . . . . . . . . . . . . . 78 | 10. Connection Termination | |||
10. Connection Termination . . . . . . . . . . . . . . . . . . . 80 | 11. Connection State and Ordering of Operations and Events | |||
11. Connection State and Ordering of Operations and Events . . . 81 | 12. IANA Considerations | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 83 | 13. Privacy and Security Considerations | |||
13. Privacy and Security Considerations . . . . . . . . . . . . . 83 | 14. References | |||
14. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 85 | 14.1. Normative References | |||
15. References . . . . . . . . . . . . . . . . . . . . . . . . . 85 | 14.2. Informative References | |||
15.1. Normative References . . . . . . . . . . . . . . . . . . 85 | Appendix A. Implementation Mapping | |||
15.2. Informative References . . . . . . . . . . . . . . . . . 86 | A.1. Types | |||
Appendix A. Implementation Mapping . . . . . . . . . . . . . . . 90 | A.2. Events and Errors | |||
A.1. Types . . . . . . . . . . . . . . . . . . . . . . . . . . 90 | A.3. Time Duration | |||
A.2. Events and Errors . . . . . . . . . . . . . . . . . . . . 91 | Appendix B. Convenience Functions | |||
A.3. Time Duration . . . . . . . . . . . . . . . . . . . . . . 91 | B.1. Adding Preference Properties | |||
Appendix B. Convenience Functions . . . . . . . . . . . . . . . 91 | B.2. Transport Property Profiles | |||
B.1. Adding Preference Properties . . . . . . . . . . . . . . 91 | B.2.1. reliable-inorder-stream | |||
B.2. Transport Property Profiles . . . . . . . . . . . . . . . 92 | B.2.2. reliable-message | |||
B.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 92 | B.2.3. unreliable-datagram | |||
B.2.2. reliable-message . . . . . . . . . . . . . . . . . . 92 | ||||
B.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 93 | ||||
Appendix C. Relationship to the Minimal Set of Transport Services | Appendix C. Relationship to the Minimal Set of Transport Services | |||
for End Systems . . . . . . . . . . . . . . . . . . . . . 94 | for End Systems | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 97 | Acknowledgements | |||
Authors' Addresses | ||||
1. Introduction | 1. Introduction | |||
This document specifies an abstract application programming interface | This document specifies an abstract Application Programming Interface | |||
(API) that describes the interface component of the high-level | (API) that describes the interface component of the high-level | |||
Transport Services architecture defined in [I-D.ietf-taps-arch]. A | Transport Services architecture defined in [RFC9621]. A Transport | |||
Transport Services system supports asynchronous, atomic transmission | Services system supports asynchronous, atomic transmission of | |||
of messages over transport protocols and network paths dynamically | messages over transport protocols and network paths dynamically | |||
selected at runtime, in environments where an endpoint selects from | selected at runtime, in environments where an endpoint selects from | |||
multiple network paths and potential transport protocols. | multiple network paths and potential transport protocols. | |||
Applications that adopt this API will benefit from a wide set of | Applications that adopt this API will benefit from a wide set of | |||
transport features that can evolve over time. This protocol- | transport features that can evolve over time. This protocol- | |||
independent API ensures that the system providing the API can | independent API ensures that the system providing the API can | |||
optimize its behavior based on the application requirements and | optimize its behavior based on the application requirements and | |||
network conditions, without requiring changes to the applications. | network conditions, without requiring changes to the applications. | |||
This flexibility enables faster deployment of new features and | This flexibility enables faster deployment of new features and | |||
protocols, and can support applications by offering racing and | protocols and can support applications by offering racing and | |||
fallback mechanisms, which otherwise need to be separately | fallback mechanisms, which otherwise need to be separately | |||
implemented in each application. Transport Services Implementations | implemented in each application. Transport Services Implementations | |||
are free to take any desired form as long as the API specification in | are free to take any desired form as long as the API specification in | |||
this document is honored; a nonprescriptive guide to implementing a | this document is honored; a non-prescriptive guide to implementing a | |||
Transport Services system is available [I-D.ietf-taps-impl]. | Transport Services system is available (see [RFC9623]). | |||
The Transport Services system derives specific path and protocol | The Transport Services system derives specific path and Protocol | |||
selection properties and supported transport features from the | Selection Properties and supported transport features from the | |||
analysis provided in [RFC8095], [RFC8923], and [RFC8922]. The | analysis provided in [RFC8095], [RFC8923], and [RFC8922]. The | |||
Transport Services API enables an implementation to dynamically | Transport Services API enables an implementation to dynamically | |||
choose a transport protocol rather than statically binding | choose a transport protocol rather than statically binding | |||
applications to a protocol at compile time. The Transport Services | applications to a protocol at compile time. The Transport Services | |||
API also provides applications with a way to override transport | API also provides applications with a way to override transport | |||
selection and instantiate a specific stack, e.g., to support servers | selection and instantiate a specific stack, e.g., to support servers | |||
wishing to listen to a specific protocol. However, forcing a choice | wishing to listen to a specific protocol. However, forcing a choice | |||
to use a specific transport stack is discouraged for general use, | to use a specific transport stack is discouraged for general use | |||
because it can reduce portability. | because it can reduce portability. | |||
1.1. Terminology and Notation | 1.1. Terminology and Notation | |||
The Transport Services API is described in terms of | The Transport Services API is described in terms of: | |||
* Objects with which an application can interact; | * Objects with which an application can interact; | |||
* Actions the application can perform on these objects; | * Actions the application can perform on these objects; | |||
* Events, which an object can send to an application to be processed | * Events, which an object can send to an application to be processed | |||
asynchronously; and | asynchronously; and | |||
* Parameters associated with these actions and events. | * Parameters associated with these actions and events. | |||
skipping to change at page 6, line 24 ¶ | skipping to change at line 248 ¶ | |||
[]Object := Action() | []Object := Action() | |||
* An action that is performed on an object: | * An action that is performed on an object: | |||
Object.Action() | Object.Action() | |||
* An object sends an event: | * An object sends an event: | |||
Object -> Event<> | Object -> Event<> | |||
* An action takes a set of Parameters; an event contains a set of | * 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?, ...) | Action(param0, param1?, ...) | |||
Event<param0, param1?, ...> | Event<param0, param1?, ...> | |||
Objects that are passed as parameters to actions use call-by-value | Objects that are passed as parameters to actions use call-by-value | |||
behavior. Actions associated with no object are actions on the API; | behavior. Actions not associated with an object are actions on the | |||
they are equivalent to actions on a per-application global context. | API; they are equivalent to actions on a per-application global | |||
context. | ||||
Events are sent to the application or application-supplied code (e.g. | Events are sent to the application or application-supplied code | |||
framers, see Section 9.1.2) for processing; the details of event | (e.g., framers; see Section 9.1.2) for processing; the details of | |||
interfaces are platform- and implementation-specific, and can be | event interfaces are specific to the platform or implementation and | |||
implemented using other forms of asynchronous processing, as | can be implemented using other forms of asynchronous processing, as | |||
idiomatic for the implementing platform. | idiomatic for the implementing platform. | |||
We also make use of the following basic types: | We also make use of the following basic types: | |||
* Boolean: Instances take the value true or false. | Boolean: Instances take the value true or false. | |||
* Integer: Instances take integer values. | Integer: Instances take integer values. | |||
* Numeric: Instances take real number values. | Numeric: Instances take real number values. | |||
* String: Instances are represented in UTF-8. | String: Instances are represented in UTF-8. | |||
* IP Address: An IPv4 [RFC791] or IPv6 [RFC4291] address. | IP Address: An IPv4 address [RFC791] or IPv6 address [RFC4291]. | |||
* Enumeration: A family of types in which each instance takes one of | Enumeration: A family of types in which each instance takes one of a | |||
a fixed, predefined set of values specific to a given enumerated | fixed, predefined set of values specific to a given enumerated | |||
type. | type. | |||
* Tuple: An ordered grouping of multiple value types, represented as | Tuple: An ordered grouping of multiple value types, represented as a | |||
a comma-separated list in parentheses, e.g., (Enumeration, | comma-separated list in parentheses, e.g., (Enumeration, | |||
Preference). Instances take a sequence of values each valid for | Preference). Instances take a sequence of values, each valid for | |||
the corresponding value type. | the corresponding value type. | |||
* Array: Denoted []Type, an instance takes a value for each of zero | Array: Denoted []Type, an instance takes a value for each of zero or | |||
or more elements in a sequence of the given Type. An array can be | more elements in a sequence of the given Type. An array can be of | |||
of fixed or variable length. | fixed or variable length. | |||
* Set: An unordered grouping of one or more different values of the | Set: An unordered grouping of one or more different values of the | |||
same type. | same type. | |||
For guidance on how these abstract concepts can be implemented in | For guidance on how these abstract concepts can be implemented in | |||
languages in accordance with language-specific design patterns and | languages in accordance with language-specific design patterns and | |||
platform features, see Appendix A. | platform features, see Appendix A. | |||
1.2. Specification of Requirements | 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 | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
2. Overview of the API Design | 2. Overview of the API Design | |||
The design of the API specified in this document is based on a set of | The design of the API specified in this document is based on a set of | |||
principles, themselves an elaboration on the architectural design | principles, themselves an elaboration on the architectural design | |||
principles defined in [I-D.ietf-taps-arch]. The API defined in this | principles defined in [RFC9621]. The API defined in this document | |||
document provides: | provides: | |||
* A Transport Services system that can offer a variety of transport | * A Transport Services system that can offer a variety of transport | |||
protocols, independent of the Protocol Stacks that will be used at | protocols, independent of the Protocol Stacks that will be used at | |||
runtime. To the degree possible, all common features of these | runtime. To the degree possible, all common features of these | |||
protocol stacks are made available to the application in a | Protocol Stacks are made available to the application in a | |||
transport-independent way. This enables applications written to a | transport-independent way. This enables applications written for | |||
single API to make use of transport protocols in terms of the | a single API to make use of transport protocols in terms of the | |||
features they provide. | features they provide. | |||
* A unified API to datagram and stream-oriented transports, allowing | * A unified API to datagram and stream-oriented transports, allowing | |||
use of a common API for Connection establishment and closing. | the use of a common API for Connection establishment and closing. | |||
* Message-orientation, as opposed to stream-orientation, using | * 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 itself provide the required framing. | |||
* Asynchronous Connection establishment, transmission, and | * Asynchronous Connection establishment, transmission, and | |||
reception. This allows concurrent operations during establishment | reception. This allows concurrent operations during establishment | |||
and event-driven application interactions with the transport | and event-driven application interactions with the transport | |||
layer. | layer. | |||
* Selection between alternate network paths, using additional | * Selection between alternate network paths, using additional | |||
information about the networks over which a Connection can operate | information about the networks over which a Connection can operate | |||
(e.g. Provisioning Domain (PvD) information [RFC7556]) where | (e.g., Provisioning Domain (PvD) information [RFC7556]) where | |||
available. | available. | |||
* Explicit support for transport-specific features to be applied, | * Explicit support for transport-specific features to be applied, | |||
when that particular transport is part of a chosen Protocol Stack. | when that particular transport is part of a chosen Protocol Stack. | |||
* Explicit support for security properties as first-order transport | * Explicit support for security properties as first-order transport | |||
features. | features. | |||
* Explicit support for configuration of cryptographic identities and | * Explicit support for configuration of cryptographic identities and | |||
transport security parameters persistent across multiple | transport security parameters persistent across multiple | |||
skipping to change at page 8, line 44 ¶ | skipping to change at line 363 ¶ | |||
3. API Summary | 3. API Summary | |||
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 object (Section 6) | Preconnections and Connections. A Preconnection object (Section 6) | |||
represents a set of properties and constraints on the selection and | represents a set of properties and constraints on the selection and | |||
configuration of paths and protocols to establish a Connection with | configuration of paths and protocols to establish a Connection with | |||
an Endpoint. A Connection object represents an instance of a | an Endpoint. A Connection object represents an instance of a | |||
transport Protocol Stack on which data can be sent to and/or received | transport Protocol Stack on which data can be sent to and/or received | |||
from a Remote Endpoint (i.e., a logical connection that, depending on | from a Remote Endpoint (i.e., a logical connection that, depending on | |||
the kind of transport, can be bi-directional or unidirectional, and | the kind of transport, can be bidirectional or unidirectional, and | |||
that can use a stream protocol or a datagram protocol). Connections | that can use a stream protocol or a datagram protocol). Connections | |||
are presented consistently to the application, irrespective of | are presented consistently to the application, irrespective of | |||
whether the underlying transport is connection-less or connection- | whether the underlying transport is connectionless or connection | |||
oriented. Connections can be created from Preconnections in three | oriented. Connections can be created from Preconnections in three | |||
ways: | ways: | |||
* by initiating the Preconnection (i.e., creating a Connection from | * initiating the Preconnection (i.e., creating a Connection from the | |||
the Preconnection, actively opening, as in a client; see | Preconnection, actively opening, as in a client; see Initiate() in | |||
Initiate() in Section 7.1), | Section 7.1), | |||
* by listening on the Preconnection (i.e., creating a Listener based | * listening on the Preconnection (i.e., creating a Listener based on | |||
on the Preconnection, passively opening, as in a server; see | the Preconnection, passively opening, as in a server; see Listen() | |||
Listen() in Section 7.2), | in Section 7.2), or | |||
* or by a rendezvous for the Preconnection (i.e., peer to peer | * a rendezvous for the Preconnection (i.e., peer-to-peer connection | |||
establishment; see Rendezvous() in Section 7.3). | establishment; see Rendezvous() in Section 7.3). | |||
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 API supports the preservation of | in the form of Messages. The API supports the preservation of | |||
message boundaries both via explicit Protocol Stack support, and via | message boundaries via both explicit Protocol Stack support and | |||
application support through a Message Framer that finds message | application support through a Message Framer that 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 | |||
can have implementation-specific default handlers. | can have implementation-specific default handlers. | |||
The application SHOULD NOT assume that ignoring events (e.g., errors) | The application SHOULD NOT assume that ignoring events (e.g., errors) | |||
is always safe. | is always safe. | |||
3.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 | |||
the Transport Services API to: | the Transport Services API to act as: | |||
* Act as a server, by listening for incoming Connections, receiving | * a server, by listening for incoming Connections, receiving | |||
requests, and sending responses, see Section 3.1.1. | requests, and sending responses; see Section 3.1.1. | |||
* Act as a client, by connecting to a Remote Endpoint using | * a client, by connecting to a Remote Endpoint using Initiate, | |||
Initiate, sending requests, and receiving responses, see | sending requests, and receiving responses; see Section 3.1.2. | |||
Section 3.1.2. | ||||
* Act as a peer, by connecting to a Remote Endpoint using Rendezvous | * a peer, by connecting to a Remote Endpoint using Rendezvous while | |||
while simultaneously waiting for incoming Connections, sending | simultaneously waiting for incoming Connections, sending Messages, | |||
Messages, and receiving Messages, see Section 3.1.3. | 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 and that this | |||
Reliable Data Transfer, Preservation of Data Ordering, and | protocol provides reliable data transfer, preservation of data | |||
Preservation of Message Boundaries. In this case, the application | ordering, and preservation of message boundaries. In this case, the | |||
can choose to receive only complete Messages. | application can choose to receive only complete Messages. | |||
If none of the available transport protocols provides Preservation of | If none of the available transport protocols provide 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 9.1.2). | and vice versa (Section 9.1.2). | |||
3.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 API, receive a request, and | Connections using the Transport Services API, receive a request, and | |||
send a response. | 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(preserveMsgBoundaries) | TransportProperties.Require(preserveMsgBoundaries) | |||
// 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(serverCertificate, myCertificate) | SecurityParameters.Set(serverCertificate, myCertificate) | |||
// 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() | |||
skipping to change at page 11, line 8 ¶ | skipping to change at line 466 ¶ | |||
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 ---- | |||
3.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 API, and send a | to a remote application using the Transport Services API, send a | |||
request as well as receive a response on each of them. The code | request, and receive a response for each of the two Connections. The | |||
designated with comments as "Ready event handler" could, e.g., be | code designated with comments as "Ready event handler" could, for | |||
implemented as a callback function, for example. This function would | example, be implemented as a callback function. This function would | |||
receive the Connection that it expects to operate on ("Connection" | receive the Connection that it expects to operate on ("Connection" | |||
and "Connection2" in the example), handed over using the variable | and "Connection2" in the example) handed over using the variable name | |||
name "C". | "C". | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostName("example.com") | RemoteSpecifier.WithHostName("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.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() | |||
TrustCallback := NewCallback({ | TrustCallback := NewCallback({ | |||
// Verify identity of the Remote Endpoint, return the result | // Verify the identity of the Remote Endpoint and return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(TrustCallback) | SecurityParameters.SetTrustVerificationCallback(TrustCallback) | |||
// Specifying a Local Endpoint is optional when using Initiate | // Specifying a Local Endpoint is optional when using Initiate | |||
Preconnection := NewPreconnection(RemoteSpecifier, | Preconnection := NewPreconnection(RemoteSpecifier, | |||
TransportProperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
Connection := Preconnection.Initiate() | Connection := Preconnection.Initiate() | |||
Connection2 := Connection.Clone() | Connection2 := Connection.Clone() | |||
skipping to change at page 12, line 48 ¶ | skipping to change at line 517 ¶ | |||
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() | |||
A Preconnection serves as a template for creating a Connection via | A Preconnection serves as a template for creating a Connection via | |||
initiating, listening, or via rendezvous. Once a Connection has been | initiating, listening, or via rendezvous. Once a Connection has been | |||
created, changes made to the Preconnection that was used to create it | created, changes made to the Preconnection that was used to create it | |||
do not affect this Connection. Preconnections are reusable after | do not affect this Connection. Preconnections are reusable after | |||
being used to create a Connection, whether this Connection was closed | being used to create a Connection, whether or not this Connection was | |||
or not. Hence, in the above example, it would be correct for the | closed. Hence, in the above example, it would be correct for the | |||
client to initiate a third Connection to the example.com server by | client to initiate a third Connection to the example.com server by | |||
continuing as follows: | continuing as follows: | |||
//.. carry out adjustments to the Preconnection, if desired | //.. carry out adjustments to the Preconnection, if desired | |||
Connection3 := Preconnection.Initiate() | Connection3 := Preconnection.Initiate() | |||
3.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 Message. | with a peer using Rendezvous, send a Message, and receive a Message. | |||
// Configure local candidates: a port on the Local Endpoint | // Configure local candidates: a port on the Local Endpoint | |||
// and via a STUN server | // and via a Session Traversal Utilities for NAT (STUN) server | |||
HostCandidate := NewLocalEndpoint() | HostCandidate := NewLocalEndpoint() | |||
HostCandidate.WithPort(9876) | HostCandidate.WithPort(9876) | |||
StunCandidate := NewLocalEndpoint() | StunCandidate := NewLocalEndpoint() | |||
StunCandidate.WithStunServer(address, port, credentials) | StunCandidate.WithStunServer(address, port, credentials) | |||
LocalCandidates = [HostCandidate, StunCandidate] | LocalCandidates = [HostCandidate, StunCandidate] | |||
TransportProperties := // ...Configure transport properties | TransportProperties := // ...Configure transport properties | |||
SecurityParameters := // ...Configure security properties | SecurityParameters := // ...Configure security properties | |||
Preconnection := NewPreconnection(LocalCandidates, | Preconnection := NewPreconnection(LocalCandidates, | |||
[], // No remote candidates yet | [], // No remote candidates yet | |||
TransportProperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
// Resolve the LocalCandidates. The Preconnection.Resolve() | // Resolve the LocalCandidates. The Preconnection.Resolve() | |||
// call resolves both local and remote candidates but, since | // call resolves both local and remote candidates; however, | |||
// the remote candidates have not yet been specified, the | // because the remote candidates have not yet been specified, | |||
// ResolvedRemote list returned will be empty and is not | // the ResolvedRemote list returned will be empty and is not | |||
// used. | // used. | |||
ResolvedLocal, ResolvedRemote = Preconnection.Resolve() | ResolvedLocal, ResolvedRemote = Preconnection.Resolve() | |||
// Application-specific code goes here to send the ResolvedLocal | // Application-specific code goes here to send the ResolvedLocal | |||
// list to peer via some out-of-band signalling channel (e.g., | // list to the peer via some out-of-band signaling channel (e.g., | |||
// in a SIP message) | // in a SIP message). | |||
... | ... | |||
// Application-specific code goes here to receive RemoteCandidates | // Application-specific code goes here to receive RemoteCandidates | |||
// (type []RemoteEndpoint, a list of RemoteEndpoint objects) from | // (type []RemoteEndpoint, a list of RemoteEndpoint objects) from | |||
// the peer via the signalling channel | // the peer via the signaling channel. | |||
... | ... | |||
// Add remote candidates and initiate the rendezvous: | // Add remote candidates and initiate the rendezvous: | |||
Preconnection.AddRemote(RemoteCandidates) | Preconnection.AddRemote(RemoteCandidates) | |||
Preconnection.Rendezvous() | Preconnection.Rendezvous() | |||
Preconnection -> RendezvousDone<Connection> | Preconnection -> RendezvousDone<Connection> | |||
//---- RendezvousDone event handler begin ---- | //---- RendezvousDone event handler begin ---- | |||
Connection.Send(messageDataRequest) | Connection.Send(messageDataRequest) | |||
Connection.Receive() | Connection.Receive() | |||
//---- RendezvousDone event handler end ---- | //---- RendezvousDone event handler end ---- | |||
Connection -> Received<messageDataResponse, messageContext> | Connection -> Received<messageDataResponse, messageContext> | |||
// If new Remote Endpoint candidates are received from the | // If new Remote Endpoint candidates are received from the | |||
// peer over the signalling channel, for example if using | // peer over the signaling channel -- for example, if using | |||
// Trickle ICE, then add them to the Connection: | // Trickle Interactive Connectivity Establishment (ICE) -- | |||
// then add them to the Connection: | ||||
Connection.AddRemote(NewRemoteCandidates) | Connection.AddRemote(NewRemoteCandidates) | |||
// On a PathChange<> event, resolve the Local Endpoint Identifiers to | // On a PathChange event, resolve the Local Endpoint Identifiers to | |||
// see if a new Local Endpoint has become available and, if | // see if a new Local Endpoint has become available and, if | |||
// so, send to the peer as a new candidate and add to the | // so, send to the peer as a new candidate and add to the | |||
// Connection: | // Connection: | |||
Connection -> PathChange<> | Connection -> PathChange<> | |||
//---- PathChange event handler begin ---- | //---- PathChange event handler begin ---- | |||
ResolvedLocal, ResolvedRemote = Preconnection.Resolve() | ResolvedLocal, ResolvedRemote = Preconnection.Resolve() | |||
if ResolvedLocal has changed: | if ResolvedLocal has changed: | |||
// Application-specific code goes here to send the | // Application-specific code goes here to send the | |||
// ResolvedLocal list to peer via signalling channel | // ResolvedLocal list to the peer via the signaling channel | |||
... | ... | |||
// Add the new Local Endpoints to the Connection: | // Add the new Local Endpoints to the Connection: | |||
Connection.AddLocal(ResolvedLocal) | Connection.AddLocal(ResolvedLocal) | |||
//---- PathChange event handler end ---- | //---- PathChange event handler end ---- | |||
// Close the Connection in a Receive event handler | // Close the Connection in a Receive event handler: | |||
Connection.Close() | Connection.Close() | |||
4. Transport Properties | 4. Transport Properties | |||
Each application using the Transport Services API declares its | Each application using the Transport Services API declares its | |||
preferences for how the Transport Services system is to operate. | preferences for how the Transport Services system is to operate. | |||
This is done by using Transport Properties, as defined in | This is done by using Transport Properties, as defined in [RFC9621], | |||
[I-D.ietf-taps-arch], at each stage of the lifetime of a Connection. | at each stage of the lifetime of a Connection. | |||
Transport Properties are divided into Selection, Connection, and | Transport Properties are divided into Selection, Connection, and | |||
Message Properties. | Message Properties. | |||
Selection Properties (see Section 6.2) can only be set during pre- | Selection Properties (see Section 6.2) can only be set during | |||
establishment. They are only used to specify which paths and | preestablishment. They are only used to specify which paths and | |||
Protocol Stacks can be used and are preferred by the application. | Protocol Stacks can be used and are preferred by the application. | |||
Calling Initiate on a Preconnection creates an outbound Connection, | Calling Initiate on a Preconnection creates an outbound Connection, | |||
and the Selection Properties remain readable from the Connection, but | and the Selection Properties remain readable from the Connection but | |||
become immutable. Selection Properties can be set on Preconnections, | become immutable. Selection Properties can be set on Preconnections, | |||
and the effect of Selection Properties can be queried on Connections | and the effect of Selection Properties can be queried on Connections | |||
and Messages. | and Messages. | |||
Connection Properties (see Section 8.1) are used to inform decisions | Connection Properties (see Section 8.1) are used to inform decisions | |||
made during establishment and to fine-tune the established | made during establishment and to fine-tune the established | |||
Connection. They can be set during pre-establishment, and can be | Connection. They can be set during preestablishment and can be | |||
changed later. Connection Properties can be set on Connections and | changed later. Connection Properties can be set on Connections and | |||
Preconnections; when set on Preconnections, they act as an initial | Preconnections; when set on Preconnections, they act as an initial | |||
default for the resulting Connections. | default for the resulting Connections. | |||
Message Properties (see Section 9.1.3) control the behavior of the | Message Properties (see Section 9.1.3) control the behavior of the | |||
selected protocol stack(s) when sending Messages. Message Properties | selected Protocol Stack(s) when sending Messages. Message Properties | |||
can be set on Messages, Connections, and Preconnections; when set on | can be set on Messages, Connections, and Preconnections; when set on | |||
the latter two, they act as an initial default for the Messages sent | the latter two, they act as an initial default for the Messages sent | |||
over those Connections. | over those Connections. | |||
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 [RFC9621]), are not used as input to the | |||
the selection process, but only support configuration if the | selection process; they only support configuration if the respective | |||
respective protocol has been selected. | protocol has been selected. | |||
4.1. Transport Property Names | 4.1. Transport Property Names | |||
Transport Properties are referred to by property names, represented | Transport Properties are referred to by property names, represented | |||
as case-insensitive strings. These names serve two purposes: | as case-insensitive strings. These names serve two purposes: | |||
* Allowing different components of a Transport Services | * Allowing different components of a Transport Services | |||
Implementation to pass Transport Properties, e.g., between a | Implementation to pass Transport Properties (e.g., between a | |||
language frontend and a policy manager, or as a representation of | language frontend and a policy manager) or to enable a Transport | |||
properties retrieved from a file or other storage. | Services Implementation to represent properties retrieved from a | |||
file or other storage to the application. | ||||
* Making the code of different Transport Services Implementations | * Making the code of different Transport Services Implementations | |||
look similar. While individual programming languages might | look similar. While individual programming languages might | |||
preclude strict adherence to the aforementioned naming convention | preclude strict adherence to the naming convention of representing | |||
(for instance, by prohibiting the use of hyphens in symbols), | property names as case-insensitive strings (for instance, by | |||
users interacting with multiple implementations will still benefit | prohibiting the use of hyphens in symbols), users interacting with | |||
from the consistency resulting from the use of visually similar | multiple implementations will still benefit from the consistency | |||
symbols. | 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 optional Namespace component and its trailing character . MUST | * The optional Namespace component and its trailing dot character | |||
be omitted for well-known, generic properties, i.e., for | (".") MUST be omitted for well-known generic properties, i.e., for | |||
properties that are not specific to a protocol. | properties that are not specific to a protocol. | |||
* Protocol-specific Properties MUST use the protocol acronym as the | * Protocol-specific Properties MUST use the protocol acronym as the | |||
Namespace (e.g., a Connection that uses TCP could support a TCP- | Namespace (e.g., a Connection that uses TCP could support a TCP- | |||
specific Transport Property, such as the TCP user timeout value, | specific Transport Property, such as the TCP User Timeout value, | |||
in a Protocol-specific Property called tcp.userTimeoutValue (see | in a Protocol-specific Property called tcp.userTimeoutValue (see | |||
Section 8.2)). | Section 8.2)). | |||
* Vendor or implementation specific properties MUST be placed in a | * Vendor-specific or implementation-specific properties MUST be | |||
Namespace starting with the underscore _ character and SHOULD use | placed in a Namespace starting with the underscore character ("_") | |||
a string identifying the vendor or implementation. | and SHOULD use a string identifying the vendor or implementation. | |||
* For IETF protocols, the name of a Protocol-specific Property MUST | * For IETF protocols, the name of a Protocol-specific Property MUST | |||
be specified in an IETF document published in the RFC Series after | be specified in an RFC from the IETF Stream (after IETF Review | |||
IETF review. An IETF protocol Namespace does not start with an | [RFC8126]). An IETF protocol Namespace does not start with an | |||
underscore character. | underscore character ("_"). | |||
Namespaces for each of the keywords provided in the IANA protocol | Namespaces for each of the keywords provided in the "Protocol | |||
numbers registry (see https://www.iana.org/assignments/protocol- | Numbers" registry (see <https://www.iana.org/assignments/protocol- | |||
numbers/protocol-numbers.xhtml) are reserved for Protocol-specific | numbers/>) are reserved for Protocol-specific Properties and MUST NOT | |||
Properties and MUST NOT be used for vendor or implementation-specific | be used for vendor-specific or implementation-specific properties. | |||
properties. Terms listed as keywords as in the protocol numbers | Terms listed as keywords, as in the "Protocol Numbers" registry, | |||
registry SHOULD be avoided as any part of a vendor- or | SHOULD be avoided as any part of a vendor-specific or implementation- | |||
implementation-specific property name. | specific property name. | |||
Though Transport Property Names are case-insensitive, it is | Though Transport Property Names are case insensitive, it is | |||
recommended to use camelCase to improve readability. Implementations | recommended to use camelCase to improve readability. Implementations | |||
may transpose Transport Property Names into snake_case or PascalCase | may transpose Transport Property Names into snake_case or PascalCase | |||
to blend into the language environment. | to blend into the language environment. | |||
4.2. Transport Property Types | 4.2. Transport Property Types | |||
Each Transport Property has one of the basic types described in | Each Transport Property has one of the basic types described in | |||
Section 1.1. | Section 1.1. | |||
Most Selection Properties (see Section 6.2) are of the Enumeration | Most Selection Properties (see Section 6.2) are of the Enumeration | |||
type, and use the Preference Enumeration, which takes one of five | type, and they use the Preference Enumeration, which takes one of | |||
possible values (Prohibit, Avoid, No Preference, Prefer, or Require) | five possible values (Prohibit, Avoid, No Preference, Prefer, or | |||
denoting the level of preference for a given property during protocol | Require) denoting the level of preference for a given property during | |||
selection. | protocol selection. | |||
5. Scope of the API Definition | 5. Scope of the API Definition | |||
This document defines a language- and platform-independent API of a | This document defines a language- and platform-independent API of a | |||
Transport Services system. Given the wide variety of languages and | Transport Services system. Given the wide variety of languages and | |||
language conventions used to write applications that use the | 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 API necessarily abstract. | this independence makes this API necessarily abstract. | |||
There is no interoperability benefit in tightly defining how the API | There is no interoperability benefit in tightly defining how the API | |||
is presented to application programmers across diverse platforms. | is presented to application programmers across diverse platforms. | |||
However, maintaining the "shape" of the abstract API across different | However, maintaining the "shape" of the abstract API across different | |||
platforms reduces the effort for programmers who learn to use the | platforms reduces the effort for programmers who learn to use the | |||
Transport Services API to then apply their knowledge to another | Transport Services API to then apply their knowledge to another | |||
platform. That said, implementations have significant freedom in | platform. That said, implementations have significant freedom in | |||
presenting this API to programmers, balancing the conventions of the | presenting this API to programmers, balancing the conventions of the | |||
protocol with the shape of the API. We make the following | protocol with the shape of the API. We make the following | |||
recommendations: | recommendations: | |||
* Actions, events, and errors in implementations of the Transport | * Actions, events, and errors in implementations of the Transport | |||
Services API SHOULD use the names given for them in the document, | Services API SHOULD use the names assigned to them in this | |||
subject to capitalization, punctuation, and other typographic | document, subject to capitalization, punctuation, and other | |||
conventions in the language of the implementation, unless the | typographic conventions in the language of the implementation, | |||
implementation itself uses different names for substantially | unless the implementation itself uses different names for | |||
equivalent objects for networking by convention. | substantially equivalent objects for networking by convention. | |||
* Transport Services systems SHOULD implement each Selection | * Transport Services systems SHOULD implement each Selection | |||
Property, Connection Property, and Message Context Property | Property, Connection Property, and Message Context Property | |||
specified in this document. These features SHOULD be implemented | specified in this document. These features SHOULD be implemented | |||
even when in a specific implementation it will always result in no | even when, in a specific implementation, it will always result in | |||
operation, e.g. there is no action when the API specifies a | no operation, e.g., there is no action when the API specifies a | |||
Property that is not available in a transport protocol implemented | Property that is not available in a transport protocol implemented | |||
on a specific platform. For example, if TCP is the only | on a specific platform. For example, if TCP is the only | |||
underlying transport protocol, the Message Property msgOrdered can | underlying transport protocol, the Message Property msgOrdered can | |||
be implemented (trivially, as a no-op) as disabling the | be implemented (trivially, as a no-op) as disabling the | |||
requirement for ordering will not have any effect on delivery | requirement for ordering will not have any effect on delivery | |||
order for Connections over TCP. Similarly, the msgLifetime | order for Connections over TCP. Similarly, the msgLifetime | |||
Message Property can be implemented but ignored, as the | Message Property can be implemented but ignored, as the | |||
description of this Property states that "it is not guaranteed | description of this Property (Section 9.1.3.1) states that "it is | |||
that a Message will not be sent when its Lifetime has expired". | not guaranteed that a Message will not be sent when its Lifetime | |||
has expired". | ||||
* Implementations can use other representations for Transport | * Implementations can 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 | straightforward mapping between their representation and the | |||
property names specified here. | property names specified here. | |||
6. Pre-Establishment Phase | 6. Preestablishment Phase | |||
The pre-establishment phase allows applications to specify properties | The preestablishment 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 is a | A Preconnection object represents a potential Connection. It is a | |||
passive object (a data structure) that merely maintains the state | passive object (a data structure) that merely maintains the state | |||
that describes the properties of a Connection that might exist in the | that describes the properties of a Connection that might exist in the | |||
future. This state comprises Local Endpoint and Remote Endpoint | future. This state comprises Local Endpoint and Remote Endpoint | |||
objects that denote the endpoints of the potential Connection (see | objects that denote the endpoints of the potential Connection (see | |||
Section 6.1), the Selection Properties (see Section 6.2), any | Section 6.1), the Selection Properties (see Section 6.2), any | |||
preconfigured Connection Properties (Section 8.1), and the security | preconfigured Connection Properties (Section 8.1), and the security | |||
parameters (see Section 6.3): | parameters (see Section 6.3): | |||
skipping to change at page 18, line 40 ¶ | skipping to change at line 791 ¶ | |||
on the appropriate interface(s). At least one Remote Endpoint MUST | 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 the list of Remote Endpoints MAY be empty if the Preconnection is | but the list of Remote Endpoints MAY be empty if the Preconnection is | |||
used to Listen for incoming Connections. At least one Local Endpoint | used to Listen for incoming Connections. At least one Local Endpoint | |||
and one Remote Endpoint MUST be specified if a peer-to-peer | and one Remote Endpoint MUST be specified if a peer-to-peer | |||
Rendezvous is to occur based on the Preconnection. | Rendezvous is to occur based on the Preconnection. | |||
If more than one Local Endpoint is specified on a Preconnection, then | If more than one Local Endpoint is specified on a Preconnection, then | |||
the application is indicating that all of the Local Endpoints are | the application is indicating that all of the Local Endpoints are | |||
eligible to be used for Connections. For example, their Endpoint | eligible to be used for Connections. For example, their Endpoint | |||
Identifiers might correspond to different interfaces on a multi-homed | Identifiers might correspond to different interfaces on a multihomed | |||
host, or their Endpoint Identifiers might correspond to local | host or their Endpoint Identifiers might correspond to local | |||
interfaces and a STUN server that can be resolved to a server | interfaces and a STUN server that can be resolved to a server- | |||
reflexive address for a Preconnection used to make a peer-to-peer | reflexive address for a Preconnection used to make a peer-to-peer | |||
Rendezvous. | Rendezvous. | |||
If more than one Remote Endpoint is specified on the Preconnection, | If more than one Remote Endpoint is specified on the Preconnection, | |||
the application is indicating that it expects all of the Remote | the application is indicating that it expects all of the Remote | |||
Endpoints to offer an equivalent service, and that the Transport | Endpoints to offer an equivalent service and that the Transport | |||
Services system can choose any of them for a Connection. For | Services system can choose any of them for a Connection. For | |||
example, a Remote Endpoint might represent various network interfaces | example, a Remote Endpoint might represent various network interfaces | |||
of a host, or a server reflexive address that can be used to reach a | 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 | host, or a set of hosts that provide equivalent local balanced | |||
service. | service. | |||
In most cases, it is expected that a single Remote Endpoint will be | 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 | specified by name, and a later call to Initiate on the Preconnection | |||
(see Section 7.1) will internally resolve that name to a list of | (see Section 7.1) will internally resolve that name to a list of | |||
concrete Endpoint Identifers. Specifying multiple Remote Endpoints | concrete Endpoint Identifiers. Specifying multiple Remote Endpoints | |||
on a Preconnection allows applications to override this for more | on a Preconnection allows applications to override this for more | |||
detailed control. | detailed control. | |||
If Message Framers are used (see Section 9.1.2), they MUST be added | If Message Framers are used (see Section 9.1.2), they MUST be added | |||
to the Preconnection during pre-establishment. | to the Preconnection during preestablishment. | |||
6.1. Specifying Endpoints | 6.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 Connection. | Endpoint objects to refer to the endpoints of a 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 | |||
Endpoint Identifiers are set. For example, an Endpoint that only | Endpoint Identifiers are set. For example, an Endpoint that only | |||
specifies a hostname can, in fact, finally correspond to several | specifies a hostname can, in fact, finally correspond to several | |||
different IP addresses on different hosts. | different IP 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): | * HostName (string): | |||
RemoteSpecifier.WithHostName("example.com") | RemoteSpecifier.WithHostName("example.com") | |||
skipping to change at page 20, line 4 ¶ | skipping to change at line 840 ¶ | |||
An Endpoint object can be configured with the following identifiers: | An Endpoint object can be configured with the following identifiers: | |||
* HostName (string): | * HostName (string): | |||
RemoteSpecifier.WithHostName("example.com") | RemoteSpecifier.WithHostName("example.com") | |||
* Port (a 16-bit unsigned Integer): | * Port (a 16-bit unsigned Integer): | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
* Service (an identifier string that maps to a port; either a | * Service (an identifier string that maps to a port; either a | |||
service name associated with a port number, from | service name associated with a port number (from | |||
https://www.iana.org/assignments/service-names-port-numbers/ | <https://www.iana.org/assignments/service-names-port-numbers/>) or | |||
service-names-port-numbers.xhtml, or a DNS SRV service name to be | a DNS SRV service name to be resolved): | |||
resolved): | ||||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
* IP address (an IPv4 or IPv6 address type; note that the examples | * IP address (an IPv4 or IPv6 address type; note that the examples | |||
here show the human-readable form of the IP addresses, but the | here show the human-readable form of the IP addresses, but the | |||
functions can take a binary encoding of the addresses): | functions can take a binary encoding of the addresses): | |||
RemoteSpecifier.WithIPAddress(192.0.2.21) | RemoteSpecifier.WithIPAddress(192.0.2.21) | |||
RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | |||
* Interface identifier (which can be a string name or other | * Interface identifier (which can be a string name or other | |||
platform-specific identifier), e.g., to qualify link-local | platform-specific identifier), e.g., to qualify link-local | |||
addresses (see Section 6.1.2 for details): | addresses (see Section 6.1.2 for details): | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
The Resolve action on a Preconnection can be used to obtain a list of | The Resolve action on a Preconnection can be used to obtain a list of | |||
available local interfaces. | available local interfaces. | |||
Note that an IPv6 address specified with a scope zone ID (e.g. | Note that an IPv6 address specified with a scope zone ID (e.g., | |||
fe80::2001:db8%en0) is equivalent to WithIPAddress with an unscoped | fe80::2001:db8%en0) is equivalent to WithIPAddress with an unscoped | |||
address and WithInterface together. | address and WithInterface together. | |||
Applications creating Endpoint objects using WithHostName SHOULD | Applications creating Endpoint objects using WithHostName SHOULD | |||
provide fully-qualified domain names (FQDNs). Not providing an FQDN | provide Fully Qualified Domain Names (FQDNs). Not providing an FQDN | |||
will result in the Transport Services Implementation needing to use | will result in the Transport Services Implementation needing to use | |||
DNS search domains for name resolution, which might lead to | DNS search domains for name resolution, which might lead to | |||
inconsistent or unpredictable behavior. | inconsistent or unpredictable behavior. | |||
The design of the API MUST NOT permit an Endpoint object to be | The design of the API MUST NOT permit an Endpoint object to be | |||
configured with multiple Endpoint Identifiers of the same type. For | configured with multiple Endpoint Identifiers of the same type. For | |||
example, an Endpoint object cannot specify two IP addresses. Two | example, an Endpoint object cannot specify two IP addresses. 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 | |||
skipping to change at page 21, line 11 ¶ | skipping to change at line 893 ¶ | |||
resolution and attempt using any address derived from the original | resolution and attempt using any address derived from the original | |||
hostname of the Remote Endpoint. Note that multiple Remote Endpoints | hostname of the Remote Endpoint. Note that multiple Remote Endpoints | |||
can be added to a Preconnection, as discussed in Section 7.5. | can be added to a Preconnection, as discussed in Section 7.5. | |||
The Transport Services system resolves names internally, when the | The Transport Services system 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 13. | are given in Section 13. | |||
The Resolve action on a Preconnection can be used by the application | The Resolve action on a Preconnection can be used by the application | |||
to force early binding when required, for example with some Network | to force early binding when required, for example, with some Network | |||
Address Translator (NAT) traversal protocols (see Section 7.3). | Address Translator (NAT) traversal protocols (see Section 7.3). | |||
6.1.1. Using Multicast Endpoints | 6.1.1. Using Multicast Endpoints | |||
To use multicast, a Preconnection is first created with the Local/ | To use multicast, a Preconnection is first created with the Local or | |||
Remote Endpoint Identifer specifying the any-source multicast (ASM) | Remote Endpoint Identifier specifying the Any-Source Multicast (ASM) | |||
or source-specific multicast (SSM) multicast group and destination | or Source-Specific Multicast (SSM) group and destination port number. | |||
port number. This is then followed by a call to either Initiate, | This is then followed by a call to either Initiate, Listen, or | |||
Listen, or Rendezvous depending on whether the resulting Connection | Rendezvous, depending on whether the resulting Connection is to be | |||
is to be used to send messages to the multicast group, receive | used to send messages to the multicast group, receive messages from | |||
messages from the group, or, for an any-source multicast group, to | the group, or both send and receive messages (as is the case for an | |||
both send and receive messages. | ASM group). | |||
Note that the Transport Services API has separate specifier calls for | Note that the Transport Services API has separate specifier calls for | |||
multicast groups to avoid introducing filter properties for single- | multicast groups to avoid introducing filter properties for single- | |||
source multicast and seeks to avoid confusion that can be caused by | source multicast and seeks to avoid confusion that can be caused by | |||
overloading the unicast specifiers. | overloading the unicast specifiers. | |||
Calling Initiate on that Preconnection creates a Connection that can | Calling Initiate on that Preconnection creates a Connection that can | |||
be used to send Messages to the multicast group. The Connection | be used to send Messages to the multicast group. The Connection | |||
object that is created will support Send but not Receive. Any | object that is created will support Send but not Receive. Any | |||
Connections created this way are send-only, and do not join the | Connections created this way are send-only and do not join the | |||
multicast group. The resulting Connection will have a Local Endpoint | multicast group. The resulting Connection will have a Local Endpoint | |||
identifying the local interface to which the Connection is bound and | identifying the local interface to which the Connection is bound and | |||
a Remote Endpoint identifying the multicast group. | a Remote Endpoint identifying the multicast group. | |||
The following API calls can be used to configure a Preconnection | The following API calls can be used to configure a Preconnection | |||
before calling Initiate: | before calling Initiate: | |||
RemoteSpecifier.WithMulticastGroupIP(GroupAddress) | RemoteSpecifier.WithMulticastGroupIP(GroupAddress) | |||
RemoteSpecifier.WithPort(PortNumber) | RemoteSpecifier.WithPort(PortNumber) | |||
RemoteSpecifier.WithHopLimit(HopLimit) | RemoteSpecifier.WithHopLimit(HopLimit) | |||
Calling Listen on a Preconnection with a multicast group specified on | ||||
the Remote Endpoint will join the multicast group to receive | Calling Listen on a Preconnection with a multicast group address | |||
Messages. This Listener will create one Connection for each Remote | specified as the Remote Endpoint Identifier will trigger the | |||
Endpoint sending to the group, with the Local Endpoint Identifer | Transport Services Implementation to join the multicast group to | |||
specified as a group address. The set of Connection objects created | receive Messages. This Listener will create one Connection for each | |||
forms a Connection Group. The receiving interface can be restricted | Remote Endpoint sending to the group, with the Local Endpoint | |||
by passing it as part of the LocalSpecifier or queried through the | Identifier specified as a group address. The set of Connection | |||
Message Context on the Messages received (see Section 9.1.1 for | objects created forms a Connection Group. The receiving interface | |||
further details). | can be restricted by passing it as part of the LocalSpecifier or | |||
queried through the Message Context on the Messages received (see | ||||
Section 9.1.1 for further details). | ||||
Specifying WithHopLimit sets the Time To Live (TTL) field in the | Specifying WithHopLimit sets the Time To Live (TTL) field in the | |||
header of IPv4 packets or the Hop Count field in the header of IPv6 | header of IPv4 packets or the Hop Count field in the header of IPv6 | |||
packets. | packets. | |||
The following API calls can be used to configure a Preconnection | The following API calls can be used to configure a Preconnection | |||
before calling Listen: | before calling Listen: | |||
LocalSpecifier.WithSingleSourceMulticastGroupIP(GroupAddress, | LocalSpecifier.WithSingleSourceMulticastGroupIP(GroupAddress, | |||
SourceAddress) | SourceAddress) | |||
LocalSpecifier.WithAnySourceMulticastGroupIP(GroupAddress) | LocalSpecifier.WithAnySourceMulticastGroupIP(GroupAddress) | |||
LocalSpecifier.WithPort(PortNumber) | LocalSpecifier.WithPort(PortNumber) | |||
Calling Rendezvous on a Preconnection with an any-source multicast | Calling Rendezvous on a Preconnection with an ASM group address as | |||
group address as the Remote Endpoint Identifer will join the | the Remote Endpoint Identifier will trigger the Transport Services | |||
multicast group, and also indicates that the resulting Connection can | Implementation to join the multicast group and also indicates that | |||
be used to send Messages to the multicast group. The Rendezvous call | the resulting Connection can be used to send Messages to the | |||
will return both a Connection that can be used to send to the group, | multicast group. The Rendezvous call will return both: | |||
that acts the same as a Connection returned by calling Initiate with | ||||
a multicast Remote Endpoint, and a Listener that acts as if Listen | 1. a Connection that can be used to send to the group and that acts | |||
had been called with a multicast Remote Endpoint. Calling Rendezvous | the same as a Connection returned by calling Initiate with a | |||
on a Preconnection with a source-specific multicast group address as | multicast Remote Endpoint and | |||
the Local Endpoint Identifer results in an EstablishmentError. | ||||
2. a Listener that acts as if Listen had been called with a | ||||
multicast Remote Endpoint. | ||||
Calling Rendezvous on a Preconnection with an SSM group address as | ||||
the Local Endpoint Identifier results in an EstablishmentError. | ||||
The following API calls can be used to configure a Preconnection | The following API calls can be used to configure a Preconnection | |||
before calling Rendezvous: | before calling Rendezvous: | |||
RemoteSpecifier.WithMulticastGroupIP(GroupAddress) | RemoteSpecifier.WithMulticastGroupIP(GroupAddress) | |||
RemoteSpecifier.WithPort(PortNumber) | RemoteSpecifier.WithPort(PortNumber) | |||
RemoteSpecifier.WithHopLimit(HopLimit) | RemoteSpecifier.WithHopLimit(HopLimit) | |||
LocalSpecifier.WithAnySourceMulticastGroupIP(GroupAddress) | LocalSpecifier.WithAnySourceMulticastGroupIP(GroupAddress) | |||
LocalSpecifier.WithPort(PortNumber) | LocalSpecifier.WithPort(PortNumber) | |||
LocalSpecifier.WithHopLimit(HopLimit) | LocalSpecifier.WithHopLimit(HopLimit) | |||
skipping to change at page 23, line 23 ¶ | skipping to change at line 996 ¶ | |||
* Specifying an interface on a Local Endpoint explicitly binds all | * Specifying an interface on a Local Endpoint explicitly binds all | |||
candidates derived from this Endpoint to use the specified | candidates derived from this Endpoint to use the specified | |||
interface. | interface. | |||
* Specifying an interface using the interface Selection Property | * Specifying an interface using the interface Selection Property | |||
(Section 6.2.11) or indirectly via the pvd Selection Property | (Section 6.2.11) or indirectly via the pvd Selection Property | |||
(Section 6.2.12) influences the selection among the available | (Section 6.2.12) influences the selection among the available | |||
candidates. | candidates. | |||
While specifying an Interface on an Endpoint restricts the candidates | While specifying an Interface on an Endpoint restricts the candidates | |||
available for Connection establishment in the Pre-Establishment | available for Connection establishment in the preestablishment phase, | |||
Phase, the Selection Properties prioritize and constrain the | the Selection Properties prioritize and constrain the Connection | |||
Connection establishment. | establishment. | |||
6.1.3. Protocol-Specific Endpoints | 6.1.3. Protocol-Specific Endpoints | |||
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 | |||
could be accessible on two different port numbers depending on which | could be accessible on two different port numbers, depending on which | |||
protocol is used. | protocol is used. | |||
To scope an Endpoint to apply conditionally to a specific transport | To scope an Endpoint to apply conditionally to a specific transport | |||
protocol (such as defining an alternate port to use when QUIC is | protocol (such as defining an alternate port to use when QUIC is | |||
selected, as opposed to TCP), an Endpoint can be associated with a | selected, as opposed to TCP), an Endpoint can be associated with a | |||
protocol identifier. Protocol identifiers are objects or enumeration | protocol identifier. Protocol identifiers are objects or enumeration | |||
values provided by the Transport Services API, which will vary based | values provided by the Transport Services API that will vary based on | |||
on which protocols are implemented in a particular system. | which protocols are implemented in a particular system. | |||
AlternateRemoteSpecifier.WithProtocol(QUIC) | AlternateRemoteSpecifier.WithProtocol(QUIC) | |||
The following example shows a case where example.com has a server | The following example shows a case where example.com has a server | |||
running on port 443, with an alternate port of 8443 for QUIC. Both | running on port 443 with an alternate port of 8443 for QUIC. Both | |||
endpoints can be passed when creating a Preconnection. | endpoints can be passed when creating a Preconnection. | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
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) | |||
skipping to change at page 24, line 41 ¶ | skipping to change at line 1056 ¶ | |||
RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
Specify a Remote Endpoint using an IPv4 address and remote port: | Specify a Remote Endpoint using an IPv4 address and remote port: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithIPAddress(192.0.2.21) | RemoteSpecifier.WithIPAddress(192.0.2.21) | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
Specify a Local Endpoint using a local interface name and no local | Specify a Local Endpoint using a local interface name and no local | |||
port, to let the system assign an ephemeral local port: | port to let the system assign an ephemeral local port: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
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 6.2.11. However, if the application specifies Selection | Section 6.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) | |||
6.1.5. Multicast Examples | 6.1.5. Multicast Examples | |||
The following examples show how multicast groups can be used. | The following examples show how multicast groups can be used. | |||
Join an Any-Source Multicast group in receive-only mode, bound to a | Join an ASM group in receive-only mode, bound to a known port on a | |||
known port on a named local interface: | named local interface: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithAnySourceMulticastGroupIP(233.252.0.0) | LocalSpecifier.WithAnySourceMulticastGroupIP(233.252.0.0) | |||
LocalSpecifier.WithPort(5353) | LocalSpecifier.WithPort(5353) | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
TransportProperties := ... | TransportProperties := ... | |||
SecurityParameters := ... | SecurityParameters := ... | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
RemoteSpecifier, | RemoteSpecifier, | |||
TransportProperties, | TransportProperties, | |||
SecurityProperties) | SecurityProperties) | |||
Listener := Preconnection.Listen() | Listener := Preconnection.Listen() | |||
Join a Source-Specific Multicast group in receive-only mode, bound to | Join an SSM group in receive-only mode, bound to a known port on a | |||
a known port on a named local interface: | named local interface: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithSingleSourceMulticastGroupIP(233.252.0.0, | LocalSpecifier.WithSingleSourceMulticastGroupIP(233.252.0.0, | |||
198.51.100.10) | 198.51.100.10) | |||
LocalSpecifier.WithPort(5353) | LocalSpecifier.WithPort(5353) | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
TransportProperties := ... | TransportProperties := ... | |||
SecurityParameters := ... | SecurityParameters := ... | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
RemoteSpecifier, | RemoteSpecifier, | |||
TransportProperties, | TransportProperties, | |||
SecurityProperties) | SecurityProperties) | |||
Listener := Preconnection.Listen() | Listener := Preconnection.Listen() | |||
Create a Source-Specific Multicast group as a sender: | Create an SSM group as a sender: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithMulticastGroupIP(233.251.240.1) | RemoteSpecifier.WithMulticastGroupIP(233.251.240.1) | |||
RemoteSpecifier.WithPort(5353) | RemoteSpecifier.WithPort(5353) | |||
RemoteSpecifier.WithHopLimit(8) | RemoteSpecifier.WithHopLimit(8) | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithIPAddress(192.0.2.22) | LocalSpecifier.WithIPAddress(192.0.2.22) | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
TransportProperties := ... | TransportProperties := ... | |||
SecurityParameters := ... | SecurityParameters := ... | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
RemoteSpecifier, | RemoteSpecifier, | |||
TransportProperties, | TransportProperties, | |||
SecurityProperties) | SecurityProperties) | |||
Connection := Preconnection.Initiate() | Connection := Preconnection.Initiate() | |||
Join an any-source multicast group as both a sender and a receiver: | Join an ASM group as both a sender and a receiver: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithMulticastGroupIP(233.252.0.0) | RemoteSpecifier.WithMulticastGroupIP(233.252.0.0) | |||
RemoteSpecifier.WithPort(5353) | RemoteSpecifier.WithPort(5353) | |||
RemoteSpecifier.WithHopLimit(8) | RemoteSpecifier.WithHopLimit(8) | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithAnySourceMulticastGroupIP(233.252.0.0) | LocalSpecifier.WithAnySourceMulticastGroupIP(233.252.0.0) | |||
LocalSpecifier.WithIPAddress(192.0.2.22) | LocalSpecifier.WithIPAddress(192.0.2.22) | |||
LocalSpecifier.WithPort(5353) | LocalSpecifier.WithPort(5353) | |||
skipping to change at page 27, line 32 ¶ | skipping to change at line 1173 ¶ | |||
SecurityProperties) | SecurityProperties) | |||
Connection, Listener := Preconnection.Rendezvous() | Connection, Listener := Preconnection.Rendezvous() | |||
6.2. Specifying Transport Properties | 6.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 and Message Properties for configuration of | as Connection Properties and Message Properties for configuration of | |||
the detailed operation of the selected Protocol Stacks on a per- | the detailed operation of the selected Protocol Stacks on a per- | |||
Connection and Message level. | Connection and per-Message level. | |||
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 could involve choosing | necessarily tied to path selection. This could involve choosing | |||
between multiple local interfaces that are connected to different | between multiple local interfaces that are connected to different | |||
access networks. | access networks. | |||
When additional information (such as Provisioning Domain (PvD) | When additional information (such as PvD information [RFC7556]) is | |||
information [RFC7556]) is available about the networks over which an | available about the networks over which an endpoint can operate, this | |||
endpoint can operate, this can inform the selection between alternate | can inform the selection between alternate network paths. Path | |||
network paths. Path information can include PMTU, set of supported | information can include the Path MTU (PMTU), the set of supported | |||
DSCPs, expected usage, cost, etc. The usage of this information by | Differentiated Services Code Points (DSCPs), expected usage, cost, | |||
the Transport Services System is generally independent of the | etc. The usage of this information by the Transport Services System | |||
specific mechanism/protocol used to receive the information (e.g. | is generally independent of the specific mechanism or protocol used | |||
zero-conf, DHCP, or IPv6 RA). | to receive the information (e.g., zero-conf, DHCP, or IPv6 Router | |||
Advertisements (RAs)). | ||||
Most Selection Properties are represented as Preferences, which can | Most Selection Properties are represented as Preferences, which can | |||
take one of five values: | take one of five values: | |||
+============+========================================+ | +============+=========================================+ | |||
| Preference | Effect | | | Preference | Effect | | |||
+============+========================================+ | +============+=========================================+ | |||
| Require | Select only protocols/paths providing | | | Require | Select only protocols/paths providing | | |||
| | the property, fail otherwise | | | | the property; otherwise, fail | | |||
+------------+----------------------------------------+ | +------------+-----------------------------------------+ | |||
| Prefer | Prefer protocols/paths providing the | | | Prefer | Prefer protocols/paths providing the | | |||
| | property, proceed otherwise | | | | property; otherwise, proceed | | |||
+------------+----------------------------------------+ | +------------+-----------------------------------------+ | |||
| No | No preference | | | No | No preference | | |||
| Preference | | | | Preference | | | |||
+------------+----------------------------------------+ | +------------+-----------------------------------------+ | |||
| Avoid | Prefer protocols/paths not providing | | | Avoid | Prefer protocols/paths not providing | | |||
| | the property, proceed otherwise | | | | the property; otherwise, proceed | | |||
+------------+----------------------------------------+ | +------------+-----------------------------------------+ | |||
| Prohibit | Select only protocols/paths not | | | Prohibit | Select only protocols/paths not | | |||
| | providing the property, fail otherwise | | | | providing the property; otherwise, fail | | |||
+------------+----------------------------------------+ | +------------+-----------------------------------------+ | |||
Table 1: Selection Property Preference Levels | Table 1: Selection Property Preference Levels | |||
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, even given the same | |||
Properties, because the available protocols and paths can differ | Selection Properties, because the available protocols and paths can | |||
across systems and contexts. However, implementations are | differ 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, when provided with the same set of Selection Properties. | application, when provided with 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 | |||
example, if an application indicates a preference for a specific path | example, if an application indicates a preference for a specific path | |||
by specifying an interface, but also a preference for a protocol, a | by specifying an interface, but also a preference for a protocol, a | |||
situation might occur in which the preferred protocol is not | situation might occur in which the preferred protocol is not | |||
available on the preferred path. In such cases, applications can | available on the preferred path. In such cases, applications can | |||
expect properties that determine path selection to be prioritized | expect properties that determine path selection to be prioritized | |||
over properties that determine protocol selection. The transport | over properties that determine protocol selection. The transport | |||
system SHOULD determine the preferred path first, regardless of | system SHOULD determine the preferred path first, regardless of | |||
protocol preferences. This ordering is chosen to provide consistency | protocol preferences. This ordering is chosen to provide consistency | |||
across implementations, based on the fact that it is more common for | across implementations; this is based on the fact that it is more | |||
the use of a given network path to determine cost to the user (i.e., | common for the use of a given network path to determine cost to the | |||
an interface type preference might be based on a user's preference to | user (i.e., an interface type preference might be based on a user's | |||
avoid being charged more for a cellular data plan). | preference to avoid being charged more for a cellular data plan). | |||
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) | |||
To aid readability, implementations MAY provide additional | To aid readability, implementations MAY provide additional | |||
convenience functions to simplify use of Selection Properties: see | convenience functions to simplify the use of Selection Properties: | |||
Appendix B.1 for examples. In addition, implementations MAY provide | see Appendix B.1 for examples. In addition, implementations MAY | |||
a mechanism to create TransportProperties objects that are | provide a mechanism to create TransportProperties objects that are | |||
preconfigured for common use cases, as outlined in Appendix B.2. | preconfigured for common use cases, as outlined in Appendix B.2. | |||
Transport Properties for an established Connection can be queried via | Transport Properties for an established Connection can be queried via | |||
the Connection object, as outlined in Section 8. | the Connection object, as outlined in Section 8. | |||
A Connection gets its Transport Properties either by being explicitly | A Connection gets its Transport Properties by either being explicitly | |||
configured via a Preconnection, by configuration after establishment, | configured via a Preconnection, being configured after establishment, | |||
or by inheriting them from an antecedent via cloning; see Section 7.4 | or inheriting them from an antecedent via cloning; see Section 7.4 | |||
for more. | for more details. | |||
Section 8.1 provides a list of Connection Properties, while Selection | Section 8.1 provides a list of Connection Properties, while Selection | |||
Properties are listed in the subsections below. Selection Properties | Properties are listed in the subsections below. Selection Properties | |||
are only considered during establishment, and can not be changed | are only considered during establishment and cannot be changed after | |||
after a Connection is established. After a Connection is | a Connection is established. At this point, Selection Properties can | |||
established, Selection Properties can only be read to check the | only be read to check the properties used by the Connection. Upon | |||
properties used by the Connection. Upon reading, the Preference type | reading, the Preference type of a Selection Property changes into | |||
of a Selection Property changes into Boolean, where true means that | Boolean, where: | |||
the selected Protocol Stack supports the feature or uses the path | ||||
associated with the Selection Property, and false means that the | * true means that the selected Protocol Stack supports the feature | |||
Protocol Stack does not support the feature or use the path. | or uses the path associated with the Selection Property, and | |||
* false means that the Protocol Stack does not support the feature | ||||
or use the path. | ||||
Implementations of Transport Services systems could alternatively use | Implementations of Transport Services systems could alternatively use | |||
the two Preference values Require and Prohibit to represent true and | the Require and Prohibit Preference values to represent true and | |||
false, respectively. Other types of Selection Properties remain | false, respectively. Other types of Selection Properties remain | |||
unchanged when they are made available for reading after a Connection | unchanged when they are made available for reading after a Connection | |||
is established. | is established. | |||
An implementation of the Transport Services API needs to provide | An implementation of the Transport Services API needs to provide | |||
sensible defaults for Selection Properties. The default values for | sensible defaults for Selection Properties. The default values for | |||
each property below represent a configuration that can be implemented | each property below represent a configuration that can be implemented | |||
over TCP. If these default values are used and TCP is not supported | over TCP. If these default values are used and TCP is not supported | |||
by a Transport Services system, then an application using the default | by a Transport Services system, then an application using the default | |||
set of Properties might not succeed in establishing a Connection. | set of Properties might not succeed in establishing a Connection. | |||
skipping to change at page 30, line 23 ¶ | skipping to change at line 1312 ¶ | |||
6.2.1. Reliable Data Transfer (Connection) | 6.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 in order without loss or duplication. When reliable | Remote Endpoint in order, without loss or duplication. When reliable | |||
data transfer is enabled, this also entails being notified when a | data transfer is enabled, this also entails being notified when a | |||
Connection is closed or aborted. | Connection is closed or aborted. | |||
6.2.2. Preservation of Message Boundaries | 6.2.2. Preservation of Message Boundaries | |||
Name: preserveMsgBoundaries | Name: preserveMsgBoundaries | |||
Type: Preference | Type: Preference | |||
Default: No Preference | Default: No Preference | |||
skipping to change at page 31, line 26 ¶ | skipping to change at line 1360 ¶ | |||
6.2.5. Use 0-RTT Session Establishment with a Safely Replayable Message | 6.2.5. Use 0-RTT Session Establishment with a Safely Replayable Message | |||
Name: zeroRttMsg | Name: zeroRttMsg | |||
Type: Preference | Type: Preference | |||
Default: No Preference | Default: No Preference | |||
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 Remote Endpoint before | which will then be reliably transferred to the Remote Endpoint before | |||
or during connection establishment. This Message can potentially be | or 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 | |||
could be passed to the Remote Endpoint). See also Section 9.1.3.4. | could be passed to the Remote Endpoint). See also Section 9.1.3.4. | |||
6.2.6. Multistream Connections in Group | 6.2.6. Multistream Connections in a Group | |||
Name: multistreaming | Name: multistreaming | |||
Type: Preference | Type: Preference | |||
Default: Prefer | Default: Prefer | |||
This property specifies whether the application would prefer multiple | This property specifies whether 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. | |||
6.2.7. Full Checksum Coverage on Sending | 6.2.7. Full Checksum Coverage on Sending | |||
Name: fullChecksumSend | Name: fullChecksumSend | |||
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 the application to influence the sender | this property could enable the application to influence the sender | |||
checksum coverage after Connection establishment (see | checksum coverage after Connection establishment (see | |||
Section 9.1.3.6). | Section 9.1.3.6). | |||
6.2.8. Full Checksum Coverage on Receiving | 6.2.8. Full Checksum Coverage on Receiving | |||
Name: fullChecksumRecv | Name: fullChecksumRecv | |||
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 the application to influence the required | property could enable the application to influence the required | |||
minimum receiver checksum coverage after Connection establishment | minimum receiver checksum coverage after Connection establishment | |||
(see Section 8.1.1). | (see Section 8.1.1). | |||
6.2.9. Congestion control | 6.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 or not the application would like the | |||
Connection to be congestion controlled or not. Note that if a | Connection to be congestion controlled. Note that if a Connection is | |||
Connection is not congestion controlled, an application using such a | not congestion controlled, an application using such a Connection | |||
Connection SHOULD itself perform congestion control in accordance | SHOULD itself perform congestion control in accordance with [RFC2914] | |||
with [RFC2914] or use a circuit breaker in accordance with [RFC8084], | or use a circuit breaker in accordance with [RFC8084], whichever is | |||
whichever is appropriate. Also note that reliability is usually | appropriate. Also note that reliability is usually combined with | |||
combined with congestion control in protocol implementations, | congestion control in protocol implementations rendering "reliable | |||
rendering "reliable but not congestion controlled" a request that is | but not congestion controlled", a request that is unlikely to | |||
unlikely to succeed. If the Connection is congestion controlled, | succeed. If the Connection is congestion controlled, performing | |||
performing additional congestion control in the application can have | additional congestion control in the application can have negative | |||
negative performance implications. | performance implications. | |||
6.2.10. Keep alive | 6.2.10. Keep-Alive Packets | |||
Name: keepAlive | Name: keepAlive | |||
Type: Preference | Type: Preference | |||
Default: No Preference | Default: No Preference | |||
This property specifies whether the application would like the | ||||
Connection to send keep-alive packets or not. Note that if a | This property specifies whether or not the application would like the | |||
Connection determines that keep-alive packets are being sent, the | Connection to send keep-alive packets. Note that if a Connection | |||
application SHOULD itself avoid generating additional keep-alive | determines that keep-alive packets are being sent, the application | |||
messages. Note that when supported, the system will use the default | itself SHOULD avoid generating additional keep-alive messages. Note | |||
period for generation of the keep alive-packets. (See also | that, when supported, the system will use the default period for | |||
Section 8.1.4). | generation of the keep-alive packets. (See also Section 8.1.4.) | |||
6.2.11. Interface Instance or Type | 6.2.11. Interface Instance or Type | |||
Name: interface | Name: interface | |||
Type: Set of (Preference, Enumeration) | Type: Set 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, Prohibit, | interfaces or categories of interfaces it wants to Require, Prohibit, | |||
Prefer, or Avoid. Note that marking a specific interface as Require | Prefer, or Avoid. Note that marking a specific interface as Require | |||
strictly limits path selection to that single interface, and often | strictly limits path selection to that single interface, and often | |||
leads to less flexible and resilient connection establishment. | leads to less flexible and resilient connection establishment. | |||
In contrast to other Selection Properties, this property is a set of | In contrast to other Selection Properties, this property is a set of | |||
tuples of (Enumerated) interface identifier and preference. It can | tuples of (Enumerated) interface identifier and preference. It can | |||
either be implemented directly as such, or for making one preference | either be implemented directly as such or be implemented to make one | |||
available for each interface and interface type available on the | preference available for each interface and interface type available | |||
system. | on the system. | |||
The set of valid interface types is implementation- and system- | The set of valid interface types is specific to the implementation or | |||
specific. For example, on a mobile device, there could be Wi-Fi and | system. For example, on a mobile device, there could be Wi-Fi and | |||
Cellular interface types available; whereas on a desktop computer, | Cellular interface types available; whereas, on a desktop computer, | |||
Wi-Fi and Wired Ethernet interface types might be available. An | Wi-Fi and Wired Ethernet interface types might be available. An | |||
implementation should provide all types that are supported on the | implementation should provide all types that are supported on the | |||
local system, to allow applications to be written generically. For | local system to allow applications to be written generically. For | |||
example, if a single implementation is used on both mobile devices | example, if a single implementation is used on both mobile devices | |||
and desktop devices, it ought to define the Cellular interface type | and desktop devices, it ought to define the Cellular interface type | |||
for both systems, since an application might wish to always prohibit | for both systems, since an application might wish to always prohibit | |||
cellular. | 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 6.2.12) or | specified via Provisioning Domain attributes (see Section 6.2.12) or | |||
another specific property. | another specific property. | |||
Note that this property is not used to specify an interface scope | Note that this property is not used to specify an interface scope | |||
zone for a particular Endpoint. Section 6.1.2 provides details about | zone for a particular Endpoint. Section 6.1.2 provides details about | |||
how to qualify endpoint candidates on a per-interface basis. | how to qualify endpoint candidates on a per-interface basis. | |||
6.2.12. Provisioning Domain Instance or Type | 6.2.12. Provisioning Domain Instance or Type | |||
Name: pvd | Name: pvd | |||
Type: Set of (Preference, Enumeration) | Type: Set of (Preference, Enumeration) | |||
Default: Empty (not setting a preference for any PvD) | Default: Empty (not setting a preference for any PvD) | |||
Similar to interface (see Section 6.2.11), this property allows the | Similar to interface (see Section 6.2.11), this property allows the | |||
application to control path selection by selecting which specific | application to control path selection by selecting which specific PvD | |||
Provisioning Domain (PvD) or categories of PVDs it wants to Require, | or categories of PvDs it wants to Require, Prohibit, Prefer, or | |||
Prohibit, Prefer, or Avoid. Provisioning Domains define consistent | Avoid. Provisioning Domains define consistent sets of network | |||
sets of network properties that might be more specific than network | properties that might be more specific than network interfaces | |||
interfaces [RFC7556]. | [RFC7556]. | |||
As with interface instances and types, this property is a set of | As with interface instances and types, this property is a set of | |||
tuples of (Enumerated) PvD identifier and preference. It can either | tuples of (Enumerated) PvD identifier and preference. It can either | |||
be implemented directly as such, or for making one preference | be implemented directly as such or be implemented to make one | |||
available for each interface and interface type available on the | preference available for each interface and interface type available | |||
system. | on the system. | |||
The identification of a specific PvD is implementation- and system- | The identification of a specific PvD is specific to the | |||
specific. [RFC8801] defines how to use an FQDN to identify a PvD | implementation or system. [RFC8801] defines how to use an FQDN to | |||
when advertised by a network, but systems might also use other | identify a PvD when advertised by a network, but systems might also | |||
locally-relevant identifiers such as string names or Integers to | use other locally relevant identifiers such as string names or | |||
identify PvDs. As with requiring specific interfaces, requiring a | Integers to identify PvDs. As with requiring specific interfaces, | |||
specific PvD strictly limits the path selection. | requiring a specific PvD strictly limits the path selection. | |||
Categories or types of PvDs are also defined to be implementation- | Categories or types of PvDs are also defined to be specific to the | |||
and system-specific. These can be useful to identify a service that | implementation or system. These can be useful to identify a service | |||
is provided by a PvD. For example, if an application wants to use a | that is provided by a PvD. For example, if an application wants to | |||
PvD that provides a Voice-Over-IP service on a Cellular network, it | use a PvD that provides a Voice-Over-IP (VoIP) service on a Cellular | |||
can use the relevant PvD type to require a PvD that provides this | network, it can use the relevant PvD type to require a PvD that | |||
service, without needing to look up a particular instance. While | provides this service, without needing to look up a particular | |||
this does restrict path selection, it is broader than requiring | instance. While this does restrict path selection, it is broader | |||
specific PvD instances or interface instances, and should be | than requiring specific PvD instances or interface instances and | |||
preferred over these options. | should be preferred over these options. | |||
6.2.13. Use Temporary Local Address | 6.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" | |||
addresses [RFC8981]. Temporary addresses are generally used to | addresses [RFC8981]. Temporary addresses are generally used to | |||
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 a "permanent" address, is not needed. There are | |||
caveats to note when specifying this property. First, if an | some 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 (e.g., | privacy for performance. For instance, temporary addresses (e.g., | |||
[RFC8981]) can interfere with resumption mechanisms that some | [RFC8981]) can interfere with resumption mechanisms that some | |||
protocols rely on to reduce initial latency. | protocols rely on to reduce initial latency. | |||
6.2.14. Multipath Transport | 6.2.14. Multipath 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 | |||
end hosts. Using multiple paths allows Connections to migrate | end hosts. Using multiple paths allows Connections to migrate | |||
between interfaces or aggregate bandwidth as availability and | between interfaces or aggregate bandwidth as availability and | |||
performance properties change. Possible values are: | performance properties change. Possible values are as follows: | |||
Disabled: The Connection will not use multiple paths once | Disabled: The Connection will not use multiple paths once | |||
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 it. | |||
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 | |||
multipathPolicy property, see Section 8.1.7 below. To enable the | multipathPolicy property; see Section 8.1.7. To enable the peer | |||
peer endpoint to initiate additional paths towards a local address | endpoint to initiate additional paths toward a local address other | |||
other than the one initially used, it is necessary to set the | than the one initially used, it is necessary to set the | |||
advertisesAltaddr property (see Section 6.2.15 below). | advertisesAltaddr property (see Section 6.2.15). | |||
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 advertisesAltaddr property (see Section 6.2.15 below) is | even if the advertisesAltaddr property (see Section 6.2.15) is set to | |||
set to false. | false. | |||
Note that Multipath Transport has no corresponding Selection Property | Note that Multipath Transport has no corresponding Selection Property | |||
of type Preference. Enumeration values other than Disabled are | of type Preference. Enumeration values other than Disabled are | |||
interpreted as a preference for choosing protocols that can make use | interpreted as a preference for choosing protocols that can make use | |||
of multiple paths. The Disabled value implies a requirement not to | of multiple paths. The Disabled value implies a requirement not to | |||
use multiple paths in parallel but does not prevent choosing a | use multiple paths in parallel but does not prevent choosing a | |||
protocol that is capable of using multiple paths, e.g., it does not | protocol that is capable of using multiple paths, e.g., it does not | |||
prevent choosing TCP, but prevents sending the MP_CAPABLE option in | prevent choosing TCP but prevents sending the MP_CAPABLE option in | |||
the TCP handshake. | the TCP handshake. | |||
6.2.15. Advertisement of Alternative Addresses | 6.2.15. Advertisement of Alternative Addresses | |||
Name: advertisesAltaddr | Name: advertisesAltaddr | |||
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, ought to be advertised to the peer endpoint by the | interfaces, ought to be advertised to the peer endpoint by the | |||
Protocol Stack. Advertising these addresses enables the peer | Protocol Stack. Advertising these addresses enables the peer | |||
endpoint to establish additional connectivity, e.g., for Connection | endpoint to establish additional connectivity, e.g., for Connection | |||
migration or using multiple paths. | migration or 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 Services | setting this to false does not prevent the local Transport Services | |||
system from _establishing_ connectivity using alternate paths (see | system from _establishing_ connectivity using alternate paths (see | |||
Section 6.2.14 above); it only prevents _proactive advertisement_ of | Section 6.2.14); it only prevents _proactive advertisement_ of | |||
addresses. | addresses. | |||
6.2.16. Direction of communication | 6.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 as | |||
follows: | ||||
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, | |||
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 might cause a transport stack that supports | communication might cause a transport stack that supports | |||
bidirectional communication to be selected. | bidirectional communication to be selected. | |||
6.2.17. Notification of ICMP soft error message arrival | 6.2.17. Notification of ICMP Soft Error Message Arrival | |||
Name: softErrorNotify | Name: softErrorNotify | |||
Type: Preference | Type: Preference | |||
Default: No Preference | Default: No Preference | |||
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 SoftError events, see Section 8.3.1. Note that even | are available as SoftError events; see Section 8.3.1. Note that even | |||
if a protocol supporting this property is selected, not all ICMP | if a protocol supporting this property is selected, not all ICMP | |||
errors will necessarily be delivered, so applications cannot rely | errors will necessarily be delivered, so applications cannot rely | |||
upon receiving them [RFC8085]. | upon receiving them [RFC8085]. | |||
6.2.18. Initiating side is not the first to write | 6.2.18. Initiating Side Is Not the First to Write | |||
Name: activeReadBeforeSend | Name: activeReadBeforeSend | |||
Type: Preference | Type: Preference | |||
Default: No Preference | Default: No Preference | |||
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, immediately | this pattern by either: | |||
followed by reading, or passively opening with Listen, immediately | ||||
followed by writing. This property is ignored when establishing | 1. actively opening with Initiate, immediately followed by reading | |||
connections using Rendezvous. Requiring this property limits the | or | |||
choice of mappings to underlying protocols, which can reduce | ||||
efficiency. For example, it prevents the Transport Services system | 2. passively opening with Listen, immediately followed by writing. | |||
from mapping Connections to SCTP streams, where the first transmitted | ||||
data takes the role of an active open signal. | This property is ignored when establishing connections using | |||
Rendezvous. Requiring this property limits the choice of mappings to | ||||
underlying protocols, which can reduce efficiency. For example, it | ||||
prevents the Transport Services system from mapping Connections to | ||||
Stream Control Transmission Protocol (SCTP) streams, where the first | ||||
transmitted data takes the role of an active open signal. | ||||
6.3. Specifying Security Parameters and Callbacks | 6.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., can be configured statically. Others are | private key, etc., can 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 7.4). | cloning (see Section 7.4). | |||
This document specifies an abstract API, which could appear to | This document specifies an abstract API, which could appear to | |||
conflict with the need for security parameters to be unambiguous. | conflict with the need for security parameters to be unambiguous. | |||
The Transport Services System SHOULD provide reasonable, secure | The Transport Services System SHOULD provide reasonable, secure | |||
defaults for each enumerated security parameter, such that users of | defaults for each enumerated security parameter, such that users of | |||
the system only need to specify parameters required to establish a | the system only need to specify parameters required to establish a | |||
secure connection (e.g., serverCertificate, clientCertificate). | secure connection (e.g., serverCertificate or clientCertificate). | |||
Specifying security parameters from enumerated values (e.g., specific | Specifying security parameters from enumerated values (e.g., specific | |||
ciphersuites) might constrain which transport protocols can be | ciphersuites) might constrain which transport protocols can be | |||
selected during Connection establishment. | selected during Connection establishment. | |||
Security configuration parameters are specified in the pre- | Security configuration parameters are specified in the | |||
establishment phase and are created as follows: | preestablishment phase and are created as follows: | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
Specific parameters are added using a call to Set() on the | Specific parameters are added using a call to Set() on the | |||
SecurityParameters. | SecurityParameters. | |||
As with the rest of the Transport Services API, the exact names of | As with the rest of the Transport Services API, the exact names of | |||
parameters and/or values of enumerations (e.g., ciphersuites) used in | parameters and/or values of enumerations (e.g., ciphersuites) used in | |||
the security parameters are system- and implementation-specific, and | the security parameters are specific to the system or implementation | |||
ought to be chosen to follow the principle of least surprise for | and ought to be chosen to follow the principle of least surprise for | |||
users of the platform / language environment in question. | users of the platform/language environment in question. | |||
For security parameters that are enumerations of known values, such | For security parameters that are enumerations of known values, such | |||
as TLS ciphersuites, implementations are responsible for exposing the | as TLS ciphersuites, implementations are responsible for exposing the | |||
set of values they support. For security parameters that are not | set of values they support. For security parameters that are not | |||
simple value types, such as certificates and keys, implementations | simple value types, such as certificates and keys, implementations | |||
are responsible for exposing types appropriate for the platform / | are responsible for exposing types appropriate for the platform/ | |||
language environment. | language environment. | |||
Applications SHOULD use common safe defaults for values such as TLS | Applications SHOULD use common safe defaults for values such as TLS | |||
ciphersuites whenever possible. However, as discussed in [RFC8922], | ciphersuites whenever possible. However, as discussed in [RFC8922], | |||
many transport security protocols require specific security | many transport security protocols require specific security | |||
parameters and constraints from the client at the time of | parameters and constraints from the client at the time of | |||
configuration and actively during a handshake. | configuration and actively during a handshake. | |||
The set of security parameters defined here is not exhaustive, but | The set of security parameters defined here is not exhaustive, but | |||
illustrative. Implementations SHOULD expose an equivalent to the | illustrative. Implementations SHOULD expose an equivalent to the | |||
skipping to change at page 39, line 27 ¶ | skipping to change at line 1745 ¶ | |||
Services System will use. | Services System will use. | |||
Representation of security parameters in implementations ought to | Representation of security parameters in implementations ought to | |||
parallel that chosen for Transport Property names as suggested in | parallel that chosen for Transport Property names as suggested in | |||
Section 5. | Section 5. | |||
Connections that use Transport Services SHOULD use security in | Connections that use Transport Services SHOULD use security in | |||
general. However, for compatibility with endpoints that do not | general. However, for compatibility with endpoints that do not | |||
support transport security protocols (such as a TCP endpoint that | support transport security protocols (such as a TCP endpoint that | |||
does not support TLS), applications can initialize their security | does not support TLS), applications can initialize their security | |||
parameters to indicate that security can be disabled, or can be | parameters to indicate that security can be disabled or | |||
opportunistic. If security is disabled, the Transport Services | opportunistic. If security is disabled, the Transport Services | |||
system will not attempt to add transport security automatically. If | system will not attempt to add transport security automatically. If | |||
security is opportunistic, it will allow Connections without | security is opportunistic, it will allow Connections without | |||
transport security, but will still attempt to use unauthenticated | transport security, but it will still attempt to use unauthenticated | |||
security if available. | security if available. | |||
SecurityParameters := NewDisabledSecurityParameters() | SecurityParameters := NewDisabledSecurityParameters() | |||
SecurityParameters := NewOpportunisticSecurityParameters() | SecurityParameters := NewOpportunisticSecurityParameters() | |||
6.3.1. Allowed security protocols | 6.3.1. Allowed Security Protocols | |||
Name: allowedSecurityProtocols | Name: allowedSecurityProtocols | |||
Type: Implementation-specific enumeration of security protocol names | Type: Implementation-specific enumeration of security protocol names | |||
and/or versions. | and/or versions | |||
Default: Implementation-specific best available security protocols | Default: Implementation-specific best available security protocols | |||
This property allows applications to restrict which security | This property allows applications to restrict which security | |||
protocols and security protocol versions can be used in the protocol | protocols and security protocol versions can be used in the Protocol | |||
stack. Applications MUST be able to constrain the security protocols | Stack. Applications MUST be able to constrain the security protocols | |||
used by this or an equivalent mechanism, in order to prevent the use | used by this or an equivalent mechanism, in order to prevent the use | |||
of security protocols with unknown or weak security properties. | of security protocols with unknown or weak security properties. | |||
SecurityParameters.Set(allowedSecurityProtocols, [ tls_1_2, tls_1_3 ]) | SecurityParameters.Set(allowedSecurityProtocols, [ tls_1_2, tls_1_3 ]) | |||
6.3.2. Certificate bundles | 6.3.2. Certificate Bundles | |||
Names: serverCertificate, clientCertificate | Names: serverCertificate, clientCertificate | |||
Type: Array of certificate objects | Type: Array of certificate objects | |||
Default: Empty array | Default: Empty array | |||
One or more certificate bundles identifying the Local Endpoint, | One or more certificate bundles identifying the Local Endpoint as a | |||
whether as a server certificate or a client certificate. Multiple | server certificate or a client certificate. Multiple bundles may be | |||
bundles may be provided to allow selection among different protocol | provided to allow selection among different Protocol Stacks that may | |||
stacks that may require differently formatted bundles. The form and | require differently formatted bundles. The form and format of the | |||
format of the certificate bundle is implementation-specific. Note | certificate bundle are implementation specific. Note that if the | |||
that if the private keys associated with a bundle are not available, | private keys associated with a bundle are not available, e.g., since | |||
e.g., since they are stored in hardware security modules (HSMs), | they are stored in Hardware Security Modules (HSMs), handshake | |||
handshake callbacks are necessary. See below for details. | callbacks are necessary. See below for details. | |||
SecurityParameters.Set(serverCertificate, myCertificateBundle[]) | SecurityParameters.Set(serverCertificate, myCertificateBundle[]) | |||
SecurityParameters.Set(clientCertificate, myCertificateBundle[]) | SecurityParameters.Set(clientCertificate, myCertificateBundle[]) | |||
6.3.3. Pinned server certificate | 6.3.3. Pinned Server Certificate | |||
Name: pinnedServerCertificate | Name: pinnedServerCertificate | |||
Type: Array of certificate chain objects | Type: Array of certificate chain objects | |||
Default: Empty array | Default: Empty array | |||
Zero or more certificate chains to use as pinned server certificates, | Zero or more certificate chains to use as pinned server certificates, | |||
such that connecting will fail if the presented server certificate | such that connecting will fail if the presented server certificate | |||
does not match one of the supplied pinned certificates. The form and | does not match one of the supplied pinned certificates. The form and | |||
format of the certificate chain is implementation-specific. | format of the certificate chain are implementation specific. | |||
SecurityParameters.Set(pinnedServerCertificate, yourCertificateChain[]) | SecurityParameters.Set(pinnedServerCertificate, yourCertificateChain[]) | |||
6.3.4. Application-layer protocol negotiation | 6.3.4. Application-Layer Protocol Negotiation | |||
Name: alpn | Name: alpn | |||
Type: Array of Strings | Type: Array of strings | |||
Default: Automatic selection | Default: Automatic selection | |||
Application-layer protocol negotiation (ALPN) values: used to | Application-Layer Protocol Negotiation (ALPN) values: used to | |||
indicate which application-layer protocols are negotiated by the | indicate which application-layer protocols are negotiated by the | |||
security protocol layer. See [ALPN] for definition of the ALPN | security protocol layer. See [ALPN] for a definition of the ALPN | |||
field. Note that the Transport Services System can provide ALPN | field. Note that the Transport Services System can provide ALPN | |||
values automatically, based on the protocols being used, if not | values automatically based on the protocols being used, if not | |||
explicitly specified by the application. | explicitly specified by the application. | |||
SecurityParameters.Set(alpn, ["h2"]) | SecurityParameters.Set(alpn, ["h2"]) | |||
6.3.5. Groups, ciphersuites, and signature algorithms | 6.3.5. Groups, Ciphersuites, and Signature Algorithms | |||
Names: supportedGroup, ciphersuite, signatureAlgorithm | Names: supportedGroup, ciphersuite, signatureAlgorithm | |||
Types: Arrays of implementation-specific enumerations | Types: Arrays of implementation-specific enumerations | |||
Default: Automatic selection | Default: Automatic selection | |||
These are used to restrict what cryptographic parameters are used by | These are used to restrict what cryptographic parameters are used by | |||
underlying transport security protocols. When not specified, these | underlying transport security protocols. When not specified, these | |||
algorithms should use known and safe defaults for the system. | algorithms should use known and safe defaults for the system. | |||
SecurityParameters.Set(supportedGroup, secp256r1) | SecurityParameters.Set(supportedGroup, secp256r1) | |||
SecurityParameters.Set(ciphersuite, TLS_AES_128_GCM_SHA256) | SecurityParameters.Set(ciphersuite, TLS_AES_128_GCM_SHA256) | |||
SecurityParameters.Set(signatureAlgorithm, ecdsa_secp256r1_sha256) | SecurityParameters.Set(signatureAlgorithm, ecdsa_secp256r1_sha256) | |||
6.3.6. Session cache options | 6.3.6. Session Cache Options | |||
Names: maxCachedSessions, cachedSessionLifetimeSeconds | Names: maxCachedSessions, cachedSessionLifetimeSeconds | |||
Type: Integer | Type: Integer | |||
Default: Automatic selection | Default: Automatic selection | |||
These values are used to tune session cache capacity and lifetime, | These values are used to tune session cache capacity and lifetime and | |||
and can be extended to include other policies. | can be extended to include other policies. | |||
SecurityParameters.Set(maxCachedSessions, 16) | SecurityParameters.Set(maxCachedSessions, 16) | |||
SecurityParameters.Set(cachedSessionLifetimeSeconds, 3600) | SecurityParameters.Set(cachedSessionLifetimeSeconds, 3600) | |||
6.3.7. Pre-shared key | 6.3.7. Pre-Shared Key | |||
Name: preSharedKey | Name: preSharedKey | |||
Type: Key and identity (platform-specific) | Type: Key and identity (platform specific) | |||
Default: None | Default: None | |||
Used to install pre-shared keying material established out-of-band. | Used to install pre-shared keying material established out of band. | |||
Each instance of pre-shared keying material is associated with some | Each instance of pre-shared keying material is associated with some | |||
identity that typically identifies its use or has some protocol- | identity that typically identifies its use or has some protocol- | |||
specific meaning to the Remote Endpoint. Note that use of a pre- | specific meaning to the Remote Endpoint. Note that the use of a pre- | |||
shared key will tend to select a single security protocol, and | shared key will tend to select a single security protocol and, | |||
therefore directly select a single underlying protocol stack. A | therefore, directly select a single underlying Protocol Stack. A | |||
Transport Services API could express None in an environment-typical | Transport Services API could express None in an environment-typical | |||
way, e.g., as a Union type or special value. | way, e.g., as a Union type or special value. | |||
SecurityParameters.Set(preSharedKey, key, myIdentity) | SecurityParameters.Set(preSharedKey, key, myIdentity) | |||
6.3.8. Connection Establishment Callbacks | 6.3.8. Connection Establishment Callbacks | |||
Security decisions, especially pertaining to trust, are not static. | Security decisions, especially pertaining to trust, are not static. | |||
Once configured, parameters can also be supplied during Connection | Once configured, parameters can also be supplied during Connection | |||
establishment. These are best handled as client-provided callbacks. | establishment. These are best handled as client-provided callbacks. | |||
skipping to change at page 42, line 28 ¶ | skipping to change at line 1891 ¶ | |||
callbacks and events are implemented is specific to each | callbacks and events are implemented is specific to each | |||
implementation. Security handshake callbacks that could be invoked | implementation. Security handshake callbacks that could be invoked | |||
during Connection establishment include: | during Connection establishment include: | |||
* Trust verification callback: Invoked when a Remote Endpoint's | * Trust verification callback: Invoked when a Remote Endpoint's | |||
trust must be verified before the handshake protocol can continue. | trust must be verified before the handshake protocol can continue. | |||
For example, the application could verify an X.509 certificate as | For example, the application could verify an X.509 certificate as | |||
described in [RFC5280]. | described in [RFC5280]. | |||
TrustCallback := NewCallback({ | TrustCallback := NewCallback({ | |||
// Handle trust, return the result | // Handle the trust and return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(TrustCallback) | SecurityParameters.SetTrustVerificationCallback(TrustCallback) | |||
* Identity challenge callback: Invoked when a private key operation | * 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 Endpoint. | Remote Endpoint. | |||
ChallengeCallback := NewCallback({ | ChallengeCallback := NewCallback({ | |||
// Handle challenge | // Handle the challenge | |||
}) | }) | |||
SecurityParameters.SetIdentityChallengeCallback(ChallengeCallback) | SecurityParameters.SetIdentityChallengeCallback(ChallengeCallback) | |||
7. Establishing Connections | 7. 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 preestablishment 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 can be active, using the Initiate action; passive, | Establishment can be active, using the Initiate action; passive, | |||
using the Listen action; or simultaneous for peer-to-peer, using the | using the Listen action; or simultaneous for peer-to-peer | |||
Rendezvous action. These actions are described in the subsections | connections, using the Rendezvous action. These actions are | |||
below. | described in the subsections below. | |||
7.1. Active Open: Initiate | 7.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 the Transport Services API through the Initiate | open is supported by the Transport Services API through the Initiate | |||
action: | action: | |||
Connection := Preconnection.Initiate(timeout?) | Connection := Preconnection.Initiate(timeout?) | |||
skipping to change at page 43, line 33 ¶ | skipping to change at line 1944 ¶ | |||
been called, any changes to the Preconnection MUST NOT have any | 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) can cause | Once Initiate is called, the candidate Protocol Stack(s) can 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 could immediately begin | the specified Remote Endpoint. The caller could immediately begin | |||
sending Messages on the Connection (see Section 9.2) after calling | sending Messages on the Connection (see Section 9.2) after calling | |||
Initiate; note that any data marked as "safely replayable" that is | Initiate; note that any data marked as "safely replayable" that is | |||
sent while the Connection is being established could be sent multiple | sent while the Connection is being established could be sent multiple | |||
times or on multiple candidates. | times or using multiple candidates. | |||
The following events can be sent by the Connection after Initiate is | The following events can be sent by the Connection after Initiate is | |||
called: | 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 9.3) | at least one candidate Path. No Receive events (see Section 9.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 when: | |||
properties and security parameters cannot be fulfilled on a | ||||
Connection for initiation (e.g., the set of available Paths and/or | * the set of transport properties and security parameters cannot be | |||
Protocol Stacks meeting the constraints is empty) or reconciled with | fulfilled on a Connection for initiation (e.g., the set of | |||
the Local and/or Remote Endpoints; when a remote Endpoint Identifier | available Paths and/or Protocol Stacks meeting the constraints is | |||
cannot be resolved; or when no transport-layer connection can be | empty) or reconciled with the Local and/or Remote Endpoints, | |||
established to the Remote Endpoint (e.g., because the Remote Endpoint | ||||
is not accepting connections, the application is prohibited from | * a Remote Endpoint Identifier cannot be resolved, or | |||
opening a Connection by the operating system, or the establishment | ||||
attempt has timed out for any other reason). | * no transport-layer connection can be established to the Remote | |||
Endpoint (e.g., because the Remote Endpoint is not accepting | ||||
connections, the application is prohibited from opening a | ||||
Connection by the operating system, or the establishment attempt | ||||
has 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 9.2.5). | combined in a single action (Section 9.2.5). | |||
7.2. Passive Open: Listen | 7.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 the Transport Services API through the | Passive open is supported by the Transport Services API through the | |||
Listen action and returns a Listener object: | Listen action 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 preestablishment phase with a Local Endpoint | |||
Endpoint object, as well as all properties necessary for Protocol | object, as well as all properties necessary for Protocol Stack | |||
Stack selection. A Remote Endpoint can optionally be specified, to | selection. A Remote Endpoint can optionally be specified, to | |||
constrain what Connections are accepted. | constrain what Connections are accepted. | |||
The Listen action returns a Listener object. Once Listen has been | The Listen action returns a Listener object. Once Listen has been | |||
called, any changes to the Preconnection MUST NOT have any effect on | called, any changes to the Preconnection MUST NOT have any effect on | |||
the Listener. The Preconnection can be disposed of or reused, e.g., | the Listener. The Preconnection can be disposed of or reused, e.g., | |||
to create another Listener. | to create another Listener. | |||
Listener.Stop() | Listener.Stop() | |||
Listening continues until the global context shuts down, or until the | Listening continues until the global context shuts down or until the | |||
Stop action is performed on the Listener object. | Stop action is performed on the Listener object. | |||
Listener -> ConnectionReceived<Connection> | Listener -> ConnectionReceived<Connection> | |||
The ConnectionReceived event occurs when a Remote Endpoint has | The ConnectionReceived event occurs when: | |||
established or cloned (e.g., by creating a new stream in a multi- | ||||
stream transport; see Section 7.4) a transport-layer connection to | * a Remote Endpoint has established or cloned (e.g., by creating a | |||
this Listener (for Connection-oriented transport protocols), or when | new stream in a multi-stream transport; see Section 7.4) a | |||
the first Message has been received from the Remote Endpoint (for | transport-layer connection to this Listener (for Connection- | |||
Connectionless protocols or streams of a multi-streaming transport), | oriented transport protocols), or | |||
causing a new Connection to be created. The resulting Connection is | ||||
contained within the ConnectionReceived event, and is ready to use as | * the first Message has been received from the Remote Endpoint (for | |||
soon as it is passed to the application via the event. | Connectionless protocols or streams of a multi-streaming | |||
transport) causing a new Connection to be created. | ||||
The resulting Connection is contained within the ConnectionReceived | ||||
event and is ready to use as soon as it is passed to the application | ||||
via the event. | ||||
Listener.SetNewConnectionLimit(value) | Listener.SetNewConnectionLimit(value) | |||
If the caller wants to rate-limit the number of inbound Connections | If the caller wants to rate-limit the number of inbound Connections | |||
that will be delivered, it can set a cap using SetNewConnectionLimit. | that will be delivered, it can set a cap using SetNewConnectionLimit. | |||
This mechanism allows a server to protect itself from being drained | This mechanism allows a server to protect itself from being drained | |||
of resources. Each time a new Connection is delivered by the | of resources. Each time a new Connection is delivered by the | |||
ConnectionReceived event, the value is automatically decremented. | ConnectionReceived event, the value is automatically decremented. | |||
Once the value reaches zero, no further Connections will be delivered | Once the value reaches zero, no further Connections will be delivered | |||
until the caller sets the limit to a higher value. By default, this | until the caller sets the limit to a higher value. By default, this | |||
value is Infinite. The caller is also able to reset the value to | value is Infinite. The caller is also able to reset the value to | |||
Infinite at any point. | Infinite at any point. | |||
Listener -> EstablishmentError<reason?> | Listener -> EstablishmentError<reason?> | |||
An EstablishmentError occurs either when the Properties and security | An EstablishmentError occurs when: | |||
parameters of the Preconnection cannot be fulfilled for listening or | ||||
cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | * the Properties and security parameters of the Preconnection cannot | |||
if specified), when the Local Endpoint (or Remote Endpoint, if | be fulfilled for listening or cannot be reconciled with the Local | |||
specified) cannot be resolved, or when the application is prohibited | Endpoint (and/or Remote Endpoint, if specified), | |||
from listening by policy. | ||||
* the Local Endpoint (or Remote Endpoint, if specified) cannot be | ||||
resolved, or | ||||
* the application is prohibited 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. | |||
7.3. Peer-to-Peer Establishment: Rendezvous | 7.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() | |||
A Preconnection object used in a Rendezvous MUST have both the Local | A Preconnection object used in a Rendezvous MUST have both the Local | |||
Endpoint candidates and the Remote Endpoint candidates specified, | Endpoint candidates and the Remote Endpoint candidates specified, | |||
along with the Transport Properties and security parameters needed | along with the Transport Properties and security parameters needed | |||
for Protocol Stack selection, before the Rendezvous action is | for Protocol Stack selection before the Rendezvous action is | |||
initiated. | initiated. | |||
The Rendezvous action listens on the Local Endpoint candidates for an | The Rendezvous action listens on the Local Endpoint candidates for an | |||
incoming Connection from the Remote Endpoint candidates, while also | incoming Connection from the Remote Endpoint candidates, while also | |||
simultaneously trying to establish a Connection from the Local | simultaneously trying to establish a Connection from the Local | |||
Endpoint candidates to the Remote Endpoint candidates. | 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 cause the Transport Services | then initiating a Rendezvous action will cause the Transport Services | |||
Implementation to systematically probe the reachability of those | Implementation to systematically probe the reachability of those | |||
endpoint candidates following an approach such as that used in | endpoint candidates following an approach such as that used in | |||
Interactive Connectivity Establishment (ICE) [RFC8445]. | Interactive Connectivity Establishment (ICE) [RFC8445]. | |||
If the endpoints are suspected to be behind a NAT, and the Local | If the endpoints are suspected to be behind a NAT, and the Local | |||
Endpoint supports a method of discovering NAT bindings, such as | Endpoint supports a method of discovering NAT bindings, such as STUN | |||
Session Traversal Utilities for NAT (STUN) [RFC8489] or Traversal | [RFC8489] or Traversal Using Relays around NAT (TURN) [RFC8656], then | |||
Using Relays around NAT (TURN) [RFC8656], then the Resolve action on | the Resolve action on the Preconnection can be used to discover such | |||
the Preconnection can be used to discover such bindings: | bindings: | |||
[]LocalEndpoint, []RemoteEndpoint := Preconnection.Resolve() | []LocalEndpoint, []RemoteEndpoint := Preconnection.Resolve() | |||
The Resolve call returns lists of Local Endpoints and Remote | The Resolve call returns lists of Local Endpoints and Remote | |||
Endpoints that represent the concrete addresses, local and server | Endpoints that represent the concrete addresses, local and server | |||
reflexive, on which a Rendezvous for the Preconnection will listen | reflexive, on which a Rendezvous for the Preconnection will listen | |||
for incoming Connections, and to which it will attempt to establish | for incoming Connections and to which it will attempt to establish | |||
Connections. | Connections. | |||
Note that the set of Local Endpoints returned by Resolve might or | Note that the set of Local Endpoints returned by Resolve might or | |||
might not contain information about all possible local interfaces | might not contain information about all possible local interfaces, | |||
depending on how the Preconnection is configured. The set of | depending on how the Preconnection is configured. The set of | |||
available local interfaces can also change over time so care needs to | available local interfaces can also change over time, so care needs | |||
be taken when using stored interface names. | to be taken when using stored interface names. | |||
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 at least one Local Endpoint that supports NAT binding | object with at least one Local Endpoint that supports NAT binding | |||
discovery. It will then Resolve the Preconnection, and pass the | discovery. It will then Resolve the Preconnection and pass the | |||
resulting list of Local Endpoint candidates to the peer via a | resulting list of Local Endpoint candidates to the peer via a | |||
signalling protocol, for example as part of an ICE [RFC8445] exchange | signaling protocol, for example, as part of an ICE exchange [RFC8445] | |||
within SIP [RFC3261] or WebRTC [RFC7478]. The peer will then, via | within SIP [RFC3261] or WebRTC [RFC7478]. The peer will then, via | |||
the same signalling channel, return the Remote Endpoint candidates. | the same signaling channel, return the Remote Endpoint candidates. | |||
The set of Remote Endpoint candidates are then configured onto the | The set of Remote Endpoint candidates is then configured on the | |||
Preconnection: | Preconnection: | |||
Preconnection.AddRemote([]RemoteEndpoint) | Preconnection.AddRemote([]RemoteEndpoint) | |||
The Rendezvous action is initiated, and causes the Transport Services | Once the application has added both the Local Endpoint candidates and | |||
Implementation to begin connectivity checks, once the application has | the Remote Endpoint candidates retrieved from the peer via the | |||
added both the Local Endpoint candidates and the Remote Endpoint | signaling channel to the Preconnection, the Rendezvous action is | |||
candidates retrieved from the peer via the signalling channel to the | initiated and causes the Transport Services Implementation to begin | |||
Preconnection. | connectivity checks. | |||
If successful, the Rendezvous action returns a Connection object via | If successful, the Rendezvous action returns a Connection object via | |||
a RendezvousDone<> event: | 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 | |||
with the Remote Endpoint. For Connection-oriented transports, this | the Remote Endpoint. For Connection-oriented transports, this occurs | |||
occurs when the transport-layer connection is established; for | 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 | |||
soon as it is passed to the application via the event. Changes made | as it is passed to the application via the event. Changes made to a | |||
to a Preconnection after Rendezvous has been called MUST NOT have any | Preconnection after Rendezvous has been called MUST NOT have any | |||
effect on existing Connections. | effect on existing Connections. | |||
An EstablishmentError occurs either when the Properties and Security | An EstablishmentError occurs when: | |||
Parameters of the Preconnection cannot be fulfilled for rendezvous or | ||||
cannot be reconciled with the Local and/or Remote Endpoints, when the | * the Properties and Security Parameters of the Preconnection cannot | |||
Local Endpoint or Remote Endpoint cannot be resolved, when no | be fulfilled for rendezvous or cannot be reconciled with the Local | |||
transport-layer connection can be established to the Remote Endpoint, | and/or Remote Endpoints, | |||
or when the application is prohibited from rendezvous by policy: | ||||
* the Local Endpoint or Remote Endpoint cannot be resolved, | ||||
* no transport-layer connection can be established to the Remote | ||||
Endpoint, or | ||||
* the application is prohibited from rendezvous by policy. | ||||
Preconnection -> EstablishmentError<reason?> | Preconnection -> EstablishmentError<reason?> | |||
7.4. Connection Groups | 7.4. Connection Groups | |||
Connection Groups can be created using the Clone action: | Connection Groups can be created using the Clone action: | |||
Connection := Connection.Clone(framer?, connectionProperties?) | Connection := Connection.Clone(framer?, connectionProperties?) | |||
Calling Clone on a Connection yields a Connection Group containing | Calling Clone on a Connection yields a Connection Group containing | |||
two Connections: the parent Connection on which Clone was called, and | two Connections: the parent Connection on which Clone was called and | |||
a resulting cloned Connection. The new Connection is actively | a resulting cloned Connection. The new Connection is actively | |||
opened, and it will locally send a Ready event or an | opened, and it will locally send a Ready event or an | |||
EstablishmentError event. Calling Clone on any of these Connections | EstablishmentError event. Calling Clone on any of these Connections | |||
adds another Connection to the Connection Group. Connections in a | adds another Connection to the Connection Group. Connections in a | |||
Connection Group share all Connection Properties except connPriority | Connection Group share all Connection Properties except connPriority | |||
(see Section 8.1.2), and these Connection Properties are entangled: | (see Section 8.1.2), and these Connection Properties are entangled: | |||
Changing one of the Connection Properties on one Connection in the | changing one of the Connection Properties on one Connection in the | |||
Connection Group automatically changes the Connection Property for | Connection Group automatically changes the Connection Property for | |||
all others. For example, changing connTimeout (see Section 8.1.3) on | all others. For example, changing connTimeout (see Section 8.1.3) on | |||
one Connection in a Connection Group will automatically make the same | one Connection in a Connection Group will automatically make the same | |||
change to this Connection Property for all other Connections in the | change to this Connection Property for all other Connections in the | |||
Connection Group. Like all other Properties, connPriority is copied | Connection Group. Like all other Properties, connPriority is copied | |||
to the new Connection when calling Clone, but in this case, a later | to the new Connection when calling Clone, but, in this case, a later | |||
change to the connPriority on one Connection does not change it on | change to the connPriority on one Connection does not change it on | |||
the other Connections in the same Connection Group. | the other Connections in the same Connection Group. | |||
The optional connectionProperties parameter allows passing Transport | The optional connectionProperties parameter allows passing Transport | |||
Properties that control the behavior of the underlying stream or | Properties that control the behavior of the underlying stream or | |||
connection to be created, e.g., Protocol-specific Properties to | connection to be created, e.g., Protocol-specific Properties to | |||
request specific stream IDs for SCTP or QUIC. | request specific stream IDs for SCTP or QUIC. | |||
Message Properties set on a Connection also apply only to that | Message Properties set on a Connection also apply only to that | |||
Connection. | Connection. | |||
skipping to change at page 48, line 21 ¶ | skipping to change at line 2189 ¶ | |||
Framers can internally maintain per-Connection state. | Framers can internally maintain per-Connection state. | |||
It is also possible to check which Connections belong to the same | It is also possible to check which Connections belong to the same | |||
Connection Group. Calling GroupedConnections on a specific | Connection Group. Calling GroupedConnections on a specific | |||
Connection returns a set of all Connections in the same group. | Connection returns a set of all Connections in the same group. | |||
[]Connection := Connection.GroupedConnections() | []Connection := Connection.GroupedConnections() | |||
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 | the same group, e.g., when a Listener receives a new Connection that | |||
that is just a new stream of an already active multi-streaming | is just a new stream of an already-active multi-streaming protocol | |||
protocol instance. | instance. | |||
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, Connections | use this functionality to implement Clone. In that case, Connections | |||
in a Connection Group are multiplexed together, giving them similar | in a Connection Group are multiplexed together, giving them similar | |||
treatment not only inside Endpoints, but also across the end-to-end | treatment not only inside Endpoints, but also across the end-to-end | |||
Internet path. | Internet path. | |||
Note that calling Clone can result in on-the-wire signaling, e.g., to | Note that calling Clone can result in on-the-wire signaling, e.g., to | |||
open a new transport connection, depending on the underlying Protocol | open a new transport connection, depending on the underlying Protocol | |||
Stack. When Clone leads to the opening of multiple such connections, | Stack. When Clone leads to the opening of multiple such connections, | |||
the Transport Services system will ensure consistency of Connection | the Transport Services system will ensure consistency of Connection | |||
Properties by uniformly applying them to all underlying connections | Properties by uniformly applying them to all underlying connections | |||
in a group. Even in such a case, there are possibilities for a | in a group. Even in such a case, it is possible for a Transport | |||
Transport Services system to implement prioritization within a | Services system to implement prioritization within a Connection Group | |||
Connection Group [TCP-COUPLING] [RFC8699]. | (see [TCP-COUPLING] and [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?> | |||
A CloneError can also occur later, after Clone was successfully | A CloneError can also occur later, after Clone was successfully | |||
called. In this case, it informs the application that the Connection | called. In this case, it informs the application that the Connection | |||
that sends the CloneError is no longer a part of any Connection | that sends the CloneError is no longer a part of any Connection | |||
Group. For example, this can occur when the Transport Services | Group. For example, this can occur when the Transport Services | |||
system is unable to implement entanglement (a Connection Property was | system is unable to implement entanglement (a Connection Property was | |||
changed on a different Connection in the Connection Group, but this | changed on a different Connection in the Connection Group, but this | |||
change could not be successfully applied to the Connection that sends | change could not be successfully applied to the Connection that sends | |||
the CloneError). | the CloneError). | |||
The connPriority Connection Property operates on Connections in a | The connPriority Connection Property operates on Connections in a | |||
Connection Group using the same approach as in Section 9.1.3.2: when | Connection Group using the same approach as that used in | |||
allocating available network capacity among Connections in a | Section 9.1.3.2: when allocating available network capacity among | |||
Connection Group, sends on Connections with numerically lower | Connections in a Connection Group, sends on Connections with | |||
Priority values will be prioritized over sends on Connections that | numerically lower Priority values will be prioritized over sends on | |||
have numerically higher Priority values. Capacity will be shared | Connections that have numerically higher Priority values. Capacity | |||
among these Connections according to the connScheduler property | will be shared among these Connections according to the connScheduler | |||
(Section 8.1.5). See Section 9.2.6 for more. | property (Section 8.1.5). See Section 9.2.6 for more details. | |||
7.5. Adding and Removing Endpoints on a Connection | 7.5. Adding and Removing Endpoints on a Connection | |||
Transport protocols that are explicitly multipath aware are expected | Transport protocols that are explicitly multipath aware are expected | |||
to automatically manage the set of Remote Endpoints that they are | to automatically manage the set of Remote Endpoints that they are | |||
communicating with, and the paths to those endpoints. A PathChange<> | communicating with and the paths to those endpoints. A PathChange | |||
event, described in Section 8.3.2, will be generated when the path | event, described in Section 8.3.2, will be generated when the path | |||
changes. | changes. | |||
In some cases, however, it is necessary to explicitly indicate to a | However, in some cases, it is necessary to explicitly indicate to a | |||
Connection that a new Remote Endpoint has become available for use, | Connection that a new Remote Endpoint has become available for use or | |||
or to indicate that a Remote Endpoint is no longer available. This | indicate that a Remote Endpoint is no longer available. This is most | |||
is most common in the case of peer to peer connections using Trickle | common in the case of peer-to-peer connections using Trickle ICE | |||
ICE [RFC8838]. | [RFC8838]. | |||
The AddRemote action can be used to add one or more new Remote | The AddRemote action can be used to add one or more new Remote | |||
Endpoints to a Connection: | Endpoints to a Connection: | |||
Connection.AddRemote([]RemoteEndpoint) | Connection.AddRemote([]RemoteEndpoint) | |||
Endpoints that are already known to the Connection are ignored. A | Endpoints that are already known to the Connection are ignored. A | |||
call to AddRemote makes the new Remote Endpoints available to the | call to AddRemote makes the new Remote Endpoints available to the | |||
Connection, but whether the Connection makes use of those Endpoints | Connection, but whether the Connection makes use of those Endpoints | |||
will depend on the underlying transport protocol. | will depend on the underlying transport protocol. | |||
Similarly, the RemoveRemote action can be used to tell a Connection | Similarly, the RemoveRemote action can be used to tell a Connection | |||
to stop using one or more Remote Endpoints: | to stop using one or more Remote Endpoints: | |||
Connection.RemoveRemote([]RemoteEndpoint) | Connection.RemoveRemote([]RemoteEndpoint) | |||
Removing all known Remote Endpoints can have the effect of aborting | Removing all known Remote Endpoints can have the effect of aborting | |||
the connection. The effect of removing the active Remote Endpoint(s) | the connection. The effect of removing the active Remote Endpoint(s) | |||
depends on the underlying transport: multipath aware transports might | depends on the underlying transport: multipath-aware transports might | |||
be able to switch to a new path if other reachable Remote Endpoints | be able to switch to a new path if other reachable Remote Endpoints | |||
exist, or the connection might abort. | exist or the connection might abort. | |||
Similarly, the AddLocal and RemoveLocal actions can be used to add | Similarly, the AddLocal and RemoveLocal actions can be used to add | |||
and remove Local Endpoints to/from a Connection. | and remove Local Endpoints to or from a Connection. | |||
8. Managing Connections | 8. Managing Connections | |||
During pre-establishment and after establishment, (Pre-)Connections | During preestablishment and after establishment, Preconnections or | |||
can be configured and queried using Connection Properties, and | Connections can be configured and queried using Connection | |||
asynchronous information could be available about the state of the | Properties, and asynchronous information could be available about the | |||
Connection via SoftError events. | state of the Connection via SoftError events. | |||
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 can be generic, applying regardless of transport protocol, | Properties can 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 8.1 below. | in Section 8.1. | |||
Protocol-specific Properties are defined in a transport- and | Protocol-specific Properties are defined in a way that is specific to | |||
implementation-specific way to permit more specialized protocol | the transport or implementation to permit more specialized protocol | |||
features to be used. Too much reliance by an application on | features to be used. Too much reliance by an application on | |||
Protocol-specific Properties can significantly reduce the flexibility | Protocol-specific Properties can significantly reduce the flexibility | |||
of a transport services system to make appropriate selection and | of a Transport Services system to make appropriate selection and | |||
configuration choices. Therefore, it is RECOMMENDED that Generic | configuration choices. Therefore, it is RECOMMENDED that Generic | |||
Connection Properties are used for properties common across different | Connection Properties be used for properties common across different | |||
protocols and that Protocol-specific Connection Properties are only | protocols and that Protocol-specific Connection Properties are only | |||
used where specific protocols or properties are necessary. | used where specific protocols or properties are necessary. | |||
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 6.2), as well as on | be set during preestablishment (see Section 6.2), as well as on | |||
Connections directly using the SetProperty action: | Connections directly using the SetProperty action: | |||
ErrorCode := Connection.SetProperty(property, value) | ErrorCode := Connection.SetProperty(property, value) | |||
If an error is encountered in setting a property (for example, if the | If an error is encountered in setting a property (for example, if the | |||
application tries to set a TCP-specific property on a Connection that | application tries to set a TCP-specific property on a Connection that | |||
is not using TCP), the application MUST be informed about this error | is not using TCP), the application MUST be informed about this error | |||
via the ErrorCode Object. Such errors MUST NOT cause the Connection | via the ErrorCode Object. Such errors MUST NOT cause the Connection | |||
to be terminated. Note that changing one of the Connection | to be terminated. Note that changing one of the Connection | |||
Properties on one Connection in a Connection Group will also change | Properties on one Connection in a Connection Group will also change | |||
it for all other Connections of that group; see further Section 7.4. | it for all other Connections of that group; see Section 7.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) | value := ConnectionProperties.Get(property) | |||
if ConnectionProperties.Has(boolean_or_preference_property) then ... | 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: | * The Connection state, which can be one of the following: | |||
Establishing, Established, Closing, or Closed (see | Establishing, Established, Closing, or Closed (see | |||
Section 8.1.11.1). | Section 8.1.11.1). | |||
* Whether the Connection can be used to send data (see | * Whether the Connection can be used to send data (see | |||
Section 8.1.11.2). A Connection can not be used for sending if | Section 8.1.11.2). A Connection cannot be used for sending if the | |||
the Connection was created with the Selection Property direction | Connection was created with the Selection Property direction set | |||
set to unidirectional receive or if a Message marked as Final was | to unidirectional receive or if a Message marked as Final was sent | |||
sent over this Connection. See also Section 9.1.3.5. | over this Connection. See also Section 9.1.3.5. | |||
* Whether the Connection can be used to receive data (see | * Whether the Connection can be used to receive data (see | |||
Section 8.1.11.3). A Connection cannot be used for receiving if | Section 8.1.11.3). A Connection cannot be used for receiving if | |||
the Connection was created with the Selection Property direction | the Connection was created with the Selection Property direction | |||
set to unidirectional send or if a Message marked as Final was | set to unidirectional send or if a Message marked as Final was | |||
received. See Section 9.3.3.3. The latter is only supported by | received (see Section 9.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 a half-closed | |||
connection. | connection. | |||
* For Connections that are Established, Closing, or Closed: | * For Connections that are Established, Closing, or Closed: | |||
Connection Properties (Section 8.1) of the actual protocols that | Connection Properties (Section 8.1) of the actual protocols that | |||
were selected and instantiated, and Selection Properties that the | were selected and instantiated, and Selection Properties that the | |||
application specified on the Preconnection. Selection Properties | application specified on the Preconnection. Selection Properties | |||
of type Preference will be exposed as boolean values indicating | of type Preference will be exposed as Boolean values indicating | |||
whether or not the property applies to the selected transport. | whether or not the property applies to the selected transport. | |||
Note that the instantiated Protocol Stack might not match all | Note that the instantiated Protocol Stack might not match all | |||
Protocol Selection Properties that the application specified on | Protocol Selection Properties that the application specified on | |||
the Preconnection. | the Preconnection. | |||
* For Connections that are Established: Transport Services system | * For Connections that are Established: Transport Services system | |||
implementations ought to provide information concerning the | implementations ought to provide information concerning the | |||
path(s) used by the Protocol Stack. This can be derived from | path(s) used by the Protocol Stack. This can be derived from | |||
local PVD information, measurements by the Protocol Stack, or | local PvD information, measurements by the Protocol Stack, or | |||
other sources. For example, a Transport System that is configured | other sources. For example, a transport system that is configured | |||
to receive and process PVD information [RFC7556] could also | to receive and process PvD information [RFC7556] could also | |||
provide network configuration information for the chosen path(s). | provide network configuration information for the chosen path(s). | |||
8.1. Generic Connection Properties | 8.1. Generic Connection Properties | |||
Generic Connection Properties are defined independent of the chosen | Generic Connection Properties are defined independently of the chosen | |||
Protocol Stack and therefore available on all Connections. | Protocol Stack; therefore, they are 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. | |||
8.1.1. Required Minimum Corruption Protection Coverage for Receiving | 8.1.1. Required Minimum Corruption Protection Coverage for Receiving | |||
Name: recvChecksumLen | Name: recvChecksumLen | |||
Type: Integer (non-negative) or Full Coverage | Type: Integer (non-negative) or Full Coverage | |||
skipping to change at page 53, line 4 ¶ | skipping to change at line 2406 ¶ | |||
Connection Priority are given; a Transport Services system could | Connection Priority are given; a Transport Services system could | |||
ignore this property. See Section 9.2.6 for more details. | ignore this property. See Section 9.2.6 for more details. | |||
8.1.3. Timeout for Aborting Connection | 8.1.3. Timeout for Aborting Connection | |||
Name: connTimeout | Name: connTimeout | |||
Type: Numeric (positive) or Disabled | Type: Numeric (positive) or Disabled | |||
Default: Disabled | Default: Disabled | |||
If this property is Numeric, it specifies how long to wait before | If this property is Numeric, it specifies how long to wait before | |||
deciding that an active Connection has failed when trying to reliably | deciding that an active Connection has failed when trying to reliably | |||
deliver data to the Remote Endpoint. Adjusting this property will | deliver data to the Remote Endpoint. Adjustments to this property | |||
only take effect when the underlying stack supports reliability. If | will only take effect if the underlying stack supports reliability. | |||
this property has the enumerated value Disabled, it means that no | If this property has the enumerated value Disabled, it means that no | |||
timeout is scheduled. A Transport Services API could express | timeout is scheduled. A Transport Services API could express | |||
Disabled in an environment-typical way, e.g., as a Union type or | Disabled in an environment-typical way, e.g., as a Union type or | |||
special value. | special value. | |||
8.1.4. Timeout for keep alive packets | 8.1.4. Timeout for Keep-Alive Packets | |||
Name: keepAliveTimeout | Name: keepAliveTimeout | |||
Type: Numeric (positive) or Disabled | Type: Numeric (positive) or Disabled | |||
Default: Disabled | Default: Disabled | |||
A Transport Services API can request a protocol that supports sending | A Transport Services API can request a protocol that supports sending | |||
keep alive packets (Section 6.2.10). If this property is Numeric, it | keep-alive packets (Section 6.2.10). If this property is Numeric, it | |||
specifies the maximum length of time an idle Connection (one for | specifies the maximum length of time an idle Connection (one for | |||
which no transport packets have been sent) ought to wait before the | which no transport packets have been sent) ought to wait before the | |||
Local Endpoint sends a keep-alive packet to the Remote Endpoint. | Local Endpoint sends a keep-alive packet to the Remote Endpoint. | |||
Adjusting this property will only take effect when the underlying | Adjustments to this property will only take effect if the underlying | |||
stack supports sending keep-alive packets. Guidance on setting this | stack supports sending keep-alive packets. Guidance on setting this | |||
value for connection-less transports is provided in [RFC8085]. A | value for connectionless transports is provided in [RFC8085]. A | |||
value greater than the Connection timeout (Section 8.1.3) or the | value greater than the Connection timeout (Section 8.1.3) or the | |||
enumerated value Disabled will disable the sending of keep-alive | enumerated value Disabled will disable the sending of keep-alive | |||
packets. A Transport Services API could express Disabled in an | packets. A Transport Services API could express Disabled in an | |||
environment-typical way, e.g., as a Union type or special value. | environment-typical way, e.g., as a Union type or special value. | |||
8.1.5. Connection Group Transmission Scheduler | 8.1.5. Connection Group Transmission Scheduler | |||
Name: connScheduler | Name: connScheduler | |||
Type: Enumeration | Type: Enumeration | |||
Default: Weighted Fair Queueing (see Section 3.6 of [RFC8260]) | Default: Weighted Fair Queueing (see Section 3.6 of [RFC8260]) | |||
This property specifies which scheduler is used among Connections | This property specifies which scheduler is used among Connections | |||
within a Connection Group to apportion the available capacity | within a Connection Group to apportion the available capacity | |||
according to Connection priorities (see Section 7.4 and | according to Connection priorities (see Sections 7.4 and 8.1.2). A | |||
Section 8.1.2). A set of schedulers is described in [RFC8260]. | set of schedulers is described in [RFC8260]. | |||
8.1.6. Capacity Profile | 8.1.6. Capacity Profile | |||
Name: connCapacityProfile | Name: connCapacityProfile | |||
Type: Enumeration | Type: Enumeration | |||
Default: Default Profile (Best Effort) | Default: Default Profile (Best Effort) | |||
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 trade-offs the application is | |||
to make in path and protocol selection to receive that desired | prepared to make in path and protocol selection to receive that | |||
treatment. When the capacity profile is set to a value other than | desired treatment. When the capacity profile is set to a value other | |||
Default, the Transport Services system SHOULD select paths and | than Default, the Transport Services system SHOULD select paths and | |||
configure protocols to optimize the tradeoff between delay, delay | configure protocols to optimize the trade-off between delay, delay | |||
variation, and efficient use of the available capacity based on the | variation, and efficient use of the available capacity based on the | |||
capacity profile specified. How this is realized is implementation- | capacity profile specified. How this is realized is implementation | |||
specific. The capacity profile MAY also be used to set markings on | specific. The capacity profile MAY also be used to set markings on | |||
the wire for Protocol Stacks supporting this. Recommendations for | the wire for Protocol Stacks supporting this action. Recommendations | |||
use with DSCP are provided below for each profile; note that when a | for use with DSCPs are provided below for each profile; note that | |||
Connection is multiplexed, the guidelines in Section 6 of [RFC7657] | when a Connection is multiplexed, the guidelines in Section 6 of | |||
apply. | [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 Services systems that map the | capacity profile. Transport Services systems that map the | |||
requested capacity profile onto per-connection DSCP signaling | requested capacity profile to per-connection DSCP signaling SHOULD | |||
SHOULD assign the DSCP Default Forwarding [RFC2474] Per Hop | assign the DSCP Default Forwarding Per Hop Behavior (PHB) | |||
Behaviour (PHB). | [RFC2474]. | |||
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 Services systems that map the requested capacity profile | Transport Services systems that map the requested capacity profile | |||
onto per-connection DSCP signaling SHOULD assign the DSCP Less | to per-connection DSCP signaling SHOULD assign the DSCP "Less than | |||
than Best Effort [RFC8622] PHB. | best effort" PHB [RFC8622]. | |||
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. The "Low Latency/Interactive" | |||
to disable the coalescing of multiple small Messages into larger | value of the capacity profile can be used by the system to disable | |||
packets (Nagle's algorithm); to prefer immediate acknowledgment | the coalescing of multiple small Messages into larger packets | |||
from the peer endpoint when supported by the underlying transport; | (Nagle algorithm (see Section 4.2.3.4 of [RFC1122])); to prefer | |||
and so on. Transport Services systems that map the requested | immediate acknowledgement from the peer endpoint when supported by | |||
capacity profile onto per-connection DSCP signaling without | the underlying transport; and so on. Transport Services systems | |||
multiplexing SHOULD assign a DSCP Assured Forwarding | that map the requested capacity profile to per-connection DSCP | |||
(AF41,AF42,AF43,AF44) [RFC2597] PHB. Inelastic traffic that is | signaling without multiplexing SHOULD assign a DSCP Assured | |||
expected to conform to the configured network service rate could | Forwarding (AF41, AF42, AF43, and AF44) PHB [RFC2597]. Inelastic | |||
be mapped to the DSCP Expedited Forwarding [RFC3246] or [RFC5865] | traffic that is expected to conform to the configured network | |||
PHBs. | service rate could be mapped to the DSCP Expedited Forwarding PHBs | |||
[RFC3246] or PHBs as discussed in [RFC5865]. | ||||
Low Latency/Non-Interactive: The application prefers loss to | Low Latency/Non-Interactive: The application prefers loss to latency | |||
latency, but is not interactive. Response time SHOULD be | but is not interactive. Response time SHOULD be optimized at the | |||
optimized at the expense of delay variation and efficient use of | expense of delay variation and efficient use of the available | |||
the available capacity when sending on this Connection. Transport | capacity when sending on this Connection. Transport system | |||
system implementations that map the requested capacity profile | implementations that map the requested capacity profile to per- | |||
onto per-connection DSCP signaling without multiplexing SHOULD | connection DSCP signaling without multiplexing SHOULD assign a | |||
assign a DSCP Assured Forwarding (AF21,AF22,AF23,AF24) [RFC2597] | DSCP Assured Forwarding (AF21, AF22, AF23, and AF24) PHB | |||
PHB. | [RFC2597]. | |||
Constant-Rate Streaming: The application expects to send/receive | Constant-Rate Streaming: The application expects to send/receive | |||
data at a constant rate after Connection establishment. Delay and | data at a constant rate after Connection establishment. Delay and | |||
delay variation SHOULD be minimized at the expense of efficient | delay variation SHOULD be minimized at the expense of efficient | |||
use of the available capacity. This implies that the Connection | use of the available capacity. This implies that the Connection | |||
might fail if the Path is unable to maintain the desired rate. A | might fail if the Path is unable to maintain the desired rate. A | |||
transport can interpret this capacity profile as preferring a | transport can interpret this capacity profile as preferring a | |||
circuit breaker [RFC8084] to a rate-adaptive congestion | circuit breaker [RFC8084] to a rate-adaptive congestion | |||
controller. Transport system implementations that map the | controller. Transport system implementations that map the | |||
requested capacity profile onto per-connection DSCP signaling | requested capacity profile to 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, and AF34) PHB [RFC2597]. | |||
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 Services systems that | relatively long period of time. Transport Services systems that | |||
map the requested capacity profile onto per-connection DSCP | map the requested capacity profile to per-connection DSCP | |||
signaling without multiplexing SHOULD assign a DSCP Assured | signaling without multiplexing SHOULD assign a DSCP Assured | |||
Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per Section 4.8 of | Forwarding (AF11, AF12, AF13, and AF14) PHB [RFC2597] 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 9.1.3.8. | see Section 9.1.3.8. | |||
8.1.7. Policy for using Multipath Transports | 8.1.7. Policy for Using Multipath Transports | |||
Name: multipathPolicy | Name: multipathPolicy | |||
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 Multipath Transport is | multiple paths between the same end hosts if Multipath Transport is | |||
not set to Disabled (see Section 6.2.14). Possible values are: | not set to Disabled (see Section 6.2.14). Possible values are as | |||
follows: | ||||
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 | |||
minimizing the latency will be balanced against the cost of each | minimizing the latency will be balanced against the cost of each | |||
of these paths. Depending on the cost of the lower-latency path, | of these paths. Depending on the cost of the lower-latency path, | |||
the scheduling might choose to use a higher-latency path. Traffic | the scheduling might choose to use a higher-latency path. Traffic | |||
can be scheduled such that data may be transmitted on multiple | can be scheduled such that data may be transmitted on multiple | |||
paths in parallel to achieve a lower latency. The specific | paths in parallel to achieve a lower latency. The specific | |||
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. | |||
8.1.8. Bounds on Send or Receive Rate | 8.1.8. Bounds on Send or Receive Rate | |||
Name: minSendRate / minRecvRate / maxSendRate / maxRecvRate | Name: minSendRate / minRecvRate / maxSendRate / maxRecvRate | |||
Type: Numeric (positive) or Unlimited / Numeric (positive) or | Type: Numeric (positive) or Unlimited / Numeric (positive) or | |||
Unlimited / Numeric (positive) or Unlimited / Numeric (positive) | Unlimited / Numeric (positive) or Unlimited / Numeric (positive) | |||
or Unlimited | or Unlimited | |||
Default: Unlimited / Unlimited / Unlimited / Unlimited | Default: Unlimited / Unlimited / Unlimited / Unlimited | |||
Numeric values of these properties specify an upper-bound rate that a | Numeric values of these properties specify an upper-bound rate that a | |||
transfer is not expected to exceed (even if flow control and | transfer is not expected to exceed (even if flow control and | |||
congestion control allow higher rates), and/or a lower-bound | congestion control allow higher rates) and/or a lower-bound | |||
application-layer rate below which the application does not deem it | application-layer rate below which the application does not deem it | |||
will be useful. These rate values are measured at the application | will be useful. These rate values are measured at the application | |||
layer, i.e. do not consider the header overhead from protocols used | layer, i.e., do not consider the header overhead from protocols used | |||
by the Transport Services system. The values are specified in bits | by the Transport Services system. The values are specified in bits | |||
per second, and assumed to be measured over one-second time | per second and assumed to be measured over one-second time intervals. | |||
intervals. E.g., specifying a maxSendRate of X bits per second means | For example, specifying a maxSendRate of X bits per second means | |||
that, from the moment at which the property value is chosen, not more | that, from the moment at which the property value is chosen, not more | |||
than X bits will be send in any following second. The enumerated | than X bits will be sent in any following second. The enumerated | |||
value Unlimited indicates that no bound is specified. A Transport | value Unlimited indicates that no bound is specified. A Transport | |||
Services API could express Unlimited in an environment-typical way, | Services API could express Unlimited in an environment-typical way, | |||
e.g., as a Union type or special value. | e.g., as a Union type or special value. | |||
8.1.9. Group Connection Limit | 8.1.9. Group Connection Limit | |||
Name: groupConnLimit | Name: groupConnLimit | |||
Type: Numeric (positive) or Unlimited | Type: Numeric (positive) or Unlimited | |||
Default: Unlimited | Default: Unlimited | |||
If this property is Numeric, it controls the number of Connections | If this property is Numeric, it controls the number of Connections | |||
that can be accepted from a peer as new members of the Connection's | that can be accepted from a peer as new members of the Connection's | |||
group. Similar to SetNewConnectionLimit, this limits the number of | group. Similar to SetNewConnectionLimit, this limits the number of | |||
ConnectionReceived events that will occur, but constrained to the | ConnectionReceived events that will occur, but constrained to the | |||
group of the Connection associated with this property. For a multi- | group of the Connection associated with this property. For a multi- | |||
streaming transport, this limits the number of allowed streams. A | streaming transport, this limits the number of allowed streams. A | |||
Transport Services API could express Unlimited in an environment- | Transport Services API could express Unlimited in an environment- | |||
typical way, e.g., as a Union type or special value. | typical way, e.g., as a Union type or special value. | |||
skipping to change at page 57, line 30 ¶ | skipping to change at line 2630 ¶ | |||
Default: false | Default: false | |||
When set to true, this property will initiate new Connections using | When set to true, this property will initiate new Connections using | |||
as little cached information (such as session tickets or cookies) as | as little cached information (such as session tickets or cookies) as | |||
possible from previous Connections that are not in the same | possible from previous Connections that are not in the same | |||
Connection Group. Any state generated by this Connection will only | Connection Group. Any state generated by this Connection will only | |||
be shared with Connections in the same Connection Group. Cloned | be shared with Connections in the same Connection Group. Cloned | |||
Connections will use saved state from within the Connection Group. | Connections will use saved state from within the Connection Group. | |||
This is used for separating Connection Contexts as specified in | This is used for separating Connection Contexts as specified in | |||
Section 4.2.3 of [I-D.ietf-taps-arch]. | Section 4.2.3 of [RFC9621]. | |||
Note that this does not guarantee no leakage of information, as | Note that this does not guarantee that information will not leak | |||
implementations might not be able to fully isolate all caches (e.g. | because implementations might not be able to fully isolate all caches | |||
RTT estimates). Note that this property could degrade Connection | (e.g., RTT estimates). Note that this property could degrade | |||
performance. | Connection performance. | |||
8.1.11. Read-only Connection Properties | 8.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. | |||
8.1.11.1. Connection state | 8.1.11.1. Connection State | |||
Name: connState | Name: connState | |||
Type: Enumeration | Type: Enumeration | |||
This property informs about the current state of the Connection. | This property provides information about the current state of the | |||
Possible values are: Establishing, Established, Closing or Closed; | Connection. Possible values are Establishing, Established, Closing, | |||
for more details on Connection state, see Section 11. | or Closed. For more details on Connection state, see Section 11. | |||
8.1.11.2. Can Send Data | 8.1.11.2. Can Send Data | |||
Name: canSend | Name: canSend | |||
Type: Boolean | Type: Boolean | |||
This property can be queried to learn whether the Connection can be | This property can be queried to learn whether the Connection can be | |||
used to send data. | used to send data. | |||
skipping to change at page 58, line 34 ¶ | skipping to change at line 2681 ¶ | |||
Name: singularTransmissionMsgMaxLen | Name: singularTransmissionMsgMaxLen | |||
Type: Integer (non-negative) or Not applicable | Type: Integer (non-negative) or Not applicable | |||
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 at the | that can be sent without incurring network-layer fragmentation at the | |||
sender. It is specified as a number of bytes and is less than or | sender. It is specified as a number of bytes and is less than or | |||
equal to the Maximum Message Size on Send. It exposes a readable | equal to the Maximum Message Size on Send. It exposes a readable | |||
value to the application based on the Maximum Packet Size (MPS). The | value to the application based on the Maximum Packet Size (MPS). The | |||
value of this property can change over time (and can be updated by | value of this property can change over time (and can be updated via | |||
Datagram PLPMTUD [RFC8899]). This value allows a sending stack to | Datagram Packetization Layer Path MTU Discovery (DPLPMTUD) | |||
avoid unwanted fragmentation at the network-layer or segmentation by | [RFC8899]). This value allows a sending stack to avoid unwanted | |||
the transport layer before choosing the message size and/or after a | fragmentation at the network layer or segmentation by the transport | |||
SendError occurs indicating an attempt to send a Message that is too | layer before choosing the message size and/or after a SendError | |||
large. A Transport Services API could express Not applicable in an | occurs indicating an attempt to send a Message that is too large. A | |||
Transport Services API could express Not applicable in an | ||||
environment-typical way, e.g., as a Union type or special value | environment-typical way, e.g., as a Union type or special value | |||
(e.g., 0). | (e.g., 0). | |||
8.1.11.5. Maximum Message Size on Send | 8.1.11.5. Maximum Message Size on Send | |||
Name: sendMsgMaxLen | Name: sendMsgMaxLen | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
This property represents the maximum Message size that an application | This property represents the maximum Message size that an application | |||
skipping to change at page 59, line 15 ¶ | skipping to change at line 2711 ¶ | |||
8.1.11.6. Maximum Message Size on Receive | 8.1.11.6. Maximum Message Size on Receive | |||
Name: recvMsgMaxLen | Name: recvMsgMaxLen | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
This property represents the maximum Message size that an application | This property represents the maximum Message size that an application | |||
can receive. It is specified as the number of bytes. A value of 0 | can receive. It is specified as the number of bytes. A value of 0 | |||
indicates that receiving is not possible. | indicates that receiving is not possible. | |||
8.2. TCP-specific Properties: User Timeout Option (UTO) | 8.2. TCP-Specific Properties: User Timeout Option (UTO) | |||
These properties specify configurations for the TCP User Timeout | These properties specify configurations for the TCP User Timeout | |||
Option (UTO). This is a TCP-specific property, that is only used in | Option (UTO). This is a TCP-specific property that is only used in | |||
the case that TCP becomes the chosen transport protocol and useful | the case that TCP becomes the chosen transport protocol. It is | |||
only if TCP is implemented in the Transport Services system. | useful only if TCP is implemented in the Transport Services system. | |||
Protocol-specific options could also be defined for other transport | Protocol-specific options could also be defined for other transport | |||
protocols. | protocols. | |||
These are included here because the feature Suggest timeout to the | These properties are included here because the feature Suggest | |||
peer is part of the minimal set of transport services [RFC8923], | timeout to the peer is part of the minimal set of Transport Services | |||
where this feature was categorized as "functional". This means that | [RFC8923], where this feature was categorized as "functional". This | |||
when a Transport Services system offers this feature, the Transport | means that when a Transport Services system offers this feature, the | |||
Services API has to expose an interface to the application. | Transport Services API has to expose an interface 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]. | |||
8.2.1. Advertised User Timeout | 8.2.1. Advertised User Timeout | |||
Name: tcp.userTimeoutValue | Name: tcp.userTimeoutValue | |||
Type: Integer (positive) | Type: Integer (positive) | |||
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] to the Remote Endpoint which can use it to adapt its own | [RFC5482] to the Remote Endpoint, which can use it to adapt its own | |||
Timeout for aborting Connection (see Section 8.1.3) value. | Timeout for aborting the Connection (see Section 8.1.3) value. | |||
8.2.2. User Timeout Enabled | 8.2.2. User Timeout Enabled | |||
Name: tcp.userTimeoutEnabled | Name: tcp.userTimeoutEnabled | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property controls whether the TCP UTO option is enabled for a | This property controls whether the TCP UTO is enabled for a | |||
connection. This applies to both sending and receiving. | connection. This applies to both sending and receiving. | |||
8.2.3. Timeout Changeable | 8.2.3. Timeout Changeable | |||
Name: tcp.userTimeoutChangeable | Name: tcp.userTimeoutChangeable | |||
Type: Boolean | Type: Boolean | |||
Default: true | Default: true | |||
This property controls whether the TCP connTimeout (see | This property controls whether the TCP connTimeout (see | |||
Section 8.1.3) can be changed based on a UTO option received from the | Section 8.1.3) can be changed based on a UTO received from the remote | |||
remote peer. This boolean becomes false when connTimeout (see | peer. This Boolean becomes false when connTimeout (see | |||
Section 8.1.3) is used. | Section 8.1.3) is used. | |||
8.3. Connection Lifecycle Events | 8.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. | |||
8.3.1. Soft Errors | 8.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<> | |||
8.3.2. Path change | 8.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, the set of local endpoints changes, or a | paths are added or removed, the set of local endpoints changes, or a | |||
handover has been performed. | handover has been performed. | |||
Connection -> PathChange<> | Connection -> PathChange<> | |||
9. Data Transfer | 9. 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. | |||
9.1. Messages and Framers | 9.1. Messages and Framers | |||
Each Message has an optional Message Context, which allows adding | Each Message has an optional Message Context, which allows adding | |||
Message Properties, identify Send events related to a specific | Message Properties, to identify Send events related to a specific | |||
Message or to inspect meta-data related to the Message sent. Framers | Message or to inspect metadata 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. | |||
9.1.1. Message Contexts | 9.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 | metadata of the Message, including Message Properties (see | |||
Section 9.1.3) and framing meta-data (see Section 9.1.2.2). | Section 9.1.3) and framing metadata (see Section 9.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 event related to Send and Receive. | |||
Message Properties can be set and queried using the Message Context: | Message Properties can be set and queried using the Message Context: | |||
MessageContext.add(property, value) | MessageContext.add(property, value) | |||
PropertyValue := MessageContext.get(property) | PropertyValue := MessageContext.get(property) | |||
These Message Properties can be generic properties or Protocol- | These Message Properties can be generic properties or Protocol- | |||
specific Properties. | specific Properties. | |||
For MessageContexts returned by Send events (see Section 9.2.2) and | For MessageContexts returned by Send events (see Section 9.2.2) and | |||
skipping to change at page 62, line 6 ¶ | skipping to change at line 2843 ¶ | |||
9.1.2. Message Framers | 9.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 | |||
decapsulate or decode inbound data into Messages. Message Framers | decapsulate or decode inbound data into Messages. Message Framers | |||
allow message boundaries to be preserved when using a Connection | allow message boundaries to be preserved when using a Connection | |||
object, even when using byte-stream transports. This is designed | object, even when using byte-stream transports. This is designed | |||
based on the fact that many of the current application protocols | based on the fact that many of the application protocols in use at | |||
evolved over TCP, which does not provide message boundary | the time of writing evolved over TCP, which does not provide message | |||
preservation, and since many of these protocols require message | boundary preservation; because many of these protocols require | |||
boundaries to function, each application layer protocol has defined | message boundaries to function, each application-layer protocol has | |||
its own framing. | defined its own framing. | |||
To use a Message Framer, the application adds it to its Preconnection | To use a Message Framer, the application adds it to its Preconnection | |||
object. Then, the Message Framer can intercept all calls to Send or | object. Then, the Message Framer can intercept all calls to Send or | |||
Receive on a Connection to add Message semantics, in addition to | Receive on a Connection to add Message semantics, in addition to | |||
interacting with the setup and teardown of the Connection. A Framer | interacting with the setup and teardown of the Connection. A Framer | |||
can start sending data before the application sends data if the | can start sending data before the application sends data if the | |||
framing protocol requires a prefix or handshake (see [RFC9329] for an | framing protocol requires a prefix or handshake (see [RFC9329] for an | |||
example of such a framing protocol). | example of such a framing protocol). | |||
Initiate() Send() Receive() Close() | Initiate() Send() Receive() Close() | |||
skipping to change at page 62, line 47 ¶ | skipping to change at line 2884 ¶ | |||
+----+----------+---------^----------+-----+ | +----+----------+---------^----------+-----+ | |||
| | | | | | | | | | |||
| +-----------------+ | | | +-----------------+ | | |||
| | Byte-stream | | | | | Byte-stream | | | |||
| +-----------------+ | | | +-----------------+ | | |||
| | | | | | | | | | |||
+----v----------v---------+----------v-----+ | +----v----------v---------+----------v-----+ | |||
| Transport Protocol Stack | | | Transport Protocol Stack | | |||
+------------------------------------------+ | +------------------------------------------+ | |||
Figure 1: Protocol Stack showing a Message Framer | Figure 1: Protocol Stack Showing a Message Framer | |||
Note that while Message Framers add the most value when placed above | Note that while Message Framers add the most value when placed above | |||
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 a transformation to further encode or encapsulate, | cases, they add a transformation to further encode or encapsulate and | |||
and can potentially support packing multiple application-layer | can potentially support packing multiple application-layer Messages | |||
Messages into individual transport datagrams. | 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 [RFC9623]. | |||
9.1.2.1. Adding Message Framers to Pre-Connections | 9.1.2.1. Adding Message Framers to Preconnections | |||
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 can be added | to run on top of transport protocols. Multiple Framers can 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 | |||
might result in the creation of a Connection. | might result in the creation of a Connection. | |||
9.1.2.2. Framing Meta-Data | 9.1.2.2. Framing Metadata | |||
When sending Messages, applications can add Framer-specific | When sending Messages, applications can add Framer-specific | |||
properties to a MessageContext (Section 9.1.1) with the add action. | properties to a MessageContext (Section 9.1.1) with the add action. | |||
To avoid naming conflicts, the property names SHOULD be prefixed with | To avoid naming conflicts, the property names SHOULD be prefixed with | |||
a namespace referencing the framer implementation or the protocol it | a namespace referencing the framer implementation or the protocol it | |||
implements as described in Section 4.1. | implements as described in Section 4.1. | |||
This mechanism can be used, for example, to set the type of a Message | This mechanism can be used, for example, to set the type of a Message | |||
for a TLV format. The namespace of values is custom for each unique | for a TLV format. The namespace of values is custom for each unique | |||
Message Framer. | Message Framer. | |||
skipping to change at page 64, line 23 ¶ | skipping to change at line 2952 ¶ | |||
messageContext.add(httpFramer, "accept", "text/html") | messageContext.add(httpFramer, "accept", "text/html") | |||
9.1.3. Message Properties | 9.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 9.1.1. | action. For other uses of the Message Context, see Section 9.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 9.2.3). All data blocks associated with a single | are sent (Section 9.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 and then allow the end of the 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) | |||
Connection.Send(messageData, messageContext) | Connection.Send(messageData, messageContext) | |||
The simpler form of Send, which does not take any MessageContext, is | The simpler form of Send, which does not take any MessageContext, is | |||
skipping to change at page 65, line 28 ¶ | skipping to change at line 3006 ¶ | |||
set to Require and a protocol with configurable per-Message | set to Require and a protocol with configurable per-Message | |||
reliability is used, setting msgReliable to false for a particular | reliability is used, setting msgReliable to false for a particular | |||
Message will allow this Message to be sent without any reliability | Message will allow this Message to be sent without any reliability | |||
guarantees. Changing the msgReliable Message Property is only | guarantees. Changing the msgReliable Message Property is only | |||
possible for Connections that were established enabling the Selection | possible for Connections that were established enabling the Selection | |||
Property perMsgReliability. If the contradicting Message Property | Property perMsgReliability. If the contradicting Message Property | |||
cannot be supported by the Connection (such as requiring reliability | cannot be supported by the Connection (such as requiring reliability | |||
on a Connection that uses an unreliable protocol), the Send action | on a Connection that uses an unreliable protocol), the Send action | |||
will result in a SendError event. | will result in a SendError event. | |||
The following Message Properties are supported: | The Message Properties in the following subsections are supported. | |||
9.1.3.1. Lifetime | 9.1.3.1. Lifetime | |||
Name: msgLifetime | Name: msgLifetime | |||
Type: Numeric (positive) | Type: Numeric (positive) | |||
Default: infinite | Default: infinite | |||
The Lifetime specifies how long a particular Message can wait in the | The Lifetime specifies how long a particular Message can wait in the | |||
skipping to change at page 65, line 50 ¶ | skipping to change at line 3028 ¶ | |||
After this time, it is irrelevant and no longer needs to be | After this time, it is irrelevant and no longer needs to be | |||
(re-)transmitted. This is a hint to the Transport Services system -- | (re-)transmitted. This is a hint to the Transport Services system -- | |||
it is not guaranteed that a Message will not be sent when its | it is not guaranteed that a Message will not be sent when its | |||
Lifetime has expired. | 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 | |||
perMsgReliability property (see Section 9.1.3.7). The type and units | perMsgReliability property (see Section 9.1.3.7). The type and units | |||
of Lifetime are implementation-specific. | of Lifetime are implementation specific. | |||
9.1.3.2. Priority | 9.1.3.2. Priority | |||
Name: msgPriority | Name: msgPriority | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
Default: 100 | Default: 100 | |||
This property specifies the priority of a Message, relative to other | This property specifies the priority of a Message, relative to other | |||
Messages sent over the same Connection. A numerically lower value | Messages sent over the same Connection. A numerically lower value | |||
represents a higher priority. | represents a higher priority. | |||
A Message with Priority 2 will yield to a Message with Priority 1, | A Message with Priority 2 will yield to a Message with Priority 1, | |||
which will yield to a Message with Priority 0, and so on. Priorities | which will yield to a Message with Priority 0, and so on. Priorities | |||
can be used as a sender-side scheduling construct only, or be used to | can 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 connPriority | Note that this property is not a per-Message override of | |||
- see Section 8.1.2. The priority properties might interact, but can | connPriority; see Section 8.1.2. The priority properties might | |||
be used independently and be realized by different mechanisms; see | interact, but they can be used independently and be realized by | |||
Section 9.2.6. | different mechanisms; see Section 9.2.6. | |||
9.1.3.3. Ordered | 9.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 | |||
preserveOrder (Section 6.2.4) | preserveOrder (Section 6.2.4) | |||
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 all | Send action will be preserved on delivery via Receive events for all | |||
Messages on a Connection that have this Message Property set to true. | Messages on a Connection that have this Message Property set to 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 6.2.4, but | that support preservation of data ordering (see Section 6.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. | |||
If it is not configured by the application before sending, this | If it is not configured by the application before sending, this | |||
property's default value will be based on the Selection Property | property's default value will be based on the Selection Property | |||
preserveOrder of the Connection associated with the Send action. | preserveOrder of the Connection associated with the Send action. | |||
9.1.3.4. Safely Replayable | 9.1.3.4. Safely Replayable | |||
Name: safelyReplayable | Name: safelyReplayable | |||
skipping to change at page 67, line 41 ¶ | skipping to change at line 3112 ¶ | |||
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 | |||
effectively closed in the sending direction. For example, TCP-based | effectively closed in the sending direction. For example, TCP-based | |||
Connections can send a FIN once a Message marked as Final has been | Connections can send a FIN once a Message marked as Final has been | |||
completely sent, indicated by marking endOfMessage. Protocols that | completely sent, indicated by marking endOfMessage. Protocols that | |||
do not support signalling the end of a Connection in a given | do not support signaling the end of a Connection in a given direction | |||
direction will ignore this property. | 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 reorder 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. | |||
9.1.3.6. Sending Corruption Protection Length | 9.1.3.6. Sending Corruption Protection Length | |||
Name: msgChecksumLen | Name: msgChecksumLen | |||
Type: Integer (non-negative) or Full Coverage | Type: Integer (non-negative) or Full Coverage | |||
Default: Full Coverage | Default: Full Coverage | |||
If this property is an Integer, it specifies the minimum length of | If this property is an Integer, it specifies the minimum length of | |||
the section of a sent Message, starting from byte 0, that the | the section of a sent Message, starting from byte 0, that the | |||
application requires to be delivered without corruption due to lower | application requires to be delivered without corruption due to lower- | |||
layer errors. It is used to specify options for simple integrity | layer errors. It is used to specify options for simple integrity | |||
protection via checksums. A value of 0 means that no checksum needs | protection via checksums. A value of 0 means that no checksum needs | |||
to be calculated, and the enumerated value Full Coverage means that | to be calculated, and the enumerated value Full Coverage means that | |||
the entire Message needs to be protected by a checksum. Only Full | the entire Message needs to be protected by a checksum. Only Full | |||
Coverage is guaranteed, any other requests are advisory, which may | Coverage is guaranteed: any other requests are advisory, which may | |||
result in Full Coverage being applied. | result in Full Coverage being applied. | |||
9.1.3.7. Reliable Data Transfer (Message) | 9.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 6.2.1) | reliability (Section 6.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 that all data is | |||
by the Remote Endpoint. Changing the msgReliable property on | received by the Remote Endpoint. Changing the msgReliable property | |||
Messages is only possible for Connections that were established | on Messages is only possible for Connections that were established | |||
enabling the Selection Property perMsgReliability. When this is not | enabling the Selection Property perMsgReliability. When this is not | |||
the case, changing msgReliable will generate an error. | the case, changing msgReliable will generate an error. | |||
Disabling this property indicates that the Transport Services system | Disabling this property indicates that the Transport Services system | |||
could disable retransmissions or other reliability mechanisms for | could disable retransmissions or other reliability mechanisms for | |||
this particular Message, but such disabling is not guaranteed. | this particular Message, but such disabling is not guaranteed. | |||
If it is not configured by the application before sending, this | If it is not configured by the application before sending, this | |||
property's default value will be based on the Selection Property | property's default value will be based on the Selection Property | |||
reliability of the Connection associated with the Send action. | reliability of the Connection associated with the Send action. | |||
skipping to change at page 69, line 4 ¶ | skipping to change at line 3169 ¶ | |||
If it is not configured by the application before sending, this | If it is not configured by the application before sending, this | |||
property's default value will be based on the Selection Property | property's default value will be based on the Selection Property | |||
reliability of the Connection associated with the Send action. | reliability of the Connection associated with the Send action. | |||
9.1.3.8. Message Capacity Profile Override | 9.1.3.8. Message Capacity Profile Override | |||
Name: msgCapacityProfile | Name: msgCapacityProfile | |||
Type: Enumeration | Type: Enumeration | |||
Default: inherited from the Connection Property connCapacityProfile | Default: inherited from the Connection Property connCapacityProfile | |||
(Section 8.1.6) | (Section 8.1.6) | |||
This enumerated property specifies the application's preferred | This enumerated property specifies the application's preferred trade- | |||
tradeoffs for sending this Message; it is a per-Message override of | offs for sending this Message; it is a per-Message override of the | |||
the connCapacityProfile Connection Property (see Section 8.1.6). If | connCapacityProfile Connection Property (see Section 8.1.6). If it | |||
it is not configured by the application before sending, this | is not configured by the application before sending, this property's | |||
property's default value will be based on the Connection Property | default value will be based on the Connection Property | |||
connCapacityProfile of the Connection associated with the Send | connCapacityProfile of the Connection associated with the Send | |||
action. | action. | |||
9.1.3.9. No Network-Layer Fragmentation | 9.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 | This property specifies that a Message should be sent and received | |||
without network-layer fragmentation, if possible. It can be used to | without network-layer fragmentation, if possible. It can be used to | |||
avoid network layer fragmentation when transport segmentation is | avoid network-layer fragmentation when transport segmentation is | |||
preferred. | preferred. | |||
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 sender to avoid network-layer source | property to true will cause the sender to avoid network-layer source | |||
fragmentation. When using IPv4, this will result in the Don't | fragmentation. When using IPv4, this will result in the Don't | |||
Fragment bit being set in the IP header. | Fragment (DF) bit being set in the IP header. | |||
Attempts to send a Message with this property that result in a size | Attempts to send a Message with this property that result in a 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) can result in transport | size (singularTransmissionMsgMaxLen) can result in transport | |||
segmentation when permitted, or in a SendError. | segmentation when permitted or in a SendError. | |||
Note: noSegmentation is used when it is desired to only send a | | Note: noSegmentation is used when it is desired to send a | |||
Message within a single network packet. | | Message within a single network packet. | |||
9.1.3.10. No Segmentation | 9.1.3.10. No Segmentation | |||
Name: noSegmentation | Name: noSegmentation | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
When set to true, this property requests the transport layer to not | ||||
When set to true, this property requests that the transport layer not | ||||
provide segmentation of Messages larger than the maximum size | provide segmentation of Messages larger than the maximum size | |||
permitted by the network layer, and also to avoid network-layer | permitted by the network layer and that it avoid network-layer source | |||
source fragmentation of Messages. When running over IPv4, setting | fragmentation of Messages. When running over IPv4, setting this | |||
this property to true will result in a sending endpoint setting the | property to true will result in a sending endpoint setting the Don't | |||
Don't Fragment bit in the IPv4 header of packets generated by the | Fragment bit in the IPv4 header of packets generated by the transport | |||
transport layer. | layer. | |||
An attempt to send a Message that results in a size greater than the | An attempt to send a Message that results in a size greater than the | |||
transport's current estimate of its maximum packet size | transport's current estimate of its maximum packet size | |||
(singularTransmissionMsgMaxLen) will result in a SendError. This | (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 layers support this | |||
functionality. | functionality. | |||
9.2. Sending Data | 9.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 9.2.1). All Send | optional per-Message properties (see Section 9.2.1). All Send | |||
actions are asynchronous, and deliver events (see Section 9.2.2). | actions are asynchronous and deliver events (see Section 9.2.2). | |||
Sending partial Messages for streaming large data is also supported | Sending partial Messages for streaming large data is also supported | |||
(see Section 9.2.3). | (see Section 9.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 metadata related to the Message sent | |||
sent (see Section 9.1.1). | (see Section 9.1.1). | |||
The optional endOfMessage parameter supports partial sending and is | The optional endOfMessage parameter supports partial sending and is | |||
described in Section 9.2.3. | described in Section 9.2.3. | |||
9.2.1. Basic Sending | 9.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. | |||
skipping to change at page 71, line 4 ¶ | skipping to change at line 3259 ¶ | |||
described in Section 9.2.3. | described in Section 9.2.3. | |||
9.2.1. Basic Sending | 9.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 | by the Connection's transport properties. For example, a Message | |||
could be the payload of a single datagram for a UDP Connection; or an | could be the payload of a single datagram for a UDP Connection. | |||
HTTP Request for an HTTP Connection. | Another example would be an HTTP Request for an HTTP Connection. | |||
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 sendMsgMaxLen (Section 8.1.11.5) to | query the Connection Property sendMsgMaxLen (Section 8.1.11.5) to | |||
determine the maximum size allowed for a single Message. If a | determine the maximum size allowed for a single Message. If a | |||
Message is too large to fit in the Maximum Message Size for the | Message is too large to fit in the Maximum Message Size for the | |||
Connection, the Send will fail with a SendError event | Connection, the Send will fail with a SendError event | |||
(Section 9.2.2.3). For example, it is invalid to send a Message over | (Section 9.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. | |||
9.2.2. Send Events | 9.2.2. Send Events | |||
Like all actions in Transport Services API, the Send action is | Like all actions in the Transport Services API, the Send action is | |||
asynchronous. There are several events that can be delivered in | asynchronous. There are several events that can be delivered in | |||
response to sending a Message. Exactly one event (Sent, Expired, or | response to sending a Message. Exactly one event (Sent, Expired, or | |||
SendError) will be delivered in response to each call to Send. | SendError) will be delivered in response to each call to Send. | |||
Note that if partial Send calls are used (Section 9.2.3), there will | Note that, if partial Send calls are used (Section 9.2.3), there will | |||
still be exactly one Send event delivered for each call to Send. For | still 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 Transport Services API should allow the application to correlate | The Transport Services API should allow the application to correlate | |||
which Send action resulted in a particular Send event. The manner in | a Send event to the particular call to Send that triggered the event. | |||
which this correlation is indicated is implementation-specific. | The manner in which this correlation is indicated is implementation | |||
specific. | ||||
9.2.2.1. Sent | 9.2.2.1. Sent | |||
Connection -> Sent<messageContext> | Connection -> Sent<messageContext> | |||
The Sent event occurs when a previous Send call has completed, i.e., | The Sent event occurs when a previous Send call has completed, i.e., | |||
when the data derived from the Message has been passed down or | when the data derived from the Message has been passed down or | |||
through the underlying Protocol Stack and is no longer the | through the underlying Protocol Stack and is no longer the | |||
responsibility of the Transport Services API. The exact disposition | responsibility of the Transport Services API. The exact disposition | |||
of the Message (i.e., whether it has actually been transmitted, moved | of the Message (i.e., whether it has actually been transmitted, moved | |||
into a buffer on the network interface, moved into a kernel buffer, | into a buffer on the network interface, moved into a kernel buffer, | |||
and so on) when the Sent event occurs is implementation-specific. | and so on) when the Sent event occurs is implementation specific. | |||
The Sent event contains a reference to the Message Context of the | The Sent event contains a reference to the Message Context of the | |||
Message to which it applies. | 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 Services system than an | created more buffer inside the Transport Services system than an | |||
application that always waits for the Sent event before calling the | application that always waits for the Sent event before calling the | |||
next Send action. | next Send action. | |||
9.2.2.2. Expired | 9.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 9.1.3.1) expired. This is separate from SendError, as | (see Section 9.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 Context of the | Expired event contains a reference to the Message Context of the | |||
Message to which it applies. | Message to which it applies. | |||
9.2.2.3. SendError | 9.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 that is too large for the | condition: an attempt to send a Message that 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 Context of the Message to which it applies. | reference to the Message Context of the Message to which it applies. | |||
9.2.3. Partial Sends | 9.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 | |||
might be too large for the application to hold in memory at one time, | might be too large for the application to hold in memory at one time | |||
or the length of the Message might be unknown or unbounded. | or the length of the Message might be unknown or unbounded. | |||
Partial Message sending is supported by passing an endOfMessage | Partial Message sending is supported by passing an endOfMessage | |||
Boolean parameter to the Send action. This value is always true by | Boolean parameter to the Send action. This value is always true by | |||
default, and the simpler forms of Send are equivalent to passing true | default, and the simpler forms of Send are equivalent to passing true | |||
for endOfMessage. | for endOfMessage. | |||
The following example sends a Message in two separate calls to Send. | The following example sends a Message in two separate calls to Send: | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
messageData := "hel" | messageData := "hel" | |||
endOfMessage := false | endOfMessage := false | |||
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. | |||
9.2.4. Batching Sends | 9.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() | |||
9.2.5. Send on Active Open: InitiateWithSend | 9.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, | Connection := Preconnection.InitiateWithSend(messageData, | |||
messageContext?, | messageContext?, | |||
timeout?) | 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" using the | Message passed to InitiateWithSend as "safely replayable" using the | |||
safelyReplayable property. This allows the Transport Services system | safelyReplayable property. This allows the Transport Services system | |||
to make use of 0-RTT establishment in case this is supported by the | to make use of 0-RTT establishment in case this is supported by the | |||
available Protocol Stacks. When the selected stack(s) do not support | available Protocol Stacks. When the selected stack or stacks do not | |||
transmitting data upon connection establishment, InitiateWithSend is | support transmitting data upon connection establishment, | |||
identical to Initiate followed by Send. | InitiateWithSend is identical to 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 are sent after InitiateWithSend are equivalent to | The events that are sent after InitiateWithSend are equivalent to | |||
those that would be sent by an invocation of Initiate followed | 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 EstablishmentError | will not result in a SendError separate from the EstablishmentError | |||
signaling the failure of Connection establishment. | signaling the failure of Connection establishment. | |||
9.2.6. Priority and the Transport Services API | 9.2.6. Priority and the Transport Services API | |||
The Transport Services API provides two properties to allow a sender | The Transport Services API provides two properties to allow a sender | |||
to signal the relative priority of data transmission: msgPriority | to signal the relative priority of data transmission: msgPriority | |||
Section 9.1.3.2 and connPriority Section 8.1.2. These properties are | (see Section 9.1.3.2) and connPriority (see Section 8.1.2). These | |||
designed to allow the expression and implementation of a wide variety | properties are designed to allow the expression and implementation of | |||
of approaches to transmission priority in the transport and | a wide variety of approaches to transmission priority in the | |||
application layer, including those which do not appear on the wire | transport and application layers, including those that do not appear | |||
(affecting only sender-side transmission scheduling) as well as those | on the wire (affecting only sender-side transmission scheduling) as | |||
that do (e.g. [RFC9218]. A Transport Services system gives no | well as those that do (e.g., [RFC9218]). A Transport Services system | |||
guarantees about how its expression of relative priorities will be | gives no guarantees about how its expression of relative priorities | |||
realized. | will be realized. | |||
The Transport Services API does order connPriority over msgPriority. | The Transport Services API does order connPriority over msgPriority. | |||
In the absence of other externalities (e.g., transport-layer flow | In the absence of other externalities (e.g., transport-layer flow | |||
control), a priority 1 Message on a priority 0 Connection will be | control), a priority 1 Message on a priority 0 Connection will be | |||
sent before a priority 0 Message on a priority 1 Connection in the | sent before a priority 0 Message on a priority 1 Connection in the | |||
same group. | same group. | |||
9.3. Receiving Data | 9.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 property is set to unidirectional send). As | (unless the direction property is set to unidirectional send). As | |||
with sending, the data is received in Messages. Receiving is an | with sending, the data is received in Messages. Receiving is an | |||
asynchronous operation, in which each call to Receive enqueues a | asynchronous operation in which each call to Receive enqueues a | |||
request to receive new data from the Connection. Once data has been | request to receive new data from the Connection. Once data has been | |||
received, or an error is encountered, an event will be delivered to | received, or an error is encountered, an event will be delivered to | |||
complete any pending Receive requests (see Section 9.3.2). If | complete any pending Receive requests (see Section 9.3.2). If | |||
Messages arrive at the Transport Services system before Receive | Messages arrive at the Transport Services system before Receive | |||
requests are issued, ensuing Receive requests will first operate on | requests are issued, ensuing Receive requests will first operate on | |||
these Messages before awaiting any further Messages. | these Messages before awaiting any further Messages. | |||
9.3.1. Enqueuing Receives | 9.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 | |||
skipping to change at page 75, line 20 ¶ | skipping to change at line 3457 ¶ | |||
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 9.3.2.1). | event (Section 9.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 to be delivered in | smallest partial Message data size in bytes to be delivered in | |||
response to this Receive. By default, this value is infinite, which | response to this Receive. By default, this value is infinite, which | |||
means that only complete Messages should be delivered (see | means that only complete Messages should be delivered. See | |||
Section 9.3.2.2 and Section 9.1.2 for more information on how this is | Sections 9.3.2.2 and 9.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: | |||
many bytes are available, or the Message is complete with fewer | ||||
bytes, or the system needs to free up memory. Applications SHOULD | 1. when at least that many bytes are available, | |||
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 | 2. the Message is complete with fewer bytes, or | |||
of shorter complete Messages or memory issues. | ||||
3. the system needs to free up memory. | ||||
Applications SHOULD 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 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 9.3.2.2). | ReceivedPartial events (Section 9.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 Transport Services | receive that many bytes if they are available; the Transport Services | |||
API could return ReceivedPartial events with less data than maxLength | API could return ReceivedPartial events with less data than maxLength | |||
according to implementation constraints. Note also that maxLength | according to implementation constraints. Note also that maxLength | |||
and minIncompleteLength are intended only to manage buffering, and | and minIncompleteLength are intended only to manage buffering and are | |||
are not interpreted as a receiver preference for Message reordering. | not interpreted as a receiver preference for Message reordering. | |||
9.3.2. Receive Events | 9.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. | |||
This allows an application to provide backpressure to the transport | This allows an application to provide backpressure to the transport | |||
stack when it is temporarily not ready to receive Messages. For | stack when it is temporarily not ready to receive Messages. For | |||
example, an application that will later be able to handle multiple | example, an application that will later be able to handle multiple | |||
receive events at the same time can make multiple calls to Receive | receive events at the same time can make multiple calls to Receive | |||
without waiting for, or processing, any receive events. An | without waiting for, or processing, any receive events. An | |||
application that is temporarily unable to process received events for | application that is temporarily unable to process received events for | |||
a connection could refrain from calling Receive or delay calling it. | a connection could refrain from calling Receive or could delay | |||
This would lead to a build-up of unread data, which, in turn, could | calling it. This would lead to a buildup of unread data, which, in | |||
result in backpressure to the sender via a transport protocol's flow | turn, could result in backpressure to the sender via a transport | |||
control. | protocol's flow control. | |||
The Transport Services API should allow the application to correlate | The Transport Services API should allow the application to correlate | |||
which call to Receive resulted in a particular Receive event. The | a Receive event to the particular call to Receive that triggered the | |||
manner in which this correlation is indicated is implementation- | event. The manner in which this correlation is indicated is | |||
specific. | implementation specific. | |||
9.3.2.1. Received | 9.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 value provides access to the bytes that were received | The messageData value provides access to the bytes that were received | |||
for this Message, along with the length of the byte array. The | for this Message, along with the length of the byte array. The | |||
messageContext value is provided to enable retrieving metadata about | messageContext value is provided to enable retrieving metadata about | |||
the Message and referring to the Message. The MessageContext object | the Message and referring to the Message. The MessageContext object | |||
is described in Section 9.1.1. | is described in Section 9.1.1. | |||
See Section 9.1.2 for handling Message framing in situations where | See Section 9.1.2 regarding how to handle Message framing in | |||
the Protocol Stack only provides a byte-stream transport. | situations where the Protocol Stack only provides a byte-stream | |||
transport. | ||||
9.3.2.2. ReceivedPartial | 9.3.2.2. ReceivedPartial | |||
Connection -> ReceivedPartial<messageData, messageContext, | Connection -> ReceivedPartial<messageData, messageContext, | |||
endOfMessage> | 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 | |||
flag is delivered or a ReceiveError occurs. All partial blocks of a | flag is delivered or a ReceiveError occurs. All partial blocks of a | |||
single Message are delivered in order without gaps. This event does | single Message are delivered in order without gaps. This event does | |||
not support delivering non-contiguous partial Messages. If, for | not support delivering non-contiguous partial Messages. For example, | |||
example, Message A is divided into three pieces (A1, A2, A3) and | if Message A is divided into three pieces (A1, A2, and A3), Message B | |||
Message B is divided into three pieces (B1, B2, B3), and | is divided into three pieces (B1, B2, and B3), and preserveOrder is | |||
preserveOrder is not Required, the ReceivedPartial could deliver them | not Required, the ReceivedPartial could deliver them in a sequence | |||
in a sequence like this: A1, B1, B2, A2, A3, B3, because the | like this: A1, B1, B2, A2, A3, B3. This is because the | |||
MessageContext allows the application to identify the pieces as | MessageContext allows the application to identify the pieces as | |||
belonging to Message A and B, respectively. However, a sequence | belonging to Message A and B, respectively. However, a sequence like | |||
like: A1, A3 will never occur. | 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 could still be delivered if one of the | the ReceivedPartial event could still be delivered if one of the | |||
following conditions is true: | following conditions is true: | |||
* the underlying Protocol Stack supports message boundary | * 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 | * the underlying Protocol Stack does not support message boundary | |||
preservation, and the Message Framer (see Section 9.1.2) cannot | preservation and the Message Framer (see Section 9.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 | * 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. | |||
In the following example, an application only wants to receive up to | In the following example, an application only wants to receive up to | |||
1000 bytes at a time from a Connection. If a 1500-byte Message | 1000 bytes at a time from a Connection. If a 1500-byte Message | |||
arrives, it would receive the Message in two separate ReceivedPartial | arrives, it would receive the Message in two separate ReceivedPartial | |||
events. | events. | |||
Connection.Receive(1, 1000) | Connection.Receive(1, 1000) | |||
// Receive first 1000 bytes, message is incomplete | // Receive the first 1000 bytes; Message is incomplete | |||
Connection -> ReceivedPartial<messageData(1000 bytes), | Connection -> ReceivedPartial<messageData(1000 bytes), | |||
messageContext, false> | messageContext, false> | |||
Connection.Receive(1, 1000) | Connection.Receive(1, 1000) | |||
// Receive last 500 bytes, message is now complete | // Receive the last 500 bytes; Message is now complete | |||
Connection -> ReceivedPartial<messageData(500 bytes), | Connection -> ReceivedPartial<messageData(500 bytes), | |||
messageContext, true> | messageContext, true> | |||
9.3.2.3. ReceiveError | 9.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: | |||
Protocol Stack that cannot be fully retrieved or parsed, and when it | ||||
is useful for the application to be notified of such errors. For | * data is received by the underlying Protocol Stack that cannot be | |||
example, a ReceiveError can indicate that a Message (identified via | fully retrieved or parsed, and | |||
the messageContext value) that was being partially received | ||||
* it is useful for the application to be notified of such errors. | ||||
For example, a ReceiveError can indicate that a Message (identified | ||||
via the messageContext value) 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. This can be useful for an application, which might | be completed. This can be useful for an application, which might | |||
wish to use this error as a hint to remove previously received | wish to use this error as a hint to remove previously received | |||
Message parts from memory. As another example, if an incoming | Message parts from memory. As another example, if an incoming | |||
Message does not fulfill the recvChecksumLen property (see | Message does not fulfill the recvChecksumLen property (see | |||
Section 8.1.1), an application can use this error as a hint to inform | Section 8.1.1), an application can use this error as a hint to inform | |||
the peer application to adjust the msgChecksumLen property (see | the peer application to adjust the msgChecksumLen property (see | |||
Section 9.1.3.6). | Section 9.1.3.6). | |||
In contrast, internal protocol reception errors (e.g., loss causing | In contrast, internal protocol reception errors (e.g., loss causing | |||
retransmissions in TCP) are not signalled by this event. Conditions | retransmissions in TCP) are not signaled by this event. Conditions | |||
that irrevocably lead to the termination of the Connection are | that irrevocably lead to the termination of the Connection are | |||
signaled using ConnectionError (see Section 10). | signaled using ConnectionError (see Section 10). | |||
9.3.3. Receive Message Properties | 9.3.3. Receive Message Properties | |||
Each Message Context could contain metadata from protocols in the | Each Message Context could 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 through additional read-only Message | dependent. These are exposed through 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 9.1.1) passed by the receive event. The following metadata | Section 9.1.1) passed by the receive event. The metadata values in | |||
values are supported: | the following subsections are supported. | |||
9.3.3.1. UDP(-Lite)-specific Property: ECN | 9.3.3.1. Property Specific to UDP and UDP-Lite: 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 as well as 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; hence, they | |||
this functionality to the application (see [RFC8293], following the | expose this functionality to the application (see [RFC8293], | |||
guidance in [RFC8085]) | following the guidance in [RFC8085]). | |||
9.3.3.2. Early Data | 9.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 that it is safely replayable. If TLS 1.3 is available | |||
the recipient Message was sent as part of early data, the | and the recipient Message was sent as part of early data, the | |||
corresponding metadata carries a flag indicating as such. If early | corresponding metadata carries a flag indicating as such. If early | |||
data is enabled, applications should check this metadata field for | data is enabled, applications should check this metadata field for | |||
Messages received during Connection establishment and respond | Messages received during Connection establishment and respond | |||
accordingly. | accordingly. | |||
9.3.3.3. Receiving Final Messages | 9.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 can be marked | delivered. This corresponds to the final property that can be marked | |||
on a sent Message, see Section 9.1.3.5. | on a sent Message; see Section 9.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. Therefore, applications 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. | |||
10. Connection Termination | 10. Connection Termination | |||
A Connection can be terminated i) by the Local Endpoint (i.e., the | A Connection can be terminated: | |||
application calls the Close, CloseGroup, Abort or AbortGroup action), | ||||
ii) by the Remote Endpoint (i.e., the remote application calls the | 1. by the Local Endpoint (i.e., the application calls the Close, | |||
Close, CloseGroup, Abort or AbortGroup action), or iii) because of an | CloseGroup, Abort, or AbortGroup action), | |||
error (e.g., a timeout). A local call of the Close action will cause | ||||
the Connection to either send a Closed event or a ConnectionError | 2. by the Remote Endpoint (i.e., the remote application calls the | |||
event, and a local call of the CloseGroup action will cause all of | Close, CloseGroup, Abort, or AbortGroup action), or | |||
the Connections in the group to either send a Closed event or a | ||||
ConnectionError event. A local call of the Abort action will cause | 3. because of an error (e.g., a timeout). | |||
the Connection to send a ConnectionError event, indicating local | ||||
Abort as a reason, and a local call of the AbortGroup action will | A local call of the Close action will cause the Connection to send | |||
cause all of the Connections in the group to send a ConnectionError | either a Closed event or a ConnectionError event; a local call of the | |||
event, indicating local Abort as a reason. | CloseGroup action will cause all of the Connections in the group to | |||
send either a Closed event or a ConnectionError event. A local call | ||||
of the Abort action will cause the Connection to send a | ||||
ConnectionError event, indicating local Abort as a reason; a local | ||||
call of the AbortGroup action will cause all of the Connections in | ||||
the group to send a ConnectionError event, indicating local Abort as | ||||
a reason. | ||||
Remote action calls map to events similar to local calls (e.g., a | Remote action calls map to events similar to local calls (e.g., a | |||
remote Close causes the Connection to either send a Closed event or a | remote Close causes the Connection to send either a Closed event or a | |||
ConnectionError event), but, different from local action calls, it is | ConnectionError event), but in contrast to local action calls, it is | |||
not guaranteed that such events will indeed be invoked. When an | not guaranteed that such events will indeed be invoked. When an | |||
application needs to free resources associated with a Connection, it | application needs to free resources associated with a Connection, it | |||
ought not to therefore rely on the invocation of such events due to | ought not rely on the invocation of such events due to termination | |||
termination calls from the Remote Endpoint, but instead use the local | calls from the Remote Endpoint; instead, it should use the local | |||
termination actions. | termination actions. | |||
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 Services system. Upon | application has already given to the Transport Services system. Upon | |||
successfully satisfying all these requirements, the Connection will | successfully satisfying all these requirements, the Connection will | |||
send the Closed event. For example, if reliable delivery was | send the Closed event. For example, if reliable delivery was | |||
requested for a Message handed over before calling Close, the Closed | requested for a Message handed over before calling Close, the Closed | |||
event will signify that this Message has indeed been delivered. This | event will signify that this Message has indeed been delivered. This | |||
action does not affect any other Connection in the same Connection | action does not affect any other Connection in the same Connection | |||
Group. | Group. | |||
An application MUST NOT assume that it can receive any further data | An application MUST NOT assume that it can receive any further data | |||
on a Connection for which it has called Close, even if such data is | on a Connection for which it has called Close, even if such data is | |||
already in flight. | already in flight. | |||
Connection.Close() | Connection.Close() | |||
The Closed event informs the application that a Close action has | The Closed event informs the application that a Close action has | |||
successfully completed, or that the Remote Endpoint has closed the | successfully completed or that the Remote Endpoint has closed the | |||
Connection. There is no guarantee that a remote Close will be | Connection. There is no guarantee that a remote Close will be | |||
signaled. | signaled. | |||
Connection -> Closed<> | Connection -> Closed<> | |||
Abort terminates a Connection without delivering any remaining | Abort terminates a Connection without delivering any remaining | |||
Messages. This action does not affect any other Connection that is | Messages. This action does not affect any other Connection that is | |||
entangled with this one in a Connection Group. When the Abort action | entangled with this one in a Connection Group. When the Abort action | |||
has finished, the Connection will send a ConnectionError event, | has finished, the Connection will send a ConnectionError event, | |||
indicating local Abort as a reason. | indicating local Abort as a reason. | |||
Connection.Abort() | Connection.Abort() | |||
CloseGroup gracefully terminates a Connection and any other | CloseGroup gracefully terminates a Connection and any other | |||
Connections in the same Connection Group. For example, all of the | Connections in the same Connection Group. For example, all of the | |||
skipping to change at page 81, line 31 ¶ | skipping to change at line 3747 ¶ | |||
Connection.CloseGroup() | Connection.CloseGroup() | |||
AbortGroup terminates a Connection and any other Connections that are | AbortGroup terminates a Connection and any other Connections that are | |||
in the same Connection Group without delivering any remaining | in the same Connection Group without delivering any remaining | |||
Messages. When the AbortGroup action has finished, all Connections | Messages. When the AbortGroup action has finished, all Connections | |||
in the group will send a ConnectionError event, indicating local | in the group will send a ConnectionError event, indicating local | |||
Abort as a reason. | Abort as a reason. | |||
Connection.AbortGroup() | Connection.AbortGroup() | |||
A ConnectionError informs the application that: 1) data could not be | A ConnectionError informs the application that: | |||
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 | 1. data could not be delivered to the peer after a timeout or | |||
guarantee that an Abort from the peer will be signaled. | ||||
2. the Connection has been aborted (e.g., because the peer has | ||||
called Abort). | ||||
There is no guarantee that an Abort from the peer will be signaled. | ||||
Connection -> ConnectionError<reason?> | Connection -> ConnectionError<reason?> | |||
11. Connection State and Ordering of Operations and Events | 11. Connection State and Ordering of Operations and Events | |||
This Transport Services API is designed to be independent of an | This Transport Services API is designed to be independent of an | |||
implementation's concurrency model. The details of how exactly | implementation's concurrency model. The exact details regarding how | |||
actions are handled, and how events are dispatched, are | actions are handled, and how events are dispatched, are | |||
implementation dependent. | implementation dependent. | |||
Some transitions of Connection states are associated with events: | Some transitions of Connection states are associated with events: | |||
* Ready<> occurs when a Connection created with Initiate or | * A Ready event 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 Listen | * A ConnectionReceived event occurs when a Connection created with | |||
transitions to Established state. | Listen transitions to Established state. | |||
* RendezvousDone<> occurs when a Connection created with Rendezvous | * A RendezvousDone event occurs when a Connection created with | |||
transitions to Established state. | Rendezvous transitions to Established state. | |||
* Closed<> occurs when a Connection transitions to Closed state | * A Closed event occurs when a Connection transitions to Closed | |||
without error. | state without error. | |||
* EstablishmentError<> occurs when a Connection created with | * An EstablishmentError event occurs when a Connection created with | |||
Initiate transitions from Establishing state to Closed state due | Initiate transitions from Establishing state to Closed state due | |||
to an error. | to an error. | |||
* ConnectionError<> occurs when a Connection transitions to Closed | * A ConnectionError event occurs when a Connection transitions to | |||
state due to an error in all other circumstances. | Closed 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 -----> Closing ------> Closed | Establishing -----> Established -----> Closing ------> Closed | |||
| ^ | | ^ | |||
| | | | | | |||
+---------------------------------------------------+ | +---------------------------------------------------+ | |||
EstablishmentError<> | EstablishmentError<> | |||
(*) Ready<>, ConnectionReceived<>, RendezvousDone<> | (*) Ready<>, ConnectionReceived<>, RendezvousDone<> | |||
(**) Closed<>, ConnectionError<> | (**) Closed<>, ConnectionError<> | |||
Figure 2: Connection State Diagram | Figure 2: Connection State Diagram | |||
The Transport Services API provides the following guarantees about | The Transport Services API provides the following guarantees about | |||
the ordering of operations: | the ordering of operations: | |||
* Sent<> events will occur on a Connection in the order in which the | * 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 the implementation). | |||
* Received<> will never occur on a Connection before it is | * Received events 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 event containing that | |||
Connection. | Connection. | |||
* No events will occur on a Connection after it is closed; i.e., | * No events will occur on a Connection after it is closed, i.e., | |||
after a Closed<> event, an EstablishmentError<> or | after a Closed event, an EstablishmentError or ConnectionError | |||
ConnectionError<> will not occur on that Connection. To ensure | event will not occur on that Connection. To ensure this ordering, | |||
this ordering, Closed<> will not occur on a Connection while other | a Closed event will not occur on a Connection while other events | |||
events on the Connection are still locally outstanding (i.e., | on the Connection are still locally outstanding (i.e., known to | |||
known to the Transport Services API and waiting to be dealt with | the Transport Services API and waiting to be dealt with by the | |||
by the application). | application). | |||
12. IANA Considerations | 12. IANA Considerations | |||
This document has no actions for IANA. Later versions of this | This document has no IANA actions. | |||
document might create IANA registries for generic transport property | ||||
names and transport property namespaces (see Section 4.1). | Future works might create IANA registries for generic transport | |||
property names and transport property namespaces (see Section 4.1). | ||||
13. Privacy and Security Considerations | 13. 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 system. Part of this API includes configuration | Transport Services system. Part of this API includes configuration | |||
details for transport security protocols, as discussed in | details for transport security protocols, as discussed in | |||
Section 6.3. It does not recommend use (or disuse) of specific | Section 6.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 Transport Services system. Security | protocol ought to work in a Transport Services system. Security | |||
considerations for these protocols are discussed in the respective | considerations for these protocols are discussed in the respective | |||
specifications. | specifications. | |||
[I-D.ietf-taps-arch] provides general security considerations and | [RFC9621] provides general security considerations and requirements | |||
requirements for any system that implements the Transport Services | for any system that implements the Transport Services architecture. | |||
architecture. These include recommendations of relevance to the API, | These include recommendations of relevance to the API, e.g., | |||
e.g. regarding the use of keying material. | regarding the use of keying material. | |||
The described API is used to exchange information between an | The described API is used to exchange information between an | |||
application and the Transport Services system. While it is not | application and the Transport Services system. The same authority | |||
necessarily expected that both systems are implemented by the same | implementing both systems is not necessarily expected. However, | |||
authority, it is expected that the Transport Services Implementation | there is an expectation that the Transport Services Implementation | |||
is either provided as a library that is selected by the application | would either: | |||
from a trusted party, or that it is part of the operating system that | ||||
the application also relies on for other tasks. | * be provided as a library that is selected by the application from | |||
a trusted party or | ||||
* be part of the operating system that the application also relies | ||||
on for other tasks. | ||||
In either case, the Transport Services API is an internal interface | In either case, the Transport Services API is an internal interface | |||
that is used to exchange information locally between two systems. | that is used to exchange information locally between two systems. | |||
However, as the Transport Services system is responsible for network | However, as the Transport Services system is responsible for network | |||
communication, it is in the position to potentially share any | communication, it is in the position to potentially share any | |||
information provided by the application with the network or another | information provided by the application with the network or another | |||
communication peer. Most of the information provided over the | communication peer. Most of the information provided over the | |||
Transport Services API are useful to configure and select protocols | Transport Services API is useful to configure and select protocols | |||
and paths and are not necessarily privacy-sensitive. Still, some | and paths and is not necessarily privacy sensitive. Still, some | |||
information could be privacy sensitive because it might reveal usage | information could be privacy sensitive because it might reveal usage | |||
characteristics and habits of the user 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, because all packets, as well as their timing and | characteristics, because all packets, as well as their timing and | |||
size, are part of the network-visible wire image [RFC8546]. However, | size, are part of the network-visible wire image [RFC8546]. However, | |||
the selection of a protocol and its configuration also impacts which | the 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. How Transport Services systems ought to | entities can access it. How Transport Services systems ought to | |||
choose protocols depending on the security properties required is out | choose protocols -- depending on the security properties required -- | |||
of scope of this specification, as it is limited to transport | is out of scope for this specification, as it is limited to transport | |||
protocols. The choice of a security protocol can be informed by the | protocols. The choice of a security protocol can be informed by the | |||
survey provided in [RFC8922]. | survey provided in [RFC8922]. | |||
In most cases, information provided for protocol and path selection | In most cases, information provided for protocol and path selection | |||
does not directly translate to information that can be observed by | does not directly translate to information that can be observed by | |||
network devices on the path. However, there might be specific | network devices on the path. However, there might be specific | |||
configuration information that is intended for path exposure, e.g., a | configuration information that is intended for path exposure, e.g., a | |||
DiffServ codepoint setting, that is either provided directly by the | Diffserv codepoint setting that is either provided directly by the | |||
application or indirectly configured for a traffic profile. | application or indirectly configured for a traffic profile. | |||
Applications should be aware that a single communication attempt can | Applications should be aware that a single communication attempt can | |||
lead to more than one connection establishment procedure. This is | lead to more than one connection establishment procedure. For | |||
the case, for example, when the Transport Services system also | example, this is the case when: | |||
executes name resolution, when support mechanisms such as TURN or ICE | ||||
are used to establish connectivity, if protocols or paths are raced, | * the Transport Services system also executes name resolution, | |||
or if a path fails and fallback or re-establishment is supported in | ||||
the Transport Services system. Applications should take special care | * support mechanisms such as TURN or ICE are used to establish | |||
when using 0-RTT session resumption (see Section 6.2.5), as early | connectivity if protocols or paths are raced or if a path fails | |||
data sent across multiple paths during connection establishment could | and fallback or re-establishment is supported in the Transport | |||
reveal information that can be used to correlate endpoints on these | Services system. | |||
paths. | ||||
Applications should take special care when using 0-RTT session | ||||
resumption (see Section 6.2.5), as early data sent across multiple | ||||
paths during connection establishment could reveal information that | ||||
can be used to correlate endpoints on these paths. | ||||
Applications should also take care to not assume that all data | Applications should also take care to not assume that all data | |||
received using the Transport Services API is always complete or well- | received using the Transport Services API is always complete or well- | |||
formed. Specifically, Messages that are received partially | formed. Specifically, Messages that are received partially (see | |||
Section 9.3.2.2 could be a source of truncation attacks if | Section 9.3.2.2) could be a source of truncation attacks if | |||
applications do not distinguish between partial Messages and complete | applications do not distinguish between partial Messages and complete | |||
Messages. | Messages. | |||
The Transport Services API explicitly does not require the | The Transport Services API explicitly does not require the | |||
application to resolve names, though there is a tradeoff between | application to resolve names, though there is a trade-off between | |||
early and late binding of addresses to names. Early binding allows | early and late binding of addresses to names. Early binding allows | |||
the Transport Services Implementation to reduce Connection setup | the Transport Services Implementation to reduce Connection setup | |||
latency, at the cost of potentially limited scope for alternate path | latency. This is at the cost of potentially limited scope for | |||
discovery during Connection establishment, as well as potential | alternate path discovery during Connection establishment as well as | |||
additional information leakage about application interest when used | potential additional information leakage about application interest | |||
with a resolution method (such as DNS without TLS) which does not | when used with a resolution method (such as DNS without TLS) that | |||
protect query confidentiality. Names used with the Transport | does not protect query confidentiality. Names used with the | |||
Services API SHOULD be fully-qualified domain names (FQDNs); not | Transport Services API SHOULD be FQDNs; not providing an FQDN will | |||
providing an FQDN will result in the Transport Services | result in the Transport Services Implementation needing to use DNS | |||
Implementation needing to to use DNS search domains for name | search domains for name resolution, which might lead to inconsistent | |||
resolution, which might lead to inconsistent or unpredictable | or unpredictable behavior. | |||
behavior. | ||||
These communication activities are not different from what is used | ||||
today. However, the goal of a Transport Services system is to | ||||
support such mechanisms as a generic service within the transport | ||||
layer. This enables applications to more dynamically benefit from | ||||
innovations and new protocols in the transport, although it reduces | ||||
transparency of the underlying communication actions to the | ||||
application itself. The Transport Services API is designed such that | ||||
protocol and path selection can be limited to a small and controlled | ||||
set if the application requires this or to implement a security | ||||
policy. can be limited to a small and controlled set if required by | ||||
the application to perform a function or to provide security. | ||||
Further, introspection on the properties of Connection objects allows | ||||
an application to determine which protocol(s) and path(s) are in use. | ||||
A Transport Services system SHOULD provide a facility logging the | ||||
communication events of each Connection. | ||||
14. Acknowledgments | ||||
This work has received funding from the European Union's Horizon 2020 | ||||
research and innovation programme under grant agreements No. 644334 | ||||
(NEAT) and No. 688421 (MAMI). | ||||
This work has been supported by Leibniz Prize project funds of DFG - | ||||
German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ | ||||
FE 570/4-1). | ||||
This work has been supported by the UK Engineering and Physical | ||||
Sciences Research Council under grant EP/R04144X/1. | ||||
This work has been supported by the Research Council of Norway under | ||||
its "Toppforsk" programme through the "OCARINA" project. | ||||
Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | These communication activities are not different from what is used at | |||
Kinnear for their implementation and design efforts, including Happy | the time of writing. However, the goal of a Transport Services | |||
Eyeballs, that heavily influenced this work. Thanks to Laurent Chuat | system is to support such mechanisms as a generic service within the | |||
and Jason Lee for initial work on the Post Sockets interface, from | transport layer. This enables applications to more dynamically | |||
which this work has evolved. Thanks to Maximilian Franke for asking | benefit from innovations and new protocols in the transport, although | |||
good questions based on implementation experience and for | it reduces transparency of the underlying communication actions to | |||
contributing text, e.g., on multicast. | the application itself. The Transport Services API is designed such | |||
that protocol and path selection can be limited to a small and | ||||
controlled set if required by the application to perform a function | ||||
or to provide security. Further, introspection on the properties of | ||||
Connection objects allows an application to determine which | ||||
protocol(s) and path(s) are in use. A Transport Services system | ||||
SHOULD provide a facility logging the communication events of each | ||||
Connection. | ||||
15. References | 14. References | |||
15.1. Normative References | 14.1. Normative References | |||
[ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
"Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
July 2014, <https://www.rfc-editor.org/rfc/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
[I-D.ietf-taps-arch] | ||||
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., and | ||||
C. Perkins, "Architecture and Requirements for Transport | ||||
Services", Work in Progress, Internet-Draft, draft-ietf- | ||||
taps-arch-19, 9 November 2023, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-taps- | ||||
arch-19>. | ||||
[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/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
15.2. Informative References | [RFC9621] Pauly, T., Ed., Trammell, B., Ed., Brunstrom, A., | |||
Fairhurst, G., and C. S. Perkins, "Architecture and | ||||
Requirements for Transport Services", RFC 9621, | ||||
DOI 10.17487/RFC9621, December 2024, | ||||
<https://www.rfc-editor.org/info/RFC9621>. | ||||
[I-D.ietf-taps-impl] | 14.2. Informative References | |||
Brunstrom, A., Pauly, T., Enghardt, R., Tiesel, P. S., and | ||||
M. Welzl, "Implementing Interfaces to Transport Services", | [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | |||
Work in Progress, Internet-Draft, draft-ietf-taps-impl-18, | Communication Layers", STD 3, RFC 1122, | |||
14 December 2023, <https://datatracker.ietf.org/doc/html/ | DOI 10.17487/RFC1122, October 1989, | |||
draft-ietf-taps-impl-18>. | <https://www.rfc-editor.org/info/rfc1122>. | |||
[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/rfc/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/rfc/rfc2597>. | <https://www.rfc-editor.org/info/rfc2597>. | |||
[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/rfc/rfc2914>. | <https://www.rfc-editor.org/info/rfc2914>. | |||
[RFC3246] Davie, B., Charny, A., Bennet, J.C.R., Benson, K., Le | [RFC3246] Davie, B., Charny, A., Bennet, J.C.R., Benson, K., Le | |||
Boudec, J.Y., Courtney, W., Davari, S., Firoiu, V., and D. | Boudec, J.Y., 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/rfc/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/rfc/rfc3261>. | <https://www.rfc-editor.org/info/rfc3261>. | |||
[RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing | [RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing | |||
Architecture", RFC 4291, DOI 10.17487/RFC4291, February | Architecture", RFC 4291, DOI 10.17487/RFC4291, February | |||
2006, <https://www.rfc-editor.org/rfc/rfc4291>. | 2006, <https://www.rfc-editor.org/info/rfc4291>. | |||
[RFC4594] Babiarz, J., Chan, K., and F. Baker, "Configuration | [RFC4594] Babiarz, J., Chan, K., and F. Baker, "Configuration | |||
Guidelines for DiffServ Service Classes", RFC 4594, | Guidelines for DiffServ Service Classes", RFC 4594, | |||
DOI 10.17487/RFC4594, August 2006, | DOI 10.17487/RFC4594, August 2006, | |||
<https://www.rfc-editor.org/rfc/rfc4594>. | <https://www.rfc-editor.org/info/rfc4594>. | |||
[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
Housley, R., and W. Polk, "Internet X.509 Public Key | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
Infrastructure Certificate and Certificate Revocation List | Infrastructure Certificate and Certificate Revocation List | |||
(CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | |||
<https://www.rfc-editor.org/rfc/rfc5280>. | <https://www.rfc-editor.org/info/rfc5280>. | |||
[RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", | [RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", | |||
RFC 5482, DOI 10.17487/RFC5482, March 2009, | RFC 5482, DOI 10.17487/RFC5482, March 2009, | |||
<https://www.rfc-editor.org/rfc/rfc5482>. | <https://www.rfc-editor.org/info/rfc5482>. | |||
[RFC5865] Baker, F., Polk, J., and M. Dolly, "A Differentiated | [RFC5865] Baker, F., Polk, J., and M. Dolly, "A Differentiated | |||
Services Code Point (DSCP) for Capacity-Admitted Traffic", | Services Code Point (DSCP) for Capacity-Admitted Traffic", | |||
RFC 5865, DOI 10.17487/RFC5865, May 2010, | RFC 5865, DOI 10.17487/RFC5865, May 2010, | |||
<https://www.rfc-editor.org/rfc/rfc5865>. | <https://www.rfc-editor.org/info/rfc5865>. | |||
[RFC7478] Holmberg, C., Hakansson, S., and G. Eriksson, "Web Real- | [RFC7478] Holmberg, C., Hakansson, S., and G. Eriksson, "Web Real- | |||
Time Communication Use Cases and Requirements", RFC 7478, | Time Communication Use Cases and Requirements", RFC 7478, | |||
DOI 10.17487/RFC7478, March 2015, | DOI 10.17487/RFC7478, March 2015, | |||
<https://www.rfc-editor.org/rfc/rfc7478>. | <https://www.rfc-editor.org/info/rfc7478>. | |||
[RFC7556] Anipko, D., Ed., "Multiple Provisioning Domain | [RFC7556] Anipko, D., Ed., "Multiple Provisioning Domain | |||
Architecture", RFC 7556, DOI 10.17487/RFC7556, June 2015, | Architecture", RFC 7556, DOI 10.17487/RFC7556, June 2015, | |||
<https://www.rfc-editor.org/rfc/rfc7556>. | <https://www.rfc-editor.org/info/rfc7556>. | |||
[RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services | [RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services | |||
(Diffserv) and Real-Time Communication", RFC 7657, | (Diffserv) and Real-Time Communication", RFC 7657, | |||
DOI 10.17487/RFC7657, November 2015, | DOI 10.17487/RFC7657, November 2015, | |||
<https://www.rfc-editor.org/rfc/rfc7657>. | <https://www.rfc-editor.org/info/rfc7657>. | |||
[RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, | [RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, | |||
DOI 10.17487/RFC0791, September 1981, | DOI 10.17487/RFC0791, September 1981, | |||
<https://www.rfc-editor.org/rfc/rfc791>. | <https://www.rfc-editor.org/info/rfc791>. | |||
[RFC8084] Fairhurst, G., "Network Transport Circuit Breakers", | [RFC8084] Fairhurst, G., "Network Transport Circuit Breakers", | |||
BCP 208, RFC 8084, DOI 10.17487/RFC8084, March 2017, | BCP 208, RFC 8084, DOI 10.17487/RFC8084, March 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8084>. | <https://www.rfc-editor.org/info/rfc8084>. | |||
[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | |||
Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | |||
March 2017, <https://www.rfc-editor.org/rfc/rfc8085>. | March 2017, <https://www.rfc-editor.org/info/rfc8085>. | |||
[RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, | [RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, | |||
Ed., "Services Provided by IETF Transport Protocols and | Ed., "Services Provided by IETF Transport Protocols and | |||
Congestion Control Mechanisms", RFC 8095, | Congestion Control Mechanisms", RFC 8095, | |||
DOI 10.17487/RFC8095, March 2017, | DOI 10.17487/RFC8095, March 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8095>. | <https://www.rfc-editor.org/info/rfc8095>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | ||||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[RFC8260] Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann, | [RFC8260] Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann, | |||
"Stream Schedulers and User Message Interleaving for the | "Stream Schedulers and User Message Interleaving for the | |||
Stream Control Transmission Protocol", RFC 8260, | Stream Control Transmission Protocol", RFC 8260, | |||
DOI 10.17487/RFC8260, November 2017, | DOI 10.17487/RFC8260, November 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8260>. | <https://www.rfc-editor.org/info/rfc8260>. | |||
[RFC8293] Ghanwani, A., Dunbar, L., McBride, M., Bannai, V., and R. | [RFC8293] Ghanwani, A., Dunbar, L., McBride, M., Bannai, V., and R. | |||
Krishnan, "A Framework for Multicast in Network | Krishnan, "A Framework for Multicast in Network | |||
Virtualization over Layer 3", RFC 8293, | Virtualization over Layer 3", RFC 8293, | |||
DOI 10.17487/RFC8293, January 2018, | DOI 10.17487/RFC8293, January 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8293>. | <https://www.rfc-editor.org/info/rfc8293>. | |||
[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/rfc/rfc8303>. | <https://www.rfc-editor.org/info/rfc8303>. | |||
[RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | |||
Connectivity Establishment (ICE): A Protocol for Network | Connectivity Establishment (ICE): A Protocol for Network | |||
Address Translator (NAT) Traversal", RFC 8445, | Address Translator (NAT) Traversal", RFC 8445, | |||
DOI 10.17487/RFC8445, July 2018, | DOI 10.17487/RFC8445, July 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8445>. | <https://www.rfc-editor.org/info/rfc8445>. | |||
[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/rfc/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing, | [RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing, | |||
D., Mahy, R., and P. Matthews, "Session Traversal | D., Mahy, R., and P. Matthews, "Session Traversal | |||
Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489, | Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489, | |||
February 2020, <https://www.rfc-editor.org/rfc/rfc8489>. | February 2020, <https://www.rfc-editor.org/info/rfc8489>. | |||
[RFC8546] Trammell, B. and M. Kuehlewind, "The Wire Image of a | [RFC8546] Trammell, B. and M. Kuehlewind, "The Wire Image of a | |||
Network Protocol", RFC 8546, DOI 10.17487/RFC8546, April | Network Protocol", RFC 8546, DOI 10.17487/RFC8546, April | |||
2019, <https://www.rfc-editor.org/rfc/rfc8546>. | 2019, <https://www.rfc-editor.org/info/rfc8546>. | |||
[RFC8622] Bless, R., "A Lower-Effort Per-Hop Behavior (LE PHB) for | [RFC8622] Bless, R., "A Lower-Effort Per-Hop Behavior (LE PHB) for | |||
Differentiated Services", RFC 8622, DOI 10.17487/RFC8622, | Differentiated Services", RFC 8622, DOI 10.17487/RFC8622, | |||
June 2019, <https://www.rfc-editor.org/rfc/rfc8622>. | June 2019, <https://www.rfc-editor.org/info/rfc8622>. | |||
[RFC8656] Reddy, T., Ed., Johnston, A., Ed., Matthews, P., and J. | [RFC8656] Reddy, T., Ed., Johnston, A., Ed., Matthews, P., and J. | |||
Rosenberg, "Traversal Using Relays around NAT (TURN): | Rosenberg, "Traversal Using Relays around NAT (TURN): | |||
Relay Extensions to Session Traversal Utilities for NAT | Relay Extensions to Session Traversal Utilities for NAT | |||
(STUN)", RFC 8656, DOI 10.17487/RFC8656, February 2020, | (STUN)", RFC 8656, DOI 10.17487/RFC8656, February 2020, | |||
<https://www.rfc-editor.org/rfc/rfc8656>. | <https://www.rfc-editor.org/info/rfc8656>. | |||
[RFC8699] Islam, S., Welzl, M., and S. Gjessing, "Coupled Congestion | [RFC8699] Islam, S., Welzl, M., and S. Gjessing, "Coupled Congestion | |||
Control for RTP Media", RFC 8699, DOI 10.17487/RFC8699, | Control for RTP Media", RFC 8699, DOI 10.17487/RFC8699, | |||
January 2020, <https://www.rfc-editor.org/rfc/rfc8699>. | January 2020, <https://www.rfc-editor.org/info/rfc8699>. | |||
[RFC8801] Pfister, P., Vyncke, É., Pauly, T., Schinazi, D., and W. | [RFC8801] Pfister, P., Vyncke, É., Pauly, T., Schinazi, D., and W. | |||
Shao, "Discovering Provisioning Domain Names and Data", | Shao, "Discovering Provisioning Domain Names and Data", | |||
RFC 8801, DOI 10.17487/RFC8801, July 2020, | RFC 8801, DOI 10.17487/RFC8801, July 2020, | |||
<https://www.rfc-editor.org/rfc/rfc8801>. | <https://www.rfc-editor.org/info/rfc8801>. | |||
[RFC8838] Ivov, E., Uberti, J., and P. Saint-Andre, "Trickle ICE: | [RFC8838] Ivov, E., Uberti, J., and P. Saint-Andre, "Trickle ICE: | |||
Incremental Provisioning of Candidates for the Interactive | Incremental Provisioning of Candidates for the Interactive | |||
Connectivity Establishment (ICE) Protocol", RFC 8838, | Connectivity Establishment (ICE) Protocol", RFC 8838, | |||
DOI 10.17487/RFC8838, January 2021, | DOI 10.17487/RFC8838, January 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8838>. | <https://www.rfc-editor.org/info/rfc8838>. | |||
[RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | [RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | |||
Völker, "Packetization Layer Path MTU Discovery for | Völker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | |||
September 2020, <https://www.rfc-editor.org/rfc/rfc8899>. | September 2020, <https://www.rfc-editor.org/info/rfc8899>. | |||
[RFC8922] Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | [RFC8922] Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | |||
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/rfc/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/rfc/rfc8923>. | October 2020, <https://www.rfc-editor.org/info/rfc8923>. | |||
[RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, | [RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, | |||
"Temporary Address Extensions for Stateless Address | "Temporary Address Extensions for Stateless Address | |||
Autoconfiguration in IPv6", RFC 8981, | Autoconfiguration in IPv6", RFC 8981, | |||
DOI 10.17487/RFC8981, February 2021, | DOI 10.17487/RFC8981, February 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8981>. | <https://www.rfc-editor.org/info/rfc8981>. | |||
[RFC9218] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | [RFC9218] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | |||
for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, | for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9218>. | <https://www.rfc-editor.org/info/rfc9218>. | |||
[RFC9329] Pauly, T. and V. Smyslov, "TCP Encapsulation of Internet | [RFC9329] Pauly, T. and V. Smyslov, "TCP Encapsulation of Internet | |||
Key Exchange Protocol (IKE) and IPsec Packets", RFC 9329, | Key Exchange Protocol (IKE) and IPsec Packets", RFC 9329, | |||
DOI 10.17487/RFC9329, November 2022, | DOI 10.17487/RFC9329, November 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9329>. | <https://www.rfc-editor.org/info/rfc9329>. | |||
[RFC9623] Brunstrom, A., Ed., Pauly, T., Ed., Enghardt, R., Tiesel, | ||||
P. S., and M. Welzl, "Implementing Interfaces to Transport | ||||
Services", RFC 9623, DOI 10.17487/RFC9623, December 2024, | ||||
<https://www.rfc-editor.org/info/rfc9623>. | ||||
[TCP-COUPLING] | [TCP-COUPLING] | |||
Islam, S., Welzl, M., Hiorth, K., Hayes, D., Armitage, G., | Islam, S., Welzl, M., Hiorth, K., Hayes, D., Armitage, G., | |||
and S. Gjessing, "ctrlTCP: Reducing Latency through | and S. Gjessing, "ctrlTCP: Reducing latency through | |||
Coupled, Heterogeneous Multi-Flow TCP Congestion Control", | coupled, heterogeneous multi-flow TCP congestion control", | |||
IEEE INFOCOM Global Internet Symposium (GI) workshop (GI | IEEE INFOCOM 2018 - IEEE Conference on Computer | |||
2018) , 2018. | Communications Workshops (INFOCOM WKSHPS), | |||
DOI 10.1109/INFCOMW.2018.8406887, 2018, | ||||
<https://ieeexplore.ieee.org/document/8406887>. | ||||
Appendix A. Implementation Mapping | Appendix A. Implementation Mapping | |||
The way the concepts from this abstract API map into concrete APIs in | The way the concepts from this abstract API map to concrete APIs in a | |||
a given language on a given platform largely depends on the features | given language on a given platform largely depends on the features | |||
and norms of the language and the platform. Actions could be | and norms of the language and the platform. Actions could be | |||
implemented as functions or method calls, for instance, and events | implemented as either functions or method calls. For instance, | |||
could be implemented via event queues, handler functions or classes, | actions could be implemented via event queues, handler functions or | |||
communicating sequential processes, or other asynchronous calling | classes, communicating sequential processes, or other asynchronous | |||
conventions. | calling conventions. | |||
A.1. Types | A.1. Types | |||
The basic types mentioned in Section 1.1 typically have natural | The basic types mentioned in Section 1.1 typically have natural | |||
correspondences in practical programming languages, perhaps | correspondences in practical programming languages, perhaps | |||
constrained by implementation-specific limitations. For example: | constrained by implementation-specific limitations. For example: | |||
* An Integer can typically be represented in C by an int or long, | * Typically, an Integer can be represented in C by an int or long; | |||
subject to the underlying platform's ranges for each. | this is subject to the underlying platform's ranges for each. | |||
* In C, a Tuple may be represented as a struct with one member for | * 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 | each of the value types in the ordered grouping. However, in | |||
contrast, a Tuple may be represented as a tuple, a sequence of | Python, a Tuple may be represented as a tuple, which is a sequence | |||
dynamically-typed elements. | of dynamically typed elements. | |||
* A Set may be represented as a std::set in C++ or as a set in | * A Set 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- | Python. In C, it may be represented as an array or as a higher- | |||
level data structure with appropriate accessors defined. | level data structure with appropriate accessors defined. | |||
The objects described in Section 1.1 can similarly be represented in | The objects described in Section 1.1 can also be represented in | |||
different ways depending on which programming language is used. | different ways, depending on which programming language is used. | |||
Objects like Preconnections, Connections, and Listeners can be long- | Objects like Preconnections, Connections, and Listeners can be long- | |||
lived, and benefit from using object-oriented constructs. Note that | lived and benefit from using object-oriented constructs. Note that, | |||
in C, these objects may need to provide a way to release or free | in C, these objects may need to provide a way to release or free | |||
their underlying memory when the application is done using them. For | their underlying memory when the application is done using them. For | |||
example, since a Preconnection can be used to initiate multiple | example, since a Preconnection can be used to initiate multiple | |||
Connections, it is the responsibility of the application to clean up | Connections, it is the responsibility of the application to clean up | |||
the Preconnection memory if necessary. | the Preconnection memory if necessary. | |||
A.2. Events and Errors | A.2. Events and Errors | |||
This specification treats events and errors similarly. Errors, just | This specification treats events and errors similarly. Errors, just | |||
as any other events, may occur asynchronously in network | as any other events, may occur asynchronously in network | |||
applications. However, implementations of this API may report errors | applications. However, implementations of this API may report errors | |||
synchronously, according to the error handling idioms of the | synchronously. This is done according to the error-handling idioms | |||
implementation platform, where they can be immediately detected, such | of the implementation platform, where they can be immediately | |||
as by generating an exception when attempting to initiate a | detected. An example of this is to generate an exception when | |||
Connection with inconsistent Transport Properties. An error can | attempting to initiate a Connection with inconsistent Transport | |||
provide an optional reason to the application with further details | Properties. An error can provide an optional reason to the | |||
about why the error occurred. | application with further details about why the error occurred. | |||
A.3. Time Duration | A.3. Time Duration | |||
Time duration types are implementation-specific. For instance, it | Time duration types are implementation specific. For instance, it | |||
could be a number of seconds, number of milliseconds, or a struct | could be a number of seconds, a number of milliseconds, or a struct | |||
timeval in C or a user-defined Duration class in C++. | timeval in C; in C++, it could be a user-defined Duration class. | |||
Appendix B. Convenience Functions | Appendix B. Convenience Functions | |||
B.1. Adding Preference Properties | B.1. Adding Preference Properties | |||
TransportProperties will frequently need to set Selection Properties | TransportProperties will frequently need to set Selection Properties | |||
of type Preference, therefore implementations can provide special | of type Preference; therefore, implementations can provide special | |||
actions for adding each preference level i.e, | actions for adding each preference level, i.e., | |||
TransportProperties.Set(some_property, avoid) is equivalent | TransportProperties.Set(some_property, avoid) is equivalent to | |||
toTransportProperties.Avoid(some_property)`: | TransportProperties.Avoid(some_property): | |||
TransportProperties.Require(property) | TransportProperties.Require(property) | |||
TransportProperties.Prefer(property) | TransportProperties.Prefer(property) | |||
TransportProperties.NoPreference(property) | TransportProperties.NoPreference(property) | |||
TransportProperties.Avoid(property) | TransportProperties.Avoid(property) | |||
TransportProperties.Prohibit(property) | TransportProperties.Prohibit(property) | |||
B.2. Transport Property Profiles | B.2. Transport Property Profiles | |||
To ease the use of the Transport Services API, implementations can | To ease the use of the Transport Services API, implementations can | |||
provide a mechanism to create Transport Property objects (see | provide a mechanism to create Transport Property objects (see | |||
Section 6.2) that are preconfigured with frequently used sets of | Section 6.2) that are preconfigured with frequently used sets of | |||
properties; the following are in common use in current applications: | properties; the following subsections list those that are in common | |||
use in applications at the time of writing. | ||||
B.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 | no preference | | | preserveMsgBoundaries | No Preference | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
Table 2: reliable-inorder-stream | Table 2: reliable-inorder-stream | |||
preferences | Preferences | |||
B.2.2. reliable-message | B.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: reliable-message | Table 3: reliable-message | |||
preferences | Preferences | |||
B.2.3. unreliable-datagram | B.2.3. unreliable-datagram | |||
This profile provides a datagram transport service without any | This profile provides a datagram transport service without any | |||
reliability guarantee. An example of a protocol that provides this | reliability guarantee. An example of a protocol that provides this | |||
service is UDP. It consists of the following properties: | service is UDP. It consists of the following properties: | |||
+=======================+===============+ | +=======================+===============+ | |||
| Property | Value | | | Property | Value | | |||
+=======================+===============+ | +=======================+===============+ | |||
| reliability | avoid | | | reliability | Avoid | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
| preserveOrder | avoid | | | preserveOrder | Avoid | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
| congestionControl | no preference | | | congestionControl | No Preference | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
| preserveMsgBoundaries | require | | | preserveMsgBoundaries | Require | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
| safelyReplayable | true | | | safelyReplayable | true | | |||
+-----------------------+---------------+ | +-----------------------+---------------+ | |||
Table 4: unreliable-datagram preferences | Table 4: unreliable-datagram Preferences | |||
Applications that choose this Transport Property Profile would avoid | Applications that choose this Transport Property Profile would avoid | |||
the additional latency that could be introduced by retransmission or | the additional latency that could be introduced by retransmission or | |||
reordering in a transport protocol. | reordering in a transport protocol. | |||
Applications that choose this Transport Property Profile to reduce | Applications that choose this Transport Property Profile to reduce | |||
latency should also consider setting an appropriate capacity profile | latency should also consider setting an appropriate capacity profile | |||
Property, see Section 8.1.6 and might benefit from controlling | Property (see Section 8.1.6) and might benefit from controlling | |||
checksum coverage, see Section 6.2.7 and Section 6.2.8. | checksum coverage (see Sections 6.2.7 and 6.2.8). | |||
Appendix C. 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, Multipath TCP (MPTCP), UDP, UDP-Lite, | |||
available that 1) require interaction with the application, and 2) do | SCTP, and Low Extra Delay Background Transport (LEDBAT) available | |||
not get in the way of a possible implementation over TCP (or, with | that: | |||
limitations, UDP). The following text explains how this minimal set | ||||
is reflected in the present API. For brevity, it is based on the | 1. require interaction with the application and | |||
list in Section 4.1 of [RFC8923], updated according to the discussion | ||||
in Section 5 of [RFC8923]. The present API covers all elements of | 2. do not get in the way of a possible implementation over TCP (or, | |||
this section. This list is a subset of the transport features in | with limitations, UDP). | |||
Appendix A of [RFC8923], which refers to the primitives in "pass 2" | ||||
(Section 4) of [RFC8303] for further details on the implementation | The following text explains how this minimal set is reflected in the | |||
with TCP, MPTCP, UDP, UDP-Lite, SCTP and LEDBAT. This facilitates | present API. For brevity, it is based on the list in Section 4.1 of | |||
[RFC8923] and updated according to the discussion in Section 5 of | ||||
[RFC8923]. The present API covers all elements of this section. | ||||
This list is a subset of the transport features in Appendix A of | ||||
[RFC8923], which refers to the primitives in "pass 2". See Section 4 | ||||
of [RFC8303] for 1) further details on the implementation with TCP, | ||||
MPTCP, UDP, UDP-Lite, SCTP, and LEDBAT and 2) how to facilitate | ||||
finding the specifications for implementing the services listed below | finding the specifications for implementing the services listed below | |||
with these protocols. | with these protocols. | |||
* Connect: Initiate action (Section 7.1). | * Connect: Initiate action (Section 7.1). | |||
* Listen: Listen action (Section 7.2). | * Listen: Listen action (Section 7.2). | |||
* Specify number of attempts and/or timeout for the first | * Specify number of attempts and/or timeout for the first | |||
establishment Message: timeout parameter of Initiate (Section 7.1) | establishment Message: timeout parameter of Initiate (Section 7.1) | |||
or InitiateWithSend action (Section 9.2.5). | or InitiateWithSend action (Section 9.2.5). | |||
skipping to change at page 94, line 45 ¶ | skipping to change at line 4361 ¶ | |||
before connection establishment: InitiateWithSend action | before connection establishment: InitiateWithSend action | |||
(Section 9.2.5). | (Section 9.2.5). | |||
* Change timeout for aborting connection (using retransmit limit or | * Change timeout for aborting connection (using retransmit limit or | |||
time value): connTimeout property, using a time value | time value): connTimeout property, using a time value | |||
(Section 8.1.3). | (Section 8.1.3). | |||
* Timeout event when data could not be delivered for too long: | * Timeout event when data could not be delivered for too long: | |||
ConnectionError event (Section 10). | ConnectionError event (Section 10). | |||
* Suggest timeout to the peer: See "TCP-specific Properties: User | * Suggest timeout to the peer: See "TCP-Specific Properties: User | |||
Timeout Option (UTO)" (Section 8.2). | Timeout Option (UTO)" (Section 8.2). | |||
* Notification of ICMP error message arrival: softErrorNotify | * Notification of ICMP error message arrival: softErrorNotify | |||
(Section 6.2.17) and SoftError event (Section 8.3.1). | (Section 6.2.17) and SoftError event (Section 8.3.1). | |||
* Choose a scheduler to operate between streams of an association: | * Choose a scheduler to operate between streams of an association: | |||
connScheduler property (Section 8.1.5). | connScheduler property (Section 8.1.5). | |||
* Configure priority or weight for a scheduler: connPriority | * Configure priority or weight for a scheduler: connPriority | |||
property (Section 8.1.2). | property (Section 8.1.2). | |||
* "Specify checksum coverage used by the sender" and "Disable | * "Specify checksum coverage used by the sender" and "Disable | |||
checksum when sending": msgChecksumLen property (Section 9.1.3.6) | checksum when sending": msgChecksumLen property (Section 9.1.3.6) | |||
and fullChecksumSend property (Section 6.2.7). | and fullChecksumSend property (Section 6.2.7). | |||
* "Specify minimum checksum coverage required by receiver" and | * "Specify minimum checksum coverage required by receiver" and | |||
"Disable checksum requirement when receiving": recvChecksumLen | "Disable checksum requirement when receiving": recvChecksumLen | |||
property (Section 8.1.1) and fullChecksumRecv property | property (Section 8.1.1) and fullChecksumRecv property | |||
(Section 6.2.8). | (Section 6.2.8). | |||
* "Specify DF field": noFragmentation property (Section 9.1.3.9). | * Specify DF field: noFragmentation property (Section 9.1.3.9). | |||
* Get max. transport-message size that may be sent using a non- | * Get maximum transport-message size that may be sent using a non- | |||
fragmented IP packet from the configured interface: | fragmented IP packet from the configured interface: | |||
singularTransmissionMsgMaxLen property (Section 8.1.11.4). | singularTransmissionMsgMaxLen property (Section 8.1.11.4). | |||
* Get max. transport-message size that may be received from the | * Get maximum transport-message size that may be received from the | |||
configured interface: recvMsgMaxLen property (Section 8.1.11.6). | configured interface: recvMsgMaxLen property (Section 8.1.11.6). | |||
* Obtain ECN field: This is a read-only Message Property of the | * Obtain ECN field: This is a read-only Message Property of the | |||
MessageContext object (see "UDP(-Lite)-specific Property: ECN" | MessageContext object (see "Property Specific to UDP and UDP-Lite: | |||
Section 9.3.3.1). | ECN" (Section 9.3.3.1)). | |||
* "Specify DSCP field", "Disable Nagle algorithm", "Enable and | * "Specify DSCP field", "Disable Nagle algorithm", and "Enable and | |||
configure a Low Extra Delay Background Transfer": as suggested in | configure a Low Extra Delay Background Transfer": as suggested in | |||
Section 5.5 of [RFC8923], these transport features are | Section 5.5 of [RFC8923], these transport features are | |||
collectively offered via the connCapacityProfile property | collectively offered via the connCapacityProfile property | |||
(Section 8.1.6). Per-Message control ("Request not to bundle | (Section 8.1.6). Per-Message control ("Request not to bundle | |||
messages") is offered via the msgCapacityProfile property | messages") is offered via the msgCapacityProfile property | |||
(Section 9.1.3.8). | (Section 9.1.3.8). | |||
* Close after reliably delivering all remaining data, causing an | * 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 10). | the discussion in Section 5.2 of [RFC8923] (see also Section 10). | |||
* "Abort without delivering remaining data, causing an event | * "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": these are offered by the Abort | |||
action without promising that this is signaled to the other side. | action without promising that these are signaled to the other | |||
If it is, a ConnectionError event will be invoked at the peer | side. If they are, a ConnectionError event will be invoked at the | |||
(Section 10). | peer (Section 10). | |||
* "Reliably transfer data, with congestion control", "Reliably | * "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 9.2). Reliability is controlled via the reliability | (Section 9.2). Reliability is controlled via the reliability | |||
(Section 6.2.1) property and the msgReliable Message Property | (Section 6.2.1) property and the msgReliable Message Property | |||
(Section 9.1.3.7). Transmitting data as a Message or without | (Section 9.1.3.7). Transmitting data as a Message or without | |||
delimiters is controlled via Message Framers (Section 9.1.2). The | delimiters is controlled via Message Framers (Section 9.1.2). The | |||
choice of congestion control is provided via the congestionControl | choice of congestion control is provided via the congestionControl | |||
property (Section 6.2.9). | property (Section 6.2.9). | |||
* Configurable Message Reliability: the msgLifetime Message Property | * Configurable Message Reliability: the msgLifetime Message Property | |||
implements a time-based way to configure message reliability | implements a time-based way to configure message reliability | |||
(Section 9.1.3.1). | (Section 9.1.3.1). | |||
* "Ordered message delivery (potentially slower than unordered)" and | * "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 msgOrdered (Section 9.1.3.3). | Property msgOrdered (Section 9.1.3.3). | |||
* Request not to delay the acknowledgment (SACK) of a message: | * 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 Services system can apply when an | features the Transport Services system can apply when an | |||
application uses the connCapacityProfile Property (Section 8.1.6) | application uses the connCapacityProfile Property (Section 8.1.6) | |||
or the msgCapacityProfile Message Property (Section 9.1.3.8) with | or the msgCapacityProfile Message Property (Section 9.1.3.8) with | |||
value Low Latency/Interactive. | value Low Latency/Interactive. | |||
* Receive data (with no message delimiting): Receive action | * Receive data (with no message delimiting): Receive action | |||
(Section 9.3.1) and Received event (Section 9.3.2.1). | (Section 9.3.1) and Received event (Section 9.3.2.1). | |||
* Receive a message: Receive action (Section 9.3.1) and Received | * Receive a message: Receive action (Section 9.3.1) and Received | |||
event (Section 9.3.2.1), using Message Framers (Section 9.1.2). | event (Section 9.3.2.1) using Message Framers (Section 9.1.2). | |||
* Information about partial message arrival: Receive action | * Information about partial message arrival: Receive action | |||
(Section 9.3.1) and ReceivedPartial event (Section 9.3.2.2). | (Section 9.3.1) and ReceivedPartial event (Section 9.3.2.2). | |||
* Notification of send failures: Expired event (Section 9.2.2.2) and | * Notification of send failures: Expired event (Section 9.2.2.2) and | |||
SendError event (Section 9.2.2.3). | SendError event (Section 9.2.2.3). | |||
* Notification that the stack has no more user data to send: | * 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 9.2.2.1). | (Section 9.2.2.1). | |||
* Notification to a receiver that a partial message delivery has | * Notification to a receiver that a partial message delivery has | |||
been aborted: ReceiveError event (Section 9.3.2.3). | been aborted: ReceiveError event (Section 9.3.2.3). | |||
* Notification of Excessive Retransmissions (early warning below | * Notification of Excessive Retransmissions (early warning below | |||
abortion threshold): SoftError event (Section 8.3.1). | abortion threshold): SoftError event (Section 8.3.1). | |||
Acknowledgements | ||||
This work has received funding from the European Union's Horizon 2020 | ||||
research and innovation programme under grant agreements No. 644334 | ||||
(NEAT) and No. 688421 (MAMI). | ||||
This work has been supported by: | ||||
* Leibniz Prize project funds from the DFG - German Research | ||||
Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ FE 570/4-1). | ||||
* the UK Engineering and Physical Sciences Research Council under | ||||
grant EP/R04144X/1. | ||||
* the Research Council of Norway under its "Toppforsk" programme | ||||
through the "OCARINA" project. | ||||
Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | ||||
Kinnear for their implementation and design efforts, including Happy | ||||
Eyeballs, that heavily influenced this work. Thanks to Laurent Chuat | ||||
and Jason Lee for initial work on the Post Sockets interface, from | ||||
which this work has evolved. Thanks to Maximilian Franke for asking | ||||
good questions based on implementation experience and for | ||||
contributing text, e.g., on multicast. | ||||
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 | CH-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 | |||
Reese Enghardt | Reese 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 | |||
United Kingdom | ||||
Email: gorry@erg.abdn.ac.uk | Email: gorry@erg.abdn.ac.uk | |||
URI: http://www.erg.abdn.ac.uk/ | URI: https://erg.abdn.ac.uk/ | |||
Mirja Kuehlewind | Mirja Kühlewind | |||
Ericsson | Ericsson | |||
Ericsson-Allee 1 | Ericsson-Allee 1 | |||
Herzogenrath | Herzogenrath | |||
Germany | Germany | |||
Email: mirja.kuehlewind@ericsson.com | Email: mirja.kuehlewind@ericsson.com | |||
Colin Perkins | Colin S. Perkins | |||
University of Glasgow | University of Glasgow | |||
School of Computing Science | School of Computing Science | |||
Glasgow G12 8QQ | Glasgow | |||
G12 8QQ | ||||
United Kingdom | United Kingdom | |||
Email: csp@csperkins.org | Email: csp@csperkins.org | |||
Philipp S. Tiesel | Philipp S. Tiesel | |||
SAP SE | SAP SE | |||
George-Stephenson-Straße 7-13 | George-Stephenson-Straße 7-13 | |||
10557 Berlin | 10557 Berlin | |||
Germany | Germany | |||
Email: philipp@tiesel.net | Email: philipp@tiesel.net | |||
Tommy Pauly | Tommy Pauly | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014, | Cupertino, CA 95014 | |||
United States of America | United States of America | |||
Email: tpauly@apple.com | Email: tpauly@apple.com | |||
End of changes. 480 change blocks. | ||||
1152 lines changed or deleted | 1252 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |