draft-ietf-taps-interface-06.txt | draft-ietf-taps-interface-07.txt | |||
---|---|---|---|---|
TAPS Working Group B. Trammell, Ed. | TAPS Working Group B. Trammell, Ed. | |||
Internet-Draft Google | Internet-Draft Google Switzerland GmbH | |||
Intended status: Standards Track M. Welzl, Ed. | Intended status: Standards Track M. Welzl, Ed. | |||
Expires: 10 September 2020 University of Oslo | Expires: 14 January 2021 University of Oslo | |||
T. Enghardt | T. Enghardt | |||
TU Berlin | Netflix | |||
G. Fairhurst | G. Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
M. Kuehlewind | M. Kuehlewind | |||
Ericsson | Ericsson | |||
C. Perkins | C. Perkins | |||
University of Glasgow | University of Glasgow | |||
P. Tiesel | P. Tiesel | |||
TU Berlin | TU Berlin | |||
C. Wood | C.A. Wood | |||
Cloudflare | ||||
T. Pauly | T. Pauly | |||
Apple Inc. | Apple Inc. | |||
9 March 2020 | 13 July 2020 | |||
An Abstract Application Layer Interface to Transport Services | An Abstract Application Layer Interface to Transport Services | |||
draft-ietf-taps-interface-06 | draft-ietf-taps-interface-07 | |||
Abstract | Abstract | |||
This document describes an abstract programming interface to the | This document describes an abstract application programming | |||
transport layer, following the Transport Services Architecture. It | interface, API, to the transport layer, following the Transport | |||
supports the asynchronous, atomic transmission of messages over | Services Architecture. It supports the asynchronous, atomic | |||
transport protocols and network paths dynamically selected at | transmission of messages over transport protocols and network paths | |||
runtime. It is intended to replace the traditional BSD sockets API | dynamically selected at runtime. It is intended to replace the | |||
as the lowest common denominator interface to the transport layer, in | traditional BSD sockets API as the common interface to the transport | |||
an environment where endpoints have multiple interfaces and potential | layer, in an environment where endpoints could select from multiple | |||
transport protocols to select from. | interfaces and potential transport protocols. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
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 10 September 2020. | ||||
This Internet-Draft will expire on 14 January 2021. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 | 2. Terminology and Notation . . . . . . . . . . . . . . . . . . 5 | |||
3. Overview of Interface Design . . . . . . . . . . . . . . . . 6 | 3. Overview of Interface Design . . . . . . . . . . . . . . . . 7 | |||
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 . . . . . . . . . . . . . . . . . . . 9 | |||
4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 9 | 4.1.2. Client Example . . . . . . . . . . . . . . . . . . . 10 | |||
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 . . . . . . . . . . . . 14 | |||
5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 14 | 5. Pre-Establishment Phase . . . . . . . . . . . . . . . . . . . 15 | |||
5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 15 | 5.1. Specifying Endpoints . . . . . . . . . . . . . . . . . . 15 | |||
5.2. Specifying Transport Properties . . . . . . . . . . . . . 17 | 5.2. Specifying Transport Properties . . . . . . . . . . . . . 18 | |||
5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 19 | 5.2.1. Reliable Data Transfer (Connection) . . . . . . . . . 20 | |||
5.2.2. Preservation of Message Boundaries . . . . . . . . . 20 | 5.2.2. Preservation of Message Boundaries . . . . . . . . . 21 | |||
5.2.3. Configure Per-Message Reliability . . . . . . . . . . 20 | 5.2.3. Configure Per-Message Reliability . . . . . . . . . . 21 | |||
5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 20 | 5.2.4. Preservation of Data Ordering . . . . . . . . . . . . 21 | |||
5.2.5. Use 0-RTT Session Establishment with an Idempotent | 5.2.5. Use 0-RTT Session Establishment with a Safely | |||
Message . . . . . . . . . . . . . . . . . . . . . . . 20 | Replayable Message . . . . . . . . . . . . . . . . . 21 | |||
5.2.6. Multistream Connections in Group . . . . . . . . . . 21 | 5.2.6. Multistream Connections in Group . . . . . . . . . . 22 | |||
5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 21 | 5.2.7. Full Checksum Coverage on Sending . . . . . . . . . . 22 | |||
5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 21 | 5.2.8. Full Checksum Coverage on Receiving . . . . . . . . . 22 | |||
5.2.9. Congestion control . . . . . . . . . . . . . . . . . 22 | 5.2.9. Congestion control . . . . . . . . . . . . . . . . . 22 | |||
5.2.10. Interface Instance or Type . . . . . . . . . . . . . 22 | 5.2.10. Interface Instance or Type . . . . . . . . . . . . . 23 | |||
5.2.11. Provisioning Domain Instance or Type . . . . . . . . 23 | 5.2.11. Provisioning Domain Instance or Type . . . . . . . . 24 | |||
5.2.12. Use Temporary Local Address . . . . . . . . . . . . . 24 | 5.2.12. Use Temporary Local Address . . . . . . . . . . . . . 24 | |||
5.2.13. Parallel Use of Multiple Paths . . . . . . . . . . . 24 | 5.2.13. Multi-Paths Transport . . . . . . . . . . . . . . . . 25 | |||
5.2.14. Direction of communication . . . . . . . . . . . . . 25 | 5.2.14. Advertisement of Alternative Addresses . . . . . . . 26 | |||
5.2.15. Notification of excessive retransmissions . . . . . . 25 | 5.2.15. Direction of communication . . . . . . . . . . . . . 26 | |||
5.2.16. Notification of ICMP soft error message arrival . . . 25 | 5.2.16. Notification of excessive retransmissions . . . . . . 27 | |||
5.3. Specifying Security Parameters and Callbacks . . . . . . 26 | 5.2.17. Notification of ICMP soft error message arrival . . . 27 | |||
5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 26 | 5.2.18. Initiating side is not the first to write . . . . . . 27 | |||
5.3.2. Connection Establishment Callbacks . . . . . . . . . 27 | 5.3. Specifying Security Parameters and Callbacks . . . . . . 28 | |||
6. Establishing Connections . . . . . . . . . . . . . . . . . . 28 | 5.3.1. Pre-Connection Parameters . . . . . . . . . . . . . . 28 | |||
6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 28 | 5.3.2. Connection Establishment Callbacks . . . . . . . . . 29 | |||
6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 29 | 6. Establishing Connections . . . . . . . . . . . . . . . . . . 30 | |||
6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 30 | 6.1. Active Open: Initiate . . . . . . . . . . . . . . . . . . 30 | |||
6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 32 | 6.2. Passive Open: Listen . . . . . . . . . . . . . . . . . . 31 | |||
7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.3. Peer-to-Peer Establishment: Rendezvous . . . . . . . . . 32 | |||
7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 34 | 6.4. Connection Groups . . . . . . . . . . . . . . . . . . . . 34 | |||
7.2. Sending Replies . . . . . . . . . . . . . . . . . . . . . 34 | 7. Sending Data . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
7.3. Send Events . . . . . . . . . . . . . . . . . . . . . . . 35 | 7.1. Basic Sending . . . . . . . . . . . . . . . . . . . . . . 36 | |||
7.3.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 35 | 7.2. Sending Replies . . . . . . . . . . . . . . . . . . . . . 36 | |||
7.3.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 35 | 7.3. Send Events . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
7.3.3. SendError . . . . . . . . . . . . . . . . . . . . . . 35 | 7.3.1. Sent . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
7.4. Message Contexts . . . . . . . . . . . . . . . . . . . . 36 | 7.3.2. Expired . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
7.5. Message Properties . . . . . . . . . . . . . . . . . . . 36 | 7.3.3. SendError . . . . . . . . . . . . . . . . . . . . . . 38 | |||
7.5.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 37 | 7.4. Message Contexts . . . . . . . . . . . . . . . . . . . . 38 | |||
7.5.2. Priority . . . . . . . . . . . . . . . . . . . . . . 38 | 7.5. Message Properties . . . . . . . . . . . . . . . . . . . 38 | |||
7.5.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 38 | 7.5.1. Lifetime . . . . . . . . . . . . . . . . . . . . . . 40 | |||
7.5.4. Idempotent . . . . . . . . . . . . . . . . . . . . . 39 | 7.5.2. Priority . . . . . . . . . . . . . . . . . . . . . . 40 | |||
7.5.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 39 | 7.5.3. Ordered . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
7.5.6. Corruption Protection Length . . . . . . . . . . . . 40 | 7.5.4. Safely Replayable . . . . . . . . . . . . . . . . . . 41 | |||
7.5.7. Reliable Data Transfer (Message) . . . . . . . . . . 40 | 7.5.5. Final . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
7.5.8. Message Capacity Profile Override . . . . . . . . . . 40 | 7.5.6. Corruption Protection Length . . . . . . . . . . . . 42 | |||
7.5.9. Singular Transmission . . . . . . . . . . . . . . . . 40 | 7.5.7. Reliable Data Transfer (Message) . . . . . . . . . . 42 | |||
7.6. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 41 | 7.5.8. Message Capacity Profile Override . . . . . . . . . . 43 | |||
7.7. Batching Sends . . . . . . . . . . . . . . . . . . . . . 42 | 7.5.9. No Fragmentation . . . . . . . . . . . . . . . . . . 43 | |||
7.8. Send on Active Open: InitiateWithSend . . . . . . . . . . 42 | 7.6. Partial Sends . . . . . . . . . . . . . . . . . . . . . . 43 | |||
8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 42 | 7.7. Batching Sends . . . . . . . . . . . . . . . . . . . . . 44 | |||
8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 43 | 7.8. Send on Active Open: InitiateWithSend . . . . . . . . . . 44 | |||
8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 43 | 8. Receiving Data . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 44 | 8.1. Enqueuing Receives . . . . . . . . . . . . . . . . . . . 45 | |||
8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 44 | 8.2. Receive Events . . . . . . . . . . . . . . . . . . . . . 46 | |||
8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 45 | 8.2.1. Received . . . . . . . . . . . . . . . . . . . . . . 46 | |||
8.3. Receive Message Properties . . . . . . . . . . . . . . . 45 | 8.2.2. ReceivedPartial . . . . . . . . . . . . . . . . . . . 46 | |||
8.3.1. UDP(-Lite)-specific Property: ECN . . . . . . . . . . 45 | 8.2.3. ReceiveError . . . . . . . . . . . . . . . . . . . . 47 | |||
8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 45 | 8.3. Receive Message Properties . . . . . . . . . . . . . . . 48 | |||
8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 46 | 8.3.1. UDP(-Lite)-specific Property: ECN . . . . . . . . . . 48 | |||
9. Message Framers . . . . . . . . . . . . . . . . . . . . . . . 46 | 8.3.2. Early Data . . . . . . . . . . . . . . . . . . . . . 48 | |||
9.1. Adding Message Framers to Connections . . . . . . . . . . 47 | 8.3.3. Receiving Final Messages . . . . . . . . . . . . . . 48 | |||
9.2. Framing Meta-Data . . . . . . . . . . . . . . . . . . . . 47 | ||||
10. Managing Connections . . . . . . . . . . . . . . . . . . . . 48 | ||||
10.1. Generic Connection Properties . . . . . . . . . . . . . 49 | ||||
10.1.1. Retransmission Threshold Before Excessive | ||||
Retransmission Notification . . . . . . . . . . . . . 49 | ||||
9. Message Framers . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
9.1. Adding Message Framers to Connections . . . . . . . . . . 49 | ||||
9.2. Framing Meta-Data . . . . . . . . . . . . . . . . . . . . 50 | ||||
10. Managing Connections . . . . . . . . . . . . . . . . . . . . 50 | ||||
10.1. Generic Connection Properties . . . . . . . . . . . . . 52 | ||||
10.1.1. Retransmission Threshold Before Excessive | ||||
Retransmission Notification . . . . . . . . . . . . . 52 | ||||
10.1.2. Required Minimum Corruption Protection Coverage for | 10.1.2. Required Minimum Corruption Protection Coverage for | |||
Receiving . . . . . . . . . . . . . . . . . . . . . . 50 | Receiving . . . . . . . . . . . . . . . . . . . . . . 52 | |||
10.1.3. Priority (Connection) . . . . . . . . . . . . . . . 50 | 10.1.3. Priority (Connection) . . . . . . . . . . . . . . . 53 | |||
10.1.4. Timeout for Aborting Connection . . . . . . . . . . 50 | 10.1.4. Timeout for Aborting Connection . . . . . . . . . . 53 | |||
10.1.5. Connection Group Transmission Scheduler . . . . . . 51 | 10.1.5. Connection Group Transmission Scheduler . . . . . . 53 | |||
10.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 51 | 10.1.6. Capacity Profile . . . . . . . . . . . . . . . . . . 54 | |||
10.1.7. Bounds on Send or Receive Rate . . . . . . . . . . . 52 | 10.1.7. Policy for using Multi-Path Transports . . . . . . . 55 | |||
10.1.8. Read-only Connection Properties . . . . . . . . . . 53 | 10.1.8. Bounds on Send or Receive Rate . . . . . . . . . . . 56 | |||
10.2. TCP-specific Properties: User Timeout Option (UTO) . . . 54 | 10.1.9. Read-only Connection Properties . . . . . . . . . . 56 | |||
10.2.1. Advertised User Timeout . . . . . . . . . . . . . . 54 | 10.2. TCP-specific Properties: User Timeout Option (UTO) . . . 57 | |||
10.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 54 | 10.2.1. Advertised User Timeout . . . . . . . . . . . . . . 57 | |||
10.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 55 | 10.2.2. User Timeout Enabled . . . . . . . . . . . . . . . . 58 | |||
10.3. Connection Lifecycle Events . . . . . . . . . . . . . . 55 | 10.2.3. Timeout Changeable . . . . . . . . . . . . . . . . . 58 | |||
10.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . 55 | 10.3. Connection Lifecycle Events . . . . . . . . . . . . . . 58 | |||
10.3.2. Excessive retransmissions . . . . . . . . . . . . . 55 | 10.3.1. Soft Errors . . . . . . . . . . . . . . . . . . . . 58 | |||
11. Connection Termination . . . . . . . . . . . . . . . . . . . 55 | 10.3.2. Excessive retransmissions . . . . . . . . . . . . . 59 | |||
12. Connection State and Ordering of Operations and Events . . . 56 | 11. Connection Termination . . . . . . . . . . . . . . . . . . . 59 | |||
13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 57 | 12. Connection State and Ordering of Operations and Events . . . 59 | |||
14. Security Considerations . . . . . . . . . . . . . . . . . . . 57 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 61 | |||
15. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 59 | 14. Security Considerations . . . . . . . . . . . . . . . . . . . 61 | |||
16. References . . . . . . . . . . . . . . . . . . . . . . . . . 59 | 15. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 62 | |||
16.1. Normative References . . . . . . . . . . . . . . . . . . 59 | 16. References . . . . . . . . . . . . . . . . . . . . . . . . . 63 | |||
16.2. Informative References . . . . . . . . . . . . . . . . . 60 | 16.1. Normative References . . . . . . . . . . . . . . . . . . 63 | |||
Appendix A. Convenience Functions . . . . . . . . . . . . . . . 62 | 16.2. Informative References . . . . . . . . . . . . . . . . . 63 | |||
A.1. Adding Preference Properties . . . . . . . . . . . . . . 63 | Appendix A. Convenience Functions . . . . . . . . . . . . . . . 66 | |||
A.2. Transport Property Profiles . . . . . . . . . . . . . . . 63 | A.1. Adding Preference Properties . . . . . . . . . . . . . . 66 | |||
A.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 63 | A.2. Transport Property Profiles . . . . . . . . . . . . . . . 67 | |||
A.2.2. reliable-message . . . . . . . . . . . . . . . . . . 64 | A.2.1. reliable-inorder-stream . . . . . . . . . . . . . . . 67 | |||
A.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 64 | A.2.2. reliable-message . . . . . . . . . . . . . . . . . . 67 | |||
A.2.3. unreliable-datagram . . . . . . . . . . . . . . . . . 68 | ||||
Appendix B. Relationship to the Minimal Set of Transport Services | Appendix B. Relationship to the Minimal Set of Transport Services | |||
for End Systems . . . . . . . . . . . . . . . . . . . . . 65 | for End Systems . . . . . . . . . . . . . . . . . . . . . 69 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 68 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 72 | |||
1. Introduction | 1. Introduction | |||
This document specifies a modern abstract programming interface atop | This document specifies a modern abstract application programming | |||
the high-level architecture for transport services defined in | interface (API) atop the high-level architecture for transport | |||
[I-D.ietf-taps-arch]. It supports the asynchronous, atomic | services defined in [I-D.ietf-taps-arch]. It supports the | |||
transmission of messages over transport protocols and network paths | asynchronous, atomic transmission of messages over transport | |||
dynamically selected at runtime. It is intended to replace the | protocols and network paths dynamically selected at runtime. It is | |||
traditional BSD sockets API as the lowest common denominator | intended to replace the traditional BSD sockets API as the common | |||
interface to the transport layer, in an environment where endpoints | interface to the transport layer, in environments where endpoints | |||
have multiple interfaces and potential transport protocols to select | select from multiple interfaces and potential transport protocols. | |||
from. | ||||
As applications adopt this interface, they will benefit from a wide | As applications adopt this interface, they will benefit from a wide | |||
set of transport features that can evolve over time, and ensure that | set of transport features that can evolve over time, and ensure that | |||
the system providing the interface can optimize its behavior based on | the system providing the interface can optimize its behavior based on | |||
the application requirements and network conditions, without | the application requirements and network conditions, without | |||
requiring changes to the applications. This flexibility enables | requiring changes to the applications. This flexibility enables | |||
faster deployment of new features and protocols. It can also support | faster deployment of new features and protocols. It can also support | |||
applications by offering racing and fallback mechanisms, which | applications by offering racing and fallback mechanisms, which | |||
otherwise need to be implemented in each application separately. | otherwise need to be separately implemented in each application. | |||
It derives specific path and protocol selection properties and | It derives specific path and protocol selection properties and | |||
supported transport features from the analysis provided in [RFC8095], | supported transport features from the analysis provided in [RFC8095], | |||
[I-D.ietf-taps-minset], and [I-D.ietf-taps-transport-security]. The | [I-D.ietf-taps-minset], and [I-D.ietf-taps-transport-security]. The | |||
design encourages implementations underneath the interface to | design encourages implementations underneath the interface to | |||
dynamically choose a transport protocol depending on an application's | dynamically choose a transport protocol depending on an application's | |||
choices rather than statically binding applications to a protocol at | choices rather than statically binding applications to a protocol at | |||
compile time. We note that transport system implementations SHOULD | compile time. The transport system implementations should provide | |||
provide applications a way to override transport selection and | applications with a way to override transport selection and | |||
instantiate a specific stack, e.g. to support servers wanting to | instantiate a specific stack, e.g., to support servers wishing to | |||
listen to a specific protocol. This specific transport stack choice | listen to a specific protocol. This specific transport stack choice | |||
is discouraged for general use, as it comes at the cost of reduced | is discouraged for general use, because it can reduce the | |||
portability. | 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 with which an application | |||
interact with; Actions the application can perform on these Objects; | can interact; Actions the application can perform on these Objects; | |||
Events, which an Object can send to an application asynchronously; | Events, which an Object can send to an application asynchronously; | |||
and Parameters associated with these Actions and Events. | and Parameters associated with these Actions and Events. | |||
The following notations, which can be combined, are used in this | The following notations, which can be combined, are used in this | |||
document: | document: | |||
* An Action creates an Object: | * An Action creates an Object: | |||
Object := Action() | Object := Action() | |||
skipping to change at page 6, line 11 ¶ | skipping to change at page 6, line 25 ¶ | |||
* 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 | The way these abstract concepts map into concrete implementations of | |||
API in a given language on a given platform is largely dependent on | this API in a given language on a given platform largely depends 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 event queues, handler functions or classes, | could be implemented via event queues, handler functions or classes, | |||
communicating sequential processes, or other asynchronous calling | communicating sequential processes, or other asynchronous calling | |||
conventions. | conventions. | |||
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 occurred. | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. Overview of Interface Design | 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 principles, themselves an elaboration on the architectural | |||
design principles defined in [I-D.ietf-taps-arch]. The interface | design principles defined in [I-D.ietf-taps-arch]. The interface | |||
defined in this document provides: | defined in this document provides: | |||
* 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 | |||
skipping to change at page 12, line 6 ¶ | skipping to change at page 12, line 6 ¶ | |||
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. Selection Properties (see The behavior of the | |||
(see Section 5.2) are used to specify which paths and protocol stacks | ||||
can be used and are preferred by the application, and Connection | ||||
Properties (see Section 10.1) can be used to influence decisions made | ||||
during establishment and to fine-tune the eventually established | ||||
connection. These Connection Properties can also be used later, to | ||||
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.5). | Message Properties (see Section 5.2) can only be set during pre- | |||
establishment. They are only used to specify which paths and | ||||
protocol stacks can be used and are preferred by the application. | ||||
Connection Properties (see Section 10.1) can also be set during pre- | ||||
establishment but may be changed later. They are used to inform | ||||
decisions made during establishment and to fine-tune the established | ||||
connection.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: | |||
* Connection Properties can be set on Preconnections | * Connection Properties can be set on Preconnections | |||
* Message Properties can be set on Preconnections and Connections | * Message Properties can be set on Preconnections, Connections and | |||
Messages | ||||
* 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, which | input to the selection process. Protocol Specific Properties, which | |||
enable configuration of specialized features of a specific protocol, | enable configuration of specialized features of a specific protocol, | |||
see Section 3.2 of [I-D.ietf-taps-arch], are not used as an input to | see Section 3.2 of [I-D.ietf-taps-arch], are not used as an input to | |||
the selection process but only support configuration if the | the selection process but only support configuration if the | |||
respective prototocol has been selected. | respective protocol 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. For the | |||
are lower-case strings whereby words are separated by hyphens. These | purposes of this document, these names are alphanumeric strings in | |||
names serve two purposes: | which words may be separated by hyphens. These names serve two | |||
purposes: | ||||
* Allow different components of a TAPS implementation to pass | * Allowing different components of a TAPS implementation to pass | |||
Transport Properties, e.g., between a language frontend and a | Transport Properties, e.g., between a language frontend and a | |||
policy manager, or as a representation of properties retrieved | policy manager, or as a representation of properties retrieved | |||
from a file or other storage. | from a file or other storage. | |||
* Make code of different TAPS implementations look similar. | * Making code of different TAPS implementations look similar. While | |||
individual programming languages may preclude strict adherence to | ||||
the aforementioned naming convention (for instance, by prohibiting | ||||
the use of hyphens in symbols), users interacting with multiple | ||||
implementations will still benefit from the consistency resulting | ||||
from the use of visually similar symbols. | ||||
Transport Property Names are hierarchically organized in the form | Transport Property Names are hierarchically organized in the form | |||
[<Namespace>.]<PropertyName>. | [<Namespace>.]<PropertyName>. | |||
* The Namespace part MUST be empty for well-known, generic | * The Namespace component MUST be empty for well-known, generic | |||
properties, i.e., for properties that are not specific to a | properties, i.e., for properties that are not specific to a | |||
protocol and are defined in an RFC. | protocol and are defined in an RFC. | |||
* Protocol Specific Properties MUST use the protocol acronym as | * 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. | |||
* Vendor or implementation specific properties MUST use 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 | Namespaces for each of the keywords provided in the IANA protocol | |||
registry (see https://www.iana.org/assignments/protocol-numbers/ | numbers registry (see https://www.iana.org/assignments/protocol- | |||
protocol-numbers.xhtml) are reserved for Protocol Specific Properties | numbers/protocol-numbers.xhtml), reformatted where necessary to | |||
and MUST not be used for vendor or implementation specific | conform to an implementation's naming conventions, are reserved for | |||
properties. | 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: | |||
* Boolean: can take the values "true" and "false"; representation is | * Boolean: can take the values "true" and "false"; representation is | |||
implementation-dependent. | implementation-dependent. | |||
* 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. | |||
skipping to change at page 13, line 44 ¶ | skipping to change at page 14, line 7 ¶ | |||
representation is implementation-dependent. | representation is implementation-dependent. | |||
* 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. | |||
* 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. When querying, a | |||
Preference is of type Boolean, with "true" indicating that the | ||||
Selection Property has been applied. | ||||
For types Integer and Numeric, special values can be defined per | ||||
property; it is up to implementations how these special values are | ||||
represented (e.g., by using -1 for an otherwise non-negative value). | ||||
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 | |||
skipping to change at page 14, line 28 ¶ | skipping to change at page 14, line 46 ¶ | |||
itself uses different names for substantially equivalent objects | itself uses different names for substantially equivalent objects | |||
for networking by convention. | for networking by convention. | |||
* Implementations of this interface SHOULD implement each Selection | * Implementations of this interface SHOULD implement each Selection | |||
Property, Connection Property, and Message Context Property | Property, Connection Property, and Message Context Property | |||
specified in this document. Each interface SHOULD be implemented | specified in this document. Each interface SHOULD be implemented | |||
even when this will always result in no operation, e.g. there is | even when this will always result in no operation, e.g. there is | |||
no action when the API specifies a Property that is not available | no action when the API specifies a Property that is not available | |||
in a transport protocol implemented on a specific platform. For | in a transport protocol implemented on a specific platform. For | |||
example, if TCP is the only underlying transport protocol, the | example, if TCP is the only underlying transport protocol, the | |||
Message Property "msg-ordered" can be implemented even if | Message Property "msgOrdered" can be implemented even if disabling | |||
disabling ordering will not have any effect TCP because the API | ordering will not have any effect TCP because the API does not | |||
does not guarantee out-of-order delivery. Similarly, the msg- | guarantee out-of-order delivery. Similarly, the "msg-lifetime" | |||
lifetime" Message Property can be implemented but ignored, as the | Message Property can be implemented but ignored, as the | |||
description of this Property states that "it is not guaranteed | description of this Property states that "it is not guaranteed | |||
that a Message will not be sent when its Lifetime has expired". | that a Message will not be sent when its Lifetime has expired". | |||
* Implementations may use other representations for Transport | * 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 | |||
skipping to change at page 15, line 12 ¶ | skipping to change at page 15, line 31 ¶ | |||
preconfigured Connection Properties (Section 10.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. If no Local Endpoint is specified, the | |||
Transport System will assign an ephemeral local port to the | ||||
Connection. 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 9), if required, should be added to the | Transport Properties MUST always be specified while security | |||
Preconnection during pre-establishment. | parameters are OPTIONAL. | |||
If Message Framers are used (see Section 9), they MUST be added to | ||||
the 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 Objects to refer to the endpoints of a transport connection. | Endpoint Objects to refer to the endpoints of a transport connection. | |||
Actions on these Objects can be used to represent various different | Actions on these Objects can be used to represent various different | |||
types of endpoint identifiers, such as IP addresses, DNS names, and | types of endpoint identifiers, such as IP addresses, DNS names, and | |||
interface names, as 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: | Specify a Remote Endpoint using a hostname and service name: | |||
skipping to change at page 18, line 5 ¶ | skipping to change at page 18, line 25 ¶ | |||
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 | | | Require | Select only protocols/paths providing | | |||
| | the property, fail otherwise | | | | the property, fail otherwise | | |||
+------------+----------------------------------------+ | +------------+----------------------------------------+ | |||
| Prefer | Prefer protocols/paths providing the | | | Prefer | Prefer protocols/paths providing the | | |||
| | property, proceed otherwise | | | | property, proceed otherwise | | |||
+------------+----------------------------------------+ | +------------+----------------------------------------+ | |||
| Ignore | No preference | | | Ignore | No preference | | |||
+------------+----------------------------------------+ | +------------+----------------------------------------+ | |||
skipping to change at page 19, line 35 ¶ | skipping to change at page 20, line 9 ¶ | |||
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 10.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. The return type of a queried Selection Property is Boolean, | |||
the value "Require" for properties of the selected protocol and path, | where "true" means that the Selection Property has been applied and | |||
Avoid for properties avoided during selection, and Ignore for all | "false" means that the Selection Property has not been applied. Note | |||
other properties. | that "true" does not mean that a request has been honored. For | |||
example, if "Congestion control" was requested with preference level | ||||
"Prefer", but congestion control could not be supported, querying the | ||||
"congestionControl" property yields the value "false". If preference | ||||
level "Avoid" was used for "Congestion control", and, as requested, | ||||
the Connection is not congestion controlled, querying the | ||||
"congestionControl" property also yields the value "false". | ||||
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 recommended default values for each | |||
represent a configuration that can be implemented over TCP. An | property below represent a configuration that can be implemented over | |||
alternate set of default Protocol Selection Properties would | TCP. If these default values are used and TCP is not supported by a | |||
represent a configuration that can be implemented over UDP. | Transport Services implementation, then an application using the | |||
default set of Properties might not succeed in establishing a | ||||
connection. Using the same default values for independent Transport | ||||
Services implementations can be beneficical when application are | ||||
ported between different implementations, even if this default could | ||||
lead to a connection failure, as, for example, an application needs | ||||
to be explicitly designed to support a connectionless mode. In this | ||||
case the application can regonize the failure and explicitly specify | ||||
a different set of Protocol Selection Properties that result in a | ||||
usable protocol. If default values other than those recommended | ||||
below are used, it is recommended to clearly document the | ||||
differences. | ||||
5.2.1. Reliable Data Transfer (Connection) | 5.2.1. Reliable Data Transfer (Connection) | |||
Name: reliability | Name: reliability | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies whether the application needs to use a | This property specifies whether the application needs to use a | |||
transport protocol that ensures that all data is received 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. | a Connection is closed or aborted when reliable data transfer is | |||
enabled. | ||||
5.2.2. Preservation of Message Boundaries | 5.2.2. Preservation of Message Boundaries | |||
Name: preserve-msg-boundaries | Name: preserveMsgBoundaries | |||
Type: Preference | Type: Preference | |||
Default: Prefer | Default: Prefer | |||
This property specifies whether the application needs or prefers to | This property specifies whether the application needs or prefers to | |||
use a transport protocol that preserves message boundaries. | use a transport protocol that preserves message boundaries. | |||
5.2.3. Configure Per-Message Reliability | 5.2.3. Configure Per-Message Reliability | |||
Name: per-msg-reliability | Name: perMsgReliability | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
indicate its reliability requirements on a per-Message basis. This | indicate its reliability requirements on a per-Message basis. This | |||
property applies to Connections and Connection Groups. | property applies to Connections and Connection Groups. | |||
5.2.4. Preservation of Data Ordering | 5.2.4. Preservation of Data Ordering | |||
Name: preserve-order | Name: preserveOrder | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies whether the application wishes to use a | This property specifies whether the application wishes to use a | |||
transport protocol that can ensure that data is received by the | transport protocol that can ensure that data is received by the | |||
application on the other end in the same order as it was sent. | application on the other end in the same order as it was sent. | |||
5.2.5. Use 0-RTT Session Establishment with an Idempotent Message | 5.2.5. Use 0-RTT Session Establishment with a Safely Replayable Message | |||
Name: zero-rtt-msg | Name: zeroRttMsg | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether an application would like to supply a | This property specifies whether an application would like to supply a | |||
Message to the transport protocol before Connection establishment, | Message to the transport protocol before Connection establishment, | |||
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.5.4. Note that disabling this | Endpoint). See also Section 7.5.4. Note that disabling this | |||
property has no effect for protocols that are not connection-oriented | property has no effect for protocols that are not connection-oriented | |||
and do not protect against duplicated messages, e.g., UDP. | and do not protect against duplicated messages, e.g., UDP. | |||
skipping to change at page 21, line 29 ¶ | skipping to change at page 22, line 22 ¶ | |||
Type: Preference | Type: Preference | |||
Default: Prefer | Default: Prefer | |||
This property specifies that the application would prefer multiple | This property specifies that the application would prefer multiple | |||
Connections within a Connection Group to be provided by streams of a | Connections within a Connection Group to be provided by streams of a | |||
single underlying transport connection where possible. | single underlying transport connection where possible. | |||
5.2.7. Full Checksum Coverage on Sending | 5.2.7. Full Checksum Coverage on Sending | |||
Name: per-msg-checksum-len-send | Name: perMsgChecksumLenSend | |||
Type: Preference | Type: Preference | |||
Default: Require | 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.5.6). | (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: perMsgChecksumLenRecv | |||
Type: Preference | Type: Preference | |||
Default: Require | 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. | against corruption for all data received on this Connection. | |||
5.2.9. Congestion control | 5.2.9. Congestion control | |||
Name: congestion-control | Name: congestionControl | |||
Type: Preference | Type: Preference | |||
Default: Require | Default: Require | |||
This property specifies whether the application would like the | This property specifies whether the application would like the | |||
Connection to be congestion controlled or not. Note that if a | Connection to be congestion controlled or not. Note that if a | |||
Connection is not congestion controlled, an application using such a | Connection is not congestion controlled, an application using such a | |||
Connection should itself perform congestion control in accordance | Connection should itself perform congestion control in accordance | |||
with [RFC2914]. 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. | |||
5.2.10. Interface Instance or Type | 5.2.10. Interface Instance or Type | |||
skipping to change at page 22, line 51 ¶ | skipping to change at page 23, line 42 ¶ | |||
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". | |||
interface type as "Require" limits path selection to a small set of | ||||
interfaces, and leads to less flexible and resilient connection | ||||
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. The taxonomy of interface | |||
types on a given Transport Services system is implementation- | ||||
specific. | ||||
Interface types should not be treated as a proxy for properties of | Interface types should not be treated as a proxy for properties of | |||
interfaces such as metered or unmetered network access. If an | interfaces such as metered or unmetered network access. If an | |||
application needs to prohibit metered interfaces, this should be | application needs to prohibit metered interfaces, this should be | |||
specified via Provisioning Domain attributes (see Section 5.2.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 | |||
skipping to change at page 23, line 39 ¶ | skipping to change at page 24, line 34 ¶ | |||
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 | |||
implemented directly as such, or for making one preference available | implemented directly as such, or for making one preference available | |||
for each interface and interface type available on the system. | for each interface and interface type available on the system. | |||
The identification of a specific Provisioning Domain (PvD) is defined | The identification of a specific Provisioning Domain (PvD) is defined | |||
to be implementation- and system-specific, since there is not a | to be implementation- and system-specific, since there is not a | |||
portable standard format for a PvD identitfier. For example, this | portable standard format for a PvD identifier. For example, this | |||
identifier may be a string name or an integer. As with requiring | identifier may be a string name or an integer. As with requiring | |||
specific interfaces, requiring a specific PvD strictly limits path | specific interfaces, requiring a specific PvD strictly limits path | |||
selection. | selection. | |||
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. Use Temporary Local Address | 5.2.12. Use Temporary Local Address | |||
Name: use-temporary-local-address | Name: useTemporaryLocalAddress | |||
Type: Preference | Type: Preference | |||
Default: Avoid for Listeners and Rendezvous Connections. Prefer for | Default: Avoid for Listeners and Rendezvous Connections. Prefer for | |||
other Connections. | other Connections. | |||
This property allows the application to express a preference for the | This property allows the application to express a preference for the | |||
use of temporary local addresses, sometimes called "privacy" | use of temporary local addresses, sometimes called "privacy" | |||
addresses [RFC4941]. Temporary addresses are generally used to | addresses [RFC4941]. Temporary addresses are generally used to | |||
prevent linking connections over time when a stable address, | prevent linking connections over time when a stable address, | |||
sometimes called "permanent" address, is not needed. Note that if an | sometimes called "permanent" address, is not needed. Note that if an | |||
application Requires the use of temporary addresses, the resulting | application Requires the use of temporary addresses, the resulting | |||
Connection cannot use IPv4, as temporary addresses do not exist in | Connection cannot use IPv4, as temporary addresses do not exist in | |||
IPv4. | IPv4. | |||
5.2.13. Parallel Use of Multiple Paths | 5.2.13. Multi-Paths Transport | |||
Name: multipath | Name: multipath | |||
Type: Enumeration | Type: Enumeration | |||
Default: Disabled | Default: Disabled for connections created through initiate and | |||
rendezvous, Passive for listeners | ||||
This property specifies whether an application wants to take | This property specifies whether and how applications want to take | |||
advantage of transferring data across multiple paths between the same | advantage of transferring data across multiple paths between the same | |||
end hosts. Using multiple paths allows connections to migrate | end hosts. Using multiple paths allows connections to migrate | |||
between interfaces as availability and performance properties change. | between interfaces or aggregate bandwidth as availability and | |||
Possible values are: | performance properties change. Possible values are: | |||
Disabled: The connection will not attempt using multiple paths once | Disabled: The connection will not use multiple paths once | |||
established | established, even if the chosen transport supports using multiple | |||
paths. | ||||
Handover: The connection should attempt to migrate between different | Active: The connection will negotiate the use of multiple paths if | |||
paths upon interface availability changes | the chosen transport supports this. | |||
Interactive: The connection should attempt to use multiple paths in | Passive: The connection will support the use of multiple paths if | |||
response to loss or delay upon individual paths | the remote endpoint requests it. | |||
Aggregate: The connection should attempt to use multiple paths in | The policy for using multiple paths is specified using the separate | |||
parallel in order to maximize bandwidth | "multipath-policy" property, see Section 10.1.7 below. To enable the | |||
peer endpoint to initiate additional paths towards a local address | ||||
other than the one initially used, it is necessary to set the | ||||
Alternative Addresses property (see Section 5.2.14 below). | ||||
Enumeration values other than "Disabled" are interpreted as | Setting this property to "Active", may have privacy implications: It | |||
preferences. | enables the transport to establish connectivity using alternate paths | |||
that may make users linkable across multiple paths, even if the | ||||
Advertisement of Alternative Addresses property (see Section 5.2.14 | ||||
below) is set to false. | ||||
5.2.14. Direction of communication | Enumeration values other than "Disabled" are interpreted as a | |||
preference for choosing protocols that can make use of multiple | ||||
paths. The "Disabled" value implies a requirement not to use | ||||
multiple paths in parallel but does not prevent choosing a protocol | ||||
that is capable of using multiple paths, e.g., it does not prevent | ||||
choosing TCP, but prevents sending the "MP_CAPABLE" option in the TCP | ||||
handshake. | ||||
5.2.14. Advertisement of Alternative Addresses | ||||
Name: advertises-altaddr | ||||
Type: Boolean | ||||
Default: False | ||||
This property specifies whether alternative addresses, e.g., of other | ||||
interfaces, should be advertised to the peer endpoint by the protocol | ||||
stack. Advertising these addresses enables the peer-endpoint to | ||||
establish additional connectivity, e.g., for connection migration or | ||||
using multiple paths. | ||||
Note that this may have privacy implications because it may make | ||||
users linkable across multiple paths. Also, note that setting this | ||||
to false does not prevent the local transport system from | ||||
_establishing_ connectivity using alternate paths (see Section 5.2.13 | ||||
above); it only prevents _procative advertisement_ of addresses. | ||||
5.2.15. Direction of communication | ||||
Name: direction | Name: direction | |||
Type: Enumeration | Type: Enumeration | |||
Default: Bidirectional | Default: Bidirectional | |||
This property specifies whether an application wants to use the | This property specifies whether an application wants to use the | |||
connection for sending and/or receiving data. Possible values are: | connection for sending and/or receiving data. Possible values are: | |||
skipping to change at page 25, line 33 ¶ | skipping to change at page 27, line 16 ¶ | |||
the application cannot use the connection to receive any data | the application cannot use the connection to receive any data | |||
Unidirectional receive: The connection must support receiving data, | Unidirectional receive: The connection must support receiving data, | |||
and the application cannot use the connection to send any data | and the application cannot use the connection to send any data | |||
Since unidirectional communication can be supported by transports | Since unidirectional communication can be supported by transports | |||
offering bidirectional communication, specifying unidirectional | offering bidirectional communication, specifying unidirectional | |||
communication may cause a transport stack that supports bidirectional | communication may cause a transport stack that supports bidirectional | |||
communication to be selected. | communication to be selected. | |||
5.2.15. Notification of excessive retransmissions | 5.2.16. Notification of excessive retransmissions | |||
Name: retransmit-notify | Name: retransmitNotify | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
be informed in case sent data was retransmitted more often than a | be informed in case sent data was retransmitted more often than a | |||
certain threshold (see Section 10.1.1 for configuration of this | certain threshold (see Section 10.1.1 for configuration of this | |||
threshold). | threshold). | |||
5.2.16. Notification of ICMP soft error message arrival | 5.2.17. Notification of ICMP soft error message arrival | |||
Name: soft-error-notify | Name: softErrorNotify | |||
Type: Preference | Type: Preference | |||
Default: Ignore | Default: Ignore | |||
This property specifies whether an application considers it useful to | This property specifies whether an application considers it useful to | |||
be informed when an ICMP error message arrives that does not force | be informed when an ICMP error message arrives that does not force | |||
termination of a connection. When set to true, received ICMP errors | termination of a connection. When set to true, received ICMP errors | |||
will be available as SoftErrors, see Section 10.3.1. Note that even | will be available as SoftErrors, see Section 10.3.1. Note that even | |||
if a protocol supporting this property is selected, not all ICMP | if a protocol supporting this property is selected, not all ICMP | |||
errors will necessarily be delivered, so applications cannot rely on | errors will necessarily be delivered, so applications cannot rely on | |||
receiving them. | receiving them. | |||
5.2.18. Initiating side is not the first to write | ||||
Name: activeReadBeforeSend | ||||
Type: Preference | ||||
Default: Ignore | ||||
The most common client-server communication pattern involves the | ||||
client actively opening a connection, then sending data to the | ||||
server. The server listens (passive open), reads, and then answers. | ||||
This property specifies whether an application wants to diverge from | ||||
this pattern - either by actively opening with Initiate(), | ||||
immediately followed by reading, or passively opening with Listen(), | ||||
immediately followed by writing. This property is ignored when | ||||
establishing connections using Rendezvous(). Requiring this property | ||||
limits the choice of mappings to underlying protocols, which can | ||||
reduce efficiency. For example, it prevents the transport system | ||||
from mapping Connections to SCTP streams, where the first transmitted | ||||
data takes the role of an active open signal [I-D.ietf-taps-impl]. | ||||
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). | |||
5.3.1. Pre-Connection Parameters | 5.3.1. Pre-Connection Parameters | |||
Common parameters such as TLS ciphersuites are known to | Common parameters such as TLS ciphersuites are known to | |||
implementations. Clients should use common safe defaults for these | implementations. Clients should use common safe defaults for these | |||
values whenever possible. However, as discussed in | 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 need to be specified in the pre-connection | |||
phase and are created as follows: | ||||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
Security configuration parameters and sample usage follow: | Security configuration parameters and sample usage follow: | |||
* Local identity and private keys: Used to perform private key | * 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.Add('identity', identity) | |||
SecurityParameters.AddPrivateKey(privateKey, publicKey) | SecurityParameters.Add('keypair', privateKey, publicKey) | |||
* 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.Add('supported-group', 'secp256k1') | |||
SecurityParameters.AddCiphersuite(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256) | SecurityParameters.Add('ciphersuite, 'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256') | |||
SecurityParameters.AddSignatureAlgorithm(ed25519) | SecurityParameters.Add('signature-algorithm', 'ed25519') | |||
* Session cache management: Used to tune cache capacity, lifetime, | ||||
re-use, and eviction policies, e.g., LRU or FIFO. Constants and | ||||
policies for these interfaces are implementation-specific. | ||||
SecurityParameters.SetSessionCacheCapacity(MAX_CACHE_ELEMENTS) | ||||
SecurityParameters.SetSessionCacheLifetime(SECONDS_PER_DAY) | ||||
SecurityParameters.SetSessionCachePolicy(CachePolicyOneTimeUse) | ||||
* 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.Add('pre-shared-key', key, identity) | |||
* Session cache management: Used to tune cache capacity, lifetime, | ||||
re-use, and eviction policies, e.g., LRU or FIFO.may also me | ||||
changed, but are implementation-specific. | ||||
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: | |||
* 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 | |||
continue. | ||||
TrustCallback := NewCallback({ | TrustCallback := NewCallback({ | |||
// Handle trust, return the result | // Handle trust, return the result | |||
}) | }) | |||
SecurityParameters.SetTrustVerificationCallback(trustCallback) | SecurityParameters.SetTrustVerificationCallback(trustCallback) | |||
* Identity challenge callback: Invoked when a private key operation | * 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. | |||
skipping to change at page 28, line 42 ¶ | skipping to change at page 30, line 42 ¶ | |||
The Initiate() Action returns a Connection object. Once Initiate() | The Initiate() Action returns a Connection object. Once Initiate() | |||
has been called, any changes to the Preconnection MUST NOT have any | has been called, any changes to the Preconnection MUST NOT have any | |||
effect on the Connection. However, the Preconnection can be reused, | effect on the Connection. However, the Preconnection can be reused, | |||
e.g., to Initiate another Connection. | e.g., to Initiate another Connection. | |||
Once Initiate is called, the candidate Protocol Stack(s) may cause | Once Initiate is called, the candidate Protocol Stack(s) may cause | |||
one or more candidate transport-layer connections to be created to | one or more candidate transport-layer connections to be created to | |||
the specified remote endpoint. The caller may immediately begin | the specified remote endpoint. The caller may immediately begin | |||
sending Messages on the Connection (see Section 7) after calling | sending Messages on the Connection (see Section 7) after calling | |||
Initate(); note that any idempotent data sent while the Connection is | Initiate(); note that any data marked "Safely Replayable" that is | |||
being established may be sent multiple times or on multiple | sent while the Connection is being established may be sent multiple | |||
candidates. | times or on multiple candidates. | |||
The following Events may be sent by the Connection after Initiate() | The following Events may be sent by the Connection after Initiate() | |||
is called: | is called: | |||
Connection -> Ready<> | Connection -> Ready<> | |||
The Ready Event occurs after Initiate has established a transport- | The Ready Event occurs after Initiate has established a transport- | |||
layer connection on at least one usable candidate Protocol Stack over | layer connection on at least one usable candidate Protocol Stack over | |||
at least one candidate Path. No Receive Events (see Section 8) will | at least one candidate Path. No Receive Events (see Section 8) will | |||
occur before the Ready Event for Connections established using | occur before the Ready Event for Connections established using | |||
Initiate. | Initiate. | |||
Connection -> InitiateError<reason?> | Connection -> EstablishmentError<reason?> | |||
An InitiateError occurs either when the set of transport properties | An EstablishmentError occurs either when the set of transport | |||
and security parameters cannot be fulfilled on a Connection for | properties and security parameters cannot be fulfilled on a | |||
initiation (e.g. the set of available Paths and/or Protocol Stacks | Connection for initiation (e.g. the set of available Paths and/or | |||
meeting the constraints is empty) or reconciled with the local and/or | Protocol Stacks meeting the constraints is empty) or reconciled with | |||
remote Endpoints; when the remote specifier cannot be resolved; or | the local and/or remote Endpoints; when the remote specifier cannot | |||
when no transport-layer connection can be established to the remote | be resolved; or when no transport-layer connection can be established | |||
Endpoint (e.g. because the remote Endpoint is not accepting | to the remote Endpoint (e.g. because the remote Endpoint is not | |||
connections, the application is prohibited from opening a Connection | accepting connections, the application is prohibited from opening a | |||
by the operating system, or the establishment attempt has timed out | Connection by the operating system, or the establishment attempt has | |||
for any other reason). | timed out for any other reason). | |||
See also Section 7.8 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: | |||
skipping to change at page 30, line 25 ¶ | skipping to change at page 32, line 28 ¶ | |||
If the caller wants to rate-limit the number of inbound Connections | If the caller wants to rate-limit the number of inbound Connections | |||
that will be delivered, it can set a cap using | that will be delivered, it can set a cap using | |||
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 -> EstablishmentError<reason?> | |||
A ListenError occurs either when the Properties and Security | A EstablishmentError occurs either when the Properties and Security | |||
Parameters of the Preconnection cannot be fulfilled for listening or | Parameters of the Preconnection cannot be fulfilled for listening or | |||
cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | cannot be reconciled with the Local Endpoint (and/or Remote Endpoint, | |||
if specified), when the Local Endpoint (or Remote Endpoint, if | if specified), when the Local Endpoint (or Remote Endpoint, if | |||
specified) cannot be resolved, or when the application is prohibited | specified) cannot be resolved, or when the application is prohibited | |||
from listening by policy. | from listening by policy. | |||
Listener -> Stopped<> | Listener -> Stopped<> | |||
A Stopped Event occurs after the Listener has stopped listening. | A Stopped Event occurs after the Listener has stopped listening. | |||
skipping to change at page 31, line 22 ¶ | skipping to change at page 33, line 26 ¶ | |||
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<reason?> | Preconnection -> EstablishmentError<reason?> | |||
An RendezvousError occurs either when the Properties and Security | An EstablishmentError occurs either when the Properties and Security | |||
Parameters of the Preconnection cannot be fulfilled for rendezvous or | Parameters of the Preconnection cannot be fulfilled for rendezvous or | |||
cannot be reconciled with the Local and/or Remote Endpoints, when the | cannot be reconciled with the Local and/or Remote Endpoints, when the | |||
Local Endpoint or Remote Endpoint cannot be resolved, when no | Local Endpoint or Remote Endpoint cannot be resolved, when no | |||
transport-layer connection can be established to the Remote Endpoint, | transport-layer connection can be established to the Remote Endpoint, | |||
or when the application is prohibited from rendezvous by policy. | or when the application is prohibited from rendezvous by policy. | |||
When using some NAT traversal protocols, e.g., Interactive | 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. | |||
skipping to change at page 34, line 11 ¶ | skipping to change at page 36, line 16 ¶ | |||
described in Section 7.6. | described in Section 7.6. | |||
Framers can be used to extend or modify the message data with | Framers can be used to extend or modify the message data with | |||
additional information that can be processed at the receiver to | additional information that can be processed at the receiver to | |||
detect message boundaries. This is further decribed in Section 9. | 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. | |||
the resulting object contains both the byte array and the length of | ||||
the array. | ||||
messageData := "hello".bytes() | messageData := "hello" | |||
Connection.Send(messageData) | Connection.Send(messageData) | |||
The interpretation of a Message to be sent is dependent on the | The interpretation of a Message to be sent is dependent on the | |||
implementation, and on the constraints on the Protocol Stacks implied | implementation, and on the constraints on the Protocol Stacks implied | |||
by the Connection's transport properties. For example, a Message may | by the Connection's transport properties. For example, a Message may | |||
be a single datagram for UDP Connections; or an HTTP Request for HTTP | be a single datagram for UDP Connections; or an HTTP Request for HTTP | |||
Connections. | Connections. | |||
Some transport protocols can deliver arbitrarily sized Messages, but | Some transport protocols can deliver arbitrarily sized Messages, but | |||
other protocols constrain the maximum Message size. Applications can | other protocols constrain the maximum Message size. Applications can | |||
query the Connection Property "Maximum Message size on send" | query the Connection Property "Maximum Message size on send" | |||
(Section 10.1.8.3) to determine the maximum size allowed for a single | (Section 10.1.9.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 | |||
skipping to change at page 35, line 10 ¶ | skipping to change at page 37, line 10 ¶ | |||
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 7.4. | 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. | delivered in response to each call to Send. | |||
Note that if partial Sends are used (Section 7.6), 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. | |||
The interface should allow the application to correlate which Send | ||||
Action resulted in a particular Send Event. The manner in which this | ||||
correlation is indicated is implementation-specific. | ||||
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 | |||
skipping to change at page 36, line 35 ¶ | skipping to change at page 38, line 40 ¶ | |||
left empty. To get or set meta-data for a Framer, the application | left empty. To get or set meta-data for a Framer, the application | |||
has to pass a reference to this Framer as the scope parameter. | has to pass a reference to this Framer as the scope parameter. | |||
For MessageContexts returned by send events (see Section 7.3) and | For MessageContexts returned by send events (see Section 7.3) and | |||
receive events (see Section 8.2), the application can query | receive events (see Section 8.2), the application can query | |||
information about the local and remote endpoint: | information about the local and remote endpoint: | |||
RemoteEndpoint := MessageContext.GetRemoteEndpoint() | RemoteEndpoint := MessageContext.GetRemoteEndpoint() | |||
LocalEndpoint := MessageContext.GetLocalEndpoint() | LocalEndpoint := MessageContext.GetLocalEndpoint() | |||
Message Contexts can also be used to send messages that are flagged | Message Contexts can also be used to send messages in reply to other | |||
as a reply to other messages, see Section 7.2 for details. If the | messages, see Section 7.2 for details. | |||
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 | 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 7.4. | 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.6). 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" | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
Connection.Send(messageData, messageContext) | Connection.Send(messageData, messageContext) | |||
The simpler form of Send, which does not take any messageContext, is | The simpler form of Send, which does not take any messageContext, is | |||
equivalent to passing a default MessageContext without adding any | equivalent to passing a default MessageContext without adding any | |||
Message Properties to it. | Message Properties to it. | |||
If an application wants to override Message Properties for a specific | If an application wants to override Message Properties for a specific | |||
message, it can acquire an empty MessageContext Object and add all | message, it can acquire an empty MessageContext Object and add all | |||
skipping to change at page 37, line 40 ¶ | skipping to change at page 39, line 40 ¶ | |||
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 infinite 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. | |||
Connection Properties describe the default behavior for all Messages | ||||
on a Connection. If a Message Property contradicts a Connection | ||||
Property, and if this per-Message behavior can be supported, it | ||||
overrides the Connection Property for the specific Message. For | ||||
example, if "Reliable Data Transfer (Connection)" is set to "Require" | ||||
and a protocol with configurable per-Message reliability is used, | ||||
setting "Reliable Data Transfer (Message)" to "false" for a | ||||
particular Message will allow this Message to be unreliably | ||||
delivered. Note that changing the Reliable Data Transfer property on | ||||
Messages is only possible for Connections that were established with | ||||
the Selection Property "Configure Per-Message Reliability" enabled. | ||||
The following Message Properties are supported: | The following Message Properties are supported: | |||
7.5.1. Lifetime | 7.5.1. Lifetime | |||
Name: msg-lifetime | Name: msgLifetime | |||
Type: Numeric | 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.5.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.5.2. Priority | 7.5.2. Priority | |||
Name: msg-prio | Name: msgPrio | |||
Type: Integer (non-negative) | Type: Integer (non-negative) | |||
Default: 100 | Default: 100 | |||
This property represents a hierarchy of priorities. It can specify | This property represents a hierarchy of priorities. It can specify | |||
the priority of a Message, relative to other Messages sent over the | the priority of a Message, relative to other Messages sent over the | |||
same Connection. | same Connection. | |||
A Message with Priority 0 will yield to a Message with Priority 1, | A Message with Priority 0 will yield to a Message with Priority 1, | |||
skipping to change at page 38, line 39 ¶ | skipping to change at page 40, line 51 ¶ | |||
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 10.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.5.3. Ordered | 7.5.3. Ordered | |||
Name: msg-ordered | Name: msgOrdered | |||
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 | |||
may 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, e.g., by multiplexing independent messages onto | certain messages, e.g., by multiplexing independent messages onto | |||
different streams. | different streams. | |||
7.5.4. Idempotent | 7.5.4. Safely Replayable | |||
Name: idempotent | Name: safelyReplayable | |||
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 "Safely | |||
order to enable protocol selection to choose such a protocol, | Replayable". In order to enable protocol selection to choose such a | |||
Idempotent MUST be added to the TransportProperties passed to the | protocol, "Safely Replayable" MUST be added to the | |||
Preconnection. If such a protocol was chosen, disabling Idempotent | TransportProperties passed to the Preconnection. If such a protocol | |||
on individual messages MUST result in a SendError. | was chosen, disabling "Safely Replayable" on individual messages MUST | |||
result in a SendError. | ||||
7.5.5. Final | 7.5.5. Final | |||
Type: Boolean | ||||
Name: final | Name: final | |||
Type: Boolean | ||||
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. | |||
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.5.6. Corruption Protection Length | 7.5.6. Corruption Protection Length | |||
Name: msg-checksum-len | Name: msgChecksumLen | |||
Type: Integer (non-negative with -1 as special value) | Type: Integer (non-negative with special value "Full Coverage") | |||
Default: -1 (full coverage) | Default: 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 "Full Coverage" | |||
entire Message is protected by a checksum. Only full coverage is | means that the entire Message is protected by a checksum. Only "Full | |||
guaranteed, any other requests are advisory, meaning that full | Coverage" is guaranteed, any other requests are advisory, meaning | |||
coverage is applied anyway. | that "Full Coverage" is applied anyway. | |||
7.5.7. Reliable Data Transfer (Message) | 7.5.7. Reliable Data Transfer (Message) | |||
Name: msg-reliable | Name: msgReliable | |||
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 'Configure Per-Message | were established with the Selection Property "Configure Per-Message | |||
Reliability' 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.5.8. Message Capacity Profile Override | 7.5.8. Message Capacity Profile Override | |||
Name: msg-capacity-profile | Name: msgCapacityProfile | |||
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 connection property (see Section 10.1.6). | the Capacity Profile connection property (see Section 10.1.6). | |||
7.5.9. Singular Transmission | 7.5.9. No Fragmentation | |||
Name: singular-transmission | ||||
Name: noFragmentation | ||||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property specifies that a message should be sent and received as | This property specifies that a message should be sent and received as | |||
a single packet without transport-layer segmentation or network-layer | a single packet without network-layer fragmentation, if possible. | |||
fragmentation, if possible. Attempts to send a message with this | Attempts to send a message with this property set with a size greater | |||
property set with a size greater to the transport's current estimate | to the transport's current estimate of its maximum transmission | |||
of its maximum transmission segment size will result in a | segment size will result in a "SendError". When used with transports | |||
"SendError". When used with transports supporting this functionality | supporting this functionality and running over IP version 4, the | |||
and running over IP version 4, the Don't Fragment bit will be set. | Don't Fragment bit will be set. | |||
7.6. 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. | |||
The following example sends a Message in two separate calls to Send. | The following example sends a Message in two separate calls to Send. | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
messageData := "hel".bytes() | messageData := "hel" | |||
endOfMessage := false | endOfMessage := false | |||
Connection.Send(messageData, messageContext, endOfMessage) | Connection.Send(messageData, messageContext, endOfMessage) | |||
messageData := "lo".bytes() | messageData := "lo" | |||
endOfMessage := true | endOfMessage := true | |||
Connection.Send(messageData, messageContext, endOfMessage) | Connection.Send(messageData, messageContext, endOfMessage) | |||
All data sent with the same MessageContext object will be treated as | All data sent with the same MessageContext object will be treated as | |||
belonging to the same Message, and will constitute an in-order series | belonging to the same Message, and will constitute an in-order series | |||
until the endOfMessage is marked. Once the end of the Message is | until the endOfMessage is marked. | |||
marked, the MessageContext object may be re-used as a new Message | ||||
with identical parameters. | ||||
7.7. 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( | The semantics for starting and ending a batch can be implementation- | |||
Connection.Send(messageData) | specific, but need to allow multiple Send Actions to be enqueued. | |||
Connection.Send(messageData) | ||||
) | Connection.StartBatch() | |||
Connection.Send(messageData) | ||||
Connection.Send(messageData) | ||||
Connection.EndBatch() | ||||
7.8. 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 "Safely Replayable". This | |||
transport system to make use of 0-RTT establishment in case this is | allows the transport system to make use of 0-RTT establishment in | |||
supported by the available protocol stacks. When the selected | case this is supported by the available protocol stacks. When the | |||
stack(s) do not support transmitting data upon connection | selected 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 | |||
InitiateWithSend(). | InitiateWithSend(). | |||
The Events that may be sent after InitiateWithSend() are equivalent | The Events that may be sent after InitiateWithSend() are equivalent | |||
to those that would be sent by an invocation of Initate() followed | to those that would be sent by an invocation of Initiate() followed | |||
immediately by an invocation of Send(), with the caveat that a send | immediately by an invocation of Send(), with the caveat that a send | |||
failure that occurs because the Connection could not be established | failure that occurs because the Connection could not be established | |||
will not result in a SendError separate from the InitiateError | will not result in a SendError separate from the InitiateError | |||
signaling the failure of Connection establishment. | signaling the failure of Connection establishment. | |||
8. 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 | (unless the "Direction of Communication" property is set to | |||
an asynchronous operation, in which each call to Receive enqueues a | "unidirectional send"). As with sending, data is received in terms | |||
request to receive new data from the connection. Once data has been | of Messages. Receiving is an asynchronous operation, in which each | |||
received, or an error is encountered, an event will be delivered to | call to Receive enqueues a request to receive new data from the | |||
complete any pending Receive requests (see Section 8.2). If Messages | connection. Once data has been received, or an error is encountered, | |||
arrive at the transport system before Receive requests are issued, | an event will be delivered to complete any pending Receive requests | |||
ensuing Receive requests will first operate on these Messages before | (see Section 8.2). If Messages arrive at the transport system before | |||
awaiting any further Messages. | Receive requests are issued, ensuing Receive requests will first | |||
operate on these Messages before awaiting any further Messages. | ||||
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 | |||
skipping to change at page 44, line 5 ¶ | skipping to change at page 46, line 26 ¶ | |||
minIncompleteLength are intended only to manage buffering, and are | minIncompleteLength are intended only to manage buffering, and are | |||
not interpreted as a receiver preference for message reordering. | not interpreted as a receiver preference for message reordering. | |||
8.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. | |||
The interface should allow the application to correlate which call to | ||||
Receive resulted in a particular Receive Event. The manner in which | ||||
this correlation is indicated is implementation-specific. | ||||
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 7.4 for details. | map responses to their requests. See Section 7.4 for details. | |||
See Section 9 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. | |||
skipping to change at page 46, line 6 ¶ | skipping to change at page 48, line 33 ¶ | |||
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 | |||
to ensure it is idempotent or not replayed. If TLS 1.3 is available | to ensure it is safely replayable. If TLS 1.3 is available and the | |||
and the recipient Message was sent as part of early data, the | recipient Message was sent as part of early data, the corresponding | |||
corresponding metadata carries a flag indicating as such. If early | metadata carries a flag indicating as such. If early data is | |||
data is enabled, applications should check this metadata field for | enabled, applications should check this metadata field for Messages | |||
Messages received during connection establishment and respond | 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, see Section 7.5.5. | on a sent Message, see Section 7.5.5. | |||
skipping to change at page 49, line 45 ¶ | skipping to change at page 52, line 34 ¶ | |||
Generic Connection Properties are defined independent of the chosen | Generic Connection Properties are defined independent of the chosen | |||
protocol stack and therefore available on all Connections. | protocol stack and therefore available on all Connections. | |||
Note that many Connection Properties have a corresponding Selection | Note that many Connection Properties have a corresponding Selection | |||
Property which enables applications to express their preference for | Property which enables applications to express their preference for | |||
protocols providing a supporting transport feature. | protocols providing a supporting transport feature. | |||
10.1.1. Retransmission Threshold Before Excessive Retransmission | 10.1.1. Retransmission Threshold Before Excessive Retransmission | |||
Notification | Notification | |||
Name: retransmit-notify-threshold | Name: retransmitNotifyThreshold | |||
Type: Integer | Type: Integer, with special value "Disabled" | |||
Default: -1 | Default: Disabled | |||
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". | |||
means that this notification is disabled. | ||||
10.1.2. Required Minimum Corruption Protection Coverage for Receiving | 10.1.2. Required Minimum Corruption Protection Coverage for Receiving | |||
Name: recv-checksum-len | Name: recvChecksumLen | |||
Type: Integer | ||||
Default: -1 | Type: Integer, with special value "Full Coverage" | |||
Default: Full Coverage | ||||
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. | |||
checksum coverage. | ||||
10.1.3. Priority (Connection) | 10.1.3. Priority (Connection) | |||
Name: conn-prio | Name: connPrio | |||
Type: Integer | Type: Integer | |||
Default: 100 | Default: 100 | |||
This Property is a non-negative integer representing the relative | This Property is a non-negative integer representing the relative | |||
inverse priority (i.e., a lower value reflects a higher priority) of | inverse priority (i.e., a lower value reflects a higher priority) of | |||
this Connection relative to other Connections in the same Connection | this Connection relative to other Connections in the same Connection | |||
Group. It has no effect on Connections not part of a Connection | Group. It has no effect on Connections not part of a Connection | |||
Group. As noted in Section 6.4, this property is not entangled when | Group. As noted in Section 6.4, this property is not entangled when | |||
Connections are cloned, i.e., changing the Priority on one Connection | Connections are cloned, i.e., changing the Priority on one Connection | |||
in a Connection Group does not change it on the other Connections in | in a Connection Group does not change it on the other Connections in | |||
the same Connection Group. | the same Connection Group. | |||
10.1.4. Timeout for Aborting Connection | 10.1.4. Timeout for Aborting Connection | |||
Name: conn-timeout | Name: connTimeout | |||
Type: Numeric | Type: Numeric, with special value "Disabled" | |||
Default: -1 | Default: Disabled | |||
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 "Disabled" | |||
that this timeout is not scheduled to happen. This can be a valid | means that this timeout is not scheduled to happen. This can be a | |||
choice with unreliable data transfer (e.g., when UDP is the | valid choice with unreliable data transfer (e.g., when UDP is the | |||
underlying transport protocol). | underlying transport protocol). | |||
10.1.5. Connection Group Transmission Scheduler | 10.1.5. Connection Group Transmission Scheduler | |||
Name: conn-scheduler | Name: connScheduler | |||
Type: Enumeration | Type: Enumeration | |||
Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260]) | Default: Weighted Fair Queueing (see Section 3.6 in [RFC8260]) | |||
This property specifies which scheduler should be used among | This property specifies which scheduler should be used among | |||
Connections within a Connection Group, see Section 6.4. The set of | Connections within a Connection Group, see Section 6.4. The set of | |||
schedulers can be taken from [RFC8260]. | schedulers can be taken from [RFC8260]. | |||
10.1.6. Capacity Profile | 10.1.6. Capacity Profile | |||
Name: conn-capacity-profile | Name: connCapacityProfile | |||
This property specifies the desired network treatment for traffic | This property specifies the desired network treatment for traffic | |||
sent by the application and the tradeoffs the application is prepared | sent by the application and the tradeoffs the application is prepared | |||
to make in path and protocol selection to receive that desired | to make in path and protocol selection to receive that desired | |||
treatment. When the capacity profile is set to a value other than | treatment. When the capacity profile is set to a value other than | |||
Default, the transport system SHOULD select paths and configure | Default, the transport system SHOULD select paths and configure | |||
protocols to optimize the tradeoff between delay, delay variation, | protocols to optimize the tradeoff between delay, delay variation, | |||
and bandwidth efficiency based on the capacity profile specified. | and efficient use of the available capacity based on the capacity | |||
How this is realized is implementation-specific. The Capacity | profile specified. How this is realized is implementation-specific. | |||
Profile MAY also be used to set priorities on the wire for Protocol | The Capacity Profile MAY also be used to set priorities on the wire | |||
Stacks supporting prioritization. Recommendations for use with DSCP | for Protocol Stacks supporting prioritization. Recommendations for | |||
are provided below for each profile; note that when a Connection is | use with DSCP are provided below for each profile; note that when a | |||
multiplexed, the guidelines in Section 6 of [RFC7657] apply. | Connection is multiplexed, the guidelines in Section 6 of [RFC7657] | |||
apply. | ||||
The following values are valid for the Capacity Profile: | The following values are valid for the Capacity Profile: | |||
Default: The application provides no information about its expected | Default: The application provides no information about its expected | |||
capacity profile. Transport system implementations that map the | capacity profile. Transport system implementations that map the | |||
requested capacity profile onto per-connection DSCP signaling | requested capacity profile onto per-connection DSCP signaling | |||
SHOULD assign the DSCP Default Forwarding [RFC2474] PHB. | SHOULD assign the DSCP Default Forwarding [RFC2474] PHB. | |||
Scavenger: The application is not interactive. It expects to send | Scavenger: The application is not interactive. It expects to send | |||
and/or receive data without any urgency. This can, for example, | and/or receive data without any urgency. This can, for example, | |||
be used to select protocol stacks with scavenger transmission | be used to select protocol stacks with scavenger transmission | |||
control and/or to assign the traffic to a lower-effort service. | control and/or to assign the traffic to a lower-effort service. | |||
Transport system implementations that map the requested capacity | Transport system implementations that map the requested capacity | |||
profile onto per-connection DSCP signaling SHOULD assign the DSCP | profile onto per-connection DSCP signaling SHOULD assign the DSCP | |||
Less than Best Effort [RFC8622] PHB. | Less than Best Effort [RFC8622] PHB. | |||
Low Latency/Interactive: The application is interactive, and prefers | Low Latency/Interactive: The application is interactive, and prefers | |||
loss to latency. Response time should be optimized at the expense | loss to latency. Response time should be optimized at the expense | |||
of bandwidth efficiency and delay variation when sending on this | of delay variation and efficient use of the available capacity | |||
connection. This can be used by the system to disable the | when sending on this connection. This can be used by the system | |||
coalescing of multiple small Messages into larger packets (Nagle's | to disable the coalescing of multiple small Messages into larger | |||
algorithm); to prefer immediate acknowledgment from the peer | packets (Nagle's algorithm); to prefer immediate acknowledgment | |||
endpoint when supported by the underlying transport; and so on. | from the peer endpoint when supported by the underlying transport; | |||
Transport system implementations that map the requested capacity | and so on. Transport system implementations that map the | |||
profile onto per-connection DSCP signaling without multiplexing | requested capacity profile onto per-connection DSCP signaling | |||
SHOULD assign a DSCP Assured Forwarding (AF41,AF42,AF43,AF44) | without multiplexing SHOULD assign a DSCP Assured Forwarding | |||
[RFC2597] PHB. Inelastic traffic that is expected to conform to | (AF41,AF42,AF43,AF44) [RFC2597] PHB. Inelastic traffic that is | |||
the configured network service rate could be mapped to the DSCP | expected to conform to the configured network service rate could | |||
Expedited Forwarding [RFC3246] or [RFC5865] PHBs. | 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 delay variation and efficient use of the available | |||
on this connection. Transport system implementations that map the | capacity when sending on this connection. Transport system | |||
requested capacity profile onto per-connection DSCP signaling | implementations that map the requested capacity profile onto per- | |||
without multiplexing SHOULD assign a DSCP Assured Forwarding | connection DSCP signaling without multiplexing SHOULD assign a | |||
(AF21,AF22,AF23,AF24) [RFC2597] PHB. | DSCP Assured Forwarding (AF21,AF22,AF23,AF24) [RFC2597] PHB. | |||
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 efficient | |||
efficiency. This implies that the Connection may fail if the | use of the available capacity. This implies that the Connection | |||
desired rate cannot be maintained across the Path. A transport | may fail if the desired rate cannot be maintained across the Path. | |||
may interpret this capacity profile as preferring a circuit | A transport may interpret this capacity profile as preferring a | |||
breaker [RFC8084] to a rate-adaptive congestion controller. | circuit breaker [RFC8084] to a rate-adaptive congestion | |||
Transport system implementations that map the requested capacity | controller. Transport system implementations that map the | |||
profile onto per-connection DSCP signaling without multiplexing | requested capacity profile onto per-connection DSCP signaling | |||
SHOULD assign a DSCP Assured Forwarding (AF31,AF32,AF33,AF34) | without multiplexing SHOULD assign a DSCP Assured Forwarding | |||
[RFC2597] PHB. | (AF31,AF32,AF33,AF34) [RFC2597] PHB. | |||
High Throughput Data: The application expects to send/receive data | Capacity-Seeking: The application expects to send/receive data at | |||
at the maximum rate allowed by its congestion controller over a | the maximum rate allowed by its congestion controller over a | |||
relatively long period of time. Transport system implementations | relatively long period of time. Transport 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]. | [RFC4594]. | |||
The Capacity Profile for a selected protocol stack may be modified on | The Capacity Profile for a selected protocol stack may be modified on | |||
a per-Message basis using the Transmission Profile Message Property; | a per-Message basis using the Transmission Profile Message Property; | |||
see Section 7.5.8. | see Section 7.5.8. | |||
10.1.7. Bounds on Send or Receive Rate | 10.1.7. Policy for using Multi-Path Transports | |||
Name: max-send-rate / max-recv-rate | Name: multipath-policy | |||
Type: Numeric / Numeric | Type: Enumeration | |||
Default: -1 / -1 (unlimited, for both values) | ||||
Default: Handover | ||||
This property specifies the local policy of transferring data across | ||||
multiple paths between the same end hosts if Parallel Use of Multiple | ||||
Paths not set to Disabled (see Section 5.2.13). Possible values are: | ||||
Handover: The connection should only attempt to migrate between | ||||
different paths when the original path is lost or becomes | ||||
unusable. The actual thresholds to declare a path unusable are | ||||
implementation specific. | ||||
Interactive: The connection should attempt to use multiple paths in | ||||
parallel in order to minimize loss and delay. The actual strategy | ||||
is implementation specific. | ||||
Aggregate: The connection should attempt to use multiple paths in | ||||
parallel in order to maximize bandwidth and possibly overcome | ||||
bandwidth limitations of the individual paths. The actual | ||||
strategy is implementation specific. | ||||
Note that this is a local choice - the peer endpoint can choose a | ||||
different policy. | ||||
10.1.8. Bounds on Send or Receive Rate | ||||
Name: maxSendRate / maxRecvRate | ||||
Type: Numeric (with special value "Unlimited") / Numeric (with | ||||
special value "Unlimited") | ||||
Default: Unlimited / Unlimited | ||||
This property specifies an upper-bound rate that a transfer is not | This property specifies an upper-bound rate that a transfer is not | |||
expected to exceed (even if flow control and congestion control allow | expected to exceed (even if flow control and congestion control allow | |||
higher rates), and/or a lower-bound rate below which the application | higher rates), and/or a lower-bound rate below which the application | |||
does not deem 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 "Unlimited" indicates that no bound is | |||
specified. | ||||
10.1.8. Read-only Connection Properties | 10.1.9. Read-only Connection Properties | |||
The following generic Connection Properties are read-only, i.e. they | The following generic Connection Properties are read-only, i.e. they | |||
cannot be changed by an application. | cannot be changed by an application. | |||
10.1.8.1. Maximum Message Size Concurrent with Connection Establishment | 10.1.9.1. Maximum Message Size Concurrent with Connection Establishment | |||
Name: zero-rtt-msg-max-len | Name: zeroRttMsgMaxLen | |||
Type: Integer | Type: Integer | |||
This property represents the maximum Message size that can be sent | This property represents the maximum Message size that can be sent | |||
before or during Connection establishment, see also Section 7.5.4. | before or during Connection establishment, see also Section 7.5.4. | |||
It is given in Bytes. | It is given in Bytes. | |||
10.1.8.2. Maximum Message Size Before Fragmentation or Segmentation | 10.1.9.2. Maximum Message Size Before Fragmentation or Segmentation | |||
Name: singular-transmission-msg-max-len | Name: singularTransmissionMsgMaxLen | |||
Type: Integer | Type: Integer | |||
This property, if applicable, represents the maximum Message size | This property, if applicable, represents the maximum Message size | |||
that can be sent without incurring network-layer fragmentation or | that can be sent without incurring network-layer fragmentation or | |||
transport layer segmentation at the sender. This property exposes | transport layer segmentation at the sender. This property exposes | |||
the Maximum Packet Size (MPS) as described in Datagram PLPMTUD | the Maximum Packet Size (MPS) as described in Datagram PLPMTUD | |||
[I-D.ietf-tsvwg-datagram-plpmtud]. | [I-D.ietf-tsvwg-datagram-plpmtud]. | |||
10.1.8.3. Maximum Message Size on Send | 10.1.9.3. Maximum Message Size on Send | |||
Name: send-msg-max-len | Name: sendMsgMaxLen | |||
Type: Integer | Type: Integer | |||
This property represents the maximum Message size that can be sent | This property represents the maximum Message size that can be sent | |||
using a send operation. | using a send operation. | |||
10.1.8.4. Maximum Message Size on Receive | 10.1.9.4. Maximum Message Size on Receive | |||
Name: recvMsgMaxLen | ||||
Name: recv-msg-max-len | ||||
Type: Integer | Type: Integer | |||
This numeric property represents the maximum Message size that can be | This numeric property represents the maximum Message size that can be | |||
received. | received. | |||
10.2. TCP-specific Properties: User Timeout Option (UTO) | 10.2. TCP-specific Properties: User Timeout Option (UTO) | |||
These properties specify configurations for the User Timeout Option | These properties specify configurations for the User Timeout Option | |||
(UTO), in case TCP becomes the chosen transport protocol. | (UTO), in case TCP becomes the chosen transport protocol. | |||
Implementation is optional and of course only sensible if TCP is | Implementation is optional and of course only sensible if TCP is | |||
skipping to change at page 54, line 30 ¶ | skipping to change at page 57, line 49 ¶ | |||
feature, it has to expose an interface to it to the application. | feature, it has to expose an interface to it to the application. | |||
Otherwise, the implementation might violate assumptions by the | Otherwise, the implementation might violate assumptions by the | |||
application, which could cause the application to fail. | application, which could cause the application to fail. | |||
All of the below properties are optional (e.g., it is possible to | All of the below properties are optional (e.g., it is possible to | |||
specify "User Timeout Enabled" as true, but not specify an Advertised | specify "User Timeout Enabled" as true, but not specify an Advertised | |||
User Timeout value; in this case, the TCP default will be used). | User Timeout value; in this case, the TCP default will be used). | |||
10.2.1. Advertised User Timeout | 10.2.1. Advertised User Timeout | |||
Name: tcp.user-timeout-value | Name: tcp.userTimeoutValue | |||
Type: Integer | Type: Integer | |||
Default: the TCP default | Default: the TCP default | |||
This time value is advertised via the TCP User Timeout Option (UTO) | This time value is advertised via the TCP User Timeout Option (UTO) | |||
[RFC5482] at the remote endpoint to adapt its own "Timeout for | [RFC5482] at the remote endpoint to adapt its own "Timeout for | |||
aborting Connection" (see Section 10.1.4) value accordingly. | aborting Connection" (see Section 10.1.4) value accordingly. | |||
10.2.2. User Timeout Enabled | 10.2.2. User Timeout Enabled | |||
Name: tcp.user-timeout | Name: tcp.userTimeout | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property controls whether the UTO option is enabled for a | This property controls whether the UTO option is enabled for a | |||
connection. This applies to both sending and receiving. | connection. This applies to both sending and receiving. | |||
10.2.3. Timeout Changeable | 10.2.3. Timeout Changeable | |||
Name: tcp.user-timeout-recv | Name: tcp.userTimeoutRecv | |||
Type: Boolean | Type: Boolean | |||
Default: true | Default: true | |||
This property controls whether the "Timeout for aborting Connection" | This property controls whether the "Timeout for aborting Connection" | |||
(see Section 10.1.4) may be changed based on a UTO option received | (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 | from the remote peer. This boolean becomes false when "Timeout for | |||
aborting Connection" (see Section 10.1.4) is used. | aborting Connection" (see Section 10.1.4) is used. | |||
skipping to change at page 57, line 5 ¶ | skipping to change at page 60, line 24 ¶ | |||
* Closed<> occurs when a Connection transitions to Closed state | * Closed<> occurs when a Connection transitions to Closed state | |||
without error. | without error. | |||
* 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. | |||
* 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 following diagram shows the possible states of a Connection and | ||||
the events that occur upon a transition from one state to another. | ||||
(*) (**) | ||||
Establishing -----> Established -----> Closed | ||||
| ^ | ||||
| | | ||||
+-----------------------------------+ | ||||
InitiateError<> | ||||
(*) Ready<>, ConnectionReceived<>, RendezvousDone<> | ||||
(**) Closed<>, ConnectionError<> | ||||
Figure 1: Connection State Diagram | ||||
The interface provides the following guarantees about the ordering of | The interface provides the following guarantees about the ordering of | |||
operations: | operations: | |||
* Sent<> events will occur on a Connection in the order in which the | * Sent<> events will occur on a Connection in the order in which the | |||
Messages were sent (i.e., delivered to the kernel or to the | Messages were sent (i.e., delivered to the kernel or to the | |||
network interface, depending on implementation). | network interface, depending on implementation). | |||
* Received<> will never occur on a Connection before it is | * 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 | |||
skipping to change at page 59, line 37 ¶ | skipping to change at page 63, line 24 ¶ | |||
contributing text, e.g., on multicast. | contributing text, e.g., on multicast. | |||
16. References | 16. References | |||
16.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", Work in Progress, Internet-Draft, | Transport Services", Work in Progress, Internet-Draft, | |||
draft-ietf-taps-arch-06, 23 December 2019, | draft-ietf-taps-arch-07, 9 March 2020, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-taps-arch- | <http://www.ietf.org/internet-drafts/draft-ietf-taps-arch- | |||
06.txt>. | 07.txt>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC4941] Narten, T., Draves, R., and S. Krishnan, "Privacy | [RFC4941] Narten, T., Draves, R., and S. Krishnan, "Privacy | |||
Extensions for Stateless Address Autoconfiguration in | Extensions for Stateless Address Autoconfiguration in | |||
IPv6", RFC 4941, DOI 10.17487/RFC4941, September 2007, | IPv6", RFC 4941, DOI 10.17487/RFC4941, September 2007, | |||
<https://www.rfc-editor.org/info/rfc4941>. | <https://www.rfc-editor.org/info/rfc4941>. | |||
skipping to change at page 60, line 22 ¶ | skipping to change at page 64, line 9 ¶ | |||
[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>. | |||
16.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", Work in | "Implementing Interfaces to Transport Services", Work in | |||
Progress, Internet-Draft, draft-ietf-taps-impl-05, 4 | Progress, Internet-Draft, draft-ietf-taps-impl-06, 9 March | |||
November 2019, <http://www.ietf.org/internet-drafts/draft- | 2020, <http://www.ietf.org/internet-drafts/draft-ietf- | |||
ietf-taps-impl-05.txt>. | taps-impl-06.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", Work in Progress, Internet- | Services for End Systems", Work in Progress, Internet- | |||
Draft, draft-ietf-taps-minset-11, 27 September 2018, | Draft, draft-ietf-taps-minset-11, 27 September 2018, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-taps- | <http://www.ietf.org/internet-drafts/draft-ietf-taps- | |||
minset-11.txt>. | minset-11.txt>. | |||
[I-D.ietf-taps-transport-security] | [I-D.ietf-taps-transport-security] | |||
Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | |||
Wood, "A Survey of the Interaction Between Security | Wood, "A Survey of the Interaction Between Security | |||
Protocols and Transport Services", Work in Progress, | Protocols and Transport Services", Work in Progress, | |||
Internet-Draft, draft-ietf-taps-transport-security-11, 5 | Internet-Draft, draft-ietf-taps-transport-security-12, 23 | |||
March 2020, <http://www.ietf.org/internet-drafts/draft- | April 2020, <http://www.ietf.org/internet-drafts/draft- | |||
ietf-taps-transport-security-11.txt>. | ietf-taps-transport-security-12.txt>. | |||
[I-D.ietf-tsvwg-datagram-plpmtud] | [I-D.ietf-tsvwg-datagram-plpmtud] | |||
Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | |||
T. Voelker, "Packetization Layer Path MTU Discovery for | T. Voelker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", Work in Progress, Internet-Draft, | Datagram Transports", Work in Progress, Internet-Draft, | |||
draft-ietf-tsvwg-datagram-plpmtud-15, 24 February 2020, | draft-ietf-tsvwg-datagram-plpmtud-22, 10 June 2020, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-tsvwg- | <http://www.ietf.org/internet-drafts/draft-ietf-tsvwg- | |||
datagram-plpmtud-15.txt>. | datagram-plpmtud-22.txt>. | |||
[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, | |||
"Definition of the Differentiated Services Field (DS | "Definition of the Differentiated Services Field (DS | |||
Field) in the IPv4 and IPv6 Headers", RFC 2474, | Field) in the IPv4 and IPv6 Headers", RFC 2474, | |||
DOI 10.17487/RFC2474, December 1998, | DOI 10.17487/RFC2474, December 1998, | |||
<https://www.rfc-editor.org/info/rfc2474>. | <https://www.rfc-editor.org/info/rfc2474>. | |||
[RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | [RFC2597] Heinanen, J., Baker, F., Weiss, W., and J. Wroclawski, | |||
"Assured Forwarding PHB Group", RFC 2597, | "Assured Forwarding PHB Group", RFC 2597, | |||
DOI 10.17487/RFC2597, June 1999, | DOI 10.17487/RFC2597, June 1999, | |||
skipping to change at page 63, line 33 ¶ | skipping to change at page 67, line 26 ¶ | |||
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 | |||
offer 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 | | | preserveOrder | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| congestion-control | require | | | congestionControl | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| preserve-msg-boundaries | ignore | | | preserveMsgBoundaries | ignore | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
Table 2 | 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 | | | preserveOrder | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| congestion-control | require | | | congestionControl | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| preserve-msg-boundaries | require | | | preserveMsgBoundaries | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
Table 3 | 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 | | | preserveOrder | ignore | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| congestion-control | ignore | | | congestionControl | ignore | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| preserve-msg-boundaries | require | | | preserveMsgBoundaries | require | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
| idempotent | true | | | safely replayable | true | | |||
+-------------------------+---------+ | +-----------------------+---------+ | |||
Table 4 | 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 10.1.6 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. Relationship to the Minimal Set of Transport Services for | Appendix B. Relationship to the Minimal Set of Transport Services for | |||
End Systems | End Systems | |||
skipping to change at page 65, line 49 ¶ | skipping to change at page 69, line 49 ¶ | |||
time value (Section 10.1.4). | time value (Section 10.1.4). | |||
* Timeout event when data could not be delivered for too long: | * Timeout event when data could not be delivered for too long: | |||
"ConnectionError" Event (Section 11). | "ConnectionError" Event (Section 11). | |||
* Suggest timeout to the peer: "TCP-specific Property: User Timeout" | * Suggest timeout to the peer: "TCP-specific Property: User Timeout" | |||
(Section 10.2). | (Section 10.2). | |||
* 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 (Section 5.2.15). | property (Section 5.2.16). | |||
* Notification of ICMP error message arrival: "Notification of ICMP | * Notification of ICMP error message arrival: "Notification of ICMP | |||
soft error message arrival" property (Section 5.2.16). | soft error message arrival" property (Section 5.2.17). | |||
* 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). | (Section 10.1.5). | |||
* Configure priority or weight for a scheduler: "Priority | * Configure priority or weight for a scheduler: "Priority | |||
(Connection)" property (Section 10.1.3). | (Connection)" property (Section 10.1.3). | |||
* "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 | |||
(Section 7.5.6) and "Full Checksum Coverage on Sending" property | (Section 7.5.6) and "Full Checksum Coverage on Sending" property | |||
(Section 5.2.7). | (Section 5.2.7). | |||
* "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 | Corruption Protection Coverage for Receiving" property | |||
(Section 10.1.2) and "Full Checksum Coverage on Receiving" | (Section 10.1.2) and "Full Checksum Coverage on Receiving" | |||
property (Section 5.2.8). | property (Section 5.2.8). | |||
* "Specify DF" field and "Request not to bundle messages": the | * "Specify DF" field and "Request not to bundle messages": the "No | |||
"Singular Transmission" Message Property combines both of these | Fragmentation" Message Property combines both of these requests, | |||
requests, i.e. if a request not to bundle messages is made, this | i.e. if a request not to bundle messages is made, this also turns | |||
also turns off fragmentation (i.e., sets DF=1) in case of | off fragmentation (i.e., sets DF=1) in the case of a protocol that | |||
protocols that allow this (only UDP and UDP-Lite, which cannot | allows this (only UDP and UDP-Lite, which cannot bundle messages | |||
bundle messages anyway) (Section 7.5.9). | anyway) (Section 7.5.9). | |||
* 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). | (Section 10.1.9.2). | |||
* 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). | (Section 10.1.9.4). | |||
* Obtain ECN field: "ECN" is a defined UDP(-Lite)-specific read-only | * Obtain ECN field: "ECN" is a defined UDP(-Lite)-specific read-only | |||
Message Property of the MessageContext object (Section 8.3.1). | Message Property of the MessageContext object (Section 8.3.1). | |||
* "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 | (Section 10.1.6). Per-Message control is offered via the "Message | |||
Capacity Profile Override" property (Section 7.5.8). | Capacity Profile Override" property (Section 7.5.8). | |||
* Close after reliably delivering all remaining data, causing an | * Close after reliably delivering all remaining data, causing an | |||
event informing the application on the other side: this is offered | event informing the application on the other side: this is offered | |||
by the "Close" Action with slightly changed semantics in line with | by the "Close" Action with slightly changed semantics in line with | |||
the discussion in Section 5.2 of [I-D.ietf-taps-minset] | the discussion in Section 5.2 of [I-D.ietf-taps-minset] | |||
(Section 11). | (Section 11). | |||
skipping to change at page 68, line 18 ¶ | skipping to change at page 72, line 21 ¶ | |||
* 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). | (Section 7.3.1). | |||
* Notification to a receiver that a partial message delivery has | * Notification to a receiver that a partial message delivery has | |||
been aborted: "ReceiveError" Event (Section 8.2.3). | been aborted: "ReceiveError" Event (Section 8.2.3). | |||
Authors' Addresses | Authors' Addresses | |||
Brian Trammell (editor) | Brian Trammell (editor) | |||
Google Switzerland GmbH | ||||
Gustav-Gull-Platz 1 | Gustav-Gull-Platz 1 | |||
CH- 8004 Zurich | CH- 8004 Zurich | |||
Switzerland | Switzerland | |||
Email: ietf@trammell.ch | Email: ietf@trammell.ch | |||
Michael Welzl (editor) | Michael Welzl (editor) | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
0316 Oslo | 0316 Oslo | |||
Norway | Norway | |||
Email: michawe@ifi.uio.no | Email: michawe@ifi.uio.no | |||
Theresa Enghardt | Theresa Enghardt | |||
TU Berlin | Netflix | |||
Marchstrasse 23 | 121 Albright Way | |||
10587 Berlin | Los Gatos, CA 95032, | |||
Germany | United States of America | |||
Email: theresa@inet.tu-berlin.de | Email: ietf@tenghardt.net | |||
Godred Fairhurst | Godred Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
Fraser Noble Building | Fraser Noble Building | |||
Aberdeen, AB24 3UE | Aberdeen, AB24 3UE | |||
Email: gorry@erg.abdn.ac.uk | Email: gorry@erg.abdn.ac.uk | |||
URI: http://www.erg.abdn.ac.uk/ | URI: http://www.erg.abdn.ac.uk/ | |||
Mirja Kuehlewind | Mirja Kuehlewind | |||
Ericsson | Ericsson | |||
Ericsson-Allee 1 | Ericsson-Allee 1 | |||
Herzogenrath | Herzogenrath | |||
Germany | Germany | |||
Email: mirja.kuehlewind@ericsson.com | Email: mirja.kuehlewind@ericsson.com | |||
Colin Perkins | Colin Perkins | |||
University of Glasgow | University of Glasgow | |||
skipping to change at page 69, line 28 ¶ | skipping to change at page 73, line 30 ¶ | |||
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 | Christopher A. Wood | |||
Apple Inc. | Cloudflare | |||
One Apple Park Way | 101 Townsend St | |||
Cupertino, California 95014, | San Francisco, | |||
United States of America | United States of America | |||
Email: cawood@apple.com | Email: caw@heapingbits.net | |||
Tommy Pauly | Tommy Pauly | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014, | Cupertino, California 95014, | |||
United States of America | United States of America | |||
Email: tpauly@apple.com | Email: tpauly@apple.com | |||
End of changes. 184 change blocks. | ||||
466 lines changed or deleted | 618 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/ |