| 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. | ||||