rfc9308.original | rfc9308.txt | |||
---|---|---|---|---|
Network Working Group M. Kuehlewind | Internet Engineering Task Force (IETF) M. Kühlewind | |||
Internet-Draft Ericsson | Request for Comments: 9308 Ericsson | |||
Intended status: Informational B. Trammell | Category: Informational B. Trammell | |||
Expires: 16 January 2023 Google | ISSN: 2070-1721 Google Switzerland GmbH | |||
15 July 2022 | September 2022 | |||
Applicability of the QUIC Transport Protocol | Applicability of the QUIC Transport Protocol | |||
draft-ietf-quic-applicability-18 | ||||
Abstract | Abstract | |||
This document discusses the applicability of the QUIC transport | This document discusses the applicability of the QUIC transport | |||
protocol, focusing on caveats impacting application protocol | protocol, focusing on caveats impacting application protocol | |||
development and deployment over QUIC. Its intended audience is | development and deployment over QUIC. Its intended audience is | |||
designers of application protocol mappings to QUIC, and implementors | designers of application protocol mappings to QUIC and implementors | |||
of these application protocols. | of these application protocols. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This document is not an Internet Standards Track specification; it is | |||
provisions of BCP 78 and BCP 79. | published for informational purposes. | |||
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). Not all documents | |||
approved by the IESG are candidates for any level of Internet | ||||
Standard; see Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 16 January 2023. | 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/rfc9308. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 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 . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
2. The Necessity of Fallback . . . . . . . . . . . . . . . . . . 3 | 2. The Necessity of Fallback | |||
3. Zero RTT . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 3. 0-RTT | |||
3.1. Replay Attacks . . . . . . . . . . . . . . . . . . . . . 4 | 3.1. Replay Attacks | |||
3.2. Session resumption versus Keep-alive . . . . . . . . . . 5 | 3.2. Session Resumption versus Keep-Alive | |||
4. Use of Streams . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. Use of Streams | |||
4.1. Stream versus Flow Multiplexing . . . . . . . . . . . . . 8 | 4.1. Stream versus Flow Multiplexing | |||
4.2. Prioritization . . . . . . . . . . . . . . . . . . . . . 9 | 4.2. Prioritization | |||
4.3. Ordered and Reliable Delivery . . . . . . . . . . . . . . 9 | 4.3. Ordered and Reliable Delivery | |||
4.4. Flow Control Deadlocks . . . . . . . . . . . . . . . . . 10 | 4.4. Flow Control Deadlocks | |||
4.5. Stream Limit Commitments . . . . . . . . . . . . . . . . 11 | 4.5. Stream Limit Commitments | |||
5. Packetization and Latency . . . . . . . . . . . . . . . . . . 12 | 5. Packetization and Latency | |||
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 13 | 6. Error Handling | |||
7. Acknowledgment Efficiency . . . . . . . . . . . . . . . . . . 13 | 7. Acknowledgment Efficiency | |||
8. Port Selection and Application Endpoint Discovery . . . . . . 14 | 8. Port Selection and Application Endpoint Discovery | |||
8.1. Source Port Selection . . . . . . . . . . . . . . . . . . 15 | 8.1. Source Port Selection | |||
9. Connection Migration . . . . . . . . . . . . . . . . . . . . 15 | 9. Connection Migration | |||
10. Connection Termination . . . . . . . . . . . . . . . . . . . 16 | 10. Connection Termination | |||
11. Information Exposure and the Connection ID . . . . . . . . . 17 | 11. Information Exposure and the Connection ID | |||
11.1. Server-Generated Connection ID . . . . . . . . . . . . . 18 | 11.1. Server-Generated Connection ID | |||
11.2. Mitigating Timing Linkability with Connection ID | 11.2. Mitigating Timing Linkability with Connection ID Migration | |||
Migration . . . . . . . . . . . . . . . . . . . . . . . 18 | 11.3. Using Server Retry for Redirection | |||
11.3. Using Server Retry for Redirection . . . . . . . . . . . 19 | 12. Quality of Service (QoS) and Diffserv Code Point (DSCP) | |||
12. Quality of Service (QoS) and DSCP . . . . . . . . . . . . . . 19 | 13. Use of Versions and Cryptographic Handshake | |||
13. Use of Versions and Cryptographic Handshake . . . . . . . . . 20 | 14. Enabling Deployment of New Versions | |||
14. Enabling Deployment of New Versions . . . . . . . . . . . . . 20 | 15. Unreliable Datagram Service over QUIC | |||
15. Unreliable Datagram Service over QUIC . . . . . . . . . . . . 21 | 16. IANA Considerations | |||
16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | 17. Security Considerations | |||
17. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | 18. References | |||
18. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 22 | 18.1. Normative References | |||
19. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 22 | 18.2. Informative References | |||
20. References . . . . . . . . . . . . . . . . . . . . . . . . . 22 | Acknowledgments | |||
20.1. Normative References . . . . . . . . . . . . . . . . . . 22 | Contributors | |||
20.2. Informative References . . . . . . . . . . . . . . . . . 23 | Authors' Addresses | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 26 | ||||
1. Introduction | 1. Introduction | |||
QUIC [QUIC] is a new transport protocol providing a number of | QUIC [QUIC] is a new transport protocol providing a number of | |||
advanced features. While initially designed for the HTTP use case, | advanced features. While initially designed for the HTTP use case, | |||
it provides capabilities that can be used with a much wider variety | it provides capabilities that can be used with a much wider variety | |||
of applications. QUIC is encapsulated in UDP. QUIC version 1 | of applications. QUIC is encapsulated in UDP. QUIC version 1 | |||
integrates TLS 1.3 [TLS13] to encrypt all payload data and most | integrates TLS 1.3 [TLS13] to encrypt all payload data and most | |||
control information. The version of HTTP that uses QUIC is known as | control information. The version of HTTP that uses QUIC is known as | |||
HTTP/3 [QUIC-HTTP]. | HTTP/3 [QUIC-HTTP]. | |||
This document provides guidance for application developers that want | This document provides guidance for application developers who want | |||
to use the QUIC protocol without implementing it on their own. This | to use the QUIC protocol without implementing it on their own. This | |||
includes general guidance for applications operating over HTTP/3 or | includes general guidance for applications operating over HTTP/3 or | |||
directly over QUIC. | directly over QUIC. | |||
In the following sections we discuss specific caveats to QUIC's | In the following sections, we discuss specific caveats to QUIC's | |||
applicability, and issues that application developers must consider | applicability and issues that application developers must consider | |||
when using QUIC as a transport for their application. | when using QUIC as a transport for their applications. | |||
2. The Necessity of Fallback | 2. The Necessity of Fallback | |||
QUIC uses UDP as a substrate. This enables userspace implementation | QUIC uses UDP as a substrate. This enables userspace implementation | |||
and permits traversal of network middleboxes (including NAT) without | and permits traversal of network middleboxes (including NAT) without | |||
requiring updates to existing network infrastructure. | requiring updates to existing network infrastructure. | |||
Measurement studies have shown between three [Trammell16] and five | Measurement studies have shown between 3% [Trammell16] and 5% | |||
[Swett16] percent of networks block all UDP traffic, though there is | [Swett16] of networks block all UDP traffic, though there is little | |||
little evidence of other forms of systematic disadvantage to UDP | evidence of other forms of systematic disadvantage to UDP traffic | |||
traffic compared to TCP [Edeline16]. This blocking implies that all | compared to TCP [Edeline16]. This blocking implies that all | |||
applications running on top of QUIC must either be prepared to accept | applications running on top of QUIC must either be prepared to accept | |||
connectivity failure on such networks, or be engineered to fall back | connectivity failure on such networks or be engineered to fall back | |||
to some other transport protocol. In the case of HTTP, this fallback | to some other transport protocol. In the case of HTTP, this fallback | |||
is TLS over TCP. | is TLS over TCP. | |||
The IETF TAPS specifications [I-D.ietf-taps-arch] describe a system | The IETF Transport Services (TAPS) specifications [TAPS-ARCH] | |||
with a common API for multiple protocols. This is particularly | describe a system with a common API for multiple protocols. This is | |||
relevant for QUIC as it addresses the implications of fallback among | particularly relevant for QUIC as it addresses the implications of | |||
multiple protocols. | fallback among multiple protocols. | |||
Specifically, fallback to insecure protocols or to weaker versions of | Specifically, fallback to insecure protocols or to weaker versions of | |||
secure protocols needs to be avoided. In general, an application | secure protocols needs to be avoided. In general, an application | |||
that implements fallback needs to consider the security consequences. | that implements fallback needs to consider the security consequences. | |||
A fallback to TCP and TLS exposes control information to modification | A fallback to TCP and TLS exposes control information to modification | |||
and manipulation in the network. Additionally, downgrades to older | and manipulation in the network. Additionally, downgrades to TLS | |||
TLS versions than 1.3, which is used in QUIC version 1, might result | versions older than 1.3, which is used in QUIC version 1, might | |||
in significantly weaker cryptographic protection. For example, the | result in significantly weaker cryptographic protection. For | |||
results of protocol negotiation [RFC7301] only have confidentiality | example, the results of protocol negotiation [RFC7301] only have | |||
protection if TLS 1.3 is used. | confidentiality protection if TLS 1.3 is used. | |||
These applications must operate, perhaps with impaired functionality, | These applications must operate, perhaps with impaired functionality, | |||
in the absence of features provided by QUIC not present in the | in the absence of features provided by QUIC not present in the | |||
fallback protocol. For fallback to TLS over TCP, the most obvious | fallback protocol. For fallback to TLS over TCP, the most obvious | |||
difference is that TCP does not provide stream multiplexing and | difference is that TCP does not provide stream multiplexing, and | |||
therefore stream multiplexing would need to be implemented in the | therefore stream multiplexing would need to be implemented in the | |||
application layer if needed. Further, TCP implementations and | application layer if needed. Further, TCP implementations and | |||
network paths often do not support the Fast Open option [RFC7413], | network paths often do not support the TCP Fast Open (TFO) option | |||
which enables sending of payload data together with the first control | [RFC7413], which enables sending of payload data together with the | |||
packet of a new connection as also provided by 0-RTT session | first control packet of a new connection as also provided by 0-RTT | |||
resumption in QUIC. Note that there is some evidence of middleboxes | session resumption in QUIC. Note that there is some evidence of | |||
blocking SYN data even if TFO was successfully negotiated (see | middleboxes blocking SYN data even if TFO was successfully negotiated | |||
[PaaschNanog]). And even if Fast Open successfully operates end-to- | (see [PaaschNanog]). And even if Fast Open successfully operates end | |||
end, it is limited to a single packet of TLS handshake and | to end, it is limited to a single packet of TLS handshake and | |||
application data, unlike QUIC 0-RTT. | application data, unlike QUIC 0-RTT. | |||
Moreover, while encryption (in this case TLS) is inseparably | Moreover, while encryption (in this case TLS) is inseparably | |||
integrated with QUIC, TLS negotiation over TCP can be blocked. If | integrated with QUIC, TLS negotiation over TCP can be blocked. If | |||
TLS over TCP cannot be supported, the connection should be aborted, | TLS over TCP cannot be supported, the connection should be aborted, | |||
and the application then ought to present a suitable prompt to the | and the application then ought to present a suitable prompt to the | |||
user that secure communication is unavailable. | user that secure communication is unavailable. | |||
In summary, any fallback mechanism is likely to impose a degradation | In summary, any fallback mechanism is likely to impose a degradation | |||
of performance and can degrade security; however, fallback must not | of performance and can degrade security; however, fallback must not | |||
silently violate the application's expectation of confidentiality or | silently violate the application's expectation of confidentiality or | |||
integrity of its payload data. | integrity of its payload data. | |||
3. Zero RTT | 3. 0-RTT | |||
QUIC provides for 0-RTT connection establishment. Though the same | QUIC provides for 0-RTT connection establishment. Though the same | |||
facility exists in TLS 1.3 with TCP, 0-RTT presents opportunities and | facility exists in TLS 1.3 with TCP, 0-RTT presents opportunities and | |||
challenges for applications using QUIC. | challenges for applications using QUIC. | |||
A transport protocol that provides 0-RTT connection establishment is | A transport protocol that provides 0-RTT connection establishment is | |||
qualitatively different from one that does not from the point of view | qualitatively different from one that does not provide 0-RTT from the | |||
of the application using it. Relative trade-offs between the cost of | point of view of the application using it. Relative trade-offs | |||
closing and reopening a connection and trying to keep it open are | between the cost of closing and reopening a connection and trying to | |||
different; see Section 3.2. | keep it open are different; see Section 3.2. | |||
An application needs to deliberately choose to use 0-RTT, as 0-RTT | An application needs to deliberately choose to use 0-RTT, as 0-RTT | |||
carries a risk of replay attack. Application protocols that use | carries a risk of replay attack. Application protocols that use | |||
0-RTT require a profile that describes the types of information that | 0-RTT require a profile that describes the types of information that | |||
can be safely sent. For HTTP, this profile is described in | can be safely sent. For HTTP, this profile is described in | |||
[HTTP-REPLAY]. | [HTTP-REPLAY]. | |||
3.1. Replay Attacks | 3.1. Replay Attacks | |||
Retransmission or (malicious) replay of data contained in 0-RTT | Retransmission or malicious replay of data contained in 0-RTT packets | |||
packets could cause the server side to receive multiple copies of the | could cause the server side to receive multiple copies of the same | |||
same data. | data. | |||
Application data sent by the client in 0-RTT packets could be | Application data sent by the client in 0-RTT packets could be | |||
processed more than once if it is replayed. Applications need to be | processed more than once if it is replayed. Applications need to be | |||
aware of what is safe to send in 0-RTT. Application protocols that | aware of what is safe to send in 0-RTT. Application protocols that | |||
seek to enable the use of 0-RTT need a careful analysis and a | seek to enable the use of 0-RTT need a careful analysis and a | |||
description of what can be sent in 0-RTT; see Section 5.6 of | description of what can be sent in 0-RTT; see Section 5.6 of | |||
[QUIC-TLS]. | [QUIC-TLS]. | |||
In some cases, it might be sufficient to limit application data sent | In some cases, it might be sufficient to limit application data sent | |||
in 0-RTT to that which only causes actions at a server that are known | in 0-RTT to data that does not cause actions with lasting effects at | |||
to be free of lasting effect. Initiating data retrieval or | a server. Initiating data retrieval or establishing configuration | |||
establishing configuration are examples of actions that could be | are examples of actions that could be safe. Idempotent operations -- | |||
safe. Idempotent operations - those for which repetition has the | those for which repetition has the same net effect as a single | |||
same net effect as a single operation - might be safe. However, it | operation -- might be safe. However, it is also possible to combine | |||
is also possible to combine individually idempotent operations into a | individually idempotent operations into a non-idempotent sequence of | |||
non-idempotent sequence of operations. | operations. | |||
Once a server accepts 0-RTT data there is no means of selectively | Once a server accepts 0-RTT data, there is no means of selectively | |||
discarding data that is received. However, protocols can define ways | discarding data that is received. However, protocols can define ways | |||
to reject individual actions that might be unsafe if replayed. | to reject individual actions that might be unsafe if replayed. | |||
Some TLS implementations and deployments might be able to provide | Some TLS implementations and deployments might be able to provide | |||
partial or even complete replay protection, which could be used to | partial or even complete replay protection, which could be used to | |||
manage replay risk. | manage replay risk. | |||
3.2. Session resumption versus Keep-alive | 3.2. Session Resumption versus Keep-Alive | |||
Because QUIC is encapsulated in UDP, applications using QUIC must | Because QUIC is encapsulated in UDP, applications using QUIC must | |||
deal with short network idle timeouts. Deployed stateful middleboxes | deal with short network idle timeouts. Deployed stateful middleboxes | |||
will generally establish state for UDP flows on the first packet | will generally establish state for UDP flows on the first packet sent | |||
sent, and keep state for much shorter idle periods than for TCP. | and keep state for much shorter idle periods than for TCP. [RFC5382] | |||
[RFC5382] suggests a TCP idle period of at least 124 minutes, though | suggests a TCP idle period of at least 124 minutes, though there is | |||
there is no evidence of widespread implementation of this guideline | no evidence of widespread implementation of this guideline in the | |||
in the literature. Short network timeout for UDP, however, is well- | literature. However, short network timeout for UDP is well- | |||
documented. According to a 2010 study ([Hatonen10]), UDP | documented. According to a 2010 study ([Hatonen10]), UDP | |||
applications can assume that any NAT binding or other state entry can | applications can assume that any NAT binding or other state entry can | |||
expire after just thirty seconds of inactivity. Section 3.5 of | expire after just thirty seconds of inactivity. Section 3.5 of | |||
[RFC8085] further discusses keep-alive intervals for UDP: it requires | [RFC8085] further discusses keep-alive intervals for UDP: it requires | |||
a minimum value of 15 seconds, but recommends larger values, or | that there is a minimum value of 15 seconds, but recommends larger | |||
omitting keep-alive entirely. | values, or that keep-alive is omitted entirely. | |||
By using a connection ID, QUIC is designed to be robust to NAT | By using a connection ID, QUIC is designed to be robust to NAT | |||
address rebinding after a timeout. However, this only helps if one | rebinding after a timeout. However, this only helps if one endpoint | |||
endpoint maintains availability at the address its peer uses, and the | maintains availability at the address its peer uses and the peer is | |||
peer is the one to send after the timeout occurs. | the one to send after the timeout occurs. | |||
Some QUIC connections might not be robust to NAT rebinding because | Some QUIC connections might not be robust to NAT rebinding because | |||
the routing infrastructure (in particular, load balancers) uses the | the routing infrastructure (in particular, load balancers) uses the | |||
address/port four-tuple to direct traffic. Furthermore, middleboxes | address/port 4-tuple to direct traffic. Furthermore, middleboxes | |||
with functions other than address translation could still affect the | with functions other than address translation could still affect the | |||
path. In particular, some firewalls do not admit server traffic for | path. In particular, some firewalls do not admit server traffic for | |||
which the firewall has no recent state for a corresponding packet | which the firewall has no recent state for a corresponding packet | |||
sent from the client. | sent from the client. | |||
QUIC applications can adjust idle periods to manage the risk of | QUIC applications can adjust idle periods to manage the risk of | |||
timeout. Idle periods and the network idle timeout are distinct from | timeout. Idle periods and the network idle timeout are distinct from | |||
the connection idle timeout, which is defined as the minimum of | the connection idle timeout, which is defined as the minimum of | |||
either endpoint's idle timeout parameter; see Section 10.1 of | either endpoint's idle timeout parameter; see Section 10.1 of [QUIC]. | |||
[QUIC]). There are three options: | There are three options: | |||
* Ignore the issue, if the application-layer protocol consists only | * Ignore the issue if the application-layer protocol consists only | |||
of interactions with no or very short idle periods, or the | of interactions with no or very short idle periods or if the | |||
protocol's resistance to NAT rebinding is sufficient. | protocol's resistance to NAT rebinding is sufficient. | |||
* Ensure there are no long idle periods. | * Ensure there are no long idle periods. | |||
* Resume the session after a long idle period, using 0-RTT | * Resume the session after a long idle period, using 0-RTT | |||
resumption when appropriate. | resumption when appropriate. | |||
The first strategy is the easiest, but it only applies to certain | The first strategy is the easiest, but it only applies to certain | |||
applications. | applications. | |||
Either the server or the client in a QUIC application can send PING | Either the server or the client in a QUIC application can send PING | |||
frames as keep-alives, to prevent the connection and any on-path | frames as keep-alives to prevent the connection and any on-path state | |||
state from timing out. Recommendations for the use of keep-alives | from timing out. Recommendations for the use of keep-alives are | |||
are application-specific, mainly depending on the latency | application specific, mainly depending on the latency requirements | |||
requirements and message frequency of the application. In this case, | and message frequency of the application. In this case, the | |||
the application mapping must specify whether the client or server is | application mapping must specify whether the client or server is | |||
responsible for keeping the application alive. While [Hatonen10] | responsible for keeping the application alive. While [Hatonen10] | |||
suggests that 30 seconds might be a suitable value for the public | suggests that 30 seconds might be a suitable value for the public | |||
Internet when a NAT is on path, larger values are preferable if the | Internet when a NAT is on path, larger values are preferable if the | |||
deployment can consistently survive NAT rebinding or is known to be | deployment can consistently survive NAT rebinding or is known to be | |||
in a controlled environment (e.g. data centres) in order to lower | in a controlled environment (e.g., data centers) in order to lower | |||
network and computational load. | network and computational load. | |||
Sending PING frames more frequently than every 30 seconds over long | Sending PING frames more frequently than every 30 seconds over long | |||
idle periods may result in excessive unproductive traffic in some | idle periods may result in excessive unproductive traffic in some | |||
situations, and unacceptable power usage for power-constrained | situations and unacceptable power usage for power-constrained | |||
(mobile) devices. Additionally, timeouts shorter than 30 seconds can | (mobile) devices. Additionally, timeouts shorter than 30 seconds can | |||
make it harder to handle transient network interruptions, such as VM | make it harder to handle transient network interruptions, such as | |||
migration or coverage loss during mobility. See [RFC8085], | Virtual Machine (VM) migration or coverage loss during mobility. See | |||
especially Section 3.5. | [RFC8085], especially Section 3.5. | |||
Alternatively, the client (but not the server) can use session | Alternatively, the client (but not the server) can use session | |||
resumption instead of sending keepalive traffic. In this case, a | resumption instead of sending keep-alive traffic. In this case, a | |||
client that wants to send data to a server over a connection that has | client that wants to send data to a server over a connection that has | |||
been idle longer than the server's idle timeout (available from the | been idle longer than the server's idle timeout (available from the | |||
idle_timeout transport parameter) can simply reconnect. When | idle_timeout transport parameter) can simply reconnect. When | |||
possible, this reconnection can use 0-RTT session resumption, | possible, this reconnection can use 0-RTT session resumption, | |||
reducing the latency involved with restarting the connection. Of | reducing the latency involved with restarting the connection. Of | |||
course, this approach is only valid in cases in which it is safe to | course, this approach is only valid in cases in which it is safe to | |||
use 0-RTT and when the client is the restarting peer. | use 0-RTT and when the client is the restarting peer. | |||
The tradeoffs between resumption and keep-alives need to be evaluated | The trade-offs between resumption and keep-alives need to be | |||
on a per-application basis. In general, applications should use | evaluated on a per-application basis. In general, applications | |||
keep-alives only in circumstances where continued communication is | should use keep-alives only in circumstances where continued | |||
highly likely; [QUIC-HTTP], for instance, recommends using keep- | communication is highly likely; [QUIC-HTTP], for instance, recommends | |||
alives only when a request is outstanding. | using keep-alives only when a request is outstanding. | |||
4. Use of Streams | 4. Use of Streams | |||
QUIC's stream multiplexing feature allows applications to run | QUIC's stream multiplexing feature allows applications to run | |||
multiple streams over a single connection, without head-of-line | multiple streams over a single connection without head-of-line | |||
blocking between streams. Stream data is carried within frames, | blocking between streams. Stream data is carried within frames where | |||
where one QUIC packet on the wire can carry one or multiple stream | one QUIC packet on the wire can carry one or multiple stream frames. | |||
frames. | ||||
Streams can be unidirectional or bidirectional, and a stream may be | Streams can be unidirectional or bidirectional, and a stream may be | |||
initiated either by client or server. Only the initiator of a | initiated either by client or server. Only the initiator of a | |||
unidirectional stream can send data on it. | unidirectional stream can send data on it. | |||
Streams and connections can each carry a maximum of 2^62-1 bytes in | Streams and connections can each carry a maximum of 2^62-1 bytes in | |||
each direction, due to encoding limitations on stream offsets and | each direction due to encoding limitations on stream offsets and | |||
connection flow control limits. In the presently unlikely event that | connection flow control limits. In the presently unlikely event that | |||
this limit is reached by an application, a new connection would need | this limit is reached by an application, a new connection would need | |||
to be established. | to be established. | |||
Streams can be independently opened and closed, gracefully or | Streams can be independently opened and closed, gracefully or | |||
abruptly. An application can gracefully close the egress direction | abruptly. An application can gracefully close the egress direction | |||
of a stream by instructing QUIC to send a FIN bit in a STREAM frame. | of a stream by instructing QUIC to send a FIN bit in a STREAM frame. | |||
It cannot gracefully close the ingress direction without a peer- | It cannot gracefully close the ingress direction without a peer- | |||
generated FIN, much like in TCP. However, an endpoint can abruptly | generated FIN, much like in TCP. However, an endpoint can abruptly | |||
close the egress direction or request that its peer abruptly close | close the egress direction or request that its peer abruptly close | |||
the ingress direction; these actions are fully independent of each | the ingress direction; these actions are fully independent of each | |||
other. | other. | |||
QUIC does not provide an interface for exceptional handling of any | QUIC does not provide an interface for exceptional handling of any | |||
stream. If a stream that is critical for an application is closed, | stream. If a stream that is critical for an application is closed, | |||
the application can generate error messages on the application layer | the application can generate error messages on the application layer | |||
to inform the other end and/or the higher layer, which can eventually | to inform the other end and/or the higher layer, which can eventually | |||
terminate the QUIC connection. | terminate the QUIC connection. | |||
Mapping of application data to streams is application-specific and | Mapping of application data to streams is application specific and | |||
described for HTTP/3 in [QUIC-HTTP]. There are a few general | described for HTTP/3 in [QUIC-HTTP]. There are a few general | |||
principles to apply when designing an application's use of streams: | principles to apply when designing an application's use of streams: | |||
* A single stream provides ordering. If the application requires | * A single stream provides ordering. If the application requires | |||
certain data to be received in order, that data should be sent on | certain data to be received in order, that data should be sent on | |||
the same stream. There is no guarantee of transmission, | the same stream. There is no guarantee of transmission, | |||
reception, or delivery order across streams. | reception, or delivery order across streams. | |||
* Multiple streams provide concurrency. Data that can be processed | * Multiple streams provide concurrency. Data that can be processed | |||
independently, and therefore would suffer from head of line | independently, and therefore would suffer from head-of-line | |||
blocking if forced to be received in order, should be transmitted | blocking if forced to be received in order, should be transmitted | |||
over separate streams. | over separate streams. | |||
* Streams can provide message orientation, and allow messages to be | * Streams can provide message orientation and allow messages to be | |||
cancelled. If one message is mapped to a single stream, resetting | canceled. If one message is mapped to a single stream, resetting | |||
the stream to expire an unacknowledged message can be used to | the stream to expire an unacknowledged message can be used to | |||
emulate partial reliability for that message. | emulate partial reliability for that message. | |||
If a QUIC receiver has opened the maximum allowed concurrent streams, | If a QUIC receiver has opened the maximum allowed concurrent streams, | |||
and the sender indicates that more streams are needed, it does not | and the sender indicates that more streams are needed, it does not | |||
automatically lead to an increase of the maximum number of streams by | automatically lead to an increase of the maximum number of streams by | |||
the receiver. Therefore, an application should consider the maximum | the receiver. Therefore, an application should consider the maximum | |||
number of allowed, currently open, and currently used streams when | number of allowed, currently open, and currently used streams when | |||
determining how to map data to streams. | determining how to map data to streams. | |||
QUIC assigns a numerical identifier to each stream, called the stream | QUIC assigns a numerical identifier, called the stream ID, to each | |||
ID. While the relationship between these identifiers and stream | stream. While the relationship between these identifiers and stream | |||
types is clearly defined in version 1 of QUIC, future versions might | types is clearly defined in version 1 of QUIC, future versions might | |||
change this relationship for various reasons. QUIC implementations | change this relationship for various reasons. QUIC implementations | |||
should expose the properties of each stream (which endpoint initiated | should expose the properties of each stream (which endpoint initiated | |||
the stream, whether the stream is unidirectional or bidirectional, | the stream, whether the stream is unidirectional or bidirectional, | |||
the stream ID used for the stream); applications should query for | the stream ID used for the stream); applications should query for | |||
these properties rather than attempting to infer them from the stream | these properties rather than attempting to infer them from the stream | |||
ID. | ID. | |||
The method of allocating stream identifiers to streams opened by the | The method of allocating stream identifiers to streams opened by the | |||
application might vary between transport implementations. Therefore, | application might vary between transport implementations. Therefore, | |||
an application should not assume a particular stream ID will be | an application should not assume a particular stream ID will be | |||
assigned to a stream that has not yet been allocated. For example, | assigned to a stream that has not yet been allocated. For example, | |||
HTTP/3 uses stream IDs to refer to streams that have already been | HTTP/3 uses stream IDs to refer to streams that have already been | |||
opened, but makes no assumptions about future stream IDs or the way | opened but makes no assumptions about future stream IDs or the way in | |||
in which they are assigned (see Section 6 of [QUIC-HTTP]). | which they are assigned (see Section 6 of [QUIC-HTTP]). | |||
4.1. Stream versus Flow Multiplexing | 4.1. Stream versus Flow Multiplexing | |||
Streams are meaningful only to the application; since stream | Streams are meaningful only to the application; since stream | |||
information is carried inside QUIC's encryption boundary, a given | information is carried inside QUIC's encryption boundary, a given | |||
packet exposes no information about which stream(s) are carried | packet exposes no information about which stream(s) are carried | |||
within the packet. Therefore, stream multiplexing is not intended to | within the packet. Therefore, stream multiplexing is not intended to | |||
be used for differentiating streams in terms of network treatment. | be used for differentiating streams in terms of network treatment. | |||
Application traffic requiring different network treatment should | Application traffic requiring different network treatment should | |||
therefore be carried over different five-tuples (i.e. multiple QUIC | therefore be carried over different 5-tuples (i.e., multiple QUIC | |||
connections). Given QUIC's ability to send application data in the | connections). Given QUIC's ability to send application data in the | |||
first RTT of a connection (if a previous connection to the same host | first RTT of a connection (if a previous connection to the same host | |||
has been successfully established to provide the necessary | has been successfully established to provide the necessary | |||
credentials), the cost of establishing another connection is | credentials), the cost of establishing another connection is | |||
extremely low. | extremely low. | |||
4.2. Prioritization | 4.2. Prioritization | |||
Stream prioritization is not exposed to either the network or the | Stream prioritization is not exposed to either the network or the | |||
receiver. Prioritization is managed by the sender, and the QUIC | receiver. Prioritization is managed by the sender, and the QUIC | |||
transport should provide an interface for applications to prioritize | transport should provide an interface for applications to prioritize | |||
streams [QUIC]. Applications can implement their own prioritization | streams [QUIC]. Applications can implement their own prioritization | |||
scheme on top of QUIC: an application protocol that runs on top of | scheme on top of QUIC: an application protocol that runs on top of | |||
QUIC can define explicit messages for signaling priority, such as | QUIC can define explicit messages for signaling priority, such as | |||
those defined in [I-D.draft-ietf-httpbis-priority] for HTTP; it can | those defined in [RFC9218] for HTTP. An application protocol can | |||
define rules that allow an endpoint to determine priority based on | define rules that allow an endpoint to determine priority based on | |||
context; or it can provide a higher level interface and leave the | context or can provide a higher-level interface and leave the | |||
determination to the application on top. | determination to the application on top. | |||
Priority handling of retransmissions can be implemented by the sender | Priority handling of retransmissions can be implemented by the sender | |||
in the transport layer. [QUIC] recommends retransmitting lost data | in the transport layer. [QUIC] recommends retransmitting lost data | |||
before new data, unless indicated differently by the application. | before new data, unless indicated differently by the application. | |||
When a QUIC endpoint uses fully reliable streams for transmission, | When a QUIC endpoint uses fully reliable streams for transmission, | |||
prioritization of retransmissions will be beneficial in most cases, | prioritization of retransmissions will be beneficial in most cases, | |||
filling in gaps and freeing up the flow control window. For | filling in gaps and freeing up the flow control window. For | |||
partially reliable or unreliable streams, priority scheduling of | partially reliable or unreliable streams, priority scheduling of | |||
retransmissions over data of higher-priority streams might not be | retransmissions over data of higher-priority streams might not be | |||
desirable. For such streams, QUIC could either provide an explicit | desirable. For such streams, QUIC could either provide an explicit | |||
interface to control prioritization, or derive the prioritization | interface to control prioritization or derive the prioritization | |||
decision from the reliability level of the stream. | decision from the reliability level of the stream. | |||
4.3. Ordered and Reliable Delivery | 4.3. Ordered and Reliable Delivery | |||
QUIC streams enable ordered and reliable delivery. Though it is | QUIC streams enable ordered and reliable delivery. Though it is | |||
possible for an implementation to provide options that use streams | possible for an implementation to provide options that use streams | |||
for partial reliability or out-of-order delivery, most | for partial reliability or out-of-order delivery, most | |||
implementations will assume that data is reliably delivered in order. | implementations will assume that data is reliably delivered in order. | |||
Under this assumption, an endpoint that receives stream data might | Under this assumption, an endpoint that receives stream data might | |||
skipping to change at page 10, line 7 ¶ | skipping to change at line 431 ¶ | |||
logic, an endpoint will send stream data until it is acknowledged, | logic, an endpoint will send stream data until it is acknowledged, | |||
ensuring that data at the start of the stream is sent and | ensuring that data at the start of the stream is sent and | |||
acknowledged first. | acknowledged first. | |||
An endpoint that uses a different sending behavior and does not | An endpoint that uses a different sending behavior and does not | |||
negotiate that change with its peer might encounter performance | negotiate that change with its peer might encounter performance | |||
issues or deadlocks. | issues or deadlocks. | |||
4.4. Flow Control Deadlocks | 4.4. Flow Control Deadlocks | |||
QUIC flow control Section 4 of [QUIC] provides a means of managing | QUIC flow control (Section 4 of [QUIC]) provides a means of managing | |||
access to the limited buffers endpoints have for incoming data. This | access to the limited buffers that endpoints have for incoming data. | |||
mechanism limits the amount of data that can be in buffers in | This mechanism limits the amount of data that can be in buffers in | |||
endpoints or in transit on the network. However, there are several | endpoints or in transit on the network. However, there are several | |||
ways in which limits can produce conditions that can cause a | ways in which limits can produce conditions that can cause a | |||
connection to either perform suboptimally or deadlock. | connection to either perform suboptimally or become deadlocked. | |||
Deadlocks in flow control are possible for any protocol that uses | Deadlocks in flow control are possible for any protocol that uses | |||
QUIC, though whether they become a problem depends on how | QUIC, though whether they become a problem depends on how | |||
implementations consume data and provide flow control credit. | implementations consume data and provide flow control credit. | |||
Understanding what causes deadlocking might help implementations | Understanding what causes deadlocking might help implementations | |||
avoid deadlocks. | avoid deadlocks. | |||
The size and rate of transport flow control credit updates can affect | The size and rate of updates to flow control credit can affect | |||
performance. Applications that use QUIC often have a data consumer | performance. Applications that use QUIC often have a data consumer | |||
that reads data from transport buffers. Some implementations might | that reads data from transport buffers. Some implementations might | |||
have independent transport-layer and application-layer receive | have independent receive buffers at the transport layer and | |||
buffers. Consuming data does not always imply it is immediately | application layer. Consuming data does not always imply it is | |||
processed. However, a common flow control implementation technique | immediately processed. However, a common implementation technique is | |||
is to extend credit to the sender, by emitting MAX_DATA and/or | to extend flow control credit to the sender by emitting MAX_DATA and/ | |||
MAX_STREAM_DATA frames, as data is consumed. Delivery of these | or MAX_STREAM_DATA frames as data is consumed. Delivery of these | |||
frames is affected by the latency of the back channel from the | frames is affected by the latency of the back channel from the | |||
receiver to the data sender. If credit is not extended in a timely | receiver to the data sender. If credit is not extended in a timely | |||
manner, the sending application can be blocked, effectively | manner, the sending application can be blocked, effectively | |||
throttling the sender. | throttling the sender. | |||
Large application messages can produce deadlocking if the recipient | Large application messages can produce deadlocking if the recipient | |||
does not read data from the transport incrementally. If the message | does not read data from the transport incrementally. If the message | |||
is larger than the flow control credit available and the recipient | is larger than the flow control credit available and the recipient | |||
does not release additional flow control credit until the entire | does not release additional flow control credit until the entire | |||
message is received and delivered, a deadlock can occur. This is | message is received and delivered, a deadlock can occur. This is | |||
skipping to change at page 11, line 5 ¶ | skipping to change at line 475 ¶ | |||
A length-prefixed message format makes it easier for a data consumer | A length-prefixed message format makes it easier for a data consumer | |||
to leave data unread in the transport buffer and thereby withhold | to leave data unread in the transport buffer and thereby withhold | |||
flow control credit. If flow control limits prevent the remainder of | flow control credit. If flow control limits prevent the remainder of | |||
a message from being sent, a deadlock will result. A length prefix | a message from being sent, a deadlock will result. A length prefix | |||
might also enable the detection of this sort of deadlock. Where | might also enable the detection of this sort of deadlock. Where | |||
application protocols have messages that might be processed as a | application protocols have messages that might be processed as a | |||
single unit, reserving flow control credit for the entire message | single unit, reserving flow control credit for the entire message | |||
atomically makes this style of deadlock less likely. | atomically makes this style of deadlock less likely. | |||
A data consumer can eagerly read all data as it becomes available, in | A data consumer can eagerly read all data as it becomes available in | |||
order to make the receiver extend flow control credit and reduce the | order to make the receiver extend flow control credit and reduce the | |||
chances of a deadlock. However, such a data consumer might need | chances of a deadlock. However, such a data consumer might need | |||
other means for holding a peer accountable for the additional state | other means for holding a peer accountable for the additional state | |||
it keeps for partially processed messages. | it keeps for partially processed messages. | |||
Deadlocking can also occur if data on different streams is | Deadlocking can also occur if data on different streams is | |||
interdependent. Suppose that data on one stream arrives before the | interdependent. Suppose that data on one stream arrives before the | |||
data on a second stream on which it depends. A deadlock can occur if | data on a second stream on which it depends. A deadlock can occur if | |||
the first stream is left unread, preventing the receiver from | the first stream is left unread, preventing the receiver from | |||
extending flow control credit for the second stream. To reduce the | extending flow control credit for the second stream. To reduce the | |||
likelihood of deadlock for interdependent data, the sender should | likelihood of deadlock for interdependent data, the sender should | |||
ensure that dependent data is not sent until the data it depends on | ensure that dependent data is not sent until the data it depends on | |||
has been accounted for in both stream- and connection- level flow | has been accounted for in both stream- and connection-level flow | |||
control credit. | control credit. | |||
Some deadlocking scenarios might be resolved by cancelling affected | Some deadlocking scenarios might be resolved by canceling affected | |||
streams with STOP_SENDING or RESET_STREAM. Cancelling some streams | streams with STOP_SENDING or RESET_STREAM. Canceling some streams | |||
results in the connection being terminated in some protocols. | results in the connection being terminated in some protocols. | |||
4.5. Stream Limit Commitments | 4.5. Stream Limit Commitments | |||
QUIC endpoints are responsible for communicating the cumulative limit | QUIC endpoints are responsible for communicating the cumulative limit | |||
of streams they would allow to be opened by their peer. Initial | of streams they would allow to be opened by their peer. Initial | |||
limits are advertised using the initial_max_streams_bidi and | limits are advertised using the initial_max_streams_bidi and | |||
initial_max_streams_uni transport parameters. As streams are opened | initial_max_streams_uni transport parameters. As streams are opened | |||
and closed they are consumed, and the cumulative total is | and closed, they are consumed, and the cumulative total is | |||
incremented. Limits can be increased using the MAX_STREAMS frame but | incremented. Limits can be increased using the MAX_STREAMS frame, | |||
there is no mechanism to reduce limits. Once stream limits are | but there is no mechanism to reduce limits. Once stream limits are | |||
reached, no more streams can be opened, which prevents applications | reached, no more streams can be opened, which prevents applications | |||
using QUIC from making further progress. At this stage connections | using QUIC from making further progress. At this stage, connections | |||
can be terminated via idle timeout or explicit close; see | can be terminated via idle timeout or explicit close; see Section 10. | |||
Section 10). | ||||
An application that uses QUIC and communicated a cumulative stream | An application that uses QUIC and communicates a cumulative stream | |||
limit might require the connection to be closed before the limit is | limit might require the connection to be closed before the limit is | |||
reached. For example, to stop the server to perform scheduled | reached, e.g., to stop the server in order to perform scheduled | |||
maintenance. Immediate connection close causes abrupt closure of | maintenance. Immediate connection close causes abrupt closure of | |||
actively used streams. Depending on how an application uses QUIC | actively used streams. Depending on how an application uses QUIC | |||
streams, this could be undesirable or detrimental to behavior or | streams, this could be undesirable or detrimental to behavior or | |||
performance. | performance. | |||
A more graceful closure technique is to stop sending increases to | A more graceful closure technique is to stop sending increases to | |||
stream limits and allow the connection to naturally terminate once | stream limits and allow the connection to naturally terminate once | |||
remaining streams are consumed. However, the period of time it takes | remaining streams are consumed. However, the period of time it takes | |||
to do so is dependent on the peer and an unpredictable closing period | to do so is dependent on the peer, and an unpredictable closing | |||
might not fit application or operational needs. Applications using | period might not fit application or operational needs. Applications | |||
QUIC can be conservative with open stream limits in order to reduce | using QUIC can be conservative with open stream limits in order to | |||
the commitment and indeterminism. However, being overly conservative | reduce the commitment and indeterminism. However, being overly | |||
with stream limits affects stream concurrency. Balancing these | conservative with stream limits affects stream concurrency. | |||
aspects can be specific to applications and their deployments. | Balancing these aspects can be specific to applications and their | |||
deployments. | ||||
Instead of relying on stream limits to avoid abrupt closure, an | Instead of relying on stream limits to avoid abrupt closure, an | |||
application-layer graceful close mechanism can be used to communicate | application layer's graceful close mechanism can be used to | |||
the intention to explicitly close the connection at some future | communicate the intention to explicitly close the connection at some | |||
point. HTTP/3 provides such a mechanism using the GOAWAY frame. In | future point. HTTP/3 provides such a mechanism using the GOAWAY | |||
HTTP/3, when the GOAWAY frame is received by a client, it stops | frame. In HTTP/3, when the GOAWAY frame is received by a client, it | |||
opening new streams even if the cumulative stream limit would allow. | stops opening new streams even if the cumulative stream limit would | |||
Instead, the client would create a new connection on which to open | allow. Instead, the client would create a new connection on which to | |||
further streams. Once all streams are closed on the old connection, | open further streams. Once all streams are closed on the old | |||
it can be terminated safely by a connection close or after expiration | connection, it can be terminated safely by a connection close or | |||
of the idle time out (see also Section 10). | after expiration of the idle timeout (see Section 10). | |||
5. Packetization and Latency | 5. Packetization and Latency | |||
QUIC exposes an interface that provides multiple streams to the | QUIC exposes an interface that provides multiple streams to the | |||
application; however, the application usually cannot control how data | application; however, the application usually cannot control how data | |||
transmitted over those streams is mapped into frames or how those | transmitted over those streams is mapped into frames or how those | |||
frames are bundled into packets. | frames are bundled into packets. | |||
By default, many implementations will try to maximally pack QUIC | By default, many implementations will try to pack STREAM frames from | |||
packets DATA frames from one or more streams to minimize bandwidth | one or more streams into each QUIC packet, in order to minimize | |||
consumption and computational costs (see Section 13 of [QUIC]). If | bandwidth consumption and computational costs (see Section 13 of | |||
there is not enough data available to fill a packet, an | [QUIC]). If there is not enough data available to fill a packet, an | |||
implementation might wait for a short time, to optimize bandwidth | implementation might wait for a short time to optimize bandwidth | |||
efficiency instead of latency. This delay can either be pre- | efficiency instead of latency. This delay can either be | |||
configured or dynamically adjusted based on the observed sending | preconfigured or dynamically adjusted based on the observed sending | |||
pattern of the application. | pattern of the application. | |||
If the application requires low latency, with only small chunks of | If the application requires low latency, with only small chunks of | |||
data to send, it may be valuable to indicate to QUIC that all data | data to send, it may be valuable to indicate to QUIC that all data | |||
should be sent out immediately. Alternatively, if the application | should be sent out immediately. Alternatively, if the application | |||
expects to use a specific sending pattern, it can also provide a | expects to use a specific sending pattern, it can also provide a | |||
suggested delay to QUIC for how long to wait before bundle frames | suggested delay to QUIC for how long to wait before bundling frames | |||
into a packet. | into a packet. | |||
Similarly, an application has usually no control about the length of | Similarly, an application usually has no control over the length of a | |||
a QUIC packet on the wire. QUIC provides the ability to add a | QUIC packet on the wire. QUIC provides the ability to add a PADDING | |||
PADDING frame to arbitrarily increase the size of packets. Padding | frame to arbitrarily increase the size of packets. Padding is used | |||
is used by QUIC to ensure that the path is capable of transferring | by QUIC to ensure that the path is capable of transferring datagrams | |||
datagrams of at least a certain size, during the handshake (see | of at least a certain size during the handshake (see Sections 8.1 and | |||
Sections 8.1 and 14.1 of [QUIC]) and for path validation after | 14.1 of [QUIC]) and for path validation after connection migration | |||
connection migration (see Section 8.2 of [QUIC]) as well as for | (see Section 8.2 of [QUIC]) as well as for Datagram Packetization | |||
Datagram Packetization Layer PMTU Discovery (DPLMTUD) (see | Layer PMTU Discovery (DPLPMTUD) (see Section 14.3 of [QUIC]). | |||
Section 14.3 of [QUIC]). | ||||
Padding can also be used by an application to reduce leakage of | Padding can also be used by an application to reduce leakage of | |||
information about the data that is sent. A QUIC implementation can | information about the data that is sent. A QUIC implementation can | |||
expose an interface that allows an application layer to specify how | expose an interface that allows an application layer to specify how | |||
to apply padding. | to apply padding. | |||
6. Error Handling | 6. Error Handling | |||
QUIC recommends that endpoints signal any detected errors to the | QUIC recommends that endpoints signal any detected errors to the | |||
peer. Errors can occur at the transport level and the application | peer. Errors can occur at the transport layer and the application | |||
level. Transport errors, such as a protocol violation, affect the | layer. Transport errors, such as a protocol violation, affect the | |||
entire connection. Applications that use QUIC can define their own | entire connection. Applications that use QUIC can define their own | |||
error detection and signaling (see, for example, Section 8 of | error detection and signaling (see, for example, Section 8 of | |||
[QUIC-HTTP]). Application errors can affect an entire connection or | [QUIC-HTTP]). Application errors can affect an entire connection or | |||
a single stream. | a single stream. | |||
QUIC defines an error code space that is used for error handling at | QUIC defines an error code space that is used for error handling at | |||
the transport layer. QUIC encourages endpoints to use the most | the transport layer. QUIC encourages endpoints to use the most | |||
specific code, although any applicable code is permitted, including | specific code, although any applicable code is permitted, including | |||
generic ones. | generic ones. | |||
Applications using QUIC define an error code space that is | Applications using QUIC define an error code space that is | |||
independent of QUIC or other applications (see, for example, | independent of QUIC or other applications (see, for example, | |||
Section 8.1 of [QUIC-HTTP]). The values in an application error code | Section 8.1 of [QUIC-HTTP]). The values in an application error code | |||
space can be reused across connection-level and stream-level errors. | space can be reused across connection-level and stream-level errors. | |||
Connection errors lead to connection termination. They are signaled | Connection errors lead to connection termination. They are signaled | |||
using a CONNECTION_CLOSE frame, which contains an error code and a | using a CONNECTION_CLOSE frame, which contains an error code and a | |||
reason field that can be zero length. Different types of | reason field that can be zero length. Different types of | |||
CONNECTION_CLOSE frame are used to signal transport and application | CONNECTION_CLOSE frames are used to signal transport and application | |||
errors. | errors. | |||
Stream errors lead to stream termination. These are signaled using | Stream errors lead to stream termination. These are signaled using | |||
STOP_SENDING or RESET_STREAM frames, which contain only an error | STOP_SENDING or RESET_STREAM frames, which contain only an error | |||
code. | code. | |||
7. Acknowledgment Efficiency | 7. Acknowledgment Efficiency | |||
QUIC version 1 without extensions uses an acknowledgment strategy | QUIC version 1 without extensions uses an acknowledgment strategy | |||
adopted from TCP (see Section 13.2 of [QUIC]). That is, it | adopted from TCP (see Section 13.2 of [QUIC]). That is, it | |||
recommends every other packet is acknowledged. However, generating | recommends that every other packet is acknowledged. However, | |||
and processing QUIC acknowledgments consumes resources at a sender | generating and processing QUIC acknowledgments consumes resources at | |||
and receiver. Acknowledgments also incur forwarding costs and | a sender and receiver. Acknowledgments also incur forwarding costs | |||
contribute to link utilization, which can impact performance over | and contribute to link utilization, which can impact performance over | |||
some types of network. Applications might be able to improve overall | some types of network. Applications might be able to improve overall | |||
performance by using alternative strategies that reduce the rate of | performance by using alternative strategies that reduce the rate of | |||
acknowledgments. [I-D.ietf-quic-ack-frequency] describes an | acknowledgments. [QUIC-ACK-FREQUENCY] describes an extension to | |||
extension to signal the desired delay of acknowledgments and | signal the desired delay of acknowledgments and discusses use cases | |||
discusses use cases as well as implications for congestion control | as well as implications for congestion control and recovery. | |||
and recovery. | ||||
8. Port Selection and Application Endpoint Discovery | 8. Port Selection and Application Endpoint Discovery | |||
In general, port numbers serve two purposes: "first, they provide a | In general, port numbers serve two purposes: "first, they provide a | |||
demultiplexing identifier to differentiate transport sessions between | demultiplexing identifier to differentiate transport sessions between | |||
the same pair of endpoints, and second, they may also identify the | the same pair of endpoints, and second, they may also identify the | |||
application protocol and associated service to which processes | application protocol and associated service to which processes | |||
connect" [RFC6335]. The assumption that an application can be | connect" (Section 3 of [RFC6335]). The assumption that an | |||
identified in the network based on the port number is less true today | application can be identified in the network based on the port number | |||
due to encapsulation and mechanisms for dynamic port assignments, as | is less true today due to encapsulation and mechanisms for dynamic | |||
also noted in [RFC6335]. | port assignments, as noted in [RFC6335]. | |||
As QUIC is a general-purpose transport protocol, there are no | As QUIC is a general-purpose transport protocol, there are no | |||
requirements that servers use a particular UDP port for QUIC. For | requirements that servers use a particular UDP port for QUIC. For an | |||
applications with a fallback to TCP that do not already have an | application with a fallback to TCP that does not already have an | |||
alternate mapping to UDP, usually the registration (if necessary) and | alternate mapping to UDP, it is usually appropriate to register (if | |||
use of the UDP port number corresponding to the TCP port already | necessary) and use the UDP port number corresponding to the TCP port | |||
registered for the application is appropriate. For example, the | already registered for the application. For example, the default | |||
default port for HTTP/3 [QUIC-HTTP] is UDP port 443, analogous to | port for HTTP/3 [QUIC-HTTP] is UDP port 443, analogous to HTTP/1.1 or | |||
HTTP/1.1 or HTTP/2 over TLS over TCP. | HTTP/2 over TLS over TCP. | |||
Given the prevalence of the assumption in network management practice | Given the prevalence of the assumption in network management practice | |||
that a port number maps unambiguously to an application, the use of | that a port number maps unambiguously to an application, the use of | |||
ports that cannot easily be mapped to a registered service name might | ports that cannot easily be mapped to a registered service name might | |||
lead to blocking or other changes to the forwarding behavior by | lead to blocking or other changes to the forwarding behavior by | |||
network elements such as firewalls that use the port number for | network elements such as firewalls that use the port number for | |||
application identification. | application identification. | |||
Applications could define an alternate endpoint discovery mechanism | Applications could define an alternate endpoint discovery mechanism | |||
to allow the usage of ports other than the default. For example, | to allow the usage of ports other than the default. For example, | |||
HTTP/3 (Sections 3.2 and 3.3 of [QUIC-HTTP]) specifies the use of | HTTP/3 (Sections 3.2 and 3.3 of [QUIC-HTTP]) specifies the use of | |||
HTTP Alternative Services [RFC7838] for an HTTP origin to advertise | HTTP Alternative Services [RFC7838] for an HTTP origin to advertise | |||
the availability of an equivalent HTTP/3 endpoint on a certain UDP | the availability of an equivalent HTTP/3 endpoint on a certain UDP | |||
port by using the "h3" Application-Layer Protocol Negotiation (ALPN) | port by using "h3" as the Application-Layer Protocol Negotiation | |||
[RFC7301] token. | (ALPN) [RFC7301] token. | |||
ALPN permits the client and server to negotiate which of several | ALPN permits the client and server to negotiate which of several | |||
protocols will be used on a given connection. Therefore, multiple | protocols will be used on a given connection. Therefore, multiple | |||
applications might be supported on a single UDP port based on the | applications might be supported on a single UDP port based on the | |||
ALPN token offered. Applications using QUIC are required to register | ALPN token offered. Applications using QUIC are required to register | |||
an ALPN token for use in the TLS handshake. | an ALPN token for use in the TLS handshake. | |||
As QUIC version 1 deferred defining a complete version negotiation | As QUIC version 1 deferred defining a complete version negotiation | |||
mechanism, HTTP/3 requires QUIC version 1 and defines the ALPN token | mechanism, HTTP/3 requires QUIC version 1 and defines the ALPN token | |||
("h3") to only apply to that version. So far no single approach has | ("h3") to only apply to that version. So far, no single approach has | |||
been selected for managing the use of different QUIC versions, | been selected for managing the use of different QUIC versions, | |||
neither in HTTP/3 nor in general. Application protocols that use | neither in HTTP/3 nor in general. Application protocols that use | |||
QUIC need to consider how the protocol will manage different QUIC | QUIC need to consider how the protocol will manage different QUIC | |||
versions. Decisions for those protocols might be informed by choices | versions. Decisions for those protocols might be informed by choices | |||
made by other protocols, like HTTP/3. | made by other protocols, like HTTP/3. | |||
8.1. Source Port Selection | 8.1. Source Port Selection | |||
Some UDP protocols are vulnerable to reflection attacks, where an | Some UDP protocols are vulnerable to reflection attacks, where an | |||
attacker is able to direct traffic to a third party as a denial of | attacker is able to direct traffic to a third party as a denial of | |||
skipping to change at page 15, line 24 ¶ | skipping to change at line 685 ¶ | |||
to server misconfiguration: | to server misconfiguration: | |||
* port 53 - DNS [RFC1034] | * port 53 - DNS [RFC1034] | |||
* port 123 - NTP [RFC5905] | * port 123 - NTP [RFC5905] | |||
* port 1900 - SSDP [SSDP] | * port 1900 - SSDP [SSDP] | |||
* port 5353 - mDNS [RFC6762] | * port 5353 - mDNS [RFC6762] | |||
* port 11211 - memcached | * port 11211 - memcache | |||
Services might block source ports associated with protocols known to | Services might block source ports associated with protocols known to | |||
be vulnerable to reflection attacks, to avoid the overhead of | be vulnerable to reflection attacks to avoid the overhead of | |||
processing large numbers of packets. However, this practice has | processing large numbers of packets. However, this practice has | |||
negative effects on clients: not only does it require establishment | negative effects on clients -- not only does it require establishment | |||
of a new connection, but in some instances, might cause the client to | of a new connection but in some instances might cause the client to | |||
avoid using QUIC for that service for a period of time, downgrading | avoid using QUIC for that service for a period of time and downgrade | |||
to a non-UDP protocol (see Section 2). | to a non-UDP protocol (see Section 2). | |||
As a result, client implementations are encouraged to avoid using | As a result, client implementations are encouraged to avoid using | |||
source ports associated with protocols known to be vulnerable to | source ports associated with protocols known to be vulnerable to | |||
reflection attacks. Note that following the general guidance for | reflection attacks. Note that following the general guidance for | |||
client implementations given in [RFC6335], to use ephemeral ports in | client implementations given in [RFC6335], to use ephemeral ports in | |||
the range 49152-65535, has the effect of avoiding these ports. Note | the range 49152-65535, has the effect of avoiding these ports. Note | |||
that other source ports might be reflection vectors as well. | that other source ports might be reflection vectors as well. | |||
9. Connection Migration | 9. Connection Migration | |||
QUIC supports connection migration by the client. If the client's IP | QUIC supports connection migration by the client. If the client's IP | |||
address changes, a QUIC endpoint can still associate packets with an | address changes, a QUIC endpoint can still associate packets with an | |||
existing transport connection using the Destination Connection ID | existing transport connection using the Destination Connection ID | |||
field (see also Section 11) in the QUIC header. This supports cases | field (see Section 11) in the QUIC header. This supports cases where | |||
where address information changes, such as NAT rebinding, intentional | the address information changes, such as NAT rebinding, the | |||
change of the local interface, the expiration of a temporary IPv6 | intentional change of the local interface, the expiration of a | |||
address [RFC8981], or the server indicating a preferred address | temporary IPv6 address [RFC8981], or the indication from the server | |||
Section 9.6 of [QUIC]. | of a preferred address (Section 9.6 of [QUIC]). | |||
Use of a non-zero-length connection ID for the server is strongly | Use of a non-zero-length connection ID for the server is strongly | |||
recommended if any clients are behind a NAT or could be. A non-zero- | recommended if any clients are or could be behind a NAT. A non-zero- | |||
length connection ID is also strongly recommended when active | length connection ID is also strongly recommended when active | |||
migration is supported. If a connection is intentionally migrated to | migration is supported. If a connection is intentionally migrated to | |||
new path, a new connection ID is used to minimize linkability by | a new path, a new connection ID is used to minimize linkability by | |||
network observers. The other QUIC endpoint uses the connection ID to | network observers. The other QUIC endpoint uses the connection ID to | |||
link different addresses to the same connection and entity if a non- | link different addresses to the same connection and entity if a non- | |||
zero-length connection ID is provided. | zero-length connection ID is provided. | |||
The base specification of QUIC version 1 only supports the use of a | The base specification of QUIC version 1 only supports the use of a | |||
single network path at a time, which enables failover use cases. | single network path at a time, which enables failover use cases. | |||
Path validation is required so that endpoints validate paths before | Path validation is required so that endpoints validate paths before | |||
use to avoid address spoofing attacks. Path validation takes at | use to avoid address spoofing attacks. Path validation takes at | |||
least one RTT and congestion control will also be reset after path | least one RTT, and congestion control will also be reset after path | |||
migration. Therefore, migration usually has a performance impact. | migration. Therefore, migration usually has a performance impact. | |||
QUIC probing packets, which can be sent on multiple paths at once, | QUIC probing packets, which can be sent on multiple paths at once, | |||
are used to perform address validation as well as measure path | are used to perform address validation as well as measure path | |||
characteristics. Probing packets cannot carry application data but | characteristics. Probing packets cannot carry application data but | |||
likely contain padding frames. Endpoints can use information about | likely contain padding frames. Endpoints can use information about | |||
their receipt as input to congestion control for that path. | their receipt as input to congestion control for that path. | |||
Applications could use information learned from probing to inform a | Applications could use information learned from probing to inform a | |||
decision to switch paths. | decision to switch paths. | |||
Only the client can actively migrate in version 1 of QUIC. However, | Only the client can actively migrate in version 1 of QUIC. However, | |||
servers can indicate during the handshake that they prefer to | servers can indicate during the handshake that they prefer to | |||
transfer the connection to a different address after the handshake. | transfer the connection to a different address after the handshake. | |||
For instance, this could be used to move from an address that is | For instance, this could be used to move from an address that is | |||
shared by multiple servers to an address that is unique to the server | shared by multiple servers to an address that is unique to the server | |||
instance. The server can provide an IPv4 and an IPv6 address in a | instance. The server can provide an IPv4 and an IPv6 address in a | |||
transport parameter during the TLS handshake and the client can | transport parameter during the TLS handshake, and the client can | |||
select between the two if both are provided. See also Section 9.6 of | select between the two if both are provided. See Section 9.6 of | |||
[QUIC]. | [QUIC]. | |||
10. Connection Termination | 10. Connection Termination | |||
QUIC connections are terminated in one of three ways: implicit idle | QUIC connections are terminated in one of three ways: implicit idle | |||
timeout, explicit immediate close, or explicit stateless reset. | timeout, explicit immediate close, or explicit stateless reset. | |||
QUIC does not provide any mechanism for graceful connection | QUIC does not provide any mechanism for graceful connection | |||
termination; applications using QUIC can define their own graceful | termination; applications using QUIC can define their own graceful | |||
termination process (see, for example, Section 5.2 of [QUIC-HTTP]). | termination process (see, for example, Section 5.2 of [QUIC-HTTP]). | |||
QUIC idle timeout is enabled via transport parameters. Client and | QUIC idle timeout is enabled via transport parameters. The client | |||
server announce a timeout period and the effective value for the | and server announce a timeout period, and the effective value for the | |||
connection is the minimum of the two values. After the timeout | connection is the minimum of the two values. After the timeout | |||
period elapses, the connection is silently closed. An application | period elapses, the connection is silently closed. An application | |||
therefore should be able to configure its own maximum value, as well | therefore should be able to configure its own maximum value, as well | |||
as have access to the computed minimum value for this connection. An | as have access to the computed minimum value for this connection. An | |||
application may adjust the maximum idle timeout for new connections | application may adjust the maximum idle timeout for new connections | |||
based on the number of open or expected connections, since shorter | based on the number of open or expected connections since shorter | |||
timeout values may free-up resources more quickly. | timeout values may free up resources more quickly. | |||
Application data exchanged on streams or in datagrams defers the QUIC | Application data exchanged on streams or in datagrams defers the QUIC | |||
idle timeout. Applications that provide their own keep-alive | idle timeout. Applications that provide their own keep-alive | |||
mechanisms will therefore keep a QUIC connection alive. Applications | mechanisms will therefore keep a QUIC connection alive. Applications | |||
that do not provide their own keep-alive can use transport-layer | that do not provide their own keep-alive can use transport-layer | |||
mechanisms (see Section 10.1.2 of [QUIC], and Section 3.2). However, | mechanisms (see Section 10.1.2 of [QUIC] and Section 3.2). However, | |||
QUIC implementation interfaces for controlling such transport | QUIC implementation interfaces for controlling such transport | |||
behavior can vary, affecting the robustness of such approaches. | behavior can vary, affecting the robustness of such approaches. | |||
An immediate close is signaled by a CONNECTION_CLOSE frame (see | An immediate close is signaled by a CONNECTION_CLOSE frame (see | |||
Section 6). Immediate close causes all streams to become immediately | Section 6). Immediate close causes all streams to become immediately | |||
closed, which may affect applications; see Section 4.5. | closed, which may affect applications; see Section 4.5. | |||
A stateless reset is an option of last resort for an endpoint that | A stateless reset is an option of last resort for an endpoint that | |||
does not have access to connection state. Receiving a stateless | does not have access to connection state. Receiving a stateless | |||
reset is an indication of an unrecoverable error distinct from | reset is an indication of an unrecoverable error distinct from | |||
connection errors in that there is no application-layer information | connection errors in that there is no application-layer information | |||
provided. | provided. | |||
11. Information Exposure and the Connection ID | 11. Information Exposure and the Connection ID | |||
QUIC exposes some information to the network in the unencrypted part | QUIC exposes some information to the network in the unencrypted part | |||
of the header, either before the encryption context is established or | of the header either before the encryption context is established or | |||
because the information is intended to be used by the network. For | because the information is intended to be used by the network. For | |||
more information on manageability of QUIC see also | more information on manageability of QUIC, see [QUIC-MANAGEABILITY]. | |||
[I-D.ietf-quic-manageability]. QUIC has a long header that exposes | QUIC has a long header that exposes some additional information (the | |||
some additional information (the version and the source connection | version and the source connection ID), while the short header exposes | |||
ID), while the short header exposes only the destination connection | only the destination connection ID. In QUIC version 1, the long | |||
ID. In QUIC version 1, the long header is used during connection | header is used during connection establishment, while the short | |||
establishment, while the short header is used for data transmission | header is used for data transmission in an established connection. | |||
in an established connection. | ||||
The connection ID can be zero length. Zero length connection IDs can | The connection ID can be zero length. Zero-length connection IDs can | |||
be chosen on each endpoint individually, on any packet except the | be chosen on each endpoint individually and on any packet except the | |||
first packets sent by clients during connection establishment. | first packets sent by clients during connection establishment. | |||
An endpoint that selects a zero-length connection ID will receive | An endpoint that selects a zero-length connection ID will receive | |||
packets with a zero-length destination connection ID. The endpoint | packets with a zero-length destination connection ID. The endpoint | |||
needs to use other information, such as the source and destination IP | needs to use other information, such as the source and destination IP | |||
address and port number to identify which connection is referred to. | address and port number to identify which connection is referred to. | |||
This could mean that the endpoint is unable to match datagrams to | This could mean that the endpoint is unable to match datagrams to | |||
connections successfully if these values change, making the | connections successfully if these values change, making the | |||
connection effectively unable to survive NAT rebinding or migrate to | connection effectively unable to survive NAT rebinding or migrate to | |||
a new path. | a new path. | |||
11.1. Server-Generated Connection ID | 11.1. Server-Generated Connection ID | |||
QUIC supports a server-generated connection ID, transmitted to the | QUIC supports a server-generated connection ID that is transmitted to | |||
client during connection establishment (see Section 7.2 of [QUIC]). | the client during connection establishment (see Section 7.2 of | |||
Servers behind load balancers may need to change the connection ID | [QUIC]). Servers behind load balancers may need to change the | |||
during the handshake, encoding the identity of the server or | connection ID during the handshake, encoding the identity of the | |||
information about its load balancing pool, in order to support | server or information about its load balancing pool, in order to | |||
stateless load balancing. | support stateless load balancing. | |||
Server deployments with load balancers and other routing | Server deployments with load balancers and other routing | |||
infrastructure need to ensure that this infrastructure consistently | infrastructure need to ensure that this infrastructure consistently | |||
routes packets to the server instance that has the connection state, | routes packets to the server instance that has the connection state, | |||
even if addresses, ports, and/or connection IDs change. This might | even if addresses, ports, or connection IDs change. This might | |||
require coordination between servers and infrastructure. One method | require coordination between servers and infrastructure. One method | |||
of achieving this involves encoding routing information into the | of achieving this involves encoding routing information into the | |||
connection ID. For an example of this technique, see [QUIC-LB]. | connection ID. For an example of this technique, see [QUIC-LB]. | |||
11.2. Mitigating Timing Linkability with Connection ID Migration | 11.2. Mitigating Timing Linkability with Connection ID Migration | |||
If QUIC endpoints do not issue fresh connection IDs, then clients | If QUIC endpoints do not issue fresh connection IDs, then clients | |||
cannot reduce the linkability of address migration by using them. | cannot reduce the linkability of address migration by using them. | |||
Choosing values that are unlinkable to an outside observer ensures | Choosing values that are unlinkable to an outside observer ensures | |||
that activity on different paths cannot be trivially correlated using | that activity on different paths cannot be trivially correlated using | |||
the connection ID. | the connection ID. | |||
While sufficiently robust connection ID generation schemes will | While sufficiently robust connection ID generation schemes will | |||
mitigate linkability issues, they do not provide full protection. | mitigate linkability issues, they do not provide full protection. | |||
Analysis of the lifetimes of six-tuples (source and destination | Analysis of the lifetimes of 6-tuples (source and destination | |||
addresses as well as the migrated CID) may expose these links anyway. | addresses as well as the migrated Connection ID) may expose these | |||
links anyway. | ||||
In the case where connection migration in a server pool is rare, it | In the case where connection migration in a server pool is rare, it | |||
is trivial for an observer to associate two connection IDs. | is trivial for an observer to associate two connection IDs. | |||
Conversely, in the opposite limit where every server handles multiple | Conversely, where every server handles multiple simultaneous | |||
simultaneous migrations, even an exposed server mapping may be | migrations, even an exposed server mapping may be insufficient | |||
insufficient information. | information. | |||
The most efficient mitigations for these attacks are through network | The most efficient mitigations for these attacks are through network | |||
design and/or operational practice, by using a load balancing | design and/or operational practices, by using a load-balancing | |||
architecture that loads more flows onto a single server-side address, | architecture that loads more flows onto a single server-side address, | |||
by coordinating the timing of migrations in an attempt to increase | by coordinating the timing of migrations in an attempt to increase | |||
the number of simultaneous migrations at a given time, or through | the number of simultaneous migrations at a given time, or by using | |||
other means. | other means. | |||
11.3. Using Server Retry for Redirection | 11.3. Using Server Retry for Redirection | |||
QUIC provides a Retry packet that can be sent by a server in response | QUIC provides a Retry packet that can be sent by a server in response | |||
to the client Initial packet. The server may choose a new connection | to the client Initial packet. The server may choose a new connection | |||
ID in that packet and the client will retry by sending another client | ID in that packet, and the client will retry by sending another | |||
Initial packet with the server-selected connection ID. This | client Initial packet with the server-selected connection ID. This | |||
mechanism can be used to redirect a connection to a different server, | mechanism can be used to redirect a connection to a different server, | |||
e.g., due to performance reasons or when servers in a server pool are | e.g., due to performance reasons or when servers in a server pool are | |||
upgraded gradually, and therefore may support different versions of | upgraded gradually and therefore may support different versions of | |||
QUIC. | QUIC. | |||
In this case, it is assumed that all servers belonging to a certain | In this case, it is assumed that all servers belonging to a certain | |||
pool are served in cooperation with load balancers that forward the | pool are served in cooperation with load balancers that forward the | |||
traffic based on the connection ID. A server can choose the | traffic based on the connection ID. A server can choose the | |||
connection ID in the Retry packet such that the load balancer will | connection ID in the Retry packet such that the load balancer will | |||
redirect the next Initial packet to a different server in that pool. | redirect the next Initial packet to a different server in that pool. | |||
Alternatively the load balancer can directly offer a Retry offload as | Alternatively, the load balancer can directly offer a Retry offload | |||
further described in [QUIC-RETRY]. | as further described in [QUIC-RETRY]. | |||
Section 4 of [RFC5077] describes an example approach for constructing | The approach described in Section 4 of [RFC5077] for constructing TLS | |||
TLS resumption tickets that can be also applied for validation | resumption tickets provides an example that can be also applied to | |||
tokens, however, the use of more modern cryptographic algorithms is | validation tokens. However, the use of more modern cryptographic | |||
highly recommended. | algorithms is highly recommended. | |||
12. Quality of Service (QoS) and DSCP | 12. Quality of Service (QoS) and Diffserv Code Point (DSCP) | |||
QUIC, as defined in [QUIC], has a single congestion controller and | QUIC, as defined in [QUIC], has a single congestion controller and | |||
recovery handler. This design assumes that all packets of a QUIC | recovery handler. This design assumes that all packets of a QUIC | |||
connection, or at least with the same 5-tuple {dest addr, source | connection, or at least with the same 5-tuple {dest addr, source | |||
addr, protocol, dest port, source port}, that have the same DiffServ | addr, protocol, dest port, source port}, that have the same Diffserv | |||
Code Point (DSCP) [RFC2475] will receive similar network treatment | Code Point (DSCP) [RFC2475] will receive similar network treatment | |||
since feedback about loss or delay of each packet is used as input to | since feedback about loss or delay of each packet is used as input to | |||
the congestion controller. Therefore, packets belonging to the same | the congestion controller. Therefore, packets belonging to the same | |||
connection should use a single DSCP. Section 5.1 of [RFC7657] | connection should use a single DSCP. Section 5.1 of [RFC7657] | |||
provides a discussion of DiffServ interactions with datagram | provides a discussion of Diffserv interactions with datagram | |||
transport protocols [RFC7657] (in this respect the interactions with | transport protocols [RFC7657] (in this respect, the interactions with | |||
QUIC resemble those of SCTP). | QUIC resemble those of Stream Control Transmission Protocol (SCTP)). | |||
When multiplexing multiple flows over a single QUIC connection, the | When multiplexing multiple flows over a single QUIC connection, the | |||
selected DSCP value should be the one associated with the highest | selected DSCP value should be the one associated with the highest | |||
priority requested for all multiplexed flows. | priority requested for all multiplexed flows. | |||
If differential network treatment is desired, e.g., by the use of | If differential network treatment is desired, e.g., by the use of | |||
different DSCPs, multiple QUIC connections to the same server may be | different DSCPs, multiple QUIC connections to the same server may be | |||
used. However, in general it is recommended to minimize the number | used. In general, it is recommended to minimize the number of QUIC | |||
of QUIC connections to the same server, to avoid increased overhead | connections to the same server to avoid increased overhead and, more | |||
and, more importantly, competing congestion control. | importantly, competing congestion control. | |||
As in other uses of DiffServ, when a packet enters a network segment | As in other uses of Diffserv, when a packet enters a network segment | |||
that does not support the DSCP value, this could result in the | that does not support the DSCP value, this could result in the | |||
connection not receiving the network treatment it expects. The DSCP | connection not receiving the network treatment it expects. The DSCP | |||
value in this packet could also be remarked as the packet travels | value in this packet could also be remarked as the packet travels | |||
along the network path, changing the requested treatment. | along the network path, changing the requested treatment. | |||
13. Use of Versions and Cryptographic Handshake | 13. Use of Versions and Cryptographic Handshake | |||
Versioning in QUIC may change the protocol's behavior completely, | Versioning in QUIC may change the protocol's behavior completely, | |||
except for the meaning of a few header fields that have been declared | except for the meaning of a few header fields that have been declared | |||
to be invariant [QUIC-INVARIANTS]. A version of QUIC with a higher | to be invariant [QUIC-INVARIANTS]. A version of QUIC with a higher | |||
version number will not necessarily provide a better service, but | version number will not necessarily provide a better service but | |||
might simply provide a different feature set. As such, an | might simply provide a different feature set. As such, an | |||
application needs to be able to select which versions of QUIC it | application needs to be able to select which versions of QUIC it | |||
wants to use. | wants to use. | |||
A new version could use an encryption scheme other than TLS 1.3 or | A new version could use an encryption scheme other than TLS 1.3 or | |||
higher. [QUIC] specifies requirements for the cryptographic | higher. [QUIC] specifies requirements for the cryptographic | |||
handshake as currently realized by TLS 1.3 and described in a | handshake as currently realized by TLS 1.3 and described in a | |||
separate specification [QUIC-TLS]. This split is performed to enable | separate specification [QUIC-TLS]. This split is performed to enable | |||
light-weight versioning with different cryptographic handshakes. | lightweight versioning with different cryptographic handshakes. | |||
The QUIC Versions Registry established in [QUIC] allows for | The "QUIC Versions" registry established in [QUIC] allows for | |||
provisional registrations for experimentation. Registration, also of | provisional registrations for experimentation. Registration, also of | |||
experimental versions, is important to avoid collision. Experimental | experimental versions, is important to avoid collision. Experimental | |||
versions should not be used long-term or registered as permanent to | versions should not be used long-term or registered as permanent to | |||
minimize the risk of fingerprinting based on the version number. | minimize the risk of fingerprinting based on the version number. | |||
14. Enabling Deployment of New Versions | 14. Enabling Deployment of New Versions | |||
QUIC version 1 does not specify a version negotiation mechanism in | QUIC version 1 does not specify a version negotiation mechanism in | |||
the base specification, but [I-D.draft-ietf-quic-version-negotiation] | the base specification, but [QUIC-VERSION-NEGOTIATION] proposes an | |||
proposes an extension that provides compatible version negotiation. | extension that provides compatible version negotiation. | |||
This approach uses a three-stage deployment mechanism, enabling | This approach uses a three-stage deployment mechanism, enabling | |||
progressive rollout and experimentation with multiple versions across | progressive rollout and experimentation with multiple versions across | |||
a large server deployment. In this approach, all servers in the | a large server deployment. In this approach, all servers in the | |||
deployment must accept connections using a new version (stage 1) | deployment must accept connections using a new version (stage 1) | |||
before any server advertises it (stage 2), and authentication of the | before any server advertises it (stage 2), and authentication of the | |||
new version (stage 3) only proceeds after advertising of that version | new version (stage 3) only proceeds after advertising of that version | |||
is completely deployed. | is completely deployed. | |||
See Section 5 of [I-D.draft-ietf-quic-version-negotiation] for | See Section 5 of [QUIC-VERSION-NEGOTIATION] for details. | |||
details. | ||||
15. Unreliable Datagram Service over QUIC | 15. Unreliable Datagram Service over QUIC | |||
[RFC9221] specifies a QUIC extension to enable sending and receiving | [RFC9221] specifies a QUIC extension to enable sending and receiving | |||
unreliable datagrams over QUIC. Unlike operating directly over UDP, | unreliable datagrams over QUIC. Unlike operating directly over UDP, | |||
applications that use the QUIC datagram service do not need to | applications that use the QUIC datagram service do not need to | |||
implement their own congestion control, per [RFC8085], as QUIC | implement their own congestion control, per [RFC8085], as QUIC | |||
datagrams are congestion controlled. | datagrams are congestion controlled. | |||
QUIC datagrams are not flow-controlled, and as such data chunks may | QUIC datagrams are not flow controlled, and as such data chunks may | |||
be dropped if the receiver is overloaded. While the reliable | be dropped if the receiver is overloaded. While the reliable | |||
transmission service of QUIC provides a stream-based interface to | transmission service of QUIC provides a stream-based interface to | |||
send and receive data in order over multiple QUIC streams, the | send and receive data in order over multiple QUIC streams, the | |||
datagram service has an unordered message-based interface. If | datagram service has an unordered message-based interface. If | |||
needed, an application layer framing can be used on top to allow | needed, an application-layer framing can be used on top to allow | |||
separate flows of unreliable datagrams to be multiplexed on one QUIC | separate flows of unreliable datagrams to be multiplexed on one QUIC | |||
connection. | connection. | |||
16. IANA Considerations | 16. IANA Considerations | |||
This document has no actions for IANA; however, note that Section 8 | This document has no actions for IANA; however, note that Section 8 | |||
recommends that application bindings to QUIC for applications using | recommends that an application that has already registered a TCP port | |||
TCP register UDP ports analogous to their existing TCP registrations. | but wants to specify QUIC as a transport should register a UDP port | |||
analogous to their existing TCP registration. | ||||
17. Security Considerations | 17. Security Considerations | |||
See the security considerations in [QUIC] and [QUIC-TLS]; the | See the security considerations in [QUIC] and [QUIC-TLS]; the | |||
security considerations for the underlying transport protocol are | security considerations for the underlying transport protocol are | |||
relevant for applications using QUIC, as well. Considerations on | relevant for applications using QUIC. Considerations on linkability, | |||
linkability, replay attacks, and randomness discussed in [QUIC-TLS] | replay attacks, and randomness discussed in [QUIC-TLS] should be | |||
should be taken into account when deploying and using QUIC. | taken into account when deploying and using QUIC. | |||
Further, migration to a new address exposes a linkage between client | Further, migration to a new address exposes a linkage between client | |||
addresses to the server and may expose this linkage also to the path | addresses to the server and may expose this linkage also to the path | |||
if the connection ID cannot be changed or flows can otherwise be | if the connection ID cannot be changed or flows can otherwise be | |||
correlated. When migration is supported, this needs to be considered | correlated. When migration is supported, this needs to be considered | |||
with respective to user privacy. | with respective to user privacy. | |||
Application developers should note that any fallback they use when | Application developers should note that any fallback they use when | |||
QUIC cannot be used due to network blocking of UDP should guarantee | QUIC cannot be used due to network blocking of UDP should guarantee | |||
the same security properties as QUIC; if this is not possible, the | the same security properties as QUIC. If this is not possible, the | |||
connection should fail to allow the application to explicitly handle | connection should fail to allow the application to explicitly handle | |||
fallback to a less-secure alternative. See Section 2. | fallback to a less-secure alternative. See Section 2. | |||
Further, [QUIC-HTTP] provides security considerations specific to | Further, [QUIC-HTTP] provides security considerations specific to | |||
HTTP. However, discussions such as on cross-protocol attacks, | HTTP. However, discussions such as on cross-protocol attacks, | |||
traffic analysis and padding, or migration might be relevant for | traffic analysis and padding, or migration might be relevant for | |||
other applications using QUIC as well. | other applications using QUIC as well. | |||
18. Contributors | 18. References | |||
The following people have contributed significant text to and/or | ||||
feedback on this document: | ||||
* Gorry Fairhurst | ||||
* Ian Swett | ||||
* Igor Lubashev | ||||
* Lucas Pardue | ||||
* Mike Bishop | ||||
* Mark Nottingham | ||||
* Martin Duke | ||||
* Martin Thomson | ||||
* Sean Turner | ||||
* Tommy Pauly | ||||
19. Acknowledgments | ||||
Special thanks to last-call reviewers Chris Lonvick and Ines Robles. | ||||
This work was partially supported by the European Commission under | ||||
Horizon 2020 grant agreement no. 688421 Measurement and Architecture | ||||
for a Middleboxed Internet (MAMI), and by the Swiss State Secretariat | ||||
for Education, Research, and Innovation under contract no. 15.0268. | ||||
This support does not imply endorsement. | ||||
20. References | ||||
20.1. Normative References | 18.1. Normative References | |||
[QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] 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>. | |||
[QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
RFC 8999, DOI 10.17487/RFC8999, May 2021, | RFC 8999, DOI 10.17487/RFC8999, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8999>. | <https://www.rfc-editor.org/info/rfc8999>. | |||
[QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | |||
QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | |||
<https://www.rfc-editor.org/rfc/rfc9001>. | <https://www.rfc-editor.org/info/rfc9001>. | |||
20.2. Informative References | 18.2. Informative References | |||
[Edeline16] | [Edeline16] | |||
Edeline, K., Kuehlewind, M., Trammell, B., Aben, E., and | Edeline, K., Kühlewind, M., Trammell, B., Aben, E., and B. | |||
B. Donnet, "Using UDP for Internet Transport Evolution | Donnet, "Using UDP for Internet Transport Evolution", | |||
(arXiv preprint 1612.07816)", 22 December 2016, | DOI 10.48550/arXiv.1612.07816, 22 December 2016, | |||
<https://arxiv.org/abs/1612.07816>. | <https://arxiv.org/abs/1612.07816>. | |||
[Hatonen10] | [Hatonen10] | |||
Hatonen, S., Nyrhinen, A., Eggert, L., Strowes, S., | Hätönen, S., Nyrhinen, A., Eggert, L., Strowes, S., | |||
Sarolahti, P., and M. Kojo, "An experimental study of home | Sarolahti, P., and M. Kojo, "An Experimental Study of Home | |||
gateway characteristics (Proc. ACM IMC 2010)", October | Gateway Characteristics", Proc. ACM IMC 2010, November | |||
2010. | 2010, <https://conferences.sigcomm.org/imc/2010/papers/ | |||
p260.pdf>. | ||||
[HTTP-REPLAY] | [HTTP-REPLAY] | |||
Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
2018, <https://www.rfc-editor.org/rfc/rfc8470>. | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
[I-D.draft-ietf-httpbis-priority] | ||||
Oku, K. and L. Pardue, "Extensible Prioritization Scheme | ||||
for HTTP", Work in Progress, Internet-Draft, draft-ietf- | ||||
httpbis-priority-12, 17 January 2022, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
priority-12>. | ||||
[I-D.draft-ietf-quic-version-negotiation] | [PaaschNanog] | |||
Schinazi, D. and E. Rescorla, "Compatible Version | Paasch, C., "Network support for TCP Fast Open", NANOG 67 | |||
Negotiation for QUIC", Work in Progress, Internet-Draft, | Presentation, 13 June 2016, | |||
draft-ietf-quic-version-negotiation-09, 11 July 2022, | <https://www.nanog.org/sites/default/files/ | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | Paasch_Network_Support.pdf>. | |||
version-negotiation-09>. | ||||
[I-D.ietf-quic-ack-frequency] | [QUIC-ACK-FREQUENCY] | |||
Iyengar, J. and I. Swett, "QUIC Acknowledgement | Iyengar, J. and I. Swett, "QUIC Acknowledgement | |||
Frequency", Work in Progress, Internet-Draft, draft-ietf- | Frequency", Work in Progress, Internet-Draft, draft-ietf- | |||
quic-ack-frequency-02, 11 July 2022, | quic-ack-frequency-02, 11 July 2022, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
ack-frequency-02>. | ack-frequency-02>. | |||
[I-D.ietf-quic-manageability] | ||||
Kuehlewind, M. and B. Trammell, "Manageability of the QUIC | ||||
Transport Protocol", Work in Progress, Internet-Draft, | ||||
draft-ietf-quic-manageability-17, 11 July 2022, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
manageability-17>. | ||||
[I-D.ietf-taps-arch] | ||||
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., and | ||||
C. Perkins, "An Architecture for Transport Services", Work | ||||
in Progress, Internet-Draft, draft-ietf-taps-arch-13, 27 | ||||
June 2022, <https://datatracker.ietf.org/doc/html/draft- | ||||
ietf-taps-arch-13>. | ||||
[PaaschNanog] | ||||
Paasch, C., "Network Support for TCP Fast Open (NANOG 67 | ||||
presentation)", 13 June 2016, | ||||
<https://www.nanog.org/sites/default/files/ | ||||
Paasch_Network_Support.pdf>. | ||||
[QUIC-HTTP] | [QUIC-HTTP] | |||
Bishop, M., "HTTP/3", Work in Progress, Internet-Draft, | Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | |||
draft-ietf-quic-http-34, 2 February 2021, | June 2022, <https://www.rfc-editor.org/info/rfc9114>. | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
http-34>. | ||||
[QUIC-LB] Duke, M., Banks, N., and C. Huitema, "QUIC-LB: Generating | [QUIC-LB] Duke, M., Banks, N., and C. Huitema, "QUIC-LB: Generating | |||
Routable QUIC Connection IDs", Work in Progress, Internet- | Routable QUIC Connection IDs", Work in Progress, Internet- | |||
Draft, draft-ietf-quic-load-balancers-14, 11 July 2022, | Draft, draft-ietf-quic-load-balancers-14, 11 July 2022, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | |||
load-balancers-14>. | load-balancers-14>. | |||
[QUIC-MANAGEABILITY] | ||||
Kühlewind, M. and B. Trammell, "Manageability of the QUIC | ||||
Transport Protocol", RFC 9312, DOI 10.17487/RFC9312, | ||||
September 2022, <https://www.rfc-editor.org/info/rfc9312>. | ||||
[QUIC-RETRY] | [QUIC-RETRY] | |||
Duke, M. and N. Banks, "QUIC Retry Offload", Work in | Duke, M. and N. Banks, "QUIC Retry Offload", Work in | |||
Progress, Internet-Draft, draft-duke-quic-retry-offload- | Progress, Internet-Draft, draft-ietf-quic-retry-offload- | |||
00, 28 March 2022, <https://datatracker.ietf.org/doc/html/ | 00, 25 May 2022, <https://datatracker.ietf.org/doc/html/ | |||
draft-duke-quic-retry-offload-00>. | draft-ietf-quic-retry-offload-00>. | |||
[QUIC-VERSION-NEGOTIATION] | ||||
Schinazi, D. and E. Rescorla, "Compatible Version | ||||
Negotiation for QUIC", Work in Progress, Internet-Draft, | ||||
draft-ietf-quic-version-negotiation-09, 11 July 2022, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
version-negotiation-09>. | ||||
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | |||
STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | |||
<https://www.rfc-editor.org/rfc/rfc1034>. | <https://www.rfc-editor.org/info/rfc1034>. | |||
[RFC2475] Blake, S., Black, D., Carlson, M., Davies, E., Wang, Z., | [RFC2475] Blake, S., Black, D., Carlson, M., Davies, E., Wang, Z., | |||
and W. Weiss, "An Architecture for Differentiated | and W. Weiss, "An Architecture for Differentiated | |||
Services", RFC 2475, DOI 10.17487/RFC2475, December 1998, | Services", RFC 2475, DOI 10.17487/RFC2475, December 1998, | |||
<https://www.rfc-editor.org/rfc/rfc2475>. | <https://www.rfc-editor.org/info/rfc2475>. | |||
[RFC5077] Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, | [RFC5077] Salowey, J., Zhou, H., Eronen, P., and H. Tschofenig, | |||
"Transport Layer Security (TLS) Session Resumption without | "Transport Layer Security (TLS) Session Resumption without | |||
Server-Side State", RFC 5077, DOI 10.17487/RFC5077, | Server-Side State", RFC 5077, DOI 10.17487/RFC5077, | |||
January 2008, <https://www.rfc-editor.org/rfc/rfc5077>. | January 2008, <https://www.rfc-editor.org/info/rfc5077>. | |||
[RFC5382] Guha, S., Ed., Biswas, K., Ford, B., Sivakumar, S., and P. | [RFC5382] Guha, S., Ed., Biswas, K., Ford, B., Sivakumar, S., and P. | |||
Srisuresh, "NAT Behavioral Requirements for TCP", BCP 142, | Srisuresh, "NAT Behavioral Requirements for TCP", BCP 142, | |||
RFC 5382, DOI 10.17487/RFC5382, October 2008, | RFC 5382, DOI 10.17487/RFC5382, October 2008, | |||
<https://www.rfc-editor.org/rfc/rfc5382>. | <https://www.rfc-editor.org/info/rfc5382>. | |||
[RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | |||
"Network Time Protocol Version 4: Protocol and Algorithms | "Network Time Protocol Version 4: Protocol and Algorithms | |||
Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | |||
<https://www.rfc-editor.org/rfc/rfc5905>. | <https://www.rfc-editor.org/info/rfc5905>. | |||
[RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. | [RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. | |||
Cheshire, "Internet Assigned Numbers Authority (IANA) | Cheshire, "Internet Assigned Numbers Authority (IANA) | |||
Procedures for the Management of the Service Name and | Procedures for the Management of the Service Name and | |||
Transport Protocol Port Number Registry", BCP 165, | Transport Protocol Port Number Registry", BCP 165, | |||
RFC 6335, DOI 10.17487/RFC6335, August 2011, | RFC 6335, DOI 10.17487/RFC6335, August 2011, | |||
<https://www.rfc-editor.org/rfc/rfc6335>. | <https://www.rfc-editor.org/info/rfc6335>. | |||
[RFC6762] Cheshire, S. and M. Krochmal, "Multicast DNS", RFC 6762, | [RFC6762] Cheshire, S. and M. Krochmal, "Multicast DNS", RFC 6762, | |||
DOI 10.17487/RFC6762, February 2013, | DOI 10.17487/RFC6762, February 2013, | |||
<https://www.rfc-editor.org/rfc/rfc6762>. | <https://www.rfc-editor.org/info/rfc6762>. | |||
[RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
"Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
July 2014, <https://www.rfc-editor.org/rfc/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
[RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | |||
Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | |||
<https://www.rfc-editor.org/rfc/rfc7413>. | <https://www.rfc-editor.org/info/rfc7413>. | |||
[RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services | [RFC7657] Black, D., Ed. and P. Jones, "Differentiated Services | |||
(Diffserv) and Real-Time Communication", RFC 7657, | (Diffserv) and Real-Time Communication", RFC 7657, | |||
DOI 10.17487/RFC7657, November 2015, | DOI 10.17487/RFC7657, November 2015, | |||
<https://www.rfc-editor.org/rfc/rfc7657>. | <https://www.rfc-editor.org/info/rfc7657>. | |||
[RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [RFC7838] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
April 2016, <https://www.rfc-editor.org/rfc/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | |||
Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | |||
March 2017, <https://www.rfc-editor.org/rfc/rfc8085>. | March 2017, <https://www.rfc-editor.org/info/rfc8085>. | |||
[RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, | [RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, | |||
"Temporary Address Extensions for Stateless Address | "Temporary Address Extensions for Stateless Address | |||
Autoconfiguration in IPv6", RFC 8981, | Autoconfiguration in IPv6", RFC 8981, | |||
DOI 10.17487/RFC8981, February 2021, | DOI 10.17487/RFC8981, February 2021, | |||
<https://www.rfc-editor.org/rfc/rfc8981>. | <https://www.rfc-editor.org/info/rfc8981>. | |||
[RFC9218] Oku, K. and L. Pardue, "Extensible Prioritization Scheme | ||||
for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022, | ||||
<https://www.rfc-editor.org/info/rfc9218>. | ||||
[RFC9221] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | [RFC9221] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | |||
Datagram Extension to QUIC", RFC 9221, | Datagram Extension to QUIC", RFC 9221, | |||
DOI 10.17487/RFC9221, March 2022, | DOI 10.17487/RFC9221, March 2022, | |||
<https://www.rfc-editor.org/rfc/rfc9221>. | <https://www.rfc-editor.org/info/rfc9221>. | |||
[SSDP] Donoho, A., Roe, B., Bodlaender, M., Gildred, J., Messer, | [SSDP] Donoho, A., Roe, B., Bodlaender, M., Gildred, J., Messer, | |||
A., Kim, Y., Fairman, B., and J. Tourzan, "UPnP Device | A., Kim, Y., Fairman, B., and J. Tourzan, "UPnP Device | |||
Architecture 2.0", 17 April 2020, | Architecture 2.0", 17 April 2020, | |||
<https://openconnectivity.org/upnp-specs/UPnP-arch- | <https://openconnectivity.org/upnp-specs/UPnP-arch- | |||
DeviceArchitecture-v2.0-20200417.pdf>. | DeviceArchitecture-v2.0-20200417.pdf>. | |||
[Swett16] Swett, I., "QUIC Deployment Experience at Google (IETF96 | [Swett16] Swett, I., "QUIC Deployment Experience @Google", IETF96 | |||
QUIC BoF presentation)", 20 July 2016, | QUIC BoF Presentation, 20 July 2016, | |||
<https://www.ietf.org/proceedings/96/slides/slides-96- | <https://www.ietf.org/proceedings/96/slides/slides-96- | |||
quic-3.pdf>. | quic-3.pdf>. | |||
[TAPS-ARCH] | ||||
Pauly, T., Trammell, B., Brunstrom, A., Fairhurst, G., and | ||||
C. Perkins, "An Architecture for Transport Services", Work | ||||
in Progress, Internet-Draft, draft-ietf-taps-arch-13, 27 | ||||
June 2022, <https://datatracker.ietf.org/doc/html/draft- | ||||
ietf-taps-arch-13>. | ||||
[TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] 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>. | |||
[Trammell16] | [Trammell16] | |||
Trammell, B. and M. Kuehlewind, "Internet Path | Trammell, B. and M. Kühlewind, "Internet Path Transparency | |||
Transparency Measurements using RIPE Atlas (RIPE72 MAT | Measurements using RIPE Atlas", RIPE 72 MAT Presentation, | |||
presentation)", 25 May 2016, <https://ripe72.ripe.net/wp- | 25 May 2016, <https://ripe72.ripe.net/wp-content/uploads/ | |||
content/uploads/presentations/86-atlas-udpdiff.pdf>. | presentations/86-atlas-udpdiff.pdf>. | |||
Acknowledgments | ||||
Special thanks to Last Call reviewers Chris Lonvick and Ines Robles. | ||||
This work was partially supported by the European Commission under | ||||
Horizon 2020 grant agreement no. 688421 Measurement and Architecture | ||||
for a Middleboxed Internet (MAMI) and by the Swiss State Secretariat | ||||
for Education, Research, and Innovation under contract no. 15.0268. | ||||
This support does not imply endorsement. | ||||
Contributors | ||||
The following people have contributed significant text to or feedback | ||||
on this document: | ||||
Gorry Fairhurst | ||||
Ian Swett | ||||
Igor Lubashev | ||||
Lucas Pardue | ||||
Mike Bishop | ||||
Mark Nottingham | ||||
Martin Duke | ||||
Martin Thomson | ||||
Sean Turner | ||||
Tommy Pauly | ||||
Authors' Addresses | Authors' Addresses | |||
Mirja Kuehlewind | Mirja Kühlewind | |||
Ericsson | Ericsson | |||
Email: mirja.kuehlewind@ericsson.com | Email: mirja.kuehlewind@ericsson.com | |||
Brian Trammell | Brian Trammell | |||
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 | |||
End of changes. 144 change blocks. | ||||
422 lines changed or deleted | 411 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |