rfc9621.original | rfc9621.txt | |||
---|---|---|---|---|
TAPS Working Group T. Pauly, Ed. | Internet Engineering Task Force (IETF) T. Pauly, Ed. | |||
Internet-Draft Apple Inc. | Request for Comments: 9621 Apple Inc. | |||
Intended status: Standards Track B. Trammell, Ed. | Category: Standards Track B. Trammell, Ed. | |||
Expires: 12 May 2024 Google Switzerland GmbH | ISSN: 2070-1721 Google Switzerland GmbH | |||
A. Brunstrom | A. Brunstrom | |||
Karlstad University | Karlstad University | |||
G. Fairhurst | G. Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
C. Perkins | C. S. Perkins | |||
University of Glasgow | University of Glasgow | |||
9 November 2023 | December 2024 | |||
Architecture and Requirements for Transport Services | Architecture and Requirements for Transport Services | |||
draft-ietf-taps-arch-19 | ||||
Abstract | Abstract | |||
This document describes an architecture for exposing transport | This document describes an architecture that exposes transport | |||
protocol features to applications for network communication. This | protocol features to applications for network communication. The | |||
system exposes transport protocol features to applications for | Transport Services Application Programming Interface (API) is based | |||
network communication. The Transport Services Application | on an asynchronous, event-driven interaction pattern. This API uses | |||
Programming Interface (API) is based on an asynchronous, event-driven | Messages for representing data transfer to applications and describes | |||
interaction pattern. This API uses messages for representing data | how a Transport Services Implementation can use multiple IP | |||
transfer to applications, and describes how a Transport Services | addresses, multiple protocols, and multiple paths and can provide | |||
Implementation can use multiple IP addresses, multiple protocols, and | multiple application streams. This document provides the | |||
multiple paths, and provide multiple application streams. This | architecture and requirements. It defines common terminology and | |||
document provides the architecture and requirements. It defines | concepts to be used in definitions of a Transport Services API and a | |||
common terminology and concepts to be used in definitions of a | Transport Services Implementation. | |||
Transport Service API and a Transport Services Implementation. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 12 May 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9621. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
1.1. Background . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Background | |||
1.2. Overview . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.2. Overview | |||
1.3. Specification of Requirements . . . . . . . . . . . . . . 5 | 1.3. Specification of Requirements | |||
1.4. Glossary of Key Terms . . . . . . . . . . . . . . . . . . 5 | 1.4. Glossary of Key Terms | |||
2. API Model . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 2. API Model | |||
2.1. Event-Driven API . . . . . . . . . . . . . . . . . . . . 10 | 2.1. Event-Driven API | |||
2.2. Data Transfer Using Messages . . . . . . . . . . . . . . 11 | 2.2. Data Transfer Using Messages | |||
2.3. Flexible Implementation . . . . . . . . . . . . . . . . . 12 | 2.3. Flexible Implementation | |||
2.4. Coexistence . . . . . . . . . . . . . . . . . . . . . . . 13 | 2.4. Coexistence | |||
3. API and Implementation Requirements . . . . . . . . . . . . . 13 | 3. API and Implementation Requirements | |||
3.1. Provide Common APIs for Common Features . . . . . . . . . 14 | 3.1. Provide Common APIs for Common Features | |||
3.2. Allow Access to Specialized Features . . . . . . . . . . 15 | 3.2. Allow Access to Specialized Features | |||
3.3. Select Between Equivalent Protocol Stacks . . . . . . . . 16 | 3.3. Select Between Equivalent Protocol Stacks | |||
3.4. Maintain Interoperability . . . . . . . . . . . . . . . . 17 | 3.4. Maintain Interoperability | |||
3.5. Support Monitoring . . . . . . . . . . . . . . . . . . . 17 | 3.5. Support Monitoring | |||
4. Transport Services Architecture and Concepts . . . . . . . . 18 | 4. Transport Services Architecture and Concepts | |||
4.1. Transport Services API Concepts . . . . . . . . . . . . . 20 | 4.1. Transport Services API Concepts | |||
4.1.1. Endpoint Objects . . . . . . . . . . . . . . . . . . 22 | 4.1.1. Endpoint Objects | |||
4.1.2. Connections and Related Objects . . . . . . . . . . . 22 | 4.1.2. Connections and Related Objects | |||
4.1.3. Pre-establishment . . . . . . . . . . . . . . . . . . 24 | 4.1.3. Preestablishment | |||
4.1.4. Establishment Actions . . . . . . . . . . . . . . . . 24 | 4.1.4. Establishment Actions | |||
4.1.5. Data Transfer Objects and Actions . . . . . . . . . . 25 | 4.1.5. Data Transfer Objects and Actions | |||
4.1.6. Event Handling . . . . . . . . . . . . . . . . . . . 26 | 4.1.6. Event Handling | |||
4.1.7. Termination Actions . . . . . . . . . . . . . . . . . 27 | 4.1.7. Termination Actions | |||
4.1.8. Connection Groups . . . . . . . . . . . . . . . . . . 28 | 4.1.8. Connection Groups | |||
4.2. Transport Services Implementation . . . . . . . . . . . . 28 | 4.2. Transport Services Implementation | |||
4.2.1. Candidate Gathering . . . . . . . . . . . . . . . . . 30 | 4.2.1. Candidate Gathering | |||
4.2.2. Candidate Racing . . . . . . . . . . . . . . . . . . 30 | 4.2.2. Candidate Racing | |||
4.2.3. Separating Connection Contexts . . . . . . . . . . . 30 | 4.2.3. Separating Connection Contexts | |||
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31 | 5. IANA Considerations | |||
6. Security and Privacy Considerations . . . . . . . . . . . . . 31 | 6. Security and Privacy Considerations | |||
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 32 | 7. References | |||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 7.1. Normative References | |||
8.1. Normative References . . . . . . . . . . . . . . . . . . 32 | 7.2. Informative References | |||
8.2. Informative References . . . . . . . . . . . . . . . . . 33 | Acknowledgements | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 35 | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
Many application programming interfaces (APIs) to provide transport | Many Application Programming Interfaces (APIs) to provide transport | |||
interfaces to networks have been deployed, perhaps the most widely | interfaces to networks have been deployed, perhaps the most widely | |||
known and imitated being the BSD Socket [POSIX] interface (Socket | known and imitated being the Socket interface (Socket API) [POSIX]. | |||
API). The naming of objects and functions across these APIs is not | The naming of objects and functions across these APIs is not | |||
consistent and varies depending on the protocol being used. For | consistent and varies, depending on the protocol being used. For | |||
example, sending and receiving streams of data is conceptually the | example, the concept of sending and receiving streams of data is the | |||
same for both an unencrypted Transmission Control Protocol (TCP) | same for both an unencrypted Transmission Control Protocol (TCP) | |||
stream and operating on an encrypted Transport Layer Security (TLS) | stream and operating on an encrypted Transport Layer Security (TLS) | |||
[RFC8446] stream over TCP, but applications cannot use the same | stream [RFC8446] over TCP, but applications cannot use the same | |||
socket send() and recv() calls on top of both kinds of connections. | socket send() and recv() calls on top of both kinds of connections. | |||
Similarly, terminology for the implementation of transport protocols | Similarly, terminology for the implementation of transport protocols | |||
varies based on the context of the protocols themselves: terms such | varies based on the context of the protocols themselves: terms such | |||
as "flow", "stream", "message", and "connection" can take on many | as "flow", "stream", "message", and "connection" can take on many | |||
different meanings. This variety can lead to confusion when trying | different meanings. This variety can lead to confusion when trying | |||
to understand the similarities and differences between protocols, and | to understand the similarities and differences between protocols and | |||
how applications can use them effectively. | how applications can use them effectively. | |||
The goal of the Transport Services System architecture is to provide | The goal of the Transport Services System architecture is to provide | |||
a flexible and reusable system with a common interface for transport | a flexible and reusable system with a common interface for transport | |||
protocols. An application uses the Transport Services System through | protocols. An application uses the Transport Services System through | |||
an abstract Connection (we use capitalization to distinguish these | an abstract Connection (we use capitalization to distinguish these | |||
from the underlying connections of, e.g., TCP). This provides | from the underlying connections of, for example, TCP). This provides | |||
flexible connection establishment allowing an application to request | flexible Connection establishment allowing an application to request | |||
or require a set of properties. | or require a set of Properties. | |||
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 will ensure | |||
the system providing the interface can optimize its behavior based on | that the system providing the interface can optimize its behavior | |||
the application requirements and network conditions, without | based on 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. | faster deployment of new features and protocols. | |||
This architecture can also support applications by offering racing | This architecture can also support applications by offering racing | |||
mechanisms (attempting multiple IP addresses, protocols, or network | mechanisms (attempting multiple IP addresses, protocols, or network | |||
paths in parallel), which otherwise need to be implemented in each | paths in parallel), which otherwise need to be implemented in each | |||
application separately (see Section 4.2.2). Racing selects one or | application separately (see Section 4.2.2). Racing selects one or | |||
more candidates each with equivalent protocol stacks that are used to | more candidates, each with equivalent Protocol Stacks that are used | |||
identify an optimal combination of transport protocol instance such | to identify an optimal combination of a transport protocol instance | |||
as TCP, UDP, or another transport, together with configuration of | such as TCP, UDP, or another transport, together with configuration | |||
parameters and interfaces. A Connection represents an object that, | of parameters and interfaces. A Connection represents an object | |||
once established, can be used to send and receive messages. A | that, once established, can be used to send and receive Messages. A | |||
Connection can also be created from another Connection, by cloning, | Connection can also be created from another Connection, by cloning, | |||
and then forms a part of a Connection Group whose Connections share | and then forms a part of a Connection Group whose Connections share | |||
properties. | Properties. | |||
This document was developed in parallel with the specification of the | This document was developed in parallel with the specification of the | |||
Transport Services API [I-D.ietf-taps-interface] and implementation | Transport Services API [RFC9622] and implementation guidelines | |||
guidelines [I-D.ietf-taps-impl]. Although following the Transport | [RFC9623]. Although following the Transport Services Architecture | |||
Services architecture does not require all APIs and implementations | does not require all APIs and implementations to be identical, a | |||
to be identical, a common minimal set of features represented in a | common minimal set of features represented in a consistent fashion | |||
consistent fashion will enable applications to be easily ported from | will enable applications to be easily ported from one implementation | |||
one implementation of the Transport Services System to another. | of the Transport Services System to another. | |||
1.1. Background | 1.1. Background | |||
The architecture of the Transport Services System is based on the | The architecture of the Transport Services System is based on the | |||
survey of services provided by IETF transport protocols and | survey of services provided by IETF transport protocols and | |||
congestion control mechanisms [RFC8095], and the distilled minimal | congestion control mechanisms [RFC8095] and the distilled minimal set | |||
set of the features offered by transport protocols [RFC8923]. These | of the features offered by transport protocols [RFC8923]. These | |||
documents identified common features and patterns across all | documents identified common features and patterns across all | |||
transport protocols developed thus far in the IETF. | transport protocols developed thus far in the IETF. | |||
Since transport security is an increasingly relevant aspect of using | Since transport security is an increasingly relevant aspect of using | |||
transport protocols on the Internet, this document also considers the | transport protocols on the Internet, this document also considers the | |||
impact of transport security protocols on the feature-set exposed by | impact of transport security protocols on the feature set exposed by | |||
Transport Services [RFC8922]. | Transport Services [RFC8922]. | |||
One of the key insights to come from identifying the minimal set of | One of the key insights to come from identifying the minimal set of | |||
features provided by transport protocols [RFC8923] was that features | features provided by transport protocols [RFC8923] was that features | |||
either require application interaction and guidance (referred to in | either (1) require application interaction and guidance (referred to | |||
that document as Functional or Optimizing Features), or else can be | in that document as Functional or Optimizing Features) or (2) can be | |||
handled automatically by an implementation of the Transport Services | handled automatically by an implementation of the Transport Services | |||
System (referred to as Automatable Features). Among the identified | System (referred to as Automatable Features). Among the identified | |||
Functional and Optimizing Features, some are common across all or | Functional and Optimizing Features, some are common across all or | |||
nearly all transport protocols, while others present features that, | nearly all transport protocols, while others present features that, | |||
if specified, would only be useful with a subset of protocols, but | if specified, would only be useful with a subset of protocols, but | |||
would not harm the functionality of other protocols. For example, | would not harm the functionality of other protocols. For example, | |||
some protocols can deliver messages faster for applications that do | some protocols can deliver messages more quickly for applications | |||
not require messages to arrive in the order in which they were sent. | that do not require messages to arrive in the order in which they | |||
This functionality needs to be explicitly allowed by the application, | were sent. This functionality needs to be explicitly allowed by the | |||
since reordering messages would be undesirable in many cases. | application, since reordering messages would be undesirable in many | |||
cases. | ||||
1.2. Overview | 1.2. Overview | |||
This document describes the Transport Services System in three | The following sections describe the Transport Services System: | |||
sections: | ||||
* Section 2 describes how the Transport Services API model differs | * Section 2 describes how the Transport Services API model differs | |||
from that of traditional socket-based APIs. Specifically, it | from that of socket-based APIs. Specifically, it offers | |||
offers asynchronous event-driven interaction, the use of messages | asynchronous event-driven interaction, the use of Messages for | |||
for data transfer, and the flexibility to use different transport | data transfer, and the flexibility to use different transport | |||
protocols and paths without requiring major changes to the | protocols and paths without requiring major changes to the | |||
application. | application. | |||
* Section 3 explains the fundamental requirements for a Transport | * Section 3 explains the fundamental requirements for a Transport | |||
Services System. These principles are intended to make sure that | Services System. These principles are intended to make sure that | |||
transport protocols can continue to be enhanced and evolve without | transport protocols can continue to be enhanced and evolve without | |||
requiring significant changes by application developers. | requiring significant changes by application developers. | |||
* Section 4 presents the Transport Services Implementation and | * Section 4 presents the Transport Services Implementation and | |||
defines the concepts that are used by the API | defines the concepts that are used by the API [RFC9622] and | |||
[I-D.ietf-taps-interface] and described in the implementation | described in the implementation guidelines [RFC9623]. This | |||
guidelines [I-D.ietf-taps-impl]. This introduces the | introduces the Preconnection, which allows applications to | |||
Preconnection, which allows applications to configure Connection | configure Connection Properties. | |||
Properties. | ||||
1.3. Specification of Requirements | 1.3. Specification of Requirements | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
1.4. Glossary of Key Terms | 1.4. Glossary of Key Terms | |||
This subsection provides a glossary of key terms related to the | This subsection provides a glossary of key terms related to the | |||
Transport Services architecture. It provides a short description of | Transport Services Architecture. It provides a short description of | |||
key terms that are later defined in this document. | key terms that are defined later in this document. | |||
* Application: An entity that uses the transport layer for end-to- | Application: An entity that uses the transport layer for end-to-end | |||
end delivery of data across the network [RFC8095]. | delivery of data across the network [RFC8095]. | |||
* Cached State: The state and history that the Transport Services | Cached State: The state and history that the Transport Services | |||
Implementation keeps for each set of the associated Endpoints that | Implementation keeps for each set of the associated Endpoints that | |||
have been used previously. | have been used previously. | |||
* Candidate Path: One path that is available to an application and | Candidate Path: One path that is available to an application and | |||
conforms to the Selection Properties and System Policy during | conforms to the Selection Properties and System Policy during | |||
racing. | racing. | |||
* Candidate Protocol Stack: One Protocol Stack that can be used by | Candidate Protocol Stack: One Protocol Stack that can be used by an | |||
an application for a Connection during racing. | application for a Connection during racing. | |||
* Client: The peer responsible for initiating a Connection. | Client: The peer responsible for initiating a Connection. | |||
* Clone: A Connection that was created from another Connection, and | Clone: A Connection that was created from another Connection and | |||
forms a part of a Connection Group. | that forms a part of a Connection Group. | |||
* Connection: Shared state of two or more Endpoints that persists | Connection: Shared state of two or more Endpoints that persists | |||
across Messages that are transmitted and received between these | across Messages that are transmitted and received between these | |||
Endpoints [RFC8303]. When this document (and other Transport | Endpoints [RFC8303]. When this document and other Transport | |||
Services documents) use the capitalized "Connection" term, it | Services documents use the capitalized "Connection" term, it | |||
refers to a Connection object that is being offered by the | refers to a Connection object that is being offered by the | |||
Transport Services system, as opposed to more generic uses of the | Transport Services System, as opposed to more generic uses of the | |||
word "connection". | word "connection". | |||
* Connection Context: A set of stored properties across Connections, | Connection Context: A set of stored Properties across Connections, | |||
such as cached protocol state, cached path state, and heuristics, | such as cached protocol state, cached path state, and heuristics, | |||
which can include one or more Connection Groups. | which can include one or more Connection Groups. | |||
* Connection Group: A set of Connections that share properties and | Connection Group: A set of Connections that share Properties and | |||
caches. | caches. | |||
* Connection Property: A Transport Property that controls per- | Connection Property: A Transport Property that controls per- | |||
Connection behavior of a Transport Services implementation. | Connection behavior of a Transport Services Implementation. | |||
* Endpoint: An entity that communicates with one or more other | Endpoint: An entity that communicates with one or more other | |||
endpoints using a transport protocol. | Endpoints using a transport protocol. | |||
* Endpoint Identifier: An identifier that specifies one side of a | Endpoint Identifier: An identifier that specifies one side of a | |||
Connection (local or remote), such as a hostname or URL. | Connection (local or remote), such as a hostname or URL. | |||
* Equivalent Protocol Stacks: Protocol Stacks that can be safely | Equivalent Protocol Stacks: Protocol Stacks that can be safely | |||
swapped or raced in parallel during establishment of a Connection. | swapped or raced in parallel during establishment of a Connection. | |||
* Event: A primitive that is invoked by an Endpoint [RFC8303]. | Event: A primitive that is invoked by an Endpoint [RFC8303]. | |||
* Framer: A data translation layer that can be added to a Connection | Framer: A data translation layer that can be added to a Connection | |||
to define how application-layer Messages are transmitted over a | to define how application-layer Messages are transmitted over a | |||
Protocol Stack. | Protocol Stack. | |||
* Local Endpoint: The local Endpoint. | Local Endpoint: The local Endpoint. | |||
* Local Endpoint Identifier: A representation of the application's | Local Endpoint Identifier: A representation of the application's | |||
identifier for itself that it uses for a Connection. | identifier for itself that it uses for a Connection. | |||
* Message: A unit of data that can be transferred between two | Message: A unit of data that can be transferred between two | |||
Endpoints over a Connection. | Endpoints over a Connection. | |||
* Message Property: A property that can be used to specify details | Message Property: A property that can be used to specify details | |||
about Message transmission, or obtain details about the | about Message transmission or obtain details about the | |||
transmission after receiving a Message. | transmission after receiving a Message. | |||
* Parameter: A value passed between an application and a transport | Parameter: A value passed between an application and a transport | |||
protocol by a primitive [RFC8303]. | protocol by a primitive [RFC8303]. | |||
* Path: A representation of an available set of properties that a | Path: A representation of an available set of Properties that a | |||
Local Endpoint can use to communicate with a Remote Endpoint. | Local Endpoint can use to communicate with a Remote Endpoint. | |||
* Peer: An Endpoint application party to a Connection. | Peer: An Endpoint application party to a Connection. | |||
* Preconnection: an object that represents a Connection that has not | Preconnection: An object that represents a Connection that has not | |||
yet been established. | yet been established. | |||
* Preference: A preference to prohibit, avoid, ignore, prefer, or | Preference: A preference for prohibiting, avoiding, ignoring, | |||
require a specific Transport Feature. | preferring, or requiring a specific transport feature. | |||
* Primitive: A function call that is used to locally communicate | Primitive: A function call that is used to locally communicate | |||
between an application and an Endpoint, which is related to one or | between an application and an Endpoint, which is related to one or | |||
more Transport Features [RFC8303]. | more transport features [RFC8303]. | |||
* Protocol Instance: A single instance of one protocol, including | Protocol Instance: A single instance of one protocol, including any | |||
any state necessary to establish connectivity or send and receive | state necessary to establish connectivity or send and receive | |||
Messages. | Messages. | |||
* Protocol Stack: A set of Protocol Instances that are used together | Protocol Stack: A set of protocol instances that are used together | |||
to establish connectivity or send and receive Messages. | to establish connectivity or send and receive Messages. | |||
* Racing: The attempt to select between multiple Protocol Stacks | Racing: The attempt to select between multiple Protocol Stacks based | |||
based on the Selection and Connection Properties communicated by | on the Selection and Connection Properties communicated by the | |||
the application, along with any Security Parameters. | application, along with any Security Parameters. | |||
* Remote Endpoint: The peer that a local Endpoint can communicate | Remote Endpoint: The peer that a Local Endpoint can communicate with | |||
with when a Connection is established. | when a Connection is established. | |||
* Remote Endpoint Identifier: A representation of the application's | Remote Endpoint Identifier: A representation of the application's | |||
identifier for a peer that can participate in establishing a | identifier for a peer that can participate in establishing a | |||
Connection. | Connection. | |||
* Rendezvous: The action of establishing a peer-to-peer Connection | Rendezvous: The action of establishing a peer-to-peer Connection | |||
with a Remote Endpoint. | with a Remote Endpoint. | |||
* Security Parameters: Parameters that define an application's | Security Parameters: Parameters that define an application's | |||
requirements for authentication and encryption on a Connection. | requirements for authentication and encryption on a Connection. | |||
* Server: The peer responsible for responding to a Connection | Selection Property: A Transport Property that can be set to | |||
influence the selection of paths between the Local and Remote | ||||
Endpoints. | ||||
Server: The peer responsible for responding to a Connection | ||||
initiation. | initiation. | |||
* Socket: The combination of a destination IP address and a | Socket: The combination of a destination IP address and a | |||
destination port number [RFC8303]. | destination port number [RFC8303]. | |||
* System Policy: The input from an operating system or other global | System Policy: The input from an operating system or other global | |||
preferences that can constrain or influence how an implementation | preferences that can constrain or influence how an implementation | |||
will gather Candidate Paths and Protocol Stacks and race the | will gather Candidate Paths and Candidate Protocol Stacks and race | |||
candidates during establishment of a Connection. | the candidates during establishment of a Connection. | |||
* Selection Property: A Transport Property that can be set to | Transport Feature: A specific end-to-end feature that the transport | |||
influence the selection of paths between the Local and Remote | layer provides to an application. | |||
Endpoints. | ||||
* Transport Feature: A specific end-to-end feature that the | Transport Property: A property of a transport protocol and the | |||
transport layer provides to an application. | services it provides [RFC8095]. | |||
* Transport Property: A property that expresses requirements, | Transport Service: A set of transport features, not associated with | |||
prohibitions and preferences [RFC8095]. | any given framing protocol, that provides a complete service to an | |||
application. | ||||
* Transport Service: A set of transport features, without an | Transport Services API: The abstract interface [RFC9622] to a | |||
association to any given framing protocol, that provides a | Transport Services Implementation [RFC9623]. | |||
complete service to an application. | ||||
* Transport Services Implementation: This consists of all objects | Transport Services Implementation: All objects and protocol | |||
and protocol instances used internally to a system or library to | instances used internally to a system or library to implement the | |||
implement the functionality needed to provide a transport service | functionality needed to provide a transport service across a | |||
across a network, as required by the abstract interface. | network, as required by the abstract interface. | |||
* Transport Services System: The Transport Services Implementation | Transport Services System: The Transport Services Implementation and | |||
and the Transport Services API. | the Transport Services API. | |||
2. API Model | 2. API Model | |||
The traditional model of using sockets can be represented as follows | The model of using sockets can be represented as follows (see | |||
(see figure 1): | Figure 1): | |||
* Applications create connections and transfer data using the Socket | * Applications create connections and transfer data using the Socket | |||
API. | API. | |||
* The Socket API provides the interface to the implementations of | * The Socket API provides the interface to the implementations of | |||
TCP and UDP (typically implemented in the system's kernel). | TCP and UDP (typically implemented in the system's kernel). | |||
* TCP and UDP in the kernel send and receive data over the available | * TCP and UDP in the kernel send and receive data over the available | |||
network-layer interfaces. | network-layer interfaces. | |||
* Sockets are bound directly to transport-layer and network-layer | * Sockets are bound directly to transport-layer and network-layer | |||
addresses, obtained via a separate resolution step, usually | addresses, obtained via a separate resolution step, usually | |||
performed by a system-provided DNS stub resolver. | performed by a system-provided DNS stub resolver. | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Application | | | Application | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| | | | | | | | |||
+------------+ +------------+ +--------------+ | +------------+ +------------+ +--------------+ | |||
| DNS stub | | Stream API | | Datagram API | | | DNS Stub | | Stream API | | Datagram API | | |||
| resolver | +------------+ +--------------+ | | Resolver | +------------+ +--------------+ | |||
+------------+ | | | +------------+ | | | |||
+---------------------------------+ | +---------------------------------+ | |||
| TCP UDP | | | TCP UDP | | |||
| Kernel Networking Stack | | | Kernel Networking Stack | | |||
+---------------------------------+ | +---------------------------------+ | |||
| | | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Network Layer Interface | | | Network-Layer Interface | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
Figure 1: Socket API Model | Figure 1: Socket API Model | |||
The architecture of the Transport Services System is an evolution of | The architecture of the Transport Services System is an evolution of | |||
this general model of interaction. It both modernizes the API | this general model of interaction. It both modernizes the API | |||
presented to applications by the transport layer and enriches the | presented to applications by the transport layer and enriches the | |||
capabilities of the Transport Services Implementation below this API. | capabilities of the Transport Services Implementation below this API. | |||
The Transport Services API [RFC9622] defines the interface for an | ||||
application to create Connections and transfer data. It combines | ||||
interfaces for multiple interaction patterns into a unified whole | ||||
(see Figure 2). This offers generic functions and also the protocol- | ||||
specific mappings for TCP, UDP, UDP-Lite, and other protocol layers. | ||||
These mappings are extensible. Future documents could define similar | ||||
mappings for new layers and for other transport protocols, such as | ||||
QUIC [RFC9000]. | ||||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Application | | | Application | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| | | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Transport Services API | | | Transport Services API | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| | | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Transport Services Implementation | | | Transport Services Implementation | | |||
| (Using: DNS, UDP, TCP, SCTP, DCCP, TLS, QUIC, etc) | | | (Using DNS, UDP, TCP, SCTP, DCCP, TLS, QUIC, etc.) | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| | | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Network Layer Interface | | | Network-Layer Interface | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
Figure 2: Transport Services API Model | Figure 2: Transport Services API Model | |||
The Transport Services API [I-D.ietf-taps-interface] defines the | By combining name resolution with Connection establishment and data | |||
interface for an application to create Connections and transfer data. | transfer in a single API, it allows for more flexible implementations | |||
It combines interfaces for multiple interaction patterns into a | to provide path and transport protocol agility on the application's | |||
unified whole (see figure 2). This offers generic functions and also | behalf. | |||
the protocol-specific mappings for TCP, UDP, UDP-Lite, and other | ||||
protocol layers. These mapping are extensible. Future documents | ||||
could define similar mappings for new layers and for other transport | ||||
protocols, such as QUIC [RFC9000]. By combining name resolution with | ||||
connection establishment and data transfer in a single API, it allows | ||||
for more flexible implementations to provide path and transport | ||||
protocol agility on the application's behalf. | ||||
The Transport Services Implementation [I-D.ietf-taps-impl] is the | The Transport Services Implementation [RFC9623] is the component of | |||
component of the Transport Services System that implements the | the Transport Services System that implements the transport-layer | |||
transport layer protocols and other functions needed to send and | protocols and other functions needed to send and receive data. It is | |||
receive data. It is responsible for mapping the API to a specific | responsible for mapping the API to a specific available transport | |||
available transport Protocol Stack and managing the available network | Protocol Stack and managing the available network interfaces and | |||
interfaces and paths. | paths. | |||
There are key differences between the architecture of the Transport | There are key differences between the architecture of the Transport | |||
Services System and the architecture of the Socket API: the API of | Services System and the architecture of the Socket API. The API of | |||
the Transport Services System is asynchronous and event-driven; it | the Transport Services System: | |||
uses messages for representing data transfer to applications; and it | ||||
describes how a Transport Services Implementation can resolve | * is asynchronous and event-driven; | |||
Endpoint Identifiers to use multiple IP addresses, multiple | ||||
protocols, multiple paths, and provide multiple application streams. | * uses Messages for representing data transfer to applications; | |||
* describes how a Transport Services Implementation can resolve | ||||
Endpoint Identifiers to use multiple IP addresses, multiple | ||||
protocols, and multiple paths and to provide multiple application | ||||
streams. | ||||
2.1. Event-Driven API | 2.1. Event-Driven API | |||
Originally, the Socket API presented a blocking interface for | Originally, the Socket API presented a blocking interface for | |||
establishing connections and transferring data. However, most modern | establishing connections and transferring data. However, most modern | |||
applications interact with the network asynchronously. Emulation of | applications interact with the network asynchronously. Emulation of | |||
an asynchronous interface using the Socket API can use a try-and-fail | an asynchronous interface using the Socket API can use a try-and-fail | |||
model: If the application wants to read, but data has not yet been | model: if the application wants to read but data has not yet been | |||
received from the peer, the call to read will fail. The application | received from the peer, the call to read will fail. The application | |||
then waits and can try again later. | then waits and can try again later. | |||
In contrast to the Socket API, all interactions using the Transport | In contrast to the Socket API, all interactions using the Transport | |||
Services API are expected to be asynchronous. The API is defined | Services API are expected to be asynchronous. The API is defined | |||
around an event-driven model (see Section 4.1.6), which models this | around an event-driven model (see Section 4.1.6), which models this | |||
asynchronous interaction. Other forms of asynchronous communication | asynchronous interaction. Other forms of asynchronous communication | |||
could also be available to applications, depending on the platform | could also be available to applications, depending on the platform | |||
implementing the interface. | implementing the interface. | |||
skipping to change at page 11, line 22 ¶ | skipping to change at line 498 ¶ | |||
opposed to how the Socket API represents network resources as file | opposed to how the Socket API represents network resources as file | |||
system objects that may be temporarily unavailable. | system objects that may be temporarily unavailable. | |||
Separate from events, callbacks are also provided for asynchronous | Separate from events, callbacks are also provided for asynchronous | |||
interactions with the Transport Services API that are not directly | interactions with the Transport Services API that are not directly | |||
related to events on the network or network interfaces. | related to events on the network or network interfaces. | |||
2.2. Data Transfer Using Messages | 2.2. Data Transfer Using Messages | |||
The Socket API provides a message interface for datagram protocols | The Socket API provides a message interface for datagram protocols | |||
like UDP, but provides an unstructured stream abstraction for TCP. | like UDP but provides an unstructured stream abstraction for TCP. | |||
While TCP has the ability to send and receive data as a byte-stream, | While TCP has the ability to send and receive data as a byte-stream, | |||
most applications need to interpret structure within this byte- | most applications need to interpret structure within this byte- | |||
stream. For example, HTTP/1.1 uses character delimiters to segment | stream. For example, HTTP/1.1 uses character delimiters to segment | |||
messages over a byte-stream [RFC9112]; TLS record headers carry a | messages over a byte-stream [RFC9112]; TLS record headers carry a | |||
version, content type, and length [RFC8446]; and HTTP/2 uses frames | version, content type, and length [RFC8446]; and HTTP/2 uses frames | |||
to segment its headers and bodies [RFC9113]. | to segment its headers and bodies [RFC9113]. | |||
The Transport Services API represents data as messages, so that it | The Transport Services API represents data as Messages, so that it | |||
more closely matches the way applications use the network. A | more closely matches the way applications use the network. A | |||
message-based abstraction provides many benefits, such as: | Message-based abstraction provides many benefits, such as: | |||
* providing additional information to the Protocol Stack; | * providing additional information to the Protocol Stack; | |||
* the ability to associate deadlines with messages, for applications | * the ability to associate deadlines with Messages, for applications | |||
that care about timing; | that care about timing; | |||
* the ability to control reliability, which messages to retransmit | * the ability to control reliability, which Messages to retransmit | |||
when there is packet loss, and how best to make use of the data | when there is packet loss, and how best to make use of the data | |||
that arrived; | that arrived; | |||
* the ability to automatically assign messages and connections to | * the ability to automatically assign Messages and connections to | |||
underlying transport connections to utilize multi-streaming and | underlying transport connections to utilize multistreaming and | |||
pooled connections. | create Pooled Connections. | |||
Allowing applications to interact with messages is backwards- | Allowing applications to interact with Messages is backward- | |||
compatible with existing protocols and APIs because it does not | compatible with existing protocols and APIs because it does not | |||
change the wire format of any protocol. Instead, it provides the | change the wire format of any protocol. Instead, it provides the | |||
Protocol Stack with additional information to allow it to make better | Protocol Stack with additional information to allow it to make better | |||
use of modern transport services, while simplifying the application's | use of modern Transport Services, while simplifying the application's | |||
role in parsing data. For protocols that inherently use a streaming | role in parsing data. For protocols that inherently use a streaming | |||
abstraction, framers (Section 4.1.5) bridge the gap between the two | abstraction, Framers (Section 4.1.5) bridge the gap between the two | |||
abstractions. | abstractions. | |||
2.3. Flexible Implementation | 2.3. Flexible Implementation | |||
The Socket API for protocols like TCP is generally limited to | The Socket API for protocols like TCP is generally limited to | |||
connecting to a single address over a single interface (IP source | connecting to a single address over a single interface (IP source | |||
address). It also presents a single stream to the application. | address). It also presents a single stream to the application. | |||
Software layers built upon this API often propagate this limitation | Software layers built upon this API often propagate this limitation | |||
of a single-address single-stream model. The Transport Services | of a single-address single-stream model. The Transport Services | |||
architecture is designed: | Architecture is designed to: | |||
* to handle multiple candidate endpoints, protocols, and paths; | * handle multiple candidate endpoints, protocols, and paths; | |||
* to support candidate protocol racing to select the most optimal | * support candidate protocol racing to select the most optimal stack | |||
stack in each situation; | in each situation; | |||
* to support multipath and multistreaming protocols; | * support multipath and multistreaming protocols; | |||
* to provide state caching and application control over it. | * provide state caching and application control over it. | |||
A Transport Services Implementation is intended to be flexible at | A Transport Services Implementation is intended to be flexible at | |||
connection establishment time, considering many different options and | Connection establishment time, considering many different options and | |||
trying to select the most optimal combinations by racing them and | trying to select the most optimal combinations by racing them and | |||
measuring the results (see Section 4.2.1 and Section 4.2.2). This | measuring the results (see Sections 4.2.1 and 4.2.2). This requires | |||
requires applications to specify identifiers for the Local and Remote | applications to specify identifiers for the Local and Remote Endpoint | |||
Endpoint that are higher-level than IP addresses, such as a hostname | that are at a higher level than IP addresses, such as a hostname or | |||
or URL, which are used by a Transport Services Implementation for | URL. These identifiers are used by a Transport Services | |||
resolution, path selection, and racing. An implementation can | Implementation for resolution, path selection, and racing. An | |||
further implement fallback mechanisms if connection establishment of | implementation can further implement fallback mechanisms if | |||
one protocol fails or performance is detected to be unsatisfactory. | connection establishment for one protocol fails or performance is | |||
determined to be unsatisfactory. | ||||
Information used in connection establishment (e.g. cryptographic | Information used in Connection establishment (e.g., cryptographic | |||
resumption tokens, information about usability of certain protocols | resumption tokens, information about usability of certain protocols | |||
on the path, results of racing in previous connections) are cached in | on the path, results of racing in previous connections) is cached in | |||
the Transport Services Implementation. Applications have control | the Transport Services Implementation. Applications have control | |||
over whether this information is used for a specific establishment, | over whether this information is used for a specific establishment, | |||
in order to allow tradeoffs between efficiency and linkability. | in order to allow trade-offs between efficiency and linkability. | |||
Flexibility after connection establishment is also important. | Flexibility after Connection establishment is also important. | |||
Transport protocols that can migrate between multiple network-layer | Transport protocols that can migrate between multiple network-layer | |||
interfaces need to be able to process and react to interface changes. | interfaces need to be able to process and react to interface changes. | |||
Protocols that support multiple application-layer streams need to | Protocols that support multiple application-layer streams need to | |||
support initiating and receiving new streams using existing | support initiating and receiving new streams using existing | |||
connections. | connections. | |||
2.4. Coexistence | 2.4. Coexistence | |||
While the architecture of the Transport Services System is designed | While the architecture of the Transport Services System is designed | |||
as an enhanced replacement for the Socket API, it need not replace it | as an enhanced replacement for the Socket API, it need not replace it | |||
entirely on a system or platform; indeed, coexistence has been | entirely on a system or platform; indeed, coexistence has been | |||
recommended for incremental deployability [RFC8170]. The | recommended for incremental deployability [RFC8170]. The | |||
architecture is therefore designed such that it can run alongside | architecture is therefore designed such that it can run alongside | |||
(or, indeed, on top of) an existing Socket API implementation; only | (or, indeed, on top of) an existing Socket API implementation; only | |||
applications built to the Transport Services API are managed by the | applications built on the Transport Services API are managed by the | |||
system's Transport Services Implementation. | system's Transport Services Implementation. | |||
3. API and Implementation Requirements | 3. API and Implementation Requirements | |||
One goal of the architecture is to redefine the interface between | One goal of the architecture is to redefine the interface between | |||
applications and transports in a way that allows the transport layer | applications and transports in a way that allows the transport layer | |||
to evolve and improve without fundamentally changing the contract | to evolve and improve without fundamentally changing the contract | |||
with the application. This requires a careful consideration of how | with the application. This requires careful consideration of how to | |||
to expose the capabilities of protocols. The architecture also | expose the capabilities of protocols. The architecture also | |||
encompasses system policies that can influence and inform how | encompasses system policies that can influence and inform how | |||
transport protocols use a network path or interface. | transport protocols use a network path or interface. | |||
There are several ways the Transport Services System can offer | There are several ways the Transport Services System can offer | |||
flexibility to an application: it can provide access to transport | flexibility to an application. It can: | |||
protocols and protocol features; it can use these protocols across | ||||
multiple paths that could have different performance and functional | * provide access to transport protocols and protocol features; | |||
characteristics; and it can communicate with different remote systems | ||||
to optimize performance, robustness to failure, or some other metric. | * use these protocols across multiple paths that could have | |||
different performance and functional characteristics; | ||||
* communicate with different remote systems to optimize performance, | ||||
robustness to failure, or some other metric. | ||||
Beyond these, if the Transport Services API remains the same over | Beyond these, if the Transport Services API remains the same over | |||
time, new protocols and features can be added to the Transport | time, new protocols and features can be added to the Transport | |||
Services Implementation without requiring changes in applications for | Services Implementation without requiring changes in applications for | |||
adoption. Similarly, this can provide a common basis for utilizing | adoption. Similarly, this can provide a common basis for utilizing | |||
information about a network path or interface, enabling evolution | information about a network path or interface, enabling evolution | |||
below the transport layer. | below the transport layer. | |||
The normative requirements described in this section allow Transport | The normative requirements described in this section allow Transport | |||
Services APIs and Transport Services Implementation to provide this | Services APIs and the Transport Services Implementation to provide | |||
functionality without causing incompatibility or introducing security | this functionality without causing incompatibility or introducing | |||
vulnerabilities. | security vulnerabilities. | |||
3.1. Provide Common APIs for Common Features | 3.1. Provide Common APIs for Common Features | |||
Any functionality that is common across multiple transport protocols | Any functionality that is common across multiple transport protocols | |||
SHOULD be made accessible through a unified set of calls using the | SHOULD be made accessible through a unified set of calls using the | |||
Transport Services API. As a baseline, any Transport Services API | Transport Services API. As a baseline, any Transport Services API | |||
SHOULD allow access to the minimal set of features offered by | SHOULD allow access to the minimal set of features offered by | |||
transport protocols [RFC8923]. If that minimal set is updated or | transport protocols [RFC8923]. If that minimal set is updated or | |||
expanded in the future, the Transport Services API ought to be | expanded in the future, the Transport Services API ought to be | |||
extended to match. | extended to match. | |||
An application can specify constraints and preferences for the | An application can specify constraints and preferences for the | |||
protocols, features, and network interfaces it will use via | protocols, features, and network interfaces it will use via | |||
Properties. Properties are used by an application to declare its | Properties. Properties are used by an application to declare its | |||
preferences for how the transport service should operate at each | preferences for how the transport service should operate at each | |||
stage in the lifetime of a connection. Transport Properties are | stage in the lifetime of a connection. Transport Properties are | |||
subdivided into Selection Properties, which specify which paths and | subdivided into the following: | |||
Protocol Stacks can be used and are preferred by the application; | ||||
Connection Properties, which inform decisions made during connection | ||||
establishment and fine-tune the established connection; and Message | ||||
Properties, set on individual Messages. | ||||
It is RECOMMENDED that the Transport Services API offers properties | * Selection Properties, which specify which paths and Protocol | |||
Stacks can be used and are preferred by the application; | ||||
* Connection Properties, which inform decisions made during | ||||
Connection establishment and fine-tune the established connection; | ||||
and | ||||
* Message Properties, which can be set on individual Messages. | ||||
It is RECOMMENDED that the Transport Services API offer Properties | ||||
that are common to multiple transport protocols. This enables a | that are common to multiple transport protocols. This enables a | |||
Transport Services System to appropriately select between protocols | Transport Services System to appropriately select between protocols | |||
that offer equivalent features. Similarly, it is RECOMMENDED that | that offer equivalent features. Similarly, it is RECOMMENDED that | |||
the Properties offered by the Transport Services API are applicable | the Properties offered by the Transport Services API be applicable to | |||
to a variety of network layer interfaces and paths, which permits | a variety of network-layer interfaces and paths, to permit racing of | |||
racing of different network paths without affecting the applications | different network paths without affecting the applications using the | |||
using the API. Each is expected to have a default value. | API. Each is expected to have a default value. | |||
It is RECOMMENDED that the default values for Properties are selected | It is RECOMMENDED that the default values for Properties be selected | |||
to ensure correctness for the widest set of applications, while | to ensure correctness for the widest set of applications, while | |||
providing the widest set of options for selection. For example, | providing the widest set of options for selection. For example, | |||
since both applications that require reliability and those that do | since both applications that require reliability and those that do | |||
not require reliability can function correctly when a protocol | not require reliability can function correctly when a protocol | |||
provides reliability, reliability ought to be enabled by default. As | provides reliability, reliability ought to be enabled by default. As | |||
another example, the default value for a Property regarding the | another example, the default value for a Property regarding the | |||
selection of network interfaces ought to permit as many interfaces as | selection of network interfaces ought to permit as many interfaces as | |||
possible. | possible. | |||
Applications using the Transport Services API need to be designed to | Applications using the Transport Services API need to be designed to | |||
be robust to the automated selection provided by the Transport | be robust to the automated selection provided by the Transport | |||
Services System. This automated selection is constrained by the | Services System. This automated selection is constrained by the | |||
properties and preferences expressed by the application and requires | preferences expressed by the application and requires applications to | |||
applications to explicitly set properties that define any necessary | explicitly set Properties that define any necessary constraints on | |||
constraints on protocol, path, and interface selection. | protocol, path, and interface selection. | |||
3.2. Allow Access to Specialized Features | 3.2. Allow Access to Specialized Features | |||
There are applications that will need to control fine-grained details | There are applications that will need to control fine-grained details | |||
of transport protocols to optimize their behavior and ensure | of transport protocols to optimize their behavior and ensure | |||
compatibility with remote systems. It is therefore RECOMMENDED that | compatibility with remote systems. It is therefore RECOMMENDED that | |||
the Transport Services API and the Transport Services Implementation | the Transport Services API and the Transport Services Implementation | |||
permit more specialized protocol features to be used. | permit more specialized protocol features to be used. | |||
A specialized feature could be needed by an application only when | Some specialized features could be needed by an application only when | |||
using a specific protocol, and not when using others. For example, | using a specific protocol and not when using others. For example, if | |||
if an application is using TCP, it could require control over the | an application is using TCP, it could require control over the User | |||
User Timeout Option for TCP [RFC5482]; these options would not take | Timeout Option for TCP [RFC5482]. Such features would not take | |||
effect for other transport protocols. In such cases, the API ought | effect for other transport protocols. In such cases, the API ought | |||
to expose the features in such a way that they take effect when a | to expose the features in such a way that they take effect when a | |||
particular protocol is selected, but do not imply that only that | particular protocol is selected but do not imply that only that | |||
protocol could be used. For example, if the API allows an | protocol could be used. For example, if the API allows an | |||
application to specify a preference to use the User Timeout Option, | application to specify a preference for using the User Timeout | |||
communication would not fail when a protocol such as UDP is selected. | Option, communication would not fail when a protocol such as UDP is | |||
selected. | ||||
Other specialized features, however, can also be strictly required by | Other specialized features, however, can also be strictly required by | |||
an application and thus further constrain the set of protocols that | an application and thus further constrain the set of protocols that | |||
can be used. For example, if an application requires support for | can be used. For example, if an application requires support for | |||
automatic handover or failover for a connection, only Protocol Stacks | automatic handover or failover for a connection, only Protocol Stacks | |||
that provide this feature are eligible to be used, e.g., Protocol | that provide this feature are eligible to be used, e.g., Protocol | |||
Stacks that include a multipath protocol or a protocol that supports | Stacks that include a multipath protocol or a protocol that supports | |||
connection migration. A Transport Services API needs to allow | connection migration. A Transport Services API needs to allow | |||
applications to define such requirements and constrain the options | applications to define such requirements and constrain the options | |||
available to a Transport Services Implementation. Since such options | available to a Transport Services Implementation. Since such options | |||
are not part of the core/common features, it will generally be simple | are not part of the core/common features, it will generally be simple | |||
for an application to modify its set of constraints and change the | for an application to modify its set of constraints and change the | |||
set of allowable protocol features without changing the core | set of allowable protocol features without changing the core | |||
implementation. | implementation. | |||
To control these specialized features, the application can declare | To control these specialized features, the application can declare | |||
its preference – whether the presence of a specific feature is | its preference: whether the presence of a specific feature is | |||
prohibited, should be avoided, can be ignored, is preferred, or is | prohibited, should be avoided, can be ignored, is preferred, or is | |||
required in the pre-establishment phase. An implementation of a | required in the preestablishment phase. An implementation of a | |||
Transport Services API would honor this preference and allow the | Transport Services API would honor this preference and allow the | |||
application to query the availability of each specialized feature | application to query the availability of each specialized feature | |||
after a successful establishment. | after successful establishment. | |||
3.3. Select Between Equivalent Protocol Stacks | 3.3. Select Between Equivalent Protocol Stacks | |||
A Transport Services Implementation can attempt and select between | A Transport Services Implementation can attempt to use, and select | |||
multiple Protocol Stacks based on the Selection and Connection | between, multiple Protocol Stacks based on the Selection and | |||
Properties communicated by the application, along with any Security | Connection Properties communicated by the application, along with any | |||
Parameters. The implementation can only attempt to use multiple | Security Parameters. The implementation can only attempt to use | |||
Protocol Stacks when they are "equivalent", which means that the | multiple Protocol Stacks when they are "equivalent", which means that | |||
stacks can provide the same Transport Properties and interface | the stacks can provide the same Transport Properties and interface | |||
expectations as requested by the application. Equivalent Protocol | expectations as requested by the application. Equivalent Protocol | |||
Stacks can be safely swapped or raced in parallel (see Section 4.2.2) | Stacks can be safely swapped or raced in parallel (see Section 4.2.2) | |||
during connection establishment. | during Connection establishment. | |||
The following two examples show non-equivalent Protocol Stacks: | The following two examples show non-equivalent Protocol Stacks: | |||
* If the application requires preservation of message boundaries, a | * If the application requires preservation of Message boundaries, a | |||
Protocol Stack that runs UDP as the top-level interface to the | Protocol Stack that runs UDP as the top-level interface to the | |||
application is not equivalent to a Protocol Stack that runs TCP as | application is not equivalent to a Protocol Stack that runs TCP as | |||
the top-level interface. A UDP stack would allow an application | the top-level interface. A UDP stack would allow an application | |||
to read out message boundaries based on datagrams sent from the | to read out Message boundaries based on datagrams sent from the | |||
remote system, whereas TCP does not preserve message boundaries on | remote system, whereas TCP does not preserve Message boundaries on | |||
its own, but needs a framing protocol on top to determine message | its own but needs a framing protocol on top to determine Message | |||
boundaries. | boundaries. | |||
* If the application specifies that it requires reliable | * If the application specifies that it requires reliable | |||
transmission of data, then a Protocol Stack using UDP without any | transmission of data, then a Protocol Stack using UDP without any | |||
reliability layer on top would not be allowed to replace a | reliability layer on top would not be allowed to replace a | |||
Protocol Stack using TCP. | Protocol Stack using TCP. | |||
The following example shows Equivalent Protocol Stacks: | The following example shows equivalent Protocol Stacks: | |||
* If the application does not require reliable transmission of data, | * If the application does not require reliable transmission of data, | |||
then a Protocol Stack that adds reliability could be regarded as | then a Protocol Stack that adds reliability could be regarded as | |||
an Equivalent Protocol Stack as long as providing this would not | an equivalent Protocol Stack as long as providing this would not | |||
conflict with any other application-requested properties. | conflict with any other application-requested Properties. | |||
A Transport Services Implementation can race different security | A Transport Services Implementation can race different security | |||
protocols, e.g., if the System Policy is explicitly configured to | protocols, e.g., if the System Policy is explicitly configured to | |||
consider them equivalent. A Transport Services implementation SHOULD | consider them equivalent. A Transport Services Implementation SHOULD | |||
only race Protocol Stacks where the transport security protocols | only race Protocol Stacks where the transport security protocols | |||
within the stacks are identical. To ensure that security protocols | within the stacks are identical. To ensure that security protocols | |||
are not incorrectly swapped, a Transport Services Implementation MUST | are not incorrectly swapped, a Transport Services Implementation MUST | |||
only select Protocol Stacks that meet application requirements | only select Protocol Stacks that meet application requirements | |||
([RFC8922]). A Transport Services Implementation MUST NOT | [RFC8922]. A Transport Services Implementation MUST NOT | |||
automatically fall back from secure protocols to insecure protocols, | automatically fall back from secure protocols to insecure protocols | |||
or to weaker versions of secure protocols. A Transport Services | or fall back to weaker versions of secure protocols. A Transport | |||
Implementation MAY allow applications to explicitly specify which | Services Implementation MAY allow applications to explicitly specify | |||
versions of a protocol ought to be permitted, e.g., to allow a | which versions of a protocol ought to be permitted, e.g., to allow a | |||
minimum version of TLS 1.2 in case TLS 1.3 is not available. | minimum version of TLS 1.2 if TLS 1.3 is not available. | |||
A Transport Services Implementation MAY specify security properties | A Transport Services Implementation MAY specify security Properties | |||
relating to how the system operates (e.g., requirements, | relating to how the system operates (e.g., requirements, | |||
prohibitions, and preferences for the use of DNS Security Extensions | prohibitions, and preferences for the use of DNS Security Extensions | |||
(DNSSEC) or DNS over HTTPS (DoH)). | (DNSSEC) or DNS over HTTPS (DoH)). | |||
3.4. Maintain Interoperability | 3.4. Maintain Interoperability | |||
It is important to note that neither the Transport Services API | It is important to note that neither the Transport Services API | |||
[I-D.ietf-taps-interface] nor the guidelines for implementation of | [RFC9622] nor the guidelines for implementation of the Transport | |||
the Transport Service System [I-D.ietf-taps-impl] define new | Services System [RFC9623] define new protocols or protocol | |||
protocols or protocol capabilities that affect what is communicated | capabilities that affect what is communicated across the network. A | |||
across the network. A Transport Services System MUST NOT require | Transport Services System MUST NOT require that a peer on the other | |||
that a peer on the other side of a connection uses the same API or | side of a connection use the same API or implementation. A Transport | |||
implementation. A Transport Services Implementation acting as a | Services Implementation acting as a connection initiator is able to | |||
connection initiator is able to communicate with any existing | communicate with any existing Endpoint that implements the transport | |||
Endpoint that implements the transport protocol(s) and all the | protocol(s) and all the required Properties selected. Similarly, a | |||
required properties selected. Similarly, a Transport Services | Transport Services Implementation acting as a Listener can receive | |||
Implementation acting as a Listener can receive connections for any | connections for any protocol that is supported from an existing | |||
protocol that is supported from an existing initiator that implements | initiator that implements the protocol, independently of whether or | |||
the protocol, independent of whether the initiator uses the Transport | not the initiator uses the Transport Services System. | |||
Services System or not. | ||||
A Transport Services Implemenation makes decisions that select | A Transport Services Implementation makes decisions that select | |||
protocols and interfaces. In normal use, a given version of a | protocols and interfaces. In normal use, a given version of a | |||
Transport Services System SHOULD result in consistent protocol and | Transport Services System SHOULD result in consistent protocol and | |||
interface selection decisions for the same network conditions given | interface selection decisions for the same network conditions, given | |||
the same set of Properties. This is intended to provide predictable | the same set of Properties. This is intended to provide predictable | |||
outcomes to the application using the API. | outcomes to the application using the API. | |||
3.5. Support Monitoring | 3.5. Support Monitoring | |||
The Transport Services API increases the layer of abstraction for | The Transport Services API increases the layer of abstraction for | |||
applications, and it enables greater automation below the API. Such | applications, and it enables greater automation below the API. Such | |||
increased abstraction comes at the cost of increased complexity when | increased abstraction comes at the cost of increased complexity when | |||
application programmers, users or system administrators try to | application programmers, users, or system administrators try to | |||
understand why any issues and failures may be happening. Transport | understand why any issues and failures may be happening. A Transport | |||
Services systems should therefore offer monitoring functions that | Services System should therefore offer monitoring functions that | |||
provide relevant debug and diagnostics information. For example, | provide relevant debug and diagnostics information. For example, | |||
such monitoring functions could indicate the protocol(s) in use, the | such monitoring functions could indicate the protocol(s) in use, the | |||
number of open connections per protocol, and any statistics that | number of open connections per protocol, and any statistics that | |||
these protocols may offer. | these protocols may offer. | |||
4. Transport Services Architecture and Concepts | 4. Transport Services Architecture and Concepts | |||
This section of the document describes the architecture non- | This section describes the architecture non-normatively and explains | |||
normatively and explains the operation of a Transport Services | the operation of a Transport Services Implementation. The concepts | |||
Implementation. The concepts defined in this document are intended | defined in this document are intended primarily for use in the | |||
primarily for use in the documents and specifications that describe | documents and specifications that describe the Transport Services | |||
the Transport Services System. This includes the architecture, the | System. This includes the architecture, the Transport Services API, | |||
Transport Services API and the associated Transport Services | and the associated Transport Services Implementation. While the | |||
Implementation. While the specific terminology can be used in some | specific terminology can be used in some implementations, it is | |||
implementations, it is expected that there will remain a variety of | expected that there will remain a variety of terms used by running | |||
terms used by running code. | code. | |||
The architecture divides the concepts for Transport Services System | The architecture divides the concepts for the Transport Services | |||
into two categories: | System into two categories: | |||
1. API concepts, which are intended to be exposed to applications; | 1. API concepts, which are intended to be exposed to applications; | |||
and | and | |||
2. System-implementation concepts, which are intended to be | 2. System-implementation concepts, which are intended to be | |||
internally used by a Transport Services Implementation. | internally used by a Transport Services Implementation. | |||
The following diagram summarizes the top-level concepts in a | The following diagram summarizes the top-level concepts in a | |||
Transport Services System and how they relate to one another. | Transport Services System and how they relate to one another. | |||
skipping to change at page 19, line 36 ¶ | skipping to change at line 859 ¶ | |||
| | | | | | | | |||
| (Candidate Racing) | +-----------------+ | | | (Candidate Racing) | +-----------------+ | | |||
| | | System | | | | | | System | | | |||
| | | Policy | | | | | | Policy | | | |||
| +----------v-----+ +-----------------+ | | | +----------v-----+ +-----------------+ | | |||
| | Protocol | | | | | Protocol | | | |||
+-------------+ Stack(s) +----------------------+ | +-------------+ Stack(s) +----------------------+ | |||
+-------+--------+ | +-------+--------+ | |||
V | V | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
| Network Layer Interface | | | Network-Layer Interface | | |||
+-----------------------------------------------------+ | +-----------------------------------------------------+ | |||
Figure 3: Concepts and Relationships in the Architecture of the | Figure 3: Concepts and Relationships in the Architecture of the | |||
Transport Services System | Transport Services System | |||
The Transport Services Implementation includes the Cached State and | The Transport Services Implementation includes the Cached State and | |||
System Policy. | System Policy. | |||
The System Policy provides input from an operating system or other | The System Policy provides input from an operating system or other | |||
global preferences that can constrain or influence how an | global preferences that can constrain or influence how an | |||
implementation will gather Candidate Paths and Protocol Stacks and | implementation will gather Candidate Paths and Protocol Stacks and | |||
race the candidates when establishing a Connection. As the details | race the candidates when establishing a Connection. As the details | |||
of System Policy configuration and enforcement are largely platform- | of System Policy configuration and enforcement are largely dependent | |||
and implementation- dependent, and do not affect application-level | on the platform and implementation and do not affect application- | |||
interoperability, the Transport Services API | level interoperability, the Transport Services API [RFC9622] does not | |||
[I-D.ietf-taps-interface] does not specify an interface for reading | specify an interface for reading or writing System Policy. | |||
or writing System Policy. | ||||
The Cached State is the state and history that the Transport Services | The Cached State is the state and history that the Transport Services | |||
Implementation keeps for each set of associated Endpoints that have | Implementation keeps for each set of associated Endpoints that have | |||
previously been used. An application ought to explicitly request any | previously been used. An application ought to explicitly request any | |||
required or desired properties via the Transport Services API. | required or preferred Properties via the Transport Services API. | |||
4.1. Transport Services API Concepts | 4.1. Transport Services API Concepts | |||
Fundamentally, a Transport Services API needs to provide Connection | Fundamentally, a Transport Services API needs to provide Connection | |||
objects (Section 4.1.2) that allow applications to establish | objects (Section 4.1.2) that allow applications to establish | |||
communication, and then send and receive data. These could be | communication and then send and receive data. These could be exposed | |||
exposed as handles or referenced objects, depending on the chosen | as handles or referenced objects, depending on the chosen programming | |||
programming language. | language. | |||
Beyond the Connection objects, there are several high-level groups of | Beyond the Connection objects, there are several high-level groups of | |||
actions that any Transport Services API needs to provide: | actions that any Transport Services API needs to provide: | |||
* Pre-establishment (Section 4.1.3) encompasses the properties that | * Preestablishment (Section 4.1.3) encompasses the Properties that | |||
an application can pass to describe its intent, requirements, | an application can pass to describe its intent, requirements, | |||
prohibitions, and preferences for its networking operations. | prohibitions, and preferences for its networking operations. | |||
These properties apply to multiple transport protocols, unless | These Properties apply to multiple transport protocols, unless | |||
otherwise specified. Properties specified during pre- | otherwise specified. Properties specified during preestablishment | |||
establishment can have a large impact on the rest of the | can have a large impact on the rest of the interface: they modify | |||
interface: they modify how establishment occurs, they influence | how establishment occurs, influence the expectations around data | |||
the expectations around data transfer, and they determine the set | transfer, and determine the set of events that will be supported. | |||
of events that will be supported. | ||||
* Establishment (Section 4.1.4) focuses on the actions that an | * Establishment (Section 4.1.4) focuses on the actions that an | |||
application takes on the Connection objects to prepare for data | application takes on the Connection objects to prepare for data | |||
transfer. | transfer. | |||
* Data Transfer (Section 4.1.5) consists of how an application | * Data transfer (Section 4.1.5) consists of how an application | |||
represents the data to be sent and received, the functions | represents the data to be sent and received, the functions | |||
required to send and receive that data, and how the application is | required to send and receive that data, and how the application is | |||
notified of the status of its data transfer. | notified of the status of its data transfer. | |||
* Event Handling (Section 4.1.6) defines categories of notifications | * Event handling (Section 4.1.6) defines categories of notifications | |||
that an application can receive during the lifetime of a | that an application can receive during the lifetime of a | |||
Connection. Events also provide opportunities for the application | Connection. Events also provide opportunities for the application | |||
to interact with the underlying transport by querying state or | to interact with the underlying transport by querying state or | |||
updating maintenance options. | updating maintenance options. | |||
* Termination (Section 4.1.7) focuses on the methods by which data | * Termination (Section 4.1.7) focuses on the methods by which data | |||
transmission is stopped, and connection state is torn down. | transmission is stopped and connection state is torn down. | |||
The diagram below provides a high-level view of the actions and | The diagram below provides a high-level view of the actions and | |||
events during the lifetime of a Connection object. Note that some | events during the lifetime of a Connection object. Note that some | |||
actions are alternatives (e.g., whether to initiate a connection or | actions are alternatives (e.g., whether to initiate a connection or | |||
to listen for incoming connections), while others are optional (e.g., | listen for incoming connections), while others are optional (e.g., | |||
setting Connection and Message Properties in pre-establishment) or | setting Connection and Message Properties in preestablishment) or | |||
have been omitted for brevity and simplicity. | have been omitted for brevity and simplicity. | |||
Pre-establishment : Established : Termination | Preestablishment : Established : Termination | |||
----------------- : ----------- : ----------- | ----------------- : ----------- : ----------- | |||
: : | : : | |||
+-- Local Endpoint : Message : | +-- Local Endpoint : Message : | |||
+-- Remote Endpoint : Receive() | : | +-- Remote Endpoint : Receive() | : | |||
+-- Transport Properties : Send() | : | +-- Transport Properties : Send() | : | |||
+-- Security Parameters : | : | +-- Security Parameters : | : | |||
| : | : | | : | : | |||
| InitiateWithSend() | Close() : | | InitiateWithSend() | Close() : | |||
| +---------------+ Initiate() +-----+------+ Abort() : | | +---------------+ Initiate() +-----+------+ Abort() : | |||
+---+ Preconnection |------------->| Connection |-----------> Closed | +---+ Preconnection |------------->| Connection |-----------> Closed | |||
+---------------+ Rendezvous() +------------+ : | +---------------+ Rendezvous() +------------+ : | |||
Listen() | : | | : | Listen() | : | | : | |||
| : | v : | | : | v : | |||
v : | Connection : | v : | Connection : | |||
+----------+ : | Ready : | +----------+ : | Ready : | |||
| Listener |----------------------+ : | | Listener |----------------------+ : | |||
+----------+ Connection Received : | +----------+ Connection Received : | |||
: : | : : | |||
Figure 4: The lifetime of a Connection object | Figure 4: The Lifetime of a Connection Object | |||
In this diagram, the lifetime of a Connection object is divided into | In this diagram, the lifetime of a Connection object is divided into | |||
three phases: pre-establishment, the Established state, and | three phases: preestablishment, the Established state, and | |||
Termination. | termination of a Connection. | |||
Pre-establishment is based around a Preconnection object, that | Preestablishment is based around a Preconnection object containing | |||
contains various sub-objects that describe the properties and | various sub-objects that describe the Properties and parameters of | |||
parameters of desired Connections (Local and Remote Endpoints, | desired Connections (Local and Remote Endpoints, Transport | |||
Transport Properties, and Security Parameters). A Preconnection can | Properties, and Security Parameters). A Preconnection can be used to | |||
be used to start listening for inbound connections, in which case a | start listening for inbound connections -- in which case a Listener | |||
Listener object is created, or can be used to establish a new | object is created -- or can be used to establish a new connection | |||
connection directly using Initiate (for outbound connections) or | directly using Initiate (for outbound connections) or Rendezvous (for | |||
Rendezvous (for peer-to-peer connections). | peer-to-peer connections). | |||
Once a Connection is in the Established state, an application can | Once a Connection is in the Established state, an application can | |||
send and receive Message objects, and receive state updates. | send and receive Message objects and can receive state updates. | |||
Closing or aborting a connection, either locally or from the peer, | Closing or aborting a Connection, either locally or from the peer, | |||
can terminate a connection. | can terminate a Connection. | |||
4.1.1. Endpoint Objects | 4.1.1. Endpoint Objects | |||
An Endpoint Identifier specifies one side of a transport connection. | An Endpoint Identifier specifies one side of a transport connection. | |||
Endpoints can be Local Endpoints or Remote Endpoints, and the | Endpoints can be Local Endpoints or Remote Endpoints, and the | |||
Endpoint Identifiers can respectively represent an identity that the | Endpoint Identifiers can respectively represent an identity that the | |||
application uses for the source or destination of a connection. An | application uses for the source or destination of a connection. An | |||
Endpoint Identifier can be specified at various levels of | Endpoint Identifier can be specified at various levels of | |||
abstraction. An Endpoint Identifier at a higher level of abstraction | abstraction. An Endpoint Identifier at a higher level of abstraction | |||
(such as a hostname) can be resolved to more concrete identities | (such as a hostname) can be resolved to more concrete identities | |||
(such as IP addresses). A Remote Endpoint Identifier can also | (such as IP addresses). A Remote Endpoint Identifier can also | |||
represent a multicast group or anycast address. In the case of | represent a multicast group or anycast address. In the case of | |||
multicast, this selects a multicast transport for communication. | multicast, a multicast transport will be selected for communication. | |||
* Remote Endpoint Identifier: The Remote Endpoint Identifier | Remote Endpoint Identifier: The Remote Endpoint Identifier | |||
represents the application's identifier for a peer that can | represents the application's identifier for a peer that can | |||
participate in a transport connection; for example, the | participate in a transport connection, for example, the | |||
combination of a DNS name for the peer and a service name/port. | combination of a DNS name for the peer and a service name/port. | |||
* Local Endpoint Identifier: The Local Endpoint Identifier | Local Endpoint Identifier: The Local Endpoint Identifier represents | |||
represents the application's identifier for itself that it uses | the application's identifier for itself that it uses for transport | |||
for transport connections; for example, a local IP address and | connections, for example, a local IP address and port. | |||
port. | ||||
4.1.2. Connections and Related Objects | 4.1.2. Connections and Related Objects | |||
* Connection: A Connection object represents one or more active | Connection: A Connection object represents one or more active | |||
transport protocol instances that can send and/or receive Messages | transport protocol instances that can send and/or receive Messages | |||
between Local and Remote Endpoints. It is an abstraction that | between Local and Remote Endpoints. It is an abstraction that | |||
represents the communication. The Connection object holds state | represents the communication. The Connection object holds state | |||
pertaining to the underlying transport protocol instances and any | pertaining to the underlying transport protocol instances and any | |||
ongoing data transfers. For example, an active Connection can | ongoing data transfers. For example, an active Connection can | |||
represent a connection-oriented protocol such as TCP, or can | represent a connection-oriented protocol such as TCP, or it can | |||
represent a fully-specified 5-tuple for a connectionless protocol | represent a fully specified 5-tuple for a connectionless protocol | |||
such as UDP, where the Connection remains an abstraction at the | such as UDP, where the Connection remains an abstraction at the | |||
endpoints. It can also represent a pool of transport protocol | endpoints. It can also represent a pool of transport protocol | |||
instances, e.g., a set of TCP and QUIC connections to equivalent | instances, e.g., a set of TCP and QUIC connections to equivalent | |||
endpoints, or a stream of a multi-streaming transport protocol | endpoints, or a stream of a multistreaming transport protocol | |||
instance. Connections can be created from a Preconnection or by a | instance. Connections can be created from a Preconnection or by a | |||
Listener. | Listener. | |||
* Preconnection: A Preconnection object is a representation of a | Preconnection: A Preconnection object is a representation of a | |||
Connection that has not yet been established. It has state that | Connection that has not yet been established. It has state that | |||
describes parameters of the Connection: the Local Endpoint | describes parameters of the Connection: the Local Endpoint | |||
Identifier from which that Connection will be established, the | Identifier from which that Connection will be established, the | |||
Remote Endpoint Identifier (Section 4.1.3) to which it will | Remote Endpoint Identifier to which it will connect, and Transport | |||
connect, and Transport Properties that influence the paths and | Properties that influence the paths and protocols a Connection | |||
protocols a Connection will use. A Preconnection can be either | will use. A Preconnection can be either fully specified | |||
fully specified (representing a single possible Connection), or it | (representing a single possible Connection) or partially specified | |||
can be partially specified (representing a family of possible | (representing a family of possible Connections). The Local | |||
Connections). The Local Endpoint (Section 4.1.3) is required for | Endpoint (Section 4.1.3) is required for a Preconnection used to | |||
a Preconnection used to Listen for incoming Connections, but | Listen for incoming Connections but is optional if it is used to | |||
optional if it is used to Initiate a Connection. The Remote | Initiate a Connection. The Remote Endpoint Identifier is required | |||
Endpoint Identifier is required in a Preconnection that used to | in a Preconnection that is used to Initiate a Connection but is | |||
Initiate a Connection, but is optional if it is used to Listen for | optional if it is used to Listen for incoming Connections. The | |||
incoming Connections. The Local Endpoint Identifier and the | Local Endpoint Identifier and the Remote Endpoint Identifier are | |||
Remote Endpoint Identifier are both required if a peer-to-peer | both required if a peer-to-peer Rendezvous is to occur based on | |||
Rendezvous is to occur based on the Preconnection. | the Preconnection. | |||
* Transport Properties: Transport Properties allow the application | Transport Properties: Transport Properties allow the application to | |||
to express their requirements, prohibitions, and preferences and | express requirements, prohibitions, and preferences and configure | |||
configure a Transport Services Implementation. There are three | a Transport Services Implementation. There are three kinds of | |||
kinds of Transport Properties: | Transport Properties: | |||
- Selection Properties (Section 4.1.3): Selection Properties can | Selection Properties (Section 4.1.3): Selection Properties can | |||
only be specified on a Preconnection. | only be specified on a Preconnection. | |||
- Connection Properties (Section 4.1.3): Connection Properties | Connection Properties (Section 4.1.3): Connection Properties can | |||
can be specified on a Preconnection and changed on the | be specified on a Preconnection and changed on the Connection. | |||
Connection. | ||||
- Message Properties (Section 4.1.5): Message Properties can be | Message Properties (Section 4.1.5): Message Properties can be | |||
specified as defaults on a Preconnection or a Connection, and | specified as defaults on a Preconnection or a Connection and | |||
can also be specified during data transfer to affect specific | can also be specified during data transfer to affect specific | |||
Messages. | Messages. | |||
* Listener: A Listener object accepts incoming transport protocol | Listener: A Listener object accepts incoming transport protocol | |||
connections from Remote Endpoints and generates corresponding | connections from Remote Endpoints and generates corresponding | |||
Connection objects. It is created from a Preconnection object | Connection objects. It is created from a Preconnection object | |||
that specifies the type of incoming Connections it will accept. | that specifies the type of incoming Connections it will accept. | |||
4.1.3. Pre-establishment | 4.1.3. Preestablishment | |||
* Selection Properties: The Selection Properties consist of the | Selection Properties: Selection Properties consist of the Properties | |||
properties that an application can set to influence the selection | that an application can set to influence the selection of paths | |||
of paths between the Local and Remote Endpoints, to influence the | between the Local and Remote Endpoints, influence the selection of | |||
selection of transport protocols, or to configure the behavior of | transport protocols, or configure the behavior of generic | |||
generic transport protocol features. These properties can take | transport protocol features. These Properties can take the form | |||
the form of requirements, prohibitions, or preferences. Examples | of requirements, prohibitions, or preferences. Examples of | |||
of properties that influence path selection include the interface | Properties that influence path selection include the interface | |||
type (such as a Wi-Fi connection, or a Cellular LTE connection), | type (such as a Wi-Fi connection or a Cellular LTE connection), | |||
requirements around the largest Message that can be sent, or | requirements around the largest Message that can be sent, or | |||
preferences for throughput and latency. Examples of properties | preferences for throughput and latency. Examples of Properties | |||
that influence protocol selection and configuration of transport | that influence protocol selection and configuration of transport | |||
protocol features include reliability, multipath support, and fast | protocol features include reliability, multipath support, and | |||
open support. | support for TCP Fast Open. | |||
* Connection Properties: The Connection Properties are used to | Connection Properties: Connection Properties are used to configure | |||
configure protocol-specific options and control per-connection | protocol-specific options and control per-connection behavior of a | |||
behavior of a Transport Services Implementation; for example, a | Transport Services Implementation; for example, a protocol- | |||
protocol-specific Connection Property can express that if TCP is | specific Connection Property can express that if TCP is used, the | |||
used, the implementation ought to use the User Timeout Option. | implementation ought to use the User Timeout Option. Note that | |||
Note that the presence of such a property does not require that a | the presence of such a property does not require that a specific | |||
specific protocol will be used. In general, these properties do | protocol be used. In general, these Properties do not explicitly | |||
not explicitly determine the selection of paths or protocols, but | determine the selection of paths or protocols but can be used by | |||
can be used by an implementation during connection establishment. | an implementation during Connection establishment. Connection | |||
Connection Properties are specified on a Preconnection prior to | Properties are specified on a Preconnection prior to Connection | |||
Connection establishment, and can be modified on the Connection | establishment and can be modified on the Connection later. | |||
later. Changes made to Connection Properties after Connection | Changes made to Connection Properties after Connection | |||
establishment take effect on a best-effort basis. | establishment take effect on a best-effort basis. | |||
* Security Parameters: Security Parameters define an application's | Security Parameters: Security Parameters define an application's | |||
requirements for authentication and encryption on a Connection. | requirements for authentication and encryption on a Connection. | |||
They are used by Transport Security protocols (such as those | They are used by transport security protocols (such as those | |||
described in [RFC8922]) to establish secure Connections. Examples | described in [RFC8922]) to establish secure Connections. Examples | |||
of parameters that can be set include local identities, private | of parameters that can be set include local identities, private | |||
keys, supported cryptographic algorithms, and requirements for | keys, supported cryptographic algorithms, and requirements for | |||
validating trust of remote identities. Security Parameters are | validating trust of remote identities. Security Parameters are | |||
primarily associated with a Preconnection object, but properties | primarily associated with a Preconnection object, but Properties | |||
related to identities can be associated directly with Endpoints. | related to identities can be associated directly with Endpoints. | |||
4.1.4. Establishment Actions | 4.1.4. Establishment Actions | |||
* Initiate: The primary action that an application can take to | Initiate: The primary action that an application can take to create | |||
create a Connection to a Remote Endpoint, and prepare any required | a Connection to a Remote Endpoint and prepare any required local | |||
local or remote state to enable the transmission of Messages. For | or remote state to enable the transmission of Messages. For some | |||
some protocols, this will initiate a client-to-server style | protocols, this will initiate a client-to-server-style handshake; | |||
handshake; for other protocols, this will just establish local | for other protocols, this will just establish local state (e.g., | |||
state (e.g., with connectionless protocols such as UDP). The | with connectionless protocols such as UDP). The process of | |||
process of identifying options for connecting, such as resolution | identifying options for connecting, such as resolution of the | |||
of the Remote Endpoint Identifier, occurs in response to the | Remote Endpoint Identifier, occurs in response to calling | |||
Initiate call. | Initiate. | |||
* Listen: Enables a Listener to accept incoming connections. The | Listen: Enables a Listener to accept incoming connections. The | |||
Listener will then create Connection objects as incoming | Listener will then create Connection objects as incoming | |||
connections are accepted (Section 4.1.6). Listeners by default | connections are accepted (Section 4.1.6). Listeners by default | |||
register with multiple paths, protocols, and Local Endpoints, | register with multiple paths, protocols, and Local Endpoints, | |||
unless constrained by Selection Properties and/or the specified | unless constrained by Selection Properties and/or the specified | |||
Local Endpoint Identifier(s). Connections can be accepted on any | Local Endpoint Identifier(s). Connections can be accepted on any | |||
of the available paths or endpoints. | of the available paths or endpoints. | |||
* Rendezvous: The action of establishing a peer-to-peer connection | Rendezvous: The action of establishing a peer-to-peer connection | |||
with a Remote Endpoint. It simultaneously attempts to initiate a | with a Remote Endpoint. It simultaneously attempts to initiate a | |||
connection to a Remote Endpoint while listening for an incoming | connection to a Remote Endpoint while listening for an incoming | |||
connection from that Endpoint. The process of identifying options | connection from that Endpoint. The process of identifying options | |||
for the connection, such as resolution of the Remote Endpoint | for the connection, such as resolution of the Remote Endpoint | |||
Identifier(s), occurs in response to the Rendezvous call. As with | Identifier(s), occurs in response to calling Rendezvous. As with | |||
Listeners, the set of local paths and endpoints is constrained by | Listeners, the set of local paths and endpoints is constrained by | |||
Selection Properties. If successful, the Rendezvous call | Selection Properties. If successful, calling Rendezvous generates | |||
generates and asynchronously returns a Connection object to | and asynchronously returns a Connection object to represent the | |||
represent the established peer-to-peer connection. The processes | established peer-to-peer connection. The processes by which | |||
by which connections are initiated during a Rendezvous action will | connections are initiated during a Rendezvous action will depend | |||
depend on the set of Local and Remote Endpoints configured on the | on the set of Local and Remote Endpoints configured on the | |||
Preconnection. For example, if the Local and Remote Endpoints are | Preconnection. For example, if the Local and Remote Endpoints are | |||
TCP host candidates, then a TCP simultaneous open [RFC9293] might | TCP host candidates, then a TCP simultaneous open [RFC9293] might | |||
be performed. However, if the set of Local Endpoints includes | be performed. However, if the set of Local Endpoints includes | |||
server reflexive candidates, such as those provided by STUN | server-reflexive candidates, such as those provided by STUN | |||
(Session Traversal Utilities for NAT) [RFC5389], a Rendezvous | (Session Traversal Utilities for NAT) [RFC8489], a Rendezvous | |||
action will race candidates in the style of the ICE (Interactive | action will race candidates in the style of the ICE (Interactive | |||
Connection Establishment) algorithm [RFC8445] to perform NAT | Connectivity Establishment) algorithm [RFC8445] to perform NAT | |||
binding discovery and initiate a peer-to-peer connection. | binding discovery and initiate a peer-to-peer connection. | |||
4.1.5. Data Transfer Objects and Actions | 4.1.5. Data Transfer Objects and Actions | |||
* Message: A Message object is a unit of data that can be | Message: A Message object is a unit of data that can be represented | |||
represented as bytes that can be transferred between two endpoints | as bytes that can be transferred between two endpoints over a | |||
over a transport connection. The bytes within a Message are | transport connection. The bytes within a Message are assumed to | |||
assumed to be ordered. If an application does not care about the | be ordered. If an application does not care about the order in | |||
order in which a peer receives two distinct spans of bytes, those | which a peer receives two distinct spans of bytes, those spans of | |||
spans of bytes are considered independent Messages. Messages are | bytes are considered independent Messages. Messages are sent in | |||
sent in the payload of IP packets. One packet can carry one or | the payload of IP packets. One packet can carry one or more | |||
more Messages or parts of a Message. | Messages or parts of a Message. | |||
* Message Properties: Message Properties are used to specify details | Message Properties: Message Properties are used to specify details | |||
about Message transmission. They can be specified directly on | about Message transmission. They can be specified directly on | |||
individual Messages, or can be set on a Preconnection or | individual Messages or can be set on a Preconnection or Connection | |||
Connection as defaults. These properties might only apply to how | as defaults. These Properties might only apply to how a Message | |||
a Message is sent (such as how the transport will treat | is sent (such as how the transport will treat prioritization and | |||
prioritization and reliability), but can also include properties | reliability) but can also include Properties that specific | |||
that specific protocols encode and communicate to the Remote | protocols encode and communicate to the Remote Endpoint. When | |||
Endpoint. When receiving Messages, Message Properties can contain | receiving Messages, Message Properties can contain information | |||
information about the received Message, such as metadata generated | about the received Message, such as metadata generated at the | |||
at the receiver and information signalled by the Remote Endpoint. | receiver and information signaled by the Remote Endpoint. For | |||
For example, a Message can be marked with a Message Property | example, a Message can be marked with a Message Property | |||
indicating that it is the final Message on a Connection. | indicating that it is the final Message on a Connection. | |||
* Send: The action to transmit a Message over a Connection to the | Send: The Send action transmits a Message over a Connection to the | |||
Remote Endpoint. The interface to Send can accept Message | Remote Endpoint. The interface to Send can accept Message | |||
Properties specific to how the Message content is to be sent. The | Properties specific to how the Message content is to be sent. The | |||
status of the Send operation is delivered back to the sending | status of the Send action is delivered back to the sending | |||
application in an event (Section 4.1.6). | application in an event (Section 4.1.6). | |||
* Receive: An action that indicates that the application is ready to | Receive: The Receive action indicates that the application is ready | |||
asynchronously accept a Message over a Connection from a Remote | to asynchronously accept a Message over a Connection from a Remote | |||
Endpoint, while the Message content itself will be delivered in an | Endpoint, while the Message content itself will be delivered in an | |||
event (Section 4.1.6). The interface to Receive can include | event (Section 4.1.6). The interface to Receive can include | |||
Message Properties specific to the Message that is to be delivered | Message Properties specific to the Message that is to be delivered | |||
to the application. | to the application. | |||
* Framer: A Framer is a data translation layer that can be added to | Framer: A Framer is a data translation layer that can be added to a | |||
a Connection. Framers allow extending a Connection's Protocol | Connection. Framers allow extending a Connection's Protocol Stack | |||
Stack to define how to encapsulate or encode outbound Messages, | to define how to encapsulate or encode outbound Messages and how | |||
and how to decapsulate or decode inbound data into Messages. In | to decapsulate or decode inbound data into Messages. In this way, | |||
this way, message boundaries can be preserved when using a | Message boundaries can be preserved when using a Connection | |||
Connection object, even with a protocol that otherwise presents | object, even with a protocol that otherwise presents unstructured | |||
unstructured streams, such as TCP. This is designed based on the | streams, such as TCP. This is designed based on the fact that | |||
fact that many of the current application protocols evolved over | many of the current application protocols evolved over TCP, which | |||
TCP, which does not provide message boundary preservation, and | does not provide Message boundary preservation, and since many of | |||
since many of these protocols require message boundaries to | these protocols require Message boundaries to function, each | |||
function, each application layer protocol has defined its own | application-layer protocol has defined its own framing. For | |||
framing. For example, when an HTTP application sends and receives | example, when an HTTP application sends and receives HTTP Messages | |||
HTTP messages over a byte-stream transport, it must parse the | over a byte-stream transport, it must parse the boundaries of HTTP | |||
boundaries of HTTP messages from the stream of bytes. | Messages from the stream of bytes. | |||
4.1.6. Event Handling | 4.1.6. Event Handling | |||
The following categories of events can be delivered to an | The following categories of events can be delivered to an | |||
application: | application: | |||
* Connection Ready: Signals to an application that a given | Connection Ready: Signals to an application that a given Connection | |||
Connection is ready to send and/or receive Messages. If the | is ready to send and/or receive Messages. If the Connection | |||
Connection relies on handshakes to establish state between peers, | relies on handshakes to establish state between peers, then it is | |||
then it is assumed that these steps have been taken. | assumed that these steps have been taken. | |||
* Connection Closed: Signals to an application that a given | Connection Closed: Signals to an application that a given Connection | |||
Connection is no longer usable for sending or receiving Messages. | is no longer usable for sending or receiving Messages. The event | |||
The event delivers a reason or error to the application that | delivers a reason or error to the application that describes the | |||
describes the nature of the termination. | nature of the termination. | |||
* Connection Received: Signals to an application that a given | Connection Received: Signals to an application that a given Listener | |||
Listener has received a Connection. | has received a Connection. | |||
* Message Received: Delivers received Message content to the | Message Received: Delivers received Message content to the | |||
application, based on a Receive action. To allow an application | application, based on a Receive action. To allow an application | |||
to limit the occurrence of such events, each call to Receive will | to limit the occurrence of such events, each call to Receive will | |||
be paired with a single Receive event. This can include an error | be paired with a single Receive event. This can include an error | |||
if the Receive action cannot be satisfied, e.g., due to the | if the Receive action cannot be satisfied, e.g., due to the | |||
Connection being closed. | Connection being closed. | |||
* Message Sent: Notifies the application of the status of its Send | Message Sent: Notifies the application of the status of its Send | |||
action. This might indicate a failure if the Message cannot be | action. This might indicate a failure if the Message cannot be | |||
sent, or an indication that the Message has been processed by the | sent or might indicate that the Message has been processed by the | |||
Transport Services System. | Transport Services System. | |||
* Path Properties Changed: Notifies the application that a property | Path Properties Changed: Notifies the application that a Property of | |||
of the Connection has changed that might influence how and where | the Connection has changed that might influence how and where data | |||
data is sent and/or received. | is sent and/or received. | |||
4.1.7. Termination Actions | 4.1.7. Termination Actions | |||
* Close: The action an application takes on a Connection to indicate | Close: The action an application takes on a Connection to indicate | |||
that it no longer intends to send data, is no longer willing to | that it no longer intends to send data or is no longer willing to | |||
receive data, and that the protocol should signal this state to | receive data. The protocol should signal this state to the Remote | |||
the Remote Endpoint if the transport protocol allows this. (Note | Endpoint if the transport protocol permits it. (Note that this is | |||
that this is distinct from the concept of "half-closing" a | distinct from the concept of "half-closing" a bidirectional | |||
bidirectional connection, such as when a FIN is sent in one | connection, such as when a FIN is sent in one direction of a TCP | |||
direction of a TCP connection [RFC9293]. The end of a stream can | connection [RFC9293]. The end of a stream can also be indicated | |||
also be indicated using Message Properties when sending.) | using Message Properties when sending.) | |||
* Abort: The action the application takes on a Connection to | Abort: The action the application takes on a Connection to indicate | |||
indicate a Close and also indicate that the Transport Services | that the Transport Services System should not attempt to deliver | |||
System should not attempt to deliver any outstanding data, and | any outstanding data and that it should immediately close and drop | |||
immediately drop the connection. This is intended for immediate, | the connection. This is intended for immediate, usually abnormal, | |||
usually abnormal, termination of a connection. | termination of a connection. | |||
4.1.8. Connection Groups | 4.1.8. Connection Groups | |||
A Connection Group is a set of Connections that shares Connection | A Connection Group is a set of Connections that shares Connection | |||
Properties and cached state generated by protocols. A Connection | Properties and Cached State generated by protocols. A Connection | |||
Group represents state for managing Connections within a single | Group represents state for managing Connections within a single | |||
application, and does not require end-to-end protocol signaling. For | application and does not require end-to-end protocol signaling. For | |||
transport protocols that support multiplexing, only Connections | transport protocols that support multiplexing, only Connections | |||
within the same Connection Group are allowed to be multiplexed | within the same Connection Group are allowed to be multiplexed | |||
together. | together. | |||
The API allows a Connection to be created from another Connection. | The API allows a Connection to be created from another Connection. | |||
This adds the new Connection to the Connection Group. A change to | This adds the new Connection to the Connection Group. A change to | |||
one of the Connection Properties on any Connection in the Connection | one of the Connection Properties on any Connection in the Connection | |||
Group automatically changes the Connection Property for all others. | Group automatically changes the Connection Property for all others. | |||
All Connections in a Connection Group share the same set of | All Connections in a Connection Group share the same set of | |||
Connection Properties except for the Connection Priority. These | Connection Properties except for the Connection Priority. These | |||
Connection Properties are said to be entangled. | Connection Properties are said to be entangled. | |||
Passive Connections can also be added to a Connection Group, e.g., | Passive Connections can also be added to a Connection Group, e.g., | |||
when a Listener receives a new Connection that is just a new stream | when a Listener receives a new Connection that is just a new stream | |||
of an already active multi-streaming protocol instance. | of an already-active multistreaming protocol instance. | |||
While Connection Groups are managed by the Transport Services | While Connection Groups are managed by the Transport Services | |||
Implementation, an application can define different Connection | Implementation, an application can define different Connection | |||
Contexts for different Connection Groups to explicitly control | Contexts for different Connection Groups to explicitly control | |||
caching boundaries, as discussed in Section 4.2.3. | caching boundaries, as discussed in Section 4.2.3. | |||
4.2. Transport Services Implementation | 4.2. Transport Services Implementation | |||
This section defines the key architectural concepts for the Transport | This section defines the key architectural concepts for the Transport | |||
Services Implementation within the Transport Services System. | Services Implementation within the Transport Services System. | |||
The Transport Services System consists of the Transport Services | The Transport Services System consists of the Transport Services | |||
Implementation and the Transport Services API. The Transport | Implementation and the Transport Services API. The Transport | |||
Services Implementation consists of all objects and protocol | Services Implementation consists of all objects and protocol | |||
instances used internally to a system or library to implement the | instances used internally to a system or library to implement the | |||
functionality needed to provide a transport service across a network, | functionality needed to provide a transport service across a network, | |||
as required by the abstract interface. | as required by the abstract interface. | |||
* Path: Represents an available set of properties that a Local | Path: Represents an available set of Properties that a Local | |||
Endpoint can use to communicate with a Remote Endpoint, such as | Endpoint can use to communicate with a Remote Endpoint, such as | |||
routes, addresses, and physical and virtual network interfaces. | routes, addresses, and physical and virtual network interfaces. | |||
* Protocol Instance: A single instance of one protocol, including | Protocol Instance: A single instance of one protocol, including any | |||
any state necessary to establish connectivity or send and receive | state necessary to establish connectivity or send and receive | |||
Messages. | Messages. | |||
* Protocol Stack: A set of Protocol Instances (including relevant | Protocol Stack: A set of protocol instances (including relevant | |||
application, security, transport, or Internet protocols) that are | application, security, transport, or Internet protocols) that are | |||
used together to establish connectivity or send and receive | used together to establish connectivity or send and receive | |||
Messages. A single stack can be simple (a single transport | Messages. A single stack can be simple (e.g., one application | |||
protocol instance over IP), or it can be complex (multiple | stream carried TCP running over IP) or complex (e.g,. multiple | |||
application protocol streams going through a single security and | application streams carried over a multipath transport protocol | |||
transport protocol, over IP; or, a multi-path transport protocol | using multiple subflows over IP). | |||
over multiple transport sub-flows). | ||||
* Candidate Path: One path that is available to an application and | Candidate Path: One path that is available to an application and | |||
conforms to the Selection Properties and System Policy, of which | conforms to the Selection Properties and System Policy, of which | |||
there can be several. Candidate Paths are identified during the | there can be several. Candidate Paths are identified during the | |||
gathering phase (Section 4.2.1) and can be used during the racing | gathering phase (Section 4.2.1) and can be used during the racing | |||
phase (Section 4.2.2). | phase (Section 4.2.2). | |||
* Candidate Protocol Stack: One Protocol Stack that can be used by | Candidate Protocol Stack: One Protocol Stack that can be used by an | |||
an application for a Connection, for which there can be several | application for a connection, for which there can be several | |||
candidates. Candidate Protocol Stacks are identified during the | candidates. Candidate Protocol Stacks are identified during the | |||
gathering phase (Section 4.2.1) and are started during the racing | gathering phase (Section 4.2.1) and are started during the racing | |||
phase (Section 4.2.2). | phase (Section 4.2.2). | |||
* System Policy: The input from an operating system or other global | System Policy: The input from an operating system or other global | |||
preferences that can constrain or influence how an implementation | preferences that can constrain or influence how an implementation | |||
will gather candidate paths and Protocol Stacks (Section 4.2.1) | will gather Candidate Paths and Candidate Protocol Stacks | |||
and race the candidates during establishment (Section 4.2.2). | (Section 4.2.1) and race the candidates during establishment | |||
Specific aspects of the System Policy either apply to all | (Section 4.2.2). Specific aspects of the System Policy apply to | |||
Connections or only certain ones, depending on the runtime context | either all Connections or only certain Connections, depending on | |||
and properties of the Connection. | the runtime context and Properties of the Connection. | |||
* Cached State: The state and history that the implementation keeps | Cached State: The state and history that the implementation keeps | |||
for each set of associated Endpoints that have been used | for each set of associated Endpoints that have been used | |||
previously. This can include DNS results, TLS session state, | previously. This can include DNS results, TLS session state, | |||
previous success and quality of transport protocols over certain | previous success and quality of transport protocols over certain | |||
paths, as well as other information. This caching does not imply | paths, as well as other information. This caching does not imply | |||
that the same decisions are necessarily made for subsequent | that the same decisions are necessarily made for subsequent | |||
connections, rather, it means that cached state is used by a | connections; rather, it means that Cached State is used by a | |||
Transport Services Implementation to inform functions such as | Transport Services Implementation to inform functions such as | |||
choosing the candidates to be raced, selecting appropriate | choosing the candidates to be raced, selecting appropriate | |||
transport parameters, etc. An application SHOULD NOT rely on | transport parameters, etc. An application SHOULD NOT rely on | |||
specific caching behaviour, instead it ought to explicitly request | specific caching behavior; instead, it ought to explicitly request | |||
any required or desired properties via the Transport Services API. | any required or preferred Properties via the Transport Services | |||
API. | ||||
4.2.1. Candidate Gathering | 4.2.1. Candidate Gathering | |||
* Candidate Path Selection: Candidate Path Selection represents the | Candidate Path Selection: Candidate Path Selection represents the | |||
act of choosing one or more paths that are available to use based | act of choosing one or more paths that are available to use based | |||
on the Selection Properties and any available Local and Remote | on the Selection Properties and any available Local and Remote | |||
Endpoint Identifiers provided by the application, as well as the | Endpoint Identifiers provided by the application, as well as the | |||
policies and heuristics of a Transport Services implementation. | policies and heuristics of a Transport Services Implementation. | |||
* Candidate Protocol Selection: Candidate Protocol Selection | Candidate Protocol Selection: Candidate Protocol Selection | |||
represents the act of choosing one or more sets of Protocol Stacks | represents the act of choosing one or more sets of Protocol Stacks | |||
that are available to use based on the Transport Properties | that are available to use based on the Transport Properties | |||
provided by the application, and the heuristics or policies within | provided by the application, and the heuristics or policies within | |||
the Transport Services Implementation. | the Transport Services Implementation. | |||
4.2.2. Candidate Racing | 4.2.2. Candidate Racing | |||
Connection establishment attempts for a set of candidates may be | Connection establishment attempts for a set of candidates may be | |||
performed simultaneously, synchronously, serially, or using some | performed simultaneously, synchronously, serially, or using some | |||
combination of all of these. We refer to this process as racing, | combination of all of these. We refer to this process as racing, | |||
borrowing terminology from Happy Eyeballs [RFC8305]. | borrowing terminology from Happy Eyeballs [RFC8305]. | |||
* Protocol Option Racing: Protocol Option Racing is the act of | Protocol Option Racing: Protocol Option Racing is the act of | |||
attempting to establish, or scheduling attempts to establish, | attempting to establish, or scheduling attempts to establish, | |||
multiple Protocol Stacks that differ based on the composition of | multiple Protocol Stacks that differ based on the composition of | |||
protocols or the options used for protocols. | protocols or the options used for protocols. | |||
* Path Racing: Path Racing is the act of attempting to establish, or | Path Racing: Path Racing is the act of attempting to establish, or | |||
scheduling attempts to establish, multiple Protocol Stacks that | scheduling attempts to establish, multiple Protocol Stacks that | |||
differ based on a selection from the available Paths. Since | differ based on a selection from the available paths. Since | |||
different Paths will have distinct configurations (see [RFC7556]) | different paths will have distinct configurations (see [RFC7556]) | |||
for local addresses and DNS servers, attempts across different | for local addresses and DNS servers, attempts across different | |||
Paths will perform separate DNS resolution steps, which can lead | paths will perform separate DNS resolution steps, which can lead | |||
to further racing of the resolved Remote Endpoint Identifiers. | to further racing of the resolved Remote Endpoint Identifiers. | |||
* Remote Endpoint Racing: Remote Endpoint Racing is the act of | Remote Endpoint Racing: Remote Endpoint Racing is the act of | |||
attempting to establish, or scheduling attempts to establish, | attempting to establish, or scheduling attempts to establish, | |||
multiple Protocol Stacks that differ based on the specific | multiple Protocol Stacks that differ based on the specific | |||
representation of the Remote Endpoint Identifier, such as a | representation of the Remote Endpoint Identifier, such as a | |||
particular IP address that was resolved from a DNS hostname. | particular IP address that was resolved from a DNS hostname. | |||
4.2.3. Separating Connection Contexts | 4.2.3. Separating Connection Contexts | |||
A Transport Services Implementation can by default share stored | A Transport Services Implementation can by default share stored | |||
properties across Connections within an application, such as cached | Properties across Connections within an application, such as cached | |||
protocol state, cached path state, and heuristics. This provides | protocol state, cached path state, and heuristics. This provides | |||
efficiency and convenience for the application, since the Transport | efficiency and convenience for the application, since the Transport | |||
Services System can automatically optimize behavior. | Services System can automatically optimize behavior. | |||
The Transport Services API can allow applications to explicitly | The Transport Services API can allow applications to explicitly | |||
define Connection Contexts that force separation of Cached State and | define Connection Contexts that force separation of Cached State and | |||
Protocol Stacks. For example, a web browser application could use | Protocol Stacks. For example, a web browser application could use | |||
Connection Contexts with separate caches when implementing different | Connection Contexts with separate caches when implementing different | |||
tabs. Possible reasons to isolate Connections using separate | tabs. Possible reasons to isolate Connections using separate | |||
Connection Contexts include: | Connection Contexts include privacy concerns regarding: | |||
* Privacy concerns about re-using cached protocol state that can | * reusing cached protocol state, as this can lead to linkability. | |||
lead to linkability. Sensitive state could include TLS session | Sensitive state could include TLS session state [RFC8446] and HTTP | |||
state [RFC8446] and HTTP cookies [RFC6265]. These concerns could | cookies [RFC6265]. These concerns could be addressed using | |||
be addressed using Connection Contexts with separate caches, such | Connection Contexts with separate caches, such as for different | |||
as for different browser tabs. | browser tabs. | |||
* Privacy concerns about allowing Connections to multiplex together, | * allowing Connections to multiplex together, which can tell a | |||
which can tell a Remote Endpoint that all of the Connections are | Remote Endpoint that all of the Connections are coming from the | |||
coming from the same application. Using Connection Contexts | same application. Using Connection Contexts avoids the | |||
avoids the Connections being multiplexed in a HTTP/2 or QUIC | Connections being multiplexed in an HTTP/2 or QUIC stream. | |||
stream. | ||||
5. IANA Considerations | 5. IANA Considerations | |||
This document has no actions for IANA. | This document has no IANA actions. | |||
6. Security and Privacy Considerations | 6. Security and Privacy Considerations | |||
The Transport Services System does not recommend use of specific | The Transport Services System does not recommend the use of specific | |||
security protocols or algorithms. Its goal is to offer ease of use | security protocols or algorithms. Its goal is to offer ease of use | |||
for existing protocols by providing a generic security-related | for existing protocols by providing a generic security-related | |||
interface. Each provided interface translates to an existing | interface. Each provided interface translates to an existing | |||
protocol-specific interface provided by supported security protocols. | protocol-specific interface provided by supported security protocols. | |||
For example, trust verification callbacks are common parts of TLS | For example, trust verification callbacks are common parts of TLS | |||
APIs; a Transport Services API exposes similar functionality | APIs; a Transport Services API exposes similar functionality | |||
[RFC8922]. | [RFC8922]. | |||
As described above in Section 3.3, if a Transport Services | As described above in Section 3.3, if a Transport Services | |||
Implementation races between two different Protocol Stacks, both need | Implementation races between two different Protocol Stacks, both need | |||
to use the same security protocols and options. However, a Transport | to use the same security protocols and options. However, a Transport | |||
Services Implementation can race different security protocols, e.g., | Services Implementation can race different security protocols, e.g., | |||
if the application explicitly specifies that it considers them | if the application explicitly specifies that it considers them | |||
equivalent. | equivalent. | |||
The application controls whether information from previous racing | The application controls whether information from previous racing | |||
attempts, or other information about past communications that was | attempts or other information about past communications that was | |||
cached by the Transport Services System is used during establishment. | cached by the Transport Services System is used during establishment. | |||
This allows applications to make tradeoffs between efficiency | This allows applications to make trade-offs between efficiency | |||
(through racing) and privacy (via information that might leak from | (through racing) and privacy (via information that might leak from | |||
the cache toward an on-path observer). Some applications have | the cache toward an on-path observer). Some applications have | |||
features (e.g. "incognito mode") that align with this functionality. | features (e.g., "incognito mode") that align with this functionality. | |||
Applications need to ensure that they use security APIs | Applications need to ensure that they use security APIs | |||
appropriately. In cases where applications use an interface to | appropriately. In cases where applications use an interface to | |||
provide sensitive keying material, e.g., access to private keys or | provide sensitive keying material, e.g., access to private keys or | |||
copies of pre-shared keys (PSKs), key use needs to be validated and | copies of pre-shared keys (PSKs), key use needs to be validated and | |||
scoped to the intended protocols and roles. For example, if an | scoped to the intended protocols and roles. For example, if an | |||
application provides a certificate to only be used as client | application provides a certificate to only be used as client | |||
authentication for outbound TLS and QUIC connections, the Transport | authentication for outbound TLS and QUIC connections, the Transport | |||
Services System MUST NOT use this automatically in other contexts | Services System MUST NOT use this automatically in other contexts | |||
(such as server authentication for inbound connections, or in other | (such as server authentication for inbound connections or in other | |||
another security protocol handshake that is not equivalent to TLS). | security protocol handshakes that are not equivalent to TLS). | |||
A Transport Services System MUST NOT automatically fall back from | A Transport Services System MUST NOT automatically fall back from | |||
secure protocols to insecure protocols, or to weaker versions of | secure protocols to insecure protocols or fall back to weaker | |||
secure protocols (see Section 3.3). For example, if an application | versions of secure protocols (see Section 3.3). For example, if an | |||
requests a specific version of TLS, but the desired version of TLS is | application requests a specific version of TLS but the desired | |||
not available, its connection will fail. As described in | version of TLS is not available, its connection will fail. As | |||
Section 3.3, the Transport Services API can allow applications to | described in Section 3.3, the Transport Services API can allow | |||
specify minimum versions that are allowed to be used by the Transport | applications to specify minimum versions that are allowed to be used | |||
Services System. | by the Transport Services System. | |||
7. Acknowledgements | ||||
This work has received funding from the European Union's Horizon 2020 | ||||
research and innovation programme under grant agreements No. 644334 | ||||
(NEAT), No. 688421 (MAMI) and No 815178 (5GENESIS). | ||||
This work has been supported by Leibniz Prize project funds of DFG - | ||||
German Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ | ||||
FE 570/4-1). | ||||
This work has been supported by the UK Engineering and Physical | ||||
Sciences Research Council under grant EP/R04144X/1. | ||||
Thanks to Reese Enghardt, Max Franke, Mirja Kuehlewind, Jonathan | ||||
Lennox, and Michael Welzl for the discussions and feedback that | ||||
helped shape the architecture of the system described here. | ||||
Particular thanks is also due to Philipp S. Tiesel and Christopher | ||||
A. Wood, who were both co-authors of this specification as it | ||||
progressed through the TAPS working group. Thanks as well to Stuart | ||||
Cheshire, Josh Graessley, David Schinazi, and Eric Kinnear for their | ||||
implementation and design efforts, including Happy Eyeballs, that | ||||
heavily influenced this work. | ||||
8. References | 7. References | |||
8.1. Normative References | 7.1. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
8.2. Informative References | ||||
[I-D.ietf-taps-impl] | ||||
Brunstrom, A., Pauly, T., Enghardt, R., Tiesel, P. S., and | ||||
M. Welzl, "Implementing Interfaces to Transport Services", | ||||
Work in Progress, Internet-Draft, draft-ietf-taps-impl-16, | ||||
5 June 2023, <https://datatracker.ietf.org/doc/html/draft- | ||||
ietf-taps-impl-16>. | ||||
[I-D.ietf-taps-interface] | ||||
Trammell, B., Welzl, M., Enghardt, R., Fairhurst, G., | ||||
Kühlewind, M., Perkins, C., Tiesel, P. S., and T. Pauly, | ||||
"An Abstract Application Layer Interface to Transport | ||||
Services", Work in Progress, Internet-Draft, draft-ietf- | ||||
taps-interface-22, 6 July 2023, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-taps- | ||||
interface-22>. | ||||
[POSIX] "IEEE Std. 1003.1-2008 Standard for Information Technology | 7.2. Informative References | |||
-- Portable Operating System Interface (POSIX). Open | ||||
group Technical Standard: Base Specifications, Issue 7", | ||||
2008. | ||||
[RFC5389] Rosenberg, J., Mahy, R., Matthews, P., and D. Wing, | [POSIX] "IEEE/Open Group Standard for Information Technology - | |||
"Session Traversal Utilities for NAT (STUN)", RFC 5389, | Portable Operating System Interface (POSIX(TM)) Base | |||
DOI 10.17487/RFC5389, October 2008, | Specifications, Issue 8", IEEE Std 1003.1-2024, | |||
<https://www.rfc-editor.org/rfc/rfc5389>. | DOI 10.1109/IEEESTD.2024.10555529, 2024, | |||
<https://ieeexplore.ieee.org/document/10555529>. | ||||
[RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", | [RFC5482] Eggert, L. and F. Gont, "TCP User Timeout Option", | |||
RFC 5482, DOI 10.17487/RFC5482, March 2009, | RFC 5482, DOI 10.17487/RFC5482, March 2009, | |||
<https://www.rfc-editor.org/rfc/rfc5482>. | <https://www.rfc-editor.org/info/rfc5482>. | |||
[RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
<https://www.rfc-editor.org/rfc/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
[RFC7556] Anipko, D., Ed., "Multiple Provisioning Domain | [RFC7556] Anipko, D., Ed., "Multiple Provisioning Domain | |||
Architecture", RFC 7556, DOI 10.17487/RFC7556, June 2015, | Architecture", RFC 7556, DOI 10.17487/RFC7556, June 2015, | |||
<https://www.rfc-editor.org/rfc/rfc7556>. | <https://www.rfc-editor.org/info/rfc7556>. | |||
[RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, | [RFC8095] Fairhurst, G., Ed., Trammell, B., Ed., and M. Kuehlewind, | |||
Ed., "Services Provided by IETF Transport Protocols and | Ed., "Services Provided by IETF Transport Protocols and | |||
Congestion Control Mechanisms", RFC 8095, | Congestion Control Mechanisms", RFC 8095, | |||
DOI 10.17487/RFC8095, March 2017, | DOI 10.17487/RFC8095, March 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8095>. | <https://www.rfc-editor.org/info/rfc8095>. | |||
[RFC8170] Thaler, D., Ed., "Planning for Protocol Adoption and | [RFC8170] Thaler, D., Ed., "Planning for Protocol Adoption and | |||
Subsequent Transitions", RFC 8170, DOI 10.17487/RFC8170, | Subsequent Transitions", RFC 8170, DOI 10.17487/RFC8170, | |||
May 2017, <https://www.rfc-editor.org/rfc/rfc8170>. | May 2017, <https://www.rfc-editor.org/info/rfc8170>. | |||
[RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | [RFC8303] Welzl, M., Tuexen, M., and N. Khademi, "On the Usage of | |||
Transport Features Provided by IETF Transport Protocols", | Transport Features Provided by IETF Transport Protocols", | |||
RFC 8303, DOI 10.17487/RFC8303, February 2018, | RFC 8303, DOI 10.17487/RFC8303, February 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8303>. | <https://www.rfc-editor.org/info/rfc8303>. | |||
[RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | [RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | |||
Better Connectivity Using Concurrency", RFC 8305, | Better Connectivity Using Concurrency", RFC 8305, | |||
DOI 10.17487/RFC8305, December 2017, | DOI 10.17487/RFC8305, December 2017, | |||
<https://www.rfc-editor.org/rfc/rfc8305>. | <https://www.rfc-editor.org/info/rfc8305>. | |||
[RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive | |||
Connectivity Establishment (ICE): A Protocol for Network | Connectivity Establishment (ICE): A Protocol for Network | |||
Address Translator (NAT) Traversal", RFC 8445, | Address Translator (NAT) Traversal", RFC 8445, | |||
DOI 10.17487/RFC8445, July 2018, | DOI 10.17487/RFC8445, July 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8445>. | <https://www.rfc-editor.org/info/rfc8445>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/rfc/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC8489] Petit-Huguenin, M., Salgueiro, G., Rosenberg, J., Wing, | ||||
D., Mahy, R., and P. Matthews, "Session Traversal | ||||
Utilities for NAT (STUN)", RFC 8489, DOI 10.17487/RFC8489, | ||||
February 2020, <https://www.rfc-editor.org/info/rfc8489>. | ||||
[RFC8922] Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | [RFC8922] Enghardt, T., Pauly, T., Perkins, C., Rose, K., and C. | |||
Wood, "A Survey of the Interaction between Security | Wood, "A Survey of the Interaction between Security | |||
Protocols and Transport Services", RFC 8922, | Protocols and Transport Services", RFC 8922, | |||
DOI 10.17487/RFC8922, October 2020, | DOI 10.17487/RFC8922, October 2020, | |||
<https://www.rfc-editor.org/rfc/rfc8922>. | <https://www.rfc-editor.org/info/rfc8922>. | |||
[RFC8923] Welzl, M. and S. Gjessing, "A Minimal Set of Transport | [RFC8923] Welzl, M. and S. Gjessing, "A Minimal Set of Transport | |||
Services for End Systems", RFC 8923, DOI 10.17487/RFC8923, | Services for End Systems", RFC 8923, DOI 10.17487/RFC8923, | |||
October 2020, <https://www.rfc-editor.org/rfc/rfc8923>. | October 2020, <https://www.rfc-editor.org/info/rfc8923>. | |||
[RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
[RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC9112] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | |||
June 2022, <https://www.rfc-editor.org/rfc/rfc9112>. | June 2022, <https://www.rfc-editor.org/info/rfc9112>. | |||
[RFC9113] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | [RFC9113] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | |||
DOI 10.17487/RFC9113, June 2022, | DOI 10.17487/RFC9113, June 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9113>. | <https://www.rfc-editor.org/info/rfc9113>. | |||
[RFC9293] Eddy, W., Ed., "Transmission Control Protocol (TCP)", | [RFC9293] Eddy, W., Ed., "Transmission Control Protocol (TCP)", | |||
STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022, | STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9293>. | <https://www.rfc-editor.org/info/rfc9293>. | |||
[RFC9622] Trammell, B., Ed., Welzl, M., Ed., Enghardt, R., | ||||
Fairhurst, G., Kühlewind, M., Perkins, C. S., Tiesel, P., | ||||
and T. Pauly, "An Abstract Application Programming | ||||
Interface (API) for Transport Services", RFC 9622, | ||||
DOI 10.17487/RFC9622, December 2024, | ||||
<https://www.rfc-editor.org/info/rfc9622>. | ||||
[RFC9623] Brunstrom, A., Ed., Pauly, T., Ed., Enghardt, R., Tiesel, | ||||
P., and M. Welzl, "Implementing Interfaces to Transport | ||||
Services", RFC 9623, DOI 10.17487/RFC9623, December 2024, | ||||
<https://www.rfc-editor.org/info/rfc9623>. | ||||
Acknowledgements | ||||
This work has received funding from the European Union's Horizon 2020 | ||||
research and innovation programme under grant agreements No. 644334 | ||||
(NEAT), No. 688421 (MAMI), and No. 815178 (5GENESIS). | ||||
This work has been supported by: | ||||
* Leibniz Prize project funds from the DFG - German Research | ||||
Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ FE 570/4-1). | ||||
* the UK Engineering and Physical Sciences Research Council under | ||||
grant EP/R04144X/1. | ||||
Thanks to Reese Enghardt, Max Franke, Mirja Kühlewind, Jonathan | ||||
Lennox, and Michael Welzl for the discussions and feedback that | ||||
helped shape the architecture of the system described here. | ||||
Particular thanks are also due to Philipp S. Tiesel and Christopher | ||||
A. Wood, who were both coauthors of this specification as it | ||||
progressed through the Transport Services (TAPS) Working Group. | ||||
Thanks as well to Stuart Cheshire, Josh Graessley, David Schinazi, | ||||
and Eric Kinnear for their implementation and design efforts, | ||||
including Happy Eyeballs, that heavily influenced this work. | ||||
Authors' Addresses | Authors' Addresses | |||
Tommy Pauly (editor) | Tommy Pauly (editor) | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, California 95014, | Cupertino, CA 95014 | |||
United States of America | United States of America | |||
Email: tpauly@apple.com | Email: tpauly@apple.com | |||
Brian Trammell (editor) | Brian Trammell (editor) | |||
Google Switzerland GmbH | Google Switzerland GmbH | |||
Gustav-Gull-Platz 1 | Gustav-Gull-Platz 1 | |||
CH- 8004 Zurich | CH-8004 Zurich | |||
Switzerland | Switzerland | |||
Email: ietf@trammell.ch | Email: ietf@trammell.ch | |||
Anna Brunstrom | Anna Brunstrom | |||
Karlstad University | Karlstad University | |||
Universitetsgatan 2 | Universitetsgatan 2 | |||
651 88 Karlstad | 651 88 Karlstad | |||
Sweden | Sweden | |||
Email: anna.brunstrom@kau.se | Email: anna.brunstrom@kau.se | |||
Godred Fairhurst | Godred Fairhurst | |||
University of Aberdeen | University of Aberdeen | |||
Fraser Noble Building | Fraser Noble Building | |||
Aberdeen, AB24 3UE | Aberdeen, AB24 3UE | |||
United Kingdom | ||||
Email: gorry@erg.abdn.ac.uk | Email: gorry@erg.abdn.ac.uk | |||
URI: http://www.erg.abdn.ac.uk/ | URI: https://erg.abdn.ac.uk/ | |||
Colin Perkins | Colin S. Perkins | |||
University of Glasgow | University of Glasgow | |||
School of Computing Science | School of Computing Science | |||
Glasgow G12 8QQ | Glasgow G12 8QQ | |||
United Kingdom | United Kingdom | |||
Email: csp@csperkins.org | Email: csp@csperkins.org | |||
End of changes. 255 change blocks. | ||||
656 lines changed or deleted | 665 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |