draft-ietf-taps-interface-05.txt | draft-ietf-taps-interface-06.txt | |||
---|---|---|---|---|
TAPS Working Group B. Trammell, Ed. | TAPS Working Group B. Trammell, Ed. | |||
Internet-Draft Google | Internet-Draft Google | |||
Intended status: Standards Track M. Welzl, Ed. | Intended status: Standards Track M. Welzl, Ed. | |||
Expires: May 7, 2020 University of Oslo | Expires: 10 September 2020 University of Oslo | |||
T. Enghardt | T. Enghardt | |||
TU Berlin | TU Berlin | |||
G. Fairhurst | G. Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
M. Kuehlewind | M. Kuehlewind | |||
ETH Zurich | Ericsson | |||
C. Perkins | C. Perkins | |||
University of Glasgow | University of Glasgow | |||
P. Tiesel | P. Tiesel | |||
TU Berlin | TU Berlin | |||
C. Wood | C. Wood | |||
T. Pauly | T. Pauly | |||
Apple Inc. | Apple Inc. | |||
November 04, 2019 | 9 March 2020 | |||
An Abstract Application Layer Interface to Transport Services | An Abstract Application Layer Interface to Transport Services | |||
draft-ietf-taps-interface-05 | draft-ietf-taps-interface-06 | |||
Abstract | Abstract | |||
This document describes an abstract programming interface to the | This document describes an abstract programming interface to the | |||
transport layer, following the Transport Services Architecture. It | transport layer, following the Transport Services Architecture. It | |||
supports the asynchronous, atomic transmission of messages over | supports the asynchronous, atomic transmission of messages over | |||
transport protocols and network paths dynamically selected at | transport protocols and network paths dynamically selected at | |||
runtime. It is intended to replace the traditional BSD sockets API | runtime. It is intended to replace the traditional BSD sockets API | |||
as the lowest common denominator interface to the transport layer, in | as the lowest common denominator interface to the transport layer, in | |||
an environment where endpoints have multiple interfaces and potential | an environment where endpoints have multiple interfaces and potential | |||
skipping to change at page 2, line 4 ¶ | skipping to change at page 2, line 4 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on May 7, 2020. | This Internet-Draft will expire on 10 September 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
(https://trustee.ietf.org/license-info) in effect on the date of | license-info) in effect on the date of publication of this document. | |||
publication of this document. Please review these documents | Please review these documents carefully, as they describe your rights | |||
carefully, as they describe your rights and restrictions with respect | and restrictions with respect to this document. Code Components | |||
to this document. Code Components extracted from this document must | extracted from this document must include Simplified BSD License text | |||
include Simplified BSD License text as described in Section 4.e of | as described in Section 4.e of the Trust Legal Provisions and are | |||
the Trust Legal Provisions and are provided without warranty as | provided without warranty as described in the Simplified BSD License. | |||
described in the Simplified BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 | 2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 | |||
3. Interface Design Principles . . . . . . . . . . . . . . . . . 6 | 3. Overview of Interface Design . . . . . . . . . . . . . . . . 6 | |||
4. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. API Summary . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
4.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 8 | 4.1. Usage Examples . . . . . . . . . . . . . . . . . . . . . 8 | |||
4.1.1. Server Example . . . . . . . . . . . . . . . . . . . 8 | 4.1.1. Server Example . . . . . . . . . . . . . . . . . . . 8 | |||
4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9 | 4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9 | |||
4.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 10 | 4.1.3. Peer Example . . . . . . . . . . . . . . . . . . . . 10 | |||
4.2. Transport Properties . . . . . . . . . . . . . . . . . . 11 | 4.2. Transport Properties . . . . . . . . . . . . . . . . . . 11 | |||
4.2.1. Transport Property Names . . . . . . . . . . . . . . 12 | 4.2.1. Transport Property Names . . . . . . . . . . . . . . 12 | |||
4.2.2. Transport Property Types . . . . . . . . . . . . . . 13 | 4.2.2. Transport Property Types . . . . . . . . . . . . . . 13 | |||
4.3. Scope of the Interface Definition . . . . . . . . . . . . 13 | 4.3. Scope of the Interface Definition . . . . . . . . . . . . 13 | |||
5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 14 | 5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 14 | |||
5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 15 | 5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 15 | |||
5.2. Specifying Transport Properties . . . . . . . . . . . . . 16 | 5.2. Specifying Transport Properties . . . . . . . . . . . . . 17 | |||
5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 18 | 5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 19 | |||
5.2.2. Preservation of Message Boundaries . . . . . . . . . 18 | 5.2.2. Preservation of Message Boundaries . . . . . . . . . 20 | |||
5.2.3. Configure Per-Message Reliability . . . . . . . . . . 18 | 5.2.3. Configure Per-Message Reliability . . . . . . . . . . 20 | |||
5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 18 | 5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 20 | |||
5.2.5. Use 0-RTT Session Establishment with an Idempotent | 5.2.5. Use 0-RTT Session Establishment with an Idempotent | |||
Message . . . . . . . . . . . . . . . . . . . . . . . 19 | Message . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
5.2.6. Multistream Connections in Group . . . . . . . . . . 19 | 5.2.6. Multistream Connections in Group . . . . . . . . . . 21 | |||
5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 19 | 5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 21 | |||
5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 19 | 5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 21 | |||
5.2.9. Congestion control . . . . . . . . . . . . . . . . . 19 | 5.2.9. Congestion control . . . . . . . . . . . . . . . . . 22 | |||
5.2.10. Interface Instance or Type . . . . . . . . . . . . . 20 | 5.2.10. Interface Instance or Type . . . . . . . . . . . . . 22 | |||
5.2.11. Provisioning Domain Instance or Type . . . . . . . . 21 | 5.2.11. Provisioning Domain Instance or Type . . . . . . . . 23 | |||
5.2.12. Parallel Use of Multiple Paths . . . . . . . . . . . 21 | 5.2.12. Use Temporary Local Address . . . . . . . . . . . . . 24 | |||
5.2.13. Direction of communication . . . . . . . . . . . . . 22 | 5.2.13. Parallel Use of Multiple Paths . . . . . . . . . . . 24 | |||
5.2.14. Notification of excessive retransmissions . . . . . . 22 | 5.2.14. Direction of communication . . . . . . . . . . . . . 25 | |||
5.2.15. Notification of ICMP soft error message arrival . . . 22 | 5.2.15. Notification of excessive retransmissions . . . . . . 25 | |||
5.3. Specifying Security Parameters and Callbacks . . . . . . 22 | 5.2.16. Notification of ICMP soft error message arrival . . . 25 | |||
5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 23 | 5.3. Specifying Security Parameters and Callbacks . . . . . . 26 | |||
5.3.2. Connection Establishment Callbacks . . . . . . . . . 24 | 5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 26 | |||
6. Establishing Connections . . . . . . . . . . . . . . . . . . 24 | 5.3.2. Connection Establishment Callbacks . . . . . . . . . 27 | |||
6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 24 | 6. Establishing Connections . . . . . . . . . . . . . . . . . . 28 | |||
6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 26 | 6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 28 | |||
6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 27 | 6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 29 | |||
6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 28 | 6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 30 | |||
7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 29 | 6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 32 | |||
7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 30 | 7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
7.2. Sending Replies . . . . . . . . . . . . . . . . . . . . . 30 | 7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 34 | |||
7.3. Send Events . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.2. Sending Replies . . . . . . . . . . . . . . . . . . . . . 34 | |||
7.3.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.3. Send Events . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
7.3.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 31 | 7.3.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
7.3.3. SendError . . . . . . . . . . . . . . . . . . . . . . 32 | 7.3.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
7.4. Message Properties . . . . . . . . . . . . . . . . . . . 32 | 7.3.3. SendError . . . . . . . . . . . . . . . . . . . . . . 35 | |||
7.4.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 33 | 7.4. Message Contexts . . . . . . . . . . . . . . . . . . . . 36 | |||
7.4.2. Priority . . . . . . . . . . . . . . . . . . . . . . 33 | 7.5. Message Properties . . . . . . . . . . . . . . . . . . . 36 | |||
7.4.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 34 | 7.5.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 37 | |||
7.4.4. Idempotent . . . . . . . . . . . . . . . . . . . . . 34 | 7.5.2. Priority . . . . . . . . . . . . . . . . . . . . . . 38 | |||
7.4.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 34 | 7.5.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
7.4.6. Corruption Protection Length . . . . . . . . . . . . 35 | 7.5.4. Idempotent . . . . . . . . . . . . . . . . . . . . . 39 | |||
7.4.7. Reliable Data Transfer (Message) . . . . . . . . . . 35 | 7.5.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
7.4.8. Message Capacity Profile Override . . . . . . . . . . 36 | 7.5.6. Corruption Protection Length . . . . . . . . . . . . 40 | |||
7.4.9. Singular Transmission . . . . . . . . . . . . . . . . 36 | 7.5.7. Reliable Data Transfer (Message) . . . . . . . . . . 40 | |||
7.5. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 37 | 7.5.8. Message Capacity Profile Override . . . . . . . . . . 40 | |||
7.6. Batching Sends . . . . . . . . . . . . . . . . . . . . . 37 | 7.5.9. Singular Transmission . . . . . . . . . . . . . . . . 40 | |||
7.7. Send on Active Open: InitiateWithSend . . . . . . . . . . 38 | 7.6. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 41 | |||
8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 38 | 7.7. Batching Sends . . . . . . . . . . . . . . . . . . . . . 42 | |||
8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 38 | 7.8. Send on Active Open: InitiateWithSend . . . . . . . . . . 42 | |||
8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 39 | 8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 39 | 8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 43 | |||
8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 40 | 8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 43 | |||
8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 40 | 8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 44 | |||
8.3. Receive Message Properties . . . . . . . . . . . . . . . 41 | 8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 44 | |||
8.3.1. ECN . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 45 | |||
8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 41 | 8.3. Receive Message Properties . . . . . . . . . . . . . . . 45 | |||
8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 41 | 8.3.1. UDP(-Lite)-specific Property: ECN . . . . . . . . . . 45 | |||
9. Message Contexts . . . . . . . . . . . . . . . . . . . . . . 42 | 8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 45 | |||
10. Message Framers . . . . . . . . . . . . . . . . . . . . . . . 42 | 8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 46 | |||
10.1. Adding Message Framers to Connections . . . . . . . . . 43 | 9. Message Framers . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
10.2. Framing Meta-Data . . . . . . . . . . . . . . . . . . . 43 | 9.1. Adding Message Framers to Connections . . . . . . . . . . 47 | |||
11. Managing Connections . . . . . . . . . . . . . . . . . . . . 44 | 9.2. Framing Meta-Data . . . . . . . . . . . . . . . . . . . . 47 | |||
11.1. Generic Connection Properties . . . . . . . . . . . . . 45 | 10. Managing Connections . . . . . . . . . . . . . . . . . . . . 48 | |||
11.1.1. Retransmission Threshold Before Excessive | 10.1. Generic Connection Properties . . . . . . . . . . . . . 49 | |||
Retransmission Notification . . . . . . . . . . . . 46 | 10.1.1. Retransmission Threshold Before Excessive | |||
Retransmission Notification . . . . . . . . . . . . . 49 | ||||
11.1.2. Required Minimum Corruption Protection Coverage for | 10.1.2. Required Minimum Corruption Protection Coverage for | |||
Receiving . . . . . . . . . . . . . . . . . . . . . 46 | Receiving . . . . . . . . . . . . . . . . . . . . . . 50 | |||
11.1.3. Priority (Connection) . . . . . . . . . . . . . . . 46 | 10.1.3. Priority (Connection) . . . . . . . . . . . . . . . 50 | |||
11.1.4. Timeout for Aborting Connection . . . . . . . . . . 46 | 10.1.4. Timeout for Aborting Connection . . . . . . . . . . 50 | |||
11.1.5. Connection Group Transmission Scheduler . . . . . . 47 | 10.1.5. Connection Group Transmission Scheduler . . . . . . 51 | |||
11.1.6. Maximum Message Size Concurrent with Connection | 10.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 51 | |||
Establishment . . . . . . . . . . . . . . . . . . . 47 | 10.1.7. Bounds on Send or Receive Rate . . . . . . . . . . . 52 | |||
11.1.7. Maximum Message Size Before Fragmentation or | 10.1.8. Read-only Connection Properties . . . . . . . . . . 53 | |||
Segmentation . . . . . . . . . . . . . . . . . . . . 47 | 10.2. TCP-specific Properties: User Timeout Option (UTO) . . . 54 | |||
11.1.8. Maximum Message Size on Send . . . . . . . . . . . . 47 | 10.2.1. Advertised User Timeout . . . . . . . . . . . . . . 54 | |||
11.1.9. Maximum Message Size on Receive . . . . . . . . . . 48 | 10.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 54 | |||
11.1.10. Capacity Profile . . . . . . . . . . . . . . . . . . 48 | 10.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 55 | |||
11.1.11. Bounds on Send or Receive Rate . . . . . . . . . . . 49 | 10.3. Connection Lifecycle Events . . . . . . . . . . . . . . 55 | |||
11.1.12. TCP-specific Property: User Timeout . . . . . . . . 50 | 10.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . 55 | |||
11.2. Soft Errors . . . . . . . . . . . . . . . . . . . . . . 50 | 10.3.2. Excessive retransmissions . . . . . . . . . . . . . 55 | |||
11.3. Excessive retransmissions . . . . . . . . . . . . . . . 51 | 11. Connection Termination . . . . . . . . . . . . . . . . . . . 55 | |||
12. Connection Termination . . . . . . . . . . . . . . . . . . . 51 | 12. Connection State and Ordering of Operations and Events . . . 56 | |||
13. Connection State and Ordering of Operations and Events . . . 51 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 57 | |||
14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 52 | 14. Security Considerations . . . . . . . . . . . . . . . . . . . 57 | |||
15. Security Considerations . . . . . . . . . . . . . . . . . . . 53 | 15. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 59 | |||
16. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 53 | 16. References . . . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
17. References . . . . . . . . . . . . . . . . . . . . . . . . . 53 | 16.1. Normative References . . . . . . . . . . . . . . . . . . 59 | |||
17.1. Normative References . . . . . . . . . . . . . . . . . . 53 | 16.2. Informative References . . . . . . . . . . . . . . . . . 60 | |||
17.2. Informative References . . . . . . . . . . . . . . . . . 54 | Appendix A. Convenience Functions . . . . . . . . . . . . . . . 62 | |||
Appendix A. Convenience Functions . . . . . . . . . . . . . . . 56 | A.1. Adding Preference Properties . . . . . . . . . . . . . . 63 | |||
A.1. Adding Preference Properties . . . . . . . . . . . . . . 56 | A.2. Transport Property Profiles . . . . . . . . . . . . . . . 63 | |||
A.2. Transport Property Profiles . . . . . . . . . . . . . . . 56 | A.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 63 | |||
A.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 57 | A.2.2. reliable-message . . . . . . . . . . . . . . . . . . 64 | |||
A.2.2. reliable-message . . . . . . . . . . . . . . . . . . 57 | A.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 64 | |||
A.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 57 | Appendix B. Relationship to the Minimal Set of Transport Services | |||
Appendix B. Additional Properties . . . . . . . . . . . . . . . 58 | for End Systems . . . . . . . . . . . . . . . . . . . . . 65 | |||
B.1. Experimental Transport Properties . . . . . . . . . . . . 58 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 68 | |||
B.1.1. Cost Preferences . . . . . . . . . . . . . . . . . . 59 | ||||
Appendix C. Sample API definition in Go . . . . . . . . . . . . 59 | ||||
Appendix D. Relationship to the Minimal Set of Transport | ||||
Services for End Systems . . . . . . . . . . . . . . 59 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
1. Introduction | 1. Introduction | |||
The BSD Unix Sockets API's SOCK_STREAM abstraction, by bringing | This document specifies a modern abstract programming interface atop | |||
network sockets into the UNIX programming model, allowing anyone who | the high-level architecture for transport services defined in | |||
knew how to write programs that dealt with sequential-access files to | [I-D.ietf-taps-arch]. It supports the asynchronous, atomic | |||
also write network applications, was a revolution in simplicity. The | transmission of messages over transport protocols and network paths | |||
simplicity of this API is a key reason the Internet won the protocol | dynamically selected at runtime. It is intended to replace the | |||
wars [PROTOCOL-WARS] of the 1980s. SOCK_STREAM is tied to the | traditional BSD sockets API as the lowest common denominator | |||
Transmission Control Protocol (TCP), specified in 1981 [RFC0793]. | interface to the transport layer, in an environment where endpoints | |||
TCP has scaled remarkably well over the past three and a half | have multiple interfaces and potential transport protocols to select | |||
decades, but its total ubiquity has hidden an uncomfortable fact: the | from. | |||
network is not really a file, and stream abstractions are too | ||||
simplistic for many modern application programming models. | ||||
In the meantime, the nature of Internet access, and the variety of | As applications adopt this interface, they will benefit from a wide | |||
Internet transport protocols, is evolving. The challenges that new | set of transport features that can evolve over time, and ensure that | |||
protocols and access paradigms present to the sockets API and to | the system providing the interface can optimize its behavior based on | |||
programming models based on them inspire the design principles of a | the application requirements and network conditions, without | |||
new approach, which we outline in Section 3. | requiring changes to the applications. This flexibility enables | |||
faster deployment of new features and protocols. It can also support | ||||
applications by offering racing and fallback mechanisms, which | ||||
otherwise need to be implemented in each application separately. | ||||
This document builds a modern abstract programming interface atop the | It derives specific path and protocol selection properties and | |||
high-level architecture for transport services defined in | supported transport features from the analysis provided in [RFC8095], | |||
[I-D.ietf-taps-arch]. It derives specific path and protocol | [I-D.ietf-taps-minset], and [I-D.ietf-taps-transport-security]. The | |||
selection properties and supported transport features from the | design encourages implementations underneath the interface to | |||
analysis provided in [RFC8095], [I-D.ietf-taps-minset], and | dynamically choose a transport protocol depending on an application's | |||
[I-D.ietf-taps-transport-security]. | choices rather than statically binding applications to a protocol at | |||
compile time. We note that transport system implementations SHOULD | ||||
provide applications a way to override transport selection and | ||||
instantiate a specific stack, e.g. to support servers wanting to | ||||
listen to a specific protocol. This specific transport stack choice | ||||
is discouraged for general use, as it comes at the cost of reduced | ||||
portability. | ||||
2. Terminology and Notation | 2. Terminology and Notation | |||
This API is described in terms of Objects, which an application can | This API is described in terms of Objects, which an application can | |||
interact with; Actions the application can perform on these Objects; | interact with; Actions the application can perform on these Objects; | |||
Events, which an Object can send to an application asynchronously; | Events, which an Object can send to an application asynchronously; | |||
and Parameters associated with these Actions and Events. | and Parameters associated with these Actions and Events. | |||
The following notations, which can be combined, are used in this | The following notations, which can be combined, are used in this | |||
document: | document: | |||
o An Action creates an Object: | * An Action creates an Object: | |||
Object := Action() | Object := Action() | |||
o An Action creates an array of Objects: | * An Action creates an array of Objects: | |||
[]Object := Action() | []Object := Action() | |||
o An Action is performed on an Object: | * An Action is performed on an Object: | |||
Object.Action() | Object.Action() | |||
o An Object sends an Event: | * An Object sends an Event: | |||
Object -> Event<> | Object -> Event<> | |||
o 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?, ...) / Event<param0, param1, ...> | Action(param0, param1?, ...) / Event<param0, param1, ...> | |||
Actions associated with no Object are Actions on the abstract | Actions associated with no Object are Actions on the abstract | |||
interface itself; they are equivalent to Actions on a per-application | interface itself; they are equivalent to Actions on a per-application | |||
global context. | global context. | |||
How these abstract concepts map into concrete implementations of this | How these abstract concepts map into concrete implementations of this | |||
API in a given language on a given platform is largely dependent on | API in a given language on a given platform is largely dependent on | |||
the features of the language and the platform. Actions could be | the features of the language and the platform. Actions could be | |||
implemented as functions or method calls, for instance, and Events | implemented as functions or method calls, for instance, and Events | |||
could be implemented via callbacks, communicating sequential | could be implemented via event queues, handler functions or classes, | |||
processes, or other asynchronous calling conventions. The method for | communicating sequential processes, or other asynchronous calling | |||
dispatching and handling Events is an implementation detail, with the | conventions. | |||
caveat that the interface for receiving Messages must require the | ||||
application to invoke the Connection.Receive() Action once per | ||||
Message to be received (see Section 8). | ||||
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, it is recommended that implementations of | applications. However, it is recommended that implementations of | |||
this interface also return errors immediately, according to the error | this interface also return errors immediately, according to the error | |||
handling idioms of the implementation platform, for errors that can | handling idioms of the implementation platform, for errors that can | |||
be immediately detected, such as inconsistency in Transport | be immediately detected, such as inconsistency in Transport | |||
Properties. Errors can provide an optional reason to give the | Properties. Errors can provide an optional reason to give the | |||
application further details as to why the error occured. | application further details as to why the error occured. | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. Interface Design Principles | 3. Overview of Interface Design | |||
The design of the interface specified in this document is based on a | The design of the interface specified in this document is based on a | |||
set of princples, themselves an elaboration on the architectural | set of princples, themselves an elaboration on the architectural | |||
design principles defined in [I-D.ietf-taps-arch]. The interface | design principles defined in [I-D.ietf-taps-arch]. The interface | |||
defined in this document provides: | defined in this document provides: | |||
o A single interface to a variety of transport protocols to be used | * A single interface to a variety of transport protocols to be used | |||
in a variety of application design patterns, independent of the | in a variety of application design patterns, independent of the | |||
properties of the application and the Protocol Stacks that will be | properties of the application and the Protocol Stacks that will be | |||
used at runtime, such that all common specialized features of | used at runtime, such that all common specialized features of | |||
these protocol stacks are made available to the application as | these protocol stacks are made available to the application as | |||
necessary in a transport-independent way, to enable applications | necessary in a transport-independent way, to enable applications | |||
written to a single API to make use of transport protocols in | written to a single API to make use of transport protocols in | |||
terms of the features they provide; | terms of the features they provide; | |||
o 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 provide these; | |||
o Asynchronous Connection establishment, transmission, and | * Asynchronous Connection establishment, transmission, and | |||
reception, allowing concurrent operations during establishment and | reception, allowing concurrent operations during establishment and | |||
supporting event-driven application interactions with the | supporting event-driven application interactions with the | |||
transport layer, in line with developments in modern platforms and | transport layer, in line with developments in modern platforms and | |||
programming languages; | programming languages; | |||
o Explicit support for security properties as first-order transport | * Explicit support for security properties as first-order transport | |||
features, and for long-term caching of cryptographic identities | features, and for configuration of cryptographic identities and | |||
and parameters for associations among endpoints; and | transport security parameters persistent across multiple | |||
Connections; and | ||||
o Explicit support for multistreaming and multipath transport | * Explicit support for multistreaming and multipath transport | |||
protocols, and the grouping of related Connections into Connection | protocols, and the grouping of related Connections into Connection | |||
Groups through cloning of Connections, to allow applications to | Groups through cloning of Connections, to allow applications to | |||
take full advantage of new transport protocols supporting these | take full advantage of new transport protocols supporting these | |||
features. | features. | |||
4. API Summary | 4. API Summary | |||
The Transport Services Interface is the basic common abstract | The Transport Services API is the basic common abstract application | |||
application programming interface to the Transport Services | programming interface to the Transport Services Architecture defined | |||
Architecture defined in the TAPS Architecture [I-D.ietf-taps-arch]. | in the TAPS Architecture [I-D.ietf-taps-arch]. | |||
An application primarily interacts with this interface through two | An application primarily interacts with this API through two Objects: | |||
Objects: Preconnections and Connections. A Preconnection represents | Preconnections and Connections. A Preconnection represents a set of | |||
a set of properties and constraints on the selection and | properties and constraints on the selection and configuration of | |||
configuration of paths and protocols to establish a Connection with a | paths and protocols to establish a Connection with a remote Endpoint. | |||
remote Endpoint. A Connection represents a transport Protocol Stack | A Connection represents a transport Protocol Stack on which data can | |||
on which data can be sent to and/or received from a remote Endpoint | be sent to and/or received from a remote Endpoint (i.e., depending on | |||
(i.e., depending on the kind of transport, connections can be bi- | the kind of transport, connections can be bi-directional or | |||
directional or unidirectional). Connections can be created from | unidirectional). Connections can be created from Preconnections in | |||
Preconnections in three ways: by initiating the Preconnection (i.e., | three ways: by initiating the Preconnection (i.e., actively opening, | |||
actively opening, as in a client), through listening on the | as in a client), through listening on the Preconnection (i.e., | |||
Preconnection (i.e., passively opening, as in a server), or | passively opening, as in a server), or rendezvousing on the | |||
rendezvousing on the Preconnection (i.e. peer to peer | Preconnection (i.e. peer to peer establishment). | |||
establishment). | ||||
Once a Connection is established, data can be sent on it in the form | Once a Connection is established, data can be sent and received on it | |||
of Messages. The interface supports the preservation of message | in the form of Messages. The interface supports the preservation of | |||
boundaries both via explicit Protocol Stack support, and via | message boundaries both via explicit Protocol Stack support, and via | |||
application support through a Message Framer which finds message | application support through a Message Framer which finds message | |||
boundaries in a stream. Messages are received asynchronously through | boundaries in a stream. Messages are received asynchronously through | |||
a callback registered by the application. Errors and other | event handlers registered by the application. Errors and other | |||
notifications also happen asynchronously on the Connection. | notifications also happen asynchronously on the Connection. It is | |||
not necessary for an application to handle all events; some events | ||||
may have implementation-specific default handlers. The application | ||||
should not assume that ignoring events (e.g. errors) is always safe. | ||||
Section 5, Section 6, Section 7, Section 8, and Section 12 describe | Section 5, Section 6, Section 7, Section 8, and Section 11 describe | |||
the details of application interaction with Objects through Actions | the details of application interaction with Objects through Actions | |||
and Events in each phase of a Connection, following the phases | and Events in each phase of a Connection, following the phases (Pre- | |||
described in [I-D.ietf-taps-arch]. | Establishment, Establishment, Data Transfer, and Termination) | |||
described in Section 4.1 of [I-D.ietf-taps-arch]. | ||||
4.1. Usage Examples | 4.1. Usage Examples | |||
The following usage examples illustrate how an application might use | The following usage examples illustrate how an application might use | |||
a Transport Services Interface to: | a Transport Services Interface to: | |||
o Act as a server, by listening for incoming connections, receiving | * Act as a server, by listening for incoming connections, receiving | |||
requests, and sending responses, see Section 4.1.1. | requests, and sending responses, see Section 4.1.1. | |||
o Act as a client, by connecting to a remote endpoint using | * Act as a client, by connecting to a remote endpoint using | |||
Initiate, sending requests, and receiving responses, see | Initiate, sending requests, and receiving responses, see | |||
Section 4.1.2. | Section 4.1.2. | |||
o Act as a peer, by connecting to a remote endpoint using Rendezvous | * Act as a peer, by connecting to a remote endpoint using Rendezvous | |||
while simultaneously waiting for incoming Connections, sending | while simultaneously waiting for incoming Connections, sending | |||
Messages, and receiving Messages, see Section 4.1.3. | Messages, and receiving Messages, see Section 4.1.3. | |||
The examples in this section presume that a transport protocol is | The examples in this section presume that a transport protocol is | |||
available between the endpoints that provides Reliable Data Transfer, | available between the endpoints that provides Reliable Data Transfer, | |||
Preservation of data ordering, and Preservation of Message | Preservation of data ordering, and Preservation of Message | |||
Boundaries. In this case, the application can choose to receive only | Boundaries. In this case, the application can choose to receive only | |||
complete messages. | complete messages. | |||
If none of the available transport protocols provides Preservation of | If none of the available transport protocols provides Preservation of | |||
Message Boundaries, but there is a transport protocol that provides a | Message Boundaries, but there is a transport protocol that provides a | |||
reliable ordered byte stream, an application may receive this byte | reliable ordered byte stream, an application may 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 may provide a Message | Messages. Alternatively, an application may provide a Message | |||
Framer, which can transform a byte stream into a sequence of Messages | Framer, which can transform a byte stream into a sequence of Messages | |||
(Section 10). | (Section 9). | |||
4.1.1. Server Example | 4.1.1. Server Example | |||
This is an example of how an application might listen for incoming | This is an example of how an application might listen for incoming | |||
Connections using the Transport Services Interface, receive a | Connections using the Transport Services Interface, receive a | |||
request, and send a response. | request, and send a response. | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithInterface("any") | LocalSpecifier.WithInterface("any") | |||
LocalSpecifier.WithService("https") | LocalSpecifier.WithService("https") | |||
skipping to change at page 9, line 19 ¶ | skipping to change at page 9, line 19 ¶ | |||
TransportProperties := NewTransportProperties() | TransportProperties := NewTransportProperties() | |||
TransportProperties.Require(preserve-msg-boundaries) | TransportProperties.Require(preserve-msg-boundaries) | |||
// Reliable Data Transfer and Preserve Order are Required by default | // Reliable Data Transfer and Preserve Order are Required by default | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
SecurityParameters.AddIdentity(identity) | SecurityParameters.AddIdentity(identity) | |||
SecurityParameters.AddPrivateKey(privateKey, publicKey) | SecurityParameters.AddPrivateKey(privateKey, publicKey) | |||
// Specifying a remote endpoint is optional when using Listen() | // Specifying a remote endpoint is optional when using Listen() | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
None, | ||||
TransportProperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
Listener := Preconnection.Listen() | Listener := Preconnection.Listen() | |||
Listener -> ConnectionReceived<Connection> | Listener -> ConnectionReceived<Connection> | |||
// Only receive complete messages | // Only receive complete messages in a Conn.Received handler | |||
Connection.Receive() | Connection.Receive() | |||
Connection -> Received(messageDataRequest, messageContext) | Connection -> Received<messageDataRequest, messageContext> | |||
//---- Receive event handler begin ---- | ||||
Connection.Send(messageDataResponse) | Connection.Send(messageDataResponse) | |||
Connection.Close() | Connection.Close() | |||
// Stop listening for incoming Connections | // Stop listening for incoming Connections | |||
// (this example supports only one Connection) | ||||
Listener.Stop() | Listener.Stop() | |||
//---- Receive event handler end ---- | ||||
4.1.2. Client Example | 4.1.2. Client Example | |||
This is an example of how an application might connect to a remote | This is an example of how an application might connect to a remote | |||
application using the Transport Services Interface, send a request, | application using the Transport Services Interface, send a request, | |||
and receive a response. | and receive a response. | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
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 := New Callback({ | TrustCallback := NewCallback({ | |||
// Verify identity of the remote endpoint, return the result | // Verify identity of the remote endpoint, 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(None, | Preconnection := NewPreconnection(RemoteSpecifier, | |||
RemoteSpecifier, | TransportProperties, | |||
TransportPreperties, | ||||
SecurityParameters) | SecurityParameters) | |||
Connection := Preconnection.Initiate() | Connection := Preconnection.Initiate() | |||
Connection -> Ready<> | Connection -> Ready<> | |||
//---- Ready event handler begin ---- | ||||
Connection.Send(messageDataRequest) | Connection.Send(messageDataRequest) | |||
// Only receive complete messages | // Only receive complete messages | |||
Connection.Receive() | Connection.Receive() | |||
//---- Ready event handler end ---- | ||||
Connection -> Received(messageDataResponse, messageContext) | Connection -> Received<messageDataResponse, messageContext> | |||
// Close the Connection in a Receive event handler | ||||
Connection.Close() | Connection.Close() | |||
4.1.3. Peer Example | 4.1.3. Peer Example | |||
This is an example of how an application might establish a connection | This is an example of how an application might establish a connection | |||
with a peer using Rendezvous(), send a Message, and receive a | with a peer using Rendezvous(), send a Message, and receive a | |||
Message. | Message. | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithPort(9876) | LocalSpecifier.WithPort(9876) | |||
skipping to change at page 11, line 28 ¶ | skipping to change at page 11, line 28 ¶ | |||
SecurityParameters.AddPrivateKey(privateKey, publicKey) | SecurityParameters.AddPrivateKey(privateKey, publicKey) | |||
TrustCallback := New Callback({ | TrustCallback := New Callback({ | |||
// Verify identity of the remote endpoint, return the result | // Verify identity of the remote endpoint, return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(trustCallback) | SecurityParameters.SetTrustVerificationCallback(trustCallback) | |||
// Both local and remote endpoint must be specified | // Both local and remote endpoint must be specified | |||
Preconnection := NewPreconnection(LocalSpecifier, | Preconnection := NewPreconnection(LocalSpecifier, | |||
RemoteSpecifier, | RemoteSpecifier, | |||
TransportPreperties, | TransportProperties, | |||
SecurityParameters) | SecurityParameters) | |||
Preconnection.Rendezvous() | Preconnection.Rendezvous() | |||
Preconnection -> RendezvousDone<Connection> | Preconnection -> RendezvousDone<Connection> | |||
//---- Ready event handler begin ---- | ||||
Connection.Send(messageDataRequest) | Connection.Send(messageDataRequest) | |||
// Only receive complete messages | // Only receive complete messages | |||
Connection.Receive() | Connection.Receive() | |||
//---- Ready event handler end ---- | ||||
Connection -> Received(messageDataResponse, messageContext) | Connection -> Received<messageDataResponse, messageContext> | |||
// Close the Connection in a Receive event handler | ||||
Connection.Close() | Connection.Close() | |||
4.2. Transport Properties | 4.2. Transport Properties | |||
Each application using the Transport Services Interface declares its | Each application using the Transport Services Interface declares its | |||
preferences for how the transport service should operate using | preferences for how the transport service should operate using | |||
properties at each stage of the lifetime of a connection using | properties at each stage of the lifetime of a connection using | |||
Transport Properties, as defined in [I-D.ietf-taps-arch]. | Transport Properties, as defined in [I-D.ietf-taps-arch]. | |||
Transport Properties are divided into Selection, Connection, and | Transport Properties are divided into Selection, Connection, and | |||
Message Properties. During pre-establishment, Selection Properties | Message Properties. During pre-establishment, Selection Properties | |||
(see Section 5.2) are used to specify which paths and protocol stacks | (see Section 5.2) are used to specify which paths and protocol stacks | |||
can be used and are preferred by the application, and Connection | can be used and are preferred by the application, and Connection | |||
Properties (see Section 11.1) can be used to influence decisions made | Properties (see Section 10.1) can be used to influence decisions made | |||
during establishment and to fine-tune the eventually established | during establishment and to fine-tune the eventually established | |||
connection. These Connection Properties can also be used later, to | connection. These Connection Properties can also be used later, to | |||
monitor and fine-tune established connections. The behavior of the | monitor and fine-tune established connections. The behavior of the | |||
selected protocol stack(s) when sending Messages is controlled by | selected protocol stack(s) when sending Messages is controlled by | |||
Message Properties (see Section 7.4). | Message Properties (see Section 7.5). | |||
All Transport Properties, regardless of the phase in which they are | All Transport Properties, regardless of the phase in which they are | |||
used, are organized within a single namespace. This enables setting | used, are organized within a single namespace. This enables setting | |||
them as defaults in earlier stages and querying them in later stages: | them as defaults in earlier stages and querying them in later stages: | |||
o Connection Properties can be set on Preconnections | * Connection Properties can be set on Preconnections | |||
o Message Properties can be set on Preconnections and Connections | * Message Properties can be set on Preconnections and Connections | |||
o The effect of Selection Properties can be queried on Connections | * The effect of Selection Properties can be queried on Connections | |||
and Messages | and Messages | |||
Note that Configuring Connection Properties and Message Properties on | Note that configuring Connection Properties and Message Properties on | |||
Preconnections is preferred over setting them later. Early | Preconnections is preferred over setting them later. Early | |||
specification of Connection Properties allows their use as additional | specification of Connection Properties allows their use as additional | |||
input to the selection process. Protocol Specific Properties, see | input to the selection process. Protocol Specific Properties, which | |||
Section 4.2.1, should not be used as an input to the selection | enable configuration of specialized features of a specific protocol, | |||
process. | see Section 3.2 of [I-D.ietf-taps-arch], are not used as an input to | |||
the selection process but only support configuration if the | ||||
respective prototocol has been selected. | ||||
4.2.1. Transport Property Names | 4.2.1. Transport Property Names | |||
Transport Properties are referred to by property names. These names | Transport Properties are referred to by property names. These names | |||
are lower-case strings whereby words are separated by hyphens. These | are lower-case strings whereby words are separated by hyphens. These | |||
names serve two purposes: | names serve two purposes: | |||
o Allow different components of a TAPS implementation to pass | * Allow different components of a TAPS implementation to pass | |||
Transport Properties, e.g., between a language frontend and a | Transport Properties, e.g., between a language frontend and a | |||
policy manager, or as a representation of properties retrieved | policy manager, or as a representation of properties retrieved | |||
from a file or other storage. | from a file or other storage. | |||
o Make code of different TAPS implementations look similar. | * Make code of different TAPS implementations look similar. | |||
Transport Property Names are hierarchically organized in the form | Transport Property Names are hierarchically organized in the form | |||
[<Namespace>.]<PropertyName>. | [<Namespace>.]<PropertyName>. | |||
o The Namespace part is empty for well known, generic properties, | * The Namespace part MUST be empty for well-known, generic | |||
i.e., for properties that are not specific to a protocol and are | properties, i.e., for properties that are not specific to a | |||
defined in an RFC. | protocol and are defined in an RFC. | |||
o Protocol Specific Properties must use the protocol acronym as | * Protocol Specific Properties MUST use the protocol acronym as | |||
Namespace, e.g., "tcp" for TCP specific Transport Properties. For | Namespace, e.g., "tcp" for TCP specific Transport Properties. For | |||
IETF protocols, property names under these namespaces should be | IETF protocols, property names under these namespaces SHOULD be | |||
defined in an RFC. | defined in an RFC. | |||
o Vendor or implementation specific properties must use a a string | * Vendor or implementation specific properties MUST use a string | |||
identifying the vendor or implementation as Namespace. | identifying the vendor or implementation as Namespace. | |||
Namespaces for the keywords provided in the IANA protocol numbers | ||||
registry (see https://www.iana.org/assignments/protocol-numbers/ | ||||
protocol-numbers.xhtml) are reserved for Protocol Specific Properties | ||||
and MUST not be used for vendor or implementation specific | ||||
properties. | ||||
4.2.2. Transport Property Types | 4.2.2. Transport Property Types | |||
Transport Properties can have one of a set of data types: | Transport Properties can have one of a set of data types: | |||
o Boolean: can take the values "true" and "false"; representation is | * Boolean: can take the values "true" and "false"; representation is | |||
implementation-dependent. | implementation-dependent. | |||
o Integer: can take positive or negative numeric integer values; | * Integer: can take positive or negative numeric integer values; | |||
range and representation is implementation-dependent. | range and representation is implementation-dependent. | |||
o Numeric: can take positive or negative numeric values; range and | * Numeric: can take positive or negative numeric values; range and | |||
representation is implementation-dependent. | representation is implementation-dependent. | |||
o Enumeration: can take one value of a finite set of values, | * Enumeration: can take one value of a finite set of values, | |||
dependent on the property itself. The representation is | dependent on the property itself. The representation is | |||
implementation dependent; however, implementations MUST provide a | implementation dependent; however, implementations MUST provide a | |||
method for the application to determine the entire set of possible | method for the application to determine the entire set of possible | |||
values for each property. | values for each property. | |||
o Preference: can take one of five values (Prohibit, Avoid, Ignore, | * Preference: can take one of five values (Prohibit, Avoid, Ignore, | |||
Prefer, Require) for the level of preference of a given property | Prefer, Require) for the level of preference of a given property | |||
during protocol selection; see Section 5.2. | during protocol selection; see Section 5.2. | |||
4.3. Scope of the Interface Definition | 4.3. Scope of the Interface Definition | |||
This document defines a language- and platform-independent interface | This document defines a language- and platform-independent interface | |||
to a Transport Services system. Given the wide variety of languages | to a Transport Services system. Given the wide variety of languages | |||
and language conventions used to write applications that use the | and language conventions used to write applications that use the | |||
transport layer to connect to other applications over the Internet, | transport layer to connect to other applications over the Internet, | |||
this independence makes this interface necessarily abstract. | this independence makes this interface necessarily abstract. | |||
There is no interoperability benefit in tightly defining how the | There is no interoperability benefit in tightly defining how the | |||
interface is presented to application programmers across diverse | interface is presented to application programmers across diverse | |||
platforms. However, maintaining the "shape" of the abstract | platforms. However, maintaining the "shape" of the abstract | |||
interface across these platforms reduces the effort for programmers | interface across these platforms reduces the effort for programmers | |||
who learn the transport services interface to then apply their | who learn the transport services interface to then apply their | |||
knowledge across multiple platforms. | knowledge across multiple platforms. | |||
We therefore make the following recommendations: | We therefore make the following recommendations: | |||
o Actions, Events, and Errors in implementations of this interface | * Actions, Events, and Errors in implementations of this interface | |||
SHOULD use the names given for them in the document, subject to | SHOULD use the names given for them in the document, subject to | |||
capitalization, punctuation, and other typographic conventions in | capitalization, punctuation, and other typographic conventions in | |||
the language of the implementation, unless the implementation | the language of the implementation, unless the implementation | |||
itself uses different names for substantially equivalent objects | itself uses different names for substantially equivalent objects | |||
for networking by convention. | for networking by convention. | |||
o Implementations of this interface SHOULD implement each Selection | * Implementations of this interface SHOULD implement each Selection | |||
Property, Connection Property, and Message Context Property | Property, Connection Property, and Message Context Property | |||
specified in this document, exclusive of appendices. Each | specified in this document. Each interface SHOULD be implemented | |||
interface SHOULD be implemented even when this will always result | even when this will always result in no operation, e.g. there is | |||
in no operation, e.g. there is no action when the API specifies a | no action when the API specifies a Property that is not available | |||
Property that is not available in a transport protocol implemented | in a transport protocol implemented on a specific platform. For | |||
on a specific platform. | example, if TCP is the only underlying transport protocol, the | |||
Message Property "msg-ordered" can be implemented even if | ||||
disabling ordering will not have any effect TCP because the API | ||||
does not guarantee out-of-order delivery. Similarly, the msg- | ||||
lifetime" Message Property can be implemented but ignored, as the | ||||
description of this Property states that "it is not guaranteed | ||||
that a Message will not be sent when its Lifetime has expired". | ||||
o Implementations may use other representations for Transport | * Implementations may use other representations for Transport | |||
Property Names, e.g., by providing constants, but should provide a | Property Names, e.g., by providing constants, but should provide a | |||
straight-forward mapping between their representation and the | straight-forward mapping between their representation and the | |||
property names specified here. | property names specified here. | |||
5. Pre-Establishment Phase | 5. Pre-Establishment Phase | |||
The Pre-Establishment phase allows applications to specify properties | The Pre-Establishment phase allows applications to specify properties | |||
for the Connections they are about to make, or to query the API about | for the Connections they are about to make, or to query the API about | |||
potential Connections they could make. | potential Connections they could make. | |||
A Preconnection Object represents a potential Connection. It has | A Preconnection Object represents a potential Connection. It has | |||
state that describes properties of a Connection that might exist in | state that describes properties of a Connection that might exist in | |||
the future. This state comprises Local Endpoint and Remote Endpoint | the future. This state comprises Local Endpoint and Remote Endpoint | |||
Objects that denote the endpoints of the potential Connection (see | Objects that denote the endpoints of the potential Connection (see | |||
Section 5.1), the Selection Properties (see Section 5.2), any | Section 5.1), the Selection Properties (see Section 5.2), any | |||
preconfigured Connection Properties (Section 11.1), and the security | preconfigured Connection Properties (Section 10.1), and the security | |||
parameters (see Section 5.3): | parameters (see Section 5.3): | |||
Preconnection := NewPreconnection(LocalEndpoint, | Preconnection := NewPreconnection(LocalEndpoint?, | |||
RemoteEndpoint, | RemoteEndpoint?, | |||
TransportProperties, | TransportProperties, | |||
SecurityParams) | SecurityParams) | |||
The Local Endpoint MUST be specified if the Preconnection is used to | The Local Endpoint MUST be specified if the Preconnection is used to | |||
Listen() for incoming Connections, but is OPTIONAL if it is used to | Listen() for incoming Connections, but is OPTIONAL if it is used to | |||
Initiate() connections. The Remote Endpoint MUST be specified if the | Initiate() connections. The Remote Endpoint MUST be specified if the | |||
Preconnection is used to Initiate() Connections, but is OPTIONAL if | Preconnection is used to Initiate() Connections, but is OPTIONAL if | |||
it is used to Listen() for incoming Connections. The Local Endpoint | it is used to Listen() for incoming Connections. The Local Endpoint | |||
and the Remote Endpoint MUST both be specified if a peer-to-peer | and the Remote Endpoint MUST both be specified if a peer-to-peer | |||
Rendezvous is to occur based on the Preconnection. | Rendezvous is to occur based on the Preconnection. | |||
Message Framers (see Section 10), if required, should be added to the | Message Framers (see Section 9), if required, should be added to the | |||
Preconnection during pre-establishment. | Preconnection during pre-establishment. | |||
5.1. Specifying Endpoints | 5.1. Specifying Endpoints | |||
The transport services API uses the Local Endpoint and Remote | The transport services API uses the Local Endpoint and Remote | |||
Endpoint types to refer to the endpoints of a transport connection. | Endpoint Objects to refer to the endpoints of a transport connection. | |||
Subtypes of these represent various different types of endpoint | Actions on these Objects can be used to represent various different | |||
identifiers, such as IP addresses, DNS names, and interface names, as | types of endpoint identifiers, such as IP addresses, DNS names, and | |||
well as port numbers and service names. | interface names, as well as port numbers and service names. | |||
Specify a Remote Endpoint using a hostname and service name: | ||||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostname("example.com") | RemoteSpecifier.WithHostname("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
Specify a Remote Endpoint using an IPv6 address and remote port: | ||||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithIPv6Address(2001:db8:4920:e29d:a420:7461:7073:0a) | RemoteSpecifier.WithIPv6Address(2001:db8:4920:e29d:a420:7461:7073:0a) | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
Specify a Remote Endpoint using an IPv4 address and remote port: | ||||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithIPv4Address(192.0.2.21) | RemoteSpecifier.WithIPv4Address(192.0.2.21) | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
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 | ||||
Endpoint, an application can express more fine-grained preferences | ||||
using the "Interface Instance or Type" Selection Property, see | ||||
Section 5.2.10. However, if the application specifies Selection | ||||
Properties which are inconsistent with the Local Endpoint, this will | ||||
result in an error once the application attempts to open a | ||||
Connection. | ||||
Specify a Local Endpoint using a STUN server: | ||||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithStunServer(address, port, credentials) | LocalSpecifier.WithStunServer(address, port, credentials) | |||
Specify a Local Endpoint using a Any-Source Multicast group to join | ||||
on a named local interface: | ||||
LocalSpecifier := NewLocalEndpoint() | ||||
LocalSpecifier.WithIPv4Address(233.252.0.0) | ||||
LocalSpecifier.WithInterface("en0") | ||||
Source-Specific Multicast requires setting both a Local and Remote | ||||
Endpoint: | ||||
LocalSpecifier := NewLocalEndpoint() | ||||
LocalSpecifier.WithIPv4Address(232.1.1.1) | ||||
LocalSpecifier.WithInterface("en0") | ||||
RemoteSpecifier := NewRemoteEndpoint() | ||||
RemoteSpecifier.WithIPv4Address(192.0.2.22) | ||||
Implementations may also support additional endpoint representations | Implementations may also support additional endpoint representations | |||
and provide a single NewEndpoint() call that takes different endpoint | and provide a single NewEndpoint() call that takes different endpoint | |||
representations. | representations. | |||
Multiple endpoint identifiers can be specified for each Local | Multiple endpoint identifiers can be specified for each Local | |||
Endpoint and Remote Endpoint. For example, a Local Endpoint could be | Endpoint and Remote Endpoint. For example, a Local Endpoint could be | |||
configured with two interface names, or a Remote Endpoint could be | configured with two interface names, or a Remote Endpoint could be | |||
specified via both IPv4 and IPv6 addresses. These multiple | specified via both IPv4 and IPv6 addresses. These multiple | |||
identifiers refer to the same transport endpoint. | identifiers refer to the same transport endpoint. | |||
The transport services API resolves names internally, when the | The transport services API resolves names internally, when the | |||
Initiate(), Listen(), or Rendezvous() method is called establish a | Initiate(), Listen(), or Rendezvous() method is called to establish a | |||
Connection. The API explicitly does not require the application to | Connection. The API explicitly does not require the application to | |||
resolve names, though there is a tradeoff between early and late | resolve names, though there is a tradeoff between early and late | |||
binding of addresses to names. Early binding allows the API | binding of addresses to names. Early binding allows the API | |||
implementation to reduce connection setup latency, at the cost of | implementation to reduce connection setup latency, at the cost of | |||
potentially limited scope for alternate path discovery during | potentially limited scope for alternate path discovery during | |||
Connection establishment, as well as potential additional information | Connection establishment, as well as potential additional information | |||
leakage about application interest when used with a resolution method | leakage about application interest when used with a resolution method | |||
(such as DNS without TLS) which does not protect query | (such as DNS without TLS) which does not protect query | |||
confidentiality. | confidentiality. | |||
The Resolve() action on Preconnection can be used by the application | The Resolve() action on 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 6.3). | Address Translator (NAT) traversal protocols (see Section 6.3). | |||
Specifying a multicast group address on the Local Endpoint will | ||||
indicate to the transport system that the resulting connection will | ||||
be used to receive multicast messages. The Remote Endpoint can be | ||||
used to filter by specific senders. This will restrict the | ||||
application to establishing the Preconnection by calling Listen(). | ||||
The accepted Connections are receive-only. | ||||
Similarly, specifying a multicast group address on the Remote | ||||
Endpoint will indicate that the resulting connection will be used to | ||||
send multicast messages. | ||||
5.2. Specifying Transport Properties | 5.2. Specifying Transport Properties | |||
A Preconnection Object holds properties reflecting the application's | A Preconnection Object holds properties reflecting the application's | |||
requirements and preferences for the transport. These include | requirements and preferences for the transport. These include | |||
Selection Properties for selecting protocol stacks and paths, as well | Selection Properties for selecting protocol stacks and paths, as well | |||
as Connection Properties for configuration of the detailed operation | as Connection Properties for configuration of the detailed operation | |||
of the selected Protocol Stacks. | of the selected Protocol Stacks. | |||
The protocol(s) and path(s) selected as candidates during | The protocol(s) and path(s) selected as candidates during | |||
establishment are determined and configured using these properties. | establishment are determined and configured using these properties. | |||
Since there could be paths over which some transport protocols are | Since there could be paths over which some transport protocols are | |||
unable to operate, or remote endpoints that support only specific | unable to operate, or remote endpoints that support only specific | |||
network addresses or transports, transport protocol selection is | network addresses or transports, transport protocol selection is | |||
necessarily tied to path selection. This may involve choosing | necessarily tied to path selection. This may involve choosing | |||
between multiple local interfaces that are connected to different | between multiple local interfaces that are connected to different | |||
access networks. | access networks. | |||
Most Selection Properties are represented as preferences, which can | Most Selection Properties are represented as preferences, which can | |||
have one of five preference levels: | have one of five preference levels: | |||
+------------+------------------------------------------------------+ | +------------+----------------------------------------+ | |||
| Preference | Effect | | | Preference | Effect | | |||
+------------+------------------------------------------------------+ | +============+========================================+ | |||
| Require | Select only protocols/paths providing the property, | | | Require | Select only protocols/paths providing | | |||
| | fail otherwise | | | | the property, fail otherwise | | |||
| | | | +------------+----------------------------------------+ | |||
| Prefer | Prefer protocols/paths providing the property, | | | Prefer | Prefer protocols/paths providing the | | |||
| | proceed otherwise | | | | property, proceed otherwise | | |||
| | | | +------------+----------------------------------------+ | |||
| Ignore | No preference | | | Ignore | No preference | | |||
| | | | +------------+----------------------------------------+ | |||
| Avoid | Prefer protocols/paths not providing the property, | | | Avoid | Prefer protocols/paths not providing | | |||
| | proceed otherwise | | | | the property, proceed otherwise | | |||
| | | | +------------+----------------------------------------+ | |||
| Prohibit | Select only protocols/paths not providing the | | | Prohibit | Select only protocols/paths not | | |||
| | property, fail otherwise | | | | providing the property, fail otherwise | | |||
+------------+------------------------------------------------------+ | +------------+----------------------------------------+ | |||
Table 1 | ||||
In addition, the pseudo-level "Default" can be used to reset the | In addition, the pseudo-level "Default" can be used to reset the | |||
property to the default level used by the implementation. This level | property to the default level used by the implementation. This level | |||
will never show up when queuing the value of a preference - the | will never show up when queuing the value of a preference - the | |||
effective preference must be returned instead. | effective preference must be returned instead. | |||
Internally, the transport system will first exclude all protocols and | The implementation MUST ensure an outcome that is consistent with | |||
paths that match a Prohibit, then exclude all protocols and paths | application requirements as expressed using Require and Prohibit. | |||
that do not match a Require, then sort candidates according to | While preferences expressed using Prefer and Avoid influence protocol | |||
Preferred properties, and then use Avoided properties as a | and path selection as well, outcomes may vary given the same | |||
tiebreaker. Selection Properties that select paths take preference | Selection Properties, as the available protocols and paths may vary | |||
over those that select protocols. For example, if an application | across systems and contexts. However, implementations are | |||
indicates a preference for a specific path by specifying an | RECOMMENDED to aim to provide a consistent outcome to an application, | |||
interface, but also a preference for a protocol not available on this | given the same Selection Properties. | |||
path, the transport system will try the path first, ignoring the | ||||
preference. | ||||
Selection, and Connection Properties, as well as defaults for Message | Note that application preferences may conflict with each other. For | |||
example, if an application indicates a preference for a specific path | ||||
by specifying an interface, but also a preference for a protocol, a | ||||
situation might occur in which the preferred protocol is not | ||||
available on the preferred path. In such cases, implementations | ||||
SHOULD prioritize Selection Properties that select paths over those | ||||
that select protocols. Therefore, the transport system SHOULD race | ||||
the path first, ignoring the protocol preference if the protocol does | ||||
not work on the path. | ||||
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 added to the TransportProperties | Individual properties are then added to the TransportProperties | |||
Object: | Object: | |||
TransportProperties.Add(property, value) | TransportProperties.Add(property, value) | |||
As preference typed selection properties may be used quite | Selection Properties of type "Preference" can be frequently used. | |||
frequently, implementations should provide additional convenience | Implementations MAY therefore provide additional convenience | |||
functions as outlined in Appendix A.1. In addition, implementations | functions, see Appendix A.1 for examples. In addition, | |||
should provide a mechanism to create TransportProperties objects that | implementations MAY provide a mechanism to create TransportProperties | |||
are preconfigured for common use cases as outlined in Appendix A.2. | objects that are preconfigured for common use cases as outlined in | |||
Appendix A.2. | ||||
For an existing Connection, the Transport Properties can be queried | For an existing Connection, the Transport Properties can be queried | |||
any time by using the following call on the Connection Object: | any time by using the following call on the Connection Object: | |||
TransportProperties := Connection.GetTransportProperties() | TransportProperties := Connection.GetTransportProperties() | |||
A Connection gets its Transport Properties either by being explicitly | A Connection gets its Transport Properties either by being explicitly | |||
configured via a Preconnection, by configuration after establishment, | configured via a Preconnection, by configuration after establishment, | |||
or by inheriting them from an antecedent via cloning; see Section 6.4 | or by inheriting them from an antecedent via cloning; see Section 6.4 | |||
for more. | for more. | |||
Section 11.1 provides a list of Connection Properties, while | Section 10.1 provides a list of Connection Properties, while | |||
Selection Properties are listed in the subsections below. Note that | Selection Properties are listed in the subsections below. Note that | |||
many properties are only considered during establishment, and can not | many properties are only considered during establishment, and can not | |||
be changed after a Connection is established; however, they can be | be changed after a Connection is established; however, they can be | |||
queried. Querying a Selection Property after establishment yields | queried. Querying a Selection Property after establishment yields | |||
the value Required for properties of the selected protocol and path, | the value "Require" for properties of the selected protocol and path, | |||
Avoid for properties avoided during selection, and Ignore for all | Avoid for properties avoided during selection, and Ignore for all | |||
other properties. | other properties. | |||
An implementation of this interface must provide sensible defaults | An implementation of this interface must provide sensible defaults | |||
for Selection Properties. The defaults given for each property below | for Selection Properties. The defaults given for each property below | |||
represent a configuration that can be implemented over TCP. An | represent a configuration that can be implemented over TCP. An | |||
alternate set of default Protocol Selection Properties would | alternate set of default Protocol Selection Properties would | |||
represent a configuration that can be implemented over UDP. | represent a configuration that can be implemented over UDP. | |||
5.2.1. Reliable Data Transfer (Connection) | 5.2.1. Reliable Data Transfer (Connection) | |||
Name: reliability | Name: reliability | |||
Type: Preference | ||||
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 on the | transport protocol that ensures that all data is received on the | |||
other side without corruption. This also entails being notified when | other side without corruption. This also entails being notified when | |||
a Connection is closed or aborted. The default is to Require | a Connection is closed or aborted. | |||
Reliable Data Transfer. | ||||
5.2.2. Preservation of Message Boundaries | 5.2.2. Preservation of Message Boundaries | |||
Name: preserve-msg-boundaries | Name: preserve-msg-boundaries | |||
Type: Preference | ||||
Default: Prefer | ||||
This property specifies whether the application needs or prefers to | This property specifies whether the application needs or prefers to | |||
use a transport protocol that preserves message boundaries. The | use a transport protocol that preserves message boundaries. | |||
default is to Prefer Preservation of Message Boundaries. | ||||
5.2.3. Configure Per-Message Reliability | 5.2.3. Configure Per-Message Reliability | |||
Name: per-msg-reliability | Name: per-msg-reliability | |||
Type: Preference | ||||
Default: Ignore | ||||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
indicate its reliability requirements on a per-Message basis. This | indicate its reliability requirements on a per-Message basis. This | |||
property applies to Connections and Connection Groups. The default | property applies to Connections and Connection Groups. | |||
is to Ignore this option. | ||||
5.2.4. Preservation of Data Ordering | 5.2.4. Preservation of Data Ordering | |||
Name: preserve-order | Name: preserve-order | |||
Type: Preference | ||||
Default: Require | ||||
This property specifies whether the application wishes to use a | This property specifies whether the application wishes to use a | |||
transport protocol that can ensure that data is received by the | transport protocol that can ensure that data is received by the | |||
application on the other end in the same order as it was sent. The | application on the other end in the same order as it was sent. | |||
default is to Require Preservation of data ordering. | ||||
5.2.5. Use 0-RTT Session Establishment with an Idempotent Message | 5.2.5. Use 0-RTT Session Establishment with an Idempotent Message | |||
Name: zero-rtt-msg | Name: zero-rtt-msg | |||
Type: Preference | ||||
Default: Ignore | ||||
This property specifies whether an application would like to supply a | This property specifies whether an application would like to supply a | |||
Message to the transport protocol before Connection establishment, | Message to the transport protocol before Connection establishment, | |||
which will then be reliably transferred to the other side before or | which will then be reliably transferred to the other side before or | |||
during Connection establishment, potentially multiple times (i.e., | during Connection establishment, potentially multiple times (i.e., | |||
multiple copies of the message data may be passed to the Remote | multiple copies of the message data may be passed to the Remote | |||
Endpoint). See also Section 7.4.4. The default is to Ignore this | Endpoint). See also Section 7.5.4. Note that disabling this | |||
option. Note that disabling this property has no effect for | property has no effect for protocols that are not connection-oriented | |||
protocols that are not connection-oriented and do not protect against | and do not protect against duplicated messages, e.g., UDP. | |||
duplicated messages, e.g., UDP. | ||||
5.2.6. Multistream Connections in Group | 5.2.6. Multistream Connections in Group | |||
Name: multistreaming | Name: multistreaming | |||
Type: Preference | ||||
Default: Prefer | ||||
This property specifies that the application would prefer multiple | This property specifies that the application would prefer multiple | |||
Connections within a Connection Group to be provided by streams of a | Connections within a Connection Group to be provided by streams of a | |||
single underlying transport connection where possible. The default | single underlying transport connection where possible. | |||
is to Prefer this option. | ||||
5.2.7. Full Checksum Coverage on Sending | 5.2.7. Full Checksum Coverage on Sending | |||
Name: per-msg-checksum-len-send | Name: per-msg-checksum-len-send | |||
Type: Preference | ||||
Default: Require | ||||
This property specifies whether the application desires protection | This property specifies whether the application desires protection | |||
against corruption for all data transmitted on this Connection. | against corruption for all data transmitted on this Connection. | |||
Disabling this property may enable to control checksum coverage later | Disabling this property may enable to control checksum coverage later | |||
(see Section 7.4.6). The default is to Require this option. | (see Section 7.5.6). | |||
5.2.8. Full Checksum Coverage on Receiving | 5.2.8. Full Checksum Coverage on Receiving | |||
Name: per-msg-checksum-len-recv | Name: per-msg-checksum-len-recv | |||
Type: Preference | ||||
Default: Require | ||||
This property specifies whether the application desires protection | This property specifies whether the application desires protection | |||
against corruption for all data received on this Connection. The | against corruption for all data received on this Connection. | |||
default is to Require this option. | ||||
5.2.9. Congestion control | 5.2.9. Congestion control | |||
Name: congestion-control | Name: congestion-control | |||
Type: Preference | ||||
Default: Require | ||||
This property specifies whether the application would like the | This property specifies whether the application would like the | |||
Connection to be congestion controlled or not. Note that if a | Connection to be congestion controlled or not. Note that if a | |||
Connection is not congestion controlled, an application using such a | Connection is not congestion controlled, an application using such a | |||
Connection should itself perform congestion control in accordance | Connection should itself perform congestion control in accordance | |||
with [RFC2914]. Also note that reliability is usually combined with | with [RFC2914]. Also note that reliability is usually combined with | |||
congestion control in protocol implementations, rendering "reliable | congestion control in protocol implementations, rendering "reliable | |||
but not congestion controlled" a request that is unlikely to succeed. | but not congestion controlled" a request that is unlikely to succeed. | |||
The recommended default is to Require that the Connection is | ||||
congestion controlled. | ||||
5.2.10. Interface Instance or Type | 5.2.10. Interface Instance or Type | |||
Name: interface | Name: interface | |||
Type: Set (Preference, Enumeration) | Type: Set (Preference, Enumeration) | |||
Default: Empty set (not setting a preference for any interface) | ||||
This property allows the application to select which specific network | This property allows the application to select which specific network | |||
interfaces or categories of interfaces it wants to "Require", | interfaces or categories of interfaces it wants to "Require", | |||
"Prohibit", "Prefer", or "Avoid". Note that marking a specific | "Prohibit", "Prefer", or "Avoid". Note that marking a specific | |||
interface as "Required" strictly limits path selection to a single | interface as "Require" strictly limits path selection to a single | |||
interface, and may often lead to less flexible and resilient | interface, and may often lead to less flexible and resilient | |||
connection establishment. | connection establishment. | |||
In contrast to other Selection Properties, this property is a tuple | In contrast to other Selection Properties, this property is a tuple | |||
of an (Enumerated) interface identifier and a preference, and can | of an (Enumerated) interface identifier and a preference, and can | |||
either be implemented directly as such, or for making one preference | either be implemented directly as such, or for making one preference | |||
available for each interface and interface type available on the | available for each interface and interface type available on the | |||
system. | system. | |||
The set of valid interface types is implementation- and system- | The set of valid interface types is implementation- and system- | |||
specific. For example, on a mobile device, there may be "Wi-Fi" and | specific. For example, on a mobile device, there may be "Wi-Fi" and | |||
"Cellular" interface types available; whereas on a desktop computer, | "Cellular" interface types available; whereas on a desktop computer, | |||
there may be "Wi-Fi" and "Wired Ethernet" interface types available. | there may be "Wi-Fi" and "Wired Ethernet" interface types available. | |||
An implementation should provide all types that are supported on the | An implementation should provide all types that are supported on the | |||
local system to all remote systems, to allow applications to be | local system to all remote systems, to allow applications to be | |||
written generically. For example, if a single implementation is used | written generically. For example, if a single implementation is used | |||
on both mobile devices and desktop devices, it should define the | on both mobile devices and desktop devices, it should define the | |||
"Cellular" interface type for both systems, since an application may | "Cellular" interface type for both systems, since an application may | |||
want to always "Prohibit Cellular". Note that marking a specific | want to always "Prohibit Cellular". Note that marking a specific | |||
interface type as "Required" limits path selection to a small set of | interface type as "Require" limits path selection to a small set of | |||
interfaces, and leads to less flexible and resilient connection | interfaces, and leads to less flexible and resilient connection | |||
establishment. | establishment. | |||
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. | access technologies become available. | |||
Interface types should not be treated as a proxy for properties of | Interface types should not be treated as a proxy for properties of | |||
interfaces such as metered or unmetered network access. If an | interfaces such as metered or unmetered network access. If an | |||
application needs to prohibit metered interfaces, this should be | application needs to prohibit metered interfaces, this should be | |||
specified via Provisioning Domain attributes (see Section 5.2.11) or | specified via Provisioning Domain attributes (see Section 5.2.11) or | |||
another specific property. | another specific property. | |||
5.2.11. Provisioning Domain Instance or Type | 5.2.11. Provisioning Domain Instance or Type | |||
Name: pvd | Name: pvd | |||
Type: Set (Preference, Enumeration) | Type: Set (Preference, Enumeration) | |||
Default: Empty set (not setting a preference for any PvD) | ||||
Similar to interface instances and types (see Section 5.2.10), this | Similar to interface instances and types (see Section 5.2.10), this | |||
property allows the application to control path selection by | property allows the application to control path selection by | |||
selecting which specific Provisioning Domains or categories of | selecting which specific Provisioning Domains or categories of | |||
Provisioning Domains it wants to "Require", "Prohibit", "Prefer", or | Provisioning Domains it wants to "Require", "Prohibit", "Prefer", or | |||
"Avoid". Provisioning Domains define consistent sets of network | "Avoid". Provisioning Domains define consistent sets of network | |||
properties that may be more specific than network interfaces | properties that may be more specific than network interfaces | |||
[RFC7556]. | [RFC7556]. | |||
As with interface instances and types, this property is a tuple of an | As with interface instances and types, this property is a tuple of an | |||
(Enumerated) PvD identifier and a preference, and can either be | (Enumerated) PvD identifier and a preference, and can either be | |||
skipping to change at page 21, line 41 ¶ | skipping to change at page 24, line 7 ¶ | |||
Categories or types of PvDs are also defined to be implementation- | Categories or types of PvDs are also defined to be implementation- | |||
and system-specific. These may be useful to identify a service that | and system-specific. These may be useful to identify a service that | |||
is provided by a PvD. For example, if an application wants to use a | is provided by a PvD. For example, if an application wants to use a | |||
PvD that provides a Voice-Over-IP service on a Cellular network, it | PvD that provides a Voice-Over-IP service on a Cellular network, it | |||
can use the relevant PvD type to require some PvD that provides this | can use the relevant PvD type to require some PvD that provides this | |||
service, without needing to look up a particular instance. While | service, without needing to look up a particular instance. While | |||
this does restrict path selection, it is broader than requiring | this does restrict path selection, it is broader than requiring | |||
specific PvD instances or interface instances, and should be | specific PvD instances or interface instances, and should be | |||
preferred over these options. | preferred over these options. | |||
5.2.12. Parallel Use of Multiple Paths | 5.2.12. Use Temporary Local Address | |||
Name: use-temporary-local-address | ||||
Type: Preference | ||||
Default: Avoid for Listeners and Rendezvous Connections. Prefer for | ||||
other Connections. | ||||
This property allows the application to express a preference for the | ||||
use of temporary local addresses, sometimes called "privacy" | ||||
addresses [RFC4941]. Temporary addresses are generally used to | ||||
prevent linking connections over time when a stable address, | ||||
sometimes called "permanent" address, is not needed. Note that if an | ||||
application Requires the use of temporary addresses, the resulting | ||||
Connection cannot use IPv4, as temporary addresses do not exist in | ||||
IPv4. | ||||
5.2.13. Parallel Use of Multiple Paths | ||||
Name: multipath | Name: multipath | |||
This property specifies whether an application considers it useful to | Type: Enumeration | |||
transfer data across multiple paths between the same end hosts. | ||||
Generally, in most cases, this will improve performance (e.g., | ||||
achieve greater throughput). One possible side-effect is increased | ||||
jitter, which may be problematic for delay-sensitive applications. | ||||
The recommended default is to Ignore this option. | ||||
5.2.13. Direction of communication | Default: Disabled | |||
This property specifies whether an application wants to take | ||||
advantage of transferring data across multiple paths between the same | ||||
end hosts. Using multiple paths allows connections to migrate | ||||
between interfaces as availability and performance properties change. | ||||
Possible values are: | ||||
Disabled: The connection will not attempt using multiple paths once | ||||
established | ||||
Handover: The connection should attempt to migrate between different | ||||
paths upon interface availability changes | ||||
Interactive: The connection should attempt to use multiple paths in | ||||
response to loss or delay upon individual paths | ||||
Aggregate: The connection should attempt to use multiple paths in | ||||
parallel in order to maximize bandwidth | ||||
Enumeration values other than "Disabled" are interpreted as | ||||
preferences. | ||||
5.2.14. Direction of communication | ||||
Name: direction | Name: direction | |||
Type: Enumeration | Type: Enumeration | |||
Default: Bidirectional | ||||
This property specifies whether an application wants to use the | This property specifies whether an application wants to use the | |||
connection for sending and/or receiving data. Possible values are: | connection for sending and/or receiving data. Possible values are: | |||
Bidirectional: The connection must support sending and receiving | Bidirectional: The connection must support sending and receiving | |||
data | data | |||
Unidirectional send: The connection must support sending data, and | Unidirectional send: The connection must support sending data, and | |||
the application cannot use the connection to receive any data | the application cannot use the connection to receive any data | |||
Unidirectional receive: The connection must support receiving data, | Unidirectional receive: The connection must support receiving data, | |||
and the application cannot use the connection to send any data | and the application cannot use the connection to send any data | |||
The default is bidirectional. Since unidirectional communication can | Since unidirectional communication can be supported by transports | |||
be supported by transports offering bidirectional communication, | offering bidirectional communication, specifying unidirectional | |||
specifying unidirectional communication may cause a transport stack | communication may cause a transport stack that supports bidirectional | |||
that supports bidirectional communication to be selected. | communication to be selected. | |||
5.2.14. Notification of excessive retransmissions | 5.2.15. Notification of excessive retransmissions | |||
Name: :retransmit-notify | Name: retransmit-notify | |||
Type: Preference | ||||
Default: Ignore | ||||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
be informed in case sent data was retransmitted more often than a | be informed in case sent data was retransmitted more often than a | |||
certain threshold. The default is to Ignore this option. | certain threshold (see Section 10.1.1 for configuration of this | |||
threshold). | ||||
5.2.15. Notification of ICMP soft error message arrival | 5.2.16. Notification of ICMP soft error message arrival | |||
Name: :soft-error-notify | Name: soft-error-notify | |||
Type: Preference | ||||
Default: Ignore | ||||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
be informed when an ICMP error message arrives that does not force | be informed when an ICMP error message arrives that does not force | |||
termination of a connection. When set to true, received ICMP errors | termination of a connection. When set to true, received ICMP errors | |||
will be available as SoftErrors. Note that even if a protocol | will be available as SoftErrors, see Section 10.3.1. Note that even | |||
supporting this property is selected, not all ICMP errors will | if a protocol supporting this property is selected, not all ICMP | |||
necessarily be delivered, so applications cannot rely on receiving | errors will necessarily be delivered, so applications cannot rely on | |||
them. The default is to Ignore this option. | receiving them. | |||
5.3. Specifying Security Parameters and Callbacks | 5.3. Specifying Security Parameters and Callbacks | |||
Most security parameters, e.g., TLS ciphersuites, local identity and | Most security parameters, e.g., TLS ciphersuites, local identity and | |||
private key, etc., may be configured statically. Others are | private key, etc., may be configured statically. Others are | |||
dynamically configured during connection establishment. Thus, we | dynamically configured during connection establishment. Thus, we | |||
partition security parameters and callbacks based on their place in | partition security parameters and callbacks based on their place in | |||
the lifetime of connection establishment. Similar to Transport | the lifetime of connection establishment. Similar to Transport | |||
Properties, both parameters and callbacks are inherited during | Properties, both parameters and callbacks are inherited during | |||
cloning (see Section 6.4). | cloning (see Section 6.4). | |||
skipping to change at page 23, line 23 ¶ | skipping to change at page 26, line 36 ¶ | |||
values whenever possible. However, as discussed in | values whenever possible. However, as discussed in | |||
[I-D.ietf-taps-transport-security], many transport security protocols | [I-D.ietf-taps-transport-security], many transport security protocols | |||
require specific security parameters and constraints from the client | require specific security parameters and constraints from the client | |||
at the time of configuration and actively during a handshake. These | at the time of configuration and actively during a handshake. These | |||
configuration parameters are created as follows: | configuration parameters are created as follows: | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
Security configuration parameters and sample usage follow: | Security configuration parameters and sample usage follow: | |||
o Local identity and private keys: Used to perform private key | * Local identity and private keys: Used to perform private key | |||
operations and prove one's identity to the Remote Endpoint. | operations and prove one's identity to the Remote Endpoint. | |||
(Note, if private keys are not available, e.g., since they are | (Note, if private keys are not available, e.g., since they are | |||
stored in hardware security modules (HSMs), handshake callbacks | stored in hardware security modules (HSMs), handshake callbacks | |||
must be used. See below for details.) | must be used. See below for details.) | |||
SecurityParameters.AddIdentity(identity) | SecurityParameters.AddIdentity(identity) | |||
SecurityParameters.AddPrivateKey(privateKey, publicKey) | SecurityParameters.AddPrivateKey(privateKey, publicKey) | |||
o Supported algorithms: Used to restrict what parameters are used by | * Supported algorithms: Used to restrict what parameters are used by | |||
underlying transport security protocols. When not specified, | underlying transport security protocols. When not specified, | |||
these algorithms should use known and safe defaults for the | these algorithms should use known and safe defaults for the | |||
system. Parameters include: ciphersuites, supported groups, and | system. Parameters include: ciphersuites, supported groups, and | |||
signature algorithms. | signature algorithms. | |||
SecurityParameters.AddSupportedGroup(secp256k1) | SecurityParameters.AddSupportedGroup(secp256k1) | |||
SecurityParameters.AddCiphersuite(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256) | SecurityParameters.AddCiphersuite(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256) | |||
SecurityParameters.AddSignatureAlgorithm(ed25519) | SecurityParameters.AddSignatureAlgorithm(ed25519) | |||
o Session cache management: Used to tune cache capacity, lifetime, | * Session cache management: Used to tune cache capacity, lifetime, | |||
re-use, and eviction policies, e.g., LRU or FIFO. Constants and | re-use, and eviction policies, e.g., LRU or FIFO. Constants and | |||
policies for these interfaces are implementation-specific. | policies for these interfaces are implementation-specific. | |||
SecurityParameters.SetSessionCacheCapacity(MAX_CACHE_ELEMENTS) | SecurityParameters.SetSessionCacheCapacity(MAX_CACHE_ELEMENTS) | |||
SecurityParameters.SetSessionCacheLifetime(SECONDS_PER_DAY) | SecurityParameters.SetSessionCacheLifetime(SECONDS_PER_DAY) | |||
SecurityParameters.SetSessionCachePolicy(CachePolicyOneTimeUse) | SecurityParameters.SetSessionCachePolicy(CachePolicyOneTimeUse) | |||
o Pre-Shared Key import: Used to install pre-shared keying material | * Pre-Shared Key import: Used to install pre-shared keying material | |||
established out-of-band. Each pre-shared keying material is | established out-of-band. Each pre-shared keying material is | |||
associated with some identity that typically identifies its use or | associated with some identity that typically identifies its use or | |||
has some protocol-specific meaning to the Remote Endpoint. | has some protocol-specific meaning to the Remote Endpoint. | |||
SecurityParameters.AddPreSharedKey(key, identity) | SecurityParameters.AddPreSharedKey(key, identity) | |||
5.3.2. Connection Establishment Callbacks | 5.3.2. Connection Establishment Callbacks | |||
Security decisions, especially pertaining to trust, are not static. | Security decisions, especially pertaining to trust, are not static. | |||
Once configured, parameters may also be supplied during connection | Once configured, parameters may also be supplied during connection | |||
establishment. These are best handled as client-provided callbacks. | establishment. These are best handled as client-provided callbacks. | |||
Security handshake callbacks that may be invoked during connection | Security handshake callbacks that may be invoked during connection | |||
establishment include: | establishment include: | |||
o Trust verification callback: Invoked when a Remote Endpoint's | * Trust verification callback: Invoked when a Remote Endpoint's | |||
trust must be validated before the handshake protocol can proceed. | trust must be validated before the handshake protocol can proceed. | |||
TrustCallback := NewCallback({ | TrustCallback := NewCallback({ | |||
// Handle trust, return the result | // Handle trust, return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(trustCallback) | SecurityParameters.SetTrustVerificationCallback(trustCallback) | |||
o 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. | remote. | |||
ChallengeCallback := NewCallback({ | ChallengeCallback := NewCallback({ | |||
// Handle challenge | // Handle challenge | |||
}) | }) | |||
SecurityParameters.SetIdentityChallengeCallback(challengeCallback) | SecurityParameters.SetIdentityChallengeCallback(challengeCallback) | |||
6. Establishing Connections | 6. Establishing Connections | |||
skipping to change at page 25, line 14 ¶ | skipping to change at page 28, line 33 ¶ | |||
Connection := Preconnection.Initiate(timeout?) | Connection := Preconnection.Initiate(timeout?) | |||
The timeout parameter specifies how long to wait before aborting | The timeout parameter specifies how long to wait before aborting | |||
Active open. Before calling Initiate, the caller must have populated | Active open. Before calling Initiate, the caller must have populated | |||
a Preconnection Object with a Remote Endpoint specifier, optionally a | a Preconnection Object with a Remote Endpoint specifier, optionally a | |||
Local Endpoint specifier (if not specified, the system will attempt | Local Endpoint specifier (if not specified, the system will attempt | |||
to determine a suitable Local Endpoint), as well as all properties | to determine a suitable Local Endpoint), as well as all properties | |||
necessary for candidate selection. | necessary for candidate selection. | |||
The Initiate() Action consumes the Preconnection. Once Initiate() | The Initiate() Action returns a Connection object. Once Initiate() | |||
has been called, no further properties may be added to the | has been called, any changes to the Preconnection MUST NOT have any | |||
Preconnection, and no subsequent establishment call may be made on | effect on the Connection. However, the Preconnection can be reused, | |||
the Preconnection. | e.g., to Initiate another Connection. | |||
Once Initiate is called, the candidate Protocol Stack(s) may cause | Once Initiate is called, the candidate Protocol Stack(s) may cause | |||
one or more candidate transport-layer connections to be created to | one or more candidate transport-layer connections to be created to | |||
the specified remote endpoint. The caller may immediately begin | the specified remote endpoint. The caller may immediately begin | |||
sending Messages on the Connection (see Section 7) after calling | sending Messages on the Connection (see Section 7) after calling | |||
Initate(); note that any idempotent data sent while the Connection is | Initate(); note that any idempotent data sent while the Connection is | |||
being established may be sent multiple times or on multiple | being established may be sent multiple times or on multiple | |||
candidates. | candidates. | |||
The following Events may be sent by the Connection after Initiate() | The following Events may be sent by the Connection after Initiate() | |||
skipping to change at page 25, line 51 ¶ | skipping to change at page 29, line 21 ¶ | |||
and security parameters cannot be fulfilled on a Connection for | and security parameters cannot be fulfilled on a Connection for | |||
initiation (e.g. the set of available Paths and/or Protocol Stacks | initiation (e.g. the set of available Paths and/or Protocol Stacks | |||
meeting the constraints is empty) or reconciled with the local and/or | meeting the constraints is empty) or reconciled with the local and/or | |||
remote Endpoints; when the remote specifier cannot be resolved; or | remote Endpoints; when the remote specifier cannot be resolved; or | |||
when no transport-layer connection can be established to the remote | when no transport-layer connection can be established to the remote | |||
Endpoint (e.g. because the remote Endpoint is not accepting | Endpoint (e.g. because the remote Endpoint is not accepting | |||
connections, the application is prohibited from opening a Connection | connections, the application is prohibited from opening a Connection | |||
by the operating system, or the establishment attempt has timed out | by the operating system, or the establishment attempt has timed out | |||
for any other reason). | for any other reason). | |||
See also Section 7.7 to combine Connection establishment and | See also Section 7.8 to combine Connection establishment and | |||
transmission of the first message in a single action. | transmission of the first message in a single action. | |||
6.2. Passive Open: Listen | 6.2. Passive Open: Listen | |||
Passive open is the Action of waiting for Connections from remote | Passive open is the Action of waiting for Connections from remote | |||
Endpoints, commonly used by servers in client-server interactions. | Endpoints, commonly used by servers in client-server interactions. | |||
Passive open is supported by this interface through the Listen Action | Passive open is supported by this interface through the Listen Action | |||
and returns a Listener object: | and returns a Listener object: | |||
Listener := Preconnection.Listen() | Listener := Preconnection.Listen() | |||
Before calling Listen, the caller must have initialized the | Before calling Listen, the caller must have initialized the | |||
Preconnection during the pre-establishment phase with a Local | Preconnection during the pre-establishment phase with a Local | |||
Endpoint specifier, as well as all properties necessary for Protocol | Endpoint specifier, as well as all properties necessary for Protocol | |||
Stack selection. A Remote Endpoint may optionally be specified, to | Stack selection. A Remote Endpoint may optionally be specified, to | |||
constrain what Connections are accepted. The Listen() Action returns | constrain what Connections are accepted. | |||
a Listener object. Once Listen() has been called, properties added | ||||
to the Preconnection have no effect on the Listener and the | The Listen() Action returns a Listener object. Once Listen() has | |||
Preconnection can be disposed of or reused. | been called, any changes to the Preconnection MUST NOT have any | |||
effect on the Listener. The Preconnection can be disposed of or | ||||
reused, e.g., to create another Listener. | ||||
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.Stop() | Listener.Stop() | |||
After Stop() is called, the Listener can be disposed of. | After Stop() is called, the Listener can be disposed of. | |||
Listener -> ConnectionReceived<Connection> | Listener -> ConnectionReceived<Connection> | |||
The ConnectionReceived Event occurs when a Remote Endpoint has | The ConnectionReceived Event occurs when a Remote Endpoint has | |||
established a transport-layer connection to this Listener (for | established a transport-layer connection to this Listener (for | |||
Connection-oriented transport protocols), or when the first Message | Connection-oriented transport protocols), or when the first Message | |||
has been received from the Remote Endpoint (for Connectionless | has been received from the Remote Endpoint (for Connectionless | |||
protocols), causing a new Connection to be created. The resulting | protocols), causing a new Connection to be created. The resulting | |||
Connection is contained within the ConnectionReceived Event, and is | Connection is contained within the ConnectionReceived Event, and is | |||
ready to use as soon as it is passed to the application via the | ready to use as soon as it is passed to the application via the | |||
event. | event. | |||
Listener.SetNewConnectionLimit(value) | Listener.SetNewConnectionLimit(value) | |||
skipping to change at page 27, line 7 ¶ | skipping to change at page 30, line 27 ¶ | |||
SetNewConnectionLimit(). This mechanism allows a server to protect | SetNewConnectionLimit(). This mechanism allows a server to protect | |||
itself from being drained of resources. Each time a new Connection | itself from being drained of resources. Each time a new Connection | |||
is delivered by the ConnectionReceived Event, the value is | is delivered by the ConnectionReceived Event, the value is | |||
automatically decremented. Once the value reaches zero, no further | automatically decremented. Once the value reaches zero, no further | |||
Connections will be delivered until the caller sets the limit to a | Connections will be delivered until the caller sets the limit to a | |||
higher value. By default, this value is Infinite. The caller is | higher value. By default, this value is Infinite. The caller is | |||
also able to reset the value to Infinite at any point. | also able to reset the value to Infinite at any point. | |||
Listener -> ListenError<reason?> | Listener -> ListenError<reason?> | |||
A ListenError occurs either when the Properties of the Preconnection | A ListenError occurs either when the Properties and Security | |||
cannot be fulfilled for listening, when the Local Endpoint (or Remote | Parameters of the Preconnection cannot be fulfilled for listening or | |||
Endpoint, if specified) cannot be resolved, or when the application | cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | |||
is prohibited from listening by policy. | if specified), when the Local Endpoint (or Remote Endpoint, if | |||
specified) cannot be resolved, or when 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. | |||
6.3. Peer-to-Peer Establishment: Rendezvous | 6.3. Peer-to-Peer Establishment: Rendezvous | |||
Simultaneous peer-to-peer Connection establishment is supported by | Simultaneous peer-to-peer Connection establishment is supported by | |||
the Rendezvous() Action: | the Rendezvous() Action: | |||
skipping to change at page 27, line 33 ¶ | skipping to change at page 31, line 7 ¶ | |||
The Preconnection Object must be specified with both a Local Endpoint | The Preconnection Object must be specified with both a Local Endpoint | |||
and a Remote Endpoint, and also the transport properties and security | and a Remote Endpoint, and also the transport properties and security | |||
parameters needed for Protocol Stack selection. | parameters needed for Protocol Stack selection. | |||
The Rendezvous() Action causes the Preconnection to listen on the | The Rendezvous() Action causes the Preconnection to listen on the | |||
Local Endpoint for an incoming Connection from the Remote Endpoint, | Local Endpoint for an incoming Connection from the Remote Endpoint, | |||
while simultaneously trying to establish a Connection from the Local | while simultaneously trying to establish a Connection from the Local | |||
Endpoint to the Remote Endpoint. This corresponds to a TCP | Endpoint to the Remote Endpoint. This corresponds to a TCP | |||
simultaneous open, for example. | simultaneous open, for example. | |||
The Rendezvous() Action consumes the Preconnection. Once | The Rendezvous() Action returns a Connection object. Once | |||
Rendezvous() has been called, no further properties may be added to | Rendezvous() has been called, any changes to the Preconnection MUST | |||
the Preconnection, and no subsequent establishment call may be made | NOT have any effect on the Connection. However, the Preconnection | |||
on the Preconnection. | can be reused, e.g., for Rendezvous of another Connection. | |||
Preconnection -> RendezvousDone<Connection> | Preconnection -> RendezvousDone<Connection> | |||
The RendezvousDone<> Event occurs when a Connection is established | The RendezvousDone<> Event occurs when a Connection is established | |||
with the Remote Endpoint. For Connection-oriented transports, this | with the Remote Endpoint. For Connection-oriented transports, this | |||
occurs when the transport-layer connection is established; for | occurs when the transport-layer connection is established; for | |||
Connectionless transports, it occurs when the first Message is | Connectionless transports, it occurs when the first Message is | |||
received from the Remote Endpoint. The resulting Connection is | received from the Remote Endpoint. The resulting Connection is | |||
contained within the RendezvousDone<> Event, and is ready to use as | contained within the RendezvousDone<> Event, and is ready to use as | |||
soon as it is passed to the application via the Event. | soon as it is passed to the application via the Event. | |||
Preconnection -> RendezvousError<messageContext, reason?> | Preconnection -> RendezvousError<reason?> | |||
An RendezvousError occurs either when the Preconnection cannot be | An RendezvousError occurs either when the Properties and Security | |||
fulfilled for listening, when the Local Endpoint or Remote Endpoint | Parameters of the Preconnection cannot be fulfilled for rendezvous or | |||
cannot be resolved, when no transport-layer connection can be | cannot be reconciled with the Local and/or Remote Endpoints, when the | |||
established to the Remote Endpoint, or when the application is | Local Endpoint or Remote Endpoint cannot be resolved, when no | |||
prohibited from rendezvous by policy. | transport-layer connection can be established to the Remote Endpoint, | |||
or when the application is prohibited from rendezvous by policy. | ||||
When using some NAT traversal protocols, e.g., Interactive | When using some NAT traversal protocols, e.g., Interactive | |||
Connectivity Establishment (ICE) [RFC5245], it is expected that the | Connectivity Establishment (ICE) [RFC5245], it is expected that the | |||
Local Endpoint will be configured with some method of discovering NAT | Local Endpoint will be configured with some method of discovering NAT | |||
bindings, e.g., a Session Traversal Utilities for NAT (STUN) server. | bindings, e.g., a Session Traversal Utilities for NAT (STUN) server. | |||
In this case, the Local Endpoint may resolve to a mixture of local | In this case, the Local Endpoint may resolve to a mixture of local | |||
and server reflexive addresses. The Resolve() action on the | and server reflexive addresses. The Resolve() action on the | |||
Preconnection can be used to discover these bindings: | Preconnection can be used to discover these bindings: | |||
[]Preconnection := Preconnection.Resolve() | []Preconnection := Preconnection.Resolve() | |||
skipping to change at page 28, line 37 ¶ | skipping to change at page 32, line 16 ¶ | |||
Entangled Connections can be created using the Clone Action: | Entangled Connections can be created using the Clone Action: | |||
Connection := Connection.Clone() | Connection := Connection.Clone() | |||
Calling Clone on a Connection yields a group of two Connections: the | Calling Clone on a Connection yields a group of two Connections: the | |||
parent Connection on which Clone was called, and the resulting cloned | parent Connection on which Clone was called, and the resulting cloned | |||
Connection. These connections are "entangled" with each other, and | Connection. These connections are "entangled" with each other, and | |||
become part of a Connection Group. Calling Clone on any of these two | become part of a Connection Group. Calling Clone on any of these two | |||
Connections adds a third Connection to the Connection Group, and so | Connections adds a third Connection to the Connection Group, and so | |||
on. Connections in a Connection Group share all Protocol Properties | on. Connections in a Connection Group generally share Connection | |||
that are not applicable to a Message. | Properties. However, there may be exceptions, such as "Priority | |||
(Connection)", see Section 10.1.3. Like all other Properties, | ||||
Priority is copied to the new Connection when calling Clone(), but it | ||||
is not entangled: Changing Priority on one Connection does not change | ||||
it on the other Connections in the same Connection Group. | ||||
In addition, incoming entangled Connections can be received by | In addition, incoming entangled Connections can be received by | |||
creating a Listener on an existing connection: | creating a Listener on an existing connection: | |||
Listener := Connection.Listen() | Listener := Connection.ListenClone() | |||
Changing one of these Protocol Properties on one Connection in the | ListenClone() creates a Listener that listens on the same | |||
group changes it for all others. Per-Message Protocol Properties, | LocalEndpoint as the one the cloned Connection is using. Any new | |||
however, are not entangled. For example, changing "Timeout for | Connection received by this Listener will be entangled with the | |||
aborting Connection" (see Section 11.1.4) on one Connection in a | cloned Connection. Changing one of the Connection Properties on one | |||
group will automatically change this Protocol Property for all | Connection in the group changes it for all others. Message | |||
Connections in the group in the same way. However, changing | Properties, however, are not entangled. For example, changing | |||
"Lifetime" (see Section 7.4.1) of a Message will only affect a single | "Timeout for aborting Connection" (see Section 10.1.4) on one | |||
Message on a single Connection, entangled or not. | Connection in a group will automatically change this Connection | |||
Property for all Connections in the group in the same way. However, | ||||
changing "Lifetime" (see Section 7.5.1) of a Message will only affect | ||||
a single Message on a single Connection, entangled or not. | ||||
If the underlying protocol supports multi-streaming, it is natural to | If the underlying protocol supports multi-streaming, it is natural to | |||
use this functionality to implement Clone. In that case, entangled | use this functionality to implement Clone. In that case, entangled | |||
Connections are multiplexed together, giving them similar treatment | Connections are multiplexed together, giving them similar treatment | |||
not only inside endpoints but also across the end-to-end Internet | not only inside endpoints but also across the end-to-end Internet | |||
path. | path. | |||
If the underlying Protocol Stack does not support cloning, or cannot | Note that calling Clone() may result in on-the-wire signaling, e.g., | |||
create a new stream on the given Connection, then attempts to clone a | to open a new connection, depending on the underlying Protocol Stack. | |||
Connection will result in a CloneError: | When Clone() leads to multiple connections being opened instead of | |||
multi-streaming, the transport system will ensure consistency of | ||||
Connection Properties by uniformly applying them to all underlying | ||||
connections in a group. Even in such a case, there are possibilities | ||||
for a transport system to implement prioritization within a | ||||
Connection Group [TCP-COUPLING] [RFC8699]. | ||||
Attempts to clone a Connection can result in a CloneError: | ||||
Connection -> CloneError<reason?> | Connection -> CloneError<reason?> | |||
The Protocol Property "Priority" operates on entangled Connections as | The Connection Property "Priority" operates on entangled Connections | |||
in Section 7.4.2: when allocating available network capacity among | as in Section 7.5.2: when allocating available network capacity among | |||
Connections in a Connection Group, sends on Connections with higher | Connections in a Connection Group, sends on Connections with higher | |||
Priority values will be prioritized over sends on Connections with | Priority values will be prioritized over sends on Connections with | |||
lower Priority values. An ideal transport system implementation | lower Priority values. A transport system implementation should, if | |||
would assign each Connection the capacity share (M-N) x C / M, where | possible, assign each Connection the capacity share (M-N) x C / M, | |||
N is the Connection's Priority value, M is the maximum Priority value | where N is the Connection's Priority value, M is the maximum Priority | |||
used by all Connections in the group and C is the total available | value used by all Connections in the group and C is the total | |||
capacity. However, the Priority setting is purely advisory, and no | available capacity. However, the Priority setting is purely | |||
guarantees are given about the way capacity is shared. Each | advisory, and no guarantees are given about the way capacity is | |||
implementation is free to implement a way to share capacity that it | shared. Each implementation is free to implement a way to share | |||
sees fit. | capacity that it sees fit. | |||
7. Sending Data | 7. Sending Data | |||
Once a Connection has been established, it can be used for sending | Once a Connection has been established, it can be used for sending | |||
data. Data is sent as Messages, which allow the application to | data. Data is sent as Messages, which allow the application to | |||
communicate the boundaries of the data being transferred. By | communicate the boundaries of the data being transferred. By | |||
default, Send enqueues a complete Message, and takes optional per- | default, Send enqueues a complete Message, and takes optional per- | |||
Message properties (see Section 7.1). All Send actions are | Message properties (see Section 7.1). All Send actions are | |||
asynchronous, and deliver events (see Section 7.3). Sending partial | asynchronous, and deliver events (see Section 7.3). Sending partial | |||
Messages for streaming large data is also supported (see | Messages for streaming large data is also supported (see | |||
Section 7.5). | Section 7.6). | |||
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. | where messageData is the data object to send. | |||
The optional messageContext parameter supports per-message properties | The optional messageContext parameter allows adding Message | |||
and is described in Section 7.4. It can be used to identify send | Properties as described in Section 7.5. Moreover, the messageContext | |||
events (see Section 7.3) related to a specific message or to inspect | can be used to identify Send Events related to a specific Message | |||
meta-data related to the message sent (see Section 9). | (see Section 7.3) or to inspect meta-data related to the Message sent | |||
(see Section 7.4). | ||||
The optional endOfMessage parameter supports partial sending and is | The optional endOfMessage parameter supports partial sending and is | |||
described in Section 7.5. | described in Section 7.6. | |||
Framers can be used to extend or modify the message data with | ||||
additional information that can be processed at the receiver to | ||||
detect message boundaries. This is further decribed in Section 9. | ||||
7.1. Basic Sending | 7.1. Basic Sending | |||
The most basic form of sending on a connection involves enqueuing a | The most basic form of sending on a connection involves enqueuing a | |||
single Data block as a complete Message, with default Message | single Data block as a complete Message, with default Message | |||
Properties. Message data is transferred as an array of bytes, and | Properties. Message data is transferred as an array of bytes, and | |||
the resulting object contains both the byte array and the length of | the resulting object contains both the byte array and the length of | |||
the array. | the array. | |||
messageData := "hello".bytes() | messageData := "hello".bytes() | |||
skipping to change at page 30, line 30 ¶ | skipping to change at page 34, line 27 ¶ | |||
The interpretation of a Message to be sent is dependent on the | The interpretation of a Message to be sent is dependent on the | |||
implementation, and on the constraints on the Protocol Stacks implied | implementation, and on the constraints on the Protocol Stacks implied | |||
by the Connection's transport properties. For example, a Message may | by the Connection's transport properties. For example, a Message may | |||
be a single datagram for UDP Connections; or an HTTP Request for HTTP | be a single datagram for UDP Connections; or an HTTP Request for HTTP | |||
Connections. | Connections. | |||
Some transport protocols can deliver arbitrarily sized Messages, but | Some transport protocols can deliver arbitrarily sized Messages, but | |||
other protocols constrain the maximum Message size. Applications can | other protocols constrain the maximum Message size. Applications can | |||
query the Connection Property "Maximum Message size on send" | query the Connection Property "Maximum Message size on send" | |||
(Section 11.1.8) to determine the maximum size allowed for a single | (Section 10.1.8.3) to determine the maximum size allowed for a single | |||
Message. If a Message is too large to fit in the Maximum Message | Message. If a Message is too large to fit in the Maximum Message | |||
Size for the Connection, the Send will fail with a SendError event | Size for the Connection, the Send will fail with a SendError event | |||
(Section 7.3.3). For example, it is invalid to send a Message over a | (Section 7.3.3). For example, it is invalid to send a Message over a | |||
UDP connection that is larger than the available datagram sending | UDP connection that is larger than the available datagram sending | |||
size. | size. | |||
7.2. Sending Replies | 7.2. Sending Replies | |||
When a message is sent in response to a message received, the | When a message is sent in response to a message received, the | |||
application may use the Message Context of the received Message to | application may use the Message Context of the received Message to | |||
construct a Message Context for the reply. | construct a Message Context for the reply. | |||
replyMessageContext := requestMessageContext.reply() | replyMessageContext := requestMessageContext.reply() | |||
By using the "replyMessageContext", the transport system is informed | By using the "replyMessageContext", the transport system is informed | |||
that the message to be sent is a response and can map the response to | that the message to be sent is a response and can map the response to | |||
the same underlying transport connection or stream the request was | the same underlying transport connection or stream the request was | |||
received from. The concept of Message Contexts is described in | received from. The concept of Message Contexts is described in | |||
Section 9. | Section 7.4. | |||
7.3. Send Events | 7.3. Send Events | |||
Like all Actions in this interface, the Send Action is asynchronous. | Like all Actions in this interface, the Send Action is asynchronous. | |||
There are several Events that can be delivered in response to Sending | There are several Events that can be delivered in response to Sending | |||
a Message. Exactly one Event (Sent, Expired, or SendError) will be | a Message. Exactly one Event (Sent, Expired, or SendError) will be | |||
delivered in reponse to each call to Send. These Events can be | delivered in reponse to each call to Send. | |||
implemented as callbacks that allow the specific Event to be | ||||
associated with the call to Send. | ||||
Note that if partial Sends are used (Section 7.5), there will still | Note that if partial Sends are used (Section 7.6), there will still | |||
be exactly one Send Event delivered for each call to Send. For | be exactly one Send Event delivered for each call to Send. For | |||
example, if a Message expired while two requests to Send data for | example, if a Message expired while two requests to Send data for | |||
that Message are outstanding, there will be two Expired events | that Message are outstanding, there will be two Expired events | |||
delivered. | delivered. | |||
7.3.1. Sent | 7.3.1. Sent | |||
Connection -> Sent<messageContext> | Connection -> Sent<messageContext> | |||
The Sent Event occurs when a previous Send Action has completed, | The Sent Event occurs when a previous Send Action has completed, | |||
i.e., when the data derived from the Message has been passed down or | i.e., when the data derived from the Message has been passed down or | |||
through the underlying Protocol Stack and is no longer the | through the underlying Protocol Stack and is no longer the | |||
responsibility of this interface. The exact disposition of the | responsibility of this interface. The exact disposition of the | |||
Message (i.e., whether it has actually been transmitted, moved into a | Message (i.e., whether it has actually been transmitted, moved into a | |||
buffer on the network interface, moved into a kernel buffer, and so | buffer on the network interface, moved into a kernel buffer, and so | |||
on) when the Sent Event occurs is implementation-specific. The Sent | on) when the Sent Event occurs is implementation-specific. The Sent | |||
Event contains an implementation-specific reference to the Message to | Event contains a reference to the Message to which it applies. | |||
which it applies. | ||||
Sent Events allow an application to obtain an understanding of the | Sent Events allow an application to obtain an understanding of the | |||
amount of buffering it creates. That is, if an application calls the | amount of buffering it creates. That is, if an application calls the | |||
Send Action multiple times without waiting for a Sent Event, it has | Send Action multiple times without waiting for a Sent Event, it has | |||
created more buffer inside the transport system than an application | created more buffer inside the transport system than an application | |||
that always waits for the Sent Event before calling the next Send | that always waits for the Sent Event before calling the next Send | |||
Action. | Action. | |||
7.3.2. Expired | 7.3.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 7.4.1) expired. This is separate from SendError, as it | (see Section 7.5.1) expired. This is separate from SendError, as it | |||
is an expected behavior for partially reliable transports. The | is an expected behavior for partially reliable transports. The | |||
Expired Event contains an implementation-specific reference to the | Expired Event contains a reference to the Message to which it | |||
Message to which it applies. | applies. | |||
7.3.3. SendError | 7.3.3. SendError | |||
Connection -> SendError<messageContext, reason?> | Connection -> SendError<messageContext, reason?> | |||
A SendError occurs when a Message could not be sent due to an error | A SendError occurs when a Message could not be sent due to an error | |||
condition: an attempt to send a Message which is too large for the | condition: an attempt to send a Message which is too large for the | |||
system and Protocol Stack to handle, some failure of the underlying | system and Protocol Stack to handle, some failure of the underlying | |||
Protocol Stack, or a set of Message Properties not consistent with | Protocol Stack, or a set of Message Properties not consistent with | |||
the Connection's transport properties. The SendError contains an | the Connection's transport properties. The SendError contains a | |||
implementation-specific reference to the Message to which it applies. | reference to the Message to which it applies. | |||
7.4. Message Properties | 7.4. Message Contexts | |||
Using the MessageContext object, the application can set and retrieve | ||||
meta-data of the message, including Message Properties (see | ||||
Section 7.5) and framing meta-data (see Section 9.2). Therefore, a | ||||
MessageContext object can be passed to the Send action and is | ||||
returned by each Send and Receive related event. | ||||
Message Properties can be set and queried using the Message Context: | ||||
MessageContext.add(scope?, parameter, value) | ||||
PropertyValue := MessageContext.get(scope?, property) | ||||
To get or set Message Properties, the optional scope parameter is | ||||
left empty. To get or set meta-data for a Framer, the application | ||||
has to pass a reference to this Framer as the scope parameter. | ||||
For MessageContexts returned by send events (see Section 7.3) and | ||||
receive events (see Section 8.2), the application can query | ||||
information about the local and remote endpoint: | ||||
RemoteEndpoint := MessageContext.GetRemoteEndpoint() | ||||
LocalEndpoint := MessageContext.GetLocalEndpoint() | ||||
Message Contexts can also be used to send messages that are flagged | ||||
as a reply to other messages, see Section 7.2 for details. If the | ||||
message received was sent by the remote endpoint as a reply to an | ||||
earlier message and the Protocol Stack provides this information, the | ||||
MessageContext of the original request can be accessed using the | ||||
Message Context of the reply: | ||||
RequestMessageContext := MessageContext.GetOriginalRequest() | ||||
7.5. Message Properties | ||||
Applications may need to annotate the Messages they send with extra | Applications may need to annotate the Messages they send with extra | |||
information to control how data is scheduled and processed by the | information to control how data is scheduled and processed by the | |||
transport protocols in the Connection. Therefore a message context | transport protocols in the Connection. Therefore a message context | |||
containing these properties can be passed to the Send Action. For | containing these properties can be passed to the Send Action. For | |||
other uses of the message context, see Section 9. | other uses of the message context, see Section 7.4. | |||
Note that message properties are per-Message, not per-Send if partial | Note that Message Properties are per-Message, not per-Send if partial | |||
Messages are sent (Section 7.5). All data blocks associated with a | Messages are sent (Section 7.6). All data blocks associated with a | |||
single Message share properties specified in the Message Contexts. | single Message share properties specified in the Message Contexts. | |||
For example, it would not make sense to have the beginning of a | For example, it would not make sense to have the beginning of a | |||
Message expire, but allow the end of a Message to still be sent. | Message expire, but allow the end of a Message to still be sent. | |||
A MessageContext object contains metadata for Messages to be sent or | A MessageContext object contains metadata for Messages to be sent or | |||
received. | received. | |||
messageData := "hello".bytes() | messageData := "hello".bytes() | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
skipping to change at page 33, line 8 ¶ | skipping to change at page 37, line 36 ¶ | |||
same messageContext Object for sending multiple Messages with the | same messageContext Object for sending multiple Messages with the | |||
same properties. | same properties. | |||
Properties may be added to a MessageContext object only before the | Properties may be added to a MessageContext object only before the | |||
context is used for sending. Once a messageContext has been used | context is used for sending. Once a messageContext has been used | |||
with a Send call, modifying any of its properties is invalid. | with a Send call, modifying any of its properties is invalid. | |||
Message Properties may be inconsistent with the properties of the | Message Properties may be inconsistent with the properties of the | |||
Protocol Stacks underlying the Connection on which a given Message is | Protocol Stacks underlying the Connection on which a given Message is | |||
sent. For example, a Connection must provide reliability to allow | sent. For example, a Connection must provide reliability to allow | |||
setting an infinitie value for the lifetime property of a Message. | setting an infinite value for the lifetime property of a Message. | |||
Sending a Message with Message Properties inconsistent with the | Sending a Message with Message Properties inconsistent with the | |||
Selection Properties of the Connection yields an error. | Selection Properties of the Connection yields an error. | |||
The following Message Properties are supported: | The following Message Properties are supported: | |||
7.4.1. Lifetime | 7.5.1. Lifetime | |||
Name: msg-lifetime | Name: msg-lifetime | |||
Type: Integer | Type: Numeric | |||
Default: infinite | Default: infinite | |||
Lifetime specifies how long a particular Message can wait to be sent | Lifetime specifies how long a particular Message can wait to be sent | |||
to the remote endpoint before it is irrelevant and no longer needs to | to the remote endpoint before it is irrelevant and no longer needs to | |||
be (re-)transmitted. This is a hint to the transport system - it is | be (re-)transmitted. This is a hint to the transport system - it is | |||
not guaranteed that a Message will not be sent when its Lifetime has | not guaranteed that a Message will not be sent when its Lifetime has | |||
expired. | expired. | |||
Setting a Message's Lifetime to infinite indicates that the | Setting a Message's Lifetime to infinite indicates that the | |||
application does not wish to apply a time constraint on the | application does not wish to apply a time constraint on the | |||
transmission of the Message, but it does not express a need for | transmission of the Message, but it does not express a need for | |||
reliable delivery; reliability is adjustable per Message via the | reliable delivery; reliability is adjustable per Message via the | |||
"Reliable Data Transfer (Message)" property (see Section 7.4.7). The | "Reliable Data Transfer (Message)" property (see Section 7.5.7). The | |||
type and units of Lifetime are implementation-specific. | type and units of Lifetime are implementation-specific. | |||
7.4.2. Priority | 7.5.2. Priority | |||
Name: msg-prio | Name: msg-prio | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
Default: 100 | Default: 100 | |||
This property represents a hierarchy of priorities. It can specify | This property represents a hierarchy of priorities. It can specify | |||
the priority of a Message, relative to other Messages sent over the | the priority of a Message, relative to other Messages sent over the | |||
same Connection. | same Connection. | |||
A Message with Priority 0 will yield to a Message with Priority 1, | A Message with Priority 0 will yield to a Message with Priority 1, | |||
which will yield to a Message with Priority 2, and so on. Priorities | which will yield to a Message with Priority 2, and so on. Priorities | |||
may be used as a sender-side scheduling construct only, or be used to | may be used as a sender-side scheduling construct only, or be used to | |||
specify priorities on the wire for Protocol Stacks supporting | specify priorities on the wire for Protocol Stacks supporting | |||
prioritization. | prioritization. | |||
Note that this property is not a per-message override of the | Note that this property is not a per-message override of the | |||
connection Priority - see Section 11.1.3. Both Priority properties | connection Priority - see Section 10.1.3. Both Priority properties | |||
may interact, but can be used independently and be realized by | may interact, but can be used independently and be realized by | |||
different mechanisms. | different mechanisms. | |||
7.4.3. Ordered | 7.5.3. Ordered | |||
Name: msg-ordered | Name: msg-ordered | |||
Type: Boolean | Type: Boolean | |||
Default: true | Default: true | |||
If true, it specifies that the receiver-side transport protocol stack | If true, it specifies that the receiver-side transport protocol stack | |||
only deliver the Message to the receiving application after the | may only deliver the Message to the receiving application after the | |||
previous ordered Message which was passed to the same Connection via | previous ordered Message which was passed to the same Connection via | |||
the Send Action, when such a Message exists. If false, the Message | the Send Action, when such a Message exists. If false, the Message | |||
may be delivered to the receiving application out of order. This | may be delivered to the receiving application out of order. This | |||
property is used for protocols that support preservation of data | property is used for protocols that support preservation of data | |||
ordering, see Section 5.2.4, but allow out-of-order delivery for | ordering, see Section 5.2.4, but allow out-of-order delivery for | |||
certain messages. | certain messages, e.g., by multiplexing independent messages onto | |||
different streams. | ||||
7.4.4. Idempotent | 7.5.4. Idempotent | |||
Name: idempotent | Name: idempotent | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
If true, it specifies that a Message is safe to send to the remote | If true, it specifies that a Message is safe to send to the remote | |||
endpoint more than once for a single Send Action. It is used to mark | endpoint more than once for a single Send Action. It is used to mark | |||
data safe for certain 0-RTT establishment techniques, where | data safe for certain 0-RTT establishment techniques, where | |||
retransmission of the 0-RTT data may cause the remote application to | retransmission of the 0-RTT data may cause the remote application to | |||
receive the Message multiple times. | receive the Message multiple times. | |||
Note that for protocols that do not protect against duplicated | Note that for protocols that do not protect against duplicated | |||
messages, e.g., UDP, all messages MUST be marked as Idempotent. In | messages, e.g., UDP, all messages MUST be marked as Idempotent. In | |||
order to enable protocol selection to choose such a protocol, | order to enable protocol selection to choose such a protocol, | |||
Idempotent MUST be added to the TransportProperties passed to the | Idempotent MUST be added to the TransportProperties passed to the | |||
Preconnection. If such a protocol was chosen, disabling Idempotent | Preconnection. If such a protocol was chosen, disabling Idempotent | |||
on individual messages MUST result in a SendError. | on individual messages MUST result in a SendError. | |||
7.4.5. Final | 7.5.5. Final | |||
Type: Boolean | Type: Boolean | |||
Name: final | Name: final | |||
Default: false | Default: false | |||
If true, this Message is the last one that the application will send | If true, this Message is the last one that the application will send | |||
on a Connection. This allows underlying protocols to indicate to the | on a Connection. This allows underlying protocols to indicate to the | |||
Remote Endpoint that the Connection has been effectively closed in | Remote Endpoint that the Connection has been effectively closed in | |||
the sending direction. For example, TCP-based Connections can send a | the sending direction. For example, TCP-based Connections can send a | |||
FIN once a Message marked as Final has been completely sent, | FIN once a Message marked as Final has been completely sent, | |||
indicated by marking endOfMessage. Protocols that do not support | indicated by marking endOfMessage. Protocols that do not support | |||
signalling the end of a Connection in a given direction will ignore | signalling the end of a Connection in a given direction will ignore | |||
this property. | this property. | |||
skipping to change at page 35, line 22 ¶ | skipping to change at page 40, line 5 ¶ | |||
signalling the end of a Connection in a given direction will ignore | signalling the end of a Connection in a given direction will ignore | |||
this property. | this property. | |||
Note that a Final Message must always be sorted to the end of a list | Note that a Final Message must always be sorted to the end of a list | |||
of Messages. The Final property overrides Priority and any other | of Messages. The Final property overrides Priority and any other | |||
property that would re-order Messages. If another Message is sent | property that would re-order Messages. If another Message is sent | |||
after a Message marked as Final has already been sent on a | after a Message marked as Final has already been sent on a | |||
Connection, the Send Action for the new Message will cause a | Connection, the Send Action for the new Message will cause a | |||
SendError Event. | SendError Event. | |||
7.4.6. Corruption Protection Length | 7.5.6. Corruption Protection Length | |||
Name: msg-checksum-len | Name: msg-checksum-len | |||
Type: Integer (non-negative with -1 as special value) | Type: Integer (non-negative with -1 as special value) | |||
Default: full coverage | Default: -1 (full coverage) | |||
This property specifies the minimum length of the section of the | This property specifies the minimum length of the section of the | |||
Message, starting from byte 0, that the application requires to be | Message, starting from byte 0, that the application requires to be | |||
delivered without corruption due to lower layer errors. It is used | delivered without corruption due to lower layer errors. It is used | |||
to specify options for simple integrity protection via checksums. A | to specify options for simple integrity protection via checksums. A | |||
value of 0 means that no checksum is required, and -1 means that the | value of 0 means that no checksum is required, and -1 means that the | |||
entire Message is protected by a checksum. Only full coverage is | entire Message is protected by a checksum. Only full coverage is | |||
guaranteed, any other requests are advisory. | guaranteed, any other requests are advisory, meaning that full | |||
coverage is applied anyway. | ||||
7.4.7. Reliable Data Transfer (Message) | 7.5.7. Reliable Data Transfer (Message) | |||
Name: msg-reliable | Name: msg-reliable | |||
Type: Boolean | Type: Boolean | |||
Default: true | Default: true | |||
When true, this property specifies that a message should be sent in | When true, this property specifies that a message should be sent in | |||
such a way that the transport protocol ensures all data is received | such a way that the transport protocol ensures all data is received | |||
on the other side without corruption. Changing the 'Reliable Data | on the other side without corruption. Changing the 'Reliable Data | |||
Transfer' property on Messages is only possible for Connections that | Transfer' property on Messages is only possible for Connections that | |||
were established with the Selection Property 'Reliable Data Transfer | were established with the Selection Property 'Configure Per-Message | |||
(Connection)' enabled. When this is not the case, changing it will | Reliability' enabled. When this is not the case, changing it will | |||
generate an error. Disabling this property indicates that the | generate an error. Disabling this property indicates that the | |||
transport system may disable retransmissions or other reliability | transport system may disable retransmissions or other reliability | |||
mechanisms for this particular Message, but such disabling is not | mechanisms for this particular Message, but such disabling is not | |||
guaranteed. | guaranteed. | |||
7.4.8. Message Capacity Profile Override | 7.5.8. Message Capacity Profile Override | |||
Name: msg-capacity-profile | Name: msg-capacity-profile | |||
Type: Enumeration | Type: Enumeration | |||
This enumerated property specifies the application's preferred | This enumerated property specifies the application's preferred | |||
tradeoffs for sending this Message; it is a per-Message override of | tradeoffs for sending this Message; it is a per-Message override of | |||
the Capacity Profile protocol and path selection property (see | the Capacity Profile connection property (see Section 10.1.6). | |||
Section 11.1.10). | ||||
The following values are valid for Transmission Profile: | ||||
Default: No special optimizations of the tradeoff between delay, | ||||
delay variation, and bandwidth efficiency should be made when | ||||
sending this message. | ||||
Low Latency: Response time (latency) should be optimized at the | ||||
expense of efficiently using the available capacity when sending | ||||
this message. This can be used by the system to disable the | ||||
coalescing of multiple small Messages into larger packets (Nagle's | ||||
algorithm); to prefer immediate acknowledgment from the peer | ||||
endpoint when supported by the underlying transport; to signal a | ||||
preference for lower-latency, higher-loss treatment; and so on. | ||||
[TODO: This is inconsistent with {prop-cap-profile}} - needs to be | ||||
fixed] | ||||
7.4.9. Singular Transmission | ||||
7.5.9. Singular Transmission | ||||
Name: singular-transmission | Name: singular-transmission | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property specifies that a message should be sent and received as | This property specifies that a message should be sent and received as | |||
a single packet without transport-layer segmentation or network-layer | a single packet without transport-layer segmentation or network-layer | |||
fragmentation. Attempts to send a message with this property set | fragmentation, if possible. Attempts to send a message with this | |||
with a size greater to the transport's current estimate of its | property set with a size greater to the transport's current estimate | |||
maximum transmission segment size will result in a "SendError". When | of its maximum transmission segment size will result in a | |||
used with transports supporting this functionality and running over | "SendError". When used with transports supporting this functionality | |||
IP version 4, the Don't Fragment bit will be set. | and running over IP version 4, the Don't Fragment bit will be set. | |||
7.5. Partial Sends | 7.6. Partial Sends | |||
It is not always possible for an application to send all data | It is not always possible for an application to send all data | |||
associated with a Message in a single Send Action. The Message data | associated with a Message in a single Send Action. The Message data | |||
may be too large for the application to hold in memory at one time, | may be too large for the application to hold in memory at one time, | |||
or the length of the Message may be unknown or unbounded. | or the length of the Message may be unknown or unbounded. | |||
Partial Message sending is supported by passing an endOfMessage | Partial Message sending is supported by passing an endOfMessage | |||
boolean parameter to the Send Action. This value is always true by | boolean parameter to the Send Action. This value is always true by | |||
default, and the simpler forms of Send are equivalent to passing true | default, and the simpler forms of Send are equivalent to passing true | |||
for endOfMessage. | for endOfMessage. | |||
skipping to change at page 37, line 36 ¶ | skipping to change at page 42, line 5 ¶ | |||
messageData := "lo".bytes() | messageData := "lo".bytes() | |||
endOfMessage := true | endOfMessage := true | |||
Connection.Send(messageData, messageContext, endOfMessage) | Connection.Send(messageData, messageContext, endOfMessage) | |||
All data sent with the same MessageContext object will be treated as | All data sent with the same MessageContext object will be treated as | |||
belonging to the same Message, and will constitute an in-order series | belonging to the same Message, and will constitute an in-order series | |||
until the endOfMessage is marked. Once the end of the Message is | until the endOfMessage is marked. Once the end of the Message is | |||
marked, the MessageContext object may be re-used as a new Message | marked, the MessageContext object may be re-used as a new Message | |||
with identical parameters. | with identical parameters. | |||
7.6. Batching Sends | 7.7. 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 may want to batch several Send actions | Connection, the application may want to batch several Send actions | |||
together. This provides a hint to the system that the sending of | together. This provides a hint to the system that the sending of | |||
these Messages should be coalesced when possible, and that sending | these Messages should be coalesced when possible, and that sending | |||
any of the batched Messages may be delayed until the last Message in | any of the batched Messages may be delayed until the last Message in | |||
the batch is enqueued. | the batch is enqueued. | |||
Connection.Batch( | Connection.Batch( | |||
Connection.Send(messageData) | Connection.Send(messageData) | |||
Connection.Send(messageData) | Connection.Send(messageData) | |||
) | ) | |||
7.7. Send on Active Open: InitiateWithSend | 7.8. Send on Active Open: InitiateWithSend | |||
For application-layer protocols where the Connection initiator also | For application-layer protocols where the Connection initiator also | |||
sends the first message, the InitiateWithSend() action combines | sends the first message, the InitiateWithSend() action combines | |||
Connection initiation with a first Message sent: | Connection initiation with a first Message sent: | |||
Connection := Preconnection.InitiateWithSend(messageData, messageContext?, timeout?) | Connection := Preconnection.InitiateWithSend(messageData, messageContext?, timeout?) | |||
Whenever possible, a messageContext should be provided to declare the | Whenever possible, a messageContext should be provided to declare the | |||
message passed to InitiateWithSend as idempotent. This allows the | message passed to InitiateWithSend as idempotent. This allows the | |||
transport system to make use of 0-RTT establishment in case this is | transport system to make use of 0-RTT establishment in case this is | |||
supported by the available protocol stacks. When the selected | supported by the available protocol stacks. When the selected | |||
stack(s) do not support transmitting data upon connection | stack(s) do not support transmitting data upon connection | |||
establishment, InitiateWithSend is identical to Initiate() followed | establishment, InitiateWithSend is identical to Initiate() followed | |||
by Send(). | by Send(). | |||
Neither partial sends nor send batching are supported by | Neither partial sends nor send batching are supported by | |||
skipping to change at page 38, line 38 ¶ | skipping to change at page 42, line 52 ¶ | |||
will not result in a SendError separate from the InitiateError | will not result in a SendError separate from the InitiateError | |||
signaling the failure of Connection establishment. | signaling the failure of Connection establishment. | |||
8. Receiving Data | 8. Receiving Data | |||
Once a Connection is established, it can be used for receiving data. | Once a Connection is established, it can be used for receiving data. | |||
As with sending, data is received in terms of Messages. Receiving is | As with sending, data is received in terms of Messages. Receiving is | |||
an asynchronous operation, in which each call to Receive enqueues a | an asynchronous operation, in which each call to Receive enqueues a | |||
request to receive new data from the connection. Once data has been | request to receive new data from the connection. Once data has been | |||
received, or an error is encountered, an event will be delivered to | received, or an error is encountered, an event will be delivered to | |||
complete the Receive request (see Section 8.2). | complete any pending Receive requests (see Section 8.2). If Messages | |||
arrive at the transport system before Receive requests are issued, | ||||
As with sending, the type of the Message to be passed is dependent on | ensuing Receive requests will first operate on these Messages before | |||
the implementation, and on the constraints on the Protocol Stacks | awaiting any further Messages. | |||
implied by the Connection's transport parameters. | ||||
8.1. Enqueuing Receives | 8.1. Enqueuing Receives | |||
Receive takes two parameters to specify the length of data that an | Receive takes two parameters to specify the length of data that an | |||
application is willing to receive, both of which are optional and | application is willing to receive, both of which are optional and | |||
have default values if not specified. | have default values if not specified. | |||
Connection.Receive(minIncompleteLength?, maxLength?) | Connection.Receive(minIncompleteLength?, maxLength?) | |||
By default, Receive will try to deliver complete Messages in a single | By default, Receive will try to deliver complete Messages in a single | |||
event (Section 8.2.1). | event (Section 8.2.1). | |||
The application can set a minIncompleteLength value to indicate the | The application can set a minIncompleteLength value to indicate the | |||
smallest partial Message data size in bytes that should be delivered | smallest partial Message data size in bytes that should be delivered | |||
in response to this Receive. By default, this value is infinite, | in response to this Receive. By default, this value is infinite, | |||
which means that only complete Messages should be delivered (see | which means that only complete Messages should be delivered (see | |||
Section 8.2.2 and Section 10 for more information on how this is | Section 8.2.2 and Section 9 for more information on how this is | |||
accomplished). If this value is set to some smaller value, the | accomplished). If this value is set to some smaller value, the | |||
associated receive event will be triggered only when at least that | associated receive event will be triggered only when at least that | |||
many bytes are available, or the Message is complete with fewer | many bytes are available, or the Message is complete with fewer | |||
bytes, or the system needs to free up memory. Applications should | bytes, or the system needs to free up memory. Applications should | |||
always check the length of the data delivered to the receive event | always check the length of the data delivered to the receive event | |||
and not assume it will be as long as minIncompleteLength in the case | and not assume it will be as long as minIncompleteLength in the case | |||
of shorter complete Messages or memory issues. | of shorter complete Messages or memory issues. | |||
The maxLength argument indicates the maximum size of a Message in | The maxLength argument indicates the maximum size of a Message in | |||
bytes the application is currently prepared to receive. The default | bytes the application is currently prepared to receive. The default | |||
value for maxLength is infinite. If an incoming Message is larger | value for maxLength is infinite. If an incoming Message is larger | |||
than the minimum of this size and the maximum Message size on receive | than the minimum of this size and the maximum Message size on receive | |||
for the Connection's Protocol Stack, it will be delivered via | for the Connection's Protocol Stack, it will be delivered via | |||
ReceivedPartial events (Section 8.2.2). | ReceivedPartial events (Section 8.2.2). | |||
Note that maxLength does not guarantee that the application will | Note that maxLength does not guarantee that the application will | |||
receive that many bytes if they are available; the interface may | receive that many bytes if they are available; the interface may | |||
return ReceivedPartial events with less data than maxLength according | return ReceivedPartial events with less data than maxLength according | |||
to implementation constraints. | to implementation constraints. Note also that maxLength and | |||
minIncompleteLength are intended only to manage buffering, and are | ||||
not interpreted as a receiver preference for message reordering. | ||||
8.2. Receive Events | 8.2. Receive Events | |||
Each call to Receive will be paired with a single Receive Event, | Each call to Receive will be paired with a single Receive Event, | |||
which can be a success or an error. This allows an application to | which can be a success or an error. This allows an application to | |||
provide backpressure to the transport stack when it is temporarily | provide backpressure to the transport stack when it is temporarily | |||
not ready to receive messages. | not ready to receive messages. | |||
8.2.1. Received | 8.2.1. Received | |||
Connection -> Received<messageData, messageContext> | Connection -> Received<messageData, messageContext> | |||
A Received event indicates the delivery of a complete Message. It | A Received event indicates the delivery of a complete Message. It | |||
contains two objects, the received bytes as messageData, and the | contains two objects, the received bytes as messageData, and the | |||
metadata and properties of the received Message as messageContext. | metadata and properties of the received Message as messageContext. | |||
The messageData object provides access to the bytes that were | The messageData object provides access to the bytes that were | |||
received for this Message, along with the length of the byte array. | received for this Message, along with the length of the byte array. | |||
The messageContext is provided to enable retrieving metadata about | The messageContext is provided to enable retrieving metadata about | |||
the message and referring to the message, e.g., to send replies and | the message and referring to the message, e.g., to send replies and | |||
map responses to their requests. See Section 9 for details. | map responses to their requests. See Section 7.4 for details. | |||
See Section 10 for handling Message framing in situations where the | See Section 9 for handling Message framing in situations where the | |||
Protocol Stack only provides a byte-stream transport. | Protocol Stack only provides a byte-stream transport. | |||
8.2.2. ReceivedPartial | 8.2.2. ReceivedPartial | |||
Connection -> ReceivedPartial<messageData, messageContext, endOfMessage> | Connection -> ReceivedPartial<messageData, messageContext, endOfMessage> | |||
If a complete Message cannot be delivered in one event, one part of | If a complete Message cannot be delivered in one event, one part of | |||
the Message may be delivered with a ReceivedPartial event. In order | the Message may be delivered with a ReceivedPartial event. In order | |||
to continue to receive more of the same Message, the application must | to continue to receive more of the same Message, the application must | |||
invoke Receive again. | invoke Receive again. | |||
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 discontiguous partial Messages. | not support delivering discontiguous partial Messages. | |||
If the minIncompleteLength in the Receive request was set to be | If the minIncompleteLength in the Receive request was set to be | |||
infinite (indicating a request to receive only complete Messages), | infinite (indicating a request to receive only complete Messages), | |||
the ReceivedPartial event may still be delivered if one of the | the ReceivedPartial event may still be delivered if one of the | |||
following conditions is true: | following conditions is true: | |||
o the underlying Protocol Stack supports message boundary | * the underlying Protocol Stack supports message boundary | |||
preservation, and the size of the Message is larger than the | preservation, and the size of the Message is larger than the | |||
buffers available for a single message; | buffers available for a single message; | |||
o the underlying Protocol Stack does not support message boundary | * the underlying Protocol Stack does not support message boundary | |||
preservation, and the Message Framer (see Section 10) cannot | preservation, and the Message Framer (see Section 9) 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 | |||
o 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. | |||
8.2.3. ReceiveError | 8.2.3. ReceiveError | |||
Connection -> ReceiveError<messageContext, reason?> | Connection -> ReceiveError<messageContext, reason?> | |||
A ReceiveError occurs when data is received by the underlying | A ReceiveError occurs when data is received by the underlying | |||
Protocol Stack that cannot be fully retrieved or parsed, or when some | Protocol Stack that cannot be fully retrieved or parsed, or when some | |||
other indication is received that reception has failed. Such | other indication is received that reception has failed. In contrast, | |||
conditions that irrevocably lead to the termination of the Connection | conditions that irrevocably lead to the termination of the Connection | |||
are signaled using ConnectionError instead (see Section 12). | are signaled using ConnectionError instead (see Section 11). | |||
The ReceiveError event passes an optional associated MessageContext. | The ReceiveError event passes an optional associated MessageContext. | |||
This may indicate that a Message that was being partially received | This may indicate that a Message that was being partially received | |||
previously, but had not completed, encountered an error and will not | previously, but had not completed, encountered an error and will not | |||
be completed. | be completed. | |||
8.3. Receive Message Properties | 8.3. Receive Message Properties | |||
Each Message Context may contain metadata from protocols in the | Each Message Context may contain metadata from protocols in the | |||
Protocol Stack; which metadata is available is Protocol Stack | Protocol Stack; which metadata is available is Protocol Stack | |||
dependent. These are exposed though additional read-only Message | dependent. These are exposed though additional read-only Message | |||
Properties that can be queried from the MessageContext object (see | Properties that can be queried from the MessageContext object (see | |||
Section 9) passed by the receive event. The following metadata | Section 7.4) passed by the receive event. The following metadata | |||
values are supported: | values are supported: | |||
8.3.1. ECN | 8.3.1. UDP(-Lite)-specific Property: ECN | |||
When available, Message metadata carries the value of the Explicit | When available, Message metadata carries the value of the Explicit | |||
Congestion Notification (ECN) field. This information can be used | Congestion Notification (ECN) field. This information can be used | |||
for logging and debugging purposes, and for building applications | for logging and debugging purposes, and for building applications | |||
which need access to information about the transport internals for | which need access to information about the transport internals for | |||
their own operation. | their own operation. This property is specific to UDP and UDP-Lite | |||
because these protocols do not implement congestion control, and | ||||
hence expose this functionality to the application. | ||||
8.3.2. Early Data | 8.3.2. Early Data | |||
In some cases it may be valuable to know whether data was read as | In some cases it may 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 may wish to perform additional checks for early data | Thus, receivers may wish to perform additional checks for early data | |||
skipping to change at page 42, line 5 ¶ | skipping to change at page 46, line 20 ¶ | |||
Messages received during connection establishment and respond | Messages received during connection establishment and respond | |||
accordingly. | accordingly. | |||
8.3.3. Receiving Final Messages | 8.3.3. Receiving Final Messages | |||
The Message Context can indicate whether or not this Message is the | The Message Context can indicate whether or not this Message is the | |||
Final Message on a Connection. For any Message that is marked as | Final Message on a Connection. For any Message that is marked as | |||
Final, the application can assume that there will be no more Messages | Final, the application can assume that there will be no more Messages | |||
received on the Connection once the Message has been completely | received on the Connection once the Message has been completely | |||
delivered. This corresponds to the Final property that may be marked | delivered. This corresponds to the Final property that may be marked | |||
on a sent Message Section 7.4.5. | on a sent Message, see Section 7.5.5. | |||
Some transport protocols and peers may not support signaling of the | Some transport protocols and peers may not support signaling of the | |||
Final property. Applications therefore should not rely on receiving | Final property. Applications therefore should not rely on receiving | |||
a Message marked Final to know that the other endpoint is done | a Message marked Final to know that the other endpoint is done | |||
sending on a connection. | sending on a connection. | |||
Any calls to Receive once the Final Message has been delivered will | Any calls to Receive once the Final Message has been delivered will | |||
result in errors. | result in errors. | |||
9. Message Contexts | 9. Message Framers | |||
Using the MessageContext object, the application can set and retrieve | ||||
meta-data of the message, including Message Properties (see | ||||
Section 7.4) and framing meta-data (see Section 10.2). Therefore, a | ||||
MessageContext object can be passed to the Send action and is retuned | ||||
by each Send and Receive related events. | ||||
Message properties can be set and queried using the Message Context: | ||||
MessageContext.add(scope?, parameter, value) | ||||
PropertyValue := MessageContext.get(scope?, property) | ||||
To get or set Message Properties, the optional scope parameter is | ||||
left empty, for framing meta-data, the framer is passed. | ||||
For MessageContexts returned by send events (see Section 7.3) and | ||||
receive events (see Section 8.2), the application can query | ||||
information about the local and remote endpoint: | ||||
RemoteEndpoint := MessageContext.GetRemoteEndpoint() | ||||
LocalEndpoint := MessageContext.GetLocalEndpoint() | ||||
Message Contexts can also be used to send messages that are flagged | ||||
as a reply to other messages, see Section 7.2 for details. If the | ||||
message received was send by the remote endpoint as a reply to an | ||||
earlier message and the transports provides this information, the | ||||
MessageContext of the original request can be accessed using the | ||||
Message Context of the reply: | ||||
RequestMessageContext := MessageContext.GetOriginalRequest() | ||||
10. Message Framers | ||||
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 out from the stream of bytes. | be parsed out 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 facility is | object, even when using byte-stream transports. This facility is | |||
designed based on the fact that many of the current application | designed based on the fact that many of the current application | |||
skipping to change at page 43, line 31 ¶ | skipping to change at page 47, line 13 ¶ | |||
a protocol that otherwise does not preserve message boundaries, they | a protocol that otherwise does not preserve message boundaries, they | |||
can also be used with datagram- or message-based protocols. In these | can also be used with datagram- or message-based protocols. In these | |||
cases, they add an additional transformation to further encode or | cases, they add an additional transformation to further encode or | |||
encapsulate, and can potentially support packing multiple | encapsulate, and can potentially support packing multiple | |||
application-layer Messages into individual transport datagrams. | application-layer Messages into individual transport datagrams. | |||
The API to implement a Message Framer can vary depending on the | The API to implement a Message Framer can vary depending on the | |||
implementation; guidance on implementing Message Framers can be found | implementation; guidance on implementing Message Framers can be found | |||
in [I-D.ietf-taps-impl]. | in [I-D.ietf-taps-impl]. | |||
10.1. Adding Message Framers to Connections | 9.1. Adding Message Framers to Connections | |||
The Message Framer object can be added to one or more Preconnections | The Message Framer object can be added to one or more Preconnections | |||
to run on top of transport protocols. Multiple Framers may be added. | to run on top of transport protocols. Multiple Framers may be added. | |||
If multiple Framers are added, the last one added runs first when | If multiple Framers are added, the last one added runs first when | |||
framing outbound messages, and last when parsing inbound data. | framing outbound 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) | |||
10.2. Framing Meta-Data | 9.2. Framing Meta-Data | |||
When sending Messages, applications can add specific Message values | When sending Messages, applications can add specific Message values | |||
to a MessageContext (Section 9) that is intended for a Framer. This | to a MessageContext (Section 7.4) that is intended for a Framer. | |||
can be used, for example, to set the type of a Message for a TLV | This can be used, for example, to set the type of a Message for a TLV | |||
format. The namespace of values is custom for each unique Message | format. The namespace of values is custom for each unique Message | |||
Framer. | Framer. | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(framer, key, value) | messageContext.add(framer, key, value) | |||
Connection.Send(messageData, messageContext) | Connection.Send(messageData, messageContext) | |||
When an application receives a MessageContext in a Receive event, it | When an application receives a MessageContext in a Receive event, it | |||
can also look to see if a value was set by a specific Message Framer. | can also look to see if a value was set by a specific Message Framer. | |||
messageContext.get(framer, key) -> value | messageContext.get(framer, key) -> value | |||
For example, if an HTTP Message Framer is used, the values could | For example, if an HTTP Message Framer is used, the values could | |||
correspond to HTTP headers: | correspond to HTTP headers: | |||
httpFramer := NewHTTPMessageFramer() | httpFramer := NewHTTPMessageFramer() | |||
... | ... | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(httpFramer, "accept", "text/html") | messageContext.add(httpFramer, "accept", "text/html") | |||
11. Managing Connections | 10. Managing Connections | |||
During pre-establishment and after establishment, connections can be | During pre-establishment and after establishment, connections can be | |||
configured and queried using Connection Properties, and asynchronous | configured and queried using Connection Properties, and asynchronous | |||
information may be available about the state of the connection via | information may be available about the state of the connection via | |||
Soft Errors. | Soft Errors. | |||
Connection Properties represent the configuration and state of the | Connection Properties represent the configuration and state of the | |||
selected Protocol Stack(s) backing a Connection. These Connection | selected Protocol Stack(s) backing a Connection. These Connection | |||
Properties may be Generic, applying regardless of transport protocol, | Properties may be Generic, applying regardless of transport protocol, | |||
or Specific, applicable to a single implementation of a single | or Specific, applicable to a single implementation of a single | |||
transport protocol stack. Generic Connection Properties are defined | transport protocol stack. Generic Connection Properties are defined | |||
in Section 11.1 below. Specific Protocol Properties are defined in a | in Section 10.1 below. Specific Protocol Properties are defined in a | |||
transport- and implementation-specific way, and must not be assumed | transport- and implementation-specific way, and must not be assumed | |||
to apply across different protocols. Attempts to set Specific | to apply across different protocols. Attempts to set Specific | |||
Protocol Properties on a protocol stack not containing that specific | Protocol Properties on a protocol stack not containing that specific | |||
protocol are simply ignored, and do not raise an error; however, too | protocol are simply ignored, and do not raise an error; however, too | |||
much reliance by an application on Specific Protocol Properties may | much reliance by an application on Specific Protocol Properties may | |||
significantly reduce the flexibility of a transport services | significantly reduce the flexibility of a transport services | |||
implementation. | implementation. | |||
The application can set and query Connection Properties on a per- | The application can set and query Connection Properties on a per- | |||
Connection basis. Connection Properties that are not read-only can | Connection basis. Connection Properties that are not read-only can | |||
be set during pre-establishment (see Section 5.2), as well as on | be set during pre-establishment (see Section 5.2), as well as on | |||
connections directly using the SetProperty action: | connections directly using the SetProperty action: | |||
Connection.SetProperty(property, value) | Connection.SetProperty(property, value) | |||
Note that changing one of the Connection Properties on one Connection | ||||
in a Connection Group will also change it for all other Connections | ||||
of that group; see further Section 6.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() | |||
Depending on the status of the connection, the queried Connection | Depending on the status of the connection, the queried Connection | |||
Properties will include different information: | Properties will include different information: | |||
o The connection state, which can be one of the following: | * The connection state, which can be one of the following: | |||
Establishing, Established, Closing, or Closed. | Establishing, Established, Closing, or Closed. | |||
o Whether the connection can be used to send data. A connection can | * Whether the connection can be used to send data. A connection can | |||
not be used for sending if the connection was created with the | not be used for sending if the connection was created with the | |||
Selection Property "Direction of Communication" set to | Selection Property "Direction of Communication" set to | |||
"unidirectional receive" or if a Message marked as "Final" was | "unidirectional receive" or if a Message marked as "Final" was | |||
sent over this connection, see Section 7.4.5. | sent over this connection, see Section 7.5.5. | |||
o Whether the connection can be used to receive data. A connection | * Whether the connection can be used to receive data. A connection | |||
can not be used for reading if the connection was created with the | can not be used for reading if the connection was created with the | |||
Selection Property "Direction of Communication" set to | Selection Property "Direction of Communication" set to | |||
"unidirectional send" or if a Message marked as "Final" was | "unidirectional send" or if a Message marked as "Final" was | |||
received, see Section 8.3.3. The latter is only supported by | received, see Section 8.3.3. The latter is only supported by | |||
certain transport protocols, e.g., by TCP as half-closed | certain transport protocols, e.g., by TCP as half-closed | |||
connection. | connection. | |||
o For Connections that are Establishing: Transport Properties that | * For Connections that are Establishing: Transport Properties that | |||
the application specified on the Preconnection, see Section 5.2. | the application specified on the Preconnection, see Section 5.2. | |||
o For Connections that are Established, Closing, or Closed: | * For Connections that are Established, Closing, or Closed: | |||
Selection (Section 5.2) and Connection Properties (Section 11.1) | Selection (Section 5.2) and Connection Properties (Section 10.1) | |||
of the actual protocols that were selected and instantiated. | of the actual protocols that were selected and instantiated. | |||
Selection Properties indicate whether or not the Connection has or | Selection Properties indicate whether or not the Connection has or | |||
offers a certain Selection Property. Note that the actually | offers a certain Selection Property. Note that the actually | |||
instantiated protocol stack may not match all Protocol Selection | instantiated protocol stack may not match all Protocol Selection | |||
Properties that the application specified on the Preconnection. | Properties that the application specified on the Preconnection. | |||
For example, a certain Protocol Selection Property that an | For example, a certain Protocol Selection Property that an | |||
application specified as Preferred may not actually be present in | application specified as Preferred may not actually be present in | |||
the chosen protocol stack because none of the currently available | the chosen protocol stack because none of the currently available | |||
transport protocols had this feature. | transport protocols had this feature. | |||
o For Connections that are Established, additional properties of the | * For Connections that are Established, additional properties of the | |||
path(s) in use. These properties can be derived from the local | path(s) in use. These properties can be derived from the local | |||
provisioning domain [RFC7556], measurements by the Protocol Stack, | provisioning domain [RFC7556], measurements by the Protocol Stack, | |||
or other sources. | or other sources. | |||
11.1. Generic Connection Properties | 10.1. Generic Connection Properties | |||
The Connection Properties defined as independent, and available on | Generic Connection Properties are defined independent of the chosen | |||
all Connections are defined in the subsections below. | protocol stack and therefore available on all Connections. | |||
Note that many protocol properties have a corresponding selection | Note that many Connection Properties have a corresponding Selection | |||
property, which prefers protocols providing a specific transport | Property which enables applications to express their preference for | |||
feature that controlled by that protocol property. [EDITOR'S NOTE: | protocols providing a supporting transport feature. | |||
todo: add these cross-references up to Section 5.2] | ||||
11.1.1. Retransmission Threshold Before Excessive Retransmission | 10.1.1. Retransmission Threshold Before Excessive Retransmission | |||
Notification | Notification | |||
Name: retransmit-notify-threshold | Name: retransmit-notify-threshold | |||
Type: Integer | Type: Integer | |||
Default: -1 | Default: -1 | |||
This property specifies after how many retransmissions to inform the | This property specifies after how many retransmissions to inform the | |||
application about "Excessive Retransmissions". The special value -1 | application about "Excessive Retransmissions". The special value -1 | |||
means that this notification is disabled. | means that this notification is disabled. | |||
11.1.2. Required Minimum Corruption Protection Coverage for Receiving | 10.1.2. Required Minimum Corruption Protection Coverage for Receiving | |||
Name: recv-checksum-len | Name: recv-checksum-len | |||
Type: Integer | Type: Integer | |||
Default: -1 | Default: -1 | |||
This property specifies the part of the received data that needs to | This property specifies the part of the received data that needs to | |||
be covered by a checksum. It is given in Bytes. A value of 0 means | be covered by a checksum. It is given in Bytes. A value of 0 means | |||
that no checksum is required, and the special value -1 indicates full | that no checksum is required, and the special value -1 indicates full | |||
checksum coverage. | checksum coverage. | |||
11.1.3. Priority (Connection) | 10.1.3. Priority (Connection) | |||
Name: conn-prio | Name: conn-prio | |||
Type: Integer | Type: Integer | |||
Default: 100 | Default: 100 | |||
This Property is a non-negative integer representing the relative | This Property is a non-negative integer representing the relative | |||
inverse priority of this Connection relative to other Connections in | inverse priority (i.e., a lower value reflects a higher priority) of | |||
the same Connection Group. It has no effect on Connections not part | this Connection relative to other Connections in the same Connection | |||
of a Connection Group. As noted in Section 6.4, this property is not | Group. It has no effect on Connections not part of a Connection | |||
entangled when Connections are cloned. | Group. As noted in Section 6.4, this property is not entangled when | |||
Connections are cloned, i.e., changing the Priority on one Connection | ||||
in a Connection Group does not change it on the other Connections in | ||||
the same Connection Group. | ||||
11.1.4. Timeout for Aborting Connection | 10.1.4. Timeout for Aborting Connection | |||
Name: conn-timeout | Name: conn-timeout | |||
Type: Numeric | Type: Numeric | |||
Default: -1 | Default: -1 | |||
This property specifies how long to wait before deciding that a | This property specifies how long to wait before deciding that a | |||
Connection has failed when trying to reliably deliver data to the | Connection has failed when trying to reliably deliver data to the | |||
destination. Adjusting this Property will only take effect when the | destination. Adjusting this Property will only take effect when the | |||
underlying stack supports reliability. The special value -1 means | underlying stack supports reliability. The special value -1 means | |||
that this timeout is not scheduled to happen. | that this timeout is not scheduled to happen. This can be a valid | |||
choice with unreliable data transfer (e.g., when UDP is the | ||||
underlying transport protocol). | ||||
11.1.5. Connection Group Transmission Scheduler | 10.1.5. Connection Group Transmission Scheduler | |||
Name: conn-scheduler | Name: conn-scheduler | |||
Type: Enumeration | Type: Enumeration | |||
Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260]) | Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260]) | |||
This property specifies which scheduler should be used among | This property specifies which scheduler should be used among | |||
Connections within a Connection Group, see Section 6.4. The set of | Connections within a Connection Group, see Section 6.4. The set of | |||
schedulers can be taken from [RFC8260]. | schedulers can be taken from [RFC8260]. | |||
11.1.6. Maximum Message Size Concurrent with Connection Establishment | 10.1.6. Capacity Profile | |||
Name: zero-rtt-msg-max-len | ||||
Type: Integer (read only) | ||||
This property represents the maximum Message size that can be sent | ||||
before or during Connection establishment, see also Section 7.4.4. | ||||
It is given in Bytes. | ||||
11.1.7. Maximum Message Size Before Fragmentation or Segmentation | ||||
Name: singular-transmission-msg-max-len | ||||
Type: Integer (read only) | ||||
This property, if applicable, represents the maximum Message size | ||||
that can be sent without incurring network-layer fragmentation or | ||||
transport layer segmentation at the sender. | ||||
11.1.8. Maximum Message Size on Send | ||||
Name: send-msg-max-len | ||||
Type: Integer (read only) | ||||
This property represents the maximum Message size that can be sent. | ||||
11.1.9. Maximum Message Size on Receive | ||||
Name: recv-msg-max-len | ||||
Type: Integer (read only) | ||||
This numeric property represents the maximum Message size that can be | ||||
received. | ||||
11.1.10. Capacity Profile | ||||
Name: conn-capacity-profile | Name: conn-capacity-profile | |||
This property specifies the desired network treatment for traffic | This property specifies the desired network treatment for traffic | |||
sent by the application and the tradeoffs the application is prepared | sent by the application and the tradeoffs the application is prepared | |||
to make in path and protocol selection to receive that desired | to make in path and protocol selection to receive that desired | |||
treatment. When the capacity profile is set to a value other than | treatment. When the capacity profile is set to a value other than | |||
Default, the transport system should select paths and profiles to | Default, the transport system SHOULD select paths and configure | |||
optimize for the capacity profile specified. The following values | protocols to optimize the tradeoff between delay, delay variation, | |||
are valid for the Capacity Profile: | and bandwidth efficiency based on the capacity profile specified. | |||
How this is realized is implementation-specific. The Capacity | ||||
Profile MAY also be used to set priorities on the wire for Protocol | ||||
Stacks supporting prioritization. Recommendations for use with DSCP | ||||
are provided below for each profile; note that when a Connection is | ||||
multiplexed, the guidelines in Section 6 of [RFC7657] apply. | ||||
Default: The application makes no representation about its expected | The following values are valid for the Capacity Profile: | |||
capacity profile. No special optimizations of the tradeoff | ||||
between delay, delay variation, and bandwidth efficiency should be | Default: The application provides no information about its expected | |||
made when selecting and configuring transport protocol stacks. | capacity profile. Transport system implementations that map the | |||
Transport system implementations that map the requested capacity | requested capacity profile onto per-connection DSCP signaling | |||
profile onto per-connection DSCP signaling without multiplexing | SHOULD assign the DSCP Default Forwarding [RFC2474] PHB. | |||
SHOULD assign the DSCP Default Forwarding [RFC2474] PHB; when the | ||||
Connection is multiplexed, the guidelines in Section 6 of | ||||
[RFC7657] apply. | ||||
Scavenger: The application is not interactive. It expects to send | Scavenger: The application is not interactive. It expects to send | |||
and/or receive data without any urgency. This can, for example, | and/or receive data without any urgency. This can, for example, | |||
be used to select protocol stacks with scavenger transmission | be used to select protocol stacks with scavenger transmission | |||
control and/or to assign the traffic to a lower-effort service. | control and/or to assign the traffic to a lower-effort service. | |||
Transport system implementations that map the requested capacity | Transport system implementations that map the requested capacity | |||
profile onto per-connection DSCP signaling without multiplexing | profile onto per-connection DSCP signaling SHOULD assign the DSCP | |||
SHOULD assign the DSCP Less than Best Effort [LE-PHB] PHB; when | Less than Best Effort [RFC8622] PHB. | |||
the Connection is multiplexed, the guidelines in Section 6 of | ||||
[RFC7657] apply. | ||||
Low Latency/Interactive: The application is interactive, and prefers | Low Latency/Interactive: The application is interactive, and prefers | |||
loss to latency. Response time should be optimized at the expense | loss to latency. Response time should be optimized at the expense | |||
of bandwidth efficiency and delay variation when sending on this | of bandwidth efficiency and delay variation when sending on this | |||
connection. This can be used by the system to disable the | connection. This can be used by the system to disable the | |||
coalescing of multiple small Messages into larger packets (Nagle's | coalescing of multiple small Messages into larger packets (Nagle's | |||
algorithm); to prefer immediate acknowledgment from the peer | algorithm); to prefer immediate acknowledgment from the peer | |||
endpoint when supported by the underlying transport; and so on. | endpoint when supported by the underlying transport; and so on. | |||
Transport system implementations that map the requested capacity | Transport system implementations that map the requested capacity | |||
profile onto per-connection DSCP signaling without multiplexing | profile onto per-connection DSCP signaling without multiplexing | |||
SHOULD assign the DSCP Expedited Forwarding [RFC3246] PHB; when | SHOULD assign a DSCP Assured Forwarding (AF41,AF42,AF43,AF44) | |||
the Connection is multiplexed, the guidelines in Section 6 of | [RFC2597] PHB. Inelastic traffic that is expected to conform to | |||
[RFC7657] apply. | the configured network service rate could be mapped to the DSCP | |||
Expedited Forwarding [RFC3246] or [RFC5865] PHBs. | ||||
Low Latency/Non-Interactive: The application prefers loss to latency | Low Latency/Non-Interactive: The application prefers loss to latency | |||
but is not interactive. Response time should be optimized at the | but is not interactive. Response time should be optimized at the | |||
expense of bandwidth efficiency and delay variation when sending | expense of bandwidth efficiency and delay variation when sending | |||
on this connection.Transport system implementations that map the | on this connection. Transport system implementations that map the | |||
requested capacity profile onto per-connection DSCP signaling | requested capacity profile onto per-connection DSCP signaling | |||
without multiplexing SHOULD assign a DSCP Assured Forwarding | without multiplexing SHOULD assign a DSCP Assured Forwarding | |||
(AF21,AF22,AF23,AF24) [RFC2597] PHB; when the Connection is | (AF21,AF22,AF23,AF24) [RFC2597] PHB. | |||
multiplexed, the guidelines in Section 6 of [RFC7657] apply. | ||||
Constant-Rate Streaming: The application expects to send/receive | Constant-Rate Streaming: The application expects to send/receive | |||
data at a constant rate after Connection establishment. Delay and | data at a constant rate after Connection establishment. Delay and | |||
delay variation should be minimized at the expense of bandwidth | delay variation should be minimized at the expense of bandwidth | |||
efficiency. This implies that the Connection may fail if the | efficiency. This implies that the Connection may fail if the | |||
desired rate cannot be maintained across the Path. A transport | desired rate cannot be maintained across the Path. A transport | |||
may interpret this capacity profile as preferring a circuit | may interpret this capacity profile as preferring a circuit | |||
breaker [RFC8084] to a rate-adaptive congestion controller. | breaker [RFC8084] to a rate-adaptive congestion controller. | |||
Transport system implementations that map the requested capacity | Transport system implementations that map the requested capacity | |||
profile onto per-connection DSCP signaling without multiplexing | profile onto per-connection DSCP signaling without multiplexing | |||
SHOULD assign a DSCP Assured Forwarding (AF31,AF32,AF33,AF34) | SHOULD assign a DSCP Assured Forwarding (AF31,AF32,AF33,AF34) | |||
[RFC2597] PHB; when the Connection is multiplexed, the guidelines | [RFC2597] PHB. | |||
in Section 6 of [RFC7657] apply. | ||||
High Throughput Data: The application expects to send/receive data | High Throughput Data: The application expects to send/receive data | |||
at the maximum rate allowed by its congestion controller over a | at the maximum rate allowed by its congestion controller over a | |||
relatively long period of time. Transport system implementations | relatively long period of time. Transport system implementations | |||
that map the requested capacity profile onto per-connection DSCP | that map the requested capacity profile onto per-connection DSCP | |||
signaling without multiplexing SHOULD assign a DSCP Assured | signaling without multiplexing SHOULD assign a DSCP Assured | |||
Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per Section 4.8 of | Forwarding (AF11,AF12,AF13,AF14) [RFC2597] PHB per Section 4.8 of | |||
[RFC4594]. When the Connection is multiplexed, the guidelines in | [RFC4594]. | |||
Section 6 of [RFC7657] apply. | ||||
The Capacity Profile for a selected protocol stack may be modified on | The Capacity Profile for a selected protocol stack may be modified on | |||
a per-Message basis using the Transmission Profile Message Property; | a per-Message basis using the Transmission Profile Message Property; | |||
see Section 7.4.8. | see Section 7.5.8. | |||
11.1.11. Bounds on Send or Receive Rate | 10.1.7. Bounds on Send or Receive Rate | |||
Name: max-send-rate / max-recv-rate | Name: max-send-rate / max-recv-rate | |||
Type: Numeric / Numeric | Type: Numeric / Numeric | |||
Default: -1 / -1 (unlimited, for both values) | Default: -1 / -1 (unlimited, for both values) | |||
This property specifies an upper-bound rate that a transfer is not | This property specifies an upper-bound rate that a transfer is not | |||
expected to exceed (even if flow control and congestion control allow | expected to exceed (even if flow control and congestion control allow | |||
higher rates), and/or a lower-bound rate below which the application | higher rates), and/or a lower-bound rate below which the application | |||
does not deem a data transfer useful. It is given in bits per | does not deem a data transfer useful. It is given in bits per | |||
second. The special value -1 indicates that no bound is specified. | second. The special value -1 indicates that no bound is specified. | |||
11.1.12. TCP-specific Property: User Timeout | 10.1.8. Read-only Connection Properties | |||
This property specifies, for the case TCP becomes the chosen | The following generic Connection Properties are read-only, i.e. they | |||
transport protocol: | cannot be changed by an application. | |||
Advertised User Timeout (name: tcp.user-timeout-value, type: | 10.1.8.1. Maximum Message Size Concurrent with Connection Establishment | |||
Integer): | ||||
a time value (default: the TCP default) to be advertised via the | ||||
User Timeout Option (UTO) for the TCP at the remote endpoint to | ||||
adapt its own "Timeout for aborting Connection" (see | ||||
Section 11.1.4) value accordingly. | ||||
User Timeout Enabled (name: tcp.user-timeout, type: Boolean): a bool | Name: zero-rtt-msg-max-len | |||
ean (default false) to control whether the UTO option is enabled | ||||
for a connection. This applies to both sending and receiving. | ||||
Changeable (name: tcp.user-timeout-recv, type: Boolean): a boolean | Type: Integer | |||
(default true) which controls whether the "Timeout for aborting | ||||
Connection" (see Section 11.1.4) may be changed based on a UTO | ||||
option received from the remote peer. This boolean becomes false | ||||
when "Timeout for aborting Connection" (see Section 11.1.4) is | ||||
used. | ||||
All of the above parameters are optional (e.g., it is possible to | This property represents the maximum Message size that can be sent | |||
before or during Connection establishment, see also Section 7.5.4. | ||||
It is given in Bytes. | ||||
10.1.8.2. Maximum Message Size Before Fragmentation or Segmentation | ||||
Name: singular-transmission-msg-max-len | ||||
Type: Integer | ||||
This property, if applicable, represents the maximum Message size | ||||
that can be sent without incurring network-layer fragmentation or | ||||
transport layer segmentation at the sender. This property exposes | ||||
the Maximum Packet Size (MPS) as described in Datagram PLPMTUD | ||||
[I-D.ietf-tsvwg-datagram-plpmtud]. | ||||
10.1.8.3. Maximum Message Size on Send | ||||
Name: send-msg-max-len | ||||
Type: Integer | ||||
This property represents the maximum Message size that can be sent | ||||
using a send operation. | ||||
10.1.8.4. Maximum Message Size on Receive | ||||
Name: recv-msg-max-len | ||||
Type: Integer | ||||
This numeric property represents the maximum Message size that can be | ||||
received. | ||||
10.2. TCP-specific Properties: User Timeout Option (UTO) | ||||
These properties specify configurations for the User Timeout Option | ||||
(UTO), in case TCP becomes the chosen transport protocol. | ||||
Implementation is optional and of course only sensible if TCP is | ||||
implemented in the transport system. | ||||
These TCP-specific properties are included here because the feature | ||||
"Suggest timeout to the peer" is part of the minimal set of transport | ||||
services [I-D.ietf-taps-minset], where this feature was categorized | ||||
as "functional". This means that when an implementation offers this | ||||
feature, it has to expose an interface to it to the application. | ||||
Otherwise, the implementation might violate assumptions by the | ||||
application, which could cause the application to fail. | ||||
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). | |||
11.2. Soft Errors | 10.2.1. Advertised User Timeout | |||
Name: tcp.user-timeout-value | ||||
Type: Integer | ||||
Default: the TCP default | ||||
This time value is advertised via the TCP User Timeout Option (UTO) | ||||
[RFC5482] at the remote endpoint to adapt its own "Timeout for | ||||
aborting Connection" (see Section 10.1.4) value accordingly. | ||||
10.2.2. User Timeout Enabled | ||||
Name: tcp.user-timeout | ||||
Type: Boolean | ||||
Default: false | ||||
This property controls whether the UTO option is enabled for a | ||||
connection. This applies to both sending and receiving. | ||||
10.2.3. Timeout Changeable | ||||
Name: tcp.user-timeout-recv | ||||
Type: Boolean | ||||
Default: true | ||||
This property controls whether the "Timeout for aborting Connection" | ||||
(see Section 10.1.4) may be changed based on a UTO option received | ||||
from the remote peer. This boolean becomes false when "Timeout for | ||||
aborting Connection" (see Section 10.1.4) is used. | ||||
10.3. Connection Lifecycle Events | ||||
During the lifetime of a connection there are events that can occur | ||||
when configured. | ||||
10.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 of an ICMP error | This event informs the application about the receipt and contents of | |||
message related to the Connection. This will only happen if the | an ICMP error message related to the Connection. This will only | |||
underlying protocol stack supports access to soft errors; however, | happen if the underlying protocol stack supports access to soft | |||
even if the underlying stack supports it, there is no guarantee that | errors; however, even if the underlying stack supports it, there is | |||
a soft error will be signaled. | no guarantee that a soft error will be signaled. | |||
Connection -> SoftError<> | Connection -> SoftError<> | |||
11.3. Excessive retransmissions | 10.3.2. Excessive retransmissions | |||
This event notifies the application of excessive retransmissions, | This event notifies the application of excessive retransmissions, | |||
based on a configured threshold (see Section 11.1.1). This will only | based on a configured threshold (see Section 10.1.1). This will only | |||
happen if the underlying protocol stack supports reliability and, | happen if the underlying protocol stack supports reliability and, | |||
with it, such notifications. | with it, such notifications. | |||
Connection -> ExcessiveRetransmission<> | Connection -> ExcessiveRetransmission<> | |||
12. Connection Termination | 11. Connection Termination | |||
Close terminates a Connection after satisfying all the requirements | Close terminates a Connection after satisfying all the requirements | |||
that were specified regarding the delivery of Messages that the | that were specified regarding the delivery of Messages that the | |||
application has already given to the transport system. For example, | application has already given to the transport system. For example, | |||
if reliable delivery was requested for a Message handed over before | if reliable delivery was requested for a Message handed over before | |||
calling Close, the transport system will ensure that this Message is | calling Close, the transport system will ensure that this Message is | |||
indeed delivered. If the Remote Endpoint still has data to send, it | indeed delivered. If the Remote Endpoint still has data to send, it | |||
cannot be received after this call. | cannot be received after this call. | |||
Connection.Close() | Connection.Close() | |||
skipping to change at page 51, line 43 ¶ | skipping to change at page 56, line 24 ¶ | |||
Connection.Abort() | Connection.Abort() | |||
A ConnectionError informs the application that data to could not be | A ConnectionError informs the application that data to could not be | |||
delivered after a timeout, or the other side has aborted the | delivered after a timeout, or the other side has aborted the | |||
Connection; however, there is no guarantee that an Abort will indeed | Connection; however, there is no guarantee that an Abort will indeed | |||
be signaled. | be signaled. | |||
Connection -> ConnectionError<reason?> | Connection -> ConnectionError<reason?> | |||
13. Connection State and Ordering of Operations and Events | 12. Connection State and Ordering of Operations and Events | |||
As this interface is designed to be independent of an | As this interface is designed to be independent of an | |||
implementation's concurrency model, the details of how exactly | implementation's concurrency model, the details of how exactly | |||
actions are handled, and on which threads/callbacks events are | actions are handled, and how events are dispatched, are | |||
dispatched, are implementation dependent. | implementation dependent. | |||
Each transition of connection state is associated with one of more | Each transition of connection state is associated with one of more | |||
events: | events: | |||
o Ready<> occurs when a Connection created with Initiate() or | * Ready<> occurs when a Connection created with Initiate() or | |||
InitiateWithSend() transitions to Established state. | InitiateWithSend() transitions to Established state. | |||
o ConnectionReceived<> occurs when a Connection created with | * ConnectionReceived<> occurs when a Connection created with | |||
Listen() transitions to Established state. | Listen() transitions to Established state. | |||
o RendezvousDone<> occurs when a Connection created with | * RendezvousDone<> occurs when a Connection created with | |||
Rendezvous() transitions to Established state. | Rendezvous() transitions to Established state. | |||
o Closed<> occurs when a Connection transitions to Closed state | * Closed<> occurs when a Connection transitions to Closed state | |||
without error. | without error. | |||
o InitiateError<> occurs when a Connection created with Initiate() | * InitiateError<> occurs when a Connection created with Initiate() | |||
transitions from Establishing state to Closed state due to an | transitions from Establishing state to Closed state due to an | |||
error. | error. | |||
o ConnectionError<> occurs when a Connection transitions to Closed | * ConnectionError<> occurs when a Connection transitions to Closed | |||
state due to an error in all other circumstances. | state due to an error in all other circumstances. | |||
The interface provides the following guarantees about the ordering of | The interface provides the following guarantees about the ordering of | |||
operations: | operations: | |||
o 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 implementation). | |||
o Received<> will never occur on a Connection before it is | * Received<> will never occur on a Connection before it is | |||
Established; i.e. before a Ready<> event on that Connection, or a | Established; i.e. before a Ready<> event on that Connection, or a | |||
ConnectionReceived<> or RendezvousDone<> containing that | ConnectionReceived<> or RendezvousDone<> containing that | |||
Connection. | Connection. | |||
o 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 InitiateError<> or ConnectionError<> on | after a Closed<> event, an InitiateError<> or ConnectionError<> on | |||
that connection. To ensure this ordering, Closed<> will not occur | that connection. To ensure this ordering, Closed<> will not occur | |||
on a Connection while other events on the Connection are still | on a Connection while other events on the Connection are still | |||
locally outstanding (i.e., known to the interface and waiting to | locally outstanding (i.e., known to the interface and waiting to | |||
be dealt with by the application). ConnectionError<> may occur | be dealt with by the application). ConnectionError<> may occur | |||
after Closed<>, but the interface must gracefully handle all cases | after Closed<>, but the interface must gracefully handle all cases | |||
where application ignores these errors. | where application ignores these errors. | |||
14. IANA Considerations | 13. IANA Considerations | |||
RFC-EDITOR: Please remove this section before publication. | RFC-EDITOR: Please remove this section before publication. | |||
This document has no Actions for IANA. Later versions of this | This document has no Actions for IANA. Later versions of this | |||
document may create IANA registries for generic transport property | document may create IANA registries for generic transport property | |||
names and transport property namespaces (see Section 4.2.1). | names and transport property namespaces (see Section 4.2.1). | |||
15. Security Considerations | 14. Security Considerations | |||
This document describes a generic API for interacting with a | This document describes a generic API for interacting with a | |||
transport services (TAPS) system. Part of this API includes | transport services (TAPS) system. Part of this API includes | |||
configuration details for transport security protocols, as discussed | configuration details for transport security protocols, as discussed | |||
in Section 5.3. It does not recommend use (or disuse) of specific | in Section 5.3. It does not recommend use (or disuse) of specific | |||
algorithms or protocols. Any API-compatible transport security | algorithms or protocols. Any API-compatible transport security | |||
protocol should work in a TAPS system. | protocol should work in a TAPS system. Security consideration for | |||
these protocols should be discussed in the respective specifications. | ||||
16. Acknowledgements | The desribed API is used to exchange information between an | |||
application and the transport system. While it is not necessarily | ||||
expected that both systems are implemented by the same authority, it | ||||
is expected that the transport system implementation is either | ||||
provided as a library that is selected by the application from a | ||||
trusted party, or that it is part of the operating system that the | ||||
application also relies on for other tasks. | ||||
In either case, the TAPS API is an internal interface that is used to | ||||
change information locally between two systems. However, as the | ||||
transport system is responsible for network communication, it is in | ||||
the position to potentially share any information provided by the | ||||
application with the network or another communication peer. Most of | ||||
the information provided over the TAPS API are useful to configure | ||||
and select protocols and paths and are not necessarily privacy | ||||
sensitive. Still, there is some information that could be privacy | ||||
sensitve because this might reveal usage characteristics and habits | ||||
of the user of an application. | ||||
Of course any communication over a network reveals usage | ||||
characteristics, as all packets as well as their timing and size are | ||||
part of the network-visible wire image [RFC8546]. However, the | ||||
selection of a protocol and its configuration also impacts which | ||||
information is visible, potentially in clear text, and which other | ||||
enties can access it. In most cases information that is provided for | ||||
protocol and path selection should not directly translate to | ||||
information that is can be observed by network devices on the path. | ||||
But there might be specific configuration information that are | ||||
intended for path exposure, such as e.g. a DiffServ codepoint | ||||
setting, that is either povided directly by the application or | ||||
indirectly configured over a traffic profile. | ||||
Further, applications should be aware that communication attempts can | ||||
lead to more than one connection establishment. This is for example | ||||
the case when the transport system also excecutes name resolution; or | ||||
when support mechanisms such as TURN or ICE are used to establish | ||||
connectivity; or if protocols or paths are raised; or if a path fails | ||||
and fallback or re-establishment is supported in the transport | ||||
system. | ||||
These communication activities are not different from what is used | ||||
today, however, the goal of a TAPS transport 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 system but at the same | ||||
time may reduce transparency of the underlying communication actions | ||||
to the application itself. The TAPS API is designed such that | ||||
protocol and path selection can be limited to a small and controlled | ||||
set if required by the application for functional or security | ||||
purposes. Further, TAPS implementations should provide an interface | ||||
to poll information about which protocol and path is currently in use | ||||
as well as provide logging about the communication events of each | ||||
connection. | ||||
15. Acknowledgements | ||||
This work has received funding from the European Union's Horizon 2020 | This work has received funding from the European Union's Horizon 2020 | |||
research and innovation programme under grant agreements No. 644334 | research and innovation programme under grant agreements No. 644334 | |||
(NEAT) and No. 688421 (MAMI). | (NEAT) and No. 688421 (MAMI). | |||
This work has been supported by Leibniz Prize project funds of DFG - | This work has been supported by Leibniz Prize project funds of DFG - | |||
German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ | German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ | |||
FE 570/4-1). | FE 570/4-1). | |||
This work has been supported by the UK Engineering and Physical | This work has been supported by the UK Engineering and Physical | |||
Sciences Research Council under grant EP/R04144X/1. | Sciences Research Council under grant EP/R04144X/1. | |||
This work has been supported by the Research Council of Norway under | This work has been supported by the Research Council of Norway under | |||
its "Toppforsk" programme through the "OCARINA" project. | its "Toppforsk" programme through the "OCARINA" project. | |||
Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | Thanks to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric | |||
Kinnear for their implementation and design efforts, including Happy | Kinnear for their implementation and design efforts, including Happy | |||
Eyeballs, that heavily influenced this work. Thanks to Laurent Chuat | Eyeballs, that heavily influenced this work. Thanks to Laurent Chuat | |||
and Jason Lee for initial work on the Post Sockets interface, from | and Jason Lee for initial work on the Post Sockets interface, from | |||
which this work has evolved. | which this work has evolved. Thanks to Maximilian Franke for asking | |||
good questions based on implementation experience and for | ||||
contributing text, e.g., on multicast. | ||||
17. References | 16. References | |||
17.1. Normative References | 16.1. Normative References | |||
[I-D.ietf-taps-arch] | [I-D.ietf-taps-arch] | |||
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., | Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., | |||
Perkins, C., Tiesel, P., and C. Wood, "An Architecture for | Perkins, C., Tiesel, P., and C. Wood, "An Architecture for | |||
Transport Services", draft-ietf-taps-arch-04 (work in | Transport Services", Work in Progress, Internet-Draft, | |||
progress), July 2019. | draft-ietf-taps-arch-06, 23 December 2019, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-taps-arch- | ||||
[I-D.ietf-tsvwg-rtcweb-qos] | 06.txt>. | |||
Jones, P., Dhesikan, S., Jennings, C., and D. Druta, "DSCP | ||||
Packet Markings for WebRTC QoS", draft-ietf-tsvwg-rtcweb- | ||||
qos-18 (work in progress), August 2016. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC4941] Narten, T., Draves, R., and S. Krishnan, "Privacy | ||||
Extensions for Stateless Address Autoconfiguration in | ||||
IPv6", RFC 4941, DOI 10.17487/RFC4941, September 2007, | ||||
<https://www.rfc-editor.org/info/rfc4941>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | [RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | |||
Transport Features Provided by IETF Transport Protocols", | Transport Features Provided by IETF Transport Protocols", | |||
RFC 8303, DOI 10.17487/RFC8303, February 2018, | RFC 8303, DOI 10.17487/RFC8303, February 2018, | |||
<https://www.rfc-editor.org/info/rfc8303>. | <https://www.rfc-editor.org/info/rfc8303>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
17.2. Informative References | 16.2. Informative References | |||
[I-D.ietf-taps-impl] | [I-D.ietf-taps-impl] | |||
Brunstrom, A., Pauly, T., Enghardt, T., Grinnemo, K., | Brunstrom, A., Pauly, T., Enghardt, T., Grinnemo, K., | |||
Jones, T., Tiesel, P., Perkins, C., and M. Welzl, | Jones, T., Tiesel, P., Perkins, C., and M. Welzl, | |||
"Implementing Interfaces to Transport Services", draft- | "Implementing Interfaces to Transport Services", Work in | |||
ietf-taps-impl-04 (work in progress), July 2019. | Progress, Internet-Draft, draft-ietf-taps-impl-05, 4 | |||
November 2019, <http://www.ietf.org/internet-drafts/draft- | ||||
ietf-taps-impl-05.txt>. | ||||
[I-D.ietf-taps-minset] | [I-D.ietf-taps-minset] | |||
Welzl, M. and S. Gjessing, "A Minimal Set of Transport | Welzl, M. and S. Gjessing, "A Minimal Set of Transport | |||
Services for End Systems", draft-ietf-taps-minset-11 (work | Services for End Systems", Work in Progress, Internet- | |||
in progress), September 2018. | Draft, draft-ietf-taps-minset-11, 27 September 2018, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-taps- | ||||
minset-11.txt>. | ||||
[I-D.ietf-taps-transport-security] | [I-D.ietf-taps-transport-security] | |||
Wood, C., Enghardt, T., Pauly, T., Perkins, C., and K. | Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | |||
Rose, "A Survey of Transport Security Protocols", draft- | Wood, "A Survey of the Interaction Between Security | |||
ietf-taps-transport-security-09 (work in progress), | Protocols and Transport Services", Work in Progress, | |||
September 2019. | Internet-Draft, draft-ietf-taps-transport-security-11, 5 | |||
March 2020, <http://www.ietf.org/internet-drafts/draft- | ||||
[LE-PHB] Bless, R., "A Lower Effort Per-Hop Behavior (LE PHB) for | ietf-taps-transport-security-11.txt>. | |||
Differentiated Services", draft-ietf-tsvwg-le-phb-10 (work | ||||
in progress), March 2019. | ||||
[PROTOCOL-WARS] | ||||
Computer History Museum, ., "Protocol Wars (Revolution - | ||||
The First 2000 Years of Computing)", 2019, | ||||
<https://www.computerhistory.org/revolution/ | ||||
networking/19/376>. | ||||
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [I-D.ietf-tsvwg-datagram-plpmtud] | |||
RFC 793, DOI 10.17487/RFC0793, September 1981, | Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | |||
<https://www.rfc-editor.org/info/rfc793>. | T. Voelker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", Work in Progress, Internet-Draft, | ||||
draft-ietf-tsvwg-datagram-plpmtud-15, 24 February 2020, | ||||
<http://www.ietf.org/internet-drafts/draft-ietf-tsvwg- | ||||
datagram-plpmtud-15.txt>. | ||||
[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | |||
"Definition of the Differentiated Services Field (DS | "Definition of the Differentiated Services Field (DS | |||
Field) in the IPv4 and IPv6 Headers", RFC 2474, | Field) in the IPv4 and IPv6 Headers", RFC 2474, | |||
DOI 10.17487/RFC2474, December 1998, | DOI 10.17487/RFC2474, December 1998, | |||
<https://www.rfc-editor.org/info/rfc2474>. | <https://www.rfc-editor.org/info/rfc2474>. | |||
[RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | [RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | |||
"Assured Forwarding PHB Group", RFC 2597, | "Assured Forwarding PHB Group", RFC 2597, | |||
DOI 10.17487/RFC2597, June 1999, | DOI 10.17487/RFC2597, June 1999, | |||
<https://www.rfc-editor.org/info/rfc2597>. | <https://www.rfc-editor.org/info/rfc2597>. | |||
[RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | [RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | |||
RFC 2914, DOI 10.17487/RFC2914, September 2000, | RFC 2914, DOI 10.17487/RFC2914, September 2000, | |||
<https://www.rfc-editor.org/info/rfc2914>. | <https://www.rfc-editor.org/info/rfc2914>. | |||
[RFC3246] Davie, B., Charny, A., Bennet, J., Benson, K., Le Boudec, | [RFC3246] Davie, B., Charny, A., Bennet, J.C.R., Benson, K., Le | |||
J., 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/info/rfc3246>. | <https://www.rfc-editor.org/info/rfc3246>. | |||
[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | |||
A., Peterson, J., Sparks, R., Handley, M., and E. | A., Peterson, J., Sparks, R., Handley, M., and E. | |||
Schooler, "SIP: Session Initiation Protocol", RFC 3261, | Schooler, "SIP: Session Initiation Protocol", RFC 3261, | |||
DOI 10.17487/RFC3261, June 2002, | DOI 10.17487/RFC3261, June 2002, | |||
<https://www.rfc-editor.org/info/rfc3261>. | <https://www.rfc-editor.org/info/rfc3261>. | |||
skipping to change at page 55, line 47 ¶ | skipping to change at page 61, line 39 ¶ | |||
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/info/rfc4594>. | <https://www.rfc-editor.org/info/rfc4594>. | |||
[RFC5245] Rosenberg, J., "Interactive Connectivity Establishment | [RFC5245] Rosenberg, J., "Interactive Connectivity Establishment | |||
(ICE): A Protocol for Network Address Translator (NAT) | (ICE): A Protocol for Network Address Translator (NAT) | |||
Traversal for Offer/Answer Protocols", RFC 5245, | Traversal for Offer/Answer Protocols", RFC 5245, | |||
DOI 10.17487/RFC5245, April 2010, | DOI 10.17487/RFC5245, April 2010, | |||
<https://www.rfc-editor.org/info/rfc5245>. | <https://www.rfc-editor.org/info/rfc5245>. | |||
[RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", | ||||
RFC 5482, DOI 10.17487/RFC5482, March 2009, | ||||
<https://www.rfc-editor.org/info/rfc5482>. | ||||
[RFC5865] Baker, F., Polk, J., and M. Dolly, "A Differentiated | ||||
Services Code Point (DSCP) for Capacity-Admitted Traffic", | ||||
RFC 5865, DOI 10.17487/RFC5865, May 2010, | ||||
<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/info/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/info/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 | |||
skipping to change at page 56, line 30 ¶ | skipping to change at page 62, line 30 ¶ | |||
Congestion Control Mechanisms", RFC 8095, | Congestion Control Mechanisms", RFC 8095, | |||
DOI 10.17487/RFC8095, March 2017, | DOI 10.17487/RFC8095, March 2017, | |||
<https://www.rfc-editor.org/info/rfc8095>. | <https://www.rfc-editor.org/info/rfc8095>. | |||
[RFC8260] Stewart, R., Tuexen, M., Loreto, S., and R. Seggelmann, | [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/info/rfc8260>. | <https://www.rfc-editor.org/info/rfc8260>. | |||
Appendix A. Convenience Functions | [RFC8546] Trammell, B. and M. Kuehlewind, "The Wire Image of a | |||
Network Protocol", RFC 8546, DOI 10.17487/RFC8546, April | ||||
2019, <https://www.rfc-editor.org/info/rfc8546>. | ||||
[RFC8622] Bless, R., "A Lower-Effort Per-Hop Behavior (LE PHB) for | ||||
Differentiated Services", RFC 8622, DOI 10.17487/RFC8622, | ||||
June 2019, <https://www.rfc-editor.org/info/rfc8622>. | ||||
[RFC8699] Islam, S., Welzl, M., and S. Gjessing, "Coupled Congestion | ||||
Control for RTP Media", RFC 8699, DOI 10.17487/RFC8699, | ||||
January 2020, <https://www.rfc-editor.org/info/rfc8699>. | ||||
[TCP-COUPLING] | ||||
"ctrlTCP: Reducing Latency through Coupled, Heterogeneous | ||||
Multi-Flow TCP Congestion Control", IEEE INFOCOM Global | ||||
Internet Symposium (GI) workshop (GI 2018) , 15 April | ||||
2018. | ||||
Appendix A. Convenience Functions | ||||
A.1. Adding Preference Properties | A.1. Adding Preference Properties | |||
As Selection Properties of type Preference will be added to a | As Selection Properties of type "Preference" will be added to a | |||
TransportProperties object quite frequently, implementations should | TransportProperties object quite frequently, implementations should | |||
provide special actions for adding each preference level i.e, | provide special actions for adding each preference level i.e, | |||
"TransportProperties.Add(some_property, avoid)" is equivalent to | "TransportProperties.Add(some_property, avoid)" is equivalent to | |||
"TransportProperties.Avoid(some_property)": | "TransportProperties.Avoid(some_property)": | |||
TransportProperties.Require(property) | TransportProperties.Require(property) | |||
TransportProperties.Prefer(property) | TransportProperties.Prefer(property) | |||
TransportProperties.Ignore(property) | TransportProperties.Ignore(property) | |||
TransportProperties.Avoid(property) | TransportProperties.Avoid(property) | |||
TransportProperties.Prohibit(property) | TransportProperties.Prohibit(property) | |||
TransportProperties.Default(property) | TransportProperties.Default(property) | |||
A.2. Transport Property Profiles | A.2. Transport Property Profiles | |||
To ease the use of the interface specified by this document, | To ease the use of the interface specified by this document, | |||
implementations should provide a mechanism to create Transport | implementations should provide a mechanism to create Transport | |||
Property objects (see Section 5.2) that are pre-configured with | Property objects (see Section 5.2) that are pre-configured with | |||
frequently used sets of properties. Implementations should at least | frequently used sets of properties. Implementations should at least | |||
short-hands to specify the following property profiles: | offer short-hands to specify the following property profiles: | |||
A.2.1. reliable-inorder-stream | A.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. An example of a protocol that provides this | congestion control. An example of a protocol that provides this | |||
service is TCP. It should consist of the following properties: | service is TCP. It should consist of the following properties: | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+-------------------------+---------+ | +=========================+=========+ | |||
| reliability | require | | | reliability | require | | |||
| | | | +-------------------------+---------+ | |||
| preserve-order | require | | | preserve-order | require | | |||
| | | | +-------------------------+---------+ | |||
| congestion-control | require | | | congestion-control | require | | |||
| | | | +-------------------------+---------+ | |||
| preserve-msg-boundaries | ignore | | | preserve-msg-boundaries | ignore | | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
Table 2 | ||||
A.2.2. reliable-message | A.2.2. reliable-message | |||
This profile provides message-preserving, reliable, in-order | This profile provides message-preserving, reliable, in-order | |||
transport service with congestion control. An example of a protocol | transport service with congestion control. An example of a protocol | |||
that provides this service is SCTP. It should consist of the | that provides this service is SCTP. It should consist of the | |||
following properties: | following properties: | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+-------------------------+---------+ | +=========================+=========+ | |||
| reliability | require | | | reliability | require | | |||
| | | | +-------------------------+---------+ | |||
| preserve-order | require | | | preserve-order | require | | |||
| | | | +-------------------------+---------+ | |||
| congestion-control | require | | | congestion-control | require | | |||
| | | | +-------------------------+---------+ | |||
| preserve-msg-boundaries | require | | | preserve-msg-boundaries | require | | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
Table 3 | ||||
A.2.3. unreliable-datagram | A.2.3. unreliable-datagram | |||
This profile provides unreliable datagram transport service. An | This profile provides unreliable datagram transport service. An | |||
example of a protocol that provides this service is UDP. It should | example of a protocol that provides this service is UDP. It should | |||
consist of the following properties: | consist of the following properties: | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
| Property | Value | | | Property | Value | | |||
+-------------------------+---------+ | +=========================+=========+ | |||
| reliability | ignore | | | reliability | ignore | | |||
| | | | +-------------------------+---------+ | |||
| preserve-order | ignore | | | preserve-order | ignore | | |||
| | | | +-------------------------+---------+ | |||
| congestion-control | ignore | | | congestion-control | ignore | | |||
| | | | +-------------------------+---------+ | |||
| preserve-msg-boundaries | require | | | preserve-msg-boundaries | require | | |||
| | | | +-------------------------+---------+ | |||
| idempotent | true | | | idempotent | true | | |||
+-------------------------+---------+ | +-------------------------+---------+ | |||
Table 4 | ||||
Applications that choose this Transport Property Profile for latency | Applications that choose this Transport Property Profile for latency | |||
reasons should also consider setting the Capacity Profile Property, | reasons should also consider setting the Capacity Profile Property, | |||
see Section 11.1.10 accordingly and my benefit from controlling | see Section 10.1.6 accordingly and my benefit from controlling | |||
checksum coverage, see Section 5.2.7 and Section 5.2.8. | checksum coverage, see Section 5.2.7 and Section 5.2.8. | |||
Appendix B. Additional Properties | Appendix B. Relationship to the Minimal Set of Transport Services for | |||
The interface specified by this document represents the minimal | ||||
common interface to an endpoint in the transport services | ||||
architecture [I-D.ietf-taps-arch], based upon that architecture and | ||||
on the minimal set of transport service features elaborated in | ||||
[I-D.ietf-taps-minset]. However, the interface has been designed | ||||
with extension points to allow the implementation of features beyond | ||||
those in the minimal common interface: Protocol Selection Properties, | ||||
Path Selection Properties, and Message Properties are open sets. | ||||
Implementations of the interface are free to extend these sets to | ||||
provide additional expressiveness to applications written on top of | ||||
them. | ||||
This appendix enumerates a few additional properties that could be | ||||
used to enhance transport protocol and/or path selection, or the | ||||
transmission of messages given a Protocol Stack that implements them. | ||||
These are not part of the interface, and may be removed from the | ||||
final document, but are presented here to support discussion within | ||||
the TAPS working group as to whether they should be added to a future | ||||
revision of the base specification. | ||||
B.1. Experimental Transport Properties | ||||
The following Transport Properties might be made available in | ||||
addition to those specified in Section 5.2, Section 11.1, and | ||||
Section 7.4. | ||||
B.1.1. Cost Preferences | ||||
[EDITOR'S NOTE: At IETF 103, opinions were that this property should | ||||
stay, but it was also said that this is maybe not "on the right | ||||
level". If / when moving it to the main text, note that this is | ||||
meant to be applicable to a Preconnection or a Message.] | ||||
Name: cost-preferences | ||||
Type: Enumeration | ||||
This property describes what an application prefers regarding | ||||
monetary costs, e.g., whether it considers it acceptable to utilize | ||||
limited data volume. It provides hints to the transport system on | ||||
how to handle trade-offs between cost and performance or reliability. | ||||
Possible values are: | ||||
No Expense: Avoid transports associated with monetary cost | ||||
Optimize Cost: Prefer inexpensive transports and accept service | ||||
degradation | ||||
Balance Cost: Use system policy to balance cost and other criteria | ||||
Ignore Cost: Ignore cost, choose transport solely based on other | ||||
criteria | ||||
The default is "Balance Cost". | ||||
Appendix C. Sample API definition in Go | ||||
This document defines an abstract interface. To illustrate how this | ||||
would map concretely into a programming language, an API interface | ||||
definition in Go is available online at https://github.com/mami- | ||||
project/postsocket. Documentation for this API - an illustration of | ||||
the documentation an application developer would see for an instance | ||||
of this interface - is available online at | ||||
https://godoc.org/github.com/mami-project/postsocket. This API | ||||
definition will be kept largely in sync with the development of this | ||||
abstract interface definition. | ||||
Appendix D. Relationship to the Minimal Set of Transport Services for | ||||
End Systems | End Systems | |||
[I-D.ietf-taps-minset] identifies a minimal set of transport services | [I-D.ietf-taps-minset] identifies a minimal set of transport services | |||
that end systems should offer. These services make all non-security- | that end systems should offer. These services make all non-security- | |||
related transport features of TCP, MPTCP, UDP, UDP-Lite, SCTP and | related transport features of TCP, MPTCP, UDP, UDP-Lite, SCTP and | |||
LEDBAT available that 1) require interaction with the application, | LEDBAT available that 1) require interaction with the application, | |||
and 2) do not get in the way of a possible implementation over TCP | and 2) do not get in the way of a possible implementation over TCP | |||
(or, with limitations, UDP). The following text explains how this | (or, with limitations, UDP). The following text explains how this | |||
minimal set is reflected in the present API. For brevity, it is | minimal set is reflected in the present API. For brevity, it is | |||
based on the list in Section 4.1 of [I-D.ietf-taps-minset], updated | based on the list in Section 4.1 of [I-D.ietf-taps-minset], updated | |||
according to the discussion in Section 5 of [I-D.ietf-taps-minset]. | according to the discussion in Section 5 of [I-D.ietf-taps-minset]. | |||
This list is a subset of the transport features in Appendix A of | This list is a subset of the transport features in Appendix A of | |||
[I-D.ietf-taps-minset], which refers to the primitives in "pass 2" | [I-D.ietf-taps-minset], which refers to the primitives in "pass 2" | |||
(Section 4) of [RFC8303] for further details on the implementation | (Section 4) of [RFC8303] for further details on the implementation | |||
with TCP, MPTCP, UDP, UDP-Lite, SCTP and LEDBAT. | with TCP, MPTCP, UDP, UDP-Lite, SCTP and LEDBAT. | |||
[EDITOR'S NOTE: This is early text. In the future, this section will | * Connect: "Initiate" Action (Section 6.1). | |||
contain backward references, which we currently avoid because things | ||||
are still being moved around and names / categories etc. are | ||||
changing.] | ||||
o Connect: "Initiate" Action. | ||||
o Listen: "Listen" Action. | * Listen: "Listen" Action (Section 6.2). | |||
o 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" or | establishment message: "timeout" parameter of "Initiate" | |||
"InitiateWithSend" Action. | (Section 6.1) or "InitiateWithSend" Action (Section 7.8). | |||
o Disable MPTCP: "Parallel Use of Multiple Paths" Property. | * Disable MPTCP: "Parallel Use of Multiple Paths" Property | |||
(Section 5.2.13). | ||||
o Hand over a message to reliably transfer (possibly multiple times) | * Hand over a message to reliably transfer (possibly multiple times) | |||
before connection establishment: "InitiateWithSend" Action. | before connection establishment: "InitiateWithSend" Action | |||
(Section 7.8). | ||||
o Change timeout for aborting connection (using retransmit limit or | * Change timeout for aborting connection (using retransmit limit or | |||
time value): "Timeout for Aborting Connection" property, using a | time value): "Timeout for Aborting Connection" property, using a | |||
time value. | time value (Section 10.1.4). | |||
o Timeout event when data could not be delivered for too long: | * Timeout event when data could not be delivered for too long: | |||
"ConnectionError" Event. | "ConnectionError" Event (Section 11). | |||
o Suggest timeout to the peer: "TCP-specific Property: User | * Suggest timeout to the peer: "TCP-specific Property: User Timeout" | |||
Timeout". | (Section 10.2). | |||
o Notification of Excessive Retransmissions (early warning below | * Notification of Excessive Retransmissions (early warning below | |||
abortion threshold): "Notification of excessive retransmissions" | abortion threshold): "Notification of excessive retransmissions" | |||
property. | property (Section 5.2.15). | |||
o Notification of ICMP error message arrival: "Notification of ICMP | * Notification of ICMP error message arrival: "Notification of ICMP | |||
soft error message arrival" property. | soft error message arrival" property (Section 5.2.16). | |||
o Choose a scheduler to operate between streams of an association: | * Choose a scheduler to operate between streams of an association: | |||
"Connection Group Transmission Scheduler" property. | "Connection Group Transmission Scheduler" property | |||
(Section 10.1.5). | ||||
o Configure priority or weight for a scheduler: "Priority | * Configure priority or weight for a scheduler: "Priority | |||
(Connection)" property. | (Connection)" property (Section 10.1.3). | |||
o "Specify checksum coverage used by the sender" and "Disable | * "Specify checksum coverage used by the sender" and "Disable | |||
checksum when sending": "Corruption Protection Length" property | checksum when sending": "Corruption Protection Length" property | |||
and "Full Checksum Coverage on Sending" property. | (Section 7.5.6) and "Full Checksum Coverage on Sending" property | |||
(Section 5.2.7). | ||||
o "Specify minimum checksum coverage required by receiver" and | * "Specify minimum checksum coverage required by receiver" and | |||
"Disable checksum requirement when receiving": "Required Minimum | "Disable checksum requirement when receiving": "Required Minimum | |||
Corruption Protection Coverage for Receiving" property and "Full | Corruption Protection Coverage for Receiving" property | |||
Checksum Coverage on Receiving" property. | (Section 10.1.2) and "Full Checksum Coverage on Receiving" | |||
property (Section 5.2.8). | ||||
o "Specify DF" field and "Request not to bundle messages:" The | * "Specify DF" field and "Request not to bundle messages": the | |||
"Singular Transmission" Message property combines both of these | "Singular Transmission" Message Property combines both of these | |||
requests, i.e. if a request not to bundle messages is made, this | requests, i.e. if a request not to bundle messages is made, this | |||
also turns off DF in case of protocols that allow this (only UDP | also turns off fragmentation (i.e., sets DF=1) in case of | |||
and UDP-Lite, which cannot bundle messages anyway). | protocols that allow this (only UDP and UDP-Lite, which cannot | |||
bundle messages anyway) (Section 7.5.9). | ||||
o Get max. transport-message size that may be sent using a non- | * Get max. transport-message size that may be sent using a non- | |||
fragmented IP packet from the configured interface: "Maximum | fragmented IP packet from the configured interface: "Maximum | |||
Message Size Before Fragmentation or Segmentation" property. | Message Size Before Fragmentation or Segmentation" property | |||
(Section 10.1.8.2). | ||||
o Get max. transport-message size that may be received from the | * Get max. transport-message size that may be received from the | |||
configured interface: "Maximum Message Size on Receive" property. | configured interface: "Maximum Message Size on Receive" property | |||
(Section 10.1.8.4). | ||||
o Obtain ECN field: "ECN" is a defined read-only Message Property of | * Obtain ECN field: "ECN" is a defined UDP(-Lite)-specific read-only | |||
the MessageContext object. | Message Property of the MessageContext object (Section 8.3.1). | |||
o "Specify DSCP field", "Disable Nagle algorithm", "Enable and | * "Specify DSCP field", "Disable Nagle algorithm", "Enable and | |||
configure a 'Low Extra Delay Background Transfer'": As suggested | configure a 'Low Extra Delay Background Transfer'": as suggested | |||
in Section 5.5 of [I-D.ietf-taps-minset], these transport features | in Section 5.5 of [I-D.ietf-taps-minset], these transport features | |||
are collectively offered via the "Capacity Profile" property. | are collectively offered via the "Capacity Profile" property | |||
(Section 10.1.6). Per-Message control is offered via the "Message | ||||
Capacity Profile Override" property (Section 7.5.8). | ||||
o 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 [I-D.ietf-taps-minset]. | the discussion in Section 5.2 of [I-D.ietf-taps-minset] | |||
(Section 11). | ||||
o "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": this is offered by the "Abort" | |||
action without promising that this is signaled to the other side. | action without promising that this is signaled to the other side. | |||
If it is, a "ConnectionError" Event will fire at the peer. | If it is, a "ConnectionError" Event will fire at the peer | |||
(Section 11). | ||||
o "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 tranferred via the "Send" action. | transfer a message": data is transferred via the "Send" action | |||
(Section 7). Reliability is controlled via the "Reliable Data | ||||
Reliability is controlled via the "Reliable Data Transfer | Transfer (Connection)" (Section 5.2.1) property and the "Reliable | |||
(Message)" Message property. Transmitting data as a message or | Data Transfer (Message)" Message Property (Section 7.5.7). | |||
without delimiters is controlled via Message Framers. The choice | Transmitting data as a message or without delimiters is controlled | |||
of congestion control is provided via the "Congestion control" | via Message Framers (Section 9). The choice of congestion control | |||
property. | is provided via the "Congestion control" property (Section 5.2.9). | |||
o Configurable Message Reliability: The "Lifetime" Message Property | * Configurable Message Reliability: the "Lifetime" Message Property | |||
implements a time-based way to configure message reliability. | implements a time-based way to configure message reliability | |||
(Section 7.5.1). | ||||
o "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)": | |||
The two transport features are controlled via the Message Property | these two transport features are controlled via the Message | |||
"Ordered". | Property "Ordered" (Section 7.5.3). | |||
o Request not to delay the acknowledgement (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 system can use when an application uses the | features the transport system can apply when an application uses | |||
"Capacity Profile" Property with value "Low Latency/Interactive". | the "Capacity Profile" Property (Section 10.1.6) or the "Message | |||
Capacity Profile Override" Message Property (Section 7.5.8) with | ||||
value "Low Latency/Interactive". | ||||
o Receive data (with no message delimiting): "Received" Event | * Receive data (with no message delimiting): "Received" Event | |||
without using a Message Framer. | (Section 8.2.1). See Section 9 for handling Message framing in | |||
situations where the Protocol Stack only provides a byte-stream | ||||
transport. | ||||
o Receive a message: "Received" Event, using Message Framers. | * Receive a message: "Received" Event (Section 8.2.1), using Message | |||
Framers (Section 9). | ||||
o Information about partial message arrival: "ReceivedPartial" | * Information about partial message arrival: "ReceivedPartial" Event | |||
Event. | (Section 8.2.2). | |||
o Notification of send failures: "Expired" and "SendError" Events. | * Notification of send failures: "Expired" Event (Section 7.3.2) and | |||
"SendError" Event (Section 7.3.3). | ||||
o 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 7.3.1). | ||||
o Notification to a receiver that a partial message delivery has | * Notification to a receiver that a partial message delivery has | |||
been aborted: "ReceiveError" Event. | been aborted: "ReceiveError" Event (Section 8.2.3). | |||
Authors' Addresses | Authors' Addresses | |||
Brian Trammell (editor) | Brian Trammell (editor) | |||
Gustav-Gull-Platz 1 | Gustav-Gull-Platz 1 | |||
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 | |||
Theresa Enghardt | Theresa Enghardt | |||
TU Berlin | TU Berlin | |||
skipping to change at page 63, line 24 ¶ | skipping to change at page 68, line 45 ¶ | |||
Marchstrasse 23 | Marchstrasse 23 | |||
10587 Berlin | 10587 Berlin | |||
Germany | Germany | |||
Email: theresa@inet.tu-berlin.de | Email: theresa@inet.tu-berlin.de | |||
Godred Fairhurst | Godred Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
Fraser Noble Building | Fraser Noble Building | |||
Aberdeen, AB24 3UE | Aberdeen, AB24 3UE | |||
Scotland | ||||
Email: gorry@erg.abdn.ac.uk | Email: gorry@erg.abdn.ac.uk | |||
URI: http://www.erg.abdn.ac.uk/ | URI: http://www.erg.abdn.ac.uk/ | |||
Mirja Kuehlewind | Mirja Kuehlewind | |||
ETH Zurich | Ericsson | |||
Gloriastrasse 35 | Ericsson-Allee 1 | |||
8092 Zurich | Herzogenrath | |||
Switzerland | Germany | |||
Email: mirja.kuehlewind@tik.ee.ethz.ch | Email: mirja.kuehlewind@ericsson.com | |||
Colin Perkins | Colin Perkins | |||
University of Glasgow | University of Glasgow | |||
School of Computing Science | School of Computing Science | |||
Glasgow G12 8QQ | Glasgow G12 8QQ | |||
United Kingdom | United Kingdom | |||
Email: csp@csperkins.org | Email: csp@csperkins.org | |||
Philipp S. Tiesel | Philipp S. Tiesel | |||
TU Berlin | TU Berlin | |||
Einsteinufer 25 | Einsteinufer 25 | |||
10587 Berlin | 10587 Berlin | |||
Germany | Germany | |||
Email: philipp@tiesel.net | Email: philipp@tiesel.net | |||
Chris Wood | Chris Wood | |||
Apple Inc. | Apple Inc. | |||
skipping to change at page 64, line 15 ¶ | skipping to change at page 69, line 31 ¶ | |||
TU Berlin | TU Berlin | |||
Einsteinufer 25 | Einsteinufer 25 | |||
10587 Berlin | 10587 Berlin | |||
Germany | Germany | |||
Email: philipp@tiesel.net | Email: philipp@tiesel.net | |||
Chris Wood | Chris Wood | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014 | Cupertino, California 95014, | |||
United States of America | United States of America | |||
Email: cawood@apple.com | Email: cawood@apple.com | |||
Tommy Pauly | Tommy Pauly | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014 | Cupertino, California 95014, | |||
United States of America | United States of America | |||
Email: tpauly@apple.com | Email: tpauly@apple.com | |||
End of changes. 360 change blocks. | ||||
848 lines changed or deleted | 1093 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |