| draft-ietf-quic-transport-02.txt | draft-ietf-quic-transport-03.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: September 14, 2017 Mozilla | Expires: November 22, 2017 Mozilla | |||
| March 13, 2017 | May 21, 2017 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-02 | draft-ietf-quic-transport-03 | |||
| Abstract | Abstract | |||
| This document defines the core of the QUIC transport protocol. This | This document defines the core of the QUIC transport protocol. This | |||
| document describes connection establishment, packet format, | document describes connection establishment, packet format, | |||
| multiplexing and reliability. Accompanying documents describe the | multiplexing and reliability. Accompanying documents describe the | |||
| cryptographic handshake and loss detection. | cryptographic handshake and loss detection. | |||
| Note to Readers | Note to Readers | |||
| skipping to change at page 1, line 44 ¶ | 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 September 14, 2017. | This Internet-Draft will expire on November 22, 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 | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| 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 . . . . . . . . . . . . . . . . . 5 | |||
| 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 | |||
| 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 5 | 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3.1. Low-Latency Connection Establishment . . . . . . . . . . 6 | 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 . 7 | |||
| 3.4. Stream and Connection Flow Control . . . . . . . . . . . 6 | 3.4. Stream and Connection Flow Control . . . . . . . . . . . 7 | |||
| 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 . . 8 | |||
| 3.7. Version Negotiation . . . . . . . . . . . . . . . . . . . 8 | 3.7. Version Negotiation . . . . . . . . . . . . . . . . . . . 8 | |||
| 4. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 4. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 9 | |||
| 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 9 | 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 12 | 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 13 | |||
| 5.4. Cleartext Packets . . . . . . . . . . . . . . . . . . . . 13 | 5.4. Cleartext Packets . . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.5. Encrypted Packets . . . . . . . . . . . . . . . . . . . . 14 | 5.4.1. Client Initial Packet . . . . . . . . . . . . . . . . 14 | |||
| 5.6. Public Reset Packet . . . . . . . . . . . . . . . . . . . 15 | 5.4.2. Server Stateless Retry Packet . . . . . . . . . . . . 15 | |||
| 5.6.1. Public Reset Proof . . . . . . . . . . . . . . . . . 15 | 5.4.3. Server Cleartext Packet . . . . . . . . . . . . . . . 15 | |||
| 5.7. Connection ID . . . . . . . . . . . . . . . . . . . . . . 16 | 5.4.4. Client Cleartext Packet . . . . . . . . . . . . . . . 16 | |||
| 5.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 16 | 5.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.8.1. Initial Packet Number . . . . . . . . . . . . . . . . 17 | 5.6. Public Reset Packet . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.9. Handling Packets from Different Versions . . . . . . . . 17 | 5.6.1. Public Reset Proof . . . . . . . . . . . . . . . . . 18 | |||
| 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 18 | 5.7. Connection ID . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 19 | 5.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 7.1. Version Negotiation . . . . . . . . . . . . . . . . . . . 19 | 5.8.1. Initial Packet Number . . . . . . . . . . . . . . . . 19 | |||
| 7.1.1. Using Reserved Versions . . . . . . . . . . . . . . . 20 | 5.9. Handling Packets from Different Versions . . . . . . . . 20 | |||
| 7.2. Cryptographic and Transport Handshake . . . . . . . . . . 21 | 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 20 | |||
| 7.3. Transport Parameters . . . . . . . . . . . . . . . . . . 22 | 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.3.1. Transport Parameter Definitions . . . . . . . . . . . 24 | 7.1. Version Negotiation . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.3.2. Values of Transport Parameters for 0-RTT . . . . . . 24 | 7.1.1. Using Reserved Versions . . . . . . . . . . . . . . . 24 | |||
| 7.3.3. New Transport Parameters . . . . . . . . . . . . . . 25 | 7.2. Cryptographic and Transport Handshake . . . . . . . . . . 24 | |||
| 7.3.4. Version Negotiation Validation . . . . . . . . . . . 25 | 7.3. Transport Parameters . . . . . . . . . . . . . . . . . . 25 | |||
| 7.4. Proof of Source Address Ownership . . . . . . . . . . . . 27 | 7.3.1. Transport Parameter Definitions . . . . . . . . . . . 27 | |||
| 7.4.1. Client Address Validation Procedure . . . . . . . . . 27 | 7.3.2. Values of Transport Parameters for 0-RTT . . . . . . 27 | |||
| 7.4.2. Address Validation on Session Resumption . . . . . . 28 | 7.3.3. New Transport Parameters . . . . . . . . . . . . . . 28 | |||
| 7.4.3. Address Validation Token Integrity . . . . . . . . . 29 | 7.3.4. Version Negotiation Validation . . . . . . . . . . . 28 | |||
| 7.5. Connection Migration . . . . . . . . . . . . . . . . . . 29 | 7.4. Stateless Retries . . . . . . . . . . . . . . . . . . . . 29 | |||
| 7.6. Connection Termination . . . . . . . . . . . . . . . . . 30 | 7.5. Proof of Source Address Ownership . . . . . . . . . . . . 30 | |||
| 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 31 | 7.5.1. Client Address Validation Procedure . . . . . . . . . 31 | |||
| 8.1. STREAM Frame . . . . . . . . . . . . . . . . . . . . . . 31 | 7.5.2. Address Validation on Session Resumption . . . . . . 31 | |||
| 8.2. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 32 | 7.5.3. Address Validation Token Integrity . . . . . . . . . 32 | |||
| 8.2.1. ACK Block Section . . . . . . . . . . . . . . . . . . 34 | 7.6. Connection Migration . . . . . . . . . . . . . . . . . . 32 | |||
| 8.2.2. Timestamp Section . . . . . . . . . . . . . . . . . . 35 | 7.6.1. Privacy Implications of Connection Migration . . . . 33 | |||
| 8.2.3. ACK Frames and Packet Protection . . . . . . . . . . 37 | 7.6.2. Address Validation for Migrated Connections . . . . . 34 | |||
| 8.3. WINDOW_UPDATE Frame . . . . . . . . . . . . . . . . . . . 38 | 7.7. Connection Termination . . . . . . . . . . . . . . . . . 34 | |||
| 8.4. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 39 | 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 35 | |||
| 8.5. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 39 | 8.1. STREAM Frame . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 8.6. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 40 | 8.2. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 8.7. PING frame . . . . . . . . . . . . . . . . . . . . . . . 40 | 8.2.1. ACK Block Section . . . . . . . . . . . . . . . . . . 39 | |||
| 8.8. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 40 | 8.2.2. Timestamp Section . . . . . . . . . . . . . . . . . . 40 | |||
| 8.9. GOAWAY Frame . . . . . . . . . . . . . . . . . . . . . . 41 | 8.2.3. ACK Frames and Packet Protection . . . . . . . . . . 41 | |||
| 9. Packetization and Reliability . . . . . . . . . . . . . . . . 42 | 8.3. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 9.1. Special Considerations for PMTU Discovery . . . . . . . . 44 | 8.4. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 43 | |||
| 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 45 | 8.5. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 44 | |||
| 10.1. Life of a Stream . . . . . . . . . . . . . . . . . . . . 45 | 8.6. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 10.1.1. idle . . . . . . . . . . . . . . . . . . . . . . . . 47 | 8.7. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 44 | |||
| 10.1.2. open . . . . . . . . . . . . . . . . . . . . . . . . 47 | 8.8. STREAM_ID_NEEDED Frame . . . . . . . . . . . . . . . . . 45 | |||
| 10.1.3. half-closed (local) . . . . . . . . . . . . . . . . 48 | 8.9. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 45 | |||
| 10.1.4. half-closed (remote) . . . . . . . . . . . . . . . . 48 | 8.10. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.1.5. closed . . . . . . . . . . . . . . . . . . . . . . . 48 | 8.11. PING frame . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 10.2. Stream Identifiers . . . . . . . . . . . . . . . . . . . 50 | 8.12. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 46 | |||
| 10.3. Stream Concurrency . . . . . . . . . . . . . . . . . . . 50 | 8.13. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 47 | |||
| 10.4. Sending and Receiving Data . . . . . . . . . . . . . . . 51 | 8.14. GOAWAY Frame . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 10.5. Stream Prioritization . . . . . . . . . . . . . . . . . 51 | 9. Packetization and Reliability . . . . . . . . . . . . . . . . 49 | |||
| 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 52 | 9.1. Special Considerations for PMTU Discovery . . . . . . . . 51 | |||
| 11.1. Edge Cases and Other Considerations . . . . . . . . . . 54 | 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 51 | |||
| 11.1.1. Mid-stream RST_STREAM . . . . . . . . . . . . . . . 54 | 10.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 52 | |||
| 11.1.2. Response to a RST_STREAM . . . . . . . . . . . . . . 54 | 10.2. Life of a Stream . . . . . . . . . . . . . . . . . . . . 52 | |||
| 11.1.3. Offset Increment . . . . . . . . . . . . . . . . . . 54 | 10.2.1. idle . . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 11.1.4. BLOCKED frames . . . . . . . . . . . . . . . . . . . 55 | 10.2.2. open . . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 55 | 10.2.3. half-closed (local) . . . . . . . . . . . . . . . . 55 | |||
| 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 55 | 10.2.4. half-closed (remote) . . . . . . . . . . . . . . . . 55 | |||
| 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 56 | 10.2.5. closed . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 12.3. Error Codes . . . . . . . . . . . . . . . . . . . . . . 56 | 10.3. Stream Concurrency . . . . . . . . . . . . . . . . . . . 56 | |||
| 13. Security and Privacy Considerations . . . . . . . . . . . . . 60 | 10.4. Sending and Receiving Data . . . . . . . . . . . . . . . 57 | |||
| 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 60 | 10.5. Stream Prioritization . . . . . . . . . . . . . . . . . 57 | |||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 61 | 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 61 | 11.1. Edge Cases and Other Considerations . . . . . . . . . . 59 | |||
| 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 62 | 11.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 60 | |||
| 15.1. Normative References . . . . . . . . . . . . . . . . . . 62 | 11.1.2. Data Limit Increments . . . . . . . . . . . . . . . 60 | |||
| 15.2. Informative References . . . . . . . . . . . . . . . . . 63 | 11.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 61 | |||
| 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 64 | 11.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 61 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 64 | 11.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 61 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 64 | 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 64 | 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 62 | |||
| C.1. Since draft-ietf-quic-transport-01: . . . . . . . . . . . 64 | 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 63 | |||
| C.2. Since draft-ietf-quic-transport-00: . . . . . . . . . . . 66 | 12.3. Error Codes . . . . . . . . . . . . . . . . . . . . . . 63 | |||
| C.3. Since draft-hamilton-quic-transport-protocol-01: . . . . 67 | 13. Security and Privacy Considerations . . . . . . . . . . . . . 67 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 67 | 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 67 | |||
| 13.2. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 68 | ||||
| 13.3. Stream Fragmentation and Reassembly Attacks . . . . . . 68 | ||||
| 13.4. Stream Commitment Attack . . . . . . . . . . . . . . . . 68 | ||||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 69 | ||||
| 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 69 | ||||
| 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 70 | ||||
| 15.1. Normative References . . . . . . . . . . . . . . . . . . 70 | ||||
| 15.2. Informative References . . . . . . . . . . . . . . . . . 71 | ||||
| 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 72 | ||||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 72 | ||||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 72 | ||||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 72 | ||||
| C.1. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 72 | ||||
| C.2. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 73 | ||||
| C.3. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 75 | ||||
| C.4. Since draft-hamilton-quic-transport-protocol-01 . . . . . 76 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 76 | ||||
| 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 aims to provide a flexible set of features that allow | of UDP. QUIC aims to provide a flexible set of features that allow | |||
| it to be a general-purpose transport for multiple applications. | it to be a general-purpose transport for multiple applications. | |||
| QUIC implements techniques learned from experience with TCP, SCTP and | QUIC implements techniques learned from experience with TCP, SCTP and | |||
| other transport protocols. Using UDP as the substrate, QUIC seeks to | other transport protocols. Using UDP as the substrate, QUIC seeks to | |||
| be compatible with legacy clients and middleboxes. QUIC | be compatible with legacy clients and middleboxes. QUIC | |||
| skipping to change at page 6, line 12 ¶ | skipping to change at page 6, line 31 ¶ | |||
| o Version negotiation | o Version negotiation | |||
| 3.1. Low-Latency Connection Establishment | 3.1. Low-Latency Connection Establishment | |||
| QUIC relies on a combined cryptographic and transport handshake for | QUIC relies on a combined cryptographic and transport handshake for | |||
| setting up a secure transport connection. QUIC connections are | setting up a secure transport connection. QUIC connections are | |||
| expected to 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 0) to be used for performing | |||
| the cryptographic handshake and QUIC options negotiation. The format | the cryptographic handshake and QUIC options negotiation. The format | |||
| of the QUIC options and parameters used during negotiation are | of the QUIC options and parameters used during negotiation are | |||
| described in this document, but the handshake protocol that runs on | described in this document, but the handshake protocol that runs on | |||
| Stream ID 1 is described in the accompanying cryptographic handshake | Stream ID 0 is described in the accompanying cryptographic handshake | |||
| draft [QUIC-TLS]. | 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. | |||
| skipping to change at page 6, line 49 ¶ | skipping to change at page 7, line 23 ¶ | |||
| ambiguity problem. QUIC acknowledgments also explicitly encode the | ambiguity problem. QUIC acknowledgments also explicitly encode the | |||
| delay between the receipt of a packet and its acknowledgment being | delay between the receipt of a packet and its acknowledgment being | |||
| sent, and together with the monotonically-increasing packet numbers, | sent, and together with the monotonically-increasing packet numbers, | |||
| this allows for precise network roundtrip-time (RTT) calculation. | this allows for precise network roundtrip-time (RTT) calculation. | |||
| QUIC's ACK frames support up to 256 ACK blocks, so QUIC is more | QUIC's ACK frames support up to 256 ACK blocks, so QUIC is more | |||
| resilient to reordering than TCP with SACK support, as well as able | resilient to reordering than TCP with SACK support, as well as able | |||
| to keep more 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. At a high | |||
| following HTTP/2's flow control mechanisms. At a high level, a QUIC | level, a QUIC receiver advertises the maximum amount of data that it | |||
| receiver advertises the absolute byte offset within each stream up to | is willing to receive on each stream. As data is sent, received, and | |||
| which the receiver is willing to receive data. As data is sent, | delivered on a particular stream, the receiver sends MAX_STREAM_DATA | |||
| received, and delivered on a particular stream, the receiver sends | frames that increase the advertised limit for that stream, allowing | |||
| WINDOW_UPDATE frames that increase the advertised offset limit for | the peer to send more data on that stream. | |||
| that stream, allowing the peer to send more data on that stream. In | ||||
| addition to this stream-level flow control, QUIC implements | In addition to this stream-level flow control, QUIC implements | |||
| connection-level flow control to limit the aggregate buffer that a | connection-level flow control to limit the aggregate buffer that a | |||
| QUIC receiver is willing to allocate to all streams on a connection. | QUIC receiver is willing to allocate to all streams on a connection. | |||
| Connection-level flow control works in the same way as stream-level | Connection-level flow control works in the same way as stream-level | |||
| flow control, but the bytes delivered and highest received offset are | flow control, but the bytes delivered and the limits are aggregated | |||
| all aggregates across all streams. | across all streams. | |||
| 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 | |||
| skipping to change at page 8, line 19 ¶ | skipping to change at page 8, line 39 ¶ | |||
| described in Section 7.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. | |||
| Version 0x000000001 of QUIC uses TLS as a cryptographic handshake | ||||
| protocol, as described in [QUIC-TLS]. | ||||
| 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 | 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 | forcing version negotiation to be exercised. That is, any version | |||
| number where the low four bits of all octets is 1010 (in binary). A | 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 | client or server MAY advertise support for any of these reserved | |||
| versions. | versions. | |||
| Reserved version numbers will probably never represent a real | Reserved version numbers will probably never represent a real | |||
| skipping to change at page 10, line 20 ¶ | skipping to change at page 11, line 7 ¶ | |||
| Version: Octets 13 to 16 contain the selected protocol version. | Version: Octets 13 to 16 contain the selected protocol version. | |||
| This field indicates which version of QUIC is in use and | This field indicates which version of QUIC is in use and | |||
| determines how the rest of the protocol fields are interpreted. | determines how the rest of the protocol fields are interpreted. | |||
| Payload: Octets from 17 onwards (the rest of QUIC packet) are the | Payload: Octets from 17 onwards (the rest of QUIC packet) are the | |||
| payload of the packet. | payload of the packet. | |||
| The following packet types are defined: | The following packet types are defined: | |||
| +------+-------------------------------+-------------+ | +------+-------------------------------+---------------+ | |||
| | Type | Name | Section | | | Type | Name | Section | | |||
| +------+-------------------------------+-------------+ | +------+-------------------------------+---------------+ | |||
| | 01 | Version Negotiation | Section 5.3 | | | 01 | Version Negotiation | Section 5.3 | | |||
| | | | | | | | | | | |||
| | 02 | Client Cleartext | Section 5.4 | | | 02 | Client Initial | Section 5.4.1 | | |||
| | | | | | | | | | | |||
| | 03 | Non-Final Server Cleartext | Section 5.4 | | | 03 | Server Stateless Retry | Section 5.4.2 | | |||
| | | | | | | | | | | |||
| | 04 | Final Server Cleartext | Section 5.4 | | | 04 | Server Cleartext | Section 5.4.3 | | |||
| | | | | | | | | | | |||
| | 05 | 0-RTT Encrypted | Section 5.5 | | | 05 | Client Cleartext | Section 5.4.4 | | |||
| | | | | | | | | | | |||
| | 06 | 1-RTT Encrypted (key phase 0) | Section 5.5 | | | 06 | 0-RTT Protected | Section 5.5 | | |||
| | | | | | | | | | | |||
| | 07 | 1-RTT Encrypted (key phase 1) | Section 5.5 | | | 07 | 1-RTT Protected (key phase 0) | Section 5.5 | | |||
| | | | | | | | | | | |||
| | 08 | Public Reset | Section 5.6 | | | 08 | 1-RTT Protected (key phase 1) | Section 5.5 | | |||
| +------+-------------------------------+-------------+ | | | | | | |||
| | 09 | Public Reset | Section 5.6 | | ||||
| +------+-------------------------------+---------------+ | ||||
| Table 1: Long Header Packet Types | Table 1: Long Header Packet Types | |||
| The header form, packet type, connection ID, packet number and | The header form, packet type, connection ID, packet number and | |||
| version fields of a long header packet are version-independent. The | version fields of a long header packet are version-independent. The | |||
| types of packets defined in Table 1 are version-specific. See | types of packets defined in Table 1 are version-specific. See | |||
| Section 5.9 for details on how packets from different versions of | Section 5.9 for details on how packets from different versions of | |||
| QUIC are interpreted. | QUIC are interpreted. | |||
| (TODO: Should the list of packet types be version-independent?) | (TODO: Should the list of packet types be version-independent?) | |||
| The interpretation of the fields and the payload are specific to a | The interpretation of the fields and the payload are specific to a | |||
| version and packet type. Type-specific semantics for this version | version and packet type. Type-specific semantics for this version | |||
| are described in Section 5.3, Section 5.6, Section 5.4, and | are described in the following sections. | |||
| Section 5.5. | ||||
| 5.2. Short Header | 5.2. Short 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 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |0|C|K| Type (5)| | |0|C|K| Type (5)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + [Connection ID (64)] + | + [Connection ID (64)] + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) ... | | Packet Number (8/16/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Encrypted Payload (*) ... | | Protected Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 2: Short Header Format | Figure 2: Short Header Format | |||
| The short header can be used after the version and 1-RTT keys are | The short header can be used after the version and 1-RTT keys are | |||
| negotiated. This header form has the following fields: | negotiated. This header form has the following fields: | |||
| Header Form: The most significant bit (0x80) of the first octet of a | 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 | packet is the header form. This bit is set to 0 for the short | |||
| header. | header. | |||
| skipping to change at page 12, line 9 ¶ | skipping to change at page 12, line 49 ¶ | |||
| for short packets. | for short packets. | |||
| Connection ID: If the Connection ID Flag is set, a connection ID | 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 | occupies octets 1 through 8 of the packet. See Section 5.7 for | |||
| more details. | more details. | |||
| Packet Number: The length of the packet number field depends on the | Packet Number: The length of the packet number field depends on the | |||
| packet type. This field can be 1, 2 or 4 octets long depending on | packet type. This field can be 1, 2 or 4 octets long depending on | |||
| the short packet type. | the short packet type. | |||
| Encrypted Payload: Packets with a short header always include a | Protected Payload: Packets with a short header always include a | |||
| 1-RTT protected payload. | 1-RTT protected payload. | |||
| The packet type in a short header currently determines only the size | The packet type in a short header currently determines only the size | |||
| of the packet number field. Additional types can be used to signal | of the packet number field. Additional types can be used to signal | |||
| the presence of other fields. | the presence of other fields. | |||
| +------+--------------------+ | +------+--------------------+ | |||
| | Type | Packet Number Size | | | Type | Packet Number Size | | |||
| +------+--------------------+ | +------+--------------------+ | |||
| | 01 | 1 octet | | | 01 | 1 octet | | |||
| skipping to change at page 12, line 35 ¶ | skipping to change at page 13, line 28 ¶ | |||
| Table 2: Short Header Packet Types | Table 2: Short Header Packet Types | |||
| The header form, connection ID flag and connection ID of a short | The header form, connection ID flag and connection ID of a short | |||
| header packet are version-independent. The remaining fields are | header packet are version-independent. The remaining fields are | |||
| specific to the selected QUIC version. See Section 5.9 for details | specific to the selected QUIC version. See Section 5.9 for details | |||
| on how packets from different versions of QUIC are interpreted. | on how packets from different versions of QUIC are interpreted. | |||
| 5.3. Version Negotiation Packet | 5.3. Version Negotiation Packet | |||
| A Version Negotiation packet is sent only by servers and is a | A Version Negotiation packet has long headers with a type value of | |||
| response to a client packet of an unsupported version. It uses a | 0x01 and is sent only by servers. The Version Negotiation packet is | |||
| long header and contains: | a response to a client packet that contains a version that is not | |||
| supported by the server. | ||||
| o Octet 0: 0x81 | ||||
| o Octets 1-8: Connection ID (echoed) | ||||
| o Octets 9-12: Packet Number (echoed) | ||||
| o Octets 13-16: Version (echoed) | The connection ID field contains a server-selected connection ID that | |||
| the client MUST use for subsequent packets, see Section 5.7. | ||||
| o Octets 17+: Payload | The packet number and version fields echo corresponding values from | |||
| the triggering client packet. This allows clients some assurance | ||||
| that the server received the packet and that the Version Negotiation | ||||
| packet was not carried in a packet with a spoofed source address. | ||||
| The payload of the Version Negotiation packet is a list of 32-bit | The payload of the Version Negotiation packet is a list of 32-bit | |||
| versions which the server supports, as shown below. | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Supported Version 1 (32) ... | | Supported Version 1 (32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Supported Version 2 (32)] ... | | [Supported Version 2 (32)] ... | |||
| skipping to change at page 13, line 24 ¶ | skipping to change at page 14, line 24 ¶ | |||
| | [Supported Version N (32)] ... | | [Supported Version N (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Version Negotiation Packet | Figure 3: Version Negotiation Packet | |||
| See Section 7.1 for a description of the version negotiation process. | See Section 7.1 for a description of the version negotiation process. | |||
| 5.4. Cleartext Packets | 5.4. Cleartext Packets | |||
| Cleartext packets are sent during the handshake prior to key | Cleartext packets are sent during the handshake prior to key | |||
| negotiation. A Client Cleartext packet contains: | negotiation. | |||
| o Octet 0: 0x82 | All cleartext packets contain the current QUIC version in the version | |||
| field. | ||||
| o Octets 1-8: Connection ID (initial) | The payload of cleartext packets also includes an integrity check, | |||
| which is described in [QUIC-TLS]. | ||||
| o Octets 9-12: Packet number | 5.4.1. Client Initial Packet | |||
| o Octets 13-16: Version | The Client Initial packet uses long headers with a type value of | |||
| 0x02. It carries the first cryptographic handshake message sent by | ||||
| the client. | ||||
| o Octets 17+: Payload | The client populates the connection ID field with randomly selected | |||
| values, unless it has received a packet from the server. If the | ||||
| client has received a packet from the server, the connection ID field | ||||
| uses the value provided by the server. | ||||
| Non-Final Server Cleartext packets contain: | The packet number used for Client Initial packets is initialized with | |||
| a random value each time the new contents are created for the packet. | ||||
| Retransmissions of the packet contents increment the packet number by | ||||
| one, see (Section 5.8). | ||||
| o Octet 0: 0x83 | The payload of a Client Initial packet consists of a STREAM frame (or | |||
| frames) for stream 0 containing a cryptographic handshake message, | ||||
| plus any PADDING frames necessary to ensure that the packet is at | ||||
| least the minimum size (see Section 9). This stream frame always | ||||
| starts at an offset of 0 (see Section 7.4). | ||||
| o Octets 1-8: Connection ID (echoed) | The client uses the Client Initial Packet type for any packet that | |||
| contains an initial cryptographic handshake message. This includes | ||||
| all cases where a new packet containing the initial cryptographic | ||||
| message needs to be created, this includes the packets sent after | ||||
| receiving a Version Negotiation (Section 5.3) or Server Stateless | ||||
| Retry packet (Section 5.4.2). | ||||
| o Octets 9-12: Packet Number | 5.4.2. Server Stateless Retry Packet | |||
| o Octets 13-16: Version | A Server Stateless Retry packet uses long headers with a type value | |||
| of 0x03. It carries cryptographic handshake messages and | ||||
| acknowledgments. It is used by a server that wishes to perform a | ||||
| stateless retry (see Section 7.4). | ||||
| o Octets 17+: Payload | The connection ID field in a Server Stateless Retry packet contains a | |||
| server selected value, see Section 5.7. | ||||
| Final Server Cleartext packets contains: | The packet number field echoes the packet number of the triggering | |||
| client packet. This allows a client to verify that the server | ||||
| received its packet. | ||||
| o Octet 0: 0x84 | After receiving a Server Stateless Retry packet, the client uses a | |||
| new Client Initial packet containing the next cryptographic handshake | ||||
| message. The client retains the state of its cryptographic | ||||
| handshake, but discards all transport state. In effect, the next | ||||
| cryptographic handshake message is sent on a new connection. The new | ||||
| Client Initial packet is sent in a packet with a newly randomized | ||||
| packet number and starting at a stream offset of 0. | ||||
| o Octets 1-8: Connection ID (final) | Continuing the cryptographic handshake is necessary to ensure that an | |||
| o Octets 9-12: Packet Number | attacker cannot force a downgrade of any cryptographic parameters. | |||
| In addition to continuing the cryptographic handshake, the client | ||||
| MUST remember the results of any version negotiation that occurred | ||||
| (see Section 7.1). The client MAY also retain any observed RTT or | ||||
| congestion state that it has accumulated for the flow, but other | ||||
| transport state MUST be discarded. | ||||
| o Octets 13-16: Version | The payload of the Server Stateless Retry packet contains STREAM | |||
| frames and could contain PADDING and ACK frames. A server can only | ||||
| send a single Server Stateless Retry packet in response to each | ||||
| Client Initial packet that is receives. | ||||
| o Octets 17+: Payload | 5.4.3. Server Cleartext Packet | |||
| The client MUST choose a random 64-bit value and use it as the | A Server Cleartext packet uses long headers with a type value of | |||
| initial Connection ID in all packets until the server replies with | 0x04. It is used to carry acknowledgments and cryptographic | |||
| the final Connection ID. The server echoes the client's Connection | handshake messages from the server. | |||
| 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, | The connection ID field in a Server Cleartext packet contains a | |||
| as described in Section 6. | connection ID that is chosen by the server (see Section 5.7). | |||
| (TODO: Add hash before frames.) | The first Server Cleartext packet contains a randomized packet | |||
| number. This value is increased for each subsequent packet sent by | ||||
| the server as described in Section 5.8. | ||||
| 5.5. Encrypted Packets | The payload of this packet contains STREAM frames and could contain | |||
| PADDING and ACK frames. | ||||
| Packets encrypted with either 0-RTT or 1-RTT keys may be sent with | 5.4.4. Client Cleartext Packet | |||
| long headers. Different packet types explicitly indicate the | ||||
| encryption level for ease of decryption. These packets contain: | ||||
| o Octet 0: 0x85, 0x86 or 0x87 | A Client Cleartext packet uses long headers with a type value of | |||
| 0x05, and is sent when the client has received a Server Cleartext | ||||
| packet from the server. | ||||
| o Octets 1-8: Connection ID (initial or final) | The connection ID field in a Client Cleartext packet contains a | |||
| server-selected connection ID, see Section 5.7. | ||||
| o Octets 9-12: Packet Number | The Client Cleartext packet includes a packet number that is one | |||
| higher than the last Client Initial, 0-RTT Protected or Client | ||||
| Cleartext packet that was sent. The packet number is incremented for | ||||
| each subsequent packet, see Section 5.8. | ||||
| o Octets 13-16: Version | The payload of this packet contains STREAM frames and could contain | |||
| PADDING and ACK frames. | ||||
| o Octets 17+: Encrypted Payload | 5.5. Protected Packets | |||
| A first octet of 0x85 indicates a 0-RTT packet. After the 1-RTT keys | Packets that are protected with 0-RTT keys are sent with long | |||
| are established, key phases are used by the QUIC packet protection to | headers. Packets that are protected with 1-RTT keys MAY be sent with | |||
| identify the correct packet protection keys. The initial key phase | long headers. The different packet types explicitly indicate the | |||
| is 0. See [QUIC-TLS] for more details. | encryption level and therefore the keys that are used to remove | |||
| packet protection. | ||||
| The encrypted payload is both authenticated and encrypted using | Packets protected with 0-RTT keys use a type value of 0x06. The | |||
| packet protection keys. [QUIC-TLS] describes packet protection in | connection ID field for a 0-RTT packet is selected by the client. | |||
| detail. After decryption, the plaintext consists of a sequence of | ||||
| frames, as described in Section 6. | The client can send 0-RTT packets after having received a packet from | |||
| the server if that packet does not complete the handshake. Even if | ||||
| the client receives a different connection ID from the server, it | ||||
| MUST NOT update the connection ID it uses for 0-RTT packets. This | ||||
| enables consistent routing for all 0-RTT packets. | ||||
| Packets protected with 1-RTT keys that use long headers use a type | ||||
| value of 0x07 for key phase 0 and 0x08 for key phase 1; see | ||||
| [QUIC-TLS] for more details on the use of key phases. The connection | ||||
| ID field for these packet types MUST contain the value selected by | ||||
| the server, see Section 5.7. | ||||
| The version field for protected packets is the current QUIC version. | ||||
| The packet number field contains a packet number, which increases | ||||
| with each packet sent, see Section 5.8 for details. | ||||
| The payload is protected using authenticated encryption. [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 | 5.6. Public Reset Packet | |||
| A Public Reset packet is only sent by servers and is used to abruptly | A Public Reset packet is only sent by servers and is used to abruptly | |||
| terminate communications. Public Reset is provided as an option of | 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 | 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 | 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 | (for example, through a crash or outage). A server that wishes to | |||
| communicate a fatal connection error MUST use a CONNECTION_CLOSE | communicate a fatal connection error MUST use a CONNECTION_CLOSE | |||
| frame if it has sufficient state to do so. | frame if it has sufficient state to do so. | |||
| A Public Reset packet contains: | A Public Reset packet uses long headers with a type value of 0x09. | |||
| 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 | The connection ID and packet number of fields together contain octets | |||
| 1 through 12 from the packet that triggered the reset. For a client | ||||
| that sends a connection ID on every packet, the Connection ID field | ||||
| is simply an echo of the client's Connection ID, and the Packet | ||||
| Number field includes an echo of the client's packet number. | ||||
| Depending on the client's packet number length it might also include | ||||
| 0, 2, or 3 additional octets from the protected payload of the client | ||||
| packet. | ||||
| For a client that sends a connection ID on every packet, the | The version field contains the current QUIC version. | |||
| 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 | A Public Reset packet sent by a server indicates that it does not | |||
| have the state necessary to continue with a connection. In this | have the state necessary to continue with a connection. In this | |||
| case, the server will include the fields that prove that it | case, the server will include the fields that prove that it | |||
| originally participated in the connection (see Section 5.6.1 for | originally participated in the connection (see Section 5.6.1 for | |||
| details). | details). | |||
| Upon receipt of a Public Reset packet that contains a valid proof, a | 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 tear down state associated with the connection. The | |||
| client MUST then cease sending packets on the connection and SHOULD | client MUST then cease sending packets on the connection and SHOULD | |||
| skipping to change at page 16, line 14 ¶ | skipping to change at page 18, line 18 ¶ | |||
| 5.7. Connection ID | 5.7. Connection ID | |||
| QUIC connections are identified by their 64-bit Connection ID. All | QUIC connections are identified by their 64-bit Connection ID. All | |||
| long headers contain a Connection ID. Short headers indicate the | long headers contain a Connection ID. Short headers indicate the | |||
| presence of a Connection ID using the CONNECTION_ID flag. When | presence of a Connection ID using the CONNECTION_ID flag. When | |||
| present, the Connection ID is in the same location in all packet | present, the Connection ID is in the same location in all packet | |||
| headers, making it straightforward for middleboxes, such as load | headers, making it straightforward for middleboxes, such as load | |||
| balancers, to locate and use it. | balancers, to locate and use it. | |||
| When a connection is initiated, the client MUST choose a random value | The client MUST choose a random connection ID and use it in Client | |||
| and use it as the initial Connection ID until the final value is | Initial packets (Section 5.4.1). If the client has received any | |||
| available. The initial Connection ID is a suggestion to the server. | packet from the server, it uses the connection ID it received from | |||
| The server echoes this value in all packets until the handshake is | the server. | |||
| 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- | When the server receives a Client Initial packet, it chooses a new | |||
| Final Server Cleartext packets MUST use the client's randomly- | value for the connection ID and sends that in its response. The | |||
| generated initial Connection ID. Final Server Cleartext packets, | server MUST send a new connection ID in any packet that is sent in | |||
| 1-RTT Encrypted packets, and all short-header packets MUST use the | response to a Client Initial packet. This includes Version | |||
| final Connection ID. | Negotiation (Section 5.3), Server Stateless Retry (Section 5.4.2), | |||
| and the first Server Cleartext packet (Section 5.4.3). The server | ||||
| MAY choose to use the value that the client initially selects. | ||||
| A server MUST NOT propose a different connection ID in response to a | ||||
| Client Cleartext packet (Section 5.4.4). A Client Cleartext packet | ||||
| is only sent after the server has committed to maintaining connection | ||||
| state. | ||||
| 5.8. Packet Numbers | 5.8. Packet Numbers | |||
| The packet number is a 64-bit unsigned number and is used as part of | 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 cryptographic nonce for packet encryption. Each endpoint maintains | |||
| a separate packet number for sending and receiving. The packet | a separate packet number for sending and receiving. The packet | |||
| number for sending MUST increase by at least one after sending any | number for sending MUST increase by at least one after sending any | |||
| packet. | packet, unless otherwise specified (see Section 5.8.1). | |||
| A QUIC endpoint MUST NOT reuse a packet number within the same | A QUIC endpoint MUST NOT reuse a packet number within the same | |||
| connection (that is, under the same cryptographic keys). If the | connection (that is, under the same cryptographic keys). If the | |||
| packet number for sending reaches 2^64 - 1, the sender MUST close 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 | connection by sending a CONNECTION_CLOSE frame with the error code | |||
| QUIC_SEQUENCE_NUMBER_LIMIT_REACHED (connection termination is | QUIC_SEQUENCE_NUMBER_LIMIT_REACHED (connection termination is | |||
| described in Section 7.6.) | described in Section 7.7.) | |||
| To reduce the number of bits required to represent the packet number | To reduce the number of bits required to represent the packet number | |||
| over the wire, only the least significant bits of 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 | are transmitted over the wire, up to 32 bits. The actual packet | |||
| number for each packet is reconstructed at the receiver based on the | number for each packet is reconstructed at the receiver based on the | |||
| largest packet number received on a successfully authenticated | largest packet number received on a successfully authenticated | |||
| packet. | packet. | |||
| A packet number is decoded by finding the packet number value that is | 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 | closest to the next expected packet. The next expected packet is the | |||
| skipping to change at page 17, line 29 ¶ | skipping to change at page 19, line 33 ¶ | |||
| As a result, the size of the packet number encoding is at least one | 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 | more than the base 2 logarithm of the number of contiguous | |||
| unacknowledged packet numbers, including the new packet. | unacknowledged packet numbers, including the new packet. | |||
| For example, if an endpoint has received an acknowledgment for packet | For example, if an endpoint has received an acknowledgment for packet | |||
| 0x6afa2f, sending a packet with a number of 0x6b4264 requires a | 0x6afa2f, sending a packet with a number of 0x6b4264 requires a | |||
| 16-bit or larger packet number encoding; whereas a 32-bit packet | 16-bit or larger packet number encoding; whereas a 32-bit packet | |||
| number is needed to send a packet with a number of 0x6bc107. | number is needed to send a packet with a number of 0x6bc107. | |||
| Version Negotiation (Section 5.3), Server Stateless Retry | ||||
| (Section 5.4.2), and Public Reset (Section 5.6) packets have special | ||||
| rules for populating the packet number field. | ||||
| 5.8.1. Initial Packet Number | 5.8.1. Initial Packet Number | |||
| The initial value for packet number MUST be a 31-bit random number. | The initial value for packet number MUST be selected from an uniform | |||
| That is, the value is selected from an uniform random distribution | random distribution between 0 and 2^31-1. That is, the lower 31 bits | |||
| between 0 and 2^31-1. [RFC4086] provides guidance on the generation | of the packet number are randomized. [RFC4086] provides guidance on | |||
| of random values. | the generation of random values. | |||
| The first set of packets sent by an endpoint MUST include the low | 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, | 32-bits of the packet number. Once any packet has been acknowledged, | |||
| subsequent packets can use a shorter packet number encoding. | subsequent packets can use a shorter packet number encoding. | |||
| A client that receives a Version Negotiation (Section 5.3) or Server | ||||
| Stateless Retry packet (Section 5.4.2) MUST generate a new initial | ||||
| packet number. This ensures that the first transmission attempt for | ||||
| a Client Initial packet (Section 5.4.1) always contains a randomized | ||||
| packet number, but packets that contain retransmissions increment the | ||||
| packet number. | ||||
| A client MUST NOT generate a new initial packet number if it discards | ||||
| the server packet. This might happen if the information the client | ||||
| retransmits its Client Initial packet. | ||||
| 5.9. Handling Packets from Different Versions | 5.9. Handling Packets from Different Versions | |||
| Between different versions the following things are guaranteed to | Between different versions the following things are guaranteed to | |||
| remain constant: | remain constant: | |||
| o the location of the header form flag, | o the location of the header form flag, | |||
| o the location of the Connection ID flag in short headers, | o the location of the Connection ID flag in short headers, | |||
| o the location and size of the Connection ID field in both header | o the location and size of the Connection ID field in both header | |||
| skipping to change at page 18, line 4 ¶ | skipping to change at page 20, line 24 ¶ | |||
| remain constant: | remain constant: | |||
| o the location of the header form flag, | o the location of the header form flag, | |||
| o the location of the Connection ID flag in short headers, | o the location of the Connection ID flag in short headers, | |||
| o the location and size of the Connection ID field in both header | o the location and size of the Connection ID field in both header | |||
| forms, | forms, | |||
| o the location and size of the Version field in long headers, and | 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. | o the location and size of the Packet Number field in long headers. | |||
| Implementations MUST assume that an unsupported version uses an | Implementations MUST assume that an unsupported version uses an | |||
| unknown packet format. All other fields MUST be ignored when | unknown packet format. All other fields MUST be ignored when | |||
| processing a packet that contains an unsupported version. | processing a packet that contains an unsupported version. | |||
| 6. Frames and Frame Types | 6. Frames and Frame Types | |||
| The payload of cleartext packets and the plaintext after decryption | The payload of cleartext packets and the plaintext after decryption | |||
| of encrypted payloads consists of a sequence of frames, as shown in | of protected payloads consists of a sequence of frames, as shown in | |||
| Figure 4. | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame 1 (*) ... | | Frame 1 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame 2 (*) ... | | Frame 2 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame N (*) ... | | Frame N (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: Contents of Encrypted Payload | Figure 4: Contents of Protected Payload | |||
| Encrypted payloads MUST contain at least one frame, and MAY contain | Protected payloads MUST contain at least one frame, and MAY contain | |||
| multiple frames and multiple frame types. | multiple frames and multiple frame types. | |||
| Frames MUST fit within a single QUIC packet and MUST NOT span a QUIC | Frames MUST fit within a single QUIC packet and MUST NOT span a QUIC | |||
| packet boundary. Each frame begins with a Frame Type byte, | packet boundary. Each frame begins with a Frame Type byte, | |||
| indicating its type, followed by additional type-dependent fields: | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type (8) | Type-Dependent Fields (*) ... | | Type (8) | Type-Dependent Fields (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: Generic Frame Layout | Figure 5: Generic Frame Layout | |||
| Frame types are listed in Table 3. Note that the Frame Type byte in | 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. | STREAM and ACK frames is used to carry other frame-specific flags. | |||
| For all other frames, the Frame Type byte simply identifies the | For all other frames, the Frame Type byte simply identifies the | |||
| frame. These frames are explained in more detail as they are | frame. These frames are explained in more detail as they are | |||
| referenced later in the document. | referenced later in the document. | |||
| +------------------+------------------+-------------+ | +-------------+-------------------+--------------+ | |||
| | Type-field value | Frame type | Definition | | | Type Value | Frame Type Name | Definition | | |||
| +------------------+------------------+-------------+ | +-------------+-------------------+--------------+ | |||
| | 0x00 | PADDING | Section 8.6 | | | 0x00 | PADDING | Section 8.10 | | |||
| | | | | | | | | | | |||
| | 0x01 | RST_STREAM | Section 8.5 | | | 0x01 | RST_STREAM | Section 8.9 | | |||
| | | | | | | | | | | |||
| | 0x02 | CONNECTION_CLOSE | Section 8.8 | | | 0x02 | CONNECTION_CLOSE | Section 8.13 | | |||
| | | | | | | | | | | |||
| | 0x03 | GOAWAY | Section 8.9 | | | 0x03 | GOAWAY | Section 8.14 | | |||
| | | | | | | | | | | |||
| | 0x04 | WINDOW_UPDATE | Section 8.3 | | | 0x04 | MAX_DATA | Section 8.3 | | |||
| | | | | | | | | | | |||
| | 0x05 | BLOCKED | Section 8.4 | | | 0x05 | MAX_STREAM_DATA | Section 8.4 | | |||
| | | | | | | | | | | |||
| | 0x07 | PING | Section 8.7 | | | 0x06 | MAX_STREAM_ID | Section 8.5 | | |||
| | | | | | | | | | | |||
| | 0x40 - 0x7f | ACK | Section 8.2 | | | 0x07 | PING | Section 8.11 | | |||
| | | | | | | | | | | |||
| | 0x80 - 0xff | STREAM | Section 8.1 | | | 0x08 | BLOCKED | Section 8.6 | | |||
| +------------------+------------------+-------------+ | | | | | | |||
| | 0x09 | STREAM_BLOCKED | Section 8.7 | | ||||
| | | | | | ||||
| | 0x0a | STREAM_ID_NEEDED | Section 8.8 | | ||||
| | | | | | ||||
| | 0x0b | NEW_CONNECTION_ID | Section 8.12 | | ||||
| | | | | | ||||
| | 0xa0 - 0xbf | ACK | Section 8.2 | | ||||
| | | | | | ||||
| | 0xc0 - 0xff | STREAM | Section 8.1 | | ||||
| +-------------+-------------------+--------------+ | ||||
| Table 3: Frame Types | Table 3: Frame Types | |||
| 7. Life of a Connection | 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 cryptographic and transport handshakes to reduce | negotiation with the cryptographic and transport handshakes to reduce | |||
| connection establishment latency, as described in Section 7.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 7.5. Finally a connection may be terminated by either | Section 7.6. Finally a connection may be terminated by either | |||
| endpoint, as described in Section 7.6. | endpoint, as described in Section 7.7. | |||
| 7.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 7.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 use the long header format 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 long header | When the server receives a packet from a client with the long header | |||
| format, 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 a list of | Version Negotiation packet (Section 5.3). This includes a list of | |||
| versions that the server will accept. A server MUST send a Version | versions that the server will accept. | |||
| Negotiation packet for every packet that it receives with an | ||||
| unacceptable version. | A server sends a Version Negotiation packet for every packet that it | |||
| receives with an unacceptable version. This allows a server to | ||||
| process packets with unsupported versions without retaining state. | ||||
| Though either the initial client packet or the version negotiation | ||||
| packet that is sent in response could be lost, the client will send | ||||
| new packets until it successfully receives a response. | ||||
| 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 7.2). This commits | the server proceeds with the handshake (Section 7.2). This commits | |||
| the server to the version that the client selected. | 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 reattempts to create a connection using that version. Though the | and reattempts to create a connection using that version. Though the | |||
| contents of a packet might not change in response to version | contents of a packet might not change in response to version | |||
| skipping to change at page 20, line 35 ¶ | skipping to change at page 23, line 52 ¶ | |||
| every packet it sends. Packets MUST continue to use long headers and | every packet it sends. Packets MUST continue to use long headers and | |||
| MUST include the new negotiated protocol version. | MUST include the new negotiated protocol version. | |||
| The client MUST use the long header format and include its selected | The client MUST use the long header format and include its selected | |||
| version on all packets until it has 1-RTT keys and it has received a | version on all packets until it has 1-RTT keys and it has received a | |||
| packet from the server which is not a Version Negotiation packet. | packet from the server which is not a Version Negotiation packet. | |||
| A client MUST NOT change the version it uses unless it is in response | A client MUST NOT change the version it uses unless it is in response | |||
| to a Version Negotiation packet from the server. Once a client | to a Version Negotiation packet from the server. Once a client | |||
| receives a packet from the server which is not a Version Negotiation | receives a packet from the server which is not a Version Negotiation | |||
| packet, it MUST ignore Version Negotiation packets on the same | packet, it MUST ignore other Version Negotiation packets on the same | |||
| connection. | connection. Similarly, a client MUST ignore a Version Negotiation | |||
| packet if it has already received and acted on a Version Negotiation | ||||
| packet. | ||||
| A client MUST ignore a Version Negotiation packet that lists the | ||||
| client's chosen version. | ||||
| Version negotiation uses unprotected data. The result of the | Version negotiation uses unprotected data. The result of the | |||
| negotiation MUST be revalidated as part of the cryptographic | negotiation MUST be revalidated as part of the cryptographic | |||
| handshake (see Section 7.3.4). | handshake (see Section 7.3.4). | |||
| 7.1.1. Using Reserved Versions | 7.1.1. Using Reserved Versions | |||
| For a server to use a new version in the future, clients must | For a server to use a new version in the future, clients must | |||
| correctly handle unsupported versions. To help ensure this, a server | correctly handle unsupported versions. To help ensure this, a server | |||
| SHOULD include a reserved version (see Section 4) while generating a | SHOULD include a reserved version (see Section 4) while generating a | |||
| skipping to change at page 21, line 20 ¶ | skipping to change at page 24, line 42 ¶ | |||
| A pseudorandom function that takes client address information (IP and | A pseudorandom function that takes client address information (IP and | |||
| port) and the client selected version as input would ensure that | port) and the client selected version as input would ensure that | |||
| there is sufficient variability in the values that a server uses. | there is sufficient variability in the values that a server uses. | |||
| A client MAY send a packet using a reserved version number. This can | A client MAY send a packet using a reserved version number. This can | |||
| be used to solicit a list of supported versions from a server. | be used to solicit a list of supported versions from a server. | |||
| 7.2. Cryptographic and Transport Handshake | 7.2. Cryptographic and Transport Handshake | |||
| QUIC relies on a combined cryptographic and transport handshake to | QUIC relies on a combined cryptographic and transport handshake to | |||
| minimize connection establishment latency. QUIC allocates stream 1 | minimize connection establishment latency. QUIC allocates stream 0 | |||
| for the cryptographic handshake. This version of QUIC uses TLS 1.3 | for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | |||
| [QUIC-TLS]. | 1.3 as described in [QUIC-TLS]; a different QUIC version number could | |||
| indicate that a different cryptographic handshake protocol is in use. | ||||
| QUIC provides this stream with reliable, ordered delivery of data. | QUIC provides this stream with reliable, ordered delivery of data. | |||
| In return, the cryptographic handshake provides QUIC with: | In return, the cryptographic handshake provides QUIC with: | |||
| o authenticated key exchange, where | o authenticated key exchange, where | |||
| * a server is always authenticated, | * a server is always authenticated, | |||
| * a client is optionally authenticated, | * a client is optionally authenticated, | |||
| * every connection produces distinct and unrelated keys, | * every connection produces distinct and unrelated keys, | |||
| * keying material is usable for packet protection for both 0-RTT | * keying material is usable for packet protection for both 0-RTT | |||
| and 1-RTT packets, and | and 1-RTT packets, and | |||
| * 1-RTT keys have forward secrecy | * 1-RTT keys have forward secrecy | |||
| skipping to change at page 21, line 51 ¶ | skipping to change at page 25, line 26 ¶ | |||
| Section 7.3) | Section 7.3) | |||
| o authenticated confirmation of version negotiation (see | o authenticated confirmation of version negotiation (see | |||
| Section 7.3.4) | Section 7.3.4) | |||
| o authenticated negotiation of an application protocol (TLS uses | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [RFC7301] for this purpose) | ALPN [RFC7301] for this purpose) | |||
| o for the server, the ability to carry data that provides assurance | o for the server, the ability to carry data that provides assurance | |||
| that the client can receive packets that are addressed with the | that the client can receive packets that are addressed with the | |||
| transport address that is claimed by the client (see Section 7.4) | transport address that is claimed by the client (see Section 7.5) | |||
| The initial cryptographic handshake message MUST be sent in a single | The initial cryptographic handshake message MUST be sent in a single | |||
| packet. Any second attempt that is triggered by address validation | packet. Any second attempt that is triggered by address validation | |||
| MUST also be sent within a single packet. This avoids having to | MUST also be sent within a single packet. This avoids having to | |||
| reassemble a message from multiple packets. Reassembling messages | reassemble a message from multiple packets. Reassembling messages | |||
| requires that a server maintain state prior to establishing a | requires that a server maintain state prior to establishing a | |||
| connection, exposing the server to a denial of service risk. | connection, exposing the server to a denial of service risk. | |||
| The first client packet of the cryptographic handshake protocol MUST | The first client packet of the cryptographic handshake protocol MUST | |||
| fit within a 1280 octet QUIC packet. This includes overheads that | fit within a 1232 octet QUIC packet payload. This includes overheads | |||
| reduce the space available to the cryptographic handshake protocol. | that reduce the space available to the cryptographic handshake | |||
| protocol. | ||||
| Details of how TLS is integrated with QUIC is provided in more detail | Details of how TLS is integrated with QUIC is provided in more detail | |||
| in [QUIC-TLS]. | in [QUIC-TLS]. | |||
| 7.3. Transport Parameters | 7.3. Transport Parameters | |||
| During connection establishment, both endpoints make authenticated | During connection establishment, both endpoints make authenticated | |||
| declarations of their transport parameters. These declarations are | declarations of their transport parameters. These declarations are | |||
| made unilaterally by each endpoint. Endpoints are required to comply | made unilaterally by each endpoint. Endpoints are required to comply | |||
| with the restrictions implied by these parameters; the description of | with the restrictions implied by these parameters; the description of | |||
| each parameter includes rules for its handling. | each parameter includes rules for its handling. | |||
| The format of the transport parameters is the TransportParameters | The format of the transport parameters is the TransportParameters | |||
| struct from Figure 6. This is described using the presentation | struct from Figure 6. This is described using the presentation | |||
| language from Section 3 of [I-D.ietf-tls-tls13]. | language from Section 3 of [I-D.ietf-tls-tls13]. | |||
| uint32 QuicVersion; | uint32 QuicVersion; | |||
| enum { | enum { | |||
| stream_fc_offset(0), | initial_max_stream_data(0), | |||
| connection_fc_offset(1), | initial_max_data(1), | |||
| concurrent_streams(2), | initial_max_stream_id(2), | |||
| idle_timeout(3), | idle_timeout(3), | |||
| truncate_connection_id(4), | truncate_connection_id(4), | |||
| (65535) | (65535) | |||
| } TransportParameterId; | } TransportParameterId; | |||
| struct { | struct { | |||
| TransportParameterId parameter; | TransportParameterId parameter; | |||
| opaque value<0..2^16-1>; | opaque value<0..2^16-1>; | |||
| } TransportParameter; | } TransportParameter; | |||
| skipping to change at page 24, line 10 ¶ | skipping to change at page 27, line 10 ¶ | |||
| properly complete. | properly complete. | |||
| Definitions for each of the defined transport parameters are included | Definitions for each of the defined transport parameters are included | |||
| in Section 7.3.1. | in Section 7.3.1. | |||
| 7.3.1. Transport Parameter Definitions | 7.3.1. Transport Parameter Definitions | |||
| An endpoint MUST include the following parameters in its encoded | An endpoint MUST include the following parameters in its encoded | |||
| TransportParameters: | TransportParameters: | |||
| stream_fc_offset (0x0000): The initial stream level flow control | initial_max_stream_data (0x0000): The initial stream maximum data | |||
| offset parameter is encoded as an unsigned 32-bit integer in units | parameter contains the initial value for the maximum data that can | |||
| of octets. The sender of this parameter indicates that the flow | be sent on any newly created stream. This parameter is encoded as | |||
| control offset for all stream data sent toward it is this value. | an unsigned 32-bit integer in units of octets. This is equivalent | |||
| to an implicit MAX_STREAM_DATA frame (Section 8.4) being sent on | ||||
| all streams immediately after opening. | ||||
| connection_fc_offset (0x0001): The connection level flow control | initial_max_data (0x0001): The initial maximum data parameter | |||
| offset parameter contains the initial connection flow control | contains the initial value for the maximum amount of data that can | |||
| window encoded as an unsigned 32-bit integer in units of 1024 | be sent on the connection. This parameter is encoded as an | |||
| octets. That is, the value here is multiplied by 1024 to | unsigned 32-bit integer in units of 1024 octets. That is, the | |||
| determine the actual flow control offset. The sender of this | value here is multiplied by 1024 to determine the actual maximum | |||
| parameter sets the byte offset for connection level flow control | value. This is equivalent to sending a MAX_DATA (Section 8.3) for | |||
| to this value. This is equivalent to sending a WINDOW_UPDATE | the connection immediately after completing the handshake. | |||
| (Section 8.3) for the connection immediately after completing the | ||||
| handshake. | ||||
| concurrent_streams (0x0002): The maximum number of concurrent | initial_max_stream_id (0x0002): The initial maximum stream ID | |||
| streams parameter is encoded as an unsigned 32-bit integer. | parameter contains the initial maximum stream number the peer may | |||
| initiate, encoded as an unsigned 32-bit integer. This is | ||||
| equivalent to sending a MAX_STREAM_ID (Section 8.5) immediately | ||||
| after completing the handshake. | ||||
| idle_timeout (0x0003): The idle timeout is a value in seconds that | idle_timeout (0x0003): The idle timeout is a value in seconds that | |||
| is encoded as an unsigned 16-bit integer. The maximum value is | is encoded as an unsigned 16-bit integer. The maximum value is | |||
| 600 seconds (10 minutes). | 600 seconds (10 minutes). | |||
| An endpoint MAY use the following transport parameters: | An endpoint MAY use the following transport parameters: | |||
| truncate_connection_id (0x0004): The truncated connection identifier | truncate_connection_id (0x0004): The truncated connection identifier | |||
| parameter indicates that packets sent to the peer can omit the | parameter indicates that packets sent to the peer can omit the | |||
| connection ID. This can be used by an endpoint where the 5-tuple | connection ID. This can be used by an endpoint where the 5-tuple | |||
| is sufficient to identify a connection. This parameter is zero | is sufficient to identify a connection. This parameter is zero | |||
| length. Omitting the parameter indicates that the endpoint relies | length. Omitting the parameter indicates that the endpoint relies | |||
| on the connection ID being present in every packet. | on the connection ID being present in every packet. | |||
| 7.3.2. Values of Transport Parameters for 0-RTT | 7.3.2. Values of Transport Parameters for 0-RTT | |||
| Transport parameters from the server SHOULD be remembered by the | Transport parameters from the server MUST be remembered by the client | |||
| client for use with 0-RTT data. A client that doesn't remember | for use with 0-RTT data. If the TLS NewSessionTicket message | |||
| values from a previous connection can instead assume the following | includes the quic_transport_parameters extension, then those values | |||
| values: stream_fc_offset (65535), connection_fc_offset (65535), | are used for the server values when establishing a new connection | |||
| concurrent_streams (10), idle_timeout (600), truncate_connection_id | using that ticket. Otherwise, the transport parameters that the | |||
| (absent). | server advertises during connection establishment are used. | |||
| 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 | A server can remember the transport parameters that it advertised, or | |||
| control limit with 0-RTT data. If this occurs, the client ceases | store an integrity-protected copy of the values in the ticket and | |||
| transmission as though the flow control limit was reached. Once | recover the information when accepting 0-RTT data. A server uses the | |||
| WINDOW_UPDATE frames indicating an increase to the affected flow | transport parameters in determining whether to accept 0-RTT data. | |||
| control offsets is received, the client can recommence sending. | ||||
| o Similarly, a client might exceed the concurrent stream limit | A server MAY accept 0-RTT and subsequently provide different values | |||
| declared by the server. A client MUST reset any streams that | for transport parameters for use in the new connection. If 0-RTT | |||
| exceed this limit. A server SHOULD reset any streams it cannot | data is accepted by the server, the server MUST NOT reduce any limits | |||
| handle with a code that allows the client to retry any application | or alter any values that might be violated by the client with its | |||
| action bound to those streams. | 0-RTT data. In particular, a server that accepts 0-RTT data MUST NOT | |||
| set values for initial_max_data or initial_max_stream_data that are | ||||
| smaller than the remembered value of those parameters. Similarly, a | ||||
| server MUST NOT reduce the value of initial_max_stream_id. | ||||
| A server MAY close a connection if remembered or assumed 0-RTT | A server MUST reject 0-RTT data or even abort a handshake if the | |||
| transport parameters cannot be supported, using an error code that is | implied values for transport parameters cannot be supported. | |||
| 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 | 7.3.3. New Transport Parameters | |||
| New transport parameters can be used to negotiate new protocol | New transport parameters can be used to negotiate new protocol | |||
| behavior. An endpoint MUST ignore transport parameters that it does | behavior. An endpoint MUST ignore transport parameters that it does | |||
| not support. Absence of a transport parameter therefore disables any | not support. Absence of a transport parameter therefore disables any | |||
| optional protocol feature that is negotiated using the parameter. | 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 | New transport parameters can be registered according to the rules in | |||
| Section 14.1. | Section 14.1. | |||
| 7.3.4. Version Negotiation Validation | 7.3.4. Version Negotiation Validation | |||
| The transport parameters include three fields that encode version | The transport parameters include three fields that encode version | |||
| information. These retroactively authenticate the version | information. These retroactively authenticate the version | |||
| negotiation (see Section 7.1) that is performed prior to the | negotiation (see Section 7.1) that is performed prior to the | |||
| cryptographic handshake. | cryptographic handshake. | |||
| skipping to change at page 27, line 5 ¶ | skipping to change at page 29, line 42 ¶ | |||
| the supported_versions list and - if version negotiation was | the supported_versions list and - if version negotiation was | |||
| performed - that it would have selected the negotiated version. A | performed - that it would have selected the negotiated version. A | |||
| client MUST terminate the connection with a | client MUST terminate the connection with a | |||
| QUIC_VERSION_NEGOTIATION_MISMATCH error code if the | QUIC_VERSION_NEGOTIATION_MISMATCH error code if the | |||
| negotiated_version value is not included in the supported_versions | negotiated_version value is not included in the supported_versions | |||
| list. A client MUST terminate with a | list. A client MUST terminate with a | |||
| QUIC_VERSION_NEGOTIATION_MISMATCH error code if version negotiation | QUIC_VERSION_NEGOTIATION_MISMATCH error code if version negotiation | |||
| occurred but it would have selected a different version based on the | occurred but it would have selected a different version based on the | |||
| value of the supported_versions list. | value of the supported_versions list. | |||
| 7.4. Proof of Source Address Ownership | 7.4. Stateless Retries | |||
| A server can process an initial cryptographic handshake messages from | ||||
| a client without committing any state. This allows a server to | ||||
| perform address validation (Section 7.5, or to defer connection | ||||
| establishment costs. | ||||
| A server that generates a response to an initial packet without | ||||
| retaining connection state MUST use the Server Stateless Retry packet | ||||
| (Section 5.4.2). This packet causes a client to reset its transport | ||||
| state and to continue the connection attempt with new connection | ||||
| state while maintaining the state of the cryptographic handshake. | ||||
| A server MUST NOT send multiple Server Stateless Retry packets in | ||||
| response to a client handshake packet. Thus, any cryptographic | ||||
| handshake message that is sent MUST fit within a single packet. | ||||
| In TLS, the Server Stateless Retry packet type is used to carry the | ||||
| HelloRetryRequest message. | ||||
| 7.5. Proof of Source Address Ownership | ||||
| Transport protocols commonly spend a round trip checking that a | Transport protocols commonly spend a round trip checking that a | |||
| client owns the transport address (IP and port) that it claims. | client owns the transport address (IP and port) that it claims. | |||
| Verifying that a client can receive packets sent to its claimed | Verifying that a client can receive packets sent to its claimed | |||
| transport address protects against spoofing of this information by | transport address protects against spoofing of this information by | |||
| malicious clients. | malicious clients. | |||
| This technique is used primarily to avoid QUIC from being used for | This technique is used primarily to avoid QUIC from being used for | |||
| traffic amplification attack. In such an attack, a packet is sent to | traffic amplification attack. In such an attack, a packet is sent to | |||
| a server with spoofed source address information that identifies a | a server with spoofed source address information that identifies a | |||
| victim. If a server generates more or larger packets in response to | 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 | 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. | the victim than it would be able to send on its own. | |||
| Several methods are used in QUIC to mitigate this attack. Firstly, | Several methods are used in QUIC to mitigate this attack. Firstly, | |||
| the initial handshake packet from a client is padded to at least 1280 | the initial handshake packet is padded to at least 1280 octets. This | |||
| octets. This allows a server to send a similar amount of data | allows a server to send a similar amount of data without risking | |||
| without risking causing an amplication attack toward an unproven | causing an amplification attack toward an unproven remote address. | |||
| remote address. | ||||
| A server eventually confirms that a client has received its messages | A server eventually confirms that a client has received its messages | |||
| when the cryptographic handshake successfully completes. This might | when the cryptographic handshake successfully completes. This might | |||
| be insufficient, either because the server wishes to avoid the | be insufficient, either because the server wishes to avoid the | |||
| computational cost of completing the handshake, or it might be that | computational cost of completing the handshake, or it might be that | |||
| the size of the packets that are sent during the handshake is too | the size of the packets that are sent during the handshake is too | |||
| large. This is especially important for 0-RTT, where the server | large. This is especially important for 0-RTT, where the server | |||
| might wish to provide application data traffic - such as a response | 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 | to a request - in response to the data carried in the early data from | |||
| the client. | the client. | |||
| To send additional data prior to completing the cryptographic | To send additional data prior to completing the cryptographic | |||
| handshake, the server then needs to validate that the client owns the | handshake, the server then needs to validate that the client owns the | |||
| address that it claims. | address that it claims. | |||
| Source address validation is therefore performed during the | Source address validation is therefore performed during the | |||
| establishment of a connection. TLS provides the tools that support | establishment of a connection. TLS provides the tools that support | |||
| the feature, but basic validation is performed by the core transport | the feature, but basic validation is performed by the core transport | |||
| protocol. | protocol. | |||
| 7.4.1. Client Address Validation Procedure | 7.5.1. Client Address Validation Procedure | |||
| QUIC uses token-based address validation. Any time the server wishes | QUIC uses token-based address validation. Any time the server wishes | |||
| to validate a client address, it provides the client with a token. | 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 | As long as the token cannot be easily guessed (see Section 7.5.3), if | |||
| the client is able to return that token, it proves to the server that | the client is able to return that token, it proves to the server that | |||
| it received the token. | it received the token. | |||
| During the processing of the cryptographic handshake messages from a | During the processing of the cryptographic handshake messages from a | |||
| client, TLS will request that QUIC make a decision about whether to | client, TLS will request that QUIC make a decision about whether to | |||
| proceed based on the information it has. TLS will provide QUIC with | proceed based on the information it has. TLS will provide QUIC with | |||
| any token that was provided by the client. For an initial packet, | any token that was provided by the client. For an initial packet, | |||
| QUIC can decide to abort the connection, allow it to proceed, or | QUIC can decide to abort the connection, allow it to proceed, or | |||
| request address validation. | request address validation. | |||
| skipping to change at page 28, line 34 ¶ | skipping to change at page 31, line 42 ¶ | |||
| asks QUIC a second time whether the token is acceptable. In | asks QUIC a second time whether the token is acceptable. In | |||
| response, QUIC can either abort the connection or permit it to | response, QUIC can either abort the connection or permit it to | |||
| proceed. | proceed. | |||
| A connection MAY be accepted without address validation - or with | A connection MAY be accepted without address validation - or with | |||
| only limited validation - but a server SHOULD limit the data it sends | only limited validation - but a server SHOULD limit the data it sends | |||
| toward an unvalidated address. Successful completion of the | toward an unvalidated address. Successful completion of the | |||
| cryptographic handshake implicitly provides proof that the client has | cryptographic handshake implicitly provides proof that the client has | |||
| received packets from the server. | received packets from the server. | |||
| 7.4.2. Address Validation on Session Resumption | 7.5.2. Address Validation on Session Resumption | |||
| A server MAY provide clients with an address validation token during | A server MAY provide clients with an address validation token during | |||
| one connection that can be used on a subsequent connection. Address | one connection that can be used on a subsequent connection. Address | |||
| validation is especially important with 0-RTT because a server | validation is especially important with 0-RTT because a server | |||
| potentially sends a significant amount of data to a client in | potentially sends a significant amount of data to a client in | |||
| response to 0-RTT data. | response to 0-RTT data. | |||
| A different type of token is needed when resuming. Unlike the token | A different type of token is needed when resuming. Unlike the token | |||
| that is created during a handshake, there might be some time between | that is created during a handshake, there might be some time between | |||
| when the token is created and when the token is subsequently used. | when the token is created and when the token is subsequently used. | |||
| skipping to change at page 28, line 45 ¶ | skipping to change at page 32, line 4 ¶ | |||
| A server MAY provide clients with an address validation token during | A server MAY provide clients with an address validation token during | |||
| one connection that can be used on a subsequent connection. Address | one connection that can be used on a subsequent connection. Address | |||
| validation is especially important with 0-RTT because a server | validation is especially important with 0-RTT because a server | |||
| potentially sends a significant amount of data to a client in | potentially sends a significant amount of data to a client in | |||
| response to 0-RTT data. | response to 0-RTT data. | |||
| A different type of token is needed when resuming. Unlike the token | A different type of token is needed when resuming. Unlike the token | |||
| that is created during a handshake, there might be some time between | that is created during a handshake, there might be some time between | |||
| when the token is created and when the token is subsequently used. | when the token is created and when the token is subsequently used. | |||
| Thus, a resumption token SHOULD include an expiration time. It is | Thus, a resumption token SHOULD include an expiration time. It is | |||
| also unlikely that the client port number is the same on two | also unlikely that the client port number is the same on two | |||
| different connections; validating the port is therefore unlikely to | different connections; validating the port is therefore unlikely to | |||
| be successful. | be successful. | |||
| This token can be provided to the cryptographic handshake immediately | This token can be provided to the cryptographic handshake immediately | |||
| after establishing a connection. QUIC might also generate an updated | after establishing a connection. QUIC might also generate an updated | |||
| token if significant time passes or the client address changes for | token if significant time passes or the client address changes for | |||
| any reason (see Section 7.5). The cryptographic handshake is | any reason (see Section 7.6). The cryptographic handshake is | |||
| responsible for providing the client with the token. In TLS the | responsible for providing the client with the token. In TLS the | |||
| token is included in the ticket that is used for resumption and | token is included in the ticket that is used for resumption and | |||
| 0-RTT, which is carried in a NewSessionTicket message. | 0-RTT, which is carried in a NewSessionTicket message. | |||
| 7.4.3. Address Validation Token Integrity | 7.5.3. Address Validation Token Integrity | |||
| An address validation token MUST be difficult to guess. Including a | An address validation token MUST be difficult to guess. Including a | |||
| large enough random value in the token would be sufficient, but this | large enough random value in the token would be sufficient, but this | |||
| depends on the server remembering the value it sends to clients. | depends on the server remembering the value it sends to clients. | |||
| A token-based scheme allows the server to offload any state | A token-based scheme allows the server to offload any state | |||
| associated with validation to the client. For this design to work, | associated with validation to the client. For this design to work, | |||
| the token MUST be covered by integrity protection against | the token MUST be covered by integrity protection against | |||
| modification or falsification by clients. Without integrity | modification or falsification by clients. Without integrity | |||
| protection, malicious clients could generate or guess values for | protection, malicious clients could generate or guess values for | |||
| skipping to change at page 29, line 33 ¶ | skipping to change at page 32, line 42 ¶ | |||
| In TLS the address validation token is often bundled with the | In TLS the address validation token is often bundled with the | |||
| information that TLS requires, such as the resumption secret. In | information that TLS requires, such as the resumption secret. In | |||
| this case, adding integrity protection can be delegated to the | this case, adding integrity protection can be delegated to the | |||
| cryptographic handshake protocol, avoiding redundant protection. If | cryptographic handshake protocol, avoiding redundant protection. If | |||
| integrity protection is delegated to the cryptographic handshake, an | integrity protection is delegated to the cryptographic handshake, an | |||
| integrity failure will result in immediate cryptographic handshake | integrity failure will result in immediate cryptographic handshake | |||
| failure. If integrity protection is performed by QUIC, QUIC MUST | failure. If integrity protection is performed by QUIC, QUIC MUST | |||
| abort the connection if the integrity check fails with a | abort the connection if the integrity check fails with a | |||
| QUIC_ADDRESS_VALIDATION_FAILURE error code. | QUIC_ADDRESS_VALIDATION_FAILURE error code. | |||
| 7.5. Connection Migration | 7.6. 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. Connection migration allows a | |||
| cryptographic verification of a client which has changed its IP | client to retain any shared state with a connection when they move | |||
| address because the client continues to use the same session key for | networks. This includes state that can be hard to recover such as | |||
| encrypting and decrypting packets. | outstanding requests, which might otherwise be lost with no easy way | |||
| to retry them. | ||||
| DISCUSS: Simultaneous migration. Is this reasonable? | 7.6.1. Privacy Implications of Connection Migration | |||
| TODO: Perhaps move mitigation techniques from Security Considerations | Using a stable connection ID on multiple network paths allows a | |||
| here. | passive observer to correlate activity between those paths. A client | |||
| that moves between networks might not wish to have their activity | ||||
| correlated by any entity other than a server. The NEW_CONNECTION_ID | ||||
| message can be sent by a server to provide an unlinkable connection | ||||
| ID for use in case the client wishes to explicitly break linkability | ||||
| between two points of network attachment. | ||||
| 7.6. Connection Termination | A client which wishes to break linkability upon changing networks | |||
| MUST use the NEW_CONNECTION_ID as well as incrementing the packet | ||||
| sequence number by an externally unpredictable value computed as | ||||
| described in Section 7.6.1.1. Packet number gaps are cumulative. A | ||||
| client might skip connection IDs, but it MUST ensure that it applies | ||||
| the associated packet number gaps in addition to the packet number | ||||
| gap associated with the connection ID that it does use. | ||||
| A client might need to send packets on multiple networks without | ||||
| receiving any response from the server. To ensure that the client is | ||||
| not linkable across each of these changes, a new connection ID and | ||||
| packet number gap are needed for each network. To support this, a | ||||
| server sends multiple NEW_CONNECTION_ID messages. Each | ||||
| NEW_CONNECTION_ID is marked with a sequence number. Connection IDs | ||||
| MUST be used in the order in which they are numbered. | ||||
| A server that receives a packet that is marked with a new connection | ||||
| ID recovers the packet number by adding the cumulative packet number | ||||
| gap to its expected packet number. A server SHOULD discard packets | ||||
| that contain a smaller gap than it advertised. | ||||
| For instance, a server might provide a packet number gap of 7 | ||||
| associated with a new connection ID. If the server received packet | ||||
| 10 using the previous connection ID, it should expect packets on the | ||||
| new connection ID to start at 18. A packet with the new connection | ||||
| ID and a packet number of 17 is discarded as being in error. | ||||
| 7.6.1.1. Packet Number Gap | ||||
| In order to avoid linkage, the packet number gap MUST be externally | ||||
| indistinguishable from random. The packet number gap for a | ||||
| connection ID with sequence number is computed by encoding the | ||||
| sequence number as a 32-bit integer in big-endian format, and then | ||||
| computing: | ||||
| Gap = HKDF-Expand-Label(packet_number_secret, | ||||
| "QUIC packet sequence gap", sequence, 4) | ||||
| The output of HKDF-Expand-Label is interpreted as a big-endian | ||||
| number. "packet_number_secret" is derived from the TLS key exchange, | ||||
| as described in [QUIC-TLS] Section 5.6. | ||||
| 7.6.2. Address Validation for Migrated Connections | ||||
| TODO: see issue #161 | ||||
| 7.7. 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 | |||
| initiate a connection termination. An endpoint may send a GOAWAY | initiate a connection termination. An endpoint may send a GOAWAY | |||
| frame to the peer prior to a CONNECTION_CLOSE to indicate that | frame to the peer prior to a CONNECTION_CLOSE to indicate that | |||
| the connection will soon be terminated. A GOAWAY frame signals | the connection will soon be terminated. A GOAWAY frame signals | |||
| to the peer that any active streams will continue to be | to the peer that any active streams will continue to be | |||
| processed, but the sender of the GOAWAY will not initiate any | processed, but the sender of the GOAWAY will not initiate any | |||
| additional streams and will not accept any new incoming streams. | additional streams and will not accept any new incoming streams. | |||
| On termination of the active streams, a CONNECTION_CLOSE may be | On termination of the active streams, a CONNECTION_CLOSE may be | |||
| sent. If an endpoint sends a CONNECTION_CLOSE frame while | sent. If an endpoint sends a CONNECTION_CLOSE frame while | |||
| unterminated streams are active (no FIN bit or RST_STREAM frames | unterminated streams are active (no FIN bit or RST_STREAM frames | |||
| have been sent or received for one or more streams), then the | have been sent or received for one or more streams), then the | |||
| peer must assume that the streams were incomplete and were | peer must assume that the streams 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 is a required | |||
| is 30 seconds, and is a required parameter in connection | parameter in connection negotiation. The maximum is 10 minutes. | |||
| negotiation. The maximum is 10 minutes. If there is no network | If there is no network activity for the duration of the idle | |||
| activity for the duration of the idle timeout, the connection is | timeout, the connection is closed. By default a CONNECTION_CLOSE | |||
| closed. By default a CONNECTION_CLOSE frame will be sent. A | frame will be sent. A silent close option can be enabled when it | |||
| silent close option can be enabled when it is expensive to send | is expensive to send an explicit close, such as mobile networks | |||
| an explicit close, such as mobile networks that must wake up the | 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 | |||
| recourse. Commonly, a public reset is expected to be sent when a | recourse. Commonly, a public reset is expected to be sent when a | |||
| packet on an established connection is received by an endpoint | packet on an established connection is received by an endpoint | |||
| that is unable decrypt the packet. For instance, if a server | that is unable decrypt the packet. For instance, if a server | |||
| 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 | |||
| skipping to change at page 31, line 16 ¶ | skipping to change at page 35, line 20 ¶ | |||
| As described in Section 6, 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. | |||
| 8.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 "11FDOOSS". These bits are parsed as follows: | |||
| o The leftmost bit must be set to 1, indicating that this is a | o The first two bits must be set to 11, 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. | |||
| o The "D" bit indicates whether a Data Length field is present in | o The "D" bit indicates whether a Data Length field is present in | |||
| the STREAM header. When set to 0, this field indicates that the | the STREAM header. When set to 0, this field indicates that the | |||
| Stream Data field extends to the end of the packet. When set to | Stream Data field extends to the end of the packet. When set to | |||
| 1, this field indicates that Data Length field contains the length | 1, this field indicates that Data Length field contains the length | |||
| (in bytes) of the Stream Data field. The option to omit the | (in bytes) of the Stream Data field. The option to omit the | |||
| length should only be used when the packet is a "full-sized" | length should only be used when the packet is a "full-sized" | |||
| packet, to avoid the risk of corruption via padding. | packet, to avoid the risk of corruption via padding. | |||
| o The "OOO" bits encode the length of the Offset header field as 0, | o The "OO" bits encode the length of the Offset header field as 0, | |||
| 16, 24, 32, 40, 48, 56, or 64 bits long. | 16, 32, or 64 bits long. | |||
| 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. | |||
| 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)] | | | [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/32/64) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | 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: | |||
| Data Length: An optional 16-bit unsigned number specifying the | Data Length: An optional 16-bit unsigned number specifying the | |||
| length of the Stream Data field in this STREAM frame. This field | length of the Stream Data field in this STREAM frame. This field | |||
| is present when the "D" bit is set to 1. | is present when the "D" bit is set to 1. | |||
| Stream ID: A variable-sized unsigned ID unique to this stream. | Stream ID: The stream ID of the stream (see Section 10.1). | |||
| Offset: A variable-sized unsigned number specifying the byte offset | Offset: A variable-sized unsigned number specifying the byte offset | |||
| in the stream for the data in this STREAM frame. The first byte | in the stream for the data in this STREAM frame. When the offset | |||
| in the stream has an offset of 0. The largest offset delivered on | length is 0, the offset is 0. The first byte in the stream has an | |||
| a stream - the sum of the re-constructed offset and data length - | offset of 0. The largest offset delivered on a stream - the sum | |||
| MUST be less than 2^64. | of the re-constructed offset and data length - MUST be less than | |||
| 2^64. | ||||
| 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. When the FIN flag is sent on an empty STREAM frame, the offset | |||
| in the STREAM frame MUST be one greater than the last data byte sent | ||||
| on this stream. | ||||
| 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 | |||
| skipping to change at page 32, line 48 ¶ | skipping to change at page 37, line 17 ¶ | |||
| 8.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 and processed, as well as which packets are considered | received and processed, as well as which packets are considered | |||
| missing. The ACK frame contains between 1 and 256 ACK blocks. ACK | missing. The ACK frame contains between 1 and 256 ACK blocks. ACK | |||
| blocks are ranges of acknowledged packets. | blocks are ranges of acknowledged packets. | |||
| To limit ACK blocks to those that have not yet been received by the | To limit ACK blocks to those that have not yet been received by the | |||
| sender, the receiver SHOULD track which ACK frames have been | sender, the receiver SHOULD track which ACK frames have been | |||
| acknowledged by its peer. Once an ACK frame has been acknowledged, | acknowledged by its peer. Once an ACK frame has been acknowledged, | |||
| the packets it acknowledges SHOULD not be acknowledged again. To | the packets it acknowledges SHOULD not be acknowledged again. | |||
| handle cases where the receiver is only sending ACK frames, and hence | ||||
| will not receive acknowledgments for its packets, it MAY send a PING | A receiver that is only sending ACK frames will not receive | |||
| frame at most once per RTT to explicitly request acknowledgment. | acknowledgments for its packets. Sending an occasional MAX_DATA or | |||
| MAX_STREAM_DATA frame as data is received will ensure that | ||||
| acknowledgements are generated by a peer. Otherwise, an endpoint MAY | ||||
| send a PING frame once per RTT to solicit an acknowledgment. | ||||
| To limit receiver state or the size of ACK frames, a receiver MAY | To limit receiver state or the size of ACK frames, a receiver MAY | |||
| limit the number of ACK blocks it sends. A receiver can do this even | limit the number of ACK blocks it sends. A receiver can do this even | |||
| without receiving acknowledgment of its ACK frames, with the | without receiving acknowledgment of its ACK frames, with the | |||
| knowledge this could cause the sender to unnecessarily retransmit | knowledge this could cause the sender to unnecessarily retransmit | |||
| some data. | some data. When this is necessary, the receiver SHOULD acknowledge | |||
| newly received packets and stop acknowledging packets received in the | ||||
| past. | ||||
| Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore | Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore | |||
| irrevocable. Once a packet has been acknowledged, even if it does | irrevocable. Once a packet has been acknowledged, even if it does | |||
| not appear in a future ACK frame, it is assumed to be acknowledged. | not appear in a future ACK frame, it is assumed to be acknowledged. | |||
| QUIC ACK frames contain a timestamp section with up to 255 | QUIC ACK frames contain a timestamp section with up to 255 | |||
| timestamps. Timestamps enable better congestion control, but are not | timestamps. Timestamps enable better congestion control, but are not | |||
| required for correct loss recovery, and old timestamps are less | required for correct loss recovery, and old timestamps are less | |||
| valuable, so it is not guaranteed every timestamp will be received by | valuable, so it is not guaranteed every timestamp will be received by | |||
| the sender. A receiver SHOULD send a timestamp exactly once for each | the sender. A receiver SHOULD send a timestamp exactly once for each | |||
| received packet containing retransmittable frames. A receiver MAY | received packet containing retransmittable frames. A receiver MAY | |||
| send timestamps for non-retransmittable packets. | send timestamps for non-retransmittable packets. A receiver MUST not | |||
| send timestamps in unprotected 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 acknowledgement attacks. | into the connection, to avoid opportunistic acknowledgement attacks. | |||
| The sender MUST close the connection if an unsent packet number is | The sender MUST close the connection if an unsent packet number is | |||
| acknowledged. The format of the ACK frame is efficient at expressing | acknowledged. The format of the ACK frame is efficient at expressing | |||
| blocks of missing packets; skipping packet numbers between 1 and 255 | blocks of missing packets; skipping packet numbers between 1 and 255 | |||
| effectively provides up to 8 bits of efficient entropy on demand, | effectively provides up to 8 bits of efficient entropy on demand, | |||
| which should be adequate protection against most opportunistic | which should be adequate protection against most opportunistic | |||
| acknowledgement attacks. | 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 "101NLLMM". These bits are parsed as follows: | |||
| o The first two bits must be set to 01 indicating that this is an | o The first three bits must be set to 101 indicating that this is an | |||
| ACK frame. | ACK frame. | |||
| o The "N" bit indicates whether the frame has more than 1 range of | o The "N" bit indicates whether the frame has more than 1 range of | |||
| acknowledged packets (i.e., whether the ACK Block Section contains | acknowledged packets (i.e., whether the ACK Block Section contains | |||
| a Num Blocks field). | a Num Blocks field). | |||
| o The "U" bit is unused and MUST be set to zero. | ||||
| o The two "LL" bits encode the length of the Largest Acknowledged | o The two "LL" bits encode the length of the Largest Acknowledged | |||
| field as 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 | |||
| skipping to change at page 38, line 16 ¶ | skipping to change at page 42, line 26 ¶ | |||
| protection keys. | protection keys. | |||
| For instance, a server acknowledges a TLS ClientHello in the packet | For instance, a server acknowledges a TLS ClientHello in the packet | |||
| that carries the TLS ServerHello; similarly, a client can acknowledge | that carries the TLS ServerHello; similarly, a client can acknowledge | |||
| a TLS HelloRetryRequest in the packet containing a second TLS | a TLS HelloRetryRequest in the packet containing a second TLS | |||
| ClientHello. The complete set of server handshake messages (TLS | ClientHello. The complete set of server handshake messages (TLS | |||
| ServerHello through to Finished) might be acknowledged by a client in | ServerHello through to Finished) might be acknowledged by a client in | |||
| protected packets, because it is certain that the server is able to | protected packets, because it is certain that the server is able to | |||
| decipher the packet. | decipher the packet. | |||
| 8.3. WINDOW_UPDATE Frame | 8.3. MAX_DATA Frame | |||
| The WINDOW_UPDATE frame (type=0x04) informs the peer of an increase | The MAX_DATA frame (type=0x04) is used in flow control to inform the | |||
| in an endpoint's flow control receive window for either a single | peer of the maximum amount of data that can be sent on the connection | |||
| stream, or the entire connection as a whole. | as a whole. | |||
| The frame is as follows: | ||||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | | | ||||
| + Maximum Data (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields in the MAX_DATA frame are as follows: | ||||
| Maximum Data: A 64-bit unsigned integer indicating the maximum | ||||
| amount of data that can be sent on the entire connection, in units | ||||
| of 1024 octets. That is, the updated connection-level data limit | ||||
| is determined by multiplying the encoded value by 1024. | ||||
| All data sent in STREAM frames counts toward this limit, with the | ||||
| exception of data on stream 0. The sum of the largest received | ||||
| offsets on all streams - including closed streams, but excluding | ||||
| stream 0 - MUST NOT exceed the value advertised by a receiver. An | ||||
| endpoint MUST terminate a connection with a | ||||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error if it receives more | ||||
| data than the maximum data value that it has sent, unless this is a | ||||
| result of a change in the initial limits (see Section 7.3.2). | ||||
| 8.4. MAX_STREAM_DATA Frame | ||||
| The MAX_STREAM_DATA frame (type=0x05) is used in flow control to | ||||
| inform a peer of the maximum amount of data that can be sent on a | ||||
| stream. | ||||
| The frame is as follows: | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Flow Control Offset (64) + | + Maximum Stream Data (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the WINDOW_UPDATE frame are as follows: | The fields in the MAX_STREAM_DATA frame are as follows: | |||
| Stream ID: ID of the stream whose flow control windows is being | Stream ID: The stream ID of the stream that is affected. | |||
| updated, or 0 to specify the connection-level flow control window. | ||||
| Flow Control Offset: A 64-bit unsigned integer indicating the flow | Maximum Stream Data: A 64-bit unsigned integer indicating the | |||
| control offset for the given stream (for a stream ID other than 0) | maximum amount of data that can be sent on the identified stream, | |||
| or the entire connection. | in units of octets. | |||
| The flow control offset is expressed in units of octets for | When counting data toward this limit, an endpoint accounts for the | |||
| individual streams (for stream identifiers other than 0). | largest received offset of data that is sent or received on the | |||
| stream. Loss or reordering can mean that the largest received offset | ||||
| on a stream can be greater than the total size of data received on | ||||
| that stream. Receiving STREAM frames might not increase the largest | ||||
| received offset. | ||||
| The connection-level flow control offset is expressed in units of | The data sent on a stream MUST NOT exceed the largest maximum stream | |||
| 1024 octets (for a stream identifier of 0). That is, the connection- | data value advertised by the receiver. An endpoint MUST terminate a | |||
| level flow control offset is determined by multiplying the encoded | connection with a QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error if | |||
| value by 1024. | it receives more data than the largest maximum stream data that it | |||
| has sent for the affected stream, unless this is a result of a change | ||||
| in the initial limits (see Section 7.3.2). | ||||
| An endpoint accounts for the maximum offset of data that is sent or | 8.5. MAX_STREAM_ID Frame | |||
| 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 | The MAX_STREAM_ID frame (type=0x06) informs the peer of the maximum | |||
| control offset advertised by the receiver. The sum of the maximum | stream ID that they are permitted to open. | |||
| data offsets of all streams (including closed streams) MUST NOT | ||||
| exceed the connection flow control offset advertised by the receiver. | The frame is as follows: | |||
| An endpoint MUST terminate a connection with a | ||||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error if it receives more | 0 1 2 3 | |||
| data than the largest flow control offset that it has sent, unless | 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 | |||
| this is a result of a change in the initial offsets (see | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Stream ID (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields in the MAX_STREAM_ID frame are as follows: | ||||
| Maximum Stream ID: ID of the maximum peer-initiated stream ID for | ||||
| the connection. | ||||
| Loss or reordering can mean that a MAX_STREAM_ID frame can be | ||||
| received which states a lower stream limit than the client has | ||||
| previously received. MAX_STREAM_ID frames which do not increase the | ||||
| maximum stream ID MUST be ignored. | ||||
| A peer MUST NOT initiate a stream with a higher stream ID than the | ||||
| greatest maximum stream ID it has received. An endpoint MUST | ||||
| terminate a connection with a QUIC_TOO_MANY_OPEN_STREAMS error if a | ||||
| peer initiates a stream with a higher stream ID than it has sent, | ||||
| unless this is a result of a change in the initial limits (see | ||||
| Section 7.3.2). | Section 7.3.2). | |||
| 8.4. BLOCKED Frame | 8.6. BLOCKED Frame | |||
| A sender sends a BLOCKED frame (type=0x05) when it is ready to send | A sender sends a BLOCKED frame (type=0x08) when it wishes to send | |||
| data (and has data to send), but is currently flow control blocked. | data, but is unable to due to connection-level flow control (see | |||
| BLOCKED frames are purely informational frames, but extremely useful | Section 11.2.1). BLOCKED frames can be used as input to tuning of | |||
| for debugging purposes. A receiver of a BLOCKED frame should simply | flow control algorithms (see Section 11.1.2). | |||
| discard it (after possibly printing a helpful log message). The | ||||
| frame is as follows: | The BLOCKED frame does not contain a payload. | |||
| 8.7. STREAM_BLOCKED Frame | ||||
| A sender sends a STREAM_BLOCKED frame (type=0x09) when it wishes to | ||||
| send data, but is unable to due to stream-level flow control. This | ||||
| frame is analogous to BLOCKED (Section 8.6). | ||||
| The STREAM_BLOCKED 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 STREAM_BLOCKED frame contains a single field: | |||
| 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. | |||
| stream that is flow control blocked. When zero, the Stream ID | ||||
| field indicates that the connection is flow control blocked. | ||||
| 8.5. RST_STREAM Frame | An endpoint MAY send a STREAM_BLOCKED frame for a stream that exceeds | |||
| the maximum stream ID set by its peer (see Section 8.5). This does | ||||
| not open the stream, but informs the peer that a new stream was | ||||
| needed, but the stream limit prevented the creation of the stream. | ||||
| 8.8. STREAM_ID_NEEDED Frame | ||||
| A sender sends a STREAM_ID_NEEDED frame (type=0x0a) when it wishes to | ||||
| open a stream, but is unable to due to the maximum stream ID limit. | ||||
| The STREAM_ID_NEEDED frame does not contain a payload. | ||||
| 8.9. 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. | |||
| After sending a RST_STREAM, an endpoint ceases transmission of STREAM | ||||
| frames on the identified stream. A receiver of RST_STREAM can | ||||
| discard any data that it already received on that stream. An | ||||
| endpoint sends a RST_STREAM in response to a RST_STREAM unless the | ||||
| stream is already closed. | ||||
| The RST_STREAM 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) | | | Error Code (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Final Offset (64) + | + Final Offset (64) + | |||
| skipping to change at page 40, line 16 ¶ | skipping to change at page 46, line 4 ¶ | |||
| 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) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Final Offset (64) + | + Final Offset (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Error code: A 32-bit error code which indicates why the stream is | Error code: A 32-bit error code which indicates why the stream is | |||
| being closed. | being closed. | |||
| Stream ID: The 32-bit Stream ID of the stream being terminated. | Stream ID: The 32-bit Stream ID of the stream being terminated. | |||
| Final offset: A 64-bit unsigned integer indicating the absolute byte | Final offset: A 64-bit unsigned integer indicating the absolute byte | |||
| offset of the end of data written on this stream by the RST_STREAM | offset of the end of data written on this stream by the RST_STREAM | |||
| sender. | sender. | |||
| 8.6. PADDING Frame | 8.10. PADDING Frame | |||
| The PADDING frame (type=0x00) has no semantic value. PADDING frames | The PADDING frame (type=0x00) has no semantic value. PADDING frames | |||
| can be used to increase the size of a packet. Padding can be used to | can be used to increase the size of a packet. Padding can be used to | |||
| increase an initial client packet to the minimum required size, or to | increase an initial client packet to the minimum required size, or to | |||
| provide protection against traffic analysis for protected packets. | provide protection against traffic analysis for protected packets. | |||
| A PADDING frame has no content. That is, a PADDING frame consists of | A PADDING frame has no content. That is, a PADDING frame consists of | |||
| the single octet that identifies the frame as a PADDING frame. | the single octet that identifies the frame as a PADDING frame. | |||
| 8.7. PING frame | 8.11. 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 acknowledge the packet containing this frame. The PING | needs to acknowledge the packet containing this frame. The PING | |||
| frame SHOULD be used to keep a connection alive when a stream is | frame SHOULD be used to keep a connection alive when a stream is | |||
| open. The default is to send a PING frame after 15 seconds of | open. The default is to send a PING frame after 15 seconds of | |||
| quiescence. A PING frame has no additional fields. | quiescence. A PING frame has no additional fields. | |||
| 8.8. CONNECTION_CLOSE frame | 8.12. NEW_CONNECTION_ID Frame | |||
| A server sends a NEW_CONNECTION_ID to provide the client with | ||||
| alternative connection IDs that can be used to break linkability when | ||||
| migrating connections (see Section 7.6.1). | ||||
| The NEW_CONNECTION_ID is as follows: | ||||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Sequence (16) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | | | ||||
| + Connection ID (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields are: | ||||
| Sequence: A 16-bit sequence number. This value starts at 0 and | ||||
| increases by 1 for each connection ID that is provided by the | ||||
| server. The sequence value can wrap; the value 65535 is followed | ||||
| by 0. When wrapping the sequence field, the server MUST ensure | ||||
| that a value with the same sequence has been received and | ||||
| acknowledged by the client. The connection ID that is assigned | ||||
| during the handshake is assumed to have a sequence of 65535. | ||||
| Connection ID: A 64-bit connection ID. | ||||
| 8.13. 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 | |||
| skipping to change at page 41, line 22 ¶ | skipping to change at page 47, line 39 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | 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: | |||
| 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. | |||
| Reason Phrase Length: A 16-bit unsigned number specifying the length | Reason Phrase Length: A 16-bit unsigned number specifying the length | |||
| of the reason phrase. This may be zero if the sender chooses to | of the reason phrase. Note that a CONNECTION_CLOSE frame cannot | |||
| not give details beyond the Error Code. | be split between packets, so in practice any limits on packet size | |||
| will also limit the space available for a reason phrase. | ||||
| Reason Phrase: An optional human-readable explanation for why the | Reason Phrase: A human-readable explanation for why the connection | |||
| connection was closed. | was closed. This can be zero length if the sender chooses to not | |||
| give details beyond the Error Code. This SHOULD be a UTF-8 | ||||
| encoded string [RFC3629]. | ||||
| 8.9. GOAWAY Frame | 8.14. GOAWAY Frame | |||
| An endpoint uses a GOAWAY frame (type=0x03) to initiate a graceful | An endpoint uses a GOAWAY frame (type=0x03) to initiate a graceful | |||
| shutdown of a connection. The endpoints will continue to use any | shutdown of a connection. The endpoints will continue to use any | |||
| active streams, but the sender of the GOAWAY will not initiate or | active streams, but the sender of the GOAWAY will not initiate or | |||
| accept any additional streams beyond those indicated. The GOAWAY | accept any additional streams beyond those indicated. The GOAWAY | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 42, line 34 ¶ | skipping to change at page 49, line 9 ¶ | |||
| In addition to initiating a graceful shutdown of a connection, GOAWAY | In addition to initiating a graceful shutdown of a connection, GOAWAY | |||
| MAY be sent immediately prior to sending a CONNECTION_CLOSE frame | MAY be sent immediately prior to sending a CONNECTION_CLOSE frame | |||
| that is sent as a result of detecting a fatal error. Higher-numbered | 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. | streams than those indicated in the GOAWAY frame can then be retried. | |||
| 9. Packetization and Reliability | 9. Packetization and Reliability | |||
| The Path Maximum Transmission Unit (PTMU) is the maximum size of the | The Path Maximum Transmission Unit (PTMU) is the maximum size of the | |||
| entire IP header, UDP header, and UDP payload. The UDP payload | entire IP header, UDP header, and UDP payload. The UDP payload | |||
| includes the QUIC public header, encrypted payload, and any | includes the QUIC public header, protected payload, and any | |||
| authentication fields. | authentication fields. | |||
| All QUIC packets SHOULD be sized to fit within the estimated PMTU to | All QUIC packets SHOULD be sized to fit within the estimated PMTU to | |||
| avoid IP fragmentation or packet drops. To optimize bandwidth | avoid IP fragmentation or packet drops. To optimize bandwidth | |||
| efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | |||
| ([RFC4821]) and MAY use PMTU Discovery ([RFC1191], [RFC1981]) for | ([RFC4821]) and MAY use PMTU Discovery ([RFC1191], [RFC1981]) for | |||
| detecting the PMTU, setting the PMTU appropriately, and storing the | detecting the PMTU, setting the PMTU appropriately, and storing the | |||
| result of previous PMTU determinations. | result of previous PMTU determinations. | |||
| In the absence of these mechanisms, QUIC endpoints SHOULD NOT send IP | In the absence of these mechanisms, QUIC endpoints SHOULD NOT send IP | |||
| packets larger than 1280 octets. Assuming the minimum IP header | packets larger than 1280 octets. Assuming the minimum IP header | |||
| size, this results in a UDP payload length of 1232 octets for IPv6 | size, this results in a QUIC packet size of 1232 octets for IPv6 and | |||
| and 1252 octets for IPv4. | 1252 octets for IPv4. | |||
| QUIC endpoints that implement any kind of PMTU discovery SHOULD | QUIC endpoints that implement any kind of PMTU discovery SHOULD | |||
| maintain an estimate for each combination of local and remote IP | maintain an estimate for each combination of local and remote IP | |||
| addresses (as each pairing could have a different maximum MTU in the | addresses (as each pairing could have a different maximum MTU in the | |||
| path). | path). | |||
| QUIC depends on the network path supporting a MTU of at least 1280 | QUIC depends on the network path supporting a MTU of at least 1280 | |||
| octets. This is the IPv6 minimum and therefore also supported by | octets. This is the IPv6 minimum and therefore also supported by | |||
| most modern IPv4 networks. An endpoint MUST NOT reduce their MTU | most modern IPv4 networks. An endpoint MUST NOT reduce their MTU | |||
| below this number, even if it receives signals that indicate a | below this number, even if it receives signals that indicate a | |||
| smaller limit might exist. | smaller limit might exist. | |||
| Clients MUST ensure that the first packet in a connection, and any | Clients MUST ensure that the first packet in a connection, and any | |||
| retransmissions of those octets, has a total size (including IP and | retransmissions of those octets, has a QUIC packet size of least 1232 | |||
| UDP headers) of at least 1280 bytes. This might require inclusion of | octets for an IPv6 packet and 1252 octets for an IPv4 packet. In the | |||
| PADDING frames. It is RECOMMENDED that a packet be padded to exactly | absence of extensions to the IP header, padding to exactly these | |||
| 1280 octets unless the client has a reasonable assurance that the | values will result in an IP packet that is 1280 octets. | |||
| 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 | The initial client packet SHOULD be padded to exactly these values | |||
| if it its total size is less than 1280 octets, to mitigate | unless the client has a reasonable assurance that the PMTU is larger. | |||
| amplification attacks. | Sending a packet of this size ensures that the network path supports | |||
| an MTU of this size and helps reduce the amplitude of amplification | ||||
| attacks caused by server responses toward an unverified client | ||||
| address. | ||||
| Servers MUST ignore an initial plaintext packet from a client if its | ||||
| total size is less than 1232 octets for IPv6 or 1252 octets for IPv4. | ||||
| If a QUIC endpoint determines that the PMTU between any pair of local | If a QUIC endpoint determines that the PMTU between any pair of local | |||
| and remote IP addresses has fallen below 1280 octets, it MUST | and remote IP addresses has fallen below 1280 octets, it MUST | |||
| immediately cease sending QUIC packets between those IP addresses. | immediately cease sending QUIC packets on the affected path. This | |||
| This may result in abrupt termination of the connection if all pairs | could result in termination of the connection if an alternative path | |||
| are affected. In this case, an endpoint SHOULD send a Public Reset | cannot be found. | |||
| 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 | A sender bundles one or more frames in a Regular QUIC packet (see | |||
| Section 6). | 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 | |||
| skipping to change at page 44, line 42 ¶ | skipping to change at page 51, line 17 ¶ | |||
| To avoid creating an indefinite feedback loop, an endpoint MUST NOT | To avoid creating an indefinite feedback loop, an endpoint MUST NOT | |||
| generate an ACK frame in response to a packet containing only ACK or | generate an ACK frame in response to a packet containing only ACK or | |||
| PADDING frames. | 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.1. Special Considerations for PMTU Discovery | 9.1. Special Considerations for PMTU Discovery | |||
| Traditional ICMP-based path MTU discovery in IPv4 ([RFC1191] is | Traditional ICMP-based path MTU discovery in IPv4 [RFC1191] is | |||
| potentially vulnerable to off-path attacks that successfully guess | potentially vulnerable to off-path attacks that successfully guess | |||
| the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | |||
| value. TCP connections mitigate this risk by using the (at minimum) | value. TCP connections mitigate this risk by using the (at minimum) | |||
| 8 bytes of transport header echoed in the ICMP message to validate | 8 bytes of transport header echoed in the ICMP message to validate | |||
| the TCP sequence number as valid for the current connection. | the TCP sequence number as valid for the current connection. | |||
| However, as QUIC operates over UDP, in IPv4 the echoed information | However, as QUIC operates over UDP, in IPv4 the echoed information | |||
| could consist only of the IP and UDP headers, which usually has | could consist only of the IP and UDP headers, which usually has | |||
| insufficient entropy to mitigate off-path attacks. | insufficient entropy to mitigate off-path attacks. | |||
| As a result, endpoints that implement PMTUD in IPv4 SHOULD take steps | As a result, endpoints that implement PMTUD in IPv4 SHOULD take steps | |||
| skipping to change at page 45, line 40 ¶ | skipping to change at page 52, line 15 ¶ | |||
| Data that is received on a stream is delivered in order within that | Data that is received on a stream is delivered in order within that | |||
| stream, but there is no particular delivery order across streams. | stream, but there is no particular delivery order across streams. | |||
| Transmit ordering among streams is left to the implementation. | Transmit ordering among streams is left to the implementation. | |||
| The creation and destruction of streams are expected to have minimal | The creation and destruction of streams are expected to have minimal | |||
| bandwidth and computational cost. A single STREAM frame may create, | bandwidth and computational cost. A single STREAM frame may create, | |||
| carry data for, and terminate a stream, or a stream may last the | carry data for, and terminate a stream, or a stream may last the | |||
| entire duration of a connection. | entire duration of a connection. | |||
| Streams are individually flow controlled, allowing an endpoint to | Streams are individually flow controlled, allowing an endpoint to | |||
| limit memory commitment and to apply back pressure. | limit memory commitment and to apply back pressure. The creation of | |||
| streams is also flow controlled, with each peer declaring the maximum | ||||
| stream ID it is willing to accept at a given time. | ||||
| 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. | |||
| 10.1. Life of a Stream | 10.1. Stream Identifiers | |||
| Streams are identified by an unsigned 32-bit integer, referred to as | ||||
| the Stream ID. To avoid Stream ID collision, clients initiate | ||||
| streams using odd-numbered Stream IDs; streams initiated by the | ||||
| server use even-numbered Stream IDs. | ||||
| Stream ID 0 (0x0) is reserved for the cryptographic handshake. | ||||
| Stream 0 MUST NOT be used for application data, and is the first | ||||
| client-initiated stream. | ||||
| A QUIC endpoint cannot reuse a Stream ID. Streams MUST be created in | ||||
| sequential order. Open streams can be used in any order. Streams | ||||
| that are used out of order result in lower-numbered streams in the | ||||
| same direction being counted as open. | ||||
| Stream IDs are usually encoded as a 32-bit integer, though the STREAM | ||||
| frame (Section 8.1) permits a shorter encoding when the leading bits | ||||
| of the stream ID are zero. | ||||
| 10.2. 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. | |||
| +--------+ | +--------+ | |||
| | | | recv RST | | send RST | |||
| | idle | | ,-------------| idle |---------------. | |||
| | | | / | | \ | |||
| +--------+ | | +--------+ | | |||
| | | | | | | |||
| | send data/ | | send STREAM / recv STREAM | | |||
| | recv data/ | | | | | |||
| | recv higher stream | | v | | |||
| | | | recv FIN/ +--------+ send FIN/ | | |||
| v | | recv RST | | send RST | | |||
| +--------+ | | ,---------| open |-----------. | | |||
| recv FIN | | send FIN | | / | | \ | | |||
| ,---------| open |-----------. | v v +--------+ v v | |||
| / | | \ | +----------+ +----------+ | |||
| v +--------+ v | | half | | half | | |||
| +----------+ | +----------+ | | closed | | closed | | |||
| | half | | | half | | | (remote) | | (local) | | |||
| | closed | | send RST/ | closed | | +----------+ +----------+ | |||
| | (remote) | | recv RST | (local) | | | | | |||
| +----------+ | +----------+ | | send FIN/ +--------+ recv FIN/ | | |||
| | | | | \ send RST | | recv RST / | |||
| | send FIN/ | recv FIN/ | | `----------->| closed |<-------------' | |||
| | send RST/ v send RST/ | | ||||
| | recv RST +--------+ recv RST | | ||||
| `------------->| |<---------------' | ||||
| | closed | | ||||
| | | | | | | |||
| +--------+ | +--------+ | |||
| send: endpoint sends this frame | send: endpoint sends this frame | |||
| recv: endpoint receives this frame | recv: endpoint receives this frame | |||
| data: application data in a STREAM frame | STREAM: a STREAM frame | |||
| FIN: FIN flag in a STREAM frame | FIN: FIN flag in a STREAM frame | |||
| RST: RST_STREAM frame | RST: RST_STREAM frame | |||
| Figure 11: 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 flag is sent on an empty | cause two state transitions. | |||
| STREAM frame, the offset in the STREAM frame MUST be one greater than | ||||
| the last data byte sent on this stream. | ||||
| The recipient of a frame which changes stream state will have a | The recipient of a frame which changes stream state will have a | |||
| delayed view of the state of a stream while the frame is in transit. | delayed view of the state of a stream while the frame is in transit. | |||
| Endpoints do not coordinate the creation of streams; they are created | Endpoints do not coordinate the creation of streams; they are created | |||
| unilaterally by either endpoint. The negative consequences of a | unilaterally by either endpoint. Endpoints can use acknowledgments | |||
| mismatch in states are limited to the "closed" state after sending | to understand the peer's subjective view of stream state at any given | |||
| RST_STREAM, where frames might be received for some time after | time. | |||
| closing. Endpoints can use acknowledgments to understand the peer's | ||||
| subjective view of stream state at any given time. | ||||
| Streams have the following states: | In the absence of more specific guidance elsewhere in this document, | |||
| implementations SHOULD treat the receipt of a frame that is not | ||||
| expressly permitted in the description of a state as a connection | ||||
| error (see Section 12). | ||||
| 10.1.1. idle | 10.2.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 identified stream to | |||
| "open". The stream identifier is selected as described in | become "open". The stream identifier for a new stream is selected as | |||
| Section 10.2. The same STREAM frame can also cause a stream to | described in Section 10.1. The same STREAM frame can also cause a | |||
| immediately become "half-closed". | stream to immediately become "half-closed" if the FIN flag is set. | |||
| Receiving a STREAM frame on a peer-initiated stream (that is, a | Receiving a STREAM frame on a peer-initiated stream (that is, a | |||
| packet sent by a server on an even-numbered stream or a client packet | 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" | on an odd-numbered stream) also causes all lower-numbered "idle" | |||
| streams in the same direction to become "open". This could occur if | streams in the same direction to become "open". This could occur if | |||
| a peer begins sending on streams in a different order to their | a peer begins sending on streams in a different order to their | |||
| creation, or it could happen if packets are lost or reordered in | creation, or it could happen if packets are lost or reordered in | |||
| transit. | transit. | |||
| Receiving any frame other than STREAM or RST_STREAM on a stream in | A RST_STREAM frame on an "idle" stream causes the stream to become | |||
| this state MUST be treated as a connection error (Section 12) of type | "half-closed". Sending a RST_STREAM frame causes the stream to | |||
| YYYY. | become "half-closed (local)"; receiving RST_STREAM causes the stream | |||
| to become "half-closed (remote)". | ||||
| 10.1.2. open | An endpoint might receive MAX_STREAM_DATA frames on peer-initiated | |||
| streams that are "idle" if there is loss or reordering of packets. | ||||
| Receiving any frame other than STREAM, MAX_STREAM_DATA, | ||||
| STREAM_BLOCKED, or RST_STREAM on a stream in this state MUST be | ||||
| treated as a connection error (Section 12) of type YYYY. | ||||
| An endpoint MUST NOT send a STREAM or RST_STREAM frame for a stream | ||||
| ID that is higher than the peers advertised maximum stream ID (see | ||||
| Section 8.5). | ||||
| 10.2.2. 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, endpoints can send MAX_STREAM_DATA and | |||
| control limit advertised by its receiving peer (Section 11). | MUST observe the value advertised by its receiving peer (see | |||
| 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)" once | flag causes the stream state to become "half-closed (remote)" once | |||
| all preceding data has arrived. The receiving endpoint MUST NOT | all preceding data has arrived. The receiving endpoint MUST NOT | |||
| consider the stream state to have changed until all data has arrived. | consider the stream state to have changed until all data has arrived. | |||
| Either endpoint can send a RST_STREAM frame from this state, causing | A RST_STREAM frame on an "open" stream causes the stream to become | |||
| it to transition immediately to "closed". | "half-closed". Sending a RST_STREAM frame causes the stream to | |||
| become "half-closed (local)"; receiving RST_STREAM causes the stream | ||||
| to become "half-closed (remote)". | ||||
| 10.1.3. half-closed (local) | Any frame type that mentions a stream ID can be sent in this state. | |||
| A stream that is in the "half-closed (local)" state MUST NOT be used | 10.2.3. half-closed (local) | |||
| for sending STREAM frames; WINDOW_UPDATE and RST_STREAM MAY be sent | ||||
| in this state. | ||||
| A stream transitions from this state to "closed" when a STREAM frame | A stream that is in the "half-closed (local)" state MUST NOT be used | |||
| that contains a FIN flag is received and all prior data has arrived, | for sending on new STREAM frames. Retransmission of data that has | |||
| or when either peer sends a RST_STREAM frame. | already been sent on STREAM frames is permitted. An endpoint MAY | |||
| also send MAX_STREAM_DATA and RST_STREAM in this state. | ||||
| An endpoint that closes a stream MUST NOT send data beyond the final | 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. | offset that it has chosen, see Section 10.2.5 for details. | |||
| An endpoint can receive any type of frame in this state. Providing | ||||
| flow-control credit using WINDOW_UPDATE frames is necessary to | ||||
| continue receiving flow-controlled frames. In this state, a receiver | ||||
| MAY ignore WINDOW_UPDATE frames for this stream, which might arrive | ||||
| for a short period after a frame bearing the FIN flag is sent. | ||||
| 10.1.4. half-closed (remote) | ||||
| 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 | ||||
| obligated to maintain a receiver stream-level flow-control window. | ||||
| A stream that is in the "half-closed (remote)" state will have a | ||||
| final offset for received data, see Section 10.1.5 for details. | ||||
| 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 | ||||
| advertised stream-level and connection-level flow-control limits | ||||
| (Section 11). | ||||
| 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. | ||||
| 10.1.5. closed | A stream transitions from this state to "closed" when a STREAM frame | |||
| that contains a FIN flag is received and all prior data has arrived, | ||||
| or when a RST_STREAM frame is received. | ||||
| The "closed" state is the terminal state. | An endpoint can receive any frame that mentions a stream ID in this | |||
| state. Providing flow-control credit using MAX_STREAM_DATA frames is | ||||
| necessary to continue receiving flow-controlled frames. In this | ||||
| state, a receiver MAY ignore MAX_STREAM_DATA frames for this stream, | ||||
| which might arrive for a short period after a frame bearing the FIN | ||||
| flag is sent. | ||||
| An endpoint will learn the final offset of the data it receives on a | 10.2.4. half-closed (remote) | |||
| stream when it enters the "half-closed (remote)" or "closed" state. | ||||
| The final offset is carried explicitly in the RST_STREAM frame; | ||||
| otherwise, the final offset is the offset of the end of the data | ||||
| carried in STREAM frame marked with a FIN flag. | ||||
| An endpoint MUST NOT send data on a stream at or beyond the final | A stream is "half-closed (remote)" when the stream is no longer being | |||
| offset. | used by the peer to send any data. An endpoint will have either | |||
| received all data that a peer has sent or will have received a | ||||
| RST_STREAM frame and discarded any received data. | ||||
| Once a final offset for a stream is known, it cannot change. If a | Once all data has been either received or discarded, a sender is no | |||
| RST_STREAM or STREAM frame causes the final offset to change for a | longer obligated to update the maximum received data for the | |||
| stream, an endpoint SHOULD respond with a | connection. | |||
| 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. | |||
| may continue receiving frames for the stream on which a RST_STREAM is | ||||
| received. | ||||
| If this state is reached as a result of sending a RST_STREAM frame, | ||||
| the peer that receives the RST_STREAM frame might have already sent - | ||||
| or enqueued for sending - frames on the stream that cannot be | ||||
| withdrawn. An endpoint MUST ignore frames that it receives on closed | ||||
| streams after it has sent a RST_STREAM frame. An endpoint MAY choose | ||||
| to limit the period over which it ignores frames and treat frames | ||||
| that arrive after this time as being in error. | ||||
| STREAM frames received after sending RST_STREAM are counted toward | ||||
| the connection and stream flow-control windows. Even though these | ||||
| frames might be ignored, because they are sent before their sender | ||||
| receives the RST_STREAM, the sender will consider the frames to count | ||||
| against its flow-control windows. | ||||
| In the absence of more specific guidance elsewhere in this document, | Due to reordering, an endpoint could continue receiving frames for | |||
| implementations SHOULD treat the receipt of a frame that is not | the stream even after the stream is closed for sending. Frames | |||
| expressly permitted in the description of a state as a connection | received after a peer closes a stream SHOULD be discarded. An | |||
| error (Section 12). Frames of unknown types are ignored. | endpoint MAY choose to limit the period over which it ignores frames | |||
| and treat frames that arrive after this time as being in error. | ||||
| (TODO: QUIC_STREAM_NO_ERROR is a special case. Write it up.) | An endpoint will know the final offset of the data it receives on a | |||
| stream when it reaches the "half-closed (remote)" state, see | ||||
| Section 11.3 for details. | ||||
| 10.2. Stream Identifiers | A stream in this state can be used by the endpoint to send any frame | |||
| that mentions a stream ID. In this state, the endpoint MUST observe | ||||
| advertised stream and connection data limits (see Section 11). | ||||
| Streams are identified by an unsigned 32-bit integer, referred to as | A stream can transition from this state to "closed" by completing | |||
| the StreamID. To avoid StreamID collision, clients MUST initiate | transmission of all data. This includes sending all data carried in | |||
| streams usinge odd-numbered StreamIDs; streams initiated by the | STREAM frames up including the terminal STREAM frame that contains a | |||
| server MUST use even-numbered StreamIDs. | FIN flag and receiving acknowledgment from the peer for all data. | |||
| A StreamID of zero (0x0) is reserved and used for connection-level | A stream becomes "closed" when the endpoint sends and receives | |||
| flow control frames (Section 11); the StreamID of zero cannot be used | acknowledgment of a RST_STREAM frame. | |||
| to establish a new stream. | ||||
| StreamID 1 (0x1) is reserved for the cryptographic handshake. | 10.2.5. closed | |||
| StreamID 1 MUST NOT be used for application data, and MUST be the | ||||
| first client-initiated stream. | ||||
| A QUIC endpoint cannot reuse a StreamID on a given connection. | The "closed" state is the terminal state for a stream. | |||
| Streams MUST be created in sequential order. Open streams can be | ||||
| used in any order. Streams that are used out of order result in | ||||
| lower-numbered streams in the same direction being counted as open. | ||||
| All streams, including stream 1, count toward this limit. Thus, a | Once a stream reaches this state, no frames can be sent that mention | |||
| concurrent stream limit of 0 will cause a connection to be unusable. | the stream. Reordering might cause frames to be received after | |||
| Application protocols that use QUIC might require a certain minimum | closing, see Section 10.2.4. | |||
| 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). | ||||
| 10.3. Stream Concurrency | 10.3. Stream Concurrency | |||
| An endpoint limits the number of concurrently active incoming streams | An endpoint limits the number of concurrently active incoming streams | |||
| by setting the concurrent stream limit (see Section 7.3.1) in the | by adjusting the maximum stream ID. An initial value is set in the | |||
| transport parameters. The maximum concurrent streams setting is | transport parameters (see Section 7.3.1) and is subsequently | |||
| specific to each endpoint and applies only to the peer that receives | increased by MAX_STREAM_ID frames (see Section 8.5). | |||
| the setting. That is, clients specify the maximum number of | ||||
| concurrent streams the server can initiate, and servers specify the | ||||
| maximum number of concurrent streams the client can initiate. | ||||
| Streams that are in the "open" state or in either of the "half- | ||||
| closed" states count toward the maximum number of streams that an | ||||
| endpoint is permitted to open. Streams in any of these three states | ||||
| count toward the limit advertised in the concurrent stream limit. | ||||
| A recently closed stream MUST also be considered to count toward this | The maximum stream ID is specific to each endpoint and applies only | |||
| limit until packets containing all frames required to close the | to the peer that receives the setting. That is, clients specify the | |||
| stream have been acknowledged. For a stream which closed cleanly, | maximum stream ID the server can initiate, and servers specify the | |||
| this means all STREAM frames have been acknowledged; for a stream | maximum stream ID the client can initiate. Each endpoint may respond | |||
| which closed abruptly, this means the RST_STREAM frame has been | on streams initiated by the other peer, regardless of whether it is | |||
| acknowledged. | permitted to initiated new streams. | |||
| 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 with an ID greater than the limit it has | |||
| stream limit to be exceeded MUST treat this as a stream error of type | sent MUST treat this as a stream error of type | |||
| QUIC_TOO_MANY_OPEN_STREAMS (Section 12). | QUIC_TOO_MANY_OPEN_STREAMS (Section 12), unless this is a result of a | |||
| change in the initial offsets (see Section 7.3.2). | ||||
| A receiver MUST NOT renege on an advertisement; that is, once a | ||||
| receiver advertises a stream ID via a MAX_STREAM_ID frame, it MUST | ||||
| NOT subsequently advertise a smaller maximum ID. A sender may | ||||
| receive MAX_STREAM_ID frames out of order; a sender MUST therefore | ||||
| ignore any MAX_STREAM_ID that does not increase the maximum. | ||||
| 10.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. | |||
| skipping to change at page 51, line 32 ¶ | skipping to change at page 57, line 37 ¶ | |||
| 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. The largest offset delivered on a | a stream has the stream offset 0. The largest offset delivered on a | |||
| stream MUST be less than 2^64. A receiver MUST ensure that received | stream MUST be less than 2^64. A receiver MUST ensure that received | |||
| stream data is delivered to the application as an ordered byte- | stream data is delivered to the application as an ordered byte- | |||
| stream. Data received out of order MUST be buffered for later | 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. | |||
| The cryptographic handshake stream, Stream 1, MUST NOT be subject to | An endpoint MUST NOT send data on any stream without ensuring that it | |||
| congestion control or connection-level flow control, but MUST be | is within the data limits set by its peer. The cryptographic | |||
| subject to stream-level flow control. An endpoint MUST NOT send data | handshake stream, Stream 0, is exempt from the connection-level data | |||
| on any other stream without consulting the congestion controller and | limits established by MAX_DATA. Stream 0 is still subject to stream- | |||
| the flow controller. | level data limits and MAX_STREAM_DATA. | |||
| Flow control is described in detail in Section 11, and congestion | Flow control is described in detail in Section 11, and congestion | |||
| control is described in the companion document [QUIC-RECOVERY]. | control is described in the companion document [QUIC-RECOVERY]. | |||
| 10.5. Stream Prioritization | 10.5. Stream Prioritization | |||
| Stream multiplexing has a significant effect on application | Stream multiplexing has a significant effect on application | |||
| performance if resources allocated to streams are correctly | performance if resources allocated to streams are correctly | |||
| prioritized. Experience with other multiplexed protocols, such as | prioritized. Experience with other multiplexed protocols, such as | |||
| HTTP/2 [RFC7540], shows that effective prioritization strategies have | HTTP/2 [RFC7540], shows that effective prioritization strategies have | |||
| a significant positive impact on performance. | a significant positive impact on performance. | |||
| QUIC does not provide frames for exchanging priotization information. | QUIC does not provide frames for exchanging prioritization | |||
| Instead it relies on receiving priority information from the | information. Instead it relies on receiving priority information | |||
| application that uses QUIC. Protocols that use QUIC are able to | from the application that uses QUIC. Protocols that use QUIC are | |||
| define any prioritization scheme that suits their application | able to define any prioritization scheme that suits their application | |||
| semantics. A protocol might define explicit messages for signaling | semantics. A protocol might define explicit messages for signaling | |||
| priority, such as those defined in HTTP/2; it could define rules that | 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 | allow an endpoint to determine priority based on context; or it could | |||
| leave the determination to the application. | leave the determination to the application. | |||
| A QUIC implementation SHOULD provide ways in which an application can | A QUIC implementation SHOULD provide ways in which an application can | |||
| indicate the relative priority of streams. When deciding which | indicate the relative priority of streams. When deciding which | |||
| streams to dedicate resources to, QUIC SHOULD use the information | streams to dedicate resources to, QUIC SHOULD use the information | |||
| provided by the application. Failure to account for priority of | provided by the application. Failure to account for priority of | |||
| streams can result in suboptimal performance. | streams can result in suboptimal performance. | |||
| skipping to change at page 52, line 26 ¶ | skipping to change at page 58, line 30 ¶ | |||
| Stream priority is most relevant when deciding which stream data will | Stream priority is most relevant when deciding which stream data will | |||
| be transmitted. Often, there will be limits on what can be | be transmitted. Often, there will be limits on what can be | |||
| transmitted as a result of connection flow control or the current | transmitted as a result of connection flow control or the current | |||
| congestion controller state. | congestion controller state. | |||
| Giving preference to the transmission of its own management frames | Giving preference to the transmission of its own management frames | |||
| ensures that the protocol functions efficiently. That is, | ensures that the protocol functions efficiently. That is, | |||
| prioritizing frames other than STREAM frames ensures that loss | prioritizing frames other than STREAM frames ensures that loss | |||
| recovery, congestion control, and flow control operate effectively. | recovery, congestion control, and flow control operate effectively. | |||
| Stream 1 MUST be prioritized over other streams prior to the | Stream 0 MUST be prioritized over other streams prior to the | |||
| completion of the cryptographic handshake. This includes the | completion of the cryptographic handshake. This includes the | |||
| retransmission of the second flight of client handshake messages, | retransmission of the second flight of client handshake messages, | |||
| that is, the TLS Finished and any client authentication messages. | that is, the TLS Finished and any client authentication messages. | |||
| STREAM frames that are determined to be lost SHOULD be retransmitted | STREAM frames that are determined to be lost SHOULD be retransmitted | |||
| before sending new data, unless application priorities indicate | before sending new data, unless application priorities indicate | |||
| otherwise. Retransmitting lost STREAM frames can fill in gaps, which | otherwise. Retransmitting lost STREAM frames can fill in gaps, which | |||
| allows the peer to consume already received data and free up flow | allows the peer to consume already received data and free up flow | |||
| control window. | control window. | |||
| skipping to change at page 53, line 7 ¶ | skipping to change at page 59, line 9 ¶ | |||
| 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 MAX_DATA or MAX_STREAM_DATA frames to the sender to | |||
| additional credit by sending the absolute byte offset in the stream | advertise additional credit by sending the absolute byte offset in | |||
| or in the connection which it is willing to receive. | the connection or stream which it is willing to receive. | |||
| The initial flow control credit is 65536 bytes for both the stream | ||||
| 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 by sending | |||
| connection by sending a WINDOW_UPDATE frame. A receiver MUST NOT | MAX_DATA or MAX_STREAM_DATA frames. A receiver MUST NOT renege on an | |||
| renege on an advertisement; that is, once a receiver advertises an | advertisement; that is, once a receiver advertises an offset, it MUST | |||
| offset via a WINDOW_UPDATE frame, it MUST NOT subsequently advertise | NOT subsequently advertise a smaller offset. A sender could receive | |||
| a smaller offset. A sender may receive WINDOW_UPDATE frames out of | MAX_DATA or MAX_STREAM_DATA frames out of order; a sender MUST | |||
| order; a sender MUST therefore ignore any WINDOW_UPDATE that does not | therefore ignore any flow control offset that does not move the | |||
| move the window forward. | window forward. | |||
| A receiver MUST close the connection with a | A receiver MUST close the connection with a | |||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error (Section 12) if the | QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error (Section 12) if the | |||
| peer violates the advertised stream or connection flow control | peer violates the advertised connection or stream data limits. | |||
| 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 | |||
| frame with the StreamID set appropriately. A receiver may use the | MAX_STREAM_DATA frame with the Stream ID set appropriately. A | |||
| current offset of data consumed to determine the flow control offset | receiver could use the current offset of data consumed to determine | |||
| to be advertised. A receiver MAY send copies of a WINDOW_UPDATE | the flow control offset to be advertised. A receiver MAY send | |||
| frame in multiple packets in order to make sure that the sender | MAX_STREAM_DATA frames in multiple packets in order to make sure that | |||
| receives it before running out of flow control credit, even if one of | the sender receives an update before running out of flow control | |||
| the packets is lost. | 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 on all streams contributing to connection flow | sent in STREAM frames on all streams. A receiver advertises credit | |||
| control. A receiver advertises credit for a connection by sending a | for a connection by sending a MAX_DATA frame. A receiver maintains a | |||
| WINDOW_UPDATE frame with the StreamID set to zero (0x00). A receiver | cumulative sum of bytes received on all streams, which are used to | |||
| maintains a cumulative sum of bytes received on all streams | check for flow control violations. A receiver might use a sum of | |||
| contributing to connection-level flow control, to check for flow | bytes consumed on all contributing streams to determine the maximum | |||
| control violations. A receiver may maintain a cumulative sum of | data limit to be advertised. | |||
| bytes consumed on all contributing streams to determine the | ||||
| connection-level flow control offset to be advertised. | ||||
| 11.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. | |||
| 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 | ||||
| the sender waiting for a WINDOW_UPDATE which will never come. | ||||
| 11.1.1. Mid-stream RST_STREAM | Conversely 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 the sender waiting for a MAX_DATA or MAX_STREAM_DATA | ||||
| frame which will never come. | ||||
| On receipt of a 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 the number of bytes that were | them as well. The receiver must learn the number of bytes that were | |||
| sent on the stream to make the same adjustment in its connection flow | sent on the stream to make the same adjustment in its connection 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. | |||
| 11.1.2. Response to a RST_STREAM | 11.1.1. 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. | |||
| 11.1.3. Offset Increment | 11.1.2. Data Limit Increments | |||
| 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. | MAX_DATA or MAX_STREAM_DATA to implementations, but offers a few | |||
| WINDOW_UPDATE frames constitute overhead, and therefore, sending a | considerations. These frames contribute to connection overhead. | |||
| WINDOW_UPDATE with small offset increments is undesirable. At the | Therefore frequently sending frames with small changes is | |||
| same time, sending WINDOW_UPDATES with large offset increments | undesirable. At the same time, infrequent updates require larger | |||
| requires the sender to commit to that amount of buffer. | increments to limits if blocking is to be avoided. Thus, larger | |||
| updates require a receiver to commit to larger resource commitments. | ||||
| Thus there is a tradeoff between resource commitment and overhead | ||||
| when determining how large a limit is advertised. | ||||
| Implementations must find the correct tradeoff between these sides to | A receiver MAY use an autotuning mechanism to tune the frequency and | |||
| determine how large an offset increment to send in a WINDOW_UPDATE. | amount that it increases data limits based on a roundtrip time | |||
| estimate and the rate at which the receiving application consumes | ||||
| data, similar to common TCP implementations. | ||||
| A receiver MAY use an autotuning mechanism to tune the size of the | 11.2. Stream Limit Increment | |||
| offset increment to advertise based on a roundtrip time estimate and | ||||
| the rate at which the receiving application consumes data, similar to | ||||
| common TCP implementations. | ||||
| 11.1.4. BLOCKED frames | As with flow control, this document leaves when and how many streams | |||
| to make available to a peer via MAX_STREAM_ID to implementations, but | ||||
| offers a few considerations. MAX_STREAM_ID frames constitute minimal | ||||
| overhead, while withholding MAX_STREAM_ID frames can prevent the peer | ||||
| from using the available parallelism. | ||||
| If a sender does not receive a WINDOW_UPDATE frame when it has run | Implementations will likely want to increase the maximum stream ID as | |||
| out of flow control credit, the sender will be blocked and MUST send | peer-initiated streams close. A receiver MAY also advance the | |||
| a BLOCKED frame. A BLOCKED frame is expected to be useful for | maximum stream ID based on current activity, system conditions, and | |||
| debugging at the receiver. A receiver SHOULD NOT wait for a BLOCKED | other environmental factors. | |||
| frame before sending a WINDOW_UPDATE, since doing so will cause at | ||||
| least one roundtrip of quiescence. For smooth operation of the | 11.2.1. Blocking on Flow Control | |||
| congestion controller, it is generally considered best to not let the | ||||
| sender go into quiescence if avoidable. To avoid blocking a sender, | If a sender does not receive a MAX_DATA or MAX_STREAM_DATA frame when | |||
| and to reasonably account for the possibiity of loss, a receiver | it has run out of flow control credit, the sender will be blocked and | |||
| should send a WINDOW_UPDATE frame at least two roundtrips before it | MUST send a BLOCKED or STREAM_BLOCKED frame. These frames are | |||
| expects the sender to get blocked. | expected to be useful for debugging at the receiver; they do not | |||
| require any other action. A receiver SHOULD NOT wait for a BLOCKED | ||||
| or STREAM_BLOCKED frame before sending MAX_DATA or MAX_STREAM_DATA, | ||||
| since doing so will mean that a sender is unable to send for an | ||||
| entire round trip. | ||||
| For smooth operation of the congestion controller, it is generally | ||||
| considered best to not let the sender go into quiescence if | ||||
| avoidable. To avoid blocking a sender, and to reasonably account for | ||||
| the possibiity of loss, a receiver should send a MAX_DATA or | ||||
| MAX_STREAM_DATA frame at least two roundtrips before it expects the | ||||
| sender to get blocked. | ||||
| A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | ||||
| when it reaches a data limit. A sender MUST NOT send multiple | ||||
| BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | ||||
| original frame is determined to be lost. Another BLOCKED or | ||||
| STREAM_BLOCKED frame can be sent after the data limit is increased. | ||||
| 11.3. Stream Final Offset | ||||
| The final offset is the count of the number of octets that are | ||||
| transmitted on a stream. For a stream that is reset, the final | ||||
| offset is carried explicitly in the RST_STREAM frame. Otherwise, the | ||||
| final offset is the offset of the end of the data carried in STREAM | ||||
| frame marked with a FIN flag. | ||||
| An endpoint will know the final offset for a stream when the stream | ||||
| enters the "half-closed (remote)" state. However, if there is | ||||
| reordering or loss, an endpoint might learn the final offset prior to | ||||
| entering this state if it is carried on a STREAM frame. | ||||
| An endpoint MUST NOT send data on a stream at or beyond the final | ||||
| offset. | ||||
| Once a final offset for a stream is known, it cannot change. If a | ||||
| RST_STREAM or STREAM frame causes the final offset to change for a | ||||
| 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, even after a stream is | ||||
| closed. 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. | ||||
| 12. Error Handling | 12. Error Handling | |||
| An endpoint that detects an error SHOULD signal the existence of that | An endpoint that detects an error SHOULD signal the existence of that | |||
| error to its peer. Errors can affect an entire connection (see | error to its peer. Errors can affect an entire connection (see | |||
| Section 12.1), or a single stream (see Section 12.2). | Section 12.1), or a single stream (see Section 12.2). | |||
| The most appropriate error code (Section 12.3) SHOULD be included in | The most appropriate error code (Section 12.3) SHOULD be included in | |||
| the frame that signals the error. Where this specification | the frame that signals the error. Where this specification | |||
| identifies error conditions, it also identifies the error code that | identifies error conditions, it also identifies the error code that | |||
| skipping to change at page 55, line 48 ¶ | skipping to change at page 62, line 45 ¶ | |||
| Public Reset is not suitable for any error that can be signaled with | 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 | 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 | sent by an endpoint that has the state necessary to send a frame on | |||
| the connection. | the connection. | |||
| 12.1. Connection Errors | 12.1. Connection Errors | |||
| Errors that result in the connection being unusable, such as an | Errors that result in the connection being unusable, such as an | |||
| obvious violation of protocol semantics or corruption of state that | obvious violation of protocol semantics or corruption of state that | |||
| affects an entire connection, MUST be signaled using a | affects an entire connection, MUST be signaled using a | |||
| CONNECTION_CLOSE frame (Section 8.8). An endpoint MAY close the | CONNECTION_CLOSE frame (Section 8.13). An endpoint MAY close the | |||
| connection in this manner, even if the error only affects a single | connection in this manner, even if the error only affects a single | |||
| stream. | stream. | |||
| A CONNECTION_CLOSE frame could be sent in a packet that is lost. An | A CONNECTION_CLOSE frame could be sent in a packet that is lost. An | |||
| endpoint SHOULD be prepared to retransmit a packet containing a | endpoint SHOULD be prepared to retransmit a packet containing a | |||
| CONNECTION_CLOSE frame if it receives more packets on a terminated | CONNECTION_CLOSE frame if it receives more packets on a terminated | |||
| connection. Limiting the number of retransmissions and the time over | connection. Limiting the number of retransmissions and the time over | |||
| which this final packet is sent limits the effort expended on | which this final packet is sent limits the effort expended on | |||
| terminated connections. | terminated connections. | |||
| An endpoint that chooses not to retransmit packets containing | An endpoint that chooses not to retransmit packets containing | |||
| CONNECTION_CLOSE risks a peer missing the first such packet. The | CONNECTION_CLOSE risks a peer missing the first such packet. The | |||
| only mechanism available to an endpoint that continues to receive | only mechanism available to an endpoint that continues to receive | |||
| data for a terminated connection is to send a Public Reset packet. | data for a terminated connection is to send a Public Reset packet. | |||
| 12.2. Stream Errors | 12.2. Stream Errors | |||
| If the error affects a single stream, but otherwise leaves the | If the error affects a single stream, but otherwise leaves the | |||
| connection in a recoverable state, the endpoint can sent a RST_STREAM | connection in a recoverable state, the endpoint can sent a RST_STREAM | |||
| frame (Section 8.5) with an appropriate error code to terminate just | frame (Section 8.9) with an appropriate error code to terminate just | |||
| the affected stream. | the affected stream. | |||
| Stream 1 is critical to the functioning of the entire connection. If | Stream 0 is critical to the functioning of the entire connection. If | |||
| stream 1 is closed with either a RST_STREAM or STREAM frame bearing | stream 0 is closed with either a RST_STREAM or STREAM frame bearing | |||
| the FIN flag, an endpoint MUST generate a connection error of type | the FIN flag, an endpoint MUST generate a connection error of type | |||
| QUIC_CLOSED_CRITICAL_STREAM. | QUIC_CLOSED_CRITICAL_STREAM. | |||
| Some application protocols make other streams critical to that | Some application protocols make other streams critical to that | |||
| protocol. An application protocol does not need to inform the | protocol. An application protocol does not need to inform the | |||
| transport that a stream is critical; it can instead generate | transport that a stream is critical; it can instead generate | |||
| appropriate errors in response to being notified that the critical | appropriate errors in response to being notified that the critical | |||
| stream is closed. | stream is closed. | |||
| An endpoint MAY send a RST_STREAM frame in the same packet as a | An endpoint MAY send a RST_STREAM frame in the same packet as a | |||
| skipping to change at page 60, line 52 ¶ | skipping to change at page 67, line 50 ¶ | |||
| space. In the non-attack scenario, the client will send an ACK frame | space. In the non-attack scenario, the client will send an ACK frame | |||
| with the larger value for largest acknowledged. In the attack | with the larger value for largest acknowledged. In the attack | |||
| scenario, the attacker could acknowledge a packet in the gap. If the | scenario, the attacker could acknowledge a packet in the gap. If the | |||
| server sees an acknowledgment for a packet that was never sent, the | server sees an acknowledgment for a packet that was never sent, the | |||
| connection can be aborted. | connection can be aborted. | |||
| The second mitigation is that the server can require that | The second mitigation is that the server can require that | |||
| acknowledgments for sent packets match the encryption level of the | acknowledgments for sent packets match the encryption level of the | |||
| sent packet. This mitigation is useful if the connection has an | sent packet. This mitigation is useful if the connection has an | |||
| ephemeral forward-secure key that is generated and used for every new | ephemeral forward-secure key that is generated and used for every new | |||
| connection. If a packet sent is encrypted with a forward-secure key, | connection. If a packet sent is protected with a forward-secure key, | |||
| then any acknowledgments that are received for them MUST also be | then any acknowledgments that are received for them MUST also be | |||
| forward-secure encrypted. Since the attacker will not have the | forward-secure protected. Since the attacker will not have the | |||
| forward secure key, the attacker will not be able to generate | forward secure key, the attacker will not be able to generate | |||
| forward-secure encrypted packets with ACK frames. | forward-secure protected packets with ACK frames. | |||
| 13.2. Slowloris Attacks | ||||
| The attacks commonly known as Slowloris [SLOWLORIS] try to keep many | ||||
| connections to the target endpoint open and hold them open as long as | ||||
| possible. These attacks can be executed against a QUIC endpoint by | ||||
| generating the minimum amount of activity necessary to avoid being | ||||
| closed for inactivity. This might involve sending small amounts of | ||||
| data, gradually opening flow control windows in order to control the | ||||
| sender rate, or manufacturing ACK frames that simulate a high loss | ||||
| rate. | ||||
| QUIC deployments SHOULD provide mitigations for the Slowloris | ||||
| attacks, such as increasing the maximum number of clients the server | ||||
| will allow, limiting the number of connections a single IP address is | ||||
| allowed to make, imposing restrictions on the minimum transfer speed | ||||
| a connection is allowed to have, and restricting the length of time | ||||
| an endpoint is allowed to stay connected. | ||||
| 13.3. Stream Fragmentation and Reassembly Attacks | ||||
| An adversarial endpoint might intentionally fragment the data on | ||||
| stream buffers in order to cause disproportionate memory commitment. | ||||
| An adversarial endpoint could open a stream and send some STREAM | ||||
| frames containing arbitrary fragments of the stream content. | ||||
| The attack is mitigated if flow control windows correspond to | ||||
| available memory. However, some receivers will over-commit memory | ||||
| and advertise flow control offsets in the aggregate that exceed | ||||
| actual available memory. The over-commitment strategy can lead to | ||||
| better performance when endpoints are well behaved, but renders | ||||
| endpoints vulnerable to the stream fragmentation attack. | ||||
| QUIC deployments SHOULD provide mitigations against the stream | ||||
| fragmentation attack. Mitigations could consist of avoiding over- | ||||
| committing memory, delaying reassembly of STREAM frames, implementing | ||||
| heuristics based on the age and duration of reassembly holes, or some | ||||
| combination. | ||||
| 13.4. Stream Commitment Attack | ||||
| An adversarial endpoint can open lots of streams, exhausting state on | ||||
| an endpoint. The adversarial endpoint could repeat the process on a | ||||
| large number of connections, in a manner similar to SYN flooding | ||||
| attacks in TCP. | ||||
| Normally, clients will open streams sequentially, as explained in | ||||
| Section 10.1. However, when several streams are initiated at short | ||||
| intervals, transmission error may cause STREAM DATA frames opening | ||||
| streams to be received out of sequence. A receiver is obligated to | ||||
| open intervening streams if a higher-numbered stream ID is received. | ||||
| Thus, on a new connection, opening stream 2000001 opens 1 million | ||||
| streams, as required by the specification. | ||||
| The number of active streams is limited by the concurrent stream | ||||
| limit transport parameter, as explained in Section 10.3. If chosen | ||||
| judisciously, this limit mitigates the effect of the stream | ||||
| commitment attack. However, setting the limit too low could affect | ||||
| performance when applications expect to open large number of streams. | ||||
| 14. IANA Considerations | 14. IANA Considerations | |||
| 14.1. QUIC Transport Parameter Registry | 14.1. QUIC Transport Parameter Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | |||
| under a "QUIC Protocol" heading. | under a "QUIC Protocol" heading. | |||
| The "QUIC Transport Parameters" registry governs a 16-bit space. | The "QUIC Transport Parameters" registry governs a 16-bit space. | |||
| This space is split into two spaces that are governed by different | This space is split into two spaces that are governed by different | |||
| skipping to change at page 62, line 5 ¶ | skipping to change at page 70, line 5 ¶ | |||
| the value. | the value. | |||
| The nominated expert(s) verify that a specification exists and is | The nominated expert(s) verify that a specification exists and is | |||
| readily accessible. The expert(s) are encouraged to be biased | readily accessible. The expert(s) are encouraged to be biased | |||
| towards approving registrations unless they are abusive, frivolous, | towards approving registrations unless they are abusive, frivolous, | |||
| or actively harmful (not merely aesthetically displeasing, or | or actively harmful (not merely aesthetically displeasing, or | |||
| architecturally dubious). | architecturally dubious). | |||
| The initial contents of this registry are shown in Table 4. | The initial contents of this registry are shown in Table 4. | |||
| +--------+------------------------+---------------+ | +--------+-------------------------+---------------+ | |||
| | Value | Parameter Name | Specification | | | Value | Parameter Name | Specification | | |||
| +--------+------------------------+---------------+ | +--------+-------------------------+---------------+ | |||
| | 0x0000 | stream_fc_offset | Section 7.3.1 | | | 0x0000 | initial_max_stream_data | Section 7.3.1 | | |||
| | | | | | | | | | | |||
| | 0x0001 | connection_fc_offset | Section 7.3.1 | | | 0x0001 | initial_max_data | Section 7.3.1 | | |||
| | | | | | | | | | | |||
| | 0x0002 | concurrent_streams | Section 7.3.1 | | | 0x0002 | initial_max_stream_id | Section 7.3.1 | | |||
| | | | | | | | | | | |||
| | 0x0003 | idle_timeout | Section 7.3.1 | | | 0x0003 | idle_timeout | Section 7.3.1 | | |||
| | | | | | | | | | | |||
| | 0x0004 | truncate_connection_id | Section 7.3.1 | | | 0x0004 | truncate_connection_id | Section 7.3.1 | | |||
| +--------+------------------------+---------------+ | +--------+-------------------------+---------------+ | |||
| Table 4: Initial QUIC Transport Parameters Entries | Table 4: Initial QUIC Transport Parameters Entries | |||
| 15. References | 15. References | |||
| 15.1. Normative References | 15.1. Normative References | |||
| [I-D.ietf-tls-tls13] | [I-D.ietf-tls-tls13] | |||
| Rescorla, E., "The Transport Layer Security (TLS) Protocol | Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", draft-ietf-tls-tls13-19 (work in progress), | Version 1.3", draft-ietf-tls-tls13-20 (work in progress), | |||
| March 2017. | April 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", draft-ietf-quic-recovery (work in | |||
| progress), May 2017. | ||||
| [QUIC-TLS] | [QUIC-TLS] | |||
| Thomson, M., Ed. and S. Turner, Ed., "Using Transport | Thomson, M., Ed. and S. Turner, Ed., "Using Transport | |||
| Layer Security (TLS) to Secure QUIC". | Layer Security (TLS) to Secure QUIC", draft-ietf-quic-tls | |||
| (work in progress), May 2017. | ||||
| [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | |||
| DOI 10.17487/RFC1191, November 1990, | DOI 10.17487/RFC1191, November 1990, | |||
| <http://www.rfc-editor.org/info/rfc1191>. | <http://www.rfc-editor.org/info/rfc1191>. | |||
| [RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU Discovery | [RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU Discovery | |||
| for IP version 6", RFC 1981, DOI 10.17487/RFC1981, August | for IP version 6", RFC 1981, DOI 10.17487/RFC1981, August | |||
| 1996, <http://www.rfc-editor.org/info/rfc1981>. | 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>. | |||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | ||||
| 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | ||||
| 2003, <http://www.rfc-editor.org/info/rfc3629>. | ||||
| [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>. | |||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | |||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | IANA Considerations Section in RFCs", BCP 26, RFC 5226, | |||
| DOI 10.17487/RFC5226, May 2008, | DOI 10.17487/RFC5226, May 2008, | |||
| <http://www.rfc-editor.org/info/rfc5226>. | <http://www.rfc-editor.org/info/rfc5226>. | |||
| 15.2. Informative References | 15.2. Informative References | |||
| skipping to change at page 63, line 44 ¶ | skipping to change at page 71, line 48 ¶ | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <http://www.rfc-editor.org/info/rfc7301>. | July 2014, <http://www.rfc-editor.org/info/rfc7301>. | |||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <http://www.rfc-editor.org/info/rfc7540>. | <http://www.rfc-editor.org/info/rfc7540>. | |||
| [SST] Ford, B., "Structured Streams: A New Transport | [SLOWLORIS] | |||
| Abstraction", DOI 10.1145/1282427.1282421, ACM | RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | |||
| SIGCOMM Computer Communication Review Volume 37 Issue 4, | <https://web.archive.org/web/20150315054838/ | |||
| October 2007. | http://ha.ckers.org/slowloris/>. | |||
| [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | ||||
| Communication Review Vol. 37, pp. 361, | ||||
| DOI 10.1145/1282427.1282421, October 2007. | ||||
| 15.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. | |||
| skipping to change at page 64, line 40 ¶ | skipping to change at page 72, line 44 ¶ | |||
| 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. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| C.1. Since draft-ietf-quic-transport-01: | C.1. Since draft-ietf-quic-transport-02 | |||
| o The size of the initial packet payload has a fixed minimum (#267, | ||||
| #472) | ||||
| o Define when Version Negotiation packets are ignored (#284, #294, | ||||
| #241, #143, #474) | ||||
| o The 64-bit FNV-1a algorithm is used for integrity protection of | ||||
| unprotected packets (#167, #480, #481, #517) | ||||
| o Rework initial packet types to change how the connection ID is | ||||
| chosen (#482, #442, #493) | ||||
| o No timestamps are forbidden in unprotected packets (#542, #429) | ||||
| o Cryptographic handshake is now on stream 0 (#456) | ||||
| o Remove congestion control exemption for cryptographic handshake | ||||
| (#248, #476) | ||||
| o Version 1 of QUIC uses TLS; a new version is needed to use a | ||||
| different handshake protocol (#516) | ||||
| o STREAM frames have a reduced number of offset lengths (#543, #430) | ||||
| o Split some frames into separate connection- and stream- level | ||||
| frames (#443) | ||||
| * WINDOW_UPDATE split into MAX_DATA and MAX_STREAM_DATA (#450) | ||||
| * BLOCKED split to match WINDOW_UPDATE split (#454) | ||||
| * Define STREAM_ID_NEEDED frame (#455) | ||||
| o A NEW_CONNECTION_ID frame supports connection migration without | ||||
| linkability (#232, #491, #496) | ||||
| o Transport parameters for 0-RTT are retained from a previous | ||||
| connection (#512) | ||||
| * A client in 0-RTT no longer required to reset excess streams | ||||
| (#425, #479) | ||||
| o Expanded security considerations (#440, #444, #445, #448) | ||||
| C.2. Since draft-ietf-quic-transport-01 | ||||
| o Defined short and long packet headers (#40, #148, #361) | o Defined short and long packet headers (#40, #148, #361) | |||
| o Defined a versioning scheme and stable fields (#51, #361) | o Defined a versioning scheme and stable fields (#51, #361) | |||
| o Define reserved version values for "greasing" negotiation (#112, | o Define reserved version values for "greasing" negotiation (#112, | |||
| #278) | #278) | |||
| o The initial packet number is randomized (#35, #283) | o The initial packet number is randomized (#35, #283) | |||
| o Narrow the packet number encoding range requirement (#67, #286, | o Narrow the packet number encoding range requirement (#67, #286, | |||
| #299, #323, #356) | #299, #323, #356) | |||
| o Defined client address validation (#52, #118, #120, #275) | o Defined client address validation (#52, #118, #120, #275) | |||
| o Define transport parameters as a TLS extension (#122) | o Define transport parameters as a TLS extension (#49, #122) | |||
| o SCUP and COPT parameters are no longer valid (#116, #117) | o SCUP and COPT parameters are no longer valid (#116, #117) | |||
| o Transport parameters for 0-RTT are either remembered from before, | o Transport parameters for 0-RTT are either remembered from before, | |||
| or assume default values (#126) | or assume default values (#126) | |||
| o The server chooses connection IDs in its final flight (#119, #349, | o The server chooses connection IDs in its final flight (#119, #349, | |||
| #361) | #361) | |||
| o The server echoes the Connection ID and packet number fields when | o The server echoes the Connection ID and packet number fields when | |||
| sending a Version Negotiation packet (#133, #295, #244) | sending a Version Negotiation packet (#133, #295, #244) | |||
| o Definied a minimum packet size for the initial handshake packet | o Defined a minimum packet size for the initial handshake packet | |||
| from the client (#69, #136, #139, #164) | from the client (#69, #136, #139, #164) | |||
| o Path MTU Discovery (#64, #106) | o Path MTU Discovery (#64, #106) | |||
| o The initial handshake packet from the client needs to fit in a | o The initial handshake packet from the client needs to fit in a | |||
| single packet (#338) | single packet (#338) | |||
| o Forbid acknowledgment of packets containing only ACK and PADDING | o Forbid acknowledgment of packets containing only ACK and PADDING | |||
| (#291) | (#291) | |||
| skipping to change at page 66, line 10 ¶ | skipping to change at page 75, line 10 ¶ | |||
| o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | |||
| (#289) | (#289) | |||
| o Define packet protection rules (#336) | o Define packet protection rules (#336) | |||
| o Require that stream be entirely delivered or reset, including | o Require that stream be entirely delivered or reset, including | |||
| acknowledgment of all STREAM frames or the RST_STREAM, before it | acknowledgment of all STREAM frames or the RST_STREAM, before it | |||
| closes (#381) | closes (#381) | |||
| o Remove stream reservation from state machine (#174, #280) | o Remove stream reservation from state machine (#174, #280) | |||
| o Only stream 0 does not contributing to connection-level flow | o Only stream 1 does not contribute to connection-level flow control | |||
| control (#204) | (#204) | |||
| o Stream 1 counts towards the maximum concurrent stream limit (#201, | o Stream 1 counts towards the maximum concurrent stream limit (#201, | |||
| #282) | #282) | |||
| o Remove connection-level flow control exclusion for some streams | o Remove connection-level flow control exclusion for some streams | |||
| (except 1) (#246) | (except 1) (#246) | |||
| o RST_STREAM affects connection-level flow control (#162, #163) | o RST_STREAM affects connection-level flow control (#162, #163) | |||
| o Flow control accounting uses the maximum data offset on each | o Flow control accounting uses the maximum data offset on each | |||
| skipping to change at page 66, line 39 ¶ | skipping to change at page 75, line 39 ¶ | |||
| o Remove error code and reason phrase from GOAWAY (#352, #355) | o Remove error code and reason phrase from GOAWAY (#352, #355) | |||
| o GOAWAY includes a final stream number for both directions (#347) | o GOAWAY includes a final stream number for both directions (#347) | |||
| o Error codes for RST_STREAM and CONNECTION_CLOSE are now at a | o Error codes for RST_STREAM and CONNECTION_CLOSE are now at a | |||
| consistent offset (#249) | consistent offset (#249) | |||
| o Defined priority as the responsibility of the application protocol | o Defined priority as the responsibility of the application protocol | |||
| (#104, #303) | (#104, #303) | |||
| C.2. Since draft-ietf-quic-transport-00: | C.3. 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 | |||
| o Use big endian for all numeric values | o Use big endian for all numeric values | |||
| C.3. Since draft-hamilton-quic-transport-protocol-01: | C.4. 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 | |||
| Jana Iyengar (editor) | Jana Iyengar (editor) | |||
| Email: jri@google.com | Email: jri@google.com | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| Mozilla | Mozilla | |||
| End of changes. 213 change blocks. | ||||
| 705 lines changed or deleted | 1135 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/ | ||||