| draft-ietf-quic-transport-01.txt | draft-ietf-quic-transport-02.txt | |||
|---|---|---|---|---|
| QUIC J. Iyengar, Ed. | QUIC J. Iyengar, Ed. | |||
| Internet-Draft Google | Internet-Draft Google | |||
| Intended status: Standards Track M. Thomson, Ed. | Intended status: Standards Track M. Thomson, Ed. | |||
| Expires: July 18, 2017 Mozilla | Expires: September 14, 2017 Mozilla | |||
| January 14, 2017 | March 13, 2017 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-01 | draft-ietf-quic-transport-02 | |||
| Abstract | Abstract | |||
| QUIC is a multiplexed and secure transport protocol that runs on top | This document defines the core of the QUIC transport protocol. This | |||
| of UDP. QUIC builds on past transport experience, and implements | document describes connection establishment, packet format, | |||
| mechanisms that make it useful as a modern general-purpose transport | multiplexing and reliability. Accompanying documents describe the | |||
| protocol. Using UDP as the basis of QUIC is intended to address | cryptographic handshake and loss detection. | |||
| compatibility issues with legacy clients and middleboxes. QUIC | ||||
| authenticates all of its headers, preventing third parties from | ||||
| changing them. QUIC encrypts most of its headers, thereby limiting | ||||
| protocol evolution to QUIC endpoints only. Therefore, middleboxes, | ||||
| in large part, are not required to be updated as new protocol | ||||
| versions are deployed. This document describes the core QUIC | ||||
| protocol, including the conceptual design, wire format, and | ||||
| mechanisms of the QUIC protocol for connection establishment, stream | ||||
| multiplexing, stream and connection-level flow control, and data | ||||
| reliability. Accompanying documents describe QUIC's loss recovery | ||||
| and congestion control, and the use of TLS 1.3 for key negotiation. | ||||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic . | https://mailarchive.ietf.org/arch/search/?email_list=quic . | |||
| Working Group information can be found at https://github.com/quicwg ; | Working Group information can be found at https://github.com/quicwg ; | |||
| source code and issues list for this draft can be found at | source code and issues list for this draft can be found at | |||
| https://github.com/quicwg/base-drafts/labels/transport . | https://github.com/quicwg/base-drafts/labels/transport . | |||
| skipping to change at page 2, line 10 ¶ | skipping to change at page 1, line 44 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on July 18, 2017. | This Internet-Draft will expire on September 14, 2017. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2017 IETF Trust and the persons identified as the | Copyright (c) 2017 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 | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 33 ¶ | skipping to change at page 2, line 26 ¶ | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 | 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 | |||
| 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 5 | 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3.1. Low-Latency Connection Establishment . . . . . . . . . . 5 | 3.1. Low-Latency Connection Establishment . . . . . . . . . . 6 | |||
| 3.2. Stream Multiplexing . . . . . . . . . . . . . . . . . . . 6 | 3.2. Stream Multiplexing . . . . . . . . . . . . . . . . . . . 6 | |||
| 3.3. Rich Signaling for Congestion Control and Loss Recovery . 6 | 3.3. Rich Signaling for Congestion Control and Loss Recovery . 6 | |||
| 3.4. Stream and Connection Flow Control . . . . . . . . . . . 6 | 3.4. Stream and Connection Flow Control . . . . . . . . . . . 6 | |||
| 3.5. Authenticated and Encrypted Header and Payload . . . . . 7 | 3.5. Authenticated and Encrypted Header and Payload . . . . . 7 | |||
| 3.6. Connection Migration and Resilience to NAT Rebinding . . 7 | 3.6. Connection Migration and Resilience to NAT Rebinding . . 7 | |||
| 3.7. Version Negotiation . . . . . . . . . . . . . . . . . . . 7 | 3.7. Version Negotiation . . . . . . . . . . . . . . . . . . . 8 | |||
| 4. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | |||
| 5.1. Common Header . . . . . . . . . . . . . . . . . . . . . . 8 | 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 5.1.1. Identifying Packet Types . . . . . . . . . . . . . . 10 | 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.1.2. Handling Packets from Different Versions . . . . . . 10 | 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 12 | |||
| 5.2. Regular Packets . . . . . . . . . . . . . . . . . . . . . 11 | 5.4. Cleartext Packets . . . . . . . . . . . . . . . . . . . . 13 | |||
| 5.2.1. Packet Number Compression and Reconstruction . . . . 12 | 5.5. Encrypted Packets . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.2.2. Frames and Frame Types . . . . . . . . . . . . . . . 13 | 5.6. Public Reset Packet . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 14 | 5.6.1. Public Reset Proof . . . . . . . . . . . . . . . . . 15 | |||
| 5.4. Public Reset Packet . . . . . . . . . . . . . . . . . . . 15 | 5.7. Connection ID . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 6. Life of a Connection . . . . . . . . . . . . . . . . . . . . 15 | 5.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 6.1. Version Negotiation . . . . . . . . . . . . . . . . . . . 15 | 5.8.1. Initial Packet Number . . . . . . . . . . . . . . . . 17 | |||
| 6.2. Crypto and Transport Handshake . . . . . . . . . . . . . 16 | 5.9. Handling Packets from Different Versions . . . . . . . . 17 | |||
| 6.2.1. Transport Parameters and Options . . . . . . . . . . 16 | 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 18 | |||
| 6.2.2. Proof of Source Address Ownership . . . . . . . . . . 17 | 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 19 | |||
| 6.2.3. Crypto Handshake Protocol Features . . . . . . . . . 18 | 7.1. Version Negotiation . . . . . . . . . . . . . . . . . . . 19 | |||
| 6.2.4. Version Negotiation Validation . . . . . . . . . . . 19 | 7.1.1. Using Reserved Versions . . . . . . . . . . . . . . . 20 | |||
| 6.3. Connection Migration . . . . . . . . . . . . . . . . . . 19 | 7.2. Cryptographic and Transport Handshake . . . . . . . . . . 21 | |||
| 6.4. Connection Termination . . . . . . . . . . . . . . . . . 19 | 7.3. Transport Parameters . . . . . . . . . . . . . . . . . . 22 | |||
| 7. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 20 | 7.3.1. Transport Parameter Definitions . . . . . . . . . . . 24 | |||
| 7.1. STREAM Frame . . . . . . . . . . . . . . . . . . . . . . 21 | 7.3.2. Values of Transport Parameters for 0-RTT . . . . . . 24 | |||
| 7.2. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 22 | 7.3.3. New Transport Parameters . . . . . . . . . . . . . . 25 | |||
| 7.2.1. Ack Block Section . . . . . . . . . . . . . . . . . . 24 | 7.3.4. Version Negotiation Validation . . . . . . . . . . . 25 | |||
| 7.2.2. Timestamp Section . . . . . . . . . . . . . . . . . . 25 | 7.4. Proof of Source Address Ownership . . . . . . . . . . . . 27 | |||
| 7.3. STOP_WAITING Frame . . . . . . . . . . . . . . . . . . . 26 | 7.4.1. Client Address Validation Procedure . . . . . . . . . 27 | |||
| 7.4. WINDOW_UPDATE Frame . . . . . . . . . . . . . . . . . . . 27 | 7.4.2. Address Validation on Session Resumption . . . . . . 28 | |||
| 7.5. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 27 | 7.4.3. Address Validation Token Integrity . . . . . . . . . 29 | |||
| 7.6. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 28 | 7.5. Connection Migration . . . . . . . . . . . . . . . . . . 29 | |||
| 7.7. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 28 | 7.6. Connection Termination . . . . . . . . . . . . . . . . . 30 | |||
| 7.8. PING frame . . . . . . . . . . . . . . . . . . . . . . . 29 | 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.9. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 29 | 8.1. STREAM Frame . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.10. GOAWAY Frame . . . . . . . . . . . . . . . . . . . . . . 29 | 8.2. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 8. Packetization and Reliability . . . . . . . . . . . . . . . . 30 | 8.2.1. ACK Block Section . . . . . . . . . . . . . . . . . . 34 | |||
| 9. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 32 | 8.2.2. Timestamp Section . . . . . . . . . . . . . . . . . . 35 | |||
| 9.1. Life of a Stream . . . . . . . . . . . . . . . . . . . . 32 | 8.2.3. ACK Frames and Packet Protection . . . . . . . . . . 37 | |||
| 9.1.1. idle . . . . . . . . . . . . . . . . . . . . . . . . 34 | 8.3. WINDOW_UPDATE Frame . . . . . . . . . . . . . . . . . . . 38 | |||
| 9.1.2. reserved . . . . . . . . . . . . . . . . . . . . . . 34 | 8.4. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 9.1.3. open . . . . . . . . . . . . . . . . . . . . . . . . 35 | 8.5. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 39 | |||
| 9.1.4. half-closed (local) . . . . . . . . . . . . . . . . . 35 | 8.6. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 9.1.5. half-closed (remote) . . . . . . . . . . . . . . . . 35 | 8.7. PING frame . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 9.1.6. closed . . . . . . . . . . . . . . . . . . . . . . . 36 | 8.8. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 40 | |||
| 9.2. Stream Identifiers . . . . . . . . . . . . . . . . . . . 37 | 8.9. GOAWAY Frame . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 9.3. Stream Concurrency . . . . . . . . . . . . . . . . . . . 37 | 9. Packetization and Reliability . . . . . . . . . . . . . . . . 42 | |||
| 9.4. Sending and Receiving Data . . . . . . . . . . . . . . . 37 | 9.1. Special Considerations for PMTU Discovery . . . . . . . . 44 | |||
| 10. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 38 | 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 45 | |||
| 10.1. Edge Cases and Other Considerations . . . . . . . . . . 39 | 10.1. Life of a Stream . . . . . . . . . . . . . . . . . . . . 45 | |||
| 10.1.1. Mid-stream RST_STREAM . . . . . . . . . . . . . . . 39 | 10.1.1. idle . . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.1.2. Response to a RST_STREAM . . . . . . . . . . . . . . 40 | 10.1.2. open . . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 10.1.3. Offset Increment . . . . . . . . . . . . . . . . . . 40 | 10.1.3. half-closed (local) . . . . . . . . . . . . . . . . 48 | |||
| 10.1.4. BLOCKED frames . . . . . . . . . . . . . . . . . . . 40 | 10.1.4. half-closed (remote) . . . . . . . . . . . . . . . . 48 | |||
| 11. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 10.1.5. closed . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 12. Security and Privacy Considerations . . . . . . . . . . . . . 44 | 10.2. Stream Identifiers . . . . . . . . . . . . . . . . . . . 50 | |||
| 12.1. Spoofed Ack Attack . . . . . . . . . . . . . . . . . . . 44 | 10.3. Stream Concurrency . . . . . . . . . . . . . . . . . . . 50 | |||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 45 | 10.4. Sending and Receiving Data . . . . . . . . . . . . . . . 51 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 45 | 10.5. Stream Prioritization . . . . . . . . . . . . . . . . . 51 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . 45 | 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . 45 | 11.1. Edge Cases and Other Considerations . . . . . . . . . . 54 | |||
| 14.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | 11.1.1. Mid-stream RST_STREAM . . . . . . . . . . . . . . . 54 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 46 | 11.1.2. Response to a RST_STREAM . . . . . . . . . . . . . . 54 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 46 | 11.1.3. Offset Increment . . . . . . . . . . . . . . . . . . 54 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 46 | 11.1.4. BLOCKED frames . . . . . . . . . . . . . . . . . . . 55 | |||
| C.1. Since draft-ietf-quic-transport-00: . . . . . . . . . . . 47 | 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 55 | |||
| C.2. Since draft-hamilton-quic-transport-protocol-01: . . . . 47 | 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 55 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 47 | 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 12.3. Error Codes . . . . . . . . . . . . . . . . . . . . . . 56 | ||||
| 13. Security and Privacy Considerations . . . . . . . . . . . . . 60 | ||||
| 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 60 | ||||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 61 | ||||
| 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 61 | ||||
| 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
| 15.1. Normative References . . . . . . . . . . . . . . . . . . 62 | ||||
| 15.2. Informative References . . . . . . . . . . . . . . . . . 63 | ||||
| 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 64 | ||||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 64 | ||||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 64 | ||||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 64 | ||||
| C.1. Since draft-ietf-quic-transport-01: . . . . . . . . . . . 64 | ||||
| C.2. Since draft-ietf-quic-transport-00: . . . . . . . . . . . 66 | ||||
| C.3. Since draft-hamilton-quic-transport-protocol-01: . . . . 67 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 67 | ||||
| 1. Introduction | 1. Introduction | |||
| QUIC is a multiplexed and secure transport protocol that runs on top | QUIC is a multiplexed and secure transport protocol that runs on top | |||
| of UDP. QUIC builds on past transport experience and implements | of UDP. QUIC aims to provide a flexible set of features that allow | |||
| mechanisms that make it useful as a modern general-purpose transport | it to be a general-purpose transport for multiple applications. | |||
| protocol. Using UDP as the substrate, QUIC seeks to be compatible | ||||
| with legacy clients and middleboxes. QUIC authenticates all of its | QUIC implements techniques learned from experience with TCP, SCTP and | |||
| headers, preventing middleboxes and other third parties from changing | other transport protocols. Using UDP as the substrate, QUIC seeks to | |||
| them, and encrypts most of its headers, limiting protocol evolution | be compatible with legacy clients and middleboxes. QUIC | |||
| largely to QUIC endpoints only. | authenticates all of its headers and encrypts most of the data it | |||
| exchanges, including its signaling. This allows the protocol to | ||||
| evolve without incurring a dependency on upgrades to middleboxes. | ||||
| This document describes the core QUIC protocol, including the | This document describes the core QUIC protocol, including the | |||
| conceptual design, wire format, and mechanisms of the QUIC protocol | conceptual design, wire format, and mechanisms of the QUIC protocol | |||
| for connection establishment, stream multiplexing, stream and | for connection establishment, stream multiplexing, stream and | |||
| connection-level flow control, and data reliability. Accompanying | connection-level flow control, and data reliability. | |||
| documents describe QUIC's loss detection and congestion control | ||||
| [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | Accompanying documents describe QUIC's loss detection and congestion | |||
| control [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | ||||
| [QUIC-TLS]. | [QUIC-TLS]. | |||
| 2. Conventions and Definitions | 2. Conventions and Definitions | |||
| The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this | The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this | |||
| document. It's not shouting; when they are capitalized, they have | document. It's not shouting; when they are capitalized, they have | |||
| the special meaning defined in [RFC2119]. | the special meaning defined in [RFC2119]. | |||
| Definitions of terms that are used in this document: | Definitions of terms that are used in this document: | |||
| o Client: The endpoint initiating a QUIC connection. | Client: The endpoint initiating a QUIC connection. | |||
| o Server: The endpoint accepting incoming QUIC connections. | Server: The endpoint accepting incoming QUIC connections. | |||
| o Endpoint: The client or server end of a connection. | Endpoint: The client or server end of a connection. | |||
| o Stream: A logical, bi-directional channel of ordered bytes within | Stream: A logical, bi-directional channel of ordered bytes within a | |||
| a QUIC connection. | QUIC connection. | |||
| o Connection: A conversation between two QUIC endpoints with a | Connection: A conversation between two QUIC endpoints with a single | |||
| single encryption context that multiplexes streams within it. | encryption context that multiplexes streams within it. | |||
| o Connection ID: The identifier for a QUIC connection. | Connection ID: The identifier for a QUIC connection. | |||
| o QUIC packet: A well-formed UDP payload that can be parsed by a | QUIC packet: A well-formed UDP payload that can be parsed by a QUIC | |||
| QUIC receiver. QUIC packet size in this document refers to the | receiver. QUIC packet size in this document refers to the UDP | |||
| UDP payload size. | payload size. | |||
| 2.1. Notational Conventions | 2.1. Notational Conventions | |||
| Packet and frame diagrams use the format described in [RFC2360] | Packet and frame diagrams use the format described in [RFC2360] | |||
| Section 3.1, with the following additional conventions: | Section 3.1, with the following additional conventions: | |||
| [x] Indicates that x is optional | [x] Indicates that x is optional | |||
| {x} Indicates that x is encrypted | {x} Indicates that x is encrypted | |||
| x (*) ... Indicates that x is variable-length | x (A) Indicates that x is A bits long | |||
| x (A/B/C) ... Indicates that x is one of A, B, or C bits long | x (A/B/C) ... Indicates that x is one of A, B, or C bits long | |||
| x (*) ... Indicates that x is variable-length | ||||
| 3. A QUIC Overview | 3. A QUIC Overview | |||
| This section briefly describes QUIC's key mechanisms and benefits. | This section briefly describes QUIC's key mechanisms and benefits. | |||
| Key strengths of QUIC include: | Key strengths of QUIC include: | |||
| o Low-latency connection establishment | o Low-latency connection establishment | |||
| o Multiplexing without head-of-line blocking | o Multiplexing without head-of-line blocking | |||
| o Authenticated and encrypted header and payload | o Authenticated and encrypted header and payload | |||
| skipping to change at page 5, line 39 ¶ | skipping to change at page 6, line 7 ¶ | |||
| o Rich signaling for congestion control and loss recovery | o Rich signaling for congestion control and loss recovery | |||
| o Stream and connection flow control | o Stream and connection flow control | |||
| o Connection migration and resilience to NAT rebinding | o Connection migration and resilience to NAT rebinding | |||
| o Version negotiation | o Version negotiation | |||
| 3.1. Low-Latency Connection Establishment | 3.1. Low-Latency Connection Establishment | |||
| QUIC relies on a combined crypto and transport handshake for setting | QUIC relies on a combined cryptographic and transport handshake for | |||
| up a secure transport connection. QUIC connections are expected to | setting up a secure transport connection. QUIC connections are | |||
| commonly use 0-RTT handshakes, meaning that for most QUIC | expected to commonly use 0-RTT handshakes, meaning that for most QUIC | |||
| connections, data can be sent immediately following the client | connections, data can be sent immediately following the client | |||
| handshake packet, without waiting for a reply from the server. QUIC | handshake packet, without waiting for a reply from the server. QUIC | |||
| provides a dedicated stream (Stream ID 1) to be used for performing | provides a dedicated stream (Stream ID 1) to be used for performing | |||
| the crypto handshake and QUIC options negotiation. The format of the | the cryptographic handshake and QUIC options negotiation. The format | |||
| QUIC options and parameters used during negotiation are described in | of the QUIC options and parameters used during negotiation are | |||
| this document, but the handshake protocol that runs on Stream ID 1 is | described in this document, but the handshake protocol that runs on | |||
| described in the accompanying crypto handshake draft [QUIC-TLS]. | Stream ID 1 is described in the accompanying cryptographic handshake | |||
| draft [QUIC-TLS]. | ||||
| 3.2. Stream Multiplexing | 3.2. Stream Multiplexing | |||
| When application messages are transported over TCP, independent | When application messages are transported over TCP, independent | |||
| application messages can suffer from head-of-line blocking. When an | application messages can suffer from head-of-line blocking. When an | |||
| application multiplexes many streams atop TCP's single-bytestream | application multiplexes many streams atop TCP's single-bytestream | |||
| abstraction, a loss of a TCP segment results in blocking of all | abstraction, a loss of a TCP segment results in blocking of all | |||
| subsequent segments until a retransmission arrives, irrespective of | subsequent segments until a retransmission arrives, irrespective of | |||
| the application streams that are encapsulated in subsequent segments. | the application streams that are encapsulated in subsequent segments. | |||
| QUIC ensures that lost packets carrying data for an individual stream | QUIC ensures that lost packets carrying data for an individual stream | |||
| only impact that specific stream. Data received on other streams can | only impact that specific stream. Data received on other streams can | |||
| continue to be reassembled and delivered to the application. | continue to be reassembled and delivered to the application. | |||
| 3.3. Rich Signaling for Congestion Control and Loss Recovery | 3.3. Rich Signaling for Congestion Control and Loss Recovery | |||
| QUIC's packet framing and acknowledgments carry rich information that | QUIC's packet framing and acknowledgments carry rich information that | |||
| help both congestion control and loss recovery in fundamental ways. | help both congestion control and loss recovery in fundamental ways. | |||
| Each QUIC packet carries a new packet number, including those | Each QUIC packet carries a new packet number, including those | |||
| carrying retransmitted data. This obviates the need for a separate | carrying retransmitted data. This obviates the need for a separate | |||
| mechanism to distinguish acks for retransmissions from those for | mechanism to distinguish acknowledgments for retransmissions from | |||
| original transmissions, avoiding TCP's retransmission ambiguity | those for original transmissions, avoiding TCP's retransmission | |||
| problem. QUIC acknowledgments also explicitly encode the delay | ambiguity problem. QUIC acknowledgments also explicitly encode the | |||
| between the receipt of a packet and its acknowledgment being sent, | delay between the receipt of a packet and its acknowledgment being | |||
| and together with the monotonically-increasing packet numbers, this | sent, and together with the monotonically-increasing packet numbers, | |||
| allows for precise network roundtrip-time (RTT) calculation. QUIC's | this allows for precise network roundtrip-time (RTT) calculation. | |||
| ACK frames support up to 256 ack blocks, so QUIC is more resilient to | QUIC's ACK frames support up to 256 ACK blocks, so QUIC is more | |||
| reordering than TCP with SACK support, as well as able to keep more | resilient to reordering than TCP with SACK support, as well as able | |||
| bytes on the wire when there is reordering or loss. | to keep more bytes on the wire when there is reordering or loss. | |||
| 3.4. Stream and Connection Flow Control | 3.4. Stream and Connection Flow Control | |||
| QUIC implements stream- and connection-level flow control, closely | QUIC implements stream- and connection-level flow control, closely | |||
| following HTTP/2's flow control mechanisms. At a high level, a QUIC | following HTTP/2's flow control mechanisms. At a high level, a QUIC | |||
| receiver advertises the absolute byte offset within each stream up to | receiver advertises the absolute byte offset within each stream up to | |||
| which the receiver is willing to receive data. As data is sent, | which the receiver is willing to receive data. As data is sent, | |||
| received, and delivered on a particular stream, the receiver sends | received, and delivered on a particular stream, the receiver sends | |||
| WINDOW_UPDATE frames that increase the advertised offset limit for | WINDOW_UPDATE frames that increase the advertised offset limit for | |||
| that stream, allowing the peer to send more data on that stream. In | that stream, allowing the peer to send more data on that stream. In | |||
| skipping to change at page 7, line 14 ¶ | skipping to change at page 7, line 23 ¶ | |||
| 3.5. Authenticated and Encrypted Header and Payload | 3.5. Authenticated and Encrypted Header and Payload | |||
| TCP headers appear in plaintext on the wire and are not | TCP headers appear in plaintext on the wire and are not | |||
| authenticated, causing a plethora of injection and header | authenticated, causing a plethora of injection and header | |||
| manipulation issues for TCP, such as receive-window manipulation and | manipulation issues for TCP, such as receive-window manipulation and | |||
| sequence-number overwriting. While some of these are mechanisms used | sequence-number overwriting. While some of these are mechanisms used | |||
| by middleboxes to improve TCP performance, others are active attacks. | by middleboxes to improve TCP performance, others are active attacks. | |||
| Even "performance-enhancing" middleboxes that routinely interpose on | Even "performance-enhancing" middleboxes that routinely interpose on | |||
| the transport state machine end up limiting the evolvability of the | the transport state machine end up limiting the evolvability of the | |||
| transport protocol, as has been observed in the design of MPTCP and | transport protocol, as has been observed in the design of MPTCP | |||
| in its subsequent deployability issues. | [RFC6824] and in its subsequent deployability issues. | |||
| Generally, QUIC packets are always authenticated and the payload is | Generally, QUIC packets are always authenticated and the payload is | |||
| typically fully encrypted. The parts of the packet header which are | typically fully encrypted. The parts of the packet header which are | |||
| not encrypted are still authenticated by the receiver, so as to | not encrypted are still authenticated by the receiver, so as to | |||
| thwart any packet injection or manipulation by third parties. Some | thwart any packet injection or manipulation by third parties. Some | |||
| early handshake packets, such as the Version Negotiation packet, are | early handshake packets, such as the Version Negotiation packet, are | |||
| not encrypted, but information sent in these unencrypted handshake | not encrypted, but information sent in these unencrypted handshake | |||
| packets is later verified under crypto cover. | packets is later verified as part of cryptographic processing. | |||
| PUBLIC_RESET packets that reset a connection are currently not | PUBLIC_RESET packets that reset a connection are currently not | |||
| authenticated. | authenticated. | |||
| 3.6. Connection Migration and Resilience to NAT Rebinding | 3.6. Connection Migration and Resilience to NAT Rebinding | |||
| QUIC connections are identified by a 64-bit Connection ID, randomly | QUIC connections are identified by a 64-bit Connection ID, randomly | |||
| generated by the client. QUIC's consistent connection ID allows | generated by the client. QUIC's consistent connection ID allows | |||
| connections to survive changes to the client's IP and port, such as | connections to survive changes to the client's IP and port, such as | |||
| those caused by NAT rebindings or by the client changing network | those caused by NAT rebindings or by the client changing network | |||
| skipping to change at page 7, line 46 ¶ | skipping to change at page 8, line 9 ¶ | |||
| the same session key for encrypting and decrypting packets. The | the same session key for encrypting and decrypting packets. The | |||
| consistent connection ID can be used to allow migration of the | consistent connection ID can be used to allow migration of the | |||
| connection to a new server IP address as well, since the Connection | connection to a new server IP address as well, since the Connection | |||
| ID remains consistent across changes in the client's and the server's | ID remains consistent across changes in the client's and the server's | |||
| network addresses. | network addresses. | |||
| 3.7. Version Negotiation | 3.7. Version Negotiation | |||
| QUIC version negotiation allows for multiple versions of the protocol | QUIC version negotiation allows for multiple versions of the protocol | |||
| to be deployed and used concurrently. Version negotiation is | to be deployed and used concurrently. Version negotiation is | |||
| described in Section 6.1. | described in Section 7.1. | |||
| 4. Versions | 4. Versions | |||
| QUIC versions are identified using a 32-bit value. | QUIC versions are identified using a 32-bit value. | |||
| The version 0x00000000 is reserved to represent an invalid version. | The version 0x00000000 is reserved to represent an invalid version. | |||
| This version of the specification is identified by the number | This version of the specification is identified by the number | |||
| 0x00000001. | 0x00000001. | |||
| Versions with the most significant 16 bits of the version number | Versions with the most significant 16 bits of the version number | |||
| cleared are reserved for use in future IETF consensus documents. | cleared are reserved for use in future IETF consensus documents. | |||
| Versions that follow the pattern 0x?a?a?a?a are reserved for use in | ||||
| forcing version negotiation to be exercised. That is, any version | ||||
| number where the low four bits of all octets is 1010 (in binary). A | ||||
| client or server MAY advertise support for any of these reserved | ||||
| versions. | ||||
| Reserved version numbers will probably never represent a real | ||||
| protocol; a client MAY use one of these version numbers with the | ||||
| expectation that the server will initiate version negotiation; a | ||||
| server MAY advertise support for one of these versions and can expect | ||||
| that clients ignore the value. | ||||
| [[RFC editor: please remove the remainder of this section before | [[RFC editor: please remove the remainder of this section before | |||
| publication.]] | publication.]] | |||
| The version number for the final version of this specification | The version number for the final version of this specification | |||
| (0x00000001), is reserved for the version of the protocol that is | (0x00000001), is reserved for the version of the protocol that is | |||
| published as an RFC. | published as an RFC. | |||
| Version numbers used to identify IETF drafts are created by adding | Version numbers used to identify IETF drafts are created by adding | |||
| the draft number to 0xff000000. For example, draft-ietf-quic- | the draft number to 0xff000000. For example, draft-ietf-quic- | |||
| transport-13 would be identified as 0xff00000D. | transport-13 would be identified as 0xff00000D. | |||
| Versions of QUIC that are used for experimentation are coordinated on | Implementors are encouraged to register version numbers of QUIC that | |||
| the github wiki [4]. | they are using for private experimentation on the github wiki [4]. | |||
| 5. Packet Types and Formats | 5. Packet Types and Formats | |||
| We first describe QUIC's packet types and their formats, since some | We first describe QUIC's packet types and their formats, since some | |||
| are referenced in subsequent mechanisms. | are referenced in subsequent mechanisms. | |||
| All numeric values are encoded in network byte order (that is, big- | All numeric values are encoded in network byte order (that is, big- | |||
| endian) and all field sizes are in bits. When discussing individual | endian) and all field sizes are in bits. When discussing individual | |||
| bits of fields, the least significant bit is referred to as bit 0. | bits of fields, the least significant bit is referred to as bit 0. | |||
| Hexadecimal notation is used for describing the value of fields. | Hexadecimal notation is used for describing the value of fields. | |||
| 5.1. Common Header | Any QUIC packet has either a long or a short header, as indicated by | |||
| the Header Form bit. Long headers are expected to be used early in | ||||
| the connection before version negotiation and establishment of 1-RTT | ||||
| keys, and for public resets. Short headers are minimal version- | ||||
| specific headers, which can be used after version negotiation and | ||||
| 1-RTT keys are established. | ||||
| All QUIC packets begin with a QUIC Common header, as shown below. | 5.1. Long Header | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| | Flags (8) | | |1| Type (7) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + [Connection ID (64)] + | + Connection ID (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type-Dependent Fields (*) ... | | Packet Number (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Payload (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the Common Header are the following: | Figure 1: Long Header Format | |||
| o Flags: | Long headers are used for packets that are sent prior to the | |||
| completion of version negotiation and establishment of 1-RTT keys. | ||||
| Once both conditions are met, a sender SHOULD switch to sending | ||||
| short-form headers. While inefficient, long headers MAY be used for | ||||
| packets encrypted with 1-RTT keys. The long form allows for special | ||||
| packets, such as the Version Negotiation and the Public Reset packets | ||||
| to be represented in this uniform fixed-length packet format. A long | ||||
| header contains the following fields: | ||||
| * 0x01 = VERSION. The semantics of this flag depends on whether | Header Form: The most significant bit (0x80) of the first octet is | |||
| the packet is sent by the server or the client. A client MAY | set to 1 for long headers and 0 for short headers. | |||
| set this flag and include exactly one proposed version. A | ||||
| server may set this flag when the client-proposed version was | ||||
| unsupported, and may then provide a list (0 or more) of | ||||
| acceptable versions as a part of version negotiation (described | ||||
| in Section 6.1.) | ||||
| * 0x02 = PUBLIC_RESET. Set to indicate that the packet is a | Long Packet Type: The remaining seven bits of first octet of a long | |||
| Public Reset packet. | packet is the packet type. This field can indicate one of 128 | |||
| packet types. The types specified for this version are listed in | ||||
| Table 1. | ||||
| * 0x04 = KEY_PHASE. This is used by the QUIC packet protection | Connection ID: Octets 1 through 8 contain the connection ID. | |||
| to identify the correct packet protection keys, see [QUIC-TLS]. | Section 5.7 describes the use of this field in more detail. | |||
| * 0x08 = CONNECTION_ID. Indicates the Connection ID is present | Packet Number: Octets 9 to 12 contain the packet number. {{packet- | |||
| in the packet. This must be set in all packets until | numbers} describes the use of packet numbers. | |||
| negotiated to a different value for a given direction. For | ||||
| instance, if a client indicates that the 5-tuple fully | ||||
| identifies the connection at the client, the connection ID is | ||||
| optional in the server-to-client direction. | ||||
| * 0x30 = PACKET_NUMBER_SIZE. These two bits indicate the number | Version: Octets 13 to 16 contain the selected protocol version. | |||
| of low-order-bytes of the packet number that are present in | This field indicates which version of QUIC is in use and | |||
| each packet. | determines how the rest of the protocol fields are interpreted. | |||
| + 11 indicates that 6 bytes of the packet number are present | Payload: Octets from 17 onwards (the rest of QUIC packet) are the | |||
| payload of the packet. | ||||
| + 10 indicates that 4 bytes of the packet number are present | The following packet types are defined: | |||
| + 01 indicates that 2 bytes of the packet number are present | +------+-------------------------------+-------------+ | |||
| | Type | Name | Section | | ||||
| +------+-------------------------------+-------------+ | ||||
| | 01 | Version Negotiation | Section 5.3 | | ||||
| | | | | | ||||
| | 02 | Client Cleartext | Section 5.4 | | ||||
| | | | | | ||||
| | 03 | Non-Final Server Cleartext | Section 5.4 | | ||||
| | | | | | ||||
| | 04 | Final Server Cleartext | Section 5.4 | | ||||
| | | | | | ||||
| | 05 | 0-RTT Encrypted | Section 5.5 | | ||||
| | | | | | ||||
| | 06 | 1-RTT Encrypted (key phase 0) | Section 5.5 | | ||||
| | | | | | ||||
| | 07 | 1-RTT Encrypted (key phase 1) | Section 5.5 | | ||||
| | | | | | ||||
| | 08 | Public Reset | Section 5.6 | | ||||
| +------+-------------------------------+-------------+ | ||||
| + 00 indicates that 1 byte of the packet number is present | Table 1: Long Header Packet Types | |||
| * 0x40 = MULTIPATH. This bit is reserved for multipath use. | The header form, packet type, connection ID, packet number and | |||
| version fields of a long header packet are version-independent. The | ||||
| types of packets defined in Table 1 are version-specific. See | ||||
| Section 5.9 for details on how packets from different versions of | ||||
| QUIC are interpreted. | ||||
| * 0x80 is currently unused, and must be set to 0. | (TODO: Should the list of packet types be version-independent?) | |||
| o Connection ID: An unsigned 64-bit random number chosen by the | The interpretation of the fields and the payload are specific to a | |||
| client, used as the identifier of the connection. Connection ID | version and packet type. Type-specific semantics for this version | |||
| is tied to a QUIC connection, and remains consistent across client | are described in Section 5.3, Section 5.6, Section 5.4, and | |||
| and/or server IP and port changes. | Section 5.5. | |||
| 5.1.1. Identifying Packet Types | 5.2. Short Header | |||
| While all QUIC packets have the same common header, there are three | 0 1 2 3 | |||
| types of packets: Regular packets, Version Negotiation packets, and | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| Public Reset packets. The flowchart below shows how a packet is | +-+-+-+-+-+-+-+-+ | |||
| classified into one of these three packet types: | |0|C|K| Type (5)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | | | ||||
| + [Connection ID (64)] + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Packet Number (8/16/32) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Encrypted Payload (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Check the flags in the common header | Figure 2: Short Header Format | |||
| | | ||||
| | | ||||
| V | ||||
| +--------------+ | ||||
| | PUBLIC_RESET | YES | ||||
| | flag set? |-------> Public Reset packet | ||||
| +--------------+ | ||||
| | | ||||
| | NO | ||||
| V | ||||
| +------------+ +-------------+ | ||||
| | VERSION | YES | Packet sent | YES Version | ||||
| | flag set? |-------->| by server? |--------> Negotiation | ||||
| +------------+ +-------------+ packet | ||||
| | | | ||||
| | NO | NO | ||||
| V V | ||||
| Regular packet with Regular packet with | ||||
| no QUIC Version in header QUIC Version in header | ||||
| Figure 1: Types of QUIC Packets | The short header can be used after the version and 1-RTT keys are | |||
| negotiated. This header form has the following fields: | ||||
| 5.1.2. Handling Packets from Different Versions | Header Form: The most significant bit (0x80) of the first octet of a | |||
| packet is the header form. This bit is set to 0 for the short | ||||
| header. | ||||
| Version negotiation (Section 6.1) is performed using packets that | Connection ID Flag: The second bit (0x40) of the first octet | |||
| have the VERSION bit set. This bit is always set on packets that are | indicates whether the Connection ID field is present. If set to | |||
| sent prior to connection establishment. When receiving a packet that | 1, then the Connection ID field is present; if set to 0, the | |||
| is not associated with an existing connection, packets without a | Connection ID field is omitted. | |||
| VERSION bit MUST be discarded. | ||||
| Implementations MUST assume that an unsupported version uses an | Key Phase Bit: The third bit (0x20) of the first octet indicates the | |||
| unknown packet format. | key phase, which allows a recipient of a packet to identify the | |||
| packet protection keys that are used to protect the packet. See | ||||
| [QUIC-TLS] for details. | ||||
| Between different versions the following things are guaranteed to | Short Packet Type: The remaining 5 bits of the first octet include | |||
| remain constant are: | one of 32 packet types. Table 2 lists the types that are defined | |||
| for short packets. | ||||
| o the location and size of the Flags field, | Connection ID: If the Connection ID Flag is set, a connection ID | |||
| occupies octets 1 through 8 of the packet. See Section 5.7 for | ||||
| more details. | ||||
| o the location and value of the VERSION bit in the Flags field, | Packet Number: The length of the packet number field depends on the | |||
| o the location and size of the Connection ID field, and | packet type. This field can be 1, 2 or 4 octets long depending on | |||
| the short packet type. | ||||
| o the Version (or Supported Versions, Section 5.3) field. | Encrypted Payload: Packets with a short header always include a | |||
| 1-RTT protected payload. | ||||
| All other values MUST be ignored when processing a packet that | The packet type in a short header currently determines only the size | |||
| contains an unsupported version. | of the packet number field. Additional types can be used to signal | |||
| the presence of other fields. | ||||
| 5.2. Regular Packets | +------+--------------------+ | |||
| | Type | Packet Number Size | | ||||
| +------+--------------------+ | ||||
| | 01 | 1 octet | | ||||
| | | | | ||||
| | 02 | 2 octets | | ||||
| | | | | ||||
| | 03 | 4 octets | | ||||
| +------+--------------------+ | ||||
| Each Regular packet contains additional header fields followed by an | Table 2: Short Header Packet Types | |||
| encrypted payload, as shown below: | ||||
| 0 1 2 3 | The header form, connection ID flag and connection ID of a short | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | header packet are version-independent. The remaining fields are | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | specific to the selected QUIC version. See Section 5.9 for details | |||
| | [Version (32)] | | on how packets from different versions of QUIC are interpreted. | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Packet Number (8/16/32/48) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | {Encrypted Payload (*)} ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 2: Regular Packet | 5.3. Version Negotiation Packet | |||
| The fields in a Regular packet past the Common Header are the | A Version Negotiation packet is sent only by servers and is a | |||
| following: | response to a client packet of an unsupported version. It uses a | |||
| long header and contains: | ||||
| o QUIC Version: A 32-bit opaque tag that represents the version of | o Octet 0: 0x81 | |||
| the QUIC protocol. Only present in the client-to-server | ||||
| direction, and if the VERSION flag is set. Version Negotiation is | ||||
| described in Section 6.1. | ||||
| o Packet Number: The lower 8, 16, 32, or 48 bits of the packet | o Octets 1-8: Connection ID (echoed) | |||
| number, based on the PACKET_NUMBER_SIZE flag. Each Regular packet | ||||
| is assigned a packet number by the sender. The first packet sent | ||||
| by an endpoint MUST have a packet number of 1. | ||||
| o Encrypted Payload: The remainder of a Regular packet is both | o Octets 9-12: Packet Number (echoed) | |||
| authenticated and encrypted once packet protection keys are | ||||
| available. [QUIC-TLS] describes packet protection in detail. | o Octets 13-16: Version (echoed) | |||
| After decryption, the plaintext consists of a sequence of frames, | ||||
| as shown in Figure 3. Frames are described in Section 5.2.2. | o Octets 17+: Payload | |||
| The payload of the Version Negotiation packet is a list of 32-bit | ||||
| versions which the server supports, as shown below. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame 1 (*) ... | | Supported Version 1 (32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame 2 (*) ... | | [Supported Version 2 (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame N (*) ... | | [Supported Version N (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Contents of Encrypted Payload | Figure 3: Version Negotiation Packet | |||
| 5.2.1. Packet Number Compression and Reconstruction | See Section 7.1 for a description of the version negotiation process. | |||
| The complete packet number is a 64-bit unsigned number and is used as | 5.4. Cleartext Packets | |||
| part of a cryptographic nonce for packet encryption. To reduce the | ||||
| number of bits required to represent the packet number over the wire, | ||||
| at most 48 bits of the packet number are transmitted over the wire. | ||||
| A QUIC endpoint MUST NOT reuse a complete packet number within the | ||||
| same connection (that is, under the same cryptographic keys). If the | ||||
| total number of packets transmitted in this connection reaches 2^64 - | ||||
| 1, the sender MUST close the connection by sending a CONNECTION_CLOSE | ||||
| frame with the error code QUIC_SEQUENCE_NUMBER_LIMIT_REACHED | ||||
| (connection termination is described in Section 6.4.) For | ||||
| unambiguous reconstruction of the complete packet number by a | ||||
| receiver from the lower-order bits, a QUIC sender MUST NOT have more | ||||
| than 2^(packet_number_size - 2) in flight at any point in the | ||||
| connection. In other words, | ||||
| o If a sender sets PACKET_NUMBER_SIZE bits to 11, it MUST NOT have | Cleartext packets are sent during the handshake prior to key | |||
| more than (2^46) packets in flight. | negotiation. A Client Cleartext packet contains: | |||
| o If a sender sets PACKET_NUMBER_SIZE bits to 10, it MUST NOT have | o Octet 0: 0x82 | |||
| more than (2^30) packets in flight. | ||||
| o If a sender sets PACKET_NUMBER_SIZE bits to 01, it MUST NOT have | o Octets 1-8: Connection ID (initial) | |||
| more than (2^14) packets in flight. | ||||
| o If a sender sets PACKET_NUMBER_SIZE bits to 00, it MUST NOT have | o Octets 9-12: Packet number | |||
| more than (2^6) packets in flight. | ||||
| DISCUSS: Should the receiver be required to enforce this rule that | o Octets 13-16: Version | |||
| the sender MUST NOT exceed the inflight limit? Specifically, | ||||
| should the receiver drop packets that are received outside this | ||||
| window? | ||||
| Any truncated packet number received from a peer MUST be | ||||
| reconstructed as the value closest to the next expected packet | ||||
| number from that peer. | ||||
| (TODO: Clarify how packet number size can change mid-connection.) | o Octets 17+: Payload | |||
| 5.2.2. Frames and Frame Types | Non-Final Server Cleartext packets contain: | |||
| A Regular packet MUST contain at least one frame, and MAY contain | o Octet 0: 0x83 | |||
| multiple frames and multiple frame types. Frames MUST fit within a | ||||
| single QUIC packet and MUST NOT span a QUIC packet boundary. Each | ||||
| frame begins with a Frame Type byte, indicating its type, followed by | ||||
| additional type-dependent fields: | ||||
| 0 1 2 3 | o Octets 1-8: Connection ID (echoed) | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Type (8) | Type-Dependent Fields (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 4: Generic Frame Layout | o Octets 9-12: Packet Number | |||
| The following table lists currently defined frame types. Note that | o Octets 13-16: Version | |||
| the Frame Type byte in STREAM and ACK frames is used to carry other | ||||
| frame-specific flags. For all other frames, the Frame Type byte | ||||
| simply identifies the frame. These frames are explained in more | ||||
| detail as they are referenced later in the document. | ||||
| +---+------------------+------------------+--------------+ | o Octets 17+: Payload | |||
| | | Type-field value | Frame type | Definition | | ||||
| +---+------------------+------------------+--------------+ | ||||
| | | "1FDOOOSS" | STREAM | Section 7.1 | | ||||
| | | | | | | ||||
| | | "01NULLMM" | ACK | Section 7.2 | | ||||
| | | | | | | ||||
| | | 00000000 (0x00) | PADDING | Section 7.7 | | ||||
| | | | | | | ||||
| | | 00000001 (0x01) | RST_STREAM | Section 7.6 | | ||||
| | | | | | | ||||
| | | 00000010 (0x02) | CONNECTION_CLOSE | Section 7.9 | | ||||
| | | | | | | ||||
| | | 00000011 (0x03) | GOAWAY | Section 7.10 | | ||||
| | | | | | | ||||
| | | 00000100 (0x04) | WINDOW_UPDATE | Section 7.4 | | ||||
| | | | | | | ||||
| | | 00000101 (0x05) | BLOCKED | Section 7.5 | | ||||
| | | | | | | ||||
| | | 00000110 (0x06) | STOP_WAITING | Section 7.3 | | ||||
| | | | | | | ||||
| | | 00000111 (0x07) | PING | Section 7.8 | | ||||
| +---+------------------+------------------+--------------+ | ||||
| 5.3. Version Negotiation Packet | Final Server Cleartext packets contains: | |||
| A Version Negotiation packet is only sent by the server, MUST have | o Octet 0: 0x84 | |||
| the VERSION flag set, and MUST include the full 64-bit Connection ID. | ||||
| The remainder of the Version Negotiation packet is a list of 32-bit | o Octets 1-8: Connection ID (final) | |||
| versions which the server supports, as shown below. | o Octets 9-12: Packet Number | |||
| o Octets 13-16: Version | ||||
| o Octets 17+: Payload | ||||
| The client MUST choose a random 64-bit value and use it as the | ||||
| initial Connection ID in all packets until the server replies with | ||||
| the final Connection ID. The server echoes the client's Connection | ||||
| ID in Non-Final Server Cleartext packets. The first Final Server | ||||
| Cleartext and all subsequent packets MUST use the final Connection | ||||
| ID, as described in Section 5.7. | ||||
| The payload of a Cleartext packet consists of a sequence of frames, | ||||
| as described in Section 6. | ||||
| (TODO: Add hash before frames.) | ||||
| 5.5. Encrypted Packets | ||||
| Packets encrypted with either 0-RTT or 1-RTT keys may be sent with | ||||
| long headers. Different packet types explicitly indicate the | ||||
| encryption level for ease of decryption. These packets contain: | ||||
| o Octet 0: 0x85, 0x86 or 0x87 | ||||
| o Octets 1-8: Connection ID (initial or final) | ||||
| o Octets 9-12: Packet Number | ||||
| o Octets 13-16: Version | ||||
| o Octets 17+: Encrypted Payload | ||||
| A first octet of 0x85 indicates a 0-RTT packet. After the 1-RTT keys | ||||
| are established, key phases are used by the QUIC packet protection to | ||||
| identify the correct packet protection keys. The initial key phase | ||||
| is 0. See [QUIC-TLS] for more details. | ||||
| The encrypted payload is both authenticated and encrypted using | ||||
| packet protection keys. [QUIC-TLS] describes packet protection in | ||||
| detail. After decryption, the plaintext consists of a sequence of | ||||
| frames, as described in Section 6. | ||||
| 5.6. Public Reset Packet | ||||
| A Public Reset packet is only sent by servers and is used to abruptly | ||||
| terminate communications. Public Reset is provided as an option of | ||||
| last resort for a server that does not have access to the state of a | ||||
| connection. This is intended for use by a server that has lost state | ||||
| (for example, through a crash or outage). A server that wishes to | ||||
| communicate a fatal connection error MUST use a CONNECTION_CLOSE | ||||
| frame if it has sufficient state to do so. | ||||
| A Public Reset packet contains: | ||||
| o Octet 0: 0x88 | ||||
| o Octets 1-8: Echoed data (octets 1-8 of received packet) | ||||
| o Octets 9-12: Echoed data (octets 9-12 of received packet) | ||||
| o Octets 13-16: Version | ||||
| o Octets 17+: Public Reset Proof | ||||
| For a client that sends a connection ID on every packet, the | ||||
| Connection ID field is simply an echo of the initial Connection ID, | ||||
| and the Packet Number field includes an echo of the client's packet | ||||
| number (and, depending on the client's packet number length, 0, 2, or | ||||
| 3 additional octets from the client's packet). | ||||
| A Public Reset packet sent by a server indicates that it does not | ||||
| have the state necessary to continue with a connection. In this | ||||
| case, the server will include the fields that prove that it | ||||
| originally participated in the connection (see Section 5.6.1 for | ||||
| details). | ||||
| Upon receipt of a Public Reset packet that contains a valid proof, a | ||||
| client MUST tear down state associated with the connection. The | ||||
| client MUST then cease sending packets on the connection and SHOULD | ||||
| discard any subsequent packets that arrive. A Public Reset that does | ||||
| not contain a valid proof MUST be ignored. | ||||
| 5.6.1. Public Reset Proof | ||||
| TODO: Details to be added. | ||||
| 5.7. Connection ID | ||||
| QUIC connections are identified by their 64-bit Connection ID. All | ||||
| long headers contain a Connection ID. Short headers indicate the | ||||
| presence of a Connection ID using the CONNECTION_ID flag. When | ||||
| present, the Connection ID is in the same location in all packet | ||||
| headers, making it straightforward for middleboxes, such as load | ||||
| balancers, to locate and use it. | ||||
| When a connection is initiated, the client MUST choose a random value | ||||
| and use it as the initial Connection ID until the final value is | ||||
| available. The initial Connection ID is a suggestion to the server. | ||||
| The server echoes this value in all packets until the handshake is | ||||
| successful (see [QUIC-TLS]). On a successful handshake, the server | ||||
| MUST select the final Connection ID for the connection and use it in | ||||
| Final Server Cleartext packets. This final Connection ID MAY be the | ||||
| one proposed by the client or MAY be a new server-selected value. | ||||
| All subsequent packets from the server MUST contain this value. On | ||||
| handshake completion, the client MUST switch to using the final | ||||
| Connection ID for all subsequent packets. | ||||
| Thus, all Client Cleartext packets, 0-RTT Encrypted packets, and Non- | ||||
| Final Server Cleartext packets MUST use the client's randomly- | ||||
| generated initial Connection ID. Final Server Cleartext packets, | ||||
| 1-RTT Encrypted packets, and all short-header packets MUST use the | ||||
| final Connection ID. | ||||
| 5.8. Packet Numbers | ||||
| The packet number is a 64-bit unsigned number and is used as part of | ||||
| a cryptographic nonce for packet encryption. Each endpoint maintains | ||||
| a separate packet number for sending and receiving. The packet | ||||
| number for sending MUST increase by at least one after sending any | ||||
| packet. | ||||
| A QUIC endpoint MUST NOT reuse a packet number within the same | ||||
| connection (that is, under the same cryptographic keys). If the | ||||
| packet number for sending reaches 2^64 - 1, the sender MUST close the | ||||
| connection by sending a CONNECTION_CLOSE frame with the error code | ||||
| QUIC_SEQUENCE_NUMBER_LIMIT_REACHED (connection termination is | ||||
| described in Section 7.6.) | ||||
| To reduce the number of bits required to represent the packet number | ||||
| over the wire, only the least significant bits of the packet number | ||||
| are transmitted over the wire, up to 32 bits. The actual packet | ||||
| number for each packet is reconstructed at the receiver based on the | ||||
| largest packet number received on a successfully authenticated | ||||
| packet. | ||||
| A packet number is decoded by finding the packet number value that is | ||||
| closest to the next expected packet. The next expected packet is the | ||||
| highest received packet number plus one. For example, if the highest | ||||
| successfully authenticated packet had a packet number of 0xaa82f30e, | ||||
| then a packet containing a 16-bit value of 0x1f94 will be decoded as | ||||
| 0xaa831f94. | ||||
| The sender MUST use a packet number size able to represent more than | ||||
| twice as large a range than the difference between the largest | ||||
| acknowledged packet and packet number being sent. A peer receiving | ||||
| the packet will then correctly decode the packet number, unless the | ||||
| packet is delayed in transit such that it arrives after many higher- | ||||
| numbered packets have been received. An endpoint MAY use a larger | ||||
| packet number size to safeguard against such reordering. | ||||
| As a result, the size of the packet number encoding is at least one | ||||
| more than the base 2 logarithm of the number of contiguous | ||||
| unacknowledged packet numbers, including the new packet. | ||||
| For example, if an endpoint has received an acknowledgment for packet | ||||
| 0x6afa2f, sending a packet with a number of 0x6b4264 requires a | ||||
| 16-bit or larger packet number encoding; whereas a 32-bit packet | ||||
| number is needed to send a packet with a number of 0x6bc107. | ||||
| 5.8.1. Initial Packet Number | ||||
| The initial value for packet number MUST be a 31-bit random number. | ||||
| That is, the value is selected from an uniform random distribution | ||||
| between 0 and 2^31-1. [RFC4086] provides guidance on the generation | ||||
| of random values. | ||||
| The first set of packets sent by an endpoint MUST include the low | ||||
| 32-bits of the packet number. Once any packet has been acknowledged, | ||||
| subsequent packets can use a shorter packet number encoding. | ||||
| 5.9. Handling Packets from Different Versions | ||||
| Between different versions the following things are guaranteed to | ||||
| remain constant: | ||||
| o the location of the header form flag, | ||||
| o the location of the Connection ID flag in short headers, | ||||
| o the location and size of the Connection ID field in both header | ||||
| forms, | ||||
| o the location and size of the Version field in long headers, and | ||||
| o the location and size of the Packet Number field in long headers. | ||||
| Implementations MUST assume that an unsupported version uses an | ||||
| unknown packet format. All other fields MUST be ignored when | ||||
| processing a packet that contains an unsupported version. | ||||
| 6. Frames and Frame Types | ||||
| The payload of cleartext packets and the plaintext after decryption | ||||
| of encrypted payloads consists of a sequence of frames, as shown in | ||||
| Figure 4. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Supported Version 1 (32) ... | | Frame 1 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Supported Version 2 (32) ... | | Frame 2 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Supported Version N (32) ... | | Frame N (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: Version Negotiation Packet | Figure 4: Contents of Encrypted Payload | |||
| 5.4. Public Reset Packet | Encrypted payloads MUST contain at least one frame, and MAY contain | |||
| multiple frames and multiple frame types. | ||||
| A Public Reset packet MUST have the PUBLIC_RESET flag set, and MUST | Frames MUST fit within a single QUIC packet and MUST NOT span a QUIC | |||
| include the full 64-bit connection ID. The content of the Public | packet boundary. Each frame begins with a Frame Type byte, | |||
| Reset packet is TBD. | indicating its type, followed by additional type-dependent fields: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Public Reset Fields (*) ... | | Type (8) | Type-Dependent Fields (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 6: Public Reset Packet | Figure 5: Generic Frame Layout | |||
| 6. Life of a Connection | Frame types are listed in Table 3. Note that the Frame Type byte in | |||
| STREAM and ACK frames is used to carry other frame-specific flags. | ||||
| For all other frames, the Frame Type byte simply identifies the | ||||
| frame. These frames are explained in more detail as they are | ||||
| referenced later in the document. | ||||
| +------------------+------------------+-------------+ | ||||
| | Type-field value | Frame type | Definition | | ||||
| +------------------+------------------+-------------+ | ||||
| | 0x00 | PADDING | Section 8.6 | | ||||
| | | | | | ||||
| | 0x01 | RST_STREAM | Section 8.5 | | ||||
| | | | | | ||||
| | 0x02 | CONNECTION_CLOSE | Section 8.8 | | ||||
| | | | | | ||||
| | 0x03 | GOAWAY | Section 8.9 | | ||||
| | | | | | ||||
| | 0x04 | WINDOW_UPDATE | Section 8.3 | | ||||
| | | | | | ||||
| | 0x05 | BLOCKED | Section 8.4 | | ||||
| | | | | | ||||
| | 0x07 | PING | Section 8.7 | | ||||
| | | | | | ||||
| | 0x40 - 0x7f | ACK | Section 8.2 | | ||||
| | | | | | ||||
| | 0x80 - 0xff | STREAM | Section 8.1 | | ||||
| +------------------+------------------+-------------+ | ||||
| Table 3: Frame Types | ||||
| 7. Life of a Connection | ||||
| A QUIC connection is a single conversation between two QUIC | A QUIC connection is a single conversation between two QUIC | |||
| endpoints. QUIC's connection establishment intertwines version | endpoints. QUIC's connection establishment intertwines version | |||
| negotiation with the crypto and transport handshakes to reduce | negotiation with the cryptographic and transport handshakes to reduce | |||
| connection establishment latency, as described in Section 6.2. Once | connection establishment latency, as described in Section 7.2. Once | |||
| established, a connection may migrate to a different IP or port at | established, a connection may migrate to a different IP or port at | |||
| either endpoint, due to NAT rebinding or mobility, as described in | either endpoint, due to NAT rebinding or mobility, as described in | |||
| Section 6.3. Finally a connection may be terminated by either | Section 7.5. Finally a connection may be terminated by either | |||
| endpoint, as described in Section 6.4. | endpoint, as described in Section 7.6. | |||
| 6.1. Version Negotiation | 7.1. Version Negotiation | |||
| QUIC's connection establishment begins with version negotiation, | QUIC's connection establishment begins with version negotiation, | |||
| since all communication between the endpoints, including packet and | since all communication between the endpoints, including packet and | |||
| frame formats, relies on the two endpoints agreeing on a version. | frame formats, relies on the two endpoints agreeing on a version. | |||
| A QUIC connection begins with a client sending a handshake packet. | A QUIC connection begins with a client sending a handshake packet. | |||
| The details of the handshake mechanisms are described in Section 6.2, | The details of the handshake mechanisms are described in Section 7.2, | |||
| but all of the initial packets sent from the client to the server | but all of the initial packets sent from the client to the server | |||
| MUST have the VERSION flag set, and MUST specify the version of the | MUST use the long header format and MUST specify the version of the | |||
| protocol being used. | protocol being used. | |||
| When the server receives a packet from a client with the VERSION flag | When the server receives a packet from a client with the long header | |||
| set, it compares the client's version to the versions it supports. | format, it compares the client's version to the versions it supports. | |||
| If the version selected by the client is not acceptable to the | If the version selected by the client is not acceptable to the | |||
| server, the server discards the incoming packet and responds with a | server, the server discards the incoming packet and responds with a | |||
| version negotiation packet (Section 5.3). This includes the VERSION | Version Negotiation packet (Section 5.3). This includes a list of | |||
| flag and a list of versions that the server will accept. A server | versions that the server will accept. A server MUST send a Version | |||
| MUST send a version negotiation packet for every packet that it | Negotiation packet for every packet that it receives with an | |||
| receives with an unacceptable version. | unacceptable version. | |||
| If the packet contains a version that is acceptable to the server, | If the packet contains a version that is acceptable to the server, | |||
| the server proceeds with the handshake (Section 6.2). All subsequent | the server proceeds with the handshake (Section 7.2). This commits | |||
| packets sent by the server MUST have the VERSION flag unset. This | the server to the version that the client selected. | |||
| commits the server to the version that the client selected. | ||||
| When the client receives a Version Negotiation packet from the | When the client receives a Version Negotiation packet from the | |||
| server, it should select an acceptable protocol version. If the | server, it should select an acceptable protocol version. If the | |||
| server lists an acceptable version, the client selects that version | server lists an acceptable version, the client selects that version | |||
| and resends all packets using that version. The resent packets MUST | and reattempts to create a connection using that version. Though the | |||
| use new packet numbers. These packets MUST continue to have the | contents of a packet might not change in response to version | |||
| VERSION flag set and MUST include the new negotiated protocol | negotiation, a client MUST increase the packet number it uses on | |||
| version. | every packet it sends. Packets MUST continue to use long headers and | |||
| MUST include the new negotiated protocol version. | ||||
| The client MUST set the VERSION flag on all packets until version | The client MUST use the long header format and include its selected | |||
| negotiation concludes. Version negotiation successfully concludes | version on all packets until it has 1-RTT keys and it has received a | |||
| when the client receives a packet from the server with the VERSION | packet from the server which is not a Version Negotiation packet. | |||
| flag unset. All subsequent packets sent by the client SHOULD have | ||||
| the VERSION flag unset. | ||||
| Once the server receives a packet from the client with the VERSION | A client MUST NOT change the version it uses unless it is in response | |||
| flag unset, it MUST ignore the flag in subsequently received packets. | to a Version Negotiation packet from the server. Once a client | |||
| receives a packet from the server which is not a Version Negotiation | ||||
| packet, it MUST ignore Version Negotiation packets on the same | ||||
| connection. | ||||
| Version negotiation uses unprotected data. The result of the | Version negotiation uses unprotected data. The result of the | |||
| negotiation MUST be revalidated once the cryptographic handshake has | negotiation MUST be revalidated as part of the cryptographic | |||
| completed (see Section 6.2.4). | handshake (see Section 7.3.4). | |||
| 6.2. Crypto and Transport Handshake | 7.1.1. Using Reserved Versions | |||
| QUIC relies on a combined crypto and transport handshake to minimize | For a server to use a new version in the future, clients must | |||
| connection establishment latency. QUIC provides a dedicated stream | correctly handle unsupported versions. To help ensure this, a server | |||
| (Stream ID 1) to be used for performing a combined connection and | SHOULD include a reserved version (see Section 4) while generating a | |||
| security handshake (streams are described in detail in Section 9). | Version Negotiation packet. | |||
| The crypto handshake protocol encapsulates and delivers QUIC's | ||||
| transport handshake to the peer on the crypto stream. The first QUIC | ||||
| packet from the client to the server MUST carry handshake information | ||||
| as data on Stream ID 1. | ||||
| 6.2.1. Transport Parameters and Options | The design of version negotiation permits a server to avoid | |||
| maintaining state for packets that it rejects in this fashion. | ||||
| However, when the server generates a Version Negotiation packet, it | ||||
| cannot randomly generate a reserved version number. This is because | ||||
| the server is required to include the same value in its transport | ||||
| parameters (see Section 7.3.4). To avoid the selected version number | ||||
| changing during connection establishment, the reserved version SHOULD | ||||
| be generated as a function of values that will be available to the | ||||
| server when later generating its handshake packets. | ||||
| During connection establishment, the handshake must negotiate various | A pseudorandom function that takes client address information (IP and | |||
| transport parameters. The currently defined transport parameters are | port) and the client selected version as input would ensure that | |||
| described later in the document. | there is sufficient variability in the values that a server uses. | |||
| The transport component of the handshake is responsible for | A client MAY send a packet using a reserved version number. This can | |||
| exchanging and negotiating the following parameters for a QUIC | be used to solicit a list of supported versions from a server. | |||
| connection. Not all parameters are negotiated, some are parameters | ||||
| sent in just one direction. These parameters and options are encoded | ||||
| and handed off to the crypto handshake protocol to be transmitted to | ||||
| the peer. | ||||
| 6.2.1.1. Encoding | 7.2. Cryptographic and Transport Handshake | |||
| (TODO: Describe format with example) | QUIC relies on a combined cryptographic and transport handshake to | |||
| minimize connection establishment latency. QUIC allocates stream 1 | ||||
| for the cryptographic handshake. This version of QUIC uses TLS 1.3 | ||||
| [QUIC-TLS]. | ||||
| QUIC encodes the transport parameters and options as tag-value pairs, | QUIC provides this stream with reliable, ordered delivery of data. | |||
| all as 7-bit ASCII strings. QUIC parameter tags are listed below. | In return, the cryptographic handshake provides QUIC with: | |||
| 6.2.1.2. Required Transport Parameters | o authenticated key exchange, where | |||
| o SFCW: Stream Flow Control Window. The stream level flow control | * a server is always authenticated, | |||
| byte offset advertised by the sender of this parameter. | ||||
| o CFCW: Connection Flow Control Window. The connection level flow | * a client is optionally authenticated, | |||
| control byte offset advertised by the sender of this parameter. | ||||
| o MSPC: Maximum number of incoming streams per connection. | * every connection produces distinct and unrelated keys, | |||
| o ICSL: Idle timeout in seconds. The maximum value is 600 seconds | * keying material is usable for packet protection for both 0-RTT | |||
| (10 minutes). | and 1-RTT packets, and | |||
| 6.2.1.3. Optional Transport Parameters | * 1-RTT keys have forward secrecy | |||
| o TCID: Indicates support for truncated Connection IDs. If sent by | o authenticated values for the transport parameters of the peer (see | |||
| a peer, indicates that connection IDs sent to the peer should be | Section 7.3) | |||
| truncated to 0 bytes. This is expected to commonly be used by an | ||||
| endpoint where the 5-tuple is sufficient to identify a connection. | ||||
| For instance, if the 5-tuple is unique at the client, the client | ||||
| MAY send a TCID parameter to the server. When a TCID parameter is | ||||
| received, an endpoint MAY choose to not send the connection ID on | ||||
| subsequent packets. | ||||
| o COPT: Connection Options are a repeated tag field. The field | o authenticated confirmation of version negotiation (see | |||
| contains any connection options being requested by the client or | Section 7.3.4) | |||
| server. These are typically used for experimentation and will | ||||
| evolve over time. Example use cases include changing congestion | ||||
| control algorithms and parameters such as initial window. (TODO: | ||||
| List connection options.) | ||||
| 6.2.2. Proof of Source Address Ownership | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [RFC7301] for this purpose) | ||||
| Transport protocols commonly use a roundtrip time to verify a | o for the server, the ability to carry data that provides assurance | |||
| client's address ownership for protection from malicious clients that | that the client can receive packets that are addressed with the | |||
| spoof their source address. QUIC uses a cookie, called the Source | transport address that is claimed by the client (see Section 7.4) | |||
| Address Token (STK), to mostly eliminate this roundtrip of delay. | ||||
| This technique is similar to TCP Fast Open's use of a cookie to avoid | The initial cryptographic handshake message MUST be sent in a single | |||
| a roundtrip of delay in TCP connection establishment. | packet. Any second attempt that is triggered by address validation | |||
| MUST also be sent within a single packet. This avoids having to | ||||
| reassemble a message from multiple packets. Reassembling messages | ||||
| requires that a server maintain state prior to establishing a | ||||
| connection, exposing the server to a denial of service risk. | ||||
| On a new connection, a QUIC server sends an STK, which is opaque to | The first client packet of the cryptographic handshake protocol MUST | |||
| and stored by the client. On a subsequent connection, the client | fit within a 1280 octet QUIC packet. This includes overheads that | |||
| echoes it in the transport handshake as proof of IP ownership. | reduce the space available to the cryptographic handshake protocol. | |||
| A QUIC server also uses the STK to store server-designated connection | Details of how TLS is integrated with QUIC is provided in more detail | |||
| IDs for Stateless Rejects, to verify that an incoming connection | in [QUIC-TLS]. | |||
| contains the correct connection ID. | ||||
| A QUIC server MAY additionally store other data in a the STK, such as | 7.3. Transport Parameters | |||
| measured bandwidth and measured minimum RTT to the client that may | ||||
| help the server better bootstrap a subsequent connection from the | ||||
| same client. A server MAY send an updated STK message mid-connection | ||||
| to update server state that is stored at the client in the STK. | ||||
| (TODO: Describe server and client actions on STK, encoding, | During connection establishment, both endpoints make authenticated | |||
| recommendations for what to put in an STK. Describe SCUP messages.) | declarations of their transport parameters. These declarations are | |||
| made unilaterally by each endpoint. Endpoints are required to comply | ||||
| with the restrictions implied by these parameters; the description of | ||||
| each parameter includes rules for its handling. | ||||
| 6.2.3. Crypto Handshake Protocol Features | The format of the transport parameters is the TransportParameters | |||
| struct from Figure 6. This is described using the presentation | ||||
| language from Section 3 of [I-D.ietf-tls-tls13]. | ||||
| QUIC's current crypto handshake mechanism is documented in | uint32 QuicVersion; | |||
| [QUICCrypto]. QUIC does not restrict itself to using a specific | ||||
| handshake protocol, so the details of a specific handshake protocol | ||||
| are out of this document's scope. If not explicitly specified in the | ||||
| application mapping, TLS is assumed to be the default crypto | ||||
| handshake protocol, as described in [QUIC-TLS]. An application that | ||||
| maps to QUIC MAY however specify an alternative crypto handshake | ||||
| protocol to be used. | ||||
| The following list of requirements and recommendations documents | enum { | |||
| properties of the current prototype handshake which should be | stream_fc_offset(0), | |||
| provided by any handshake protocol. | connection_fc_offset(1), | |||
| concurrent_streams(2), | ||||
| idle_timeout(3), | ||||
| truncate_connection_id(4), | ||||
| (65535) | ||||
| } TransportParameterId; | ||||
| o The crypto handshake MUST ensure that the final negotiated key is | struct { | |||
| distinct for every connection between two endpoints. | TransportParameterId parameter; | |||
| opaque value<0..2^16-1>; | ||||
| } TransportParameter; | ||||
| o Transport Negotiation: The crypto handshake MUST provide a | struct { | |||
| mechanism for the transport component to exchange transport | select (Handshake.msg_type) { | |||
| parameters and Source Address Tokens. To avoid downgrade attacks, | case client_hello: | |||
| the transport parameters sent and received MUST be verified before | QuicVersion negotiated_version; | |||
| the handshake completes successfully. | QuicVersion initial_version; | |||
| o Connection Establishment in 0-RTT: Since low-latency connection | case encrypted_extensions: | |||
| establishment is a critical feature of QUIC, the QUIC handshake | QuicVersion supported_versions<2..2^8-4>; | |||
| protocol SHOULD attempt to achieve 0-RTT connection establishment | }; | |||
| latency for repeated connections between the same endpoints. | TransportParameter parameters<30..2^16-1>; | |||
| } TransportParameters; | ||||
| o Source Address Spoofing Defense: Since QUIC handles source address | Figure 6: Definition of TransportParameters | |||
| verification, the crypto protocol SHOULD NOT impose a separate | ||||
| source address verification mechanism. | ||||
| o Server Config Update: A QUIC server may refresh the source-address | The "extension_data" field of the quic_transport_parameters extension | |||
| token (STK) mid-connection, to update the information stored in | defined in [QUIC-TLS] contains a TransportParameters value. TLS | |||
| the STK at the client and to extend the period over which 0-RTT | encoding rules are therefore used to encode the transport parameters. | |||
| connections can be established by the client. | ||||
| o Certificate Compression: Early QUIC experience demonstrated that | QUIC encodes transport parameters into a sequence of octets, which | |||
| compressing certificates exchanged during a handshake is valuable | are then included in the cryptographic handshake. Once the handshake | |||
| in reducing latency. This additionally helps to reduce the | completes, the transport parameters declared by the peer are | |||
| amplification attack footprint when a server sends a large set of | available. Each endpoint validates the value provided by its peer. | |||
| certificates, which is not uncommon with TLS. The crypto protocol | In particular, version negotiation MUST be validated (see | |||
| SHOULD compress certificates and any other information to minimize | Section 7.3.4) before the connection establishment is considered | |||
| the number of packets sent during a handshake. | properly complete. | |||
| 6.2.4. Version Negotiation Validation | Definitions for each of the defined transport parameters are included | |||
| in Section 7.3.1. | ||||
| The following information used during the QUIC handshake MUST be | 7.3.1. Transport Parameter Definitions | |||
| cryptographically verified by the crypto handshake protocol: | ||||
| o Client's originally proposed version in its first packet. | An endpoint MUST include the following parameters in its encoded | |||
| TransportParameters: | ||||
| o Server's version list in it's Version Negotiation packet, if one | stream_fc_offset (0x0000): The initial stream level flow control | |||
| was sent. | offset parameter is encoded as an unsigned 32-bit integer in units | |||
| of octets. The sender of this parameter indicates that the flow | ||||
| control offset for all stream data sent toward it is this value. | ||||
| 6.3. Connection Migration | connection_fc_offset (0x0001): The connection level flow control | |||
| offset parameter contains the initial connection flow control | ||||
| window encoded as an unsigned 32-bit integer in units of 1024 | ||||
| octets. That is, the value here is multiplied by 1024 to | ||||
| determine the actual flow control offset. The sender of this | ||||
| parameter sets the byte offset for connection level flow control | ||||
| to this value. This is equivalent to sending a WINDOW_UPDATE | ||||
| (Section 8.3) for the connection immediately after completing the | ||||
| handshake. | ||||
| concurrent_streams (0x0002): The maximum number of concurrent | ||||
| streams parameter is encoded as an unsigned 32-bit integer. | ||||
| idle_timeout (0x0003): The idle timeout is a value in seconds that | ||||
| is encoded as an unsigned 16-bit integer. The maximum value is | ||||
| 600 seconds (10 minutes). | ||||
| An endpoint MAY use the following transport parameters: | ||||
| truncate_connection_id (0x0004): The truncated connection identifier | ||||
| parameter indicates that packets sent to the peer can omit the | ||||
| connection ID. This can be used by an endpoint where the 5-tuple | ||||
| is sufficient to identify a connection. This parameter is zero | ||||
| length. Omitting the parameter indicates that the endpoint relies | ||||
| on the connection ID being present in every packet. | ||||
| 7.3.2. Values of Transport Parameters for 0-RTT | ||||
| Transport parameters from the server SHOULD be remembered by the | ||||
| client for use with 0-RTT data. A client that doesn't remember | ||||
| values from a previous connection can instead assume the following | ||||
| values: stream_fc_offset (65535), connection_fc_offset (65535), | ||||
| concurrent_streams (10), idle_timeout (600), truncate_connection_id | ||||
| (absent). | ||||
| If assumed values change as a result of completing the handshake, the | ||||
| client is expected to respect the new values. This introduces some | ||||
| potential problems, particularly with respect to transport parameters | ||||
| that establish limits: | ||||
| o A client might exceed a newly declared connection or stream flow | ||||
| control limit with 0-RTT data. If this occurs, the client ceases | ||||
| transmission as though the flow control limit was reached. Once | ||||
| WINDOW_UPDATE frames indicating an increase to the affected flow | ||||
| control offsets is received, the client can recommence sending. | ||||
| o Similarly, a client might exceed the concurrent stream limit | ||||
| declared by the server. A client MUST reset any streams that | ||||
| exceed this limit. A server SHOULD reset any streams it cannot | ||||
| handle with a code that allows the client to retry any application | ||||
| action bound to those streams. | ||||
| A server MAY close a connection if remembered or assumed 0-RTT | ||||
| transport parameters cannot be supported, using an error code that is | ||||
| appropriate to the specific condition. For example, a | ||||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA might be used to indicate | ||||
| that exceeding flow control limits caused the error. A client that | ||||
| has a connection closed due to an error condition SHOULD NOT attempt | ||||
| 0-RTT when attempting to create a new connection. | ||||
| 7.3.3. New Transport Parameters | ||||
| New transport parameters can be used to negotiate new protocol | ||||
| behavior. An endpoint MUST ignore transport parameters that it does | ||||
| not support. Absence of a transport parameter therefore disables any | ||||
| optional protocol feature that is negotiated using the parameter. | ||||
| The definition of a transport parameter SHOULD include a default | ||||
| value that a client can use when establishing a new connection. If | ||||
| no default is specified, the value can be assumed to be absent when | ||||
| attempting 0-RTT. | ||||
| New transport parameters can be registered according to the rules in | ||||
| Section 14.1. | ||||
| 7.3.4. Version Negotiation Validation | ||||
| The transport parameters include three fields that encode version | ||||
| information. These retroactively authenticate the version | ||||
| negotiation (see Section 7.1) that is performed prior to the | ||||
| cryptographic handshake. | ||||
| The cryptographic handshake provides integrity protection for the | ||||
| negotiated version as part of the transport parameters (see | ||||
| Section 7.3). As a result, modification of version negotiation | ||||
| packets by an attacker can be detected. | ||||
| The client includes two fields in the transport parameters: | ||||
| o The negotiated_version is the version that was finally selected | ||||
| for use. This MUST be identical to the value that is on the | ||||
| packet that carries the ClientHello. A server that receives a | ||||
| negotiated_version that does not match the version of QUIC that is | ||||
| in use MUST terminate the connection with a | ||||
| QUIC_VERSION_NEGOTIATION_MISMATCH error code. | ||||
| o The initial_version is the version that the client initially | ||||
| attempted to use. If the server did not send a version | ||||
| negotiation packet Section 5.3, this will be identical to the | ||||
| negotiated_version. | ||||
| A server that processes all packets in a stateful fashion can | ||||
| remember how version negotiation was performed and validate the | ||||
| initial_version value. | ||||
| A server that does not maintain state for every packet it receives | ||||
| (i.e., a stateless server) uses a different process. If the initial | ||||
| and negotiated versions are the same, a stateless server can accept | ||||
| the value. | ||||
| If the initial version is different from the negotiated_version, a | ||||
| stateless server MUST check that it would have sent a version | ||||
| negotiation packet if it had received a packet with the indicated | ||||
| initial_version. If a server would have accepted the version | ||||
| included in the initial_version and the value differs from the value | ||||
| of negotiated_version, the server MUST terminate the connection with | ||||
| a QUIC_VERSION_NEGOTIATION_MISMATCH error. | ||||
| The server includes a list of versions that it would send in any | ||||
| version negotiation packet (Section 5.3) in supported_versions. This | ||||
| value is set even if it did not send a version negotiation packet. | ||||
| The client can validate that the negotiated_version is included in | ||||
| the supported_versions list and - if version negotiation was | ||||
| performed - that it would have selected the negotiated version. A | ||||
| client MUST terminate the connection with a | ||||
| QUIC_VERSION_NEGOTIATION_MISMATCH error code if the | ||||
| negotiated_version value is not included in the supported_versions | ||||
| list. A client MUST terminate with a | ||||
| QUIC_VERSION_NEGOTIATION_MISMATCH error code if version negotiation | ||||
| occurred but it would have selected a different version based on the | ||||
| value of the supported_versions list. | ||||
| 7.4. Proof of Source Address Ownership | ||||
| Transport protocols commonly spend a round trip checking that a | ||||
| client owns the transport address (IP and port) that it claims. | ||||
| Verifying that a client can receive packets sent to its claimed | ||||
| transport address protects against spoofing of this information by | ||||
| malicious clients. | ||||
| This technique is used primarily to avoid QUIC from being used for | ||||
| traffic amplification attack. In such an attack, a packet is sent to | ||||
| a server with spoofed source address information that identifies a | ||||
| victim. If a server generates more or larger packets in response to | ||||
| that packet, the attacker can use the server to send more data toward | ||||
| the victim than it would be able to send on its own. | ||||
| Several methods are used in QUIC to mitigate this attack. Firstly, | ||||
| the initial handshake packet from a client is padded to at least 1280 | ||||
| octets. This allows a server to send a similar amount of data | ||||
| without risking causing an amplication attack toward an unproven | ||||
| remote address. | ||||
| A server eventually confirms that a client has received its messages | ||||
| when the cryptographic handshake successfully completes. This might | ||||
| be insufficient, either because the server wishes to avoid the | ||||
| computational cost of completing the handshake, or it might be that | ||||
| the size of the packets that are sent during the handshake is too | ||||
| large. This is especially important for 0-RTT, where the server | ||||
| might wish to provide application data traffic - such as a response | ||||
| to a request - in response to the data carried in the early data from | ||||
| the client. | ||||
| To send additional data prior to completing the cryptographic | ||||
| handshake, the server then needs to validate that the client owns the | ||||
| address that it claims. | ||||
| Source address validation is therefore performed during the | ||||
| establishment of a connection. TLS provides the tools that support | ||||
| the feature, but basic validation is performed by the core transport | ||||
| protocol. | ||||
| 7.4.1. Client Address Validation Procedure | ||||
| QUIC uses token-based address validation. Any time the server wishes | ||||
| to validate a client address, it provides the client with a token. | ||||
| As long as the token cannot be easily guessed (see Section 7.4.3), if | ||||
| the client is able to return that token, it proves to the server that | ||||
| it received the token. | ||||
| During the processing of the cryptographic handshake messages from a | ||||
| client, TLS will request that QUIC make a decision about whether to | ||||
| proceed based on the information it has. TLS will provide QUIC with | ||||
| any token that was provided by the client. For an initial packet, | ||||
| QUIC can decide to abort the connection, allow it to proceed, or | ||||
| request address validation. | ||||
| If QUIC decides to request address validation, it provides the | ||||
| cryptographic handshake with a token. The contents of this token are | ||||
| consumed by the server that generates the token, so there is no need | ||||
| for a single well-defined format. A token could include information | ||||
| about the claimed client address (IP and port), a timestamp, and any | ||||
| other supplementary information the server will need to validate the | ||||
| token in the future. | ||||
| The cryptographic handshake is responsible for enacting validation by | ||||
| sending the address validation token to the client. A legitimate | ||||
| client will include a copy of the token when it attempts to continue | ||||
| the handshake. The cryptographic handshake extracts the token then | ||||
| asks QUIC a second time whether the token is acceptable. In | ||||
| response, QUIC can either abort the connection or permit it to | ||||
| proceed. | ||||
| A connection MAY be accepted without address validation - or with | ||||
| only limited validation - but a server SHOULD limit the data it sends | ||||
| toward an unvalidated address. Successful completion of the | ||||
| cryptographic handshake implicitly provides proof that the client has | ||||
| received packets from the server. | ||||
| 7.4.2. Address Validation on Session Resumption | ||||
| A server MAY provide clients with an address validation token during | ||||
| one connection that can be used on a subsequent connection. Address | ||||
| validation is especially important with 0-RTT because a server | ||||
| potentially sends a significant amount of data to a client in | ||||
| response to 0-RTT data. | ||||
| A different type of token is needed when resuming. Unlike the token | ||||
| that is created during a handshake, there might be some time between | ||||
| when the token is created and when the token is subsequently used. | ||||
| Thus, a resumption token SHOULD include an expiration time. It is | ||||
| also unlikely that the client port number is the same on two | ||||
| different connections; validating the port is therefore unlikely to | ||||
| be successful. | ||||
| This token can be provided to the cryptographic handshake immediately | ||||
| after establishing a connection. QUIC might also generate an updated | ||||
| token if significant time passes or the client address changes for | ||||
| any reason (see Section 7.5). The cryptographic handshake is | ||||
| responsible for providing the client with the token. In TLS the | ||||
| token is included in the ticket that is used for resumption and | ||||
| 0-RTT, which is carried in a NewSessionTicket message. | ||||
| 7.4.3. Address Validation Token Integrity | ||||
| An address validation token MUST be difficult to guess. Including a | ||||
| large enough random value in the token would be sufficient, but this | ||||
| depends on the server remembering the value it sends to clients. | ||||
| A token-based scheme allows the server to offload any state | ||||
| associated with validation to the client. For this design to work, | ||||
| the token MUST be covered by integrity protection against | ||||
| modification or falsification by clients. Without integrity | ||||
| protection, malicious clients could generate or guess values for | ||||
| tokens that would be accepted by the server. Only the server | ||||
| requires access to the integrity protection key for tokens. | ||||
| In TLS the address validation token is often bundled with the | ||||
| information that TLS requires, such as the resumption secret. In | ||||
| this case, adding integrity protection can be delegated to the | ||||
| cryptographic handshake protocol, avoiding redundant protection. If | ||||
| integrity protection is delegated to the cryptographic handshake, an | ||||
| integrity failure will result in immediate cryptographic handshake | ||||
| failure. If integrity protection is performed by QUIC, QUIC MUST | ||||
| abort the connection if the integrity check fails with a | ||||
| QUIC_ADDRESS_VALIDATION_FAILURE error code. | ||||
| 7.5. Connection Migration | ||||
| QUIC connections are identified by their 64-bit Connection ID. | QUIC connections are identified by their 64-bit Connection ID. | |||
| QUIC's consistent connection ID allows connections to survive changes | QUIC's consistent connection ID allows connections to survive changes | |||
| to the client's IP and/or port, such as those caused by client or | to the client's IP and/or port, such as those caused by client or | |||
| server migrating to a new network. QUIC also provides automatic | server migrating to a new network. QUIC also provides automatic | |||
| cryptographic verification of a rebound client, since the client | cryptographic verification of a client which has changed its IP | |||
| continues to use the same session key for encrypting and decrypting | address because the client continues to use the same session key for | |||
| packets. | encrypting and decrypting packets. | |||
| DISCUSS: Simultaneous migration. Is this reasonable? | DISCUSS: Simultaneous migration. Is this reasonable? | |||
| TODO: Perhaps move mitigation techniques from Security Considerations | TODO: Perhaps move mitigation techniques from Security Considerations | |||
| here. | here. | |||
| 6.4. Connection Termination | 7.6. Connection Termination | |||
| Connections should remain open until they become idle for a pre- | Connections should remain open until they become idle for a pre- | |||
| negotiated period of time. A QUIC connection, once established, can | negotiated period of time. A QUIC connection, once established, can | |||
| be terminated in one of three ways: | be terminated in one of three ways: | |||
| 1. Explicit Shutdown: An endpoint sends a CONNECTION_CLOSE frame to | 1. Explicit Shutdown: An endpoint sends a CONNECTION_CLOSE frame to | |||
| the peer initiating a connection termination. An endpoint may | initiate a connection termination. An endpoint may send a GOAWAY | |||
| send a GOAWAY frame to the peer prior to a CONNECTION_CLOSE to | frame to the peer prior to a CONNECTION_CLOSE to indicate that | |||
| indicate that the connection will soon be terminated. A GOAWAY | the connection will soon be terminated. A GOAWAY frame signals | |||
| frame signals to the peer that any active streams will continue | to the peer that any active streams will continue to be | |||
| to be processed, but the sender of the GOAWAY will not initiate | processed, but the sender of the GOAWAY will not initiate any | |||
| any additional streams and will not accept any new incoming | additional streams and will not accept any new incoming streams. | |||
| streams. On termination of the active streams, a | On termination of the active streams, a CONNECTION_CLOSE may be | |||
| CONNECTION_CLOSE may be sent. If an endpoint sends a | sent. If an endpoint sends a CONNECTION_CLOSE frame while | |||
| CONNECTION_CLOSE frame while unterminated streams are active (no | unterminated streams are active (no FIN bit or RST_STREAM frames | |||
| FIN bit or RST_STREAM frames have been sent or received for one | have been sent or received for one or more streams), then the | |||
| or more streams), then the peer must assume that the streams were | peer must assume that the streams were incomplete and were | |||
| incomplete and were abnormally terminated. | abnormally terminated. | |||
| 2. Implicit Shutdown: The default idle timeout for a QUIC connection | 2. Implicit Shutdown: The default idle timeout for a QUIC connection | |||
| is 30 seconds, and is a required parameter (ICSL) in connection | is 30 seconds, and is a required parameter in connection | |||
| negotiation. The maximum is 10 minutes. If there is no network | negotiation. The maximum is 10 minutes. If there is no network | |||
| activity for the duration of the idle timeout, the connection is | activity for the duration of the idle timeout, the connection is | |||
| closed. By default a CONNECTION_CLOSE frame will be sent. A | closed. By default a CONNECTION_CLOSE frame will be sent. A | |||
| silent close option can be enabled when it is expensive to send | silent close option can be enabled when it is expensive to send | |||
| an explicit close, such as mobile networks that must wake up the | an explicit close, such as mobile networks that must wake up the | |||
| radio. | radio. | |||
| 3. Abrupt Shutdown: An endpoint may send a Public Reset packet at | 3. Abrupt Shutdown: An endpoint may send a Public Reset packet at | |||
| any time during the connection to abruptly terminate an active | any time during the connection to abruptly terminate an active | |||
| connection. A Public Reset packet SHOULD only be used as a final | connection. A Public Reset packet SHOULD only be used as a final | |||
| skipping to change at page 20, line 44 ¶ | skipping to change at page 31, line 5 ¶ | |||
| reboots mid-connection and loses any cryptographic state | reboots mid-connection and loses any cryptographic state | |||
| associated with open connections, and then receives a packet on | associated with open connections, and then receives a packet on | |||
| an open connection, it should send a Public Reset packet in | an open connection, it should send a Public Reset packet in | |||
| return. (TODO: articulate rules around when a public reset | return. (TODO: articulate rules around when a public reset | |||
| should be sent.) | should be sent.) | |||
| TODO: Connections that are terminated are added to a TIME_WAIT list | TODO: Connections that are terminated are added to a TIME_WAIT list | |||
| at the server, so as to absorb any straggler packets in the network. | at the server, so as to absorb any straggler packets in the network. | |||
| Discuss TIME_WAIT list. | Discuss TIME_WAIT list. | |||
| 7. Frame Types and Formats | 8. Frame Types and Formats | |||
| As described in Section 8, Regular packets contain one or more | As described in Section 6, Regular packets contain one or more | |||
| frames. We now describe the various QUIC frame types that can be | frames. We now describe the various QUIC frame types that can be | |||
| present in a Regular packet. The use of these frames and various | present in a Regular packet. The use of these frames and various | |||
| frame header bits are described in subsequent sections. | frame header bits are described in subsequent sections. | |||
| 7.1. STREAM Frame | 8.1. STREAM Frame | |||
| STREAM frames implicitly create a stream and carry stream data. The | STREAM frames implicitly create a stream and carry stream data. The | |||
| type byte for a STREAM frame contains embedded flags, and is | type byte for a STREAM frame contains embedded flags, and is | |||
| formatted as "1FDOOOSS". These bits are parsed as follows: | formatted as "1FDOOOSS". These bits are parsed as follows: | |||
| o The leftmost bit must be set to 1, indicating that this is a | o The leftmost bit must be set to 1, indicating that this is a | |||
| STREAM frame. | STREAM frame. | |||
| o "F" is the FIN bit, which is used for stream termination. | o "F" is the FIN bit, which is used for stream termination. | |||
| skipping to change at page 21, line 36 ¶ | skipping to change at page 31, line 43 ¶ | |||
| o The "SS" bits encode the length of the Stream ID header field as | o The "SS" bits encode the length of the Stream ID header field as | |||
| 8, 16, 24, or 32 bits. (DISCUSS: Consider making this 8, 16, 32, | 8, 16, 24, or 32 bits. (DISCUSS: Consider making this 8, 16, 32, | |||
| 64.) | 64.) | |||
| A STREAM frame is shown below. | A STREAM frame is shown below. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Data Length (16)] | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (8/16/24/32) ... | | Stream ID (8/16/24/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (0/16/24/32/40/48/56/64) ... | | Offset (0/16/24/32/40/48/56/64) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Data Length (16)] | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream Data (*) ... | | Stream Data (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: STREAM Frame Format | Figure 7: STREAM Frame Format | |||
| The STREAM frame contains the following fields: | The STREAM frame contains the following fields: | |||
| o Stream ID: A variable-sized unsigned ID unique to this stream, | Data Length: An optional 16-bit unsigned number specifying the | |||
| whose size is determined by the "SS" bits in the type byte. | length of the Stream Data field in this STREAM frame. This field | |||
| is present when the "D" bit is set to 1. | ||||
| o Offset: A variable-sized unsigned number specifying the byte | Stream ID: A variable-sized unsigned ID unique to this stream. | |||
| offset in the stream for the data in this STREAM frame. The first | ||||
| byte in the stream has an offset of 0. | ||||
| o Data Length: An optional 16-bit unsigned number specifying the | Offset: A variable-sized unsigned number specifying the byte offset | |||
| length of the Stream Data field in this STREAM frame. | in the stream for the data in this STREAM frame. The first byte | |||
| in the stream has an offset of 0. The largest offset delivered on | ||||
| a stream - the sum of the re-constructed offset and data length - | ||||
| MUST be less than 2^64. | ||||
| o Stream Data: The bytes from the designated stream to be delivered. | Stream Data: The bytes from the designated stream to be delivered. | |||
| A STREAM frame MUST have either non-zero data length or the FIN bit | A STREAM frame MUST have either non-zero data length or the FIN bit | |||
| set. | set. | |||
| Stream multiplexing is achieved by interleaving STREAM frames from | Stream multiplexing is achieved by interleaving STREAM frames from | |||
| multiple streams into one or more QUIC packets. A single QUIC packet | multiple streams into one or more QUIC packets. A single QUIC packet | |||
| MAY bundle STREAM frames from multiple streams. | MAY bundle STREAM frames from multiple streams. | |||
| Implementation note: One of the benefits of QUIC is avoidance of | Implementation note: One of the benefits of QUIC is avoidance of | |||
| head-of-line blocking across multiple streams. When a packet loss | head-of-line blocking across multiple streams. When a packet loss | |||
| occurs, only streams with data in that packet are blocked waiting for | occurs, only streams with data in that packet are blocked waiting for | |||
| a retransmission to be received, while other streams can continue | a retransmission to be received, while other streams can continue | |||
| making progress. Note that when data from multiple streams is | making progress. Note that when data from multiple streams is | |||
| bundled into a single QUIC packet, loss of that packet blocks all | bundled into a single QUIC packet, loss of that packet blocks all | |||
| those streams from making progress. An implementation is therefore | those streams from making progress. An implementation is therefore | |||
| advised to bundle as few streams as necessary in outgoing packets | advised to bundle as few streams as necessary in outgoing packets | |||
| without losing transmission efficiency to underfilled packets. | without losing transmission efficiency to underfilled packets. | |||
| 7.2. ACK Frame | 8.2. ACK Frame | |||
| Receivers send ACK frames to inform senders which packets they have | Receivers send ACK frames to inform senders which packets they have | |||
| received, as well as which packets are considered missing. The ACK | received and processed, as well as which packets are considered | |||
| frame contains between 1 and 256 ack blocks. Ack blocks are ranges | missing. The ACK frame contains between 1 and 256 ACK blocks. ACK | |||
| of acknowledged packets. | blocks are ranges of acknowledged packets. | |||
| To limit the ACK blocks to the ones that haven't yet been received by | To limit ACK blocks to those that have not yet been received by the | |||
| the sender, the sender periodically sends STOP_WAITING frames that | sender, the receiver SHOULD track which ACK frames have been | |||
| signal the receiver to stop acking packets below a specified sequence | acknowledged by its peer. Once an ACK frame has been acknowledged, | |||
| number, raising the "least unacked" packet number at the receiver. A | the packets it acknowledges SHOULD not be acknowledged again. To | |||
| sender of an ACK frame thus reports only those ACK blocks between the | handle cases where the receiver is only sending ACK frames, and hence | |||
| received least unacked and the reported largest observed packet | will not receive acknowledgments for its packets, it MAY send a PING | |||
| numbers. An endpoint SHOULD use the "Largest Acked" packet number it | frame at most once per RTT to explicitly request acknowledgment. | |||
| received to calculate the "Least Unacked Delta" value in any | ||||
| STOP_WAITING frame it might send. | ||||
| Unlike TCP SACKs, QUIC ACK blocks are irrevocable. Once a packet is | To limit receiver state or the size of ACK frames, a receiver MAY | |||
| acked, even if it does not appear in a future ACK frame, it is | limit the number of ACK blocks it sends. A receiver can do this even | |||
| assumed to be acked. | without receiving acknowledgment of its ACK frames, with the | |||
| knowledge this could cause the sender to unnecessarily retransmit | ||||
| some data. | ||||
| Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore | ||||
| irrevocable. Once a packet has been acknowledged, even if it does | ||||
| not appear in a future ACK frame, it is assumed to be acknowledged. | ||||
| QUIC ACK frames contain a timestamp section with up to 255 | ||||
| timestamps. Timestamps enable better congestion control, but are not | ||||
| required for correct loss recovery, and old timestamps are less | ||||
| valuable, so it is not guaranteed every timestamp will be received by | ||||
| the sender. A receiver SHOULD send a timestamp exactly once for each | ||||
| received packet containing retransmittable frames. A receiver MAY | ||||
| send timestamps for non-retransmittable packets. | ||||
| A sender MAY intentionally skip packet numbers to introduce entropy | A sender MAY intentionally skip packet numbers to introduce entropy | |||
| into the connection, to avoid opportunistic ack attacks. The sender | into the connection, to avoid opportunistic acknowledgement attacks. | |||
| MUST close the connection if an unsent packet number is acked. The | The sender MUST close the connection if an unsent packet number is | |||
| format of the ACK frame is efficient at expressing blocks of missing | acknowledged. The format of the ACK frame is efficient at expressing | |||
| packets; skipping packet numbers between 1 and 255 effectively | blocks of missing packets; skipping packet numbers between 1 and 255 | |||
| provides up to 8 bits of efficient entropy on demand, which should be | effectively provides up to 8 bits of efficient entropy on demand, | |||
| adequate protection against most opportunistic ack attacks. | which should be adequate protection against most opportunistic | |||
| acknowledgement attacks. | ||||
| The type byte for a ACK frame contains embedded flags, and is | The type byte for a ACK frame contains embedded flags, and is | |||
| formatted as "01NULLMM". These bits are parsed as follows: | formatted as "01NULLMM". These bits are parsed as follows: | |||
| o The first two bits must be set to 01 indicating that this is an | o The first two bits must be set to 01 indicating that this is an | |||
| ACK frame. | ACK frame. | |||
| o The "N" bit indicates whether the frame has more than 1 ack range | o The "N" bit indicates whether the frame has more than 1 range of | |||
| (i.e., whether the Ack Block Section contains a Num Blocks field). | acknowledged packets (i.e., whether the ACK Block Section contains | |||
| a Num Blocks field). | ||||
| o The "U" bit is unused and MUST be set to zero. | o The "U" bit is unused and MUST be set to zero. | |||
| o The two "LL" bits encode the length of the Largest Acked field as | o The two "LL" bits encode the length of the Largest Acknowledged | |||
| 1, 2, 4, or 6 bytes long. | field as 1, 2, 4, or 6 bytes long. | |||
| o The two "MM" bits encode the length of the Ack Block Length fields | o The two "MM" bits encode the length of the ACK Block Length fields | |||
| as 1, 2, 4, or 6 bytes long. | as 1, 2, 4, or 6 bytes long. | |||
| An ACK frame is shown below. | An ACK frame is shown below. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Largest Acked (8/16/32/48) ... | |[Num Blocks(8)]| NumTS (8) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Ack Delay (16) | | | Largest Acknowledged (8/16/32/48) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |[Num Blocks(8)]| Ack Block Section (*) ... | | ACK Delay (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | NumTS (8) | Timestamp Section (*) ... | | ACK Block Section (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Timestamp Section (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: ACK Frame Format | Figure 8: ACK Frame Format | |||
| The fields in the ACK frame are as follows: | The fields in the ACK frame are as follows: | |||
| o Largest Acked: A variable-sized unsigned value representing the | Num Blocks (opt): An optional 8-bit unsigned value specifying the | |||
| largest packet number the peer is acking in this packet (typically | number of additional ACK blocks (besides the required First ACK | |||
| the largest that the peer has seen thus far.) | Block) in this ACK frame. Only present if the 'N' flag bit is 1. | |||
| o Ack Delay: Time from when the largest acked, as indicated in the | Num Timestamps: An unsigned 8-bit number specifying the total number | |||
| Largest Acked field, was received by this peer to when this ack | of <packet number, timestamp> pairs in the Timestamp Section. | |||
| was sent. | ||||
| o Num Blocks (opt): An optional 8-bit unsigned value specifying the | Largest Acknowledged: A variable-sized unsigned value representing | |||
| number of additional ack blocks (besides the required First Ack | the largest packet number the peer is acknowledging in this packet | |||
| Block) in this ACK frame. Only present if the 'N' flag bit is 1. | (typically the largest that the peer has seen thus far.) | |||
| o Ack Block Section: Contains one or more blocks of packet numbers | ACK Delay: The time from when the largest acknowledged packet, as | |||
| which have been successfully received. See Section 7.2.1. | indicated in the Largest Acknowledged field, was received by this | |||
| peer to when this ACK was sent. | ||||
| o Num Timestamps: An unsigned 8-bit number specifying the total | ACK Block Section: Contains one or more blocks of packet numbers | |||
| number of <packet number, timestamp> pairs in the Timestamp | which have been successfully received, see Section 8.2.1. | |||
| Section. | ||||
| o Timestamp Section: Contains zero or more timestamps reporting | Timestamp Section: Contains zero or more timestamps reporting | |||
| transit delay of received packets. See Section 7.2.2. | transit delay of received packets. See Section 8.2.2. | |||
| 7.2.1. Ack Block Section | 8.2.1. ACK Block Section | |||
| The Ack Block Section contains between one and 256 blocks of packet | The ACK Block Section contains between one and 256 blocks of packet | |||
| numbers which have been successfully received. If the Num Blocks | numbers which have been successfully received. If the Num Blocks | |||
| field is absent, only the First Ack Block length is present in this | field is absent, only the First ACK Block length is present in this | |||
| section. Otherwise, the Num Blocks field indicates how many | section. Otherwise, the Num Blocks field indicates how many | |||
| additional blocks follow the First Ack Block Length field. | additional blocks follow the First ACK Block Length field. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | First Ack Block Length (8/16/32/48) ... | | First ACK Block Length (8/16/32/48) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap 1 (8)] | [Ack Block 1 Length (8/16/32/48)] ... | | [Gap 1 (8)] | [ACK Block 1 Length (8/16/32/48)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap 2 (8)] | [Ack Block 2 Length (8/16/32/48)] ... | | [Gap 2 (8)] | [ACK Block 2 Length (8/16/32/48)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap N (8)] | [Ack Block N Length (8/16/32/48)] ... | | [Gap N (8)] | [ACK Block N Length (8/16/32/48)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: Ack Block Section | Figure 9: ACK Block Section | |||
| The fields in the Ack Block Section are: | The fields in the ACK Block Section are: | |||
| o First Ack Block Length: An unsigned packet number delta that | First ACK Block Length: An unsigned packet number delta that | |||
| indicates the number of contiguous additional packets being acked | indicates the number of contiguous additional packets being | |||
| starting at the Largest Acked. | acknowledged starting at the Largest Acknowledged. | |||
| o Gap To Next Block (opt, repeated): An unsigned number specifying | Gap To Next Block (opt, repeated): An unsigned number specifying the | |||
| the number of contiguous missing packets from the end of the | number of contiguous missing packets from the end of the previous | |||
| previous ack block to the start of the next. | ACK block to the start of the next. Repeated "Num Blocks" times. | |||
| o Ack Block Length (opt, repeated): An unsigned packet number delta | ACK Block Length (opt, repeated): An unsigned packet number delta | |||
| that indicates the number of contiguous packets being acked | that indicates the number of contiguous packets being acknowledged | |||
| starting after the end of the previous gap. Along with the | starting after the end of the previous gap. Repeated "Num Blocks" | |||
| previous field, this field is repeated "Num Blocks" times. | times. | |||
| 7.2.2. Timestamp Section | 8.2.2. Timestamp Section | |||
| The Timestamp Section contains between zero and 255 measurements of | The Timestamp Section contains between zero and 255 measurements of | |||
| packet receive times relative to the beginning of the connection. | packet receive times relative to the beginning of the connection. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| | [Delta LA (8)]| | | [Delta LA (8)]| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [First Timestamp (32)] | | | [First Timestamp (32)] | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |[Delta LA 1(8)]| [Time Since Previous 1 (16)] | | |[Delta LA 1(8)]| [Time Since Previous 1 (16)] | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |[Delta LA 2(8)]| [Time Since Previous 2 (16)] | | |[Delta LA 2(8)]| [Time Since Previous 2 (16)] | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |[Delta LA N(8)]| [Time Since Previous N (16)] | | |[Delta LA N(8)]| [Time Since Previous N (16)] | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: Timestamp Section | Figure 10: Timestamp Section | |||
| The fields in the Timestamp Section are: | The fields in the Timestamp Section are: | |||
| o Delta Largest Acked (opt): An optional 8-bit unsigned packet | Delta Largest Acknowledged (opt): An optional 8-bit unsigned packet | |||
| number delta specifying the delta between the largest acked and | number delta specifying the delta between the largest acknowledged | |||
| the first packet whose timestamp is being reported. In other | and the first packet whose timestamp is being reported. In other | |||
| words, this first packet number may be computed as (Largest Acked | words, this first packet number may be computed as (Largest | |||
| - Delta Largest Acked.) | Acknowledged - Delta Largest Acknowledged.) | |||
| o First Timestamp (opt): An optional 32-bit unsigned value | First Timestamp (opt): An optional 32-bit unsigned value specifying | |||
| specifying the time delta in microseconds, from the beginning of | the time delta in microseconds, from the beginning of the | |||
| the connection to the arrival of the packet indicated by Delta | connection to the arrival of the packet indicated by Delta Largest | |||
| Largest Acked. | Acknowledged. | |||
| o Delta Largest Acked 1..N (opt, repeated): (Same as above.) | Delta Largest Acked 1..N (opt, repeated): This field has the same | |||
| o Time Since Previous Timestamp 1..N(opt, repeated): An optional | semantics and format as "Delta Largest Acknowledged". Repeated | |||
| "Num Timestamps - 1" times. | ||||
| Time Since Previous Timestamp 1..N(opt, repeated): An optional | ||||
| 16-bit unsigned value specifying time delta from the previous | 16-bit unsigned value specifying time delta from the previous | |||
| reported timestamp. It is encoded in the same format as the Ack | reported timestamp. It is encoded in the same format as the ACK | |||
| Delay. Along with the previous field, this field is repeated "Num | Delay. Repeated "Num Timestamps - 1" times. | |||
| Timestamps" times. | ||||
| 7.2.2.1. Time Format | The timestamp section lists packet receipt timestamps ordered by | |||
| timestamp. | ||||
| 8.2.2.1. Time Format | ||||
| DISCUSS_AND_REPLACE: Perhaps make this format simpler. | DISCUSS_AND_REPLACE: Perhaps make this format simpler. | |||
| The time format used in the ACK frame above is a 16-bit unsigned | The time format used in the ACK frame above is a 16-bit unsigned | |||
| float with 11 explicit bits of mantissa and 5 bits of explicit | float with 11 explicit bits of mantissa and 5 bits of explicit | |||
| exponent, specifying time in microseconds. The bit format is loosely | exponent, specifying time in microseconds. The bit format is loosely | |||
| modeled after IEEE 754. For example, 1 microsecond is represented as | modeled after IEEE 754. For example, 1 microsecond is represented as | |||
| 0x1, which has an exponent of zero, presented in the 5 high order | 0x1, which has an exponent of zero, presented in the 5 high order | |||
| bits, and mantissa of 1, presented in the 11 low order bits. When | bits, and mantissa of 1, presented in the 11 low order bits. When | |||
| the explicit exponent is greater than zero, an implicit high-order | the explicit exponent is greater than zero, an implicit high-order | |||
| 12th bit of 1 is assumed in the mantissa. For example, a floating | 12th bit of 1 is assumed in the mantissa. For example, a floating | |||
| value of 0x800 has an explicit exponent of 1, as well as an explicit | value of 0x800 has an explicit exponent of 1, as well as an explicit | |||
| mantissa of 0, but then has an effective mantissa of 4096 (12th bit | mantissa of 0, but then has an effective mantissa of 4096 (12th bit | |||
| is assumed to be 1). Additionally, the actual exponent is one-less | is assumed to be 1). Additionally, the actual exponent is one-less | |||
| than the explicit exponent, and the value represents 4096 | than the explicit exponent, and the value represents 4096 | |||
| microseconds. Any values larger than the representable range are | microseconds. Any values larger than the representable range are | |||
| clamped to 0xFFFF. | clamped to 0xFFFF. | |||
| 7.3. STOP_WAITING Frame | 8.2.3. ACK Frames and Packet Protection | |||
| The STOP_WAITING frame (type=0x06) is sent to inform the peer that it | ACK frames that acknowledge protected packets MUST be carried in a | |||
| should not continue to wait for packets with packet numbers lower | packet that has an equivalent or greater level of packet protection. | |||
| than a specified value. The packet number is encoded in 1, 2, 4 or 6 | ||||
| bytes, using the same coding length as is specified for the packet | ||||
| number for the enclosing packet's header (specified in the QUIC Frame | ||||
| packet's Flags field.) The frame is as follows: | ||||
| 0 1 2 3 | Packets that are protected with 1-RTT keys MUST be acknowledged in | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | packets that are also protected with 1-RTT keys. | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Least Unacked Delta (8/16/32/48) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 11: STOP_WAITING Frame Format | A packet that is not protected and claims to acknowledge a packet | |||
| number that was sent with packet protection is not valid. An | ||||
| unprotected packet that carries acknowledgments for protected packets | ||||
| MUST be discarded in its entirety. | ||||
| The STOP_WAITING frame contains a single field: | Packets that a client sends with 0-RTT packet protection MUST be | |||
| acknowledged by the server in packets protected by 1-RTT keys. This | ||||
| can mean that the client is unable to use these acknowledgments if | ||||
| the server cryptographic handshake messages are delayed or lost. | ||||
| Note that the same limitation applies to other data sent by the | ||||
| server protected by the 1-RTT keys. | ||||
| o Least Unacked Delta: A variable-length packet number delta with | Unprotected packets, such as those that carry the initial | |||
| the same length as the packet header's packet number. Subtract it | cryptographic handshake messages, MAY be acknowledged in unprotected | |||
| from the complete packet number of the enclosing packet to | packets. Unprotected packets are vulnerable to falsification or | |||
| determine the least unacked packet number. The resulting least | modification. Unprotected packets can be acknowledged along with | |||
| unacked packet number is the earliest packet for which the sender | protected packets in a protected packet. | |||
| is still awaiting an ack. If the receiver is missing any packets | ||||
| earlier than this packet, the receiver SHOULD consider those | ||||
| packets to be irrecoverably lost and MUST NOT report those packets | ||||
| as missing in subsequent acks. | ||||
| 7.4. WINDOW_UPDATE Frame | An endpoint SHOULD acknowledge packets containing cryptographic | |||
| handshake messages in the next unprotected packet that it sends, | ||||
| unless it is able to acknowledge those packets in later packets | ||||
| protected by 1-RTT keys. At the completion of the cryptographic | ||||
| handshake, both peers send unprotected packets containing | ||||
| cryptographic handshake messages followed by packets protected by | ||||
| 1-RTT keys. An endpoint SHOULD acknowledge the unprotected packets | ||||
| that complete the cryptographic handshake in a protected packet, | ||||
| because its peer is guaranteed to have access to 1-RTT packet | ||||
| protection keys. | ||||
| For instance, a server acknowledges a TLS ClientHello in the packet | ||||
| that carries the TLS ServerHello; similarly, a client can acknowledge | ||||
| a TLS HelloRetryRequest in the packet containing a second TLS | ||||
| ClientHello. The complete set of server handshake messages (TLS | ||||
| ServerHello through to Finished) might be acknowledged by a client in | ||||
| protected packets, because it is certain that the server is able to | ||||
| decipher the packet. | ||||
| 8.3. WINDOW_UPDATE Frame | ||||
| The WINDOW_UPDATE frame (type=0x04) informs the peer of an increase | The WINDOW_UPDATE frame (type=0x04) informs the peer of an increase | |||
| in an endpoint's flow control receive window. The Stream ID can be | in an endpoint's flow control receive window for either a single | |||
| zero, indicating this WINDOW_UPDATE applies to the connection level | stream, or the entire connection as a whole. | |||
| flow control window, or non-zero, indicating that the specified | ||||
| stream should increase its flow control window. The frame is as | The frame is as follows: | |||
| follows: | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Byte Offset (64) + | + Flow Control Offset (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the WINDOW_UPDATE frame are as follows: | The fields in the WINDOW_UPDATE frame are as follows: | |||
| o Stream ID: ID of the stream whose flow control windows is being | Stream ID: ID of the stream whose flow control windows is being | |||
| updated, or 0 to specify the connection-level flow control window. | updated, or 0 to specify the connection-level flow control window. | |||
| o Byte offset: A 64-bit unsigned integer indicating the absolute | Flow Control Offset: A 64-bit unsigned integer indicating the flow | |||
| byte offset of data which can be sent on the given stream. In the | control offset for the given stream (for a stream ID other than 0) | |||
| case of connection level flow control, the cumulative number of | or the entire connection. | |||
| bytes which can be sent on all currently open streams. | ||||
| 7.5. BLOCKED Frame | The flow control offset is expressed in units of octets for | |||
| individual streams (for stream identifiers other than 0). | ||||
| The connection-level flow control offset is expressed in units of | ||||
| 1024 octets (for a stream identifier of 0). That is, the connection- | ||||
| level flow control offset is determined by multiplying the encoded | ||||
| value by 1024. | ||||
| An endpoint accounts for the maximum offset of data that is sent or | ||||
| received on a stream. Loss or reordering can mean that the maximum | ||||
| offset is greater than the total size of data received on a stream. | ||||
| Similarly, receiving STREAM frames might not increase the maximum | ||||
| offset on a stream. A STREAM frame with a FIN bit set or RST_STREAM | ||||
| causes the final offset for a stream to be fixed. | ||||
| The maximum data offset on a stream MUST NOT exceed the stream flow | ||||
| control offset advertised by the receiver. The sum of the maximum | ||||
| data offsets of all streams (including closed streams) MUST NOT | ||||
| exceed the connection flow control offset advertised by the receiver. | ||||
| An endpoint MUST terminate a connection with a | ||||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error if it receives more | ||||
| data than the largest flow control offset that it has sent, unless | ||||
| this is a result of a change in the initial offsets (see | ||||
| Section 7.3.2). | ||||
| 8.4. BLOCKED Frame | ||||
| A sender sends a BLOCKED frame (type=0x05) when it is ready to send | A sender sends a BLOCKED frame (type=0x05) when it is ready to send | |||
| data (and has data to send), but is currently flow control blocked. | data (and has data to send), but is currently flow control blocked. | |||
| BLOCKED frames are purely informational frames, but extremely useful | BLOCKED frames are purely informational frames, but extremely useful | |||
| for debugging purposes. A receiver of a BLOCKED frame should simply | for debugging purposes. A receiver of a BLOCKED frame should simply | |||
| discard it (after possibly printing a helpful log message). The | discard it (after possibly printing a helpful log message). The | |||
| frame is as follows: | frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The BLOCKED frame contains a single field: | The BLOCKED frame contains a single field: | |||
| o Stream ID: A 32-bit unsigned number indicating the stream which is | Stream ID: A 32-bit unsigned number indicating the stream which is | |||
| flow control blocked. A non-zero Stream ID field specifies the | flow control blocked. A non-zero Stream ID field specifies the | |||
| stream that is flow control blocked. When zero, the Stream ID | stream that is flow control blocked. When zero, the Stream ID | |||
| field indicates that the connection is flow control blocked. | field indicates that the connection is flow control blocked. | |||
| 7.6. RST_STREAM Frame | 8.5. RST_STREAM Frame | |||
| An endpoint may use a RST_STREAM frame (type=0x01) to abruptly | An endpoint may use a RST_STREAM frame (type=0x01) to abruptly | |||
| terminate a stream. The frame is as follows: | terminate a stream. The frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Byte Offset (64) + | + Final Offset (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields are: | The fields are: | |||
| o Stream ID: The 32-bit Stream ID of the stream being terminated. | Error code: A 32-bit error code which indicates why the stream is | |||
| being closed. | ||||
| o Byte offset: A 64-bit unsigned integer indicating the absolute | Stream ID: The 32-bit Stream ID of the stream being terminated. | |||
| byte offset of the end of data written on this stream by the | ||||
| RST_STREAM sender. | ||||
| o Error code: A 32-bit error code which indicates why the stream is | Final offset: A 64-bit unsigned integer indicating the absolute byte | |||
| being closed. | offset of the end of data written on this stream by the RST_STREAM | |||
| sender. | ||||
| 7.7. PADDING Frame | 8.6. PADDING Frame | |||
| The PADDING frame (type=0x00) pads a packet with 0x00 bytes. When | The PADDING frame (type=0x00) has no semantic value. PADDING frames | |||
| this frame is encountered, the rest of the packet is expected to be | can be used to increase the size of a packet. Padding can be used to | |||
| padding bytes. The frame contains 0x00 bytes and extends to the end | increase an initial client packet to the minimum required size, or to | |||
| of the QUIC packet. A PADDING frame has no additional fields. | provide protection against traffic analysis for protected packets. | |||
| 7.8. PING frame | A PADDING frame has no content. That is, a PADDING frame consists of | |||
| the single octet that identifies the frame as a PADDING frame. | ||||
| 8.7. PING frame | ||||
| Endpoints can use PING frames (type=0x07) to verify that their peers | Endpoints can use PING frames (type=0x07) to verify that their peers | |||
| are still alive or to check reachability to the peer. The PING frame | are still alive or to check reachability to the peer. The PING frame | |||
| contains no additional fields. The receiver of a PING frame simply | contains no additional fields. The receiver of a PING frame simply | |||
| needs to ACK the packet containing this frame. The PING frame SHOULD | needs to acknowledge the packet containing this frame. The PING | |||
| be used to keep a connection alive when a stream is open. The | frame SHOULD be used to keep a connection alive when a stream is | |||
| default is to send a PING frame after 15 seconds of quiescence. A | open. The default is to send a PING frame after 15 seconds of | |||
| PING frame has no additional fields. | quiescence. A PING frame has no additional fields. | |||
| 7.9. CONNECTION_CLOSE frame | 8.8. CONNECTION_CLOSE frame | |||
| An endpoint sends a CONNECTION_CLOSE frame (type=0x02) to notify its | An endpoint sends a CONNECTION_CLOSE frame (type=0x02) to notify its | |||
| peer that the connection is being closed. If there are open streams | peer that the connection is being closed. If there are open streams | |||
| that haven't been explicitly closed, they are implicitly closed when | that haven't been explicitly closed, they are implicitly closed when | |||
| the connection is closed. (Ideally, a GOAWAY frame would be sent | the connection is closed. (Ideally, a GOAWAY frame would be sent | |||
| with enough time that all streams are torn down.) The frame is as | with enough time that all streams are torn down.) The frame is as | |||
| follows: | follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | | Error Code (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase Length (16) | [Reason Phrase (*)] ... | | Reason Phrase Length (16) | [Reason Phrase (*)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields of a CONNECTION_CLOSE frame are as follows: | The fields of a CONNECTION_CLOSE frame are as follows: | |||
| o Error Code: A 32-bit error code which indicates the reason for | Error Code: A 32-bit error code which indicates the reason for | |||
| closing this connection. | closing this connection. | |||
| o Reason Phrase Length: A 16-bit unsigned number specifying the | Reason Phrase Length: A 16-bit unsigned number specifying the length | |||
| length of the reason phrase. This may be zero if the sender | of the reason phrase. This may be zero if the sender chooses to | |||
| chooses to not give details beyond the Error Code. | not give details beyond the Error Code. | |||
| o Reason Phrase: An optional human-readable explanation for why the | Reason Phrase: An optional human-readable explanation for why the | |||
| connection was closed. | connection was closed. | |||
| 7.10. GOAWAY Frame | 8.9. GOAWAY Frame | |||
| An endpoint may use a GOAWAY frame (type=0x03) to notify its peer | An endpoint uses a GOAWAY frame (type=0x03) to initiate a graceful | |||
| that the connection should stop being used, and will likely be closed | shutdown of a connection. The endpoints will continue to use any | |||
| in the future. The endpoints will continue using any active streams, | active streams, but the sender of the GOAWAY will not initiate or | |||
| but the sender of the GOAWAY will not initiate any additional | accept any additional streams beyond those indicated. The GOAWAY | |||
| streams, and will not accept any new streams. The frame is as | frame is as follows: | |||
| follows: | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (32) | | | Largest Client Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Last Good Stream ID (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase Length (16) | [Reason Phrase (*)] ... | | Largest Server Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields of a GOAWAY frame are as follows: | The fields of a GOAWAY frame are: | |||
| o Frame type: An 8-bit value that must be set to 0x03 specifying | Largest Client Stream ID: The highest-numbered, client-initiated | |||
| that this is a GOAWAY frame. | stream on which the endpoint sending the GOAWAY frame either sent | |||
| data, or received and delivered data. All higher-numbered, | ||||
| client-initiated streams (that is, odd-numbered streams) are | ||||
| implicitly reset by sending or receiving the GOAWAY frame. | ||||
| o Error Code: A 32-bit field error code which indicates the reason | Largest Server Stream ID: The highest-numbered, server-initiated | |||
| for closing this connection. | stream on which the endpoint sending the GOAWAY frame either sent | |||
| data, or received and delivered data. All higher-numbered, | ||||
| server-initiated streams (that is, even-numbered streams) are | ||||
| implicitly reset by sending or receiving the GOAWAY frame. | ||||
| o Last Good Stream ID: The last Stream ID which was accepted by the | A GOAWAY frame indicates that any application layer actions on | |||
| sender of the GOAWAY message. If no streams were replied to, this | streams with higher numbers than those indicated can be safely | |||
| value must be set to 0. | retried because no data was exchanged. An endpoint MUST set the | |||
| value of the Largest Client or Server Stream ID to be at least as | ||||
| high as the highest-numbered stream on which it either sent data or | ||||
| received and delivered data to the application protocol that uses | ||||
| QUIC. | ||||
| o Reason Phrase Length: A 16-bit unsigned number specifying the | An endpoint MAY choose a larger stream identifier if it wishes to | |||
| length of the reason phrase. This may be zero if the sender | allow for a number of streams to be created. This is especially | |||
| chooses to not give details beyond the error code. | valuable for peer-initiated streams where packets creating new | |||
| streams could be in transit; using a larger stream number allows | ||||
| those streams to complete. | ||||
| o Reason Phrase: An optional human-readable explanation for why the | In addition to initiating a graceful shutdown of a connection, GOAWAY | |||
| connection was closed. | MAY be sent immediately prior to sending a CONNECTION_CLOSE frame | |||
| that is sent as a result of detecting a fatal error. Higher-numbered | ||||
| streams than those indicated in the GOAWAY frame can then be retried. | ||||
| 8. Packetization and Reliability | 9. Packetization and Reliability | |||
| The maximum packet size for QUIC is the maximum size of the encrypted | The Path Maximum Transmission Unit (PTMU) is the maximum size of the | |||
| payload of the resulting UDP datagram. All QUIC packets SHOULD be | entire IP header, UDP header, and UDP payload. The UDP payload | |||
| sized to fit within the path's MTU to avoid IP fragmentation. The | includes the QUIC public header, encrypted payload, and any | |||
| recommended default maximum packet size is 1350 bytes for IPv6 and | authentication fields. | |||
| 1370 bytes for IPv4. To optimize better, endpoints MAY use PLPMTUD | ||||
| [RFC4821] for detecting the path's MTU and setting the maximum packet | ||||
| size appropriately. | ||||
| A sender bundles one or more frames in a Regular QUIC packet. A | All QUIC packets SHOULD be sized to fit within the estimated PMTU to | |||
| sender MAY bundle any set of frames in a packet. All QUIC packets | avoid IP fragmentation or packet drops. To optimize bandwidth | |||
| MUST contain a packet number and MAY contain one or more frames | efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | |||
| (Section 5.2.2). Packet numbers MUST be unique within a connection | ([RFC4821]) and MAY use PMTU Discovery ([RFC1191], [RFC1981]) for | |||
| and MUST NOT be reused within the same connection. Packet numbers | detecting the PMTU, setting the PMTU appropriately, and storing the | |||
| MUST be assigned to packets in a strictly monotonically increasing | result of previous PMTU determinations. | |||
| order. The initial packet number used, at both the client and the | ||||
| server, MUST be 0. That is, the first packet in both directions of | In the absence of these mechanisms, QUIC endpoints SHOULD NOT send IP | |||
| the connection MUST have a packet number of 0. | packets larger than 1280 octets. Assuming the minimum IP header | |||
| size, this results in a UDP payload length of 1232 octets for IPv6 | ||||
| and 1252 octets for IPv4. | ||||
| QUIC endpoints that implement any kind of PMTU discovery SHOULD | ||||
| maintain an estimate for each combination of local and remote IP | ||||
| addresses (as each pairing could have a different maximum MTU in the | ||||
| path). | ||||
| QUIC depends on the network path supporting a MTU of at least 1280 | ||||
| octets. This is the IPv6 minimum and therefore also supported by | ||||
| most modern IPv4 networks. An endpoint MUST NOT reduce their MTU | ||||
| below this number, even if it receives signals that indicate a | ||||
| smaller limit might exist. | ||||
| Clients MUST ensure that the first packet in a connection, and any | ||||
| retransmissions of those octets, has a total size (including IP and | ||||
| UDP headers) of at least 1280 bytes. This might require inclusion of | ||||
| PADDING frames. It is RECOMMENDED that a packet be padded to exactly | ||||
| 1280 octets unless the client has a reasonable assurance that the | ||||
| PMTU is larger. Sending a packet of this size ensures that the | ||||
| network path supports an MTU of this size and helps mitigate | ||||
| amplification attacks caused by server responses toward an unverified | ||||
| client address. | ||||
| Servers MUST reject the first plaintext packet received from a client | ||||
| if it its total size is less than 1280 octets, to mitigate | ||||
| amplification attacks. | ||||
| If a QUIC endpoint determines that the PMTU between any pair of local | ||||
| and remote IP addresses has fallen below 1280 octets, it MUST | ||||
| immediately cease sending QUIC packets between those IP addresses. | ||||
| This may result in abrupt termination of the connection if all pairs | ||||
| are affected. In this case, an endpoint SHOULD send a Public Reset | ||||
| packet to indicate the failure. The application SHOULD attempt to | ||||
| use TLS over TCP instead. | ||||
| A sender bundles one or more frames in a Regular QUIC packet (see | ||||
| Section 6). | ||||
| A sender SHOULD minimize per-packet bandwidth and computational costs | A sender SHOULD minimize per-packet bandwidth and computational costs | |||
| by bundling as many frames as possible within a QUIC packet. A | by bundling as many frames as possible within a QUIC packet. A | |||
| sender MAY wait for a short period of time to bundle multiple frames | sender MAY wait for a short period of time to bundle multiple frames | |||
| before sending a packet that is not maximally packed, to avoid | before sending a packet that is not maximally packed, to avoid | |||
| sending out large numbers of small packets. An implementation may | sending out large numbers of small packets. An implementation may | |||
| use heuristics about expected application sending behavior to | use heuristics about expected application sending behavior to | |||
| determine whether and for how long to wait. This waiting period is | determine whether and for how long to wait. This waiting period is | |||
| an implementation decision, and an implementation should be careful | an implementation decision, and an implementation should be careful | |||
| to delay conservatively, since any delay is likely to increase | to delay conservatively, since any delay is likely to increase | |||
| application-visible latency. | application-visible latency. | |||
| Regular QUIC packets are "containers" of frames; a packet is never | Regular QUIC packets are "containers" of frames; a packet is never | |||
| retransmitted whole, but frames in a lost packet may be rebundled and | retransmitted whole. How an endpoint handles the loss of the frame | |||
| transmitted in a subsequent packet as necessary. | depends on the type of the frame. Some frames are simply | |||
| retransmitted, some have their contents moved to new frames, and | ||||
| others are never retransmitted. | ||||
| A packet may contain frames and/or application data, only some of | When a packet is detected as lost, the sender re-sends any frames as | |||
| which may require reliability. When a packet is detected as lost, | necessary: | |||
| the sender re-sends any frames as necessary: | ||||
| o All application data sent in STREAM frames MUST be retransmitted, | o All application data sent in STREAM frames MUST be retransmitted, | |||
| with one exception. When an endpoint sends a RST_STREAM frame, | unless the endpoint has sent a RST_STREAM for that stream. When | |||
| data outstanding on that stream SHOULD NOT be retransmitted, since | an endpoint sends a RST_STREAM frame, data outstanding on that | |||
| subsequent data on this stream is expected to not be delivered by | stream SHOULD NOT be retransmitted, since subsequent data on this | |||
| the receiver. | stream is expected to not be delivered by the receiver. | |||
| o ACK, STOP_WAITING, and PADDING frames MUST NOT be retransmitted. | o ACK and PADDING frames MUST NOT be retransmitted. ACK frames are | |||
| New frames of these types may however be bundled with any outgoing | cumulative, so new frames containing updated information will be | |||
| packet. | sent as described in Section 8.2. | |||
| o All other frames MUST be retransmitted. | o All other frames MUST be retransmitted. | |||
| Upon detecting losses, a sender MUST take appropriate congestion | Upon detecting losses, a sender MUST take appropriate congestion | |||
| control action. The details of loss detection and congestion control | control action. The details of loss detection and congestion control | |||
| are described in [QUIC-RECOVERY]. | are described in [QUIC-RECOVERY]. | |||
| A receiver acknowledges receipt of a received packet by sending one | A packet MUST NOT be acknowledged until packet protection has been | |||
| or more ACK frames containing the packet number of the received | successfully removed and all frames contained in the packet have been | |||
| packet. To avoid perpetual acking between endpoints, a receiver MUST | processed. For STREAM frames, this means the data has been queued | |||
| NOT generate an ack in response to every packet containing only ACK | (but not necessarily delivered to the application). This also means | |||
| frames. However, since it is possible that an endpoint sends only | that any stream state transitions triggered by STREAM or RST_STREAM | |||
| packets containing ACK frame (or other non-retransmittable frames), | frames have occurred. Once the packet has been fully processed, a | |||
| the receiving peer MAY send an ACK frame after a reasonable number | receiver acknowledges receipt by sending one or more ACK frames | |||
| (currently 20) of such packets have been received. | containing the packet number of the received packet. | |||
| To avoid creating an indefinite feedback loop, an endpoint MUST NOT | ||||
| generate an ACK frame in response to a packet containing only ACK or | ||||
| PADDING frames. | ||||
| Strategies and implications of the frequency of generating | Strategies and implications of the frequency of generating | |||
| acknowledgments are discussed in more detail in [QUIC-RECOVERY]. | acknowledgments are discussed in more detail in [QUIC-RECOVERY]. | |||
| 9. Streams: QUIC's Data Structuring Abstraction | 9.1. Special Considerations for PMTU Discovery | |||
| Traditional ICMP-based path MTU discovery in IPv4 ([RFC1191] is | ||||
| potentially vulnerable to off-path attacks that successfully guess | ||||
| the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | ||||
| value. TCP connections mitigate this risk by using the (at minimum) | ||||
| 8 bytes of transport header echoed in the ICMP message to validate | ||||
| the TCP sequence number as valid for the current connection. | ||||
| However, as QUIC operates over UDP, in IPv4 the echoed information | ||||
| could consist only of the IP and UDP headers, which usually has | ||||
| insufficient entropy to mitigate off-path attacks. | ||||
| As a result, endpoints that implement PMTUD in IPv4 SHOULD take steps | ||||
| to mitigate this risk. For instance, an application could: | ||||
| o Set the IPv4 Don't Fragment (DF) bit on a small proportion of | ||||
| packets, so that most invalid ICMP messages arrive when there are | ||||
| no DF packets outstanding, and can therefore be identified as | ||||
| spurious. | ||||
| o Store additional information from the IP or UDP headers from DF | ||||
| packets (for example, the IP ID or UDP checksum) to further | ||||
| authenticate incoming Datagram Too Big messages. | ||||
| o Any reduction in PMTU due to a report contained in an ICMP packet | ||||
| is provisional until QUIC's loss detection algorithm determines | ||||
| that the packet is actually lost. | ||||
| 10. Streams: QUIC's Data Structuring Abstraction | ||||
| Streams in QUIC provide a lightweight, ordered, and bidirectional | Streams in QUIC provide a lightweight, ordered, and bidirectional | |||
| byte-stream abstraction. Streams can be created either by the client | byte-stream abstraction modeled closely on HTTP/2 streams [RFC7540]. | |||
| or the server, can concurrently send data interleaved with other | ||||
| streams, and can be cancelled. QUIC's stream lifetime is modeled | Streams can be created either by the client or the server, can | |||
| closely after HTTP/2's [RFC7540]. Streams are independent of each | concurrently send data interleaved with other streams, and can be | |||
| other in delivery order. That is, data that is received on a stream | cancelled. | |||
| is delivered in order within that stream, but there is no particular | ||||
| delivery order across streams. Transmit ordering among streams is | Data that is received on a stream is delivered in order within that | |||
| left to the implementation. QUIC streams are considered lightweight | stream, but there is no particular delivery order across streams. | |||
| in that the creation and destruction of streams are expected to have | Transmit ordering among streams is left to the implementation. | |||
| minimal bandwidth and computational cost. A single STREAM frame may | ||||
| create, carry data for, and terminate a stream, or a stream may last | The creation and destruction of streams are expected to have minimal | |||
| the entire duration of a connection. Implementations are therefore | bandwidth and computational cost. A single STREAM frame may create, | |||
| advised to keep these extremes in mind and to implement stream | carry data for, and terminate a stream, or a stream may last the | |||
| creation and destruction to be as lightweight as possible. | entire duration of a connection. | |||
| Streams are individually flow controlled, allowing an endpoint to | ||||
| limit memory commitment and to apply back pressure. | ||||
| An alternative view of QUIC streams is as an elastic "message" | An alternative view of QUIC streams is as an elastic "message" | |||
| abstraction, similar to the way ephemeral streams are used in SST | abstraction, similar to the way ephemeral streams are used in SST | |||
| [SST], which may be a more appealing description for some | [SST], which may be a more appealing description for some | |||
| applications. | applications. | |||
| 9.1. Life of a Stream | 10.1. Life of a Stream | |||
| The semantics of QUIC streams is based on HTTP/2 streams, and the | The semantics of QUIC streams is based on HTTP/2 streams, and the | |||
| lifecycle of a QUIC stream therefore closely follows that of an | lifecycle of a QUIC stream therefore closely follows that of an | |||
| HTTP/2 stream [RFC7540], with some differences to accommodate the | HTTP/2 stream [RFC7540], with some differences to accommodate the | |||
| possibility of out-of-order delivery due to the use of multiple | possibility of out-of-order delivery due to the use of multiple | |||
| streams in QUIC. The lifecycle of a QUIC stream is shown in the | streams in QUIC. The lifecycle of a QUIC stream is shown in the | |||
| following figure and described below. | following figure and described below. | |||
| app +--------+ | +--------+ | |||
| reserve_stream | | | | | | |||
| ,--------------| idle | | | idle | | |||
| / | | | | | | |||
| / +--------+ | +--------+ | |||
| V | | | | |||
| +----------+ send data/ | | | send data/ | |||
| | | recv data | send data/ | | recv data/ | |||
| ,---| reserved |------------. | recv data | | recv higher stream | |||
| | | | \ | | | | |||
| | +----------+ v v | v | |||
| | recv FIN/ +--------+ send FIN/ | +--------+ | |||
| | app read_close | | app write_close | recv FIN | | send FIN | |||
| | ,---------| open |-----------. | ,---------| open |-----------. | |||
| | / | | \ | / | | \ | |||
| | v +--------+ v | v +--------+ v | |||
| | +----------+ | +----------+ | +----------+ | +----------+ | |||
| | | half | | | half | | | half | | | half | | |||
| | | closed | | send RST/ | closed | | | closed | | send RST/ | closed | | |||
| | | (remote) | | recv RST | (local) | | | (remote) | | recv RST | (local) | | |||
| | +----------+ | +----------+ | +----------+ | +----------+ | |||
| | | | | | | | | | |||
| | | recv FIN/ | send FIN/ | | | send FIN/ | recv FIN/ | | |||
| | | app write_close/ | app read_close/ | | | send RST/ v send RST/ | | |||
| | | send RST/ v send RST/ | | | recv RST +--------+ recv RST | | |||
| | | recv RST +--------+ recv RST | | `------------->| |<---------------' | |||
| | send RST/ `------------->| |<---------------' | | closed | | |||
| | recv RST | closed | | | | | |||
| `-------------------------->| | | +--------+ | |||
| +--------+ | ||||
| send: endpoint sends this frame | ||||
| recv: endpoint receives this frame | ||||
| data: application data in a STREAM frame | send: endpoint sends this frame | |||
| FIN: FIN flag in a STREAM frame | recv: endpoint receives this frame | |||
| RST: RST_STREAM frame | ||||
| app: application API signals to QUIC | data: application data in a STREAM frame | |||
| reserve_stream: causes a StreamID to be reserved for later use | FIN: FIN flag in a STREAM frame | |||
| read_close: causes stream to be half-closed without receiving a FIN | RST: RST_STREAM frame | |||
| write_close: causes stream to be half-closed without sending a FIN | ||||
| Figure 12: Lifecycle of a stream | Figure 11: Lifecycle of a stream | |||
| Note that this diagram shows stream state transitions and the frames | Note that this diagram shows stream state transitions and the frames | |||
| and flags that affect those transitions only. For the purpose of | and flags that affect those transitions only. For the purpose of | |||
| state transitions, the FIN flag is processed as a separate event to | state transitions, the FIN flag is processed as a separate event to | |||
| the frame that bears it; a STREAM frame with the FIN flag set can | the frame that bears it; a STREAM frame with the FIN flag set can | |||
| cause two state transitions. When the FIN bit is sent on an empty | cause two state transitions. When the FIN flag is sent on an empty | |||
| STREAM frame, the offset in the STREAM frame MUST be one greater than | STREAM frame, the offset in the STREAM frame MUST be one greater than | |||
| the last data byte sent on this stream. | the last data byte sent on this stream. | |||
| Both endpoints have a subjective view of the state of a stream that | The recipient of a frame which changes stream state will have a | |||
| could be different when frames are in transit. Endpoints do not | delayed view of the state of a stream while the frame is in transit. | |||
| coordinate the creation of streams; they are created unilaterally by | Endpoints do not coordinate the creation of streams; they are created | |||
| either endpoint. The negative consequences of a mismatch in states | unilaterally by either endpoint. The negative consequences of a | |||
| are limited to the "closed" state after sending RST_STREAM, where | mismatch in states are limited to the "closed" state after sending | |||
| frames might be received for some time after closing. | RST_STREAM, where frames might be received for some time after | |||
| closing. Endpoints can use acknowledgments to understand the peer's | ||||
| subjective view of stream state at any given time. | ||||
| Streams have the following states: | Streams have the following states: | |||
| 9.1.1. idle | 10.1.1. idle | |||
| All streams start in the "idle" state. | All streams start in the "idle" state. | |||
| The following transitions are valid from this state: | The following transitions are valid from this state: | |||
| Sending or receiving a STREAM frame causes the stream to become | Sending or receiving a STREAM frame causes the stream to become | |||
| "open". The stream identifier is selected as described in | "open". The stream identifier is selected as described in | |||
| Section 9.2. The same STREAM frame can also cause a stream to | Section 10.2. The same STREAM frame can also cause a stream to | |||
| immediately become "half-closed". | immediately become "half-closed". | |||
| An application can reserve an idle stream for later use. The stream | Receiving a STREAM frame on a peer-initiated stream (that is, a | |||
| state for the reserved stream transitions to "reserved". | packet sent by a server on an even-numbered stream or a client packet | |||
| on an odd-numbered stream) also causes all lower-numbered "idle" | ||||
| streams in the same direction to become "open". This could occur if | ||||
| a peer begins sending on streams in a different order to their | ||||
| creation, or it could happen if packets are lost or reordered in | ||||
| transit. | ||||
| Receiving any frame other than STREAM or RST_STREAM on a stream in | Receiving any frame other than STREAM or RST_STREAM on a stream in | |||
| this state MUST be treated as a connection error (Section 11) of type | this state MUST be treated as a connection error (Section 12) of type | |||
| YYYY. | YYYY. | |||
| 9.1.2. reserved | 10.1.2. open | |||
| A stream in this state has been reserved for later use by the | ||||
| application. In this state only the following transitions are | ||||
| possible: | ||||
| o Sending or receiving a STREAM frame causes the stream to become | ||||
| "open". | ||||
| o Sending or receiving a RST_STREAM frame causes the stream to | ||||
| become "closed". | ||||
| 9.1.3. open | ||||
| A stream in the "open" state may be used by both peers to send frames | A stream in the "open" state may be used by both peers to send frames | |||
| of any type. In this state, a sending peer must observe the flow- | of any type. In this state, a sending peer must observe the flow- | |||
| control limit advertised by its receiving peer (Section 10). | control limit advertised by its receiving peer (Section 11). | |||
| From this state, either endpoint can send a frame with the FIN flag | From this state, either endpoint can send a frame with the FIN flag | |||
| set, which causes the stream to transition into one of the "half- | set, which causes the stream to transition into one of the "half- | |||
| closed" states. An endpoint sending an FIN flag causes the stream | closed" states. An endpoint sending an FIN flag causes the stream | |||
| state to become "half-closed (local)". An endpoint receiving a FIN | state to become "half-closed (local)". An endpoint receiving a FIN | |||
| flag causes the stream state to become "half-closed (remote)"; the | flag causes the stream state to become "half-closed (remote)" once | |||
| receiving endpoint MUST NOT process the FIN flag until all preceding | all preceding data has arrived. The receiving endpoint MUST NOT | |||
| data on the stream has been received. | consider the stream state to have changed until all data has arrived. | |||
| Either endpoint can send a RST_STREAM frame from this state, causing | Either endpoint can send a RST_STREAM frame from this state, causing | |||
| it to transition immediately to "closed". | it to transition immediately to "closed". | |||
| 9.1.4. half-closed (local) | 10.1.3. half-closed (local) | |||
| A stream that is in the "half-closed (local)" state MUST NOT be used | A stream that is in the "half-closed (local)" state MUST NOT be used | |||
| for sending STREAM frames; WINDOW_UPDATE and RST_STREAM MAY be sent | for sending STREAM frames; WINDOW_UPDATE and RST_STREAM MAY be sent | |||
| in this state. | in this state. | |||
| A stream transitions from this state to "closed" when a frame that | A stream transitions from this state to "closed" when a STREAM frame | |||
| contains an FIN flag is received or when either peer sends a | that contains a FIN flag is received and all prior data has arrived, | |||
| RST_STREAM frame. | or when either peer sends a RST_STREAM frame. | |||
| An endpoint that closes a stream MUST NOT send data beyond the final | ||||
| offset that it has chosen, see Section 10.1.5 for details. | ||||
| An endpoint can receive any type of frame in this state. Providing | An endpoint can receive any type of frame in this state. Providing | |||
| flow-control credit using WINDOW_UPDATE frames is necessary to | flow-control credit using WINDOW_UPDATE frames is necessary to | |||
| continue receiving flow-controlled frames. In this state, a receiver | continue receiving flow-controlled frames. In this state, a receiver | |||
| MAY ignore WINDOW_UPDATE frames for this stream, which might arrive | MAY ignore WINDOW_UPDATE frames for this stream, which might arrive | |||
| for a short period after a frame bearing the FIN flag is sent. | for a short period after a frame bearing the FIN flag is sent. | |||
| 9.1.5. half-closed (remote) | 10.1.4. half-closed (remote) | |||
| A stream that is "half-closed (remote)" is no longer being used by | A stream that is "half-closed (remote)" is no longer being used by | |||
| the peer to send any data. In this state, a sender is no longer | the peer to send any data. In this state, a sender is no longer | |||
| obligated to maintain a receiver stream-level flow-control window. | obligated to maintain a receiver stream-level flow-control window. | |||
| If an endpoint receives any STREAM frames for a stream that is in | A stream that is in the "half-closed (remote)" state will have a | |||
| this state, it MUST close the connection with a | final offset for received data, see Section 10.1.5 for details. | |||
| QUIC_STREAM_DATA_AFTER_TERMINATION error (Section 11). | ||||
| A stream in this state can be used by the endpoint to send frames of | A stream in this state can be used by the endpoint to send frames of | |||
| any type. In this state, the endpoint continues to observe | any type. In this state, the endpoint continues to observe | |||
| advertised stream-level and connection-level flow-control limits | advertised stream-level and connection-level flow-control limits | |||
| (Section 10). | (Section 11). | |||
| A stream can transition from this state to "closed" by sending a | A stream can transition from this state to "closed" by sending a | |||
| frame that contains a FIN flag or when either peer sends a RST_STREAM | frame that contains a FIN flag or when either peer sends a RST_STREAM | |||
| frame. | frame. | |||
| 9.1.6. closed | 10.1.5. closed | |||
| The "closed" state is the terminal state. | The "closed" state is the terminal state. | |||
| A final offset is present in both a frame bearing a FIN flag and in a | An endpoint will learn the final offset of the data it receives on a | |||
| RST_STREAM frame. Upon sending either of these frames for a stream, | stream when it enters the "half-closed (remote)" or "closed" state. | |||
| the endpoint MUST NOT send a STREAM frame carrying data beyond the | The final offset is carried explicitly in the RST_STREAM frame; | |||
| final offset. | otherwise, the final offset is the offset of the end of the data | |||
| carried in STREAM frame marked with a FIN flag. | ||||
| An endpoint that receives any frame for this stream after receiving | An endpoint MUST NOT send data on a stream at or beyond the final | |||
| either a FIN flag and all stream data preceding it, or a RST_STREAM | offset. | |||
| frame, MUST quietly discard the frame, with one exception. If a | ||||
| STREAM frame carrying data beyond the received final offset is | Once a final offset for a stream is known, it cannot change. If a | |||
| received, the endpoint MUST close the connection with a | RST_STREAM or STREAM frame causes the final offset to change for a | |||
| QUIC_STREAM_DATA_AFTER_TERMINATION error (Section 11). | stream, an endpoint SHOULD respond with a | |||
| QUIC_STREAM_DATA_AFTER_TERMINATION error (see Section 12). A | ||||
| receiver SHOULD treat receipt of data at or beyond the final offset | ||||
| as a QUIC_STREAM_DATA_AFTER_TERMINATION error. Generating these | ||||
| errors is not mandatory, but only because requiring that an endpoint | ||||
| generate these errors also means that the endpoint needs to maintain | ||||
| the final offset state for closed streams, which could mean a | ||||
| significant state commitment. | ||||
| An endpoint that receives a RST_STREAM frame (and which has not sent | An endpoint that receives a RST_STREAM frame (and which has not sent | |||
| a FIN or a RST_STREAM) MUST immediately respond with a RST_STREAM | a FIN or a RST_STREAM) MUST immediately respond with a RST_STREAM | |||
| frame, and MUST NOT send any more data on the stream. This endpoint | frame, and MUST NOT send any more data on the stream. This endpoint | |||
| may continue receiving frames for the stream on which a RST_STREAM is | may continue receiving frames for the stream on which a RST_STREAM is | |||
| received. | received. | |||
| If this state is reached as a result of sending a RST_STREAM frame, | If this state is reached as a result of sending a RST_STREAM frame, | |||
| the peer that receives the RST_STREAM might have already sent - or | the peer that receives the RST_STREAM frame might have already sent - | |||
| enqueued for sending - frames on the stream that cannot be withdrawn. | or enqueued for sending - frames on the stream that cannot be | |||
| An endpoint MUST ignore frames that it receives on closed streams | withdrawn. An endpoint MUST ignore frames that it receives on closed | |||
| after it has sent a RST_STREAM frame. An endpoint MAY choose to | streams after it has sent a RST_STREAM frame. An endpoint MAY choose | |||
| limit the period over which it ignores frames and treat frames that | to limit the period over which it ignores frames and treat frames | |||
| arrive after this time as being in error. | that arrive after this time as being in error. | |||
| STREAM frames received after sending RST_STREAM are counted toward | STREAM frames received after sending RST_STREAM are counted toward | |||
| the connection and stream flow-control windows. Even though these | the connection and stream flow-control windows. Even though these | |||
| frames might be ignored, because they are sent before their sender | frames might be ignored, because they are sent before their sender | |||
| receives the RST_STREAM, the sender will consider the frames to count | receives the RST_STREAM, the sender will consider the frames to count | |||
| against its flow-control windows. | against its flow-control windows. | |||
| In the absence of more specific guidance elsewhere in this document, | In the absence of more specific guidance elsewhere in this document, | |||
| implementations SHOULD treat the receipt of a frame that is not | implementations SHOULD treat the receipt of a frame that is not | |||
| expressly permitted in the description of a state as a connection | expressly permitted in the description of a state as a connection | |||
| error (Section 11). Frames of unknown types are ignored. | error (Section 12). Frames of unknown types are ignored. | |||
| (TODO: QUIC_STREAM_NO_ERROR is a special case. Write it up.) | (TODO: QUIC_STREAM_NO_ERROR is a special case. Write it up.) | |||
| 9.2. Stream Identifiers | 10.2. Stream Identifiers | |||
| Streams are identified by an unsigned 32-bit integer, referred to as | Streams are identified by an unsigned 32-bit integer, referred to as | |||
| the StreamID. To avoid StreamID collision, clients MUST initiate | the StreamID. To avoid StreamID collision, clients MUST initiate | |||
| streams usinge odd-numbered StreamIDs; streams initiated by the | streams usinge odd-numbered StreamIDs; streams initiated by the | |||
| server MUST use even-numbered StreamIDs. | server MUST use even-numbered StreamIDs. | |||
| A StreamID of zero (0x0) is reserved and used for connection-level | A StreamID of zero (0x0) is reserved and used for connection-level | |||
| flow control frames (Section 10); the StreamID of zero cannot be used | flow control frames (Section 11); the StreamID of zero cannot be used | |||
| to establish a new stream. | to establish a new stream. | |||
| StreamID 1 (0x1) is reserved for the crypto handshake. StreamID 1 | StreamID 1 (0x1) is reserved for the cryptographic handshake. | |||
| MUST NOT be used for application data, and MUST be the first client- | StreamID 1 MUST NOT be used for application data, and MUST be the | |||
| initiated stream. | first client-initiated stream. | |||
| Streams MUST be created or reserved in sequential order, but MAY be | A QUIC endpoint cannot reuse a StreamID on a given connection. | |||
| used in arbitrary order. A QUIC endpoint MUST NOT reuse a StreamID | Streams MUST be created in sequential order. Open streams can be | |||
| on a given connection. | used in any order. Streams that are used out of order result in | |||
| lower-numbered streams in the same direction being counted as open. | ||||
| 9.3. Stream Concurrency | All streams, including stream 1, count toward this limit. Thus, a | |||
| concurrent stream limit of 0 will cause a connection to be unusable. | ||||
| Application protocols that use QUIC might require a certain minimum | ||||
| number of streams to function correctly. If a peer advertises an | ||||
| concurrent stream limit (concurrent_streams) that is too small for | ||||
| the selected application protocol to function, an endpoint MUST | ||||
| terminate the connection with an error of type | ||||
| QUIC_TOO_MANY_OPEN_STREAMS (Section 12). | ||||
| An endpoint can limit the number of concurrently active incoming | 10.3. Stream Concurrency | |||
| streams by setting the MSPC parameter (see Section 6.2.1.2) in the | ||||
| An endpoint limits the number of concurrently active incoming streams | ||||
| by setting the concurrent stream limit (see Section 7.3.1) in the | ||||
| transport parameters. The maximum concurrent streams setting is | transport parameters. The maximum concurrent streams setting is | |||
| specific to each endpoint and applies only to the peer that receives | specific to each endpoint and applies only to the peer that receives | |||
| the setting. That is, clients specify the maximum number of | the setting. That is, clients specify the maximum number of | |||
| concurrent streams the server can initiate, and servers specify the | concurrent streams the server can initiate, and servers specify the | |||
| maximum number of concurrent streams the client can initiate. | maximum number of concurrent streams the client can initiate. | |||
| Streams that are in the "open" state or in either of the "half- | Streams that are in the "open" state or in either of the "half- | |||
| closed" states count toward the maximum number of streams that an | closed" states count toward the maximum number of streams that an | |||
| endpoint is permitted to open. Streams in any of these three states | endpoint is permitted to open. Streams in any of these three states | |||
| count toward the limit advertised in the MSPC setting. | count toward the limit advertised in the concurrent stream limit. | |||
| A recently closed stream MUST also be considered to count toward this | ||||
| limit until packets containing all frames required to close the | ||||
| stream have been acknowledged. For a stream which closed cleanly, | ||||
| this means all STREAM frames have been acknowledged; for a stream | ||||
| which closed abruptly, this means the RST_STREAM frame has been | ||||
| acknowledged. | ||||
| Endpoints MUST NOT exceed the limit set by their peer. An endpoint | Endpoints MUST NOT exceed the limit set by their peer. An endpoint | |||
| that receives a STREAM frame that causes its advertised concurrent | that receives a STREAM frame that causes its advertised concurrent | |||
| stream limit to be exceeded MUST treat this as a stream error of type | stream limit to be exceeded MUST treat this as a stream error of type | |||
| QUIC_TOO_MANY_OPEN_STREAMS (Section 11). | QUIC_TOO_MANY_OPEN_STREAMS (Section 12). | |||
| 9.4. Sending and Receiving Data | 10.4. Sending and Receiving Data | |||
| Once a stream is created, endpoints may use the stream to send and | Once a stream is created, endpoints may use the stream to send and | |||
| receive data. Each endpoint may send a series of STREAM frames | receive data. Each endpoint may send a series of STREAM frames | |||
| encapsulating data on a stream until the stream is terminated in that | encapsulating data on a stream until the stream is terminated in that | |||
| direction. Streams are an ordered byte-stream abstraction, and they | direction. Streams are an ordered byte-stream abstraction, and they | |||
| have no other structure within them. STREAM frame boundaries are not | have no other structure within them. STREAM frame boundaries are not | |||
| expected to be preserved in retransmissions from the sender or during | expected to be preserved in retransmissions from the sender or during | |||
| delivery to the application at the receiver. | delivery to the application at the receiver. | |||
| When new data is to be sent on a stream, a sender MUST set the | When new data is to be sent on a stream, a sender MUST set the | |||
| encapsulating STREAM frame's offset field to the stream offset of the | encapsulating STREAM frame's offset field to the stream offset of the | |||
| first byte of this new data. The first byte of data that is sent on | first byte of this new data. The first byte of data that is sent on | |||
| a stream has the stream offset 0. A receiver MUST ensure that | a stream has the stream offset 0. The largest offset delivered on a | |||
| received stream data is delivered to the application as an ordered | stream MUST be less than 2^64. A receiver MUST ensure that received | |||
| byte-stream. Data received out of order MUST be buffered for later | stream data is delivered to the application as an ordered byte- | |||
| stream. Data received out of order MUST be buffered for later | ||||
| delivery, as long as it is not in violation of the receiver's flow | delivery, as long as it is not in violation of the receiver's flow | |||
| control limits. | control limits. | |||
| An endpoint MUST NOT send any stream data without consulting the | The cryptographic handshake stream, Stream 1, MUST NOT be subject to | |||
| congestion controller and the flow controller, with the following two | congestion control or connection-level flow control, but MUST be | |||
| exceptions. | subject to stream-level flow control. An endpoint MUST NOT send data | |||
| on any other stream without consulting the congestion controller and | ||||
| the flow controller. | ||||
| o The crypto handshake stream, Stream 1, MUST NOT be subject to | Flow control is described in detail in Section 11, and congestion | |||
| congestion control or connection-level flow control, but MUST be | control is described in the companion document [QUIC-RECOVERY]. | |||
| subject to stream-level flow control. | ||||
| o An application MAY exclude specific stream IDs from connection- | 10.5. Stream Prioritization | |||
| level flow control. If so, these streams MUST NOT be subject to | ||||
| connection-level flow control. | ||||
| Flow control is described in detail in Section 10, and congestion | Stream multiplexing has a significant effect on application | |||
| control is described in the companion document [QUIC-RECOVERY]. | performance if resources allocated to streams are correctly | |||
| prioritized. Experience with other multiplexed protocols, such as | ||||
| HTTP/2 [RFC7540], shows that effective prioritization strategies have | ||||
| a significant positive impact on performance. | ||||
| 10. Flow Control | QUIC does not provide frames for exchanging priotization information. | |||
| Instead it relies on receiving priority information from the | ||||
| application that uses QUIC. Protocols that use QUIC are able to | ||||
| define any prioritization scheme that suits their application | ||||
| semantics. A protocol might define explicit messages for signaling | ||||
| priority, such as those defined in HTTP/2; it could define rules that | ||||
| allow an endpoint to determine priority based on context; or it could | ||||
| leave the determination to the application. | ||||
| A QUIC implementation SHOULD provide ways in which an application can | ||||
| indicate the relative priority of streams. When deciding which | ||||
| streams to dedicate resources to, QUIC SHOULD use the information | ||||
| provided by the application. Failure to account for priority of | ||||
| streams can result in suboptimal performance. | ||||
| Stream priority is most relevant when deciding which stream data will | ||||
| be transmitted. Often, there will be limits on what can be | ||||
| transmitted as a result of connection flow control or the current | ||||
| congestion controller state. | ||||
| Giving preference to the transmission of its own management frames | ||||
| ensures that the protocol functions efficiently. That is, | ||||
| prioritizing frames other than STREAM frames ensures that loss | ||||
| recovery, congestion control, and flow control operate effectively. | ||||
| Stream 1 MUST be prioritized over other streams prior to the | ||||
| completion of the cryptographic handshake. This includes the | ||||
| retransmission of the second flight of client handshake messages, | ||||
| that is, the TLS Finished and any client authentication messages. | ||||
| STREAM frames that are determined to be lost SHOULD be retransmitted | ||||
| before sending new data, unless application priorities indicate | ||||
| otherwise. Retransmitting lost STREAM frames can fill in gaps, which | ||||
| allows the peer to consume already received data and free up flow | ||||
| control window. | ||||
| 11. Flow Control | ||||
| It is necessary to limit the amount of data that a sender may have | It is necessary to limit the amount of data that a sender may have | |||
| outstanding at any time, so as to prevent a fast sender from | outstanding at any time, so as to prevent a fast sender from | |||
| overwhelming a slow receiver, or to prevent a malicious sender from | overwhelming a slow receiver, or to prevent a malicious sender from | |||
| consuming significant resources at a receiver. This section | consuming significant resources at a receiver. This section | |||
| describes QUIC's flow-control mechanisms. | describes QUIC's flow-control mechanisms. | |||
| QUIC employs a credit-based flow-control scheme similar to HTTP/2's | QUIC employs a credit-based flow-control scheme similar to HTTP/2's | |||
| flow control [RFC7540]. A receiver advertises the number of octets | flow control [RFC7540]. A receiver advertises the number of octets | |||
| it is prepared to receive on a given stream and for the entire | it is prepared to receive on a given stream and for the entire | |||
| connection. This leads to two levels of flow control in QUIC: (i) | connection. This leads to two levels of flow control in QUIC: (i) | |||
| Connection flow control, which prevents senders from exceeding a | Connection flow control, which prevents senders from exceeding a | |||
| receiver's buffer capacity for the connection, and (ii) Stream flow | receiver's buffer capacity for the connection, and (ii) Stream flow | |||
| control, which prevents a single stream from consuming the entire | control, which prevents a single stream from consuming the entire | |||
| receive buffer for a connection. | receive buffer for a connection. | |||
| A receiver sends WINDOW_UPDATE frames to the sender to advertise | A receiver sends WINDOW_UPDATE frames to the sender to advertise | |||
| additional credit, for both connection and stream flow control. A | additional credit by sending the absolute byte offset in the stream | |||
| receiver advertises the maximum absolute byte offset in the stream or | or in the connection which it is willing to receive. | |||
| in the connection which the receiver is willing to receive. | ||||
| The initial flow control credit is 65536 bytes for both the stream | The initial flow control credit is 65536 bytes for both the stream | |||
| and connection flow controllers. | and connection flow controllers. | |||
| A receiver MAY advertise a larger offset at any point in the | A receiver MAY advertise a larger offset at any point in the | |||
| connection by sending a WINDOW_UPDATE frame. A receiver MUST NOT | connection by sending a WINDOW_UPDATE frame. A receiver MUST NOT | |||
| renege on an advertisement; that is, once a receiver advertises an | renege on an advertisement; that is, once a receiver advertises an | |||
| offset via a WINDOW_UPDATE frame, it MUST NOT subsequently advertise | offset via a WINDOW_UPDATE frame, it MUST NOT subsequently advertise | |||
| a smaller offset. A sender may receive WINDOW_UPDATE frames out of | a smaller offset. A sender may receive WINDOW_UPDATE frames out of | |||
| order; a sender MUST therefore ignore any reductions in flow control | order; a sender MUST therefore ignore any WINDOW_UPDATE that does not | |||
| credit. | move the window forward. | |||
| A receiver MUST close the connection with a | ||||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error (Section 12) if the | ||||
| peer violates the advertised stream or connection flow control | ||||
| windows. | ||||
| A sender MUST send BLOCKED frames to indicate it has data to write | A sender MUST send BLOCKED frames to indicate it has data to write | |||
| but is blocked by lack of connection or stream flow control credit. | but is blocked by lack of connection or stream flow control credit. | |||
| BLOCKED frames are expected to be sent infrequently in common cases, | BLOCKED frames are expected to be sent infrequently in common cases, | |||
| but they are considered useful for debugging and monitoring purposes. | but they are considered useful for debugging and monitoring purposes. | |||
| A receiver advertises credit for a stream by sending a WINDOW_UPDATE | A receiver advertises credit for a stream by sending a WINDOW_UPDATE | |||
| frame with the StreamID set appropriately. A receiver may simply use | frame with the StreamID set appropriately. A receiver may use the | |||
| the current received offset to determine the flow control offset to | current offset of data consumed to determine the flow control offset | |||
| be advertised. | to be advertised. A receiver MAY send copies of a WINDOW_UPDATE | |||
| frame in multiple packets in order to make sure that the sender | ||||
| receives it before running out of flow control credit, even if one of | ||||
| the packets is lost. | ||||
| Connection flow control is a limit to the total bytes of stream data | Connection flow control is a limit to the total bytes of stream data | |||
| sent in STREAM frames. A receiver advertises credit for a connection | sent in STREAM frames on all streams contributing to connection flow | |||
| by sending a WINDOW_UPDATE frame with the StreamID set to zero | control. A receiver advertises credit for a connection by sending a | |||
| (0x00). A receiver may maintain a cumulative sum of bytes received | WINDOW_UPDATE frame with the StreamID set to zero (0x00). A receiver | |||
| cumulatively on all streams to determine the value of the connection | maintains a cumulative sum of bytes received on all streams | |||
| flow control offset to be advertised in WINDOW_UPDATE frames. A | contributing to connection-level flow control, to check for flow | |||
| sender may maintain a cumulative sum of stream data bytes sent to | control violations. A receiver may maintain a cumulative sum of | |||
| impose the connection flow control limit. | bytes consumed on all contributing streams to determine the | |||
| connection-level flow control offset to be advertised. | ||||
| 10.1. Edge Cases and Other Considerations | 11.1. Edge Cases and Other Considerations | |||
| There are some edge cases which must be considered when dealing with | There are some edge cases which must be considered when dealing with | |||
| stream and connection level flow control. Given enough time, both | stream and connection level flow control. Given enough time, both | |||
| endpoints must agree on flow control state. If one end believes it | endpoints must agree on flow control state. If one end believes it | |||
| can send more than the other end is willing to receive, the | can send more than the other end is willing to receive, the | |||
| connection will be torn down when too much data arrives. Conversely | connection will be torn down when too much data arrives. Conversely | |||
| if a sender believes it is blocked, while endpoint B expects more | if a sender believes it is blocked, while endpoint B expects more | |||
| data can be received, then the connection can be in a deadlock, with | data can be received, then the connection can be in a deadlock, with | |||
| the sender waiting for a WINDOW_UPDATE which will never come. | the sender waiting for a WINDOW_UPDATE which will never come. | |||
| 10.1.1. Mid-stream RST_STREAM | 11.1.1. Mid-stream RST_STREAM | |||
| On receipt of an RST_STREAM frame, an endpoint will tear down state | On receipt of a RST_STREAM frame, an endpoint will tear down state | |||
| for the matching stream and ignore further data arriving on that | for the matching stream and ignore further data arriving on that | |||
| stream. This could result in the endpoints getting out of sync, | stream. This could result in the endpoints getting out of sync, | |||
| since the RST_STREAM frame may have arrived out of order and there | since the RST_STREAM frame may have arrived out of order and there | |||
| may be further bytes in flight. The data sender would have counted | may be further bytes in flight. The data sender would have counted | |||
| the data against its connection level flow control budget, but a | the data against its connection level flow control budget, but a | |||
| receiver that has not received these bytes would not know to include | receiver that has not received these bytes would not know to include | |||
| them as well. The receiver must learn of the number of bytes that | them as well. The receiver must learn the number of bytes that were | |||
| were sent on the stream to make the same adjustment in its connection | sent on the stream to make the same adjustment in its connection flow | |||
| flow controller. | controller. | |||
| To avoid this de-synchronization, a RST_STREAM sender MUST include | To avoid this de-synchronization, a RST_STREAM sender MUST include | |||
| the final byte offset sent on the stream in the RST_STREAM frame. On | the final byte offset sent on the stream in the RST_STREAM frame. On | |||
| receiving a RST_STREAM frame, a receiver definitively knows how many | receiving a RST_STREAM frame, a receiver definitively knows how many | |||
| bytes were sent on that stream before the RST_STREAM frame, and the | bytes were sent on that stream before the RST_STREAM frame, and the | |||
| receiver MUST use the final offset to account for all bytes sent on | receiver MUST use the final offset to account for all bytes sent on | |||
| the stream in its connection level flow controller. | the stream in its connection level flow controller. | |||
| 10.1.2. Response to a RST_STREAM | 11.1.2. Response to a RST_STREAM | |||
| Since streams are bidirectional, a sender of a RST_STREAM needs to | Since streams are bidirectional, a sender of a RST_STREAM needs to | |||
| know how many bytes the peer has sent on the stream. If an endpoint | know how many bytes the peer has sent on the stream. If an endpoint | |||
| receives a RST_STREAM frame and has sent neither a FIN nor a | receives a RST_STREAM frame and has sent neither a FIN nor a | |||
| RST_STREAM, it MUST send a RST_STREAM in response, bearing the offset | RST_STREAM, it MUST send a RST_STREAM in response, bearing the offset | |||
| of the last byte sent on this stream as the final offset. | of the last byte sent on this stream as the final offset. | |||
| 10.1.3. Offset Increment | 11.1.3. Offset Increment | |||
| This document leaves when and how many bytes to advertise in a | This document leaves when and how many bytes to advertise in a | |||
| WINDOW_UPDATE to the implementation, but offers a few considerations. | WINDOW_UPDATE to the implementation, but offers a few considerations. | |||
| WINDOW_UPDATE frames constitute overhead, and therefore, sending a | WINDOW_UPDATE frames constitute overhead, and therefore, sending a | |||
| WINDOW_UPDATE with small offset increments is undesirable. At the | WINDOW_UPDATE with small offset increments is undesirable. At the | |||
| same time, sending WINDOW_UPDATES with large offset increments | same time, sending WINDOW_UPDATES with large offset increments | |||
| requires the sender to commit to that amount of buffer. | requires the sender to commit to that amount of buffer. | |||
| Implementations must find the correct tradeoff between these sides to | Implementations must find the correct tradeoff between these sides to | |||
| determine how large an offset increment to send in a WINDOW_UPDATE. | determine how large an offset increment to send in a WINDOW_UPDATE. | |||
| A receiver MAY use an autotuning mechanism to tune the size of the | A receiver MAY use an autotuning mechanism to tune the size of the | |||
| offset increment to advertise based on a roundtrip time estimate and | offset increment to advertise based on a roundtrip time estimate and | |||
| the rate at which the receiving application consumes data, similar to | the rate at which the receiving application consumes data, similar to | |||
| common TCP implementations. | common TCP implementations. | |||
| 10.1.4. BLOCKED frames | 11.1.4. BLOCKED frames | |||
| If a sender does not receive a WINDOW_UPDATE frame when it has run | If a sender does not receive a WINDOW_UPDATE frame when it has run | |||
| out of flow control credit, the sender will be blocked and MUST send | out of flow control credit, the sender will be blocked and MUST send | |||
| a BLOCKED frame. A BLOCKED frame is expected to be useful for | a BLOCKED frame. A BLOCKED frame is expected to be useful for | |||
| debugging at the receiver. A receiver SHOULD NOT wait for a BLOCKED | debugging at the receiver. A receiver SHOULD NOT wait for a BLOCKED | |||
| frame before sending with a WINDOW_UPDATE, since doing so will cause | frame before sending a WINDOW_UPDATE, since doing so will cause at | |||
| at least one roundtrip of quiescence. For smooth operation of the | least one roundtrip of quiescence. For smooth operation of the | |||
| congestion controller, it is generally considered best to not let the | congestion controller, it is generally considered best to not let the | |||
| sender go into quiescence if avoidable. To avoid blocking a sender, | sender go into quiescence if avoidable. To avoid blocking a sender, | |||
| and to reasonably account for the possibiity of loss, a receiver | and to reasonably account for the possibiity of loss, a receiver | |||
| should send a WINDOW_UPDATE frame at least two roundtrips before it | should send a WINDOW_UPDATE frame at least two roundtrips before it | |||
| expects the sender to get blocked. | expects the sender to get blocked. | |||
| 11. Error Codes | 12. Error Handling | |||
| An endpoint that detects an error SHOULD signal the existence of that | ||||
| error to its peer. Errors can affect an entire connection (see | ||||
| Section 12.1), or a single stream (see Section 12.2). | ||||
| The most appropriate error code (Section 12.3) SHOULD be included in | ||||
| the frame that signals the error. Where this specification | ||||
| identifies error conditions, it also identifies the error code that | ||||
| is used. | ||||
| Public Reset is not suitable for any error that can be signaled with | ||||
| a CONNECTION_CLOSE or RST_STREAM frame. Public Reset MUST NOT be | ||||
| sent by an endpoint that has the state necessary to send a frame on | ||||
| the connection. | ||||
| 12.1. Connection Errors | ||||
| Errors that result in the connection being unusable, such as an | ||||
| obvious violation of protocol semantics or corruption of state that | ||||
| affects an entire connection, MUST be signaled using a | ||||
| CONNECTION_CLOSE frame (Section 8.8). An endpoint MAY close the | ||||
| connection in this manner, even if the error only affects a single | ||||
| stream. | ||||
| A CONNECTION_CLOSE frame could be sent in a packet that is lost. An | ||||
| endpoint SHOULD be prepared to retransmit a packet containing a | ||||
| CONNECTION_CLOSE frame if it receives more packets on a terminated | ||||
| connection. Limiting the number of retransmissions and the time over | ||||
| which this final packet is sent limits the effort expended on | ||||
| terminated connections. | ||||
| An endpoint that chooses not to retransmit packets containing | ||||
| CONNECTION_CLOSE risks a peer missing the first such packet. The | ||||
| only mechanism available to an endpoint that continues to receive | ||||
| data for a terminated connection is to send a Public Reset packet. | ||||
| 12.2. Stream Errors | ||||
| If the error affects a single stream, but otherwise leaves the | ||||
| connection in a recoverable state, the endpoint can sent a RST_STREAM | ||||
| frame (Section 8.5) with an appropriate error code to terminate just | ||||
| the affected stream. | ||||
| Stream 1 is critical to the functioning of the entire connection. If | ||||
| stream 1 is closed with either a RST_STREAM or STREAM frame bearing | ||||
| the FIN flag, an endpoint MUST generate a connection error of type | ||||
| QUIC_CLOSED_CRITICAL_STREAM. | ||||
| Some application protocols make other streams critical to that | ||||
| protocol. An application protocol does not need to inform the | ||||
| transport that a stream is critical; it can instead generate | ||||
| appropriate errors in response to being notified that the critical | ||||
| stream is closed. | ||||
| An endpoint MAY send a RST_STREAM frame in the same packet as a | ||||
| CONNECTION_CLOSE frame. | ||||
| 12.3. Error Codes | ||||
| Error codes are 32 bits long, with the first two bits indicating the | Error codes are 32 bits long, with the first two bits indicating the | |||
| source of the error code: | source of the error code: | |||
| 0x0000-0x3FFF: Application-specific error codes. Defined by each | 0x00000000-0x3FFFFFFF: Application-specific error codes. Defined by | |||
| application-layer protocol. | each application-layer protocol. | |||
| 0x4000-0x7FFF: Reserved for host-local error codes. These codes | 0x40000000-0x7FFFFFFF: Reserved for host-local error codes. These | |||
| MUST NOT be sent to a peer, but MAY be used in API return codes | codes MUST NOT be sent to a peer, but MAY be used in API return | |||
| and logs. | codes and logs. | |||
| 0x8000-0xAFFF: QUIC transport error codes, including packet | 0x80000000-0xBFFFFFFF: QUIC transport error codes, including packet | |||
| protection errors. Applicable to all uses of QUIC. | protection errors. Applicable to all uses of QUIC. | |||
| 0xB000-0xFFFF: Cryptographic error codes. Defined by the crypto | 0xC0000000-0xFFFFFFFF: Cryptographic error codes. Defined by the | |||
| handshake protocol in use. | cryptographic handshake protocol in use. | |||
| This section lists the defined QUIC transport error codes that may be | This section lists the defined QUIC transport error codes that may be | |||
| used in a CONNECTION_CLOSE or RST_STREAM frame. Error codes share a | used in a CONNECTION_CLOSE or RST_STREAM frame. Error codes share a | |||
| common code space. Some error codes apply only to either streams or | common code space. Some error codes apply only to either streams or | |||
| the entire connection and have no defined semantics in the other | the entire connection and have no defined semantics in the other | |||
| context. | context. | |||
| QUIC_INTERNAL_ERROR (0x8001): Connection has reached an invalid | QUIC_INTERNAL_ERROR (0x80000001): Connection has reached an invalid | |||
| state. | state. | |||
| QUIC_STREAM_DATA_AFTER_TERMINATION (0x8002): There were data frames | QUIC_STREAM_DATA_AFTER_TERMINATION (0x80000002): There were data | |||
| after the a fin or reset. | frames after the a fin or reset. | |||
| QUIC_INVALID_PACKET_HEADER (0x8003): Control frame is malformed. | QUIC_INVALID_PACKET_HEADER (0x80000003): Control frame is malformed. | |||
| QUIC_INVALID_FRAME_DATA (0x8004): Frame data is malformed. | QUIC_INVALID_FRAME_DATA (0x80000004): Frame data is malformed. | |||
| QUIC_MISSING_PAYLOAD (0x8030): The packet contained no payload. | QUIC_MULTIPLE_TERMINATION_OFFSETS (0x80000005): Multiple final | |||
| offset values were received on the same stream | ||||
| QUIC_INVALID_STREAM_DATA (0x802e): STREAM frame data is malformed. | QUIC_STREAM_CANCELLED (0x80000006): The stream was cancelled | |||
| QUIC_OVERLAPPING_STREAM_DATA (0x8057): STREAM frame data overlaps | QUIC_CLOSED_CRITICAL_STREAM (0x80000007): A stream that is critical | |||
| with buffered data. | to the protocol was closed. | |||
| QUIC_UNENCRYPTED_STREAM_DATA (0x803d): Received STREAM frame data is | QUIC_MISSING_PAYLOAD (0x80000030): The packet contained no payload. | |||
| not encrypted. | ||||
| QUIC_MAYBE_CORRUPTED_MEMORY (0x8059): Received a frame which is | QUIC_INVALID_STREAM_DATA (0x8000002E): STREAM frame data is | |||
| malformed. | ||||
| QUIC_UNENCRYPTED_STREAM_DATA (0x8000003D): Received STREAM frame | ||||
| data is not encrypted. | ||||
| QUIC_MAYBE_CORRUPTED_MEMORY (0x80000059): Received a frame which is | ||||
| likely the result of memory corruption. | likely the result of memory corruption. | |||
| QUIC_INVALID_RST_STREAM_DATA (0x8006): RST_STREAM frame data is | QUIC_INVALID_RST_STREAM_DATA (0x80000006): RST_STREAM frame data is | |||
| malformed. | malformed. | |||
| QUIC_INVALID_CONNECTION_CLOSE_DATA (0x8007): CONNECTION_CLOSE frame | QUIC_INVALID_CONNECTION_CLOSE_DATA (0x80000007): CONNECTION_CLOSE | |||
| data is malformed. | frame data is malformed. | |||
| QUIC_INVALID_GOAWAY_DATA (0x8008): GOAWAY frame data is malformed. | ||||
| QUIC_INVALID_WINDOW_UPDATE_DATA (0x8039): WINDOW_UPDATE frame data | QUIC_INVALID_GOAWAY_DATA (0x80000008): GOAWAY frame data is | |||
| is malformed. | malformed. | |||
| QUIC_INVALID_BLOCKED_DATA (0x803a): BLOCKED frame data is malformed. | QUIC_INVALID_WINDOW_UPDATE_DATA (0x80000039): WINDOW_UPDATE frame | |||
| data is malformed. | ||||
| QUIC_INVALID_STOP_WAITING_DATA (0x803c): STOP_WAITING frame data is | QUIC_INVALID_BLOCKED_DATA (0x8000003A): BLOCKED frame data is | |||
| malformed. | malformed. | |||
| QUIC_INVALID_PATH_CLOSE_DATA (0x804e): PATH_CLOSE frame data is | QUIC_INVALID_PATH_CLOSE_DATA (0x8000004E): PATH_CLOSE frame data is | |||
| malformed. | malformed. | |||
| QUIC_INVALID_ACK_DATA (0x8009): ACK frame data is malformed. | QUIC_INVALID_ACK_DATA (0x80000009): ACK frame data is malformed. | |||
| QUIC_INVALID_VERSION_NEGOTIATION_PACKET (0x800a): Version | QUIC_INVALID_VERSION_NEGOTIATION_PACKET (0x8000000A): Version | |||
| negotiation packet is malformed. | negotiation packet is malformed. | |||
| QUIC_INVALID_PUBLIC_RST_PACKET (0x800b): Public RST packet is | QUIC_INVALID_PUBLIC_RST_PACKET (0x8000000b): Public RST packet is | |||
| malformed. | malformed. | |||
| QUIC_DECRYPTION_FAILURE (0x800c): There was an error decrypting. | QUIC_DECRYPTION_FAILURE (0x8000000c): There was an error decrypting. | |||
| QUIC_ENCRYPTION_FAILURE (0x800d): There was an error encrypting. | QUIC_ENCRYPTION_FAILURE (0x8000000d): There was an error encrypting. | |||
| QUIC_PACKET_TOO_LARGE (0x800e): The packet exceeded kMaxPacketSize. | QUIC_PACKET_TOO_LARGE (0x8000000e): The packet exceeded | |||
| kMaxPacketSize. | ||||
| QUIC_PEER_GOING_AWAY (0x8010): The peer is going away. May be a | QUIC_PEER_GOING_AWAY (0x80000010): The peer is going away. May be a | |||
| client or server. | client or server. | |||
| QUIC_INVALID_STREAM_ID (0x8011): A stream ID was invalid. | QUIC_INVALID_STREAM_ID (0x80000011): A stream ID was invalid. | |||
| QUIC_INVALID_PRIORITY (0x8031): A priority was invalid. | QUIC_INVALID_PRIORITY (0x80000031): A priority was invalid. | |||
| QUIC_TOO_MANY_OPEN_STREAMS (0x8012): Too many streams already open. | QUIC_TOO_MANY_OPEN_STREAMS (0x80000012): Too many streams already | |||
| open. | ||||
| QUIC_TOO_MANY_AVAILABLE_STREAMS (0x804c): The peer created too many | QUIC_TOO_MANY_AVAILABLE_STREAMS (0x8000004c): The peer created too | |||
| available streams. | many available streams. | |||
| QUIC_PUBLIC_RESET (0x8013): Received public reset for this | QUIC_PUBLIC_RESET (0x80000013): Received public reset for this | |||
| connection. | connection. | |||
| QUIC_INVALID_VERSION (0x8014): Invalid protocol version. | QUIC_INVALID_VERSION (0x80000014): Invalid protocol version. | |||
| QUIC_INVALID_HEADER_ID (0x8016): The Header ID for a stream was too | QUIC_INVALID_HEADER_ID (0x80000016): The Header ID for a stream was | |||
| far from the previous. | too far from the previous. | |||
| QUIC_INVALID_NEGOTIATED_VALUE (0x8017): Negotiable parameter | QUIC_INVALID_NEGOTIATED_VALUE (0x80000017): Negotiable parameter | |||
| received during handshake had invalid value. | received during handshake had invalid value. | |||
| QUIC_DECOMPRESSION_FAILURE (0x8018): There was an error | QUIC_DECOMPRESSION_FAILURE (0x80000018): There was an error | |||
| decompressing data. | decompressing data. | |||
| QUIC_NETWORK_IDLE_TIMEOUT (0x8019): The connection timed out due to | QUIC_NETWORK_IDLE_TIMEOUT (0x80000019): The connection timed out due | |||
| no network activity. | to no network activity. | |||
| QUIC_HANDSHAKE_TIMEOUT (0x8043): The connection timed out waiting | QUIC_HANDSHAKE_TIMEOUT (0x80000043): The connection timed out | |||
| for the handshake to complete. | waiting for the handshake to complete. | |||
| QUIC_ERROR_MIGRATING_ADDRESS (0x801a): There was an error | QUIC_ERROR_MIGRATING_ADDRESS (0x8000001a): There was an error | |||
| encountered migrating addresses. | encountered migrating addresses. | |||
| QUIC_ERROR_MIGRATING_PORT (0x8056): There was an error encountered | QUIC_ERROR_MIGRATING_PORT (0x80000056): There was an error | |||
| migrating port only. | encountered migrating port only. | |||
| QUIC_EMPTY_STREAM_FRAME_NO_FIN (0x8032): We received a STREAM_FRAME | QUIC_EMPTY_STREAM_FRAME_NO_FIN (0x80000032): We received a | |||
| with no data and no fin flag set. | STREAM_FRAME with no data and no fin flag set. | |||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA (0x803b): The peer received | QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA (0x8000003b): The peer | |||
| too much data, violating flow control. | received too much data, violating flow control. | |||
| QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA (0x803f): The peer sent too | QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA (0x8000003f): The peer sent too | |||
| much data, violating flow control. | much data, violating flow control. | |||
| QUIC_FLOW_CONTROL_INVALID_WINDOW (0x8040): The peer received an | QUIC_FLOW_CONTROL_INVALID_WINDOW (0x80000040): The peer received an | |||
| invalid flow control window. | invalid flow control window. | |||
| QUIC_CONNECTION_IP_POOLED (0x803e): The connection has been IP | QUIC_CONNECTION_IP_POOLED (0x8000003e): The connection has been IP | |||
| pooled into an existing connection. | pooled into an existing connection. | |||
| QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS (0x8044): The connection has | QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS (0x80000044): The connection | |||
| too many outstanding sent packets. | has too many outstanding sent packets. | |||
| QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS (0x8045): The connection | QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS (0x80000045): The | |||
| has too many outstanding received packets. | connection has too many outstanding received packets. | |||
| QUIC_CONNECTION_CANCELLED (0x8046): The QUIC connection has been | QUIC_CONNECTION_CANCELLED (0x80000046): The QUIC connection has been | |||
| cancelled. | cancelled. | |||
| QUIC_BAD_PACKET_LOSS_RATE (0x8047): Disabled QUIC because of high | QUIC_BAD_PACKET_LOSS_RATE (0x80000047): Disabled QUIC because of | |||
| packet loss rate. | high packet loss rate. | |||
| QUIC_PUBLIC_RESETS_POST_HANDSHAKE (0x8049): Disabled QUIC because of | QUIC_PUBLIC_RESETS_POST_HANDSHAKE (0x80000049): Disabled QUIC | |||
| too many PUBLIC_RESETs post handshake. | because of too many PUBLIC_RESETs post handshake. | |||
| QUIC_TIMEOUTS_WITH_OPEN_STREAMS (0x804a): Disabled QUIC because of | QUIC_TIMEOUTS_WITH_OPEN_STREAMS (0x8000004a): Disabled QUIC because | |||
| too many timeouts with streams open. | of too many timeouts with streams open. | |||
| QUIC_TOO_MANY_RTOS (0x8055): QUIC timed out after too many RTOs. | QUIC_TOO_MANY_RTOS (0x80000055): QUIC timed out after too many RTOs. | |||
| QUIC_ENCRYPTION_LEVEL_INCORRECT (0x802c): A packet was received with | QUIC_ENCRYPTION_LEVEL_INCORRECT (0x8000002c): A packet was received | |||
| the wrong encryption level (i.e. it should have been encrypted but | with the wrong encryption level (i.e. it should have been | |||
| was not.) | encrypted but was not.) | |||
| QUIC_VERSION_NEGOTIATION_MISMATCH (0x8037): This connection involved | QUIC_VERSION_NEGOTIATION_MISMATCH (0x80000037): This connection | |||
| a version negotiation which appears to have been tampered with. | involved a version negotiation which appears to have been tampered | |||
| with. | ||||
| QUIC_IP_ADDRESS_CHANGED (0x8050): IP address changed causing | QUIC_IP_ADDRESS_CHANGED (0x80000050): IP address changed causing | |||
| connection close. | connection close. | |||
| QUIC_TOO_MANY_FRAME_GAPS (0x805d): Stream frames arrived too | QUIC_ADDRESS_VALIDATION_FAILURE (0x80000051): Client address | |||
| validation failed. | ||||
| QUIC_TOO_MANY_FRAME_GAPS (0x8000005d): Stream frames arrived too | ||||
| discontiguously so that stream sequencer buffer maintains too many | discontiguously so that stream sequencer buffer maintains too many | |||
| gaps. | gaps. | |||
| QUIC_TOO_MANY_SESSIONS_ON_SERVER (0x8060): Connection closed because | QUIC_TOO_MANY_SESSIONS_ON_SERVER (0x80000060): Connection closed | |||
| server hit max number of sessions allowed. | because server hit max number of sessions allowed. | |||
| 12. Security and Privacy Considerations | 13. Security and Privacy Considerations | |||
| 12.1. Spoofed Ack Attack | 13.1. Spoofed ACK Attack | |||
| An attacker receives an STK from the server and then releases the IP | An attacker receives an STK from the server and then releases the IP | |||
| address on which it received the STK. The attacker may, in the | address on which it received the STK. The attacker may, in the | |||
| future, spoof this same address (which now presumably addresses a | future, spoof this same address (which now presumably addresses a | |||
| different endpoint), and initiate a 0-RTT connection with a server on | different endpoint), and initiate a 0-RTT connection with a server on | |||
| the victim's behalf. The attacker then spoofs ACK frames to the | the victim's behalf. The attacker then spoofs ACK frames to the | |||
| server which cause the server to potentially drown the victim in | server which cause the server to potentially drown the victim in | |||
| data. | data. | |||
| There are two possible mitigations to this attack. The simplest one | There are two possible mitigations to this attack. The simplest one | |||
| is that a server can unilaterally create a gap in packet-number | is that a server can unilaterally create a gap in packet-number | |||
| space. In the non-attack scenario, the client will send an ack with | space. In the non-attack scenario, the client will send an ACK frame | |||
| a larger largest acked. In the attack scenario, the attacker may ack | with the larger value for largest acknowledged. In the attack | |||
| a packet in the gap. If the server sees an ack for a packet that was | scenario, the attacker could acknowledge a packet in the gap. If the | |||
| never sent, the connection can be aborted. | server sees an acknowledgment for a packet that was never sent, the | |||
| connection can be aborted. | ||||
| The second mitigation is that the server can require that acks for | The second mitigation is that the server can require that | |||
| sent packets match the encryption level of the sent packet. This | acknowledgments for sent packets match the encryption level of the | |||
| mitigation is useful if the connection has an ephemeral forward- | sent packet. This mitigation is useful if the connection has an | |||
| secure key that is generated and used for every new connection. If a | ephemeral forward-secure key that is generated and used for every new | |||
| packet sent is encrypted with a forward-secure key, then any acks | connection. If a packet sent is encrypted with a forward-secure key, | |||
| that are received for them must also be forward-secure encrypted. | then any acknowledgments that are received for them MUST also be | |||
| Since the attacker will not have the forward secure key, the attacker | forward-secure encrypted. Since the attacker will not have the | |||
| will not be able to generate forward-secure encrypted ack packets. | forward secure key, the attacker will not be able to generate | |||
| forward-secure encrypted packets with ACK frames. | ||||
| 13. IANA Considerations | 14. IANA Considerations | |||
| This document has no IANA actions yet. | 14.1. QUIC Transport Parameter Registry | |||
| 14. References | IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | |||
| under a "QUIC Protocol" heading. | ||||
| 14.1. Normative References | The "QUIC Transport Parameters" registry governs a 16-bit space. | |||
| This space is split into two spaces that are governed by different | ||||
| policies. Values with the first byte in the range 0x00 to 0xfe (in | ||||
| hexadecimal) are assigned via the Specification Required policy | ||||
| [RFC5226]. Values with the first byte 0xff are reserved for Private | ||||
| Use [RFC5226]. | ||||
| Registrations MUST include the following fields: | ||||
| Value: The numeric value of the assignment (registrations will be | ||||
| between 0x0000 and 0xfeff). | ||||
| Parameter Name: A short mnemonic for the parameter. | ||||
| Specification: A reference to a publicly available specification for | ||||
| the value. | ||||
| The nominated expert(s) verify that a specification exists and is | ||||
| readily accessible. The expert(s) are encouraged to be biased | ||||
| towards approving registrations unless they are abusive, frivolous, | ||||
| or actively harmful (not merely aesthetically displeasing, or | ||||
| architecturally dubious). | ||||
| The initial contents of this registry are shown in Table 4. | ||||
| +--------+------------------------+---------------+ | ||||
| | Value | Parameter Name | Specification | | ||||
| +--------+------------------------+---------------+ | ||||
| | 0x0000 | stream_fc_offset | Section 7.3.1 | | ||||
| | | | | | ||||
| | 0x0001 | connection_fc_offset | Section 7.3.1 | | ||||
| | | | | | ||||
| | 0x0002 | concurrent_streams | Section 7.3.1 | | ||||
| | | | | | ||||
| | 0x0003 | idle_timeout | Section 7.3.1 | | ||||
| | | | | | ||||
| | 0x0004 | truncate_connection_id | Section 7.3.1 | | ||||
| +--------+------------------------+---------------+ | ||||
| Table 4: Initial QUIC Transport Parameters Entries | ||||
| 15. References | ||||
| 15.1. Normative References | ||||
| [I-D.ietf-tls-tls13] | ||||
| Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
| Version 1.3", draft-ietf-tls-tls13-19 (work in progress), | ||||
| March 2017. | ||||
| [QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
| Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
| and Congestion Control". | and Congestion Control". | |||
| [QUIC-TLS] | [QUIC-TLS] | |||
| Thomson, M., Ed. and S. Turner, Ed, Ed., "Using Transport | Thomson, M., Ed. and S. Turner, Ed., "Using Transport | |||
| Layer Security (TLS) to Secure QUIC". | Layer Security (TLS) to Secure QUIC". | |||
| [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | ||||
| DOI 10.17487/RFC1191, November 1990, | ||||
| <http://www.rfc-editor.org/info/rfc1191>. | ||||
| [RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU Discovery | ||||
| for IP version 6", RFC 1981, DOI 10.17487/RFC1981, August | ||||
| 1996, <http://www.rfc-editor.org/info/rfc1981>. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <http://www.rfc-editor.org/info/rfc2119>. | <http://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | [RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | |||
| Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007, | Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007, | |||
| <http://www.rfc-editor.org/info/rfc4821>. | <http://www.rfc-editor.org/info/rfc4821>. | |||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | IANA Considerations Section in RFCs", BCP 26, RFC 5226, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC5226, May 2008, | |||
| <http://www.rfc-editor.org/info/rfc7540>. | <http://www.rfc-editor.org/info/rfc5226>. | |||
| 14.2. Informative References | 15.2. Informative References | |||
| [EARLY-DESIGN] | [EARLY-DESIGN] | |||
| Roskind, J., "QUIC: Multiplexed Transport Over UDP", | Roskind, J., "QUIC: Multiplexed Transport Over UDP", | |||
| December 2013, <https://goo.gl/dMVtFi>. | December 2013, <https://goo.gl/dMVtFi>. | |||
| [QUIC-HTTP] | ||||
| Bishop, M., Ed., "Hypertext Transfer Protocol (HTTP) over | ||||
| QUIC". | ||||
| [QUICCrypto] | ||||
| Langley, A. and W. Chang, "QUIC Crypto", May 2016, | ||||
| <http://goo.gl/OuVSxa>. | ||||
| [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | |||
| RFC 2360, DOI 10.17487/RFC2360, June 1998, | RFC 2360, DOI 10.17487/RFC2360, June 1998, | |||
| <http://www.rfc-editor.org/info/rfc2360>. | <http://www.rfc-editor.org/info/rfc2360>. | |||
| [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | ||||
| "Randomness Requirements for Security", BCP 106, RFC 4086, | ||||
| DOI 10.17487/RFC4086, June 2005, | ||||
| <http://www.rfc-editor.org/info/rfc4086>. | ||||
| [RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | ||||
| "TCP Extensions for Multipath Operation with Multiple | ||||
| Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | ||||
| <http://www.rfc-editor.org/info/rfc6824>. | ||||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | ||||
| "Transport Layer Security (TLS) Application-Layer Protocol | ||||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | ||||
| July 2014, <http://www.rfc-editor.org/info/rfc7301>. | ||||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <http://www.rfc-editor.org/info/rfc7540>. | ||||
| [SST] Ford, B., "Structured Streams: A New Transport | [SST] Ford, B., "Structured Streams: A New Transport | |||
| Abstraction", ACM SIGCOMM 2007 , August 2007. | Abstraction", DOI 10.1145/1282427.1282421, ACM | |||
| SIGCOMM Computer Communication Review Volume 37 Issue 4, | ||||
| October 2007. | ||||
| 14.3. URIs | 15.3. URIs | |||
| [1] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | [1] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | |||
| Appendix A. Contributors | Appendix A. Contributors | |||
| The original authors of this specification were Ryan Hamilton, Jana | The original authors of this specification were Ryan Hamilton, Jana | |||
| Iyengar, Ian Swett, and Alyssa Wilk. | Iyengar, Ian Swett, and Alyssa Wilk. | |||
| The original design and rationale behind this protocol draw | The original design and rationale behind this protocol draw | |||
| significantly from work by Jim Roskind [EARLY-DESIGN]. In | significantly from work by Jim Roskind [EARLY-DESIGN]. In | |||
| skipping to change at page 47, line 5 ¶ | skipping to change at page 64, line 38 ¶ | |||
| This document has benefited immensely from various private | This document has benefited immensely from various private | |||
| discussions and public ones on the quic@ietf.org and proto- | discussions and public ones on the quic@ietf.org and proto- | |||
| quic@chromium.org mailing lists. Our thanks to all. | quic@chromium.org mailing lists. Our thanks to all. | |||
| Appendix C. Change Log | Appendix C. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| C.1. Since draft-ietf-quic-transport-00: | Issue and pull request numbers are listed with a leading octothorp. | |||
| C.1. Since draft-ietf-quic-transport-01: | ||||
| o Defined short and long packet headers (#40, #148, #361) | ||||
| o Defined a versioning scheme and stable fields (#51, #361) | ||||
| o Define reserved version values for "greasing" negotiation (#112, | ||||
| #278) | ||||
| o The initial packet number is randomized (#35, #283) | ||||
| o Narrow the packet number encoding range requirement (#67, #286, | ||||
| #299, #323, #356) | ||||
| o Defined client address validation (#52, #118, #120, #275) | ||||
| o Define transport parameters as a TLS extension (#122) | ||||
| o SCUP and COPT parameters are no longer valid (#116, #117) | ||||
| o Transport parameters for 0-RTT are either remembered from before, | ||||
| or assume default values (#126) | ||||
| o The server chooses connection IDs in its final flight (#119, #349, | ||||
| #361) | ||||
| o The server echoes the Connection ID and packet number fields when | ||||
| sending a Version Negotiation packet (#133, #295, #244) | ||||
| o Definied a minimum packet size for the initial handshake packet | ||||
| from the client (#69, #136, #139, #164) | ||||
| o Path MTU Discovery (#64, #106) | ||||
| o The initial handshake packet from the client needs to fit in a | ||||
| single packet (#338) | ||||
| o Forbid acknowledgment of packets containing only ACK and PADDING | ||||
| (#291) | ||||
| o Require that frames are processed when packets are acknowledged | ||||
| (#381, #341) | ||||
| o Removed the STOP_WAITING frame (#66) | ||||
| o Don't require retransmission of old timestamps for lost ACK frames | ||||
| (#308) | ||||
| o Clarified that frames are not retransmitted, but the information | ||||
| in them can be (#157, #298) | ||||
| o Error handling definitions (#335) | ||||
| o Split error codes into four sections (#74) | ||||
| o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | ||||
| (#289) | ||||
| o Define packet protection rules (#336) | ||||
| o Require that stream be entirely delivered or reset, including | ||||
| acknowledgment of all STREAM frames or the RST_STREAM, before it | ||||
| closes (#381) | ||||
| o Remove stream reservation from state machine (#174, #280) | ||||
| o Only stream 0 does not contributing to connection-level flow | ||||
| control (#204) | ||||
| o Stream 1 counts towards the maximum concurrent stream limit (#201, | ||||
| #282) | ||||
| o Remove connection-level flow control exclusion for some streams | ||||
| (except 1) (#246) | ||||
| o RST_STREAM affects connection-level flow control (#162, #163) | ||||
| o Flow control accounting uses the maximum data offset on each | ||||
| stream, rather than bytes received (#378) | ||||
| o Moved length-determining fields to the start of STREAM and ACK | ||||
| (#168, #277) | ||||
| o Added the ability to pad between frames (#158, #276) | ||||
| o Remove error code and reason phrase from GOAWAY (#352, #355) | ||||
| o GOAWAY includes a final stream number for both directions (#347) | ||||
| o Error codes for RST_STREAM and CONNECTION_CLOSE are now at a | ||||
| consistent offset (#249) | ||||
| o Defined priority as the responsibility of the application protocol | ||||
| (#104, #303) | ||||
| C.2. Since draft-ietf-quic-transport-00: | ||||
| o Replaced DIVERSIFICATION_NONCE flag with KEY_PHASE flag | o Replaced DIVERSIFICATION_NONCE flag with KEY_PHASE flag | |||
| o Defined versioning | o Defined versioning | |||
| o Reworked description of packet and frame layout | o Reworked description of packet and frame layout | |||
| o Error code space is divided into regions for each component | o Error code space is divided into regions for each component | |||
| C.2. Since draft-hamilton-quic-transport-protocol-01: | o Use big endian for all numeric values | |||
| C.3. Since draft-hamilton-quic-transport-protocol-01: | ||||
| o Adopted as base for draft-ietf-quic-tls. | o Adopted as base for draft-ietf-quic-tls. | |||
| o Updated authors/editors list. | o Updated authors/editors list. | |||
| o Added IANA Considerations section. | o Added IANA Considerations section. | |||
| o Moved Contributors and Acknowledgments to appendices. | o Moved Contributors and Acknowledgments to appendices. | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 369 change blocks. | ||||
| 991 lines changed or deleted | 1921 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||