rfc9622v5.txt | rfc9622.txt | |||
---|---|---|---|---|
skipping to change at line 371 ¶ | skipping to change at line 371 ¶ | |||
transport Protocol Stack on which data can be sent to and/or received | transport Protocol Stack on which data can be sent to and/or received | |||
from a Remote Endpoint (i.e., a logical connection that, depending on | from a Remote Endpoint (i.e., a logical connection that, depending on | |||
the kind of transport, can be bidirectional or unidirectional, and | the kind of transport, can be bidirectional or unidirectional, and | |||
that can use a stream protocol or a datagram protocol). Connections | that can use a stream protocol or a datagram protocol). Connections | |||
are presented consistently to the application, irrespective of | are presented consistently to the application, irrespective of | |||
whether the underlying transport is connectionless or connection | whether the underlying transport is connectionless or connection | |||
oriented. Connections can be created from Preconnections in three | oriented. Connections can be created from Preconnections in three | |||
ways: | ways: | |||
* initiating the Preconnection (i.e., creating a Connection from the | * initiating the Preconnection (i.e., creating a Connection from the | |||
Preconnection, actively opening, as in a client; see Initiate() in | Preconnection, actively opening, as in a client; see Initiate in | |||
Section 7.1), | Section 7.1), | |||
* listening on the Preconnection (i.e., creating a Listener based on | * listening on the Preconnection (i.e., creating a Listener based on | |||
the Preconnection, passively opening, as in a server; see Listen() | the Preconnection, passively opening, as in a server; see Listen | |||
in Section 7.2), or | in Section 7.2), or | |||
* a rendezvous for the Preconnection (i.e., peer-to-peer connection | * a rendezvous for the Preconnection (i.e., peer-to-peer connection | |||
establishment; see Rendezvous() in Section 7.3). | establishment; see Rendezvous in Section 7.3). | |||
Once a Connection is established, data can be sent and received on it | Once a Connection is established, data can be sent and received on it | |||
in the form of Messages. The API supports the preservation of | in the form of Messages. The API supports the preservation of | |||
message boundaries via both explicit Protocol Stack support and | message boundaries via both explicit Protocol Stack support and | |||
application support through a Message Framer that finds message | application support through a Message Framer that finds message | |||
boundaries in a stream. Messages are received asynchronously through | boundaries in a stream. Messages are received asynchronously through | |||
event handlers registered by the application. Errors and other | event handlers registered by the application. Errors and other | |||
notifications also happen asynchronously on the Connection. It is | notifications also happen asynchronously on the Connection. It is | |||
not necessary for an application to handle all events; some events | not necessary for an application to handle all events; some events | |||
can have implementation-specific default handlers. | can have implementation-specific default handlers. | |||
skipping to change at line 736 ¶ | skipping to change at line 736 ¶ | |||
recommendations: | recommendations: | |||
* Actions, events, and errors in implementations of the Transport | * Actions, events, and errors in implementations of the Transport | |||
Services API SHOULD use the names assigned to them in this | Services API SHOULD use the names assigned to them in this | |||
document, subject to capitalization, punctuation, and other | document, subject to capitalization, punctuation, and other | |||
typographic conventions in the language of the implementation, | typographic conventions in the language of the implementation, | |||
unless the implementation itself uses different names for | unless the implementation itself uses different names for | |||
substantially equivalent objects for networking by convention. | substantially equivalent objects for networking by convention. | |||
* Transport Services systems SHOULD implement each Selection | * Transport Services systems SHOULD implement each Selection | |||
Property, Connection Property, and Message Context Property | Property, Connection Property, and MessageContext Property | |||
specified in this document. These features SHOULD be implemented | specified in this document. These features SHOULD be implemented | |||
even when, in a specific implementation, it will always result in | even when, in a specific implementation, it will always result in | |||
no operation, e.g., there is no action when the API specifies a | no operation, e.g., there is no action when the API specifies a | |||
Property that is not available in a transport protocol implemented | Property that is not available in a transport protocol implemented | |||
on a specific platform. For example, if TCP is the only | on a specific platform. For example, if TCP is the only | |||
underlying transport protocol, the Message Property msgOrdered can | underlying transport protocol, the Message Property msgOrdered can | |||
be implemented (trivially, as a no-op) as disabling the | be implemented (trivially, as a no-op) as disabling the | |||
requirement for ordering will not have any effect on delivery | requirement for ordering will not have any effect on delivery | |||
order for Connections over TCP. Similarly, the msgLifetime | order for Connections over TCP. Similarly, the msgLifetime | |||
Message Property can be implemented but ignored, as the | Message Property can be implemented but ignored, as the | |||
skipping to change at line 935 ¶ | skipping to change at line 935 ¶ | |||
RemoteSpecifier.WithHopLimit(HopLimit) | RemoteSpecifier.WithHopLimit(HopLimit) | |||
Calling Listen on a Preconnection with a multicast group address | Calling Listen on a Preconnection with a multicast group address | |||
specified as the Remote Endpoint Identifier will trigger the | specified as the Remote Endpoint Identifier will trigger the | |||
Transport Services Implementation to join the multicast group to | Transport Services Implementation to join the multicast group to | |||
receive Messages. This Listener will create one Connection for each | receive Messages. This Listener will create one Connection for each | |||
Remote Endpoint sending to the group, with the Local Endpoint | Remote Endpoint sending to the group, with the Local Endpoint | |||
Identifier specified as a group address. The set of Connection | Identifier specified as a group address. The set of Connection | |||
objects created forms a Connection Group. The receiving interface | objects created forms a Connection Group. The receiving interface | |||
can be restricted by passing it as part of the LocalSpecifier or | can be restricted by passing it as part of the LocalSpecifier or | |||
queried through the Message Context on the Messages received (see | queried through the MessageContext on the Messages received (see | |||
Section 9.1.1 for further details). | Section 9.1.1 for further details). | |||
Specifying WithHopLimit sets the Time To Live (TTL) field in the | Specifying WithHopLimit sets the Time To Live (TTL) field in the | |||
header of IPv4 packets or the Hop Count field in the header of IPv6 | header of IPv4 packets or the Hop Count field in the header of IPv6 | |||
packets. | packets. | |||
The following API calls can be used to configure a Preconnection | The following API calls can be used to configure a Preconnection | |||
before calling Listen: | before calling Listen: | |||
LocalSpecifier.WithSingleSourceMulticastGroupIP(GroupAddress, | LocalSpecifier.WithSingleSourceMulticastGroupIP(GroupAddress, | |||
skipping to change at line 1035 ¶ | skipping to change at line 1035 ¶ | |||
QUICRemoteSpecifier.WithHostName("example.com") | QUICRemoteSpecifier.WithHostName("example.com") | |||
QUICRemoteSpecifier.WithPort(8443) | QUICRemoteSpecifier.WithPort(8443) | |||
QUICRemoteSpecifier.WithProtocol(QUIC) | QUICRemoteSpecifier.WithProtocol(QUIC) | |||
RemoteSpecifiers := [ RemoteSpecifier, QUICRemoteSpecifier ] | RemoteSpecifiers := [ RemoteSpecifier, QUICRemoteSpecifier ] | |||
6.1.4. Endpoint Examples | 6.1.4. Endpoint Examples | |||
The following examples of Endpoints show common usage patterns. | The following examples of Endpoints show common usage patterns. | |||
Specify a Remote Endpoint using a hostname "example.com" and a | Specify a Remote Endpoint using a hostname example.com and a service | |||
service name "https", which tells the system to use the default port | name https, which tells the system to use the default port for HTTPS | |||
for HTTPS (443): | (443): | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithHostName("example.com") | RemoteSpecifier.WithHostName("example.com") | |||
RemoteSpecifier.WithService("https") | RemoteSpecifier.WithService("https") | |||
Specify a Remote Endpoint using an IPv6 address and remote port: | Specify a Remote Endpoint using an IPv6 address and remote port: | |||
RemoteSpecifier := NewRemoteEndpoint() | RemoteSpecifier := NewRemoteEndpoint() | |||
RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | RemoteSpecifier.WithIPAddress(2001:db8:4920:e29d:a420:7461:7073:a) | |||
RemoteSpecifier.WithPort(443) | RemoteSpecifier.WithPort(443) | |||
skipping to change at line 1069 ¶ | skipping to change at line 1069 ¶ | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
Specify a Local Endpoint using a local interface name and local port: | Specify a Local Endpoint using a local interface name and local port: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithInterface("en0") | LocalSpecifier.WithInterface("en0") | |||
LocalSpecifier.WithPort(443) | LocalSpecifier.WithPort(443) | |||
As an alternative to specifying an interface name for the Local | As an alternative to specifying an interface name for the Local | |||
Endpoint, an application can express more fine-grained preferences | Endpoint, an application can express more fine-grained preferences | |||
using the Interface Instance or Type Selection Property; see | using the interface Selection Property; see Section 6.2.11. However, | |||
Section 6.2.11. However, if the application specifies Selection | if the application specifies Selection Properties that are | |||
Properties that are inconsistent with the Local Endpoint, this will | inconsistent with the Local Endpoint, this will result in an error | |||
result in an error once the application attempts to open a | once the application attempts to open a Connection. | |||
Connection. | ||||
Specify a Local Endpoint using a STUN server: | Specify a Local Endpoint using a STUN server: | |||
LocalSpecifier := NewLocalEndpoint() | LocalSpecifier := NewLocalEndpoint() | |||
LocalSpecifier.WithStunServer(address, port, credentials) | LocalSpecifier.WithStunServer(address, port, credentials) | |||
6.1.5. Multicast Examples | 6.1.5. Multicast Examples | |||
The following examples show how multicast groups can be used. | The following examples show how multicast groups can be used. | |||
skipping to change at line 1502 ¶ | skipping to change at line 1501 ¶ | |||
Default: Empty (not setting a preference for any PvD) | Default: Empty (not setting a preference for any PvD) | |||
Similar to interface (see Section 6.2.11), this property allows the | Similar to interface (see Section 6.2.11), this property allows the | |||
application to control path selection by selecting which specific PvD | application to control path selection by selecting which specific PvD | |||
or categories of PvDs it wants to Require, Prohibit, Prefer, or | or categories of PvDs it wants to Require, Prohibit, Prefer, or | |||
Avoid. Provisioning Domains define consistent sets of network | Avoid. Provisioning Domains define consistent sets of network | |||
properties that might be more specific than network interfaces | properties that might be more specific than network interfaces | |||
[RFC7556]. | [RFC7556]. | |||
As with interface instances and types, this property is a set of | As with interface, this property is a set of tuples of (Enumerated) | |||
tuples of (Enumerated) PvD identifier and preference. It can either | PvD identifier and preference. It can either be implemented directly | |||
be implemented directly as such or be implemented to make one | as such or be implemented to make one preference available for each | |||
preference available for each interface and interface type available | interface and interface type available on the system. | |||
on the system. | ||||
The identification of a specific PvD is specific to the | The identification of a specific PvD is specific to the | |||
implementation or system. [RFC8801] defines how to use an FQDN to | implementation or system. [RFC8801] defines how to use an FQDN to | |||
identify a PvD when advertised by a network, but systems might also | identify a PvD when advertised by a network, but systems might also | |||
use other locally relevant identifiers such as string names or | use other locally relevant identifiers such as string names or | |||
Integers to identify PvDs. As with requiring specific interfaces, | Integers to identify PvDs. As with requiring specific interfaces, | |||
requiring a specific PvD strictly limits the path selection. | requiring a specific PvD strictly limits the path selection. | |||
Categories or types of PvDs are also defined to be specific to the | Categories or types of PvDs are also defined to be specific to the | |||
implementation or system. These can be useful to identify a service | implementation or system. These can be useful to identify a service | |||
skipping to change at line 1540 ¶ | skipping to change at line 1538 ¶ | |||
Default: Avoid for Listeners and Rendezvous Connections; Prefer for | Default: Avoid for Listeners and Rendezvous Connections; Prefer for | |||
other Connections | other Connections | |||
This property allows the application to express a preference for the | This property allows the application to express a preference for the | |||
use of temporary local addresses, sometimes called "privacy" | use of temporary local addresses, sometimes called "privacy" | |||
addresses [RFC8981]. Temporary addresses are generally used to | addresses [RFC8981]. Temporary addresses are generally used to | |||
prevent linking connections over time when a stable address, | prevent linking connections over time when a stable address, | |||
sometimes called a "permanent" address, is not needed. There are | sometimes called a "permanent" address, is not needed. There are | |||
some caveats to note when specifying this property. First, if an | some caveats to note when specifying this property. First, if an | |||
application Requires the use of temporary addresses, the resulting | application requires the use of temporary addresses, the resulting | |||
Connection cannot use IPv4 because temporary addresses do not exist | Connection cannot use IPv4 because temporary addresses do not exist | |||
in IPv4. Second, temporary local addresses might involve trading off | in IPv4. Second, temporary local addresses might involve trading off | |||
privacy for performance. For instance, temporary addresses (e.g., | privacy for performance. For instance, temporary addresses (e.g., | |||
[RFC8981]) can interfere with resumption mechanisms that some | [RFC8981]) can interfere with resumption mechanisms that some | |||
protocols rely on to reduce initial latency. | protocols rely on to reduce initial latency. | |||
6.2.14. Multipath Transport | 6.2.14. Multipath Transport | |||
Name: multipath | Name: multipath | |||
skipping to change at line 1585 ¶ | skipping to change at line 1583 ¶ | |||
than the one initially used, it is necessary to set the | than the one initially used, it is necessary to set the | |||
advertisesAltaddr property (see Section 6.2.15). | advertisesAltaddr property (see Section 6.2.15). | |||
Setting this property to Active can have privacy implications. It | Setting this property to Active can have privacy implications. It | |||
enables the transport to establish connectivity using alternate paths | enables the transport to establish connectivity using alternate paths | |||
that might result in users being linkable across the multiple paths, | that might result in users being linkable across the multiple paths, | |||
even if the advertisesAltaddr property (see Section 6.2.15) is set to | even if the advertisesAltaddr property (see Section 6.2.15) is set to | |||
false. | false. | |||
Note that Multipath Transport has no corresponding Selection Property | Note that Multipath Transport has no corresponding Selection Property | |||
of type Preference. Enumeration values other than Disabled are | of type "Preference". Enumeration values other than Disabled are | |||
interpreted as a preference for choosing protocols that can make use | interpreted as a preference for choosing protocols that can make use | |||
of multiple paths. The Disabled value implies a requirement not to | of multiple paths. The Disabled value implies a requirement not to | |||
use multiple paths in parallel but does not prevent choosing a | use multiple paths in parallel but does not prevent choosing a | |||
protocol that is capable of using multiple paths, e.g., it does not | protocol that is capable of using multiple paths, e.g., it does not | |||
prevent choosing TCP but prevents sending the MP_CAPABLE option in | prevent choosing TCP but prevents sending the MP_CAPABLE option in | |||
the TCP handshake. | the TCP handshake. | |||
6.2.15. Advertisement of Alternative Addresses | 6.2.15. Advertisement of Alternative Addresses | |||
Name: advertisesAltaddr | Name: advertisesAltaddr | |||
skipping to change at line 1707 ¶ | skipping to change at line 1705 ¶ | |||
secure connection (e.g., serverCertificate or clientCertificate). | secure connection (e.g., serverCertificate or clientCertificate). | |||
Specifying security parameters from enumerated values (e.g., specific | Specifying security parameters from enumerated values (e.g., specific | |||
ciphersuites) might constrain which transport protocols can be | ciphersuites) might constrain which transport protocols can be | |||
selected during Connection establishment. | selected during Connection establishment. | |||
Security configuration parameters are specified in the | Security configuration parameters are specified in the | |||
preestablishment phase and are created as follows: | preestablishment phase and are created as follows: | |||
SecurityParameters := NewSecurityParameters() | SecurityParameters := NewSecurityParameters() | |||
Specific parameters are added using a call to Set() on the | Specific parameters are added using a call to Set on the | |||
SecurityParameters. | SecurityParameters. | |||
As with the rest of the Transport Services API, the exact names of | As with the rest of the Transport Services API, the exact names of | |||
parameters and/or values of enumerations (e.g., ciphersuites) used in | parameters and/or values of enumerations (e.g., ciphersuites) used in | |||
the security parameters are specific to the system or implementation | the security parameters are specific to the system or implementation | |||
and ought to be chosen to follow the principle of least surprise for | and ought to be chosen to follow the principle of least surprise for | |||
users of the platform/language environment in question. | users of the platform/language environment in question. | |||
For security parameters that are enumerations of known values, such | For security parameters that are enumerations of known values, such | |||
as TLS ciphersuites, implementations are responsible for exposing the | as TLS ciphersuites, implementations are responsible for exposing the | |||
skipping to change at line 2232 ¶ | skipping to change at line 2230 ¶ | |||
Connection Group using the same approach as that used in | Connection Group using the same approach as that used in | |||
Section 9.1.3.2: when allocating available network capacity among | Section 9.1.3.2: when allocating available network capacity among | |||
Connections in a Connection Group, sends on Connections with | Connections in a Connection Group, sends on Connections with | |||
numerically lower Priority values will be prioritized over sends on | numerically lower Priority values will be prioritized over sends on | |||
Connections that have numerically higher Priority values. Capacity | Connections that have numerically higher Priority values. Capacity | |||
will be shared among these Connections according to the connScheduler | will be shared among these Connections according to the connScheduler | |||
property (Section 8.1.5). See Section 9.2.6 for more details. | property (Section 8.1.5). See Section 9.2.6 for more details. | |||
7.5. Adding and Removing Endpoints on a Connection | 7.5. Adding and Removing Endpoints on a Connection | |||
Transport protocols that are explicitly multipath aware are expected | Transport protocols that are explicitly multipath-aware are expected | |||
to automatically manage the set of Remote Endpoints that they are | to automatically manage the set of Remote Endpoints that they are | |||
communicating with and the paths to those endpoints. A PathChange | communicating with and the paths to those endpoints. A PathChange | |||
event, described in Section 8.3.2, will be generated when the path | event, described in Section 8.3.2, will be generated when the path | |||
changes. | changes. | |||
However, in some cases, it is necessary to explicitly indicate to a | However, in some cases, it is necessary to explicitly indicate to a | |||
Connection that a new Remote Endpoint has become available for use or | Connection that a new Remote Endpoint has become available for use or | |||
indicate that a Remote Endpoint is no longer available. This is most | indicate that a Remote Endpoint is no longer available. This is most | |||
common in the case of peer-to-peer connections using Trickle ICE | common in the case of peer-to-peer connections using Trickle ICE | |||
[RFC8838]. | [RFC8838]. | |||
skipping to change at line 2323 ¶ | skipping to change at line 2321 ¶ | |||
Depending on the status of the Connection, the queried Connection | Depending on the status of the Connection, the queried Connection | |||
Properties will include different information: | Properties will include different information: | |||
* The Connection state, which can be one of the following: | * The Connection state, which can be one of the following: | |||
Establishing, Established, Closing, or Closed (see | Establishing, Established, Closing, or Closed (see | |||
Section 8.1.11.1). | Section 8.1.11.1). | |||
* Whether the Connection can be used to send data (see | * Whether the Connection can be used to send data (see | |||
Section 8.1.11.2). A Connection cannot be used for sending if the | Section 8.1.11.2). A Connection cannot be used for sending if the | |||
Connection was created with the Selection Property direction set | Connection was created with the Selection Property direction set | |||
to unidirectional receive or if a Message marked as Final was sent | to Unidirectional receive or if a Message marked as Final was sent | |||
over this Connection. See also Section 9.1.3.5. | over this Connection. See also Section 9.1.3.5. | |||
* Whether the Connection can be used to receive data (see | * Whether the Connection can be used to receive data (see | |||
Section 8.1.11.3). A Connection cannot be used for receiving if | Section 8.1.11.3). A Connection cannot be used for receiving if | |||
the Connection was created with the Selection Property direction | the Connection was created with the Selection Property direction | |||
set to unidirectional send or if a Message marked as Final was | set to Unidirectional send or if a Message marked as Final was | |||
received (see Section 9.3.3.3). The latter is only supported by | received (see Section 9.3.3.3). The latter is only supported by | |||
certain transport protocols, e.g., by TCP as a half-closed | certain transport protocols, e.g., by TCP as a half-closed | |||
connection. | connection. | |||
* For Connections that are Established, Closing, or Closed: | * For Connections that are Established, Closing, or Closed: | |||
Connection Properties (Section 8.1) of the actual protocols that | Connection Properties (Section 8.1) of the actual protocols that | |||
were selected and instantiated, and Selection Properties that the | were selected and instantiated, and Selection Properties that the | |||
application specified on the Preconnection. Selection Properties | application specified on the Preconnection. Selection Properties | |||
of type Preference will be exposed as Boolean values indicating | of type "Preference" will be exposed as Boolean values indicating | |||
whether or not the property applies to the selected transport. | whether or not the property applies to the selected transport. | |||
Note that the instantiated Protocol Stack might not match all | Note that the instantiated Protocol Stack might not match all | |||
Protocol Selection Properties that the application specified on | Protocol Selection Properties that the application specified on | |||
the Preconnection. | the Preconnection. | |||
* For Connections that are Established: Transport Services system | * For Connections that are Established: Transport Services system | |||
implementations ought to provide information concerning the | implementations ought to provide information concerning the | |||
path(s) used by the Protocol Stack. This can be derived from | path(s) used by the Protocol Stack. This can be derived from | |||
local PvD information, measurements by the Protocol Stack, or | local PvD information, measurements by the Protocol Stack, or | |||
other sources. For example, a transport system that is configured | other sources. For example, a transport system that is configured | |||
skipping to change at line 2491 ¶ | skipping to change at line 2489 ¶ | |||
and/or receive data without any urgency. This can, for example, | and/or receive data without any urgency. This can, for example, | |||
be used to select Protocol Stacks with scavenger transmission | be used to select Protocol Stacks with scavenger transmission | |||
control and/or to assign the traffic to a lower-effort service. | control and/or to assign the traffic to a lower-effort service. | |||
Transport Services systems that map the requested capacity profile | Transport Services systems that map the requested capacity profile | |||
to per-connection DSCP signaling SHOULD assign the DSCP "Less than | to per-connection DSCP signaling SHOULD assign the DSCP "Less than | |||
best effort" PHB [RFC8622]. | best effort" PHB [RFC8622]. | |||
Low Latency/Interactive: The application is interactive and prefers | Low Latency/Interactive: The application is interactive and prefers | |||
loss to latency. Response time SHOULD be optimized at the expense | loss to latency. Response time SHOULD be optimized at the expense | |||
of delay variation and efficient use of the available capacity | of delay variation and efficient use of the available capacity | |||
when sending on this Connection. The "Low Latency/Interactive" | when sending on this Connection. The Low Latency/Interactive | |||
value of the capacity profile can be used by the system to disable | value of the capacity profile can be used by the system to disable | |||
the coalescing of multiple small Messages into larger packets | the coalescing of multiple small Messages into larger packets | |||
(Nagle algorithm (see Section 4.2.3.4 of [RFC1122])); to prefer | (Nagle algorithm (see Section 4.2.3.4 of [RFC1122])); to prefer | |||
immediate acknowledgement from the peer endpoint when supported by | immediate acknowledgement from the peer endpoint when supported by | |||
the underlying transport; and so on. Transport Services systems | the underlying transport; and so on. Transport Services systems | |||
that map the requested capacity profile to per-connection DSCP | that map the requested capacity profile to per-connection DSCP | |||
signaling without multiplexing SHOULD assign a DSCP Assured | signaling without multiplexing SHOULD assign a DSCP Assured | |||
Forwarding (AF41, AF42, AF43, and AF44) PHB [RFC2597]. Inelastic | Forwarding (AF41, AF42, AF43, and AF44) PHB [RFC2597]. Inelastic | |||
traffic that is expected to conform to the configured network | traffic that is expected to conform to the configured network | |||
service rate could be mapped to the DSCP Expedited Forwarding PHBs | service rate could be mapped to the DSCP Expedited Forwarding PHBs | |||
skipping to change at line 2679 ¶ | skipping to change at line 2677 ¶ | |||
8.1.11.4. Maximum Message Size Before Fragmentation or Segmentation | 8.1.11.4. Maximum Message Size Before Fragmentation or Segmentation | |||
Name: singularTransmissionMsgMaxLen | Name: singularTransmissionMsgMaxLen | |||
Type: Integer (non-negative) or Not applicable | Type: Integer (non-negative) or Not applicable | |||
This property, if applicable, represents the maximum Message size | This property, if applicable, represents the maximum Message size | |||
that can be sent without incurring network-layer fragmentation at the | that can be sent without incurring network-layer fragmentation at the | |||
sender. It is specified as a number of bytes and is less than or | sender. It is specified as a number of bytes and is less than or | |||
equal to the Maximum Message Size on Send. It exposes a readable | equal to the maximum Message Size on Send. It exposes a readable | |||
value to the application based on the Maximum Packet Size (MPS). The | value to the application based on the Maximum Packet Size (MPS). The | |||
value of this property can change over time (and can be updated via | value of this property can change over time (and can be updated via | |||
Datagram Packetization Layer Path MTU Discovery (DPLPMTUD) | Datagram Packetization Layer Path MTU Discovery (DPLPMTUD) | |||
[RFC8899]). This value allows a sending stack to avoid unwanted | [RFC8899]). This value allows a sending stack to avoid unwanted | |||
fragmentation at the network layer or segmentation by the transport | fragmentation at the network layer or segmentation by the transport | |||
layer before choosing the message size and/or after a SendError | layer before choosing the message size and/or after a SendError | |||
occurs indicating an attempt to send a Message that is too large. A | occurs indicating an attempt to send a Message that is too large. A | |||
Transport Services API could express Not applicable in an | Transport Services API could express Not applicable in an | |||
environment-typical way, e.g., as a Union type or special value | environment-typical way, e.g., as a Union type or special value | |||
(e.g., 0). | (e.g., 0). | |||
skipping to change at line 2729 ¶ | skipping to change at line 2727 ¶ | |||
These properties are included here because the feature Suggest | These properties are included here because the feature Suggest | |||
timeout to the peer is part of the minimal set of Transport Services | timeout to the peer is part of the minimal set of Transport Services | |||
[RFC8923], where this feature was categorized as "functional". This | [RFC8923], where this feature was categorized as "functional". This | |||
means that when a Transport Services system offers this feature, the | means that when a Transport Services system offers this feature, the | |||
Transport Services API has to expose an interface to the application. | Transport Services API has to expose an interface to the application. | |||
Otherwise, the implementation might violate assumptions by the | Otherwise, the implementation might violate assumptions by the | |||
application, which could cause the application to fail. | application, which could cause the application to fail. | |||
All of the below properties are optional (e.g., it is possible to | All of the below properties are optional (e.g., it is possible to | |||
specify User Timeout Enabled as true but not specify an Advertised | specify tcp.userTimeoutValue as true but not specify a | |||
User Timeout value; in this case, the TCP default will be used). | tcp.userTimeoutValue value; in this case, the TCP default will be | |||
These properties reflect the API extension specified in Section 3 of | used). These properties reflect the API extension specified in | |||
[RFC5482]. | Section 3 of [RFC5482]. | |||
8.2.1. Advertised User Timeout | 8.2.1. Advertised User Timeout | |||
Name: tcp.userTimeoutValue | Name: tcp.userTimeoutValue | |||
Type: Integer (positive) | Type: Integer (positive) | |||
Default: the TCP default | Default: the TCP default | |||
This time value is advertised via the TCP User Timeout Option (UTO) | This time value is advertised via the TCP User Timeout Option (UTO) | |||
[RFC5482] to the Remote Endpoint, which can use it to adapt its own | [RFC5482] to the Remote Endpoint, which can use it to adapt its own | |||
Timeout for aborting the Connection (see Section 8.1.3) value. | connTimeout (see Section 8.1.3) value. | |||
8.2.2. User Timeout Enabled | 8.2.2. User Timeout Enabled | |||
Name: tcp.userTimeoutEnabled | Name: tcp.userTimeoutEnabled | |||
Type: Boolean | Type: Boolean | |||
Default: false | Default: false | |||
This property controls whether the TCP UTO is enabled for a | This property controls whether the TCP UTO is enabled for a | |||
skipping to change at line 2803 ¶ | skipping to change at line 2801 ¶ | |||
Connection -> PathChange<> | Connection -> PathChange<> | |||
9. Data Transfer | 9. Data Transfer | |||
Data is sent and received as Messages, which allows the application | Data is sent and received as Messages, which allows the application | |||
to communicate the boundaries of the data being transferred. | to communicate the boundaries of the data being transferred. | |||
9.1. Messages and Framers | 9.1. Messages and Framers | |||
Each Message has an optional Message Context, which allows adding | Each Message has an optional MessageContext, which allows adding | |||
Message Properties, to identify Send events related to a specific | Message Properties, to identify Send events related to a specific | |||
Message or to inspect metadata related to the Message sent. Framers | Message or to inspect metadata related to the Message sent. Framers | |||
can be used to extend or modify the Message data with additional | can be used to extend or modify the Message data with additional | |||
information that can be processed at the receiver to detect message | information that can be processed at the receiver to detect message | |||
boundaries. | boundaries. | |||
9.1.1. Message Contexts | 9.1.1. Message Contexts | |||
Using the MessageContext object, the application can set and retrieve | Using the MessageContext object, the application can set and retrieve | |||
metadata of the Message, including Message Properties (see | metadata of the Message, including Message Properties (see | |||
Section 9.1.3) and framing metadata (see Section 9.1.2.2). | Section 9.1.3) and framing metadata (see Section 9.1.2.2). | |||
Therefore, a MessageContext object can be passed to the Send action | Therefore, a MessageContext object can be passed to the Send action | |||
and is returned by each event related to Send and Receive. | and is returned by each event related to Send and Receive. | |||
Message Properties can be set and queried using the Message Context: | Message Properties can be set and queried using the MessageContext: | |||
MessageContext.add(property, value) | MessageContext.add(property, value) | |||
PropertyValue := MessageContext.get(property) | PropertyValue := MessageContext.get(property) | |||
These Message Properties can be generic properties or Protocol- | These Message Properties can be generic properties or Protocol- | |||
specific Properties. | specific Properties. | |||
For MessageContexts returned by Send events (see Section 9.2.2) and | For MessageContexts returned by Send events (see Section 9.2.2) and | |||
Receive events (see Section 9.3.2), the application can query | Receive events (see Section 9.3.2), the application can query | |||
information about the Local and Remote Endpoint: | information about the Local and Remote Endpoint: | |||
skipping to change at line 2949 ¶ | skipping to change at line 2947 ¶ | |||
httpFramer := NewHTTPMessageFramer() | httpFramer := NewHTTPMessageFramer() | |||
... | ... | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(httpFramer, "accept", "text/html") | messageContext.add(httpFramer, "accept", "text/html") | |||
9.1.3. Message Properties | 9.1.3. Message Properties | |||
Applications needing to annotate the Messages they send with extra | Applications needing to annotate the Messages they send with extra | |||
information (for example, to control how data is scheduled and | information (for example, to control how data is scheduled and | |||
processed by the transport protocols supporting the Connection) can | processed by the transport protocols supporting the Connection) can | |||
include this information in the Message Context passed to the Send | include this information in the MessageContext passed to the Send | |||
action. For other uses of the Message Context, see Section 9.1.1. | action. For other uses of the MessageContext, see Section 9.1.1. | |||
Message Properties are per-Message, not per-Send, if partial Messages | Message Properties are per-Message, not per-Send, if partial Messages | |||
are sent (Section 9.2.3). All data blocks associated with a single | are sent (Section 9.2.3). All data blocks associated with a single | |||
Message share properties specified in the Message Contexts. For | Message share properties specified in the MessageContexts. For | |||
example, it would not make sense to have the beginning of a Message | example, it would not make sense to have the beginning of a Message | |||
expire and then allow the end of the Message to still be sent. | expire and then allow the end of the Message to still be sent. | |||
A MessageContext object contains metadata for the Messages to be sent | A MessageContext object contains metadata for the Messages to be sent | |||
or received. | or received. | |||
messageData := "hello" | messageData := "hello" | |||
messageContext := NewMessageContext() | messageContext := NewMessageContext() | |||
messageContext.add(parameter, value) | messageContext.add(parameter, value) | |||
Connection.Send(messageData, messageContext) | Connection.Send(messageData, messageContext) | |||
skipping to change at line 3116 ¶ | skipping to change at line 3114 ¶ | |||
If true, this indicates a Message is the last that the application | If true, this indicates a Message is the last that the application | |||
will send on a Connection. This allows underlying protocols to | will send on a Connection. This allows underlying protocols to | |||
indicate to the Remote Endpoint that the Connection has been | indicate to the Remote Endpoint that the Connection has been | |||
effectively closed in the sending direction. For example, TCP-based | effectively closed in the sending direction. For example, TCP-based | |||
Connections can send a FIN once a Message marked as Final has been | Connections can send a FIN once a Message marked as Final has been | |||
completely sent, indicated by marking endOfMessage. Protocols that | completely sent, indicated by marking endOfMessage. Protocols that | |||
do not support signaling the end of a Connection in a given direction | do not support signaling the end of a Connection in a given direction | |||
will ignore this property. | will ignore this property. | |||
A Final Message must always be sorted to the end of a list of | A Final Message must always be sorted to the end of a list of | |||
Messages. The Final property overrides Priority and any other | Messages. The final property overrides Priority and any other | |||
property that would reorder Messages. If another Message is sent | property that would reorder Messages. If another Message is sent | |||
after a Message marked as Final has already been sent on a | after a Message marked as Final has already been sent on a | |||
Connection, the Send action for the new Message will cause a | Connection, the Send action for the new Message will cause a | |||
SendError event. | SendError event. | |||
9.1.3.6. Sending Corruption Protection Length | 9.1.3.6. Sending Corruption Protection Length | |||
Name: msgChecksumLen | Name: msgChecksumLen | |||
Type: Integer (non-negative) or Full Coverage | Type: Integer (non-negative) or Full Coverage | |||
skipping to change at line 3323 ¶ | skipping to change at line 3321 ¶ | |||
next Send action. | next Send action. | |||
9.2.2.2. Expired | 9.2.2.2. Expired | |||
Connection -> Expired<messageContext> | Connection -> Expired<messageContext> | |||
The Expired event occurs when a previous Send action expired before | The Expired event occurs when a previous Send action expired before | |||
completion, i.e., when the Message was not sent before its Lifetime | completion, i.e., when the Message was not sent before its Lifetime | |||
(see Section 9.1.3.1) expired. This is separate from SendError, as | (see Section 9.1.3.1) expired. This is separate from SendError, as | |||
it is an expected behavior for partially reliable transports. The | it is an expected behavior for partially reliable transports. The | |||
Expired event contains a reference to the Message Context of the | Expired event contains a reference to the MessageContext of the | |||
Message to which it applies. | Message to which it applies. | |||
9.2.2.3. SendError | 9.2.2.3. SendError | |||
Connection -> SendError<messageContext, reason?> | Connection -> SendError<messageContext, reason?> | |||
A SendError occurs when a Message was not sent due to an error | A SendError occurs when a Message was not sent due to an error | |||
condition: an attempt to send a Message that is too large for the | condition: an attempt to send a Message that is too large for the | |||
system and Protocol Stack to handle, some failure of the underlying | system and Protocol Stack to handle, some failure of the underlying | |||
Protocol Stack, or a set of Message Properties not consistent with | Protocol Stack, or a set of Message Properties not consistent with | |||
the Connection's transport properties. The SendError contains a | the Connection's transport properties. The SendError contains a | |||
reference to the Message Context of the Message to which it applies. | reference to the MessageContext of the Message to which it applies. | |||
9.2.3. Partial Sends | 9.2.3. Partial Sends | |||
It is not always possible for an application to send all data | It is not always possible for an application to send all data | |||
associated with a Message in a single Send action. The Message data | associated with a Message in a single Send action. The Message data | |||
might be too large for the application to hold in memory at one time | might be too large for the application to hold in memory at one time | |||
or the length of the Message might be unknown or unbounded. | or the length of the Message might be unknown or unbounded. | |||
Partial Message sending is supported by passing an endOfMessage | Partial Message sending is supported by passing an endOfMessage | |||
Boolean parameter to the Send action. This value is always true by | Boolean parameter to the Send action. This value is always true by | |||
skipping to change at line 3393 ¶ | skipping to change at line 3391 ¶ | |||
9.2.5. Send on Active Open: InitiateWithSend | 9.2.5. Send on Active Open: InitiateWithSend | |||
For application-layer protocols where the Connection initiator also | For application-layer protocols where the Connection initiator also | |||
sends the first Message, the InitiateWithSend action combines | sends the first Message, the InitiateWithSend action combines | |||
Connection initiation with a first Message sent: | Connection initiation with a first Message sent: | |||
Connection := Preconnection.InitiateWithSend(messageData, | Connection := Preconnection.InitiateWithSend(messageData, | |||
messageContext?, | messageContext?, | |||
timeout?) | timeout?) | |||
Whenever possible, a MessageContext should be provided to declare the | Whenever possible, a messageContext should be provided to declare the | |||
Message passed to InitiateWithSend as "safely replayable" using the | Message passed to InitiateWithSend as "safely replayable" using the | |||
safelyReplayable property. This allows the Transport Services system | safelyReplayable property. This allows the Transport Services system | |||
to make use of 0-RTT establishment in case this is supported by the | to make use of 0-RTT establishment in case this is supported by the | |||
available Protocol Stacks. When the selected stack or stacks do not | available Protocol Stacks. When the selected stack or stacks do not | |||
support transmitting data upon connection establishment, | support transmitting data upon connection establishment, | |||
InitiateWithSend is identical to Initiate followed by Send. | InitiateWithSend is identical to Initiate followed by Send. | |||
Neither partial sends nor send batching are supported by | Neither partial sends nor send batching are supported by | |||
InitiateWithSend. | InitiateWithSend. | |||
skipping to change at line 3541 ¶ | skipping to change at line 3539 ¶ | |||
continue to receive more of the same Message, the application must | continue to receive more of the same Message, the application must | |||
invoke Receive again. | invoke Receive again. | |||
Multiple invocations of ReceivedPartial deliver data for the same | Multiple invocations of ReceivedPartial deliver data for the same | |||
Message by passing the same MessageContext until the endOfMessage | Message by passing the same MessageContext until the endOfMessage | |||
flag is delivered or a ReceiveError occurs. All partial blocks of a | flag is delivered or a ReceiveError occurs. All partial blocks of a | |||
single Message are delivered in order without gaps. This event does | single Message are delivered in order without gaps. This event does | |||
not support delivering non-contiguous partial Messages. For example, | not support delivering non-contiguous partial Messages. For example, | |||
if Message A is divided into three pieces (A1, A2, and A3), Message B | if Message A is divided into three pieces (A1, A2, and A3), Message B | |||
is divided into three pieces (B1, B2, and B3), and preserveOrder is | is divided into three pieces (B1, B2, and B3), and preserveOrder is | |||
not Required, the ReceivedPartial could deliver them in a sequence | not Require, the ReceivedPartial could deliver them in a sequence | |||
like this: A1, B1, B2, A2, A3, B3. This is because the | like this: A1, B1, B2, A2, A3, B3. This is because the | |||
MessageContext allows the application to identify the pieces as | MessageContext allows the application to identify the pieces as | |||
belonging to Message A and B, respectively. However, a sequence like | belonging to Message A and B, respectively. However, a sequence like | |||
A1, A3 will never occur. | A1, A3 will never occur. | |||
If the minIncompleteLength in the Receive request was set to be | If the minIncompleteLength in the Receive request was set to be | |||
infinite (indicating a request to receive only complete Messages), | infinite (indicating a request to receive only complete Messages), | |||
the ReceivedPartial event could still be delivered if one of the | the ReceivedPartial event could still be delivered if one of the | |||
following conditions is true: | following conditions is true: | |||
skipping to change at line 3615 ¶ | skipping to change at line 3613 ¶ | |||
the peer application to adjust the msgChecksumLen property (see | the peer application to adjust the msgChecksumLen property (see | |||
Section 9.1.3.6). | Section 9.1.3.6). | |||
In contrast, internal protocol reception errors (e.g., loss causing | In contrast, internal protocol reception errors (e.g., loss causing | |||
retransmissions in TCP) are not signaled by this event. Conditions | retransmissions in TCP) are not signaled by this event. Conditions | |||
that irrevocably lead to the termination of the Connection are | that irrevocably lead to the termination of the Connection are | |||
signaled using ConnectionError (see Section 10). | signaled using ConnectionError (see Section 10). | |||
9.3.3. Receive Message Properties | 9.3.3. Receive Message Properties | |||
Each Message Context could contain metadata from protocols in the | Each MessageContext could contain metadata from protocols in the | |||
Protocol Stack; which metadata is available is Protocol Stack | Protocol Stack; which metadata is available is Protocol Stack | |||
dependent. These are exposed through additional read-only Message | dependent. These are exposed through additional read-only Message | |||
Properties that can be queried from the MessageContext object (see | Properties that can be queried from the MessageContext object (see | |||
Section 9.1.1) passed by the receive event. The metadata values in | Section 9.1.1) passed by the receive event. The metadata values in | |||
the following subsections are supported. | the following subsections are supported. | |||
9.3.3.1. Property Specific to UDP and UDP-Lite: ECN | 9.3.3.1. Property Specific to UDP and UDP-Lite: ECN | |||
When available, Message metadata carries the value of the Explicit | When available, Message metadata carries the value of the Explicit | |||
Congestion Notification (ECN) field. This information can be used | Congestion Notification (ECN) field. This information can be used | |||
skipping to change at line 3651 ¶ | skipping to change at line 3649 ¶ | |||
Thus, receivers might wish to perform additional checks for early | Thus, receivers might wish to perform additional checks for early | |||
data to ensure that it is safely replayable. If TLS 1.3 is available | data to ensure that it is safely replayable. If TLS 1.3 is available | |||
and the recipient Message was sent as part of early data, the | and the recipient Message was sent as part of early data, the | |||
corresponding metadata carries a flag indicating as such. If early | corresponding metadata carries a flag indicating as such. If early | |||
data is enabled, applications should check this metadata field for | data is enabled, applications should check this metadata field for | |||
Messages received during Connection establishment and respond | Messages received during Connection establishment and respond | |||
accordingly. | accordingly. | |||
9.3.3.3. Receiving Final Messages | 9.3.3.3. Receiving Final Messages | |||
The Message Context can indicate whether or not this Message is the | The MessageContext can indicate whether or not this Message is the | |||
Final Message on a Connection. For any Message that is marked as | last Message on a Connection. For any Message that is marked as | |||
Final, the application can assume that there will be no more Messages | Final, the application can assume that there will be no more Messages | |||
received on the Connection once the Message has been completely | received on the Connection once the Message has been completely | |||
delivered. This corresponds to the final property that can be marked | delivered. This corresponds to the final property that can be marked | |||
on a sent Message; see Section 9.1.3.5. | on a sent Message; see Section 9.1.3.5. | |||
Some transport protocols and peers do not support signaling of the | Some transport protocols and peers do not support signaling of the | |||
final property. Therefore, applications SHOULD NOT rely on receiving | final property. Therefore, applications SHOULD NOT rely on receiving | |||
a Message marked Final to know that the sending endpoint is done | a Message marked Final to know that the sending endpoint is done | |||
sending on a Connection. | sending on a Connection. | |||
skipping to change at line 4222 ¶ | skipping to change at line 4220 ¶ | |||
Time duration types are implementation specific. For instance, it | Time duration types are implementation specific. For instance, it | |||
could be a number of seconds, a number of milliseconds, or a struct | could be a number of seconds, a number of milliseconds, or a struct | |||
timeval in C; in C++, it could be a user-defined Duration class. | timeval in C; in C++, it could be a user-defined Duration class. | |||
Appendix B. Convenience Functions | Appendix B. Convenience Functions | |||
B.1. Adding Preference Properties | B.1. Adding Preference Properties | |||
TransportProperties will frequently need to set Selection Properties | TransportProperties will frequently need to set Selection Properties | |||
of type Preference; therefore, implementations can provide special | of type "Preference"; therefore, implementations can provide special | |||
actions for adding each preference level, i.e., | actions for adding each preference level, i.e., | |||
TransportProperties.Set(some_property, avoid) is equivalent to | TransportProperties.Set(some_property, avoid) is equivalent to | |||
TransportProperties.Avoid(some_property): | TransportProperties.Avoid(some_property): | |||
TransportProperties.Require(property) | TransportProperties.Require(property) | |||
TransportProperties.Prefer(property) | TransportProperties.Prefer(property) | |||
TransportProperties.NoPreference(property) | TransportProperties.NoPreference(property) | |||
TransportProperties.Avoid(property) | TransportProperties.Avoid(property) | |||
TransportProperties.Prohibit(property) | TransportProperties.Prohibit(property) | |||
End of changes. 31 change blocks. | ||||
46 lines changed or deleted | 44 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |