| draft-ietf-quic-transport-07.txt | draft-ietf-quic-transport-08.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: April 16, 2018 Mozilla | Expires: June 8, 2018 Mozilla | |||
| October 13, 2017 | December 5, 2017 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-07 | draft-ietf-quic-transport-08 | |||
| 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 | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| https://mailarchive.ietf.org/arch/search/?email_list=quic [1]. | https://mailarchive.ietf.org/arch/search/?email_list=quic [1]. | |||
| Working Group information can be found at https://github.com/quicwg | Working Group information can be found at https://github.com/quicwg | |||
| [2]; source code and issues list for this draft can be found at | [2]; source code and issues list for this draft can be found at | |||
| https://github.com/quicwg/base-drafts/labels/transport [3]. | https://github.com/quicwg/base-drafts/labels/-transport [3]. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| 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 https://datatracker.ietf.org/drafts/current/. | Drafts is at https://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 April 16, 2018. | This Internet-Draft will expire on June 8, 2018. | |||
| 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 | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://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 . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 5 | 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 5 | |||
| 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 | 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 6 | |||
| 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 6 | 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 . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.3. Rich Signaling for Congestion Control and Loss Recovery . 7 | 3.3. Rich Signaling for Congestion Control and Loss Recovery . 7 | |||
| 3.4. Stream and Connection Flow Control . . . . . . . . . . . 7 | 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 . . . . . 8 | |||
| 3.6. Connection Migration and Resilience to NAT Rebinding . . 8 | 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 . . . . . . . . . . . . . . . . . . 9 | 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 9 | |||
| 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 9 | 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 13 | 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 13 | |||
| 5.4. Cleartext Packets . . . . . . . . . . . . . . . . . . . . 13 | 5.4. Cryptographic Handshake Packets . . . . . . . . . . . . . 14 | |||
| 5.4.1. Client Initial Packet . . . . . . . . . . . . . . . . 14 | 5.4.1. Initial Packet . . . . . . . . . . . . . . . . . . . 14 | |||
| 5.4.2. Server Stateless Retry Packet . . . . . . . . . . . . 14 | 5.4.2. Retry Packet . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5.4.3. Server Cleartext Packet . . . . . . . . . . . . . . . 15 | 5.4.3. Handshake Packet . . . . . . . . . . . . . . . . . . 15 | |||
| 5.4.4. Client Cleartext Packet . . . . . . . . . . . . . . . 15 | ||||
| 5.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 16 | 5.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.6. Connection ID . . . . . . . . . . . . . . . . . . . . . . 16 | 5.6. Connection ID . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.7. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 17 | 5.7. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.7.1. Initial Packet Number . . . . . . . . . . . . . . . . 18 | 5.7.1. Initial Packet Number . . . . . . . . . . . . . . . . 18 | |||
| 5.8. Handling Packets from Different Versions . . . . . . . . 18 | 5.8. Handling Packets from Different Versions . . . . . . . . 18 | |||
| 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 19 | 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 19 | |||
| 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 20 | 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 20 | |||
| 7.1. Matching Packets to Connections . . . . . . . . . . . . . 21 | 7.1. Matching Packets to Connections . . . . . . . . . . . . . 21 | |||
| 7.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 22 | 7.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.2.1. Sending Version Negotiation Packets . . . . . . . . . 22 | 7.2.1. Sending Version Negotiation Packets . . . . . . . . . 22 | |||
| 7.2.2. Handling Version Negotiation Packets . . . . . . . . 23 | 7.2.2. Handling Version Negotiation Packets . . . . . . . . 23 | |||
| 7.2.3. Using Reserved Versions . . . . . . . . . . . . . . . 23 | 7.2.3. Using Reserved Versions . . . . . . . . . . . . . . . 23 | |||
| 7.3. Cryptographic and Transport Handshake . . . . . . . . . . 24 | 7.3. Cryptographic and Transport Handshake . . . . . . . . . . 24 | |||
| 7.4. Transport Parameters . . . . . . . . . . . . . . . . . . 25 | 7.4. Transport Parameters . . . . . . . . . . . . . . . . . . 25 | |||
| 7.4.1. Transport Parameter Definitions . . . . . . . . . . . 27 | 7.4.1. Transport Parameter Definitions . . . . . . . . . . . 27 | |||
| 7.4.2. Values of Transport Parameters for 0-RTT . . . . . . 28 | 7.4.2. Values of Transport Parameters for 0-RTT . . . . . . 29 | |||
| 7.4.3. New Transport Parameters . . . . . . . . . . . . . . 28 | 7.4.3. New Transport Parameters . . . . . . . . . . . . . . 29 | |||
| 7.4.4. Version Negotiation Validation . . . . . . . . . . . 29 | 7.4.4. Version Negotiation Validation . . . . . . . . . . . 29 | |||
| 7.5. Stateless Retries . . . . . . . . . . . . . . . . . . . . 30 | 7.5. Stateless Retries . . . . . . . . . . . . . . . . . . . . 31 | |||
| 7.6. Proof of Source Address Ownership . . . . . . . . . . . . 31 | 7.6. Proof of Source Address Ownership . . . . . . . . . . . . 31 | |||
| 7.6.1. Client Address Validation Procedure . . . . . . . . . 31 | 7.6.1. Client Address Validation Procedure . . . . . . . . . 32 | |||
| 7.6.2. Address Validation on Session Resumption . . . . . . 32 | 7.6.2. Address Validation on Session Resumption . . . . . . 33 | |||
| 7.6.3. Address Validation Token Integrity . . . . . . . . . 33 | 7.6.3. Address Validation Token Integrity . . . . . . . . . 34 | |||
| 7.7. Connection Migration . . . . . . . . . . . . . . . . . . 33 | 7.7. Connection Migration . . . . . . . . . . . . . . . . . . 34 | |||
| 7.7.1. Privacy Implications of Connection Migration . . . . 33 | 7.7.1. Privacy Implications of Connection Migration . . . . 35 | |||
| 7.7.2. Address Validation for Migrated Connections . . . . . 35 | 7.7.2. Address Validation for Migrated Connections . . . . . 36 | |||
| 7.8. Connection Termination . . . . . . . . . . . . . . . . . 35 | 7.8. Spurious Connection Migrations . . . . . . . . . . . . . 37 | |||
| 7.8.1. Draining Period . . . . . . . . . . . . . . . . . . . 35 | 7.9. Connection Termination . . . . . . . . . . . . . . . . . 38 | |||
| 7.8.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 35 | 7.9.1. Closing and Draining Connection States . . . . . . . 38 | |||
| 7.8.3. Immediate Close . . . . . . . . . . . . . . . . . . . 36 | 7.9.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 40 | |||
| 7.8.4. Stateless Reset . . . . . . . . . . . . . . . . . . . 36 | 7.9.3. Immediate Close . . . . . . . . . . . . . . . . . . . 40 | |||
| 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 39 | 7.9.4. Stateless Reset . . . . . . . . . . . . . . . . . . . 41 | |||
| 8.1. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 39 | 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 43 | |||
| 8.2. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 39 | 8.1. Variable-Length Integer Encoding . . . . . . . . . . . . 44 | |||
| 8.3. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 40 | 8.2. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 8.4. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 41 | 8.3. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 45 | |||
| 8.5. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 41 | 8.4. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 45 | |||
| 8.6. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 42 | 8.5. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 46 | |||
| 8.7. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 43 | 8.6. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 8.8. PING frame . . . . . . . . . . . . . . . . . . . . . . . 43 | 8.7. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 47 | |||
| 8.9. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 44 | 8.8. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 48 | |||
| 8.10. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 44 | 8.9. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 49 | |||
| 8.11. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 44 | 8.10. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 50 | |||
| 8.12. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 45 | 8.11. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 50 | |||
| 8.13. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 45 | 8.12. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 51 | |||
| 8.14. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 46 | 8.13. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 51 | |||
| 8.14.1. ACK Block Section . . . . . . . . . . . . . . . . . 48 | 8.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 52 | |||
| 8.14.2. ACK Frames and Packet Protection . . . . . . . . . . 50 | 8.15. PONG Frame . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 8.15. STREAM Frame . . . . . . . . . . . . . . . . . . . . . . 51 | 8.16. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
| 9. Packetization and Reliability . . . . . . . . . . . . . . . . 52 | 8.16.1. ACK Block Section . . . . . . . . . . . . . . . . . 54 | |||
| 9.1. Special Considerations for PMTU Discovery . . . . . . . . 55 | 8.16.2. Sending ACK Frames . . . . . . . . . . . . . . . . . 56 | |||
| 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 55 | 8.16.3. ACK Frames and Packet Protection . . . . . . . . . . 57 | |||
| 10.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 56 | 8.17. STREAM Frames . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 10.2. Life of a Stream . . . . . . . . . . . . . . . . . . . . 56 | 9. Packetization and Reliability . . . . . . . . . . . . . . . . 59 | |||
| 10.2.1. idle . . . . . . . . . . . . . . . . . . . . . . . . 58 | 9.1. Special Considerations for PMTU Discovery . . . . . . . . 62 | |||
| 10.2.2. open . . . . . . . . . . . . . . . . . . . . . . . . 58 | 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 62 | |||
| 10.2.3. half-closed (local) . . . . . . . . . . . . . . . . 59 | 10.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 63 | |||
| 10.2.4. half-closed (remote) . . . . . . . . . . . . . . . . 59 | 10.2. Stream States . . . . . . . . . . . . . . . . . . . . . 64 | |||
| 10.2.5. closed . . . . . . . . . . . . . . . . . . . . . . . 60 | 10.2.1. Send Stream States . . . . . . . . . . . . . . . . . 65 | |||
| 10.3. Solicited State Transitions . . . . . . . . . . . . . . 60 | 10.2.2. Receive Stream States . . . . . . . . . . . . . . . 67 | |||
| 10.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 61 | 10.2.3. Permitted Frame Types . . . . . . . . . . . . . . . 70 | |||
| 10.5. Sending and Receiving Data . . . . . . . . . . . . . . . 62 | 10.2.4. Bidirectional Stream States . . . . . . . . . . . . 70 | |||
| 10.6. Stream Prioritization . . . . . . . . . . . . . . . . . 62 | 10.3. Solicited State Transitions . . . . . . . . . . . . . . 71 | |||
| 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 63 | 10.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 72 | |||
| 11.1. Edge Cases and Other Considerations . . . . . . . . . . 64 | 10.5. Sending and Receiving Data . . . . . . . . . . . . . . . 73 | |||
| 11.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 65 | 10.6. Stream Prioritization . . . . . . . . . . . . . . . . . 73 | |||
| 11.1.2. Data Limit Increments . . . . . . . . . . . . . . . 65 | 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 74 | |||
| 11.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 66 | 11.1. Edge Cases and Other Considerations . . . . . . . . . . 75 | |||
| 11.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 66 | 11.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 76 | |||
| 11.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 66 | 11.1.2. Data Limit Increments . . . . . . . . . . . . . . . 76 | |||
| 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 67 | 11.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 77 | |||
| 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 67 | 11.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 77 | |||
| 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 68 | 11.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 77 | |||
| 12.3. Transport Error Codes . . . . . . . . . . . . . . . . . 68 | 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 78 | |||
| 12.4. Application Protocol Error Codes . . . . . . . . . . . . 70 | 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 78 | |||
| 13. Security and Privacy Considerations . . . . . . . . . . . . . 70 | 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 79 | |||
| 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 70 | 12.3. Transport Error Codes . . . . . . . . . . . . . . . . . 79 | |||
| 13.2. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 70 | 12.4. Application Protocol Error Codes . . . . . . . . . . . . 81 | |||
| 13.3. Stream Fragmentation and Reassembly Attacks . . . . . . 71 | 13. Security and Privacy Considerations . . . . . . . . . . . . . 81 | |||
| 13.4. Stream Commitment Attack . . . . . . . . . . . . . . . . 71 | 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 81 | |||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 72 | 13.2. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 82 | |||
| 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 72 | 13.3. Stream Fragmentation and Reassembly Attacks . . . . . . 82 | |||
| 14.2. QUIC Transport Error Codes Registry . . . . . . . . . . 73 | 13.4. Stream Commitment Attack . . . . . . . . . . . . . . . . 82 | |||
| 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 83 | |||
| 15.1. Normative References . . . . . . . . . . . . . . . . . . 75 | 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 83 | |||
| 15.2. Informative References . . . . . . . . . . . . . . . . . 76 | 14.2. QUIC Transport Error Codes Registry . . . . . . . . . . 84 | |||
| 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 77 | 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 87 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 77 | 15.1. Normative References . . . . . . . . . . . . . . . . . . 87 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 77 | 15.2. Informative References . . . . . . . . . . . . . . . . . 88 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 78 | 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 89 | |||
| C.1. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 78 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 89 | |||
| C.2. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 78 | Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 89 | |||
| C.3. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 78 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 90 | |||
| C.4. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 79 | C.1. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 90 | |||
| C.5. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 79 | C.2. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 90 | |||
| C.6. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 80 | C.3. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 90 | |||
| C.7. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 82 | C.4. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 91 | |||
| C.8. Since draft-hamilton-quic-transport-protocol-01 . . . . . 82 | C.5. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 91 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 82 | C.6. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 91 | |||
| C.7. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 92 | ||||
| C.8. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 94 | ||||
| C.9. Since draft-hamilton-quic-transport-protocol-01 . . . . . 95 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 95 | ||||
| 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. QUIC uses UDP as substrate so as to not | other transport protocols. QUIC uses UDP as substrate so as to not | |||
| require changes to legacy client operating systems and middleboxes to | require changes to legacy client operating systems and middleboxes to | |||
| skipping to change at page 5, line 22 ¶ | skipping to change at page 5, line 28 ¶ | |||
| including the conceptual design, wire format, and mechanisms of the | including the conceptual design, wire format, and mechanisms of the | |||
| QUIC protocol for connection establishment, stream multiplexing, | QUIC protocol for connection establishment, stream multiplexing, | |||
| stream and connection-level flow control, and data reliability. | stream and connection-level flow control, and data reliability. | |||
| Accompanying documents describe QUIC's loss detection and congestion | Accompanying documents describe QUIC's loss detection and congestion | |||
| control [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | control [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | |||
| [QUIC-TLS]. | [QUIC-TLS]. | |||
| 2. Conventions and Definitions | 2. Conventions and Definitions | |||
| The words "MUST", "MUST NOT", "SHOULD", and "MAY" are used in this | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| document. It's not shouting; when they are capitalized, they have | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| the special meaning defined in [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| Definitions of terms that are used in this document: | Definitions of terms that are used in this document: | |||
| Client: The endpoint initiating a QUIC connection. | Client: The endpoint initiating a QUIC connection. | |||
| Server: The endpoint accepting incoming QUIC connections. | Server: The endpoint accepting incoming QUIC connections. | |||
| Endpoint: The client or server end of a connection. | Endpoint: The client or server end of a connection. | |||
| Stream: A logical, bi-directional channel of ordered bytes within a | Stream: A logical, bi-directional channel of ordered bytes within a | |||
| skipping to change at page 6, line 4 ¶ | skipping to change at page 6, line 15 ¶ | |||
| QUIC packet: A well-formed UDP payload that can be parsed by a QUIC | QUIC packet: A well-formed UDP payload that can be parsed by a QUIC | |||
| receiver. QUIC packet size in this document refers to the UDP | receiver. QUIC packet size in this document refers to the UDP | |||
| payload size. | payload size. | |||
| 2.1. Notational Conventions | 2.1. Notational Conventions | |||
| Packet and frame diagrams use the format described in Section 3.1 of | Packet and frame diagrams use the format described in Section 3.1 of | |||
| [RFC2360], with the following additional conventions: | [RFC2360], with the following additional conventions: | |||
| [x] Indicates that x is optional | [x] Indicates that x is optional | |||
| {x} Indicates that x is encrypted | {x} Indicates that x is encrypted | |||
| x (A) Indicates that x is A bits long | x (A) Indicates that x is A bits long | |||
| x (A/B/C) ... Indicates that x is one of A, B, or C bits long | x (A/B/C) ... Indicates that x is one of A, B, or C bits long | |||
| x (i) ... Indicates that x uses the variable-length encoding in | ||||
| Section 8.1 | ||||
| x (*) ... Indicates that x is variable-length | x (*) ... Indicates that x is variable-length | |||
| 3. A QUIC Overview | 3. A QUIC Overview | |||
| This section briefly describes QUIC's key mechanisms and benefits. | This section briefly describes QUIC's key mechanisms and benefits. | |||
| Key strengths of QUIC include: | Key strengths of QUIC include: | |||
| o Low-latency connection establishment | o Low-latency connection establishment | |||
| o Multiplexing without head-of-line blocking | o Multiplexing without head-of-line blocking | |||
| skipping to change at page 7, line 21 ¶ | skipping to change at page 7, line 35 ¶ | |||
| QUIC's packet framing and acknowledgments carry rich information that | QUIC's packet framing and acknowledgments carry rich information that | |||
| help both congestion control and loss recovery in fundamental ways. | help both congestion control and loss recovery in fundamental ways. | |||
| Each QUIC packet carries a new packet number, including those | Each QUIC packet carries a new packet number, including those | |||
| carrying retransmitted data. This obviates the need for a separate | carrying retransmitted data. This obviates the need for a separate | |||
| mechanism to distinguish acknowledgments for retransmissions from | mechanism to distinguish acknowledgments for retransmissions from | |||
| those for original transmissions, avoiding TCP's retransmission | those for original transmissions, avoiding TCP's retransmission | |||
| 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 multiple 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. At a high | QUIC implements stream- and connection-level flow control. At a high | |||
| level, a QUIC receiver advertises the maximum amount of data that it | level, a QUIC receiver advertises the maximum amount of data that it | |||
| is willing to receive on each stream. As data is sent, received, and | is willing to receive on each stream. As data is sent, received, and | |||
| delivered on a particular stream, the receiver sends MAX_STREAM_DATA | delivered on a particular stream, the receiver sends MAX_STREAM_DATA | |||
| frames that increase the advertised limit for that stream, allowing | frames that increase the advertised limit for that stream, allowing | |||
| skipping to change at page 8, line 20 ¶ | skipping to change at page 8, line 34 ¶ | |||
| not encrypted, but information sent in these unencrypted handshake | not encrypted, but information sent in these unencrypted handshake | |||
| packets is later verified as part of cryptographic processing. | packets is later verified as part of cryptographic processing. | |||
| 3.6. Connection Migration and Resilience to NAT Rebinding | 3.6. Connection Migration and Resilience to NAT Rebinding | |||
| QUIC connections are identified by a Connection ID, a 64-bit unsigned | QUIC connections are identified by a Connection ID, a 64-bit unsigned | |||
| number randomly generated by the server. QUIC's consistent | number randomly generated by the server. QUIC's consistent | |||
| connection ID allows connections to survive changes to the client's | connection ID allows connections to survive changes to the client's | |||
| IP and port, such as those caused by NAT rebindings or by the client | IP and port, such as those caused by NAT rebindings or by the client | |||
| changing network connectivity to a new address. QUIC provides | changing network connectivity to a new address. QUIC provides | |||
| automatic cryptographic verification of a rebound lient, since the | automatic cryptographic verification of a rebound client, since the | |||
| client continues to use the same session key for encrypting and | client continues to use the same session key for encrypting and | |||
| decrypting packets. The consistent connection ID can be used to | decrypting packets. The consistent connection ID can be used to | |||
| allow migration of the connection to a new server IP address as well, | allow migration of the connection to a new server IP address as well, | |||
| since the Connection ID remains consistent across changes in the | since the Connection ID remains consistent across changes in the | |||
| client's and the server's network addresses. | client's and the server's network addresses. | |||
| 3.7. Version Negotiation | 3.7. Version Negotiation | |||
| QUIC version negotiation allows for multiple versions of the protocol | QUIC version negotiation allows for multiple versions of the protocol | |||
| to be deployed and used concurrently. Version negotiation is | to be deployed and used concurrently. Version negotiation is | |||
| described in Section 7.2. | described in Section 7.2. | |||
| 4. Versions | 4. Versions | |||
| QUIC versions are identified using a 32-bit unsigned number. | QUIC versions are identified using a 32-bit unsigned number. | |||
| The version 0x00000000 is reserved to represent an invalid version. | The version 0x00000000 is reserved to represent version negotiation. | |||
| This version of the specification is identified by the number | This version of the specification is identified by the number | |||
| 0x00000001. | 0x00000001. | |||
| Version 0x00000001 of QUIC uses TLS as a cryptographic handshake | Version 0x00000001 of QUIC uses TLS as a cryptographic handshake | |||
| protocol, as described in [QUIC-TLS]. | 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 | |||
| skipping to change at page 10, line 4 ¶ | skipping to change at page 10, line 9 ¶ | |||
| bits of fields, the least significant bit is referred to as bit 0. | bits of fields, the least significant bit is referred to as bit 0. | |||
| Hexadecimal notation is used for describing the value of fields. | Hexadecimal notation is used for describing the value of fields. | |||
| Any QUIC packet has either a long or a short header, as indicated by | Any QUIC packet has either a long or a short header, as indicated by | |||
| the Header Form bit. Long headers are expected to be used early in | the Header Form bit. Long headers are expected to be used early in | |||
| the connection before version negotiation and establishment of 1-RTT | the connection before version negotiation and establishment of 1-RTT | |||
| keys. Short headers are minimal version-specific headers, which are | keys. Short headers are minimal version-specific headers, which are | |||
| used after version negotiation and 1-RTT keys are established. | used after version negotiation and 1-RTT keys are established. | |||
| 5.1. Long Header | 5.1. Long Header | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1| Type (7) | | |1| Type (7) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Connection ID (64) + | + Connection ID (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: Long Header Format | Figure 1: Long Header Format | |||
| Long headers are used for packets that are sent prior to the | Long headers are used for packets that are sent prior to the | |||
| completion of version negotiation and establishment of 1-RTT keys. | completion of version negotiation and establishment of 1-RTT keys. | |||
| Once both conditions are met, a sender switches to sending packets | Once both conditions are met, a sender switches to sending packets | |||
| using the short header (Section 5.2). The long form allows for | using the short header (Section 5.2). The long form allows for | |||
| special packets - such as the Version Negotiation packet - to be | special packets - such as the Version Negotiation packet - to be | |||
| skipping to change at page 10, line 40 ¶ | skipping to change at page 10, line 46 ¶ | |||
| Header Form: The most significant bit (0x80) of octet 0 (the first | Header Form: The most significant bit (0x80) of octet 0 (the first | |||
| octet) is set to 1 for long headers. | octet) is set to 1 for long headers. | |||
| Long Packet Type: The remaining seven bits of octet 0 contain the | Long Packet Type: The remaining seven bits of octet 0 contain the | |||
| packet type. This field can indicate one of 128 packet types. | packet type. This field can indicate one of 128 packet types. | |||
| The types specified for this version are listed in Table 1. | The types specified for this version are listed in Table 1. | |||
| Connection ID: Octets 1 through 8 contain the connection ID. | Connection ID: Octets 1 through 8 contain the connection ID. | |||
| Section 5.6 describes the use of this field in more detail. | Section 5.6 describes the use of this field in more detail. | |||
| Packet Number: Octets 9 to 12 contain the packet number. | Version: Octets 9 to 12 contain the selected protocol version. This | |||
| Section 5.7 describes the use of packet numbers. | field indicates which version of QUIC is in use and determines how | |||
| the rest of the protocol fields are interpreted. | ||||
| Version: Octets 13 to 16 contain the selected protocol version. | Packet Number: Octets 13 to 16 contain the packet number. | |||
| This field indicates which version of QUIC is in use and | Section 5.7 describes the use of packet numbers. | |||
| 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 | | |||
| +------+------------------------+---------------+ | +------+-----------------+---------------+ | |||
| | 0x01 | Version Negotiation | Section 5.3 | | | 0x7F | Initial | Section 5.4.1 | | |||
| | | | | | | | | | | |||
| | 0x02 | Client Initial | Section 5.4.1 | | | 0x7E | Retry | Section 5.4.2 | | |||
| | | | | | | | | | | |||
| | 0x03 | Server Stateless Retry | Section 5.4.2 | | | 0x7D | Handshake | Section 5.4.3 | | |||
| | | | | | | | | | | |||
| | 0x04 | Server Cleartext | Section 5.4.3 | | | 0x7C | 0-RTT Protected | Section 5.5 | | |||
| | | | | | +------+-----------------+---------------+ | |||
| | 0x05 | Client Cleartext | Section 5.4.4 | | ||||
| | | | | | ||||
| | 0x06 | 0-RTT Protected | Section 5.5 | | ||||
| +------+------------------------+---------------+ | ||||
| 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.8 for details on how packets from different versions of | Section 5.8 for details on how packets from different versions of | |||
| QUIC are interpreted. | QUIC are interpreted. | |||
| The interpretation of the fields and the payload are specific to a | The interpretation of the fields and the payload are specific to a | |||
| skipping to change at page 12, line 8 ¶ | skipping to change at page 12, line 11 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| 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 octet 0 is set to 0 | Header Form: The most significant bit (0x80) of octet 0 is set to 0 | |||
| for the short header. | for the short header. | |||
| Connection ID Flag: The second bit (0x40) of octet 0 indicates | Omit Connection ID Flag: The second bit (0x40) of octet 0 indicates | |||
| whether the Connection ID field is present. If set to 1, then the | whether the Connection ID field is omitted. If set to 0, then the | |||
| Connection ID field is present; if set to 0, the Connection ID | Connection ID field is present; if set to 1, the Connection ID | |||
| field is omitted. The Connection ID field can only be omitted if | field is omitted. The Connection ID field can only be omitted if | |||
| the omit_connection_id transport parameter (Section 7.4.1) is | the omit_connection_id transport parameter (Section 7.4.1) is | |||
| specified by the intended recipient of the packet. | specified by the intended recipient of the packet. | |||
| Key Phase Bit: The third bit (0x20) of octet 0 indicates the key | Key Phase Bit: The third bit (0x20) of octet 0 indicates the key | |||
| phase, which allows a recipient of a packet to identify the packet | phase, which allows a recipient of a packet to identify the packet | |||
| protection keys that are used to protect the packet. See | protection keys that are used to protect the packet. See | |||
| [QUIC-TLS] for details. | [QUIC-TLS] for details. | |||
| Short Packet Type: The remaining 5 bits of octet 0 include one of 32 | Short Packet Type: The remaining 5 bits of octet 0 include one of 32 | |||
| packet types. Table 2 lists the types that are defined for short | packet types. Table 2 lists the types that are defined for short | |||
| packets. | packets. | |||
| Connection ID: If the Connection ID Flag is set, a connection ID | Connection ID: If the Omit Connection ID Flag is not set, a | |||
| occupies octets 1 through 8 of the packet. See Section 5.6 for | connection ID occupies octets 1 through 8 of the packet. See | |||
| more details. | Section 5.6 for 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. | |||
| Protected 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 | | |||
| +------+--------------------+ | +------+--------------------+ | |||
| | 0x01 | 1 octet | | | 0x1F | 1 octet | | |||
| | | | | | | | | |||
| | 0x02 | 2 octets | | | 0x1E | 2 octets | | |||
| | | | | | | | | |||
| | 0x03 | 4 octets | | | 0x1D | 4 octets | | |||
| +------+--------------------+ | +------+--------------------+ | |||
| 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, omit connection ID flag, and connection ID of a | |||
| header packet are version-independent. The remaining fields are | short header packet are version-independent. The remaining fields | |||
| specific to the selected QUIC version. See Section 5.8 for details | are specific to the selected QUIC version. See Section 5.8 for | |||
| on how packets from different versions of QUIC are interpreted. | details on how packets from different versions of QUIC are | |||
| interpreted. | ||||
| 5.3. Version Negotiation Packet | 5.3. Version Negotiation Packet | |||
| A Version Negotiation packet has long headers with a type value of | A Version Negotiation packet is inherently not version-specific, and | |||
| 0x01 and is sent only by servers. The Version Negotiation packet is | does not use the packet headers defined above. Upon receipt by a | |||
| a response to a client packet that contains a version that is not | client, it will appear to be a packet using the long header, but will | |||
| supported by the server. | be identified as a Version Negotiation packet based on the Version | |||
| field. | ||||
| The packet number, connection ID 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. | ||||
| A Version Negotiation packet is never explicitly acknowledged in an | The Version Negotiation packet is a response to a client packet that | |||
| ACK frame by a client. Receiving another Client Initial packet | contains a version that is not supported by the server, and is only | |||
| implicitly acknowledges a Version Negotiation packet. | sent by servers. | |||
| The payload of the Version Negotiation packet is a list of 32-bit | The layout of a Version Negotiation packet is: | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+ | ||||
| |1| Unused (7) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | | | ||||
| + Connection ID (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version (32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Supported Version 1 (32) ... | | Supported Version 1 (32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Supported Version 2 (32)] ... | | [Supported Version 2 (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Supported Version N (32)] ... | | [Supported Version N (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Version Negotiation Packet | Figure 3: Version Negotiation Packet | |||
| The value in the Unused field is selected randomly by the server. | ||||
| The Connection ID field echoes the corresponding value from the | ||||
| triggering client packet. This allows clients some assurance that | ||||
| the server received the packet and that the Version Negotiation | ||||
| packet is in fact from the server. The Version field MUST be set to | ||||
| 0x00000000. The remainder of the Version Negotiation packet is a | ||||
| list of 32-bit versions which the server supports. | ||||
| A Version Negotiation packet cannot be explicitly acknowledged in an | ||||
| ACK frame by a client. Receiving another Initial packet implicitly | ||||
| acknowledges a Version Negotiation packet. | ||||
| See Section 7.2 for a description of the version negotiation process. | See Section 7.2 for a description of the version negotiation process. | |||
| 5.4. Cleartext Packets | 5.4. Cryptographic Handshake Packets | |||
| Cleartext packets are sent during the handshake prior to key | Once version negotiation is complete, the cryptographic handshake is | |||
| negotiation. | used to agree on cryptographic keys. The cryptographic handshake is | |||
| carried in Initial (Section 5.4.1), Retry (Section 5.4.2) and | ||||
| Handshake (Section 5.4.3) packets. | ||||
| All cleartext packets contain the current QUIC version in the version | All these packets use the long header and contain the current QUIC | |||
| field. | version in the version field. | |||
| In order to prevent tampering by version-unaware middleboxes, | In order to prevent tampering by version-unaware middleboxes, | |||
| Cleartext packets are protected with a connection and version | handshake packets are protected with a connection- and version- | |||
| specific key, as described in [QUIC-TLS]. This protection does not | specific key, as described in [QUIC-TLS]. This protection does not | |||
| provide confidentiality or integrity against on-path attackers, but | provide confidentiality or integrity against on-path attackers, but | |||
| provides some level of protection against off-path attackers. | provides some level of protection against off-path attackers. | |||
| 5.4.1. Client Initial Packet | 5.4.1. Initial Packet | |||
| The Client Initial packet uses long headers with a type value of | The Initial packet uses long headers with a type value of 0x7E. It | |||
| 0x02. It carries the first cryptographic handshake message sent by | carries the first cryptographic handshake message sent by the client. | |||
| the client. | ||||
| The client populates the connection ID field with randomly selected | The client populates the connection ID field with randomly selected | |||
| values, unless it has received a packet from the server. If the | values, unless it has received a packet from the server. If the | |||
| client has received a packet from the server, the connection ID field | client has received a packet from the server, the connection ID field | |||
| uses the value provided by the server. | uses the value provided by the server. | |||
| The first Client Initial packet that is sent by a client contains a | The first Initial packet that is sent by a client contains a | |||
| random 31-bit value. All subsequent packets contain a packet number | randomized packet number. All subsequent packets contain a packet | |||
| that is incremented by one, see (Section 5.7). | number that is incremented by one, see (Section 5.7). | |||
| The payload of a Client Initial packet consists of a STREAM frame (or | The payload of a Initial packet consists of a STREAM frame (or | |||
| frames) for stream 0 containing a cryptographic handshake message, | frames) for stream 0 containing a cryptographic handshake message, | |||
| with enough PADDING frames that the packet is at least 1200 octets | with enough PADDING frames that the packet is at least 1200 octets | |||
| (see Section 9). The stream in this packet always starts at an | (see Section 9). The stream in this packet always starts at an | |||
| offset of 0 (see Section 7.5) and the complete cryptographic | offset of 0 (see Section 7.5) and the complete cryptographic | |||
| handshake message MUST fit in a single packet (see Section 7.3). | handshake message MUST fit in a single packet (see Section 7.3). | |||
| The client uses the Client Initial Packet type for any packet that | The client uses the Initial packet type for any packet that contains | |||
| contains an initial cryptographic handshake message. This includes | an initial cryptographic handshake message. This includes all cases | |||
| all cases where a new packet containing the initial cryptographic | where a new packet containing the initial cryptographic message needs | |||
| message needs to be created, this includes the packets sent after | to be created, this includes the packets sent after receiving a | |||
| receiving a Version Negotiation (Section 5.3) or Server Stateless | Version Negotiation (Section 5.3) or Retry packet (Section 5.4.2). | |||
| Retry packet (Section 5.4.2). | ||||
| 5.4.2. Server Stateless Retry Packet | 5.4.2. Retry Packet | |||
| A Server Stateless Retry packet uses long headers with a type value | A Retry packet uses long headers with a type value of 0x7D. It | |||
| of 0x03. It carries cryptographic handshake messages and | carries cryptographic handshake messages and acknowledgments. It is | |||
| acknowledgments. It is used by a server that wishes to perform a | used by a server that wishes to perform a stateless retry (see | |||
| stateless retry (see Section 7.5). | Section 7.5). | |||
| The packet number and connection ID fields echo the corresponding | The packet number and connection ID fields echo the corresponding | |||
| fields from the triggering client packet. This allows a client to | fields from the triggering client packet. This allows a client to | |||
| verify that the server received its packet. | verify that the server received its packet. | |||
| A Server Stateless Retry packet is never explicitly acknowledged in | A Retry packet is never explicitly acknowledged in an ACK frame by a | |||
| an ACK frame by a client. Receiving another Client Initial packet | client. Receiving another Initial packet implicitly acknowledges a | |||
| implicitly acknowledges a Server Stateless Retry packet. | Retry packet. | |||
| After receiving a Server Stateless Retry packet, the client uses a | After receiving a Retry packet, the client uses a new Initial packet | |||
| new Client Initial packet containing the next cryptographic handshake | containing the next cryptographic handshake message. The client | |||
| message. The client retains the state of its cryptographic | retains the state of its cryptographic handshake, but discards all | |||
| handshake, but discards all transport state. The Client Initial | transport state. The Initial packet that is generated in response to | |||
| packet that is generated in response to a Server Stateless Retry | a Retry packet includes STREAM frames on stream 0 that start again at | |||
| packet includes STREAM frames on stream 0 that start again at an | an offset of 0. | |||
| offset of 0. | ||||
| Continuing the cryptographic handshake is necessary to ensure that an | Continuing the cryptographic handshake is necessary to ensure that an | |||
| attacker cannot force a downgrade of any cryptographic parameters. | attacker cannot force a downgrade of any cryptographic parameters. | |||
| In addition to continuing the cryptographic handshake, the client | In addition to continuing the cryptographic handshake, the client | |||
| MUST remember the results of any version negotiation that occurred | MUST remember the results of any version negotiation that occurred | |||
| (see Section 7.2). The client MAY also retain any observed RTT or | (see Section 7.2). The client MAY also retain any observed RTT or | |||
| congestion state that it has accumulated for the flow, but other | congestion state that it has accumulated for the flow, but other | |||
| transport state MUST be discarded. | transport state MUST be discarded. | |||
| The payload of the Server Stateless Retry packet contains a single | The payload of the Retry packet contains a single STREAM frame on | |||
| STREAM frame on stream 0 with offset 0 containing the server's | stream 0 with offset 0 containing the server's cryptographic | |||
| cryptographic stateless retry material. It MUST NOT contain any | stateless retry material. It MUST NOT contain any other frames. The | |||
| other frames. The next STREAM frame sent by the server will also | next STREAM frame sent by the server will also start at stream offset | |||
| start at stream offset 0. | 0. | |||
| 5.4.3. Server Cleartext Packet | ||||
| A Server Cleartext packet uses long headers with a type value of | ||||
| 0x04. It is used to carry acknowledgments and cryptographic | ||||
| handshake messages from the server. | ||||
| The connection ID field in a Server Cleartext packet contains a | ||||
| connection ID that is chosen by the server (see Section 5.6). | ||||
| 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.7. | ||||
| The payload of this packet contains STREAM frames and could contain | ||||
| PADDING and ACK frames. | ||||
| 5.4.4. Client Cleartext Packet | 5.4.3. Handshake Packet | |||
| A Client Cleartext packet uses long headers with a type value of | A Handshake packet uses long headers with a type value of 0x7C. It | |||
| 0x05, and is sent when the client has received a Server Cleartext | is used to carry acknowledgments and cryptographic handshake messages | |||
| packet from the server. | from the server and client. | |||
| The connection ID field in a Client Cleartext packet contains a | The connection ID field in a Handshake packet contains a connection | |||
| server-selected connection ID, see Section 5.6. | ID that is chosen by the server (see Section 5.6). | |||
| The Client Cleartext packet includes a packet number that is one | The first Handshake packet sent by a server contains a randomized | |||
| higher than the last Client Initial, 0-RTT Protected or Client | packet number. This value is increased for each subsequent packet | |||
| Cleartext packet that was sent. The packet number is incremented for | sent by the server as described in Section 5.7. The client | |||
| each subsequent packet, see Section 5.7. | increments the packet number from its previous packet by one for each | |||
| Handshake packet that it sends (which might be an Initial, 0-RTT | ||||
| Protected, or Handshake packet). | ||||
| The payload of this packet contains STREAM frames and could contain | The payload of this packet contains STREAM frames and could contain | |||
| PADDING and ACK frames. | PADDING and ACK frames. | |||
| 5.5. Protected Packets | 5.5. Protected Packets | |||
| Packets that are protected with 0-RTT keys are sent with long | Packets that are protected with 0-RTT keys are sent with long | |||
| headers; all packets protected with 1-RTT keys are sent with short | headers; all packets protected with 1-RTT keys are sent with short | |||
| headers. The different packet types explicitly indicate the | headers. The different packet types explicitly indicate the | |||
| encryption level and therefore the keys that are used to remove | encryption level and therefore the keys that are used to remove | |||
| packet protection. | packet protection. | |||
| Packets protected with 0-RTT keys use a type value of 0x06. The | Packets protected with 0-RTT keys use a type value of 0x7B. The | |||
| connection ID field for a 0-RTT packet is selected by the client. | connection ID field for a 0-RTT packet is selected by the client. | |||
| The client can send 0-RTT packets after receiving a Server Cleartext | The client can send 0-RTT packets after receiving a Handshake packet | |||
| packet (Section 5.4.3), if that packet does not complete the | (Section 5.4.3), if that packet does not complete the handshake. | |||
| handshake. Even if the client receives a different connection ID in | Even if the client receives a different connection ID in the | |||
| the Server Cleartext packet, it MUST continue to use the connection | Handshake packet, it MUST continue to use the connection ID selected | |||
| ID selected by the client for 0-RTT packets, see Section 5.6. | by the client for 0-RTT packets, see Section 5.6. | |||
| The version field for protected packets is the current QUIC version. | The version field for protected packets is the current QUIC version. | |||
| The packet number field contains a packet number, which increases | The packet number field contains a packet number, which increases | |||
| with each packet sent, see Section 5.7 for details. | with each packet sent, see Section 5.7 for details. | |||
| The payload is protected using authenticated encryption. [QUIC-TLS] | The payload is protected using authenticated encryption. [QUIC-TLS] | |||
| describes packet protection in detail. After decryption, the | describes packet protection in detail. After decryption, the | |||
| plaintext consists of a sequence of frames, as described in | plaintext consists of a sequence of frames, as described in | |||
| Section 6. | Section 6. | |||
| 5.6. Connection ID | 5.6. 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 Omit 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. | |||
| The client MUST choose a random connection ID and use it in Client | The client MUST choose a random connection ID and use it in Initial | |||
| Initial packets (Section 5.4.1) and 0-RTT packets (Section 5.5). | packets (Section 5.4.1) and 0-RTT packets (Section 5.5). | |||
| When the server receives a Client Initial packet and decides to | When the server receives a Initial packet and decides to proceed with | |||
| proceed with the handshake, it chooses a new value for the connection | the handshake, it chooses a new value for the connection ID and sends | |||
| ID and sends that in a Server Cleartext packet (Section 5.4.3). The | that in a Handshake packet (Section 5.4.3). The server MAY choose to | |||
| server MAY choose to use the value that the client initially selects. | use the value that the client initially selects. | |||
| Once the client receives the connection ID that the server has | Once the client receives the connection ID that the server has | |||
| chosen, it MUST use it for all subsequent Client Cleartext | chosen, it MUST use it for all subsequent Handshake (Section 5.4.3) | |||
| (Section 5.4.4) and 1-RTT (Section 5.5) packets but not for 0-RTT | and 1-RTT (Section 5.5) packets but not for 0-RTT packets | |||
| packets (Section 5.5). | (Section 5.5). | |||
| Server's Version Negotiation (Section 5.3) and Stateless Retry | Server's Version Negotiation (Section 5.3) and Retry (Section 5.4.2) | |||
| (Section 5.4.2) packets MUST use connection ID selected by the | packets MUST use connection ID selected by the client. | |||
| client. | ||||
| 5.7. Packet Numbers | 5.7. Packet Numbers | |||
| The packet number is a 64-bit unsigned number and is used as part of | The packet number is an integer in the range 0 to 2^62-1. The value | |||
| a cryptographic nonce for packet encryption. Each endpoint maintains | is used in determining the cryptographic nonce for packet encryption. | |||
| a separate packet number for sending and receiving. The packet | Each endpoint maintains a separate packet number for sending and | |||
| number for sending MUST increase by at least one after sending any | receiving. The packet number for sending MUST increase by at least | |||
| packet, unless otherwise specified (see Section 5.7.1). | one after sending any packet, unless otherwise specified (see | |||
| Section 5.7.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^62 - 1, the sender MUST close the | |||
| connection without sending a CONNECTION_CLOSE frame or any further | connection without sending a CONNECTION_CLOSE frame or any further | |||
| packets; a server MAY send a Stateless Reset (Section 7.8.4) in | packets; a server MAY send a Stateless Reset (Section 7.9.4) in | |||
| response to further packets that it receives. | response to further packets that it receives. | |||
| To reduce the number of bits required to represent the packet number | For the packet header, the number of bits required to represent the | |||
| over the wire, only the least significant bits of the packet number | packet number are reduced by including only the least significant | |||
| are transmitted. The actual packet number for each packet is | bits of the packet number. The actual packet number for each packet | |||
| reconstructed at the receiver based on the largest packet number | is reconstructed at the receiver based on the largest packet number | |||
| received on a successfully authenticated packet. | received on a successfully authenticated 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 | |||
| highest received packet number plus one. For example, if the highest | highest received packet number plus one. For example, if the highest | |||
| successfully authenticated packet had a packet number of 0xaa82f30e, | successfully authenticated packet had a packet number of 0xaa82f30e, | |||
| then a packet containing a 16-bit value of 0x1f94 will be decoded as | then a packet containing a 16-bit value of 0x1f94 will be decoded as | |||
| 0xaa831f94. | 0xaa831f94. | |||
| The sender MUST use a packet number size able to represent more than | The sender MUST use a packet number size able to represent more than | |||
| skipping to change at page 18, line 20 ¶ | skipping to change at page 18, line 17 ¶ | |||
| 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) and Server Stateless Retry | Version Negotiation (Section 5.3) and Retry (Section 5.4.2) packets | |||
| (Section 5.4.2) packets have special rules for populating the packet | have special rules for populating the packet number field. | |||
| number field. | ||||
| 5.7.1. Initial Packet Number | 5.7.1. Initial Packet Number | |||
| The initial value for packet number MUST be selected from an uniform | The initial value for packet number MUST be selected randomly from a | |||
| random distribution between 0 and 2^31-1. That is, the lower 31 bits | range between 0 and 2^32 - 1025 (inclusive). This value is selected | |||
| of the packet number are randomized. [RFC4086] provides guidance on | so that Initial and Handshake packets exercise as many possible | |||
| the generation of random values. | values for the Packet Number field as possible. | |||
| The first set of packets sent by an endpoint MUST include the low | Limiting the range allows both for loss of packets and for any | |||
| 32-bits of the packet number. Once any packet has been acknowledged, | stateless exchanges. Packet numbers are incremented for subsequent | |||
| subsequent packets can use a shorter packet number encoding. | packets, but packet loss and stateless handling can both mean that | |||
| the first packet sent by an endpoint isn't necessarily the first | ||||
| packet received by its peer. The first packet received by a peer | ||||
| cannot be 2^32 or greater or the recipient will incorrectly assume a | ||||
| packet number that is 2^32 values lower and discard the packet. | ||||
| Use of a secure random number generator [RFC4086] is not necessary | ||||
| for generating the initial packet number, nor is it necessary that | ||||
| the value be uniformly distributed. | ||||
| 5.8. Handling Packets from Different Versions | 5.8. 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 Omit 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, | o the location and size of the Version field in long headers, | |||
| o the format and semantics of the Version Negotiation packet. | ||||
| o the location and size of the Packet Number field in long headers, | ||||
| and | ||||
| o the type, format and semantics of the Version Negotiation packet. | ||||
| 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 all packets, after removing packet protection, | |||
| of protected payloads consists of a sequence of frames, as shown in | consists of a sequence of frames, as shown in Figure 4. Version | |||
| Figure 4. | Negotiation and Stateless Reset do not contain frames. | |||
| 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 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 20, line 8 ¶ | skipping to change at page 20, line 8 ¶ | |||
| 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 Value | Frame Type Name | Definition | | | Type Value | Frame Type Name | Definition | | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| | 0x00 | PADDING | Section 8.1 | | | 0x00 | PADDING | Section 8.2 | | |||
| | | | | | | | | | | |||
| | 0x01 | RST_STREAM | Section 8.2 | | | 0x01 | RST_STREAM | Section 8.3 | | |||
| | | | | | | | | | | |||
| | 0x02 | CONNECTION_CLOSE | Section 8.3 | | | 0x02 | CONNECTION_CLOSE | Section 8.4 | | |||
| | | | | | | | | | | |||
| | 0x03 | APPLICATION_CLOSE | Section 8.4 | | | 0x03 | APPLICATION_CLOSE | Section 8.5 | | |||
| | | | | | | | | | | |||
| | 0x04 | MAX_DATA | Section 8.5 | | | 0x04 | MAX_DATA | Section 8.6 | | |||
| | | | | | | | | | | |||
| | 0x05 | MAX_STREAM_DATA | Section 8.6 | | | 0x05 | MAX_STREAM_DATA | Section 8.7 | | |||
| | | | | | | | | | | |||
| | 0x06 | MAX_STREAM_ID | Section 8.7 | | | 0x06 | MAX_STREAM_ID | Section 8.8 | | |||
| | | | | | | | | | | |||
| | 0x07 | PING | Section 8.8 | | | 0x07 | PING | Section 8.9 | | |||
| | | | | | | | | | | |||
| | 0x08 | BLOCKED | Section 8.9 | | | 0x08 | BLOCKED | Section 8.10 | | |||
| | | | | | | | | | | |||
| | 0x09 | STREAM_BLOCKED | Section 8.10 | | | 0x09 | STREAM_BLOCKED | Section 8.11 | | |||
| | | | | | | | | | | |||
| | 0x0a | STREAM_ID_BLOCKED | Section 8.11 | | | 0x0a | STREAM_ID_BLOCKED | Section 8.12 | | |||
| | | | | | | | | | | |||
| | 0x0b | NEW_CONNECTION_ID | Section 8.12 | | | 0x0b | NEW_CONNECTION_ID | Section 8.13 | | |||
| | | | | | | | | | | |||
| | 0x0c | STOP_SENDING | Section 8.13 | | | 0x0c | STOP_SENDING | Section 8.14 | | |||
| | | | | | | | | | | |||
| | 0xa0 - 0xbf | ACK | Section 8.14 | | | 0x0d | PONG | Section 8.15 | | |||
| | | | | | | | | | | |||
| | 0xc0 - 0xff | STREAM | Section 8.15 | | | 0x0e | ACK | Section 8.16 | | |||
| | | | | | ||||
| | 0x10 - 0x17 | STREAM | Section 8.17 | | ||||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| 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.3. Once | connection establishment latency, as described in Section 7.3. 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.7. Finally a connection may be terminated by either | Section 7.7. Finally a connection may be terminated by either | |||
| endpoint, as described in Section 7.8. | endpoint, as described in Section 7.9. | |||
| 7.1. Matching Packets to Connections | 7.1. Matching Packets to Connections | |||
| Incoming packets are classified on receipt. Packets can either be | Incoming packets are classified on receipt. Packets can either be | |||
| associated with an existing connection, be discarded, or - for | associated with an existing connection, be discarded, or - for | |||
| servers - potentially create a new connection. | servers - potentially create a new connection. | |||
| Packets that can be associated with an existing connection are | Packets that can be associated with an existing connection are | |||
| handled according to the current state of that connection. Packets | handled according to the current state of that connection. Packets | |||
| are associated with existing connections using connection ID if it is | are associated with existing connections using connection ID if it is | |||
| present; this might include connection IDs that were advertised using | present; this might include connection IDs that were advertised using | |||
| NEW_CONNECTION_ID (Section 8.12). Packets without connection IDs and | NEW_CONNECTION_ID (Section 8.13). Packets without connection IDs and | |||
| long-form packets for connections that have incomplete cryptographic | long-form packets for connections that have incomplete cryptographic | |||
| handshakes are associated with an existing connection using the tuple | handshakes are associated with an existing connection using the tuple | |||
| of source and destination IP addresses and ports. | of source and destination IP addresses and ports. | |||
| A packet that uses the short header could be associated with an | A packet that uses the short header could be associated with an | |||
| existing connection with an incomplete cryptographic handshake. Such | existing connection with an incomplete cryptographic handshake. Such | |||
| a packet could be a valid packet that has been reordered with respect | a packet could be a valid packet that has been reordered with respect | |||
| to the long-form packets that will complete the cryptographic | to the long-form packets that will complete the cryptographic | |||
| handshake. This might happen after the final set of cryptographic | handshake. This might happen after the final set of cryptographic | |||
| handshake messages from either peer. These packets are expected to | handshake messages from either peer. These packets are expected to | |||
| skipping to change at page 21, line 52 ¶ | skipping to change at page 21, line 52 ¶ | |||
| connection SHOULD be discarded if it is not buffered. Discarded | connection SHOULD be discarded if it is not buffered. Discarded | |||
| packets MAY be logged for diagnostic or security purposes. | packets MAY be logged for diagnostic or security purposes. | |||
| For servers, packets that aren't associated with a connection | For servers, packets that aren't associated with a connection | |||
| potentially create a new connection. However, only packets that use | potentially create a new connection. However, only packets that use | |||
| the long packet header and that are at least the minimum size defined | the long packet header and that are at least the minimum size defined | |||
| for the protocol version can be initial packets. A server MAY | for the protocol version can be initial packets. A server MAY | |||
| discard packets with a short header or packets that are smaller than | discard packets with a short header or packets that are smaller than | |||
| the smallest minimum size for any version that the server supports. | the smallest minimum size for any version that the server supports. | |||
| A server that discards a packet that cannot be associated with a | A server that discards a packet that cannot be associated with a | |||
| connection MAY also generate a stateless reset (Section 7.8.4). | connection MAY also generate a stateless reset (Section 7.9.4). | |||
| This version of QUIC defines a minimum size for initial packets of | This version of QUIC defines a minimum size for initial packets of | |||
| 1200 octets (see Section 9). Versions of QUIC that define smaller | 1200 octets (see Section 9). Versions of QUIC that define smaller | |||
| minimum initial packet sizes need to be aware that initial packets | minimum initial packet sizes need to be aware that initial packets | |||
| will be discarded without action by servers that only support | will be discarded without action by servers that only support | |||
| versions with larger minimums. Clients that support multiple QUIC | versions with larger minimums. Clients that support multiple QUIC | |||
| versions can avoid this problem by ensuring that they increase the | versions can avoid this problem by ensuring that they increase the | |||
| size of their initial packets to the largest minimum size across all | size of their initial packets to the largest minimum size across all | |||
| of the QUIC versions they support. Servers need to recognize initial | of the QUIC versions they support. Servers need to recognize initial | |||
| packets that are the minimum size of all QUIC versions they support. | packets that are the minimum size of all QUIC versions they support. | |||
| 7.2. Version Negotiation | 7.2. 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 Client Initial | A QUIC connection begins with a client sending an Initial packet | |||
| packet (Section 5.4.1). The details of the handshake mechanisms are | (Section 5.4.1). The details of the handshake mechanisms are | |||
| described in Section 7.3, but all of the initial packets sent from | described in Section 7.3, but any Initial packet sent from the client | |||
| the client to the server MUST use the long header format - which | to the server MUST use the long header format - which includes the | |||
| includes the version of the protocol being used - and they MUST be | version of the protocol being used - and they MUST be padded to at | |||
| padded to at least 1200 octets. | least 1200 octets. | |||
| The server receives this packet and determines whether it potentially | The server receives this packet and determines whether it potentially | |||
| creates a new connection (see Section 7.1). If the packet might | creates a new connection (see Section 7.1). If the packet might | |||
| generate a new connection, the server then checks whether it | generate a new connection, the server then checks whether it | |||
| understands the version that the client has selected. | understands the version that the client has selected. | |||
| 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.3). This commits | the server proceeds with the handshake (Section 7.3). This commits | |||
| the server to the version that the client selected. | the server to the version that the client selected. | |||
| skipping to change at page 23, line 8 ¶ | skipping to change at page 23, line 8 ¶ | |||
| unacceptable version if that packet could create a new connection. | unacceptable version if that packet could create a new connection. | |||
| This allows a server to process packets with unsupported versions | This allows a server to process packets with unsupported versions | |||
| without retaining state. Though either the Client Initial packet or | without retaining state. Though either the Client Initial packet or | |||
| the version negotiation packet that is sent in response could be | the version negotiation packet that is sent in response could be | |||
| lost, the client will send new packets until it successfully receives | lost, the client will send new packets until it successfully receives | |||
| a response or it abandons the connection attempt. | a response or it abandons the connection attempt. | |||
| 7.2.2. Handling Version Negotiation Packets | 7.2.2. Handling Version Negotiation Packets | |||
| When the client receives a Version Negotiation packet, it first | When the client receives a Version Negotiation packet, it first | |||
| checks that the packet number and connection ID match the values the | checks that the connection ID matches the connection ID the client | |||
| client sent in a previous packet on the same connection. If this | sent. If this check fails, the packet MUST be discarded. | |||
| check fails, the packet MUST be discarded. | ||||
| Once the Version Negotiation packet is determined to be valid, the | Once the Version Negotiation packet is determined to be valid, the | |||
| client then selects an acceptable protocol version from the list | client then selects an acceptable protocol version from the list | |||
| provided by the server. The client then attempts to create a | provided by the server. The client then attempts to create a | |||
| connection using that version. Though the contents of the Client | connection using that version. Though the contents of the Client | |||
| Initial packet the client sends might not change in response to | Initial packet the client sends might not change in response to | |||
| version negotiation, a client MUST increase the packet number it uses | version negotiation, a client MUST increase the packet number it uses | |||
| on every packet it sends. Packets MUST continue to use long headers | on every packet it sends. Packets MUST continue to use long headers | |||
| and MUST include the new negotiated protocol version. | and MUST include the new negotiated protocol version. | |||
| skipping to change at page 23, line 48 ¶ | skipping to change at page 23, line 47 ¶ | |||
| cryptographic handshake (see Section 7.4.4). | cryptographic handshake (see Section 7.4.4). | |||
| 7.2.3. Using Reserved Versions | 7.2.3. 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 | |||
| Version Negotiation packet. | Version Negotiation packet. | |||
| The design of version negotiation permits a server to avoid | The design of version negotiation permits a server to avoid | |||
| maintaining state for packets that it rejects in this fashion. | maintaining state for packets that it rejects in this fashion. The | |||
| However, when the server generates a Version Negotiation packet, it | validation of version negotiation (see Section 7.4.4) only validates | |||
| cannot randomly generate a reserved version number. This is because | the result of version negotiation, which is the same no matter which | |||
| the server is required to include the same value in its transport | reserved version was sent. A server MAY therefore send different | |||
| parameters (see Section 7.4.4). To avoid the selected version number | reserved version numbers in the Version Negotiation Packet and in its | |||
| changing during connection establishment, the reserved version SHOULD | transport parameters. | |||
| be generated as a function of values that will be available to the | ||||
| server when later generating its handshake packets. | ||||
| A pseudorandom function that takes client address information (IP and | ||||
| port) and the client selected version as input would ensure that | ||||
| 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.3. Cryptographic and Transport Handshake | 7.3. 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 0 | minimize connection establishment latency. QUIC allocates stream 0 | |||
| for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | |||
| 1.3 as described in [QUIC-TLS]; a different QUIC version number could | 1.3 as described in [QUIC-TLS]; a different QUIC version number could | |||
| skipping to change at page 26, line 10 ¶ | skipping to change at page 26, line 10 ¶ | |||
| 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 { | |||
| initial_max_stream_data(0), | initial_max_stream_data(0), | |||
| initial_max_data(1), | initial_max_data(1), | |||
| initial_max_stream_id(2), | initial_max_stream_id_bidi(2), | |||
| idle_timeout(3), | idle_timeout(3), | |||
| omit_connection_id(4), | omit_connection_id(4), | |||
| max_packet_size(5), | max_packet_size(5), | |||
| stateless_reset_token(6), | stateless_reset_token(6), | |||
| ack_delay_exponent(7), | ||||
| initial_max_stream_id_uni(8), | ||||
| (65535) | (65535) | |||
| } TransportParameterId; | } TransportParameterId; | |||
| struct { | struct { | |||
| TransportParameterId parameter; | TransportParameterId parameter; | |||
| opaque value<0..2^16-1>; | opaque value<0..2^16-1>; | |||
| } TransportParameter; | } TransportParameter; | |||
| struct { | struct { | |||
| select (Handshake.msg_type) { | select (Handshake.msg_type) { | |||
| case client_hello: | case client_hello: | |||
| QuicVersion negotiated_version; | ||||
| QuicVersion initial_version; | QuicVersion initial_version; | |||
| case encrypted_extensions: | case encrypted_extensions: | |||
| QuicVersion negotiated_version; | ||||
| QuicVersion supported_versions<4..2^8-4>; | QuicVersion supported_versions<4..2^8-4>; | |||
| case new_session_ticket: | case new_session_ticket: | |||
| struct {}; | struct {}; | |||
| }; | }; | |||
| TransportParameter parameters<30..2^16-1>; | TransportParameter parameters<30..2^16-1>; | |||
| } TransportParameters; | } TransportParameters; | |||
| Figure 6: Definition of TransportParameters | Figure 6: Definition of TransportParameters | |||
| skipping to change at page 27, line 20 ¶ | skipping to change at page 27, line 20 ¶ | |||
| 7.4.1. Transport Parameter Definitions | 7.4.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: | |||
| initial_max_stream_data (0x0000): The initial stream maximum data | initial_max_stream_data (0x0000): The initial stream maximum data | |||
| parameter contains the initial value for the maximum data that can | parameter contains the initial value for the maximum data that can | |||
| be sent on any newly created stream. This parameter is encoded as | be sent on any newly created stream. This parameter is encoded as | |||
| an unsigned 32-bit integer in units of octets. This is equivalent | an unsigned 32-bit integer in units of octets. This is equivalent | |||
| to an implicit MAX_STREAM_DATA frame (Section 8.6) being sent on | to an implicit MAX_STREAM_DATA frame (Section 8.7) being sent on | |||
| all streams immediately after opening. | all streams immediately after opening. | |||
| initial_max_data (0x0001): The initial maximum data parameter | initial_max_data (0x0001): The initial maximum data parameter | |||
| contains the initial value for the maximum amount of data that can | contains the initial value for the maximum amount of data that can | |||
| be sent on the connection. This parameter is encoded as an | be sent on the connection. This parameter is encoded as an | |||
| unsigned 32-bit integer in units of 1024 octets. That is, the | unsigned 32-bit integer in units of octets. This is equivalent to | |||
| value here is multiplied by 1024 to determine the actual maximum | sending a MAX_DATA (Section 8.6) for the connection immediately | |||
| value. This is equivalent to sending a MAX_DATA (Section 8.5) for | ||||
| the connection immediately after completing the handshake. | ||||
| initial_max_stream_id (0x0002): The initial maximum stream ID | ||||
| 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.7) immediately | ||||
| after completing the handshake. | 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). | |||
| A server MUST include the following transport parameters: | A server MUST include the following transport parameters: | |||
| stateless_reset_token (0x0006): The Stateless Reset Token is used in | stateless_reset_token (0x0006): The Stateless Reset Token is used in | |||
| verifying a stateless reset, see Section 7.8.4. This parameter is | verifying a stateless reset, see Section 7.9.4. This parameter is | |||
| a sequence of 16 octets. | a sequence of 16 octets. | |||
| A client MUST NOT include a stateless reset token. A server MUST | A client MUST NOT include a stateless reset token. A server MUST | |||
| treat receipt of a stateless_reset_token transport parameter as a | treat receipt of a stateless_reset_token transport parameter as a | |||
| connection error of type TRANSPORT_PARAMETER_ERROR. | connection error of type TRANSPORT_PARAMETER_ERROR. | |||
| An endpoint MAY use the following transport parameters: | An endpoint MAY use the following transport parameters: | |||
| initial_max_stream_id_bidi (0x0002): The initial maximum stream ID | ||||
| parameter contains the initial maximum stream number the peer may | ||||
| initiate for bidirectional streams, encoded as an unsigned 32-bit | ||||
| integer. This value MUST be a valid bidirectional stream ID for a | ||||
| peer-initiated stream (that is, the two least significant bits are | ||||
| set to 0 by a server and to 1 by a client). If an invalid value | ||||
| is provided, the recipient MUST generate a connection error of | ||||
| type TRANSPORT_PARAMETER_ERROR. Setting this parameter is | ||||
| equivalent to sending a MAX_STREAM_ID (Section 8.8) immediately | ||||
| after completing the handshake. The maximum bidirectional stream | ||||
| ID is set to 0 if this parameter is absent, preventing the | ||||
| creation of new bidirectional streams until a MAX_STREAM_ID frame | ||||
| is sent. Note that a default value of 0 does not prevent the | ||||
| cryptographic handshake stream (that is, stream 0) from being | ||||
| used. | ||||
| initial_max_stream_id_uni (0x0008): The initial maximum stream ID | ||||
| parameter contains the initial maximum stream number the peer may | ||||
| initiate for unidirectional streams, encoded as an unsigned 32-bit | ||||
| integer. The value MUST be a valid unidirectional ID for the | ||||
| recipient (that is, the two least significant bits are set to 2 by | ||||
| a server and to 3 by a client). If an invalid value is provided, | ||||
| the recipient MUST generate a connection error of type | ||||
| TRANSPORT_PARAMETER_ERROR. Setting this parameter is equivalent | ||||
| to sending a MAX_STREAM_ID (Section 8.8) immediately after | ||||
| completing the handshake. The maximum unidirectional stream ID is | ||||
| set to 0 if this parameter is absent, preventing the creation of | ||||
| new unidirectional streams until a MAX_STREAM_ID frame is sent. | ||||
| omit_connection_id (0x0004): The omit connection identifier | omit_connection_id (0x0004): The omit connection identifier | |||
| parameter indicates that packets sent to the endpoint that | parameter indicates that packets sent to the endpoint that | |||
| advertises this parameter can omit the connection ID. This can be | advertises this parameter MAY omit the connection ID in packets | |||
| used by an endpoint where it knows that source and destination IP | using short header format. This can be used by an endpoint where | |||
| address and port are sufficient for it to identify a connection. | it knows that source and destination IP address and port are | |||
| This parameter is zero length. Absence this parameter indicates | sufficient for it to identify a connection. This parameter is | |||
| that the endpoint relies on the connection ID being present in | zero length. Absence of this parameter means that the connection | |||
| every packet. | ID MUST be present in every packet sent to this endpoint. | |||
| max_packet_size (0x0005): The maximum packet size parameter places a | max_packet_size (0x0005): The maximum packet size parameter places a | |||
| limit on the size of packets that the endpoint is willing to | limit on the size of packets that the endpoint is willing to | |||
| receive, encoded as an unsigned 16-bit integer. This indicates | receive, encoded as an unsigned 16-bit integer. This indicates | |||
| that packets larger than this limit will be dropped. The default | that packets larger than this limit will be dropped. The default | |||
| for this parameter is the maximum permitted UDP payload of 65527. | for this parameter is the maximum permitted UDP payload of 65527. | |||
| Values below 1200 are invalid. This limit only applies to | Values below 1200 are invalid. This limit only applies to | |||
| protected packets (Section 5.5). | protected packets (Section 5.5). | |||
| ack_delay_exponent (0x0007): An 8-bit unsigned integer value | ||||
| indicating an exponent used to decode the ACK Delay field in the | ||||
| ACK frame, see Section 8.16. If this value is absent, a default | ||||
| value of 3 is assumed (indicating a multiplier of 8). Values | ||||
| above 20 are invalid. | ||||
| 7.4.2. Values of Transport Parameters for 0-RTT | 7.4.2. Values of Transport Parameters for 0-RTT | |||
| Transport parameters from the server MUST be remembered by the client | Transport parameters from the server MUST be remembered by the client | |||
| for use with 0-RTT data. If the TLS NewSessionTicket message | for use with 0-RTT data. If the TLS NewSessionTicket message | |||
| includes the quic_transport_parameters extension, then those values | includes the quic_transport_parameters extension, then those values | |||
| are used for the server values when establishing a new connection | are used for the server values when establishing a new connection | |||
| using that ticket. Otherwise, the transport parameters that the | using that ticket. Otherwise, the transport parameters that the | |||
| server advertises during connection establishment are used. | server advertises during connection establishment are used. | |||
| A server can remember the transport parameters that it advertised, or | A server can remember the transport parameters that it advertised, or | |||
| skipping to change at page 28, line 43 ¶ | skipping to change at page 29, line 26 ¶ | |||
| recover the information when accepting 0-RTT data. A server uses the | recover the information when accepting 0-RTT data. A server uses the | |||
| transport parameters in determining whether to accept 0-RTT data. | transport parameters in determining whether to accept 0-RTT data. | |||
| A server MAY accept 0-RTT and subsequently provide different values | A server MAY accept 0-RTT and subsequently provide different values | |||
| for transport parameters for use in the new connection. If 0-RTT | for transport parameters for use in the new connection. If 0-RTT | |||
| data is accepted by the server, the server MUST NOT reduce any limits | data is accepted by the server, the server MUST NOT reduce any limits | |||
| or alter any values that might be violated by the client with its | or alter any values that might be violated by the client with its | |||
| 0-RTT data. In particular, a server that accepts 0-RTT data MUST NOT | 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 | set values for initial_max_data or initial_max_stream_data that are | |||
| smaller than the remembered value of those parameters. Similarly, a | smaller than the remembered value of those parameters. Similarly, a | |||
| server MUST NOT reduce the value of initial_max_stream_id. | server MUST NOT reduce the value of initial_max_stream_id_bidi or | |||
| initial_max_stream_id_uni. | ||||
| Omitting or setting a zero value for certain transport parameters can | ||||
| result in 0-RTT data being enabled, but not usable. The following | ||||
| transport parameters SHOULD be set to non-zero values for 0-RTT: | ||||
| initial_max_stream_id_bidi, initial_max_stream_id_uni, | ||||
| initial_max_data, initial_max_stream_data. | ||||
| A server MUST reject 0-RTT data or even abort a handshake if the | A server MUST reject 0-RTT data or even abort a handshake if the | |||
| implied values for transport parameters cannot be supported. | implied values for transport parameters cannot be supported. | |||
| 7.4.3. New Transport Parameters | 7.4.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. | |||
| 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.4.4. Version Negotiation Validation | 7.4.4. Version Negotiation Validation | |||
| The transport parameters include three fields that encode version | Though the cryptographic handshake has integrity protection, two | |||
| information. These retroactively authenticate the version | forms of QUIC version downgrade are possible. In the first, an | |||
| negotiation (see Section 7.2) that is performed prior to the | attacker replaces the QUIC version in the Initial packet. In the | |||
| cryptographic handshake. | second, a fake Version Negotiation packet is sent by an attacker. To | |||
| protect against these attacks, the transport parameters include three | ||||
| fields that encode version information. These parameters are used to | ||||
| retroactively authenticate the choice of version (see Section 7.2). | ||||
| The cryptographic handshake provides integrity protection for the | The cryptographic handshake provides integrity protection for the | |||
| negotiated version as part of the transport parameters (see | negotiated version as part of the transport parameters (see | |||
| Section 7.4). As a result, modification of version negotiation | Section 7.4). As a result, attacks on version negotiation by an | |||
| packets by an attacker can be detected. | attacker can be detected. | |||
| The client includes two fields in the transport parameters: | ||||
| o The negotiated_version is the version that was finally selected | ||||
| for use. This MUST be identical to the value that is on the | ||||
| packet that carries the ClientHello. A server that receives a | ||||
| negotiated_version that does not match the version of QUIC that is | ||||
| in use MUST terminate the connection with a | ||||
| VERSION_NEGOTIATION_ERROR error code. | ||||
| o The initial_version is the version that the client initially | The client includes the initial_version field in its transport | |||
| attempted to use. If the server did not send a version | parameters. The initial_version is the version that the client | |||
| negotiation packet Section 5.3, this will be identical to the | initially attempted to use. If the server did not send a version | |||
| negotiated_version. | negotiation packet Section 5.3, this will be identical to the | |||
| negotiated_version field in the server transport parameters. | ||||
| A server that processes all packets in a stateful fashion can | A server that processes all packets in a stateful fashion can | |||
| remember how version negotiation was performed and validate the | remember how version negotiation was performed and validate the | |||
| initial_version value. | initial_version value. | |||
| A server that does not maintain state for every packet it receives | A server that does not maintain state for every packet it receives | |||
| (i.e., a stateless server) uses a different process. If the initial | (i.e., a stateless server) uses a different process. If the | |||
| and negotiated versions are the same, a stateless server can accept | initial_version matches the version of QUIC that is in use, a | |||
| the value. | stateless server can accept the value. | |||
| If the initial version is different from the negotiated_version, a | If the initial_version is different from the version of QUIC that is | |||
| stateless server MUST check that it would have sent a version | in use, a stateless server MUST check that it would have sent a | |||
| negotiation packet if it had received a packet with the indicated | version negotiation packet if it had received a packet with the | |||
| initial_version. If a server would have accepted the version | indicated initial_version. If a server would have accepted the | |||
| included in the initial_version and the value differs from the value | version included in the initial_version and the value differs from | |||
| of negotiated_version, the server MUST terminate the connection with | the QUIC version that is in use, the server MUST terminate the | |||
| a VERSION_NEGOTIATION_ERROR error. | connection with a VERSION_NEGOTIATION_ERROR error. | |||
| The server includes both the version of QUIC that is in use and a | ||||
| list of the QUIC versions that the server supports. | ||||
| The negotiated_version field is the version that is in use. This | ||||
| MUST be set by the server to the value that is on the Initial packet | ||||
| that it accepts (not an Initial packet that triggers a Retry or | ||||
| Version Negotiation packet). A client that receives a | ||||
| negotiated_version that does not match the version of QUIC that is in | ||||
| use MUST terminate the connection with a VERSION_NEGOTIATION_ERROR | ||||
| error code. | ||||
| The server includes a list of versions that it would send in any | The server includes a list of versions that it would send in any | |||
| version negotiation packet (Section 5.3) in supported_versions. The | version negotiation packet (Section 5.3) in the supported_versions | |||
| server populates this field even if it did not send a version | field. The server populates this field even if it did not send a | |||
| negotiation packet. This field is absent if the parameters are | version negotiation packet. This field is absent if the parameters | |||
| included in a NewSessionTicket message. | are included in a NewSessionTicket message. | |||
| The client can validate that the negotiated_version is included in | The client validates that the negotiated_version is included in the | |||
| the supported_versions list and - if version negotiation was | supported_versions list and - if version negotiation was performed - | |||
| performed - that it would have selected the negotiated version. A | that it would have selected the negotiated version. A client MUST | |||
| client MUST terminate the connection with a VERSION_NEGOTIATION_ERROR | terminate the connection with a VERSION_NEGOTIATION_ERROR error code | |||
| error code if the negotiated_version value is not included in the | if the current QUIC version is not listed in the supported_versions | |||
| supported_versions list. A client MUST terminate with a | list. A client MUST terminate with a VERSION_NEGOTIATION_ERROR error | |||
| VERSION_NEGOTIATION_ERROR error code if version negotiation occurred | code if version negotiation occurred but it would have selected a | |||
| but it would have selected a different version based on the value of | different version based on the value of the supported_versions list. | |||
| the supported_versions list. | ||||
| When an endpoint accepts multiple QUIC versions, it can potentially | When an endpoint accepts multiple QUIC versions, it can potentially | |||
| interpret transport parameters as they are defined by any of the QUIC | interpret transport parameters as they are defined by any of the QUIC | |||
| versions it supports. The version field in the QUIC packet header is | versions it supports. The version field in the QUIC packet header is | |||
| authenticated using transport parameters. The position and the | authenticated using transport parameters. The position and the | |||
| format of the version fields in transport parameters MUST either be | format of the version fields in transport parameters MUST either be | |||
| identical across different QUIC versions, or be unambiguously | identical across different QUIC versions, or be unambiguously | |||
| different to ensure no confusion about their interpretation. One way | different to ensure no confusion about their interpretation. One way | |||
| that a new format could be introduced is to define a TLS extension | that a new format could be introduced is to define a TLS extension | |||
| with a different codepoint. | with a different codepoint. | |||
| 7.5. Stateless Retries | 7.5. Stateless Retries | |||
| A server can process an initial cryptographic handshake messages from | A server can process an initial cryptographic handshake messages from | |||
| a client without committing any state. This allows a server to | a client without committing any state. This allows a server to | |||
| perform address validation (Section 7.6, or to defer connection | perform address validation (Section 7.6, or to defer connection | |||
| establishment costs. | establishment costs. | |||
| A server that generates a response to an initial packet without | A server that generates a response to an initial packet without | |||
| retaining connection state MUST use the Server Stateless Retry packet | retaining connection state MUST use the Retry packet (Section 5.4.2). | |||
| (Section 5.4.2). This packet causes a client to reset its transport | This packet causes a client to reset its transport state and to | |||
| state and to continue the connection attempt with new connection | continue the connection attempt with new connection state while | |||
| state while maintaining the state of the cryptographic handshake. | maintaining the state of the cryptographic handshake. | |||
| A server MUST NOT send multiple Server Stateless Retry packets in | A server MUST NOT send multiple Retry packets in response to a client | |||
| response to a client handshake packet. Thus, any cryptographic | handshake packet. Thus, any cryptographic handshake message that is | |||
| handshake message that is sent MUST fit within a single packet. | sent MUST fit within a single packet. | |||
| In TLS, the Server Stateless Retry packet type is used to carry the | In TLS, the Retry packet type is used to carry the HelloRetryRequest | |||
| HelloRetryRequest message. | message. | |||
| 7.6. Proof of Source Address Ownership | 7.6. 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 | |||
| skipping to change at page 31, line 44 ¶ | skipping to change at page 32, line 38 ¶ | |||
| 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. | |||
| A different type of source address validation is performed after a | ||||
| connection migration, see Section 7.7.2. | ||||
| 7.6.1. Client Address Validation Procedure | 7.6.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.6.3), if | As long as the token cannot be easily guessed (see Section 7.6.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 | |||
| skipping to change at page 33, line 44 ¶ | skipping to change at page 34, line 42 ¶ | |||
| 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. Connection migration allows a | server migrating to a new network. Connection migration allows a | |||
| client to retain any shared state with a connection when they move | client to retain any shared state with a connection when they move | |||
| networks. This includes state that can be hard to recover such as | networks. This includes state that can be hard to recover such as | |||
| outstanding requests, which might otherwise be lost with no easy way | outstanding requests, which might otherwise be lost with no easy way | |||
| to retry them. | to retry them. | |||
| An endpoint that receives packets that contain a source IP address | ||||
| and port that has not yet been used can start sending new packets | ||||
| with those as a destination IP address and port. Packets exchanged | ||||
| between endpoints can then follow the new path. | ||||
| Due to variations in path latency or packet reordering, packets from | ||||
| different source addresses might be reordered. The packet with the | ||||
| highest packet number MUST be used to determine which path to use. | ||||
| Endpoints also need to be prepared to receive packets from an older | ||||
| source address. | ||||
| An endpoint MUST validate that its peer can receive packets at the | ||||
| new address before sending any significant quantity of data to that | ||||
| address, or it risks being used for denial of service. See | ||||
| Section 7.7.2 for details. | ||||
| 7.7.1. Privacy Implications of Connection Migration | 7.7.1. Privacy Implications of Connection Migration | |||
| Using a stable connection ID on multiple network paths allows a | Using a stable connection ID on multiple network paths allows a | |||
| passive observer to correlate activity between those paths. A client | passive observer to correlate activity between those paths. A client | |||
| that moves between networks might not wish to have their activity | that moves between networks might not wish to have their activity | |||
| correlated by any entity other than a server. The NEW_CONNECTION_ID | correlated by any entity other than a server. The NEW_CONNECTION_ID | |||
| message can be sent by a server to provide an unlinkable connection | message can be sent by a server to provide an unlinkable connection | |||
| ID for use in case the client wishes to explicitly break linkability | ID for use in case the client wishes to explicitly break linkability | |||
| between two points of network attachment. | between two points of network attachment. | |||
| skipping to change at page 35, line 7 ¶ | skipping to change at page 36, line 16 ¶ | |||
| Gap = HKDF-Expand-Label(packet_number_secret, | Gap = HKDF-Expand-Label(packet_number_secret, | |||
| "QUIC packet sequence gap", sequence, 4) | "QUIC packet sequence gap", sequence, 4) | |||
| The output of HKDF-Expand-Label is interpreted as a big-endian | The output of HKDF-Expand-Label is interpreted as a big-endian | |||
| number. "packet_number_secret" is derived from the TLS key exchange, | number. "packet_number_secret" is derived from the TLS key exchange, | |||
| as described in Section 5.6 of [QUIC-TLS]. | as described in Section 5.6 of [QUIC-TLS]. | |||
| 7.7.2. Address Validation for Migrated Connections | 7.7.2. Address Validation for Migrated Connections | |||
| TODO: see issue #161 | An endpoint that receives a packet from a new remote IP address and | |||
| port (or just a new remote port) on packets from its peer is likely | ||||
| seeing a connection migration at the peer. | ||||
| 7.8. Connection Termination | However, it is also possible that the peer is spoofing its source | |||
| address in order to cause the endpoint to send excessive amounts of | ||||
| data to an unwilling host. If the endpoint sends significantly more | ||||
| data than the peer, connection migration might be used to amplify the | ||||
| volume of data that an attacker can generate toward a victim. | ||||
| Thus, when seeing a new remote transport address, an endpoint MUST | ||||
| verify that its peer can receive and respond to packets at that new | ||||
| address. By providing copies of the data that it receives, the peer | ||||
| proves that it is receiving packets at the new address and consents | ||||
| to receive data. | ||||
| Prior to validating the new remote address, and endpoint MUST limit | ||||
| the amount of data and packets that it sends to its peer. At a | ||||
| minimum, this needs to consider the possibility that packets are sent | ||||
| without congestion feedback. | ||||
| Once a connection is established, address validation is relatively | ||||
| simple (see Section 7.6 for the process that is used during the | ||||
| handshake). An endpoint validates a remote address by sending a PING | ||||
| frame containing a payload that is hard to guess. This frame MUST be | ||||
| sent in a packet that is sent to the new address. Once a PONG frame | ||||
| containing the same payload is received, the address is considered to | ||||
| be valid. The PONG frame can use any path on its return. A PING | ||||
| frame containing 12 randomly generated [RFC4086] octets is sufficient | ||||
| to ensure that it is easier to receive the packet than it is to guess | ||||
| the value correctly. | ||||
| If the PING frame is determined to be lost, a new PING frame SHOULD | ||||
| be generated. This PING frame MUST include a new Data field that is | ||||
| similarly difficult to guess. | ||||
| If validation of the new remote address fails, after allowing enough | ||||
| time for possible loss and recovery of packets carrying PING and PONG | ||||
| frames, the endpoint MUST terminate the connection. When setting | ||||
| this timer, implementations are cautioned that the new path could | ||||
| have a longer round trip time than the original. The endpoint MUST | ||||
| NOT send a CONNECTION_CLOSE frame in this case; it has to assume that | ||||
| the remote peer does not want to receive any more packets. | ||||
| If the remote address is validated successfully, the endpoint MAY | ||||
| increase the rate that it sends on the new path using the state from | ||||
| the previous path. The capacity available on the new path might not | ||||
| be the same as the old path. An endpoint MUST NOT restore its send | ||||
| rate unless it is reasonably sure that the path is the same as the | ||||
| previous path. For instance, a change in only port number is likely | ||||
| indicative of a rebinding in a middlebox and not a complete change in | ||||
| path. This determination likely depends on heuristics, which could | ||||
| be imperfect; if the new path capacity is significantly reduced, | ||||
| ultimately this relies on the congestion controller responding to | ||||
| congestion signals and reduce send rates appropriately. | ||||
| After verifying an address, the endpoint SHOULD update any address | ||||
| validation tokens (Section 7.6) that it has issued to its peer if | ||||
| those are no longer valid based on the changed address. | ||||
| Address validation using the PING frame MAY be used at any time by | ||||
| either peer. For instance, an endpoint might check that a peer is | ||||
| still in possession of its address after a period of quiescence. | ||||
| Upon seeing a connection migration, an endpoint that sees a new | ||||
| address MUST abandon any address validation it is performing with | ||||
| other addresses on the expectation that the validation is likely to | ||||
| fail. Abandoning address validation primarily means not closing the | ||||
| connection when a PONG frame is not received, but it could also mean | ||||
| ceasing retransmissions of the PING frame. An endpoint that doesn't | ||||
| retransmit a PING frame might receive a PONG frame, which it MUST | ||||
| ignore. | ||||
| 7.8. Spurious Connection Migrations | ||||
| A connection migration could be triggered by an attacker that is able | ||||
| to capture and forward a packet such that it arrives before the | ||||
| legitimate copy of that packet. Such a packet will appear to be a | ||||
| legitimate connection migration and the legitimate copy will be | ||||
| dropped as a duplicate. | ||||
| After a spurious migration, validation of the source address will | ||||
| fail because the entity at the source address does not have the | ||||
| necessary cryptographic keys to read or respond to the PING frame | ||||
| that is sent to it, even if it wanted to. Such a spurious connection | ||||
| migration could result in the connection being dropped when the | ||||
| source address validation fails. This grants an attacker the ability | ||||
| to terminate the connection. | ||||
| Receipt of packets with higher packet numbers from the legitimate | ||||
| address will trigger another connection migration. This will cause | ||||
| the validation of the address of the spurious migration to be | ||||
| abandoned. | ||||
| To ensure that a peer sends packets from the legitimate address | ||||
| before the validation of the new address can fail, an endpoint SHOULD | ||||
| attempt to validate the old remote address before attempting to | ||||
| validate the new address. If the connection migration is spurious, | ||||
| then the legitimate address will be used to respond and the | ||||
| connection will migrate back to the old address. | ||||
| As with any address validation, packets containing retransmissions of | ||||
| the PING frame validating an address MUST be sent to the address | ||||
| being validated. Consequently, during a migration of a peer, an | ||||
| endpoint could be sending to multiple remote addresses. | ||||
| An endpoint MAY abandon address validation for an address that it | ||||
| considers to be already valid. That is, if successive connection | ||||
| migrations occur in quick succession with the final remote address | ||||
| being identical to the initial remote address, the endpoint MAY | ||||
| abandon address validation for that address. | ||||
| 7.9. 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: | |||
| o idle timeout (Section 7.8.2) | o idle timeout (Section 7.9.2) | |||
| o immediate close (Section 7.8.3) | o immediate close (Section 7.9.3) | |||
| o stateless reset (Section 7.8.4) | o stateless reset (Section 7.9.4) | |||
| 7.8.1. Draining Period | 7.9.1. Closing and Draining Connection States | |||
| After a connection is closed for any reason, an endpoint might | The closing and draining connection states exist to ensure that | |||
| receive packets from its peer. These packets might have been sent | connections close cleanly and that delayed or reordered packets are | |||
| prior to receiving any close signal, or they might be retransmissions | properly discarded. These states SHOULD persist for three times the | |||
| of packets for which acknowledgments were lost. | current Retransmission Timeout (RTO) interval as defined in | |||
| [QUIC-RECOVERY]. | ||||
| The draining period persists for three times the current | An endpoint enters a closing period after initiating an immediate | |||
| Retransmission Timeout (RTO) interval as defined in [QUIC-RECOVERY]. | close (Section 7.9.3) and optionally after an idle timeout | |||
| During this period, new packets can be acknowledged, but no new | (Section 7.9.2). While closing, an endpoint MUST NOT send packets | |||
| application data can be sent on the connection. | unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE frame | |||
| (see Section 7.9.3 for details). | ||||
| Different treatment is given to packets that are received while a | In the closing state, only a packet containing a closing frame can be | |||
| connection is in the draining period depending on how the connection | sent. An endpoint retains only enough information to generate a | |||
| was closed. | packet containing a closing frame and to identify packets as | |||
| belonging to the connection. The connection ID and QUIC version is | ||||
| sufficient information to identify packets for a closing connection; | ||||
| an endpoint can discard all other connection state. An endpoint MAY | ||||
| retain packet protection keys for incoming packets to allow it to | ||||
| read and process a closing frame. | ||||
| An endpoint that is in a draining period MUST NOT send packets unless | The draining state is entered once an endpoint receives a signal that | |||
| they contain a CONNECTION_CLOSE or APPLICATION_CLOSE frame. | its peer is closing or draining. While otherwise identical to the | |||
| closing state, an endpoint in the draining state MUST NOT send any | ||||
| packets. Retaining packet protection keys is unnecessary once a | ||||
| connection is in the draining state. | ||||
| Once the draining period has ended, an endpoint SHOULD discard per- | An endpoint MAY transition from the closing period to the draining | |||
| connection state. This results in new packets on the connection | period if it can confirm that its peer is also closing or draining. | |||
| being discarded. An endpoint MAY send a stateless reset in response | Receiving a closing frame is sufficient confirmation, as is receiving | |||
| to any further incoming packets. | a stateless reset. The draining period SHOULD end when the closing | |||
| period would have ended. In other words, the endpoint can use the | ||||
| same end time, but cease retransmission of the closing packet. | ||||
| The draining period does not apply when a stateless reset | Disposing of connection state prior to the end of the closing or | |||
| (Section 7.8.4) is sent. | draining period could cause delayed or reordered packets to be | |||
| handled poorly. Endpoints that have some alternative means to ensure | ||||
| that late-arriving packets on the connection do not create QUIC | ||||
| state, such as those that are able to close the UDP socket, MAY use | ||||
| an abbreviated draining period which can allow for faster resource | ||||
| recovery. Servers that retain an open socket for accepting new | ||||
| connections SHOULD NOT exit the closing or draining period early. | ||||
| 7.8.2. Idle Timeout | Once the closing or draining period has ended, an endpoint SHOULD | |||
| discard all connection state. This results in new packets on the | ||||
| connection being handled generically. For instance, an endpoint MAY | ||||
| send a stateless reset in response to any further incoming packets. | ||||
| The draining and closing periods do not apply when a stateless reset | ||||
| (Section 7.9.4) is sent. | ||||
| 7.9.2. Idle Timeout | ||||
| A connection that remains idle for longer than the idle timeout (see | A connection that remains idle for longer than the idle timeout (see | |||
| Section 7.4.1) becomes closed. Either peer removes connection state | Section 7.4.1) is closed. A connection enters the draining state | |||
| if they have neither sent nor received a packet for this time. | when the idle timeout expires. | |||
| The time at which an idle timeout takes effect won't be perfectly | The time at which an idle timeout takes effect won't be perfectly | |||
| synchronized on peers. A connection enters the draining period when | synchronized on both endpoints. An endpoint that sends packets near | |||
| the idle timeout expires. During this time, an endpoint that | the end of an idle period could have those packets discarded if its | |||
| receives new packets MAY choose to restore the connection. | peer enters the draining state before the packet is received. | |||
| Alternatively, an endpoint that receives packets MAY signal the | ||||
| timeout using an immediate close. | ||||
| 7.8.3. Immediate Close | 7.9.3. Immediate Close | |||
| An endpoint sends a CONNECTION_CLOSE or APPLICATION_CLOSE frame to | An endpoint sends a closing frame, either CONNECTION_CLOSE or | |||
| terminate the connection immediately. Either frame causes all open | APPLICATION_CLOSE, to terminate the connection immediately. Either | |||
| streams to immediately become closed; open streams can be assumed to | closing frame causes all streams to immediately become closed; open | |||
| be implicitly reset. After sending or receiving a CONNECTION_CLOSE | streams can be assumed to be implicitly reset. | |||
| frame, endpoints immediately enter a draining period. | ||||
| During the draining period, an endpoint that sends a CONNECTION_CLOSE | After sending a closing frame, endpoints immediately enter the | |||
| or APPLICATION_CLOSE frame SHOULD respond to any subsequent packet | closing state. During the closing period, an endpoint that sends a | |||
| that it receives with another packet containing either close frame. | closing frame SHOULD respond to any packet that it receives with | |||
| To reduce the state that an endpoint maintains in this case, it MAY | another packet containing a closing frame. To minimize the state | |||
| that an endpoint maintains for a closing connection, endpoints MAY | ||||
| send the exact same packet. However, endpoints SHOULD limit the | send the exact same packet. However, endpoints SHOULD limit the | |||
| number of packets they generate containing either close frame. For | number of packets they generate containing a closing frame. For | |||
| instance, an endpoint could progressively increase the number of | instance, an endpoint could progressively increase the number of | |||
| packets that it receives before sending additional packets. | packets that it receives before sending additional packets or | |||
| increase the time between packets. | ||||
| Note: Allowing retransmission of a packet contradicts other advice | Note: Allowing retransmission of a packet contradicts other advice | |||
| in this document that recommends the creation of new packet | in this document that recommends the creation of new packet | |||
| numbers for every packet. Sending new packet numbers is primarily | numbers for every packet. Sending new packet numbers is primarily | |||
| of advantage to loss recovery and congestion control, which are | of advantage to loss recovery and congestion control, which are | |||
| not expected to be relevant for a closed connection. | not expected to be relevant for a closed connection. | |||
| Retransmitting the final packet requires less state. | Retransmitting the final packet requires less state. | |||
| After receiving a closing frame, endpoints enter the draining state. | ||||
| An endpoint that receives a closing frame MAY send a single packet | ||||
| containing a closing frame before entering the draining state, using | ||||
| a CONNECTION_CLOSE frame and a NO_ERROR code if appropriate. An | ||||
| endpoint MUST NOT send further packets, which could result in a | ||||
| constant exchange of closing frames until the closing period on | ||||
| either peer ended. | ||||
| An immediate close can be used after an application protocol has | An immediate close can be used after an application protocol has | |||
| arranged to close a connection. This might be after the application | arranged to close a connection. This might be after the application | |||
| protocols negotiates a graceful shutdown. The application protocol | protocols negotiates a graceful shutdown. The application protocol | |||
| exchanges whatever messages that are needed to cause both endpoints | exchanges whatever messages that are needed to cause both endpoints | |||
| to agree to close the connection, after which the application | to agree to close the connection, after which the application | |||
| requests that the connection be closed. The application protocol can | requests that the connection be closed. The application protocol can | |||
| use an APPLICATION_CLOSE message with an appropriate error code to | use an APPLICATION_CLOSE message with an appropriate error code to | |||
| signal closure. | signal closure. | |||
| 7.8.4. Stateless Reset | 7.9.4. Stateless Reset | |||
| A stateless reset is provided as an option of last resort for a | A stateless reset is provided as an option of last resort for a | |||
| server that does not have access to the state of a connection. A | server that does not have access to the state of a connection. A | |||
| server crash or outage might result in clients continuing to send | server crash or outage might result in clients continuing to send | |||
| data to a server that is unable to properly continue the connection. | data to a server that is unable to properly continue the connection. | |||
| A server that wishes to communicate a fatal connection error MUST use | A server that wishes to communicate a fatal connection error MUST use | |||
| a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has sufficient | a closing frame if it has sufficient state to do so. | |||
| state to do so. | ||||
| To support this process, the server sends a stateless_reset_token | To support this process, the server sends a stateless_reset_token | |||
| value during the handshake in the transport parameters. This value | value during the handshake in the transport parameters. This value | |||
| is protected by encryption, so only client and server know this | is protected by encryption, so only client and server know this | |||
| value. | value. | |||
| A server that receives packets that it cannot process sends a packet | A server that receives packets that it cannot process sends a packet | |||
| in the following layout: | in the following layout: | |||
| 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| 00001 | | |0|C|K|Type (5) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + [Connection ID (64)] + | + [Connection ID (64)] + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) | | | Packet Number (8/16/32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Random Octets (*) ... | | Random Octets (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| skipping to change at page 37, line 43 ¶ | skipping to change at page 42, line 6 ¶ | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| A server copies the connection ID field from the packet that triggers | A server copies the connection ID field from the packet that triggers | |||
| the stateless reset. A server omits the connection ID if explicitly | the stateless reset. A server omits the connection ID if explicitly | |||
| configured to do so, or if the client packet did not include a | configured to do so, or if the client packet did not include a | |||
| connection ID. | connection ID. | |||
| The Packet Number field is set to a randomized value. The server | The Packet Number field is set to a randomized value. The server | |||
| SHOULD send a packet with a short header and a type of 0x01. This | SHOULD send a packet with a short header and a type of 0x1F. This | |||
| produces the shortest possible packet number encoding, which | produces the shortest possible packet number encoding, which | |||
| minimizes the perceived gap between the last packet that the server | minimizes the perceived gap between the last packet that the server | |||
| sent and this packet. A server MAY use a different short header | sent and this packet. A server MAY use a different short header | |||
| type, indicating a different packet number length, but a longer | type, indicating a different packet number length, but a longer | |||
| packet number encoding might allow this message to be identified as a | packet number encoding might allow this message to be identified as a | |||
| stateless reset more easily using heuristics. | stateless reset more easily using heuristics. | |||
| After the first short header octet and optional connection ID, the | After the first short header octet and optional connection ID, the | |||
| server includes the value of the Stateless Reset Token that it | server includes the value of the Stateless Reset Token that it | |||
| included in its transport parameters. | included in its transport parameters. | |||
| skipping to change at page 38, line 23 ¶ | skipping to change at page 42, line 32 ¶ | |||
| Stateless Reset Token. | Stateless Reset Token. | |||
| This design ensures that a stateless reset packet is - to the extent | This design ensures that a stateless reset packet is - to the extent | |||
| possible - indistinguishable from a regular packet. | possible - indistinguishable from a regular packet. | |||
| A stateless reset is not appropriate for signaling error conditions. | A stateless reset is not appropriate for signaling error conditions. | |||
| An endpoint that wishes to communicate a fatal connection error MUST | An endpoint that wishes to communicate a fatal connection error MUST | |||
| use a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has | use a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has | |||
| sufficient state to do so. | sufficient state to do so. | |||
| 7.8.4.1. Detecting a Stateless Reset | This stateless reset design is specific to QUIC version 1. A server | |||
| that supports multiple versions of QUIC needs to generate a stateless | ||||
| reset that will be accepted by clients that support any version that | ||||
| the server might support (or might have supported prior to losing | ||||
| state). Designers of new versions of QUIC need to be aware of this | ||||
| and either reuse this design, or use a portion of the packet other | ||||
| than the last 16 octets for carrying data. | ||||
| 7.9.4.1. Detecting a Stateless Reset | ||||
| A client detects a potential stateless reset when a packet with a | A client detects a potential stateless reset when a packet with a | |||
| short header either cannot be decrypted or is marked as a duplicate | short header either cannot be decrypted or is marked as a duplicate | |||
| packet. The client then compares the last 16 octets of the packet | packet. The client then compares the last 16 octets of the packet | |||
| with the Stateless Reset Token provided by the server in its | with the Stateless Reset Token provided by the server in its | |||
| transport parameters. If these values are identical, the client MUST | transport parameters. If these values are identical, the client MUST | |||
| enter the draining period and not send any further packets on this | enter the draining period and not send any further packets on this | |||
| connection. If the comparison fails, the packet can be discarded. | connection. If the comparison fails, the packet can be discarded. | |||
| 7.8.4.2. Calculating a Stateless Reset Token | 7.9.4.2. Calculating a Stateless Reset Token | |||
| The stateless reset token MUST be difficult to guess. In order to | The stateless reset token MUST be difficult to guess. In order to | |||
| create a Stateless Reset Token, a server could randomly generate | create a Stateless Reset Token, a server could randomly generate | |||
| [RFC4086] a secret for every connection that it creates. However, | [RFC4086] a secret for every connection that it creates. However, | |||
| this presents a coordination problem when there are multiple servers | this presents a coordination problem when there are multiple servers | |||
| in a cluster or a storage problem for a server that might lose state. | in a cluster or a storage problem for a server that might lose state. | |||
| Stateless reset specifically exists to handle the case where state is | Stateless reset specifically exists to handle the case where state is | |||
| lost, so this approach is suboptimal. | lost, so this approach is suboptimal. | |||
| A single static key can be used across all connections to the same | A single static key can be used across all connections to the same | |||
| skipping to change at page 39, line 34 ¶ | skipping to change at page 44, line 7 ¶ | |||
| Note that Stateless Reset messages do not have any cryptographic | Note that Stateless Reset messages do not have any cryptographic | |||
| protection. | protection. | |||
| 8. Frame Types and Formats | 8. Frame Types and Formats | |||
| 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. PADDING Frame | 8.1. Variable-Length Integer Encoding | |||
| QUIC frames use a common variable-length encoding for all non- | ||||
| negative integer values. This encoding ensures that smaller integer | ||||
| values need fewer octets to encode. | ||||
| The QUIC variable-length integer encoding reserves the two most | ||||
| significant bits of the first octet to encode the base 2 logarithm of | ||||
| the integer encoding length in octets. The integer value is encoded | ||||
| on the remaining bits, in network byte order. | ||||
| This means that integers are encoded on 1, 2, 4, or 8 octets and can | ||||
| encode 6, 14, 30, or 62 bit values respectively. Table 4 summarizes | ||||
| the encoding properties. | ||||
| +------+--------+-------------+-----------------------+ | ||||
| | 2Bit | Length | Usable Bits | Range | | ||||
| +------+--------+-------------+-----------------------+ | ||||
| | 00 | 1 | 6 | 0-63 | | ||||
| | | | | | | ||||
| | 01 | 2 | 14 | 0-16383 | | ||||
| | | | | | | ||||
| | 10 | 4 | 30 | 0-1073741823 | | ||||
| | | | | | | ||||
| | 11 | 8 | 62 | 0-4611686018427387903 | | ||||
| +------+--------+-------------+-----------------------+ | ||||
| Table 4: Summary of Integer Encodings | ||||
| For example, the eight octet sequence c2 19 7c 5e ff 14 e8 8c (in | ||||
| hexadecimal) decodes to the decimal value 151288809941952652; the | ||||
| four octet sequence 9d 7f 3e 7d decodes to 494878333; the two octet | ||||
| sequence 7b bd decodes to 15293; and the single octet 25 decodes to | ||||
| 37 (as does the two octet sequence 40 25). | ||||
| Error codes (Section 12.3) are described using integers, but do not | ||||
| use this encoding. | ||||
| 8.2. 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.2. RST_STREAM Frame | 8.3. 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. | terminate a stream. | |||
| After sending a RST_STREAM, an endpoint ceases transmission and | After sending a RST_STREAM, an endpoint ceases transmission and | |||
| retransmission of STREAM frames on the identified stream. A receiver | retransmission of STREAM frames on the identified stream. A receiver | |||
| of RST_STREAM can discard any data that it already received on that | of RST_STREAM can discard any data that it already received on that | |||
| stream. | stream. | |||
| The RST_STREAM frame is as follows: | 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (32) | | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Application Error Code (16) | | | Application Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | Final Offset (i) ... | |||
| + Final Offset (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Stream ID: The 32-bit Stream ID of the stream being terminated. | Stream ID: A variable-length integer encoding of the Stream ID of | |||
| the stream being terminated. | ||||
| Application Protocol Error Code: A 16-bit application protocol error | Application Protocol Error Code: A 16-bit application protocol error | |||
| code (see Section 12.4) which indicates why the stream is being | code (see Section 12.4) which indicates why the stream is being | |||
| closed. | closed. | |||
| Final Offset: A 64-bit unsigned integer indicating the absolute byte | Final Offset: A variable-length 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.3. CONNECTION_CLOSE frame | 8.4. 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. CONNECTION_CLOSE is used | peer that the connection is being closed. CONNECTION_CLOSE is used | |||
| to signal errors at the QUIC layer, or the absence of errors (with | to signal errors at the QUIC layer, or the absence of errors (with | |||
| the NO_ERROR code). | the NO_ERROR code). | |||
| If there are open streams that haven't been explicitly closed, they | If there are open streams that haven't been explicitly closed, they | |||
| are implicitly closed when the connection is closed. | are implicitly closed when the connection is closed. | |||
| The CONNECTION_CLOSE frame is as follows: | The CONNECTION_CLOSE 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 (16) | Reason Phrase Length (16) | | | Error Code (16) | Reason Phrase Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase (*) ... | | 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 16-bit error code which indicates the reason for | Error Code: A 16-bit error code which indicates the reason for | |||
| closing this connection. CONNECTION_CLOSE uses codes from the | closing this connection. CONNECTION_CLOSE uses codes from the | |||
| space defined in Section 12.3 (APPLICATION_CLOSE uses codes from | space defined in Section 12.3 (APPLICATION_CLOSE uses codes from | |||
| the application protocol error code space, see Section 12.4). | the application protocol error code space, see Section 12.4). | |||
| Reason Phrase Length: A 16-bit unsigned number specifying the length | Reason Phrase Length: A variable-length integer specifying the | |||
| of the reason phrase in bytes. Note that a CONNECTION_CLOSE frame | length of the reason phrase in bytes. Note that a | |||
| cannot be split between packets, so in practice any limits on | CONNECTION_CLOSE frame cannot be split between packets, so in | |||
| packet size will also limit the space available for a reason | practice any limits on packet size will also limit the space | |||
| phrase. | available for a reason phrase. | |||
| Reason Phrase: A human-readable explanation for why the connection | Reason Phrase: A human-readable explanation for why the connection | |||
| was closed. This can be zero length if the sender chooses to not | 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 | give details beyond the Error Code. This SHOULD be a UTF-8 | |||
| encoded string [RFC3629]. | encoded string [RFC3629]. | |||
| 8.4. APPLICATION_CLOSE frame | 8.5. APPLICATION_CLOSE frame | |||
| An APPLICATION_CLOSE frame (type=0x03) uses the same format as the | An APPLICATION_CLOSE frame (type=0x03) uses the same format as the | |||
| CONNECTION_CLOSE frame (Section 8.3), except that it uses error codes | CONNECTION_CLOSE frame (Section 8.4), except that it uses error codes | |||
| from the application protocol error code space (Section 12.4) instead | from the application protocol error code space (Section 12.4) instead | |||
| of the transport error code space. | of the transport error code space. | |||
| Other than the error code space, the format and semantics of the | Other than the error code space, the format and semantics of the | |||
| APPLICATION_CLOSE frame are identical to the CONNECTION_CLOSE frame. | APPLICATION_CLOSE frame are identical to the CONNECTION_CLOSE frame. | |||
| 8.5. MAX_DATA Frame | 8.6. MAX_DATA Frame | |||
| The MAX_DATA frame (type=0x04) is used in flow control to inform the | The MAX_DATA frame (type=0x04) is used in flow control to inform the | |||
| peer of the maximum amount of data that can be sent on the connection | peer of the maximum amount of data that can be sent on the connection | |||
| as a whole. | as a whole. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | Maximum Data (i) ... | |||
| + Maximum Data (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_DATA frame are as follows: | The fields in the MAX_DATA frame are as follows: | |||
| Maximum Data: A 64-bit unsigned integer indicating the maximum | Maximum Data: A variable-length integer indicating the maximum | |||
| amount of data that can be sent on the entire connection, in units | amount of data that can be sent on the entire connection, in units | |||
| of 1024 octets. That is, the updated connection-level data limit | of octets. | |||
| is determined by multiplying the encoded value by 1024. | ||||
| All data sent in STREAM frames counts toward this limit, with the | All data sent in STREAM frames counts toward this limit, with the | |||
| exception of data on stream 0. The sum of the largest received | exception of data on stream 0. The sum of the largest received | |||
| offsets on all streams - including closed streams, but excluding | offsets on all streams - including streams in terminal states, but | |||
| stream 0 - MUST NOT exceed the value advertised by a receiver. An | excluding stream 0 - MUST NOT exceed the value advertised by a | |||
| endpoint MUST terminate a connection with a | receiver. An endpoint MUST terminate a connection with a | |||
| QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA error if it receives more | 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 | 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.4.2). | result of a change in the initial limits (see Section 7.4.2). | |||
| 8.6. MAX_STREAM_DATA Frame | 8.7. MAX_STREAM_DATA Frame | |||
| The MAX_STREAM_DATA frame (type=0x05) is used in flow control to | 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 | inform a peer of the maximum amount of data that can be sent on a | |||
| stream. | 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 (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | Maximum Stream Data (i) ... | |||
| + Maximum Stream Data (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_STREAM_DATA frame are as follows: | The fields in the MAX_STREAM_DATA frame are as follows: | |||
| Stream ID: The stream ID of the stream that is affected. | Stream ID: The stream ID of the stream that is affected encoded as a | |||
| variable-length integer. | ||||
| Maximum Stream Data: A 64-bit unsigned integer indicating the | Maximum Stream Data: A variable-length integer indicating the | |||
| maximum amount of data that can be sent on the identified stream, | maximum amount of data that can be sent on the identified stream, | |||
| in units of octets. | in units of octets. | |||
| When counting data toward this limit, an endpoint accounts for the | When counting data toward this limit, an endpoint accounts for the | |||
| largest received offset of data that is sent or received on the | largest received offset of data that is sent or received on the | |||
| stream. Loss or reordering can mean that the largest received offset | 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 | on a stream can be greater than the total size of data received on | |||
| that stream. Receiving STREAM frames might not increase the largest | that stream. Receiving STREAM frames might not increase the largest | |||
| received offset. | received offset. | |||
| The data sent on a stream MUST NOT exceed the largest maximum stream | The data sent on a stream MUST NOT exceed the largest maximum stream | |||
| data value advertised by the receiver. An endpoint MUST terminate a | data value advertised by the receiver. An endpoint MUST terminate a | |||
| connection with a FLOW_CONTROL_ERROR error if it receives more data | connection with a FLOW_CONTROL_ERROR error if it receives more data | |||
| than the largest maximum stream data that it has sent for the | 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 | affected stream, unless this is a result of a change in the initial | |||
| limits (see Section 7.4.2). | limits (see Section 7.4.2). | |||
| 8.7. MAX_STREAM_ID Frame | 8.8. MAX_STREAM_ID Frame | |||
| The MAX_STREAM_ID frame (type=0x06) informs the peer of the maximum | The MAX_STREAM_ID frame (type=0x06) informs the peer of the maximum | |||
| stream ID that they are permitted to open. | stream ID that they are permitted to open. | |||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Stream ID (32) | | | Maximum Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_STREAM_ID frame are as follows: | The fields in the MAX_STREAM_ID frame are as follows: | |||
| Maximum Stream ID: ID of the maximum peer-initiated stream ID for | Maximum Stream ID: ID of the maximum unidirectional or bidirectional | |||
| the connection. | peer-initiated stream ID for the connection encoded as a variable- | |||
| length integer. The limit applies to unidirectional steams if the | ||||
| second least signification bit of the stream ID is 1, and applies | ||||
| to bidirectional streams if it is 0. | ||||
| Loss or reordering can mean that a MAX_STREAM_ID frame can be | Loss or reordering can mean that a MAX_STREAM_ID frame can be | |||
| received which states a lower stream limit than the client has | received which states a lower stream limit than the client has | |||
| previously received. MAX_STREAM_ID frames which do not increase the | previously received. MAX_STREAM_ID frames which do not increase the | |||
| maximum stream ID MUST be ignored. | maximum stream ID MUST be ignored. | |||
| A peer MUST NOT initiate a stream with a higher stream ID than the | A peer MUST NOT initiate a stream with a higher stream ID than the | |||
| greatest maximum stream ID it has received. An endpoint MUST | greatest maximum stream ID it has received. An endpoint MUST | |||
| terminate a connection with a STREAM_ID_ERROR error if a peer | terminate a connection with a STREAM_ID_ERROR error if a peer | |||
| initiates a stream with a higher stream ID than it has sent, unless | 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 | this is a result of a change in the initial limits (see | |||
| Section 7.4.2). | Section 7.4.2). | |||
| 8.8. PING frame | 8.9. 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. | |||
| contains no additional fields. The receiver of a PING frame simply | ||||
| needs to acknowledge the packet containing this frame. | ||||
| A PING frame has no additional fields. | The PING frame contains a variable-length payload. | |||
| The PING frame can be used to keep a connection alive when an | 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Length(8) | Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Length: This 8-bit value describes the length of the Data field. | ||||
| Data: This variable-length field contains arbitrary data. | ||||
| A PING frame with an empty Data field causes the packet containing it | ||||
| to be acknowledged as normal. No other action is required of the | ||||
| recipient. | ||||
| An empty PING frame can be used to keep a connection alive when an | ||||
| application or application protocol wishes to prevent the connection | application or application protocol wishes to prevent the connection | |||
| from timing out. An application protocol SHOULD provide guidance | from timing out. An application protocol SHOULD provide guidance | |||
| about the conditions under which generating a PING is recommended. | about the conditions under which generating a PING is recommended. | |||
| This guidance SHOULD indicate whether it is the client or the server | This guidance SHOULD indicate whether it is the client or the server | |||
| that is expected to send the PING. Having both endpoints send PING | that is expected to send the PING. Having both endpoints send PING | |||
| frames without coordination can produce an excessive number of | frames without coordination can produce an excessive number of | |||
| packets and poor performance. | packets and poor performance. | |||
| If the Data field is not empty, the recipient of this frame MUST | ||||
| generate a PONG frame (Section 8.15) containing the same Data. A | ||||
| PING frame with data is not appropriate for use in keeping a | ||||
| connection alive, because the PONG frame elicits an acknowledgement, | ||||
| causing the sender of the original PING to send two packets. | ||||
| A connection will time out if no packets are sent or received for a | A connection will time out if no packets are sent or received for a | |||
| period longer than the time specified in the idle_timeout transport | period longer than the time specified in the idle_timeout transport | |||
| parameter (see Section 7.8). However, state in middleboxes might | parameter (see Section 7.9). However, state in middleboxes might | |||
| time out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | time out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | |||
| minute timeout interval, experience shows that sending packets every | minute timeout interval, experience shows that sending packets every | |||
| 15 to 30 seconds is necessary to prevent the majority of middleboxes | 15 to 30 seconds is necessary to prevent the majority of middleboxes | |||
| from losing state for UDP flows. | from losing state for UDP flows. | |||
| 8.9. BLOCKED Frame | 8.10. BLOCKED Frame | |||
| A sender sends a BLOCKED frame (type=0x08) when it wishes to send | A sender SHOULD send a BLOCKED frame (type=0x08) when it wishes to | |||
| data, but is unable to due to connection-level flow control (see | send data, but is unable to due to connection-level flow control (see | |||
| Section 11.2.1). BLOCKED frames can be used as input to tuning of | Section 11.2.1). BLOCKED frames can be used as input to tuning of | |||
| flow control algorithms (see Section 11.1.2). | flow control algorithms (see Section 11.1.2). | |||
| The BLOCKED frame does not contain a payload. | The BLOCKED frame is as follows: | |||
| 8.10. STREAM_BLOCKED Frame | 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Offset (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| A sender sends a STREAM_BLOCKED frame (type=0x09) when it wishes to | The BLOCKED frame contains a single field. | |||
| send data, but is unable to due to stream-level flow control. This | ||||
| frame is analogous to BLOCKED (Section 8.9). | Offset: A variable-length integer indicating the connection-level | |||
| offset at which the blocking occurred. | ||||
| 8.11. STREAM_BLOCKED Frame | ||||
| A sender SHOULD send 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.10). | ||||
| The STREAM_BLOCKED frame is as follows: | 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 (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Offset (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The STREAM_BLOCKED frame contains a single field: | The STREAM_BLOCKED frame contains two fields: | |||
| Stream ID: A 32-bit unsigned number indicating the stream which is | Stream ID: A variable-length integer indicating the stream which is | |||
| flow control blocked. | flow control blocked. | |||
| 8.11. STREAM_ID_BLOCKED Frame | Offset: A variable-length integer indicating the offset of the | |||
| stream at which the blocking occurred. | ||||
| 8.12. STREAM_ID_BLOCKED Frame | ||||
| A sender MAY send a STREAM_ID_BLOCKED frame (type=0x0a) when it | A sender MAY send a STREAM_ID_BLOCKED frame (type=0x0a) when it | |||
| wishes to open a stream, but is unable to due to the maximum stream | wishes to open a stream, but is unable to due to the maximum stream | |||
| ID limit set by its peer (see Section 8.7). This does not open the | ID limit set by its peer (see Section 8.8). This does not open the | |||
| stream, but informs the peer that a new stream was needed, but the | stream, but informs the peer that a new stream was needed, but the | |||
| stream limit prevented the creation of the stream. | stream limit prevented the creation of the stream. | |||
| The STREAM_ID_BLOCKED frame does not contain a payload. | The STREAM_ID_BLOCKED frame is as follows: | |||
| 8.12. NEW_CONNECTION_ID Frame | 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The STREAM_ID_BLOCKED frame contains a single field. | ||||
| Stream ID: A variable-length integer indicating the highest stream | ||||
| ID that the sender was permitted to open. | ||||
| 8.13. NEW_CONNECTION_ID Frame | ||||
| A server sends a NEW_CONNECTION_ID frame (type=0x0b) to provide the | A server sends a NEW_CONNECTION_ID frame (type=0x0b) to provide the | |||
| client with alternative connection IDs that can be used to break | client with alternative connection IDs that can be used to break | |||
| linkability when migrating connections (see Section 7.7.1). | linkability when migrating connections (see Section 7.7.1). | |||
| The NEW_CONNECTION_ID is as follows: | The NEW_CONNECTION_ID 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Sequence (16) | | | Sequence (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Connection ID (64) + | + Connection ID (64) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Sequence: A 16-bit sequence number. This value starts at 0 and | Sequence: A variable-length integer. This value starts at 0 and | |||
| increases by 1 for each connection ID that is provided by the | increases by 1 for each connection ID that is provided by the | |||
| server. The sequence value can wrap; the value 65535 is followed | server. The connection ID that is assigned during the handshake | |||
| by 0. When wrapping the sequence field, the server MUST ensure | is assumed to have a sequence of -1. That is, the value selected | |||
| that a value with the same sequence has been received and | during the handshake comes immediately before the first value that | |||
| acknowledged by the client. The connection ID that is assigned | a server can send. | |||
| during the handshake is assumed to have a sequence of 65535. | ||||
| Connection ID: A 64-bit connection ID. | Connection ID: A 64-bit connection ID. | |||
| Stateless Reset Token: A 128-bit value that will be used to for a | Stateless Reset Token: A 128-bit value that will be used to for a | |||
| stateless reset when the associated connection ID is used (see | stateless reset when the associated connection ID is used (see | |||
| Section 7.8.4). | Section 7.9.4). | |||
| 8.13. STOP_SENDING Frame | 8.14. STOP_SENDING Frame | |||
| An endpoint may use a STOP_SENDING frame (type=0x0c) to communicate | An endpoint may use a STOP_SENDING frame (type=0x0c) to communicate | |||
| that incoming data is being discarded on receipt at application | that incoming data is being discarded on receipt at application | |||
| request. This signals a peer to abruptly terminate transmission on a | request. This signals a peer to abruptly terminate transmission on a | |||
| stream. | stream. | |||
| The STOP_SENDING frame is as follows: | The STOP_SENDING 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 (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Application Error Code (16) | | | Application Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Stream ID: The 32-bit Stream ID of the stream being ignored. | Stream ID: A variable-length integer carrying the Stream ID of the | |||
| stream being ignored. | ||||
| Application Error Code: A 16-bit, application-specified reason the | Application Error Code: A 16-bit, application-specified reason the | |||
| sender is ignoring the stream (see Section 12.4). | sender is ignoring the stream (see Section 12.4). | |||
| 8.14. ACK Frame | 8.15. PONG Frame | |||
| Receivers send ACK frames to inform senders which packets they have | The PONG frame (type=0x0d) is sent in response to a PING frame that | |||
| received and processed, as well as which packets are considered | contains data. Its format is identical to the PING frame | |||
| missing. The ACK frame contains between 1 and 256 ACK blocks. ACK | (Section 8.9). | |||
| blocks are ranges of acknowledged packets. Implementations MUST NOT | ||||
| generate packets that only contain ACK frames in response to packets | ||||
| which only contain ACK frames. However, they SHOULD acknowledge | ||||
| packets containing only ACK frames when sending ACK frames in | ||||
| response to other packets. | ||||
| To limit ACK blocks to those that have not yet been received by the | An endpoint that receives an unsolicited PONG frame - that is, a PONG | |||
| sender, the receiver SHOULD track which ACK frames have been | frame containing a payload that is empty MUST generate a connection | |||
| acknowledged by its peer. Once an ACK frame has been acknowledged, | error of type FRAME_ERROR, indicating the PONG frame (that is, | |||
| the packets it acknowledges SHOULD NOT be acknowledged again. | 0x10d). If the content of a PONG frame does not match the content of | |||
| a PING frame previously sent by the endpoint, the endpoint MAY | ||||
| generate a connection error of type UNSOLICITED_PONG. | ||||
| A receiver that is only sending ACK frames will not receive | 8.16. ACK Frame | |||
| 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 | Receivers send ACK frames (type=0xe) to inform senders which packets | |||
| limit the number of ACK blocks it sends. A receiver can do this even | they have received and processed. A sent packet that has never been | |||
| without receiving acknowledgment of its ACK frames, with the | acknowledged is missing. The ACK frame contains any number of ACK | |||
| knowledge this could cause the sender to unnecessarily retransmit | blocks. ACK blocks are ranges of acknowledged packets. | |||
| 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 irrevocable. Once a packet has | Unlike TCP SACKs, QUIC acknowledgements are irrevocable. Once a | |||
| been acknowledged, even if it does not appear in a future ACK frame, | packet has been acknowledged, even if it does not appear in a future | |||
| it remains acknowledged. | ACK frame, it remains acknowledged. | |||
| A client MUST NOT acknowledge Version Negotiation or Server Stateless | A client MUST NOT acknowledge Version Negotiation or Retry packets. | |||
| Retry packets. These packet types contain packet numbers selected by | These packet types contain packet numbers selected by the client, not | |||
| the client, not the server. | the server. | |||
| 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 SHOULD close the connection if an unsent packet number is | The sender SHOULD 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 | even long blocks of missing packets, allowing for large, | |||
| effectively provides up to 8 bits of efficient entropy on demand, | unpredictable gaps. | |||
| which should be adequate protection against most opportunistic | ||||
| acknowledgement attacks. | ||||
| The type byte for a ACK frame contains embedded flags, and is | ||||
| formatted as "101NLLMM". These bits are parsed as follows: | ||||
| o The first three bits must be set to 101 indicating that this is an | ||||
| ACK frame. | ||||
| o The "N" bit indicates whether the frame contains a Num Blocks | ||||
| field. | ||||
| o The two "LL" bits encode the length of the Largest Acknowledged | ||||
| field. The values 00, 01, 02, and 03 indicate lengths of 8, 16, | ||||
| 32, and 64 bits respectively. | ||||
| o The two "MM" bits encode the length of the ACK Block Length | ||||
| fields. The values 00, 01, 02, and 03 indicate lengths of 8, 16, | ||||
| 32, and 64 bits respectively. | ||||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |[Num Blocks(8)]| | | Largest Acknowledged (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Largest Acknowledged (8/16/32/64) ... | | ACK Delay (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Delay (16) | | | ACK Block Count (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Block Section (*) ... | | ACK Blocks (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: ACK Frame Format | Figure 7: ACK Frame Format | |||
| The fields in the ACK frame are as follows: | The fields in the ACK frame are as follows: | |||
| Num Blocks (opt): An optional 8-bit unsigned value specifying the | Largest Acknowledged: A variable-length integer representing the | |||
| number of additional ACK blocks (besides the required First ACK | largest packet number the peer is acknowledging; this is usually | |||
| Block) in this ACK frame. Only present if the 'N' flag bit is 1. | the largest packet number that the peer has received prior to | |||
| generating the ACK frame. | ||||
| Largest Acknowledged: A variable-sized unsigned value representing | ACK Delay: A variable-length integer including the time in | |||
| the largest packet number the peer is acknowledging in this packet | microseconds that the largest acknowledged packet, as indicated in | |||
| (typically the largest that the peer has seen thus far.) | the Largest Acknowledged field, was received by this peer to when | |||
| this ACK was sent. The value of the ACK Delay field is scaled by | ||||
| multiplying the encoded value by the 2 to the power of the value | ||||
| of the "ack_delay_exponent" transport parameter set by the sender | ||||
| of the ACK frame. The "ack_delay_exponent" defaults to 3, or a | ||||
| multiplier of 8 (see Section 7.4.1). Scaling in this fashion | ||||
| allows for a larger range of values with a shorter encoding at the | ||||
| cost of lower resolution. | ||||
| ACK Delay: The time from when the largest acknowledged packet, as | ACK Block Count: The number of Additional ACK Block (and Gap) fields | |||
| indicated in the Largest Acknowledged field, was received by this | after the First ACK Block. | |||
| peer to when this ACK was sent. | ||||
| ACK Block Section: Contains one or more blocks of packet numbers | ACK Blocks: Contains one or more blocks of packet numbers which have | |||
| which have been successfully received, see Section 8.14.1. | been successfully received, see Section 8.16.1. | |||
| 8.14.1. ACK Block Section | 8.16.1. ACK Block Section | |||
| The ACK Block Section contains between one and 256 blocks of packet | The ACK Block Section consists of alternating Gap and ACK Block | |||
| numbers which have been successfully received. If the Num Blocks | fields in descending packet number order. A First Ack Block field is | |||
| field is absent, only the First ACK Block length is present in this | followed by a variable number of alternating Gap and Additional ACK | |||
| section. Otherwise, the Num Blocks field indicates how many | Blocks. The number of Gap and Additional ACK Block fields is | |||
| additional blocks follow the First ACK Block Length field. | determined by the ACK Block Count field. | |||
| Gap and ACK Block fields use a relative integer encoding for | ||||
| efficiency. Though each encoded value is positive, the values are | ||||
| subtracted, so that each ACK Block describes progressively lower- | ||||
| numbered packets. As long as contiguous ranges of packets are small, | ||||
| the variable-length integer encoding ensures that each range can be | ||||
| expressed in a small number of octets. | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | First ACK Block Length (8/16/32/64) ... | | First ACK Block (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap 1 (8)] | [ACK Block 1 Length (8/16/32/64)] ... | | Gap (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap 2 (8)] | [ACK Block 2 Length (8/16/32/64)] ... | | Additional ACK Block (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | | Gap (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Gap N (8)] | [ACK Block N Length (8/16/32/64)] ... | | Additional ACK Block (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: ACK Block Section | Figure 8: ACK Block Section | |||
| Each ACK Block acknowledges a contiguous range of packets by | ||||
| indicating the number of acknowledged packets that precede the | ||||
| largest packet number in that block. A value of zero indicates that | ||||
| only the largest packet number is acknowledged. Larger ACK Block | ||||
| values indicate a larger range, with corresponding lower values for | ||||
| the smallest packet number in the range. Thus, given a largest | ||||
| packet number for the ACK, the smallest value is determined by the | ||||
| formula: | ||||
| smallest = largest - ack_block | ||||
| The range of packets that are acknowledged by the ACK block include | ||||
| the range from the smallest packet number to the largest, inclusive. | ||||
| The largest value for the First ACK Block is determined by the | ||||
| Largest Acknowledged field; the largest for Additional ACK Blocks is | ||||
| determined by cumulatively subtracting the size of all preceding ACK | ||||
| Blocks and Gaps. | ||||
| Each Gap indicates a range of packets that are not being | ||||
| acknowledged. The number of packets in the gap is one higher than | ||||
| the encoded value of the Gap Field. | ||||
| The value of the Gap field establishes the largest packet number | ||||
| value for the ACK block that follows the gap using the following | ||||
| formula: | ||||
| largest = previous_smallest - gap - 2 | ||||
| If the calculated value for largest or smallest packet number for any | ||||
| ACK Block is negative, an endpoint MUST generate a connection error | ||||
| of type FRAME_ERROR indicating an error in an ACK frame (that is, | ||||
| 0x10d). | ||||
| The fields in the ACK Block Section are: | The fields in the ACK Block Section are: | |||
| First ACK Block Length: An unsigned packet number delta that | First ACK Block: A variable-length integer indicating the number of | |||
| indicates the number of contiguous additional packets being | contiguous packets preceding the Largest Acknowledged that are | |||
| acknowledged starting at the Largest Acknowledged. | being acknowledged. | |||
| Gap To Next Block (opt, repeated): An unsigned number specifying the | Gap (repeated): A variable-length integer indicating the number of | |||
| number of contiguous missing packets from the end of the previous | contiguous unacknowledged packets preceding the packet number one | |||
| ACK block to the start of the next. Repeated "Num Blocks" times. | lower than the smallest in the preceding ACK Block. | |||
| ACK Block Length (opt, repeated): An unsigned packet number delta | ACK Block (repeated): A variable-length integer indicating the | |||
| that indicates the number of contiguous packets being acknowledged | number of contiguous acknowledged packets preceding the largest | |||
| starting after the end of the previous gap. Repeated "Num Blocks" | packet number, as determined by the preceding Gap. | |||
| times. | ||||
| 8.14.1.1. Time Format | 8.16.2. Sending ACK Frames | |||
| DISCUSS_AND_REPLACE: Perhaps make this format simpler. | Implementations MUST NOT generate packets that only contain ACK | |||
| frames in response to packets which only contain ACK frames. | ||||
| However, they MUST acknowledge packets containing only ACK frames | ||||
| when sending ACK frames in response to other packets. | ||||
| Implementations MUST NOT send more than one ACK frame per received | ||||
| packet that contains frames other than ACK frames. Packets | ||||
| containing non-ACK frames MUST be acknowledged immediately or when a | ||||
| delayed ack timer expires. | ||||
| The time format used in the ACK frame above is a 16-bit unsigned | To limit ACK blocks to those that have not yet been received by the | |||
| float with 11 explicit bits of mantissa and 5 bits of explicit | sender, the receiver SHOULD track which ACK frames have been | |||
| exponent, specifying time in microseconds. The bit format is loosely | acknowledged by its peer. Once an ACK frame has been acknowledged, | |||
| modeled after IEEE 754. For example, 1 microsecond is represented as | the packets it acknowledges SHOULD NOT be acknowledged again. | |||
| 0x1, which has an exponent of zero, presented in the 5 high order | ||||
| bits, and mantissa of 1, presented in the 11 low order bits. When | ||||
| the explicit exponent is greater than zero, an implicit high-order | ||||
| 12th bit of 1 is assumed in the mantissa. For example, a floating | ||||
| value of 0x800 has an explicit exponent of 1, as well as an explicit | ||||
| mantissa of 0, but then has an effective mantissa of 4096 (12th bit | ||||
| is assumed to be 1). Additionally, the actual exponent is one-less | ||||
| than the explicit exponent, and the value represents 4096 | ||||
| microseconds. Any values larger than the representable range are | ||||
| clamped to 0xFFFF. | ||||
| 8.14.2. ACK Frames and Packet Protection | A receiver that is only sending ACK frames will not receive | |||
| 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 | ||||
| limit the number of ACK blocks it sends. A receiver can do this even | ||||
| without receiving acknowledgment of its ACK frames, with the | ||||
| knowledge this could cause the sender to unnecessarily retransmit | ||||
| some data. Standard QUIC [QUIC-RECOVERY] algorithms declare packets | ||||
| lost after sufficiently newer packets are acknowledged. Therefore, | ||||
| the receiver SHOULD repeatedly acknowledge newly received packets in | ||||
| preference to packets received in the past. | ||||
| 8.16.3. ACK Frames and Packet Protection | ||||
| ACK frames that acknowledge protected packets MUST be carried in a | ACK frames that acknowledge protected packets MUST be carried in a | |||
| packet that has an equivalent or greater level of packet protection. | packet that has an equivalent or greater level of packet protection. | |||
| Packets that are protected with 1-RTT keys MUST be acknowledged in | Packets that are protected with 1-RTT keys MUST be acknowledged in | |||
| packets that are also protected with 1-RTT keys. | packets that are also protected with 1-RTT keys. | |||
| A packet that is not protected and claims to acknowledge a packet | A packet that is not protected and claims to acknowledge a packet | |||
| number that was sent with packet protection is not valid. An | number that was sent with packet protection is not valid. An | |||
| unprotected packet that carries acknowledgments for protected packets | unprotected packet that carries acknowledgments for protected packets | |||
| skipping to change at page 51, line 5 ¶ | skipping to change at page 58, line 5 ¶ | |||
| 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.15. STREAM Frame | 8.17. STREAM Frames | |||
| 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 | STREAM frame takes the form 0b00010XXX (or the set of values from | |||
| formatted as "11FSSOOD". These bits are parsed as follows: | 0x10 to 0x17). The value of the three low-order bits of the frame | |||
| type determine the fields that are present in the frame. | ||||
| o The first two bits must be set to 11, indicating that this is a | ||||
| STREAM frame. | ||||
| o "F" is the FIN bit, which is used for stream termination. | ||||
| o The "SS" bits encode the length of the Stream ID header field. | o The FIN bit (0x01) of the frame type is set only on frames that | |||
| The values 00, 01, 02, and 03 indicate lengths of 8, 16, 24, and | contain the final offset of the stream. Setting this bit | |||
| 32 bits long respectively. | indicates that the frame marks the end of the stream. | |||
| o The "OO" bits encode the length of the Offset header field. The | o The LEN bit (0x02) in the frame type is set to indicate that there | |||
| values 00, 01, 02, and 03 indicate lengths of 0, 16, 32, and 64 | is a Length field present. If this bit is set to 0, the Length | |||
| bits long respectively. | field is absent and the Stream Data field extends to the end of | |||
| the packet. If this bit is set to 1, the Length field is present. | ||||
| o The "D" bit indicates whether a Data Length field is present in | o The OFF bit (0x04) in the frame type is set to indicate that there | |||
| the STREAM header. When set to 0, this field indicates that the | is an Offset field present. When set to 1, the Offset field is | |||
| Stream Data field extends to the end of the packet. When set to | present; when set to 0, the Offset field is absent and the Stream | |||
| 1, this field indicates that Data Length field contains the length | Data starts at an offset of 0 (that is, the frame contains the | |||
| (in bytes) of the Stream Data field. The option to omit the | first octets of the stream, or the end of a stream that includes | |||
| length should only be used when the packet is a "full-sized" | no data). | |||
| packet, to avoid the risk of corruption via padding. | ||||
| 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (8/16/24/32) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (0/16/32/64) ... | | [Offset (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Data Length (16)] | Stream Data (*) ... | | [Length (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: STREAM Frame Format | Figure 9: STREAM Frame Format | |||
| The STREAM frame contains the following fields: | The STREAM frame contains the following fields: | |||
| Stream ID: The stream ID of the stream (see Section 10.1). | Stream ID: A variable-length integer indicating the stream ID of the | |||
| stream (see Section 10.1). | ||||
| Offset: A variable-sized unsigned number specifying the byte offset | Offset: A variable-length integer specifying the byte offset in the | |||
| in the stream for the data in this STREAM frame. When the offset | stream for the data in this STREAM frame. This field is present | |||
| length is 0, the offset is 0. The first byte in the stream has an | when the OFF bit is set to 1. When the Offset field is absent, | |||
| offset of 0. The largest offset delivered on a stream - the sum | the offset is 0. | |||
| of the re-constructed offset and data length - MUST be less than | ||||
| 2^64. | ||||
| Data Length: An optional 16-bit unsigned number specifying the | Length: A variable-length integer specifying the length of the | |||
| length of the Stream Data field in this STREAM frame. This field | Stream Data field in this STREAM frame. This field is present | |||
| is present when the "D" bit is set to 1. | when the LEN bit is set to 1. When the LEN bit is set to 0, the | |||
| Stream Data field consumes all the remaining octets in the packet. | ||||
| 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's Stream Data MUST NOT be empty, unless the FIN bit is | A stream frame's Stream Data MUST NOT be empty, unless the FIN bit is | |||
| set. When the FIN flag is sent on an empty STREAM frame, the offset | set. When the FIN flag is sent on an empty STREAM frame, the offset | |||
| in the STREAM frame is the offset of the next byte that would be | in the STREAM frame is the offset of the next byte that would be | |||
| sent. | sent. | |||
| The first byte in the stream has an offset of 0. The largest offset | ||||
| delivered on a stream - the sum of the re-constructed offset and data | ||||
| length - MUST be less than 2^62. | ||||
| 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 | |||
| can include multiple STREAM frames from one or more streams. | can include multiple STREAM frames from one or more streams. | |||
| Implementation note: One of the benefits of QUIC is avoidance of | Implementation note: One of the benefits of QUIC is avoidance of | |||
| head-of-line blocking across multiple streams. When a packet loss | head-of-line blocking across multiple streams. When a packet loss | |||
| occurs, only streams with data in that packet are blocked waiting for | occurs, only streams with data in that packet are blocked waiting for | |||
| a retransmission to be received, while other streams can continue | a retransmission to be received, while other streams can continue | |||
| making progress. Note that when data from multiple streams is | making progress. Note that when data from multiple streams is | |||
| bundled into a single QUIC packet, loss of that packet blocks all | bundled into a single QUIC packet, loss of that packet blocks all | |||
| skipping to change at page 54, line 19 ¶ | skipping to change at page 61, line 19 ¶ | |||
| necessary: | necessary: | |||
| o All application data sent in STREAM frames MUST be retransmitted, | o All application data sent in STREAM frames MUST be retransmitted, | |||
| unless the endpoint has sent a RST_STREAM for that stream. When | unless the endpoint has sent a RST_STREAM for that stream. When | |||
| an endpoint sends a RST_STREAM frame, data outstanding on that | an endpoint sends a RST_STREAM frame, data outstanding on that | |||
| stream SHOULD NOT be retransmitted, since subsequent data on this | stream SHOULD NOT be retransmitted, since subsequent data on this | |||
| stream is expected to not be delivered by the receiver. | stream is expected to not be delivered by the receiver. | |||
| o ACK and PADDING frames MUST NOT be retransmitted. ACK frames | o ACK and PADDING frames MUST NOT be retransmitted. ACK frames | |||
| containing updated information will be sent as described in | containing updated information will be sent as described in | |||
| Section 8.14. | Section 8.16. | |||
| o STOP_SENDING frames MUST be retransmitted, unless the stream has | o STOP_SENDING frames MUST be retransmitted until the receive stream | |||
| become closed in the appropriate direction. See Section 10.3. | enters either a "Data Recvd" or "Reset Recvd" state. See | |||
| Section 10.3. | ||||
| o The most recent MAX_STREAM_DATA frame for a stream MUST be | o The most recent MAX_STREAM_DATA frame for a stream MUST be | |||
| retransmitted. Any previous unacknowledged MAX_STREAM_DATA frame | retransmitted until the receive stream enters a "Size Known" | |||
| for the same stream SHOULD NOT be retransmitted since a newer | state. Any previous unacknowledged MAX_STREAM_DATA frame for the | |||
| same stream SHOULD NOT be retransmitted since a newer | ||||
| MAX_STREAM_DATA frame for a stream obviates the need for | MAX_STREAM_DATA frame for a stream obviates the need for | |||
| delivering older ones. Similarly, the most recent MAX_DATA frame | delivering older ones. Similarly, the most recent MAX_DATA frame | |||
| MUST be retransmitted; previous unacknowledged ones SHOULD NOT be | MUST be retransmitted; previous unacknowledged ones SHOULD NOT be | |||
| retransmitted. | retransmitted. | |||
| o BLOCKED, STREAM_BLOCKED, and STREAM_ID_BLOCKED frames SHOULD be | ||||
| retransmitted if the sender is still blocked on the same limit. | ||||
| If the limit has been increased since the frame was originally | ||||
| sent, the frame SHOULD NOT be retransmitted. | ||||
| o All other frames MUST be retransmitted. | o All other frames MUST be retransmitted. | |||
| Upon detecting losses, a sender MUST take appropriate congestion | Upon detecting losses, a sender MUST take appropriate congestion | |||
| control action. The details of loss detection and congestion control | control action. The details of loss detection and congestion control | |||
| are described in [QUIC-RECOVERY]. | are described in [QUIC-RECOVERY]. | |||
| A packet MUST NOT be acknowledged until packet protection has been | A packet MUST NOT be acknowledged until packet protection has been | |||
| successfully removed and all frames contained in the packet have been | successfully removed and all frames contained in the packet have been | |||
| processed. For STREAM frames, this means the data has been queued | processed. For STREAM frames, this means the data has been queued | |||
| (but not necessarily delivered to the application). This also means | (but not necessarily delivered to the application). This also means | |||
| skipping to change at page 55, line 38 ¶ | skipping to change at page 62, line 46 ¶ | |||
| o Store additional information from the IP or UDP headers from DF | o Store additional information from the IP or UDP headers from DF | |||
| packets (for example, the IP ID or UDP checksum) to further | packets (for example, the IP ID or UDP checksum) to further | |||
| authenticate incoming Datagram Too Big messages. | authenticate incoming Datagram Too Big messages. | |||
| o Any reduction in PMTU due to a report contained in an ICMP packet | o Any reduction in PMTU due to a report contained in an ICMP packet | |||
| is provisional until QUIC's loss detection algorithm determines | is provisional until QUIC's loss detection algorithm determines | |||
| that the packet is actually lost. | that the packet is actually lost. | |||
| 10. Streams: QUIC's Data Structuring Abstraction | 10. Streams: QUIC's Data Structuring Abstraction | |||
| Streams in QUIC provide a lightweight, ordered, and bidirectional | Streams in QUIC provide a lightweight, ordered byte-stream | |||
| byte-stream abstraction modeled closely on HTTP/2 streams [RFC7540]. | abstraction. | |||
| Streams can be created either by the client or the server, can | There are two basic types of stream in QUIC. Unidirectional streams | |||
| carry data in one direction only; bidirectional streams allow for | ||||
| data to be sent in both directions. Different stream identifiers are | ||||
| used to distinguish between unidirectional and bidirectional streams, | ||||
| as well as to create a separation between streams that are initiated | ||||
| by the client and server (see Section 10.1). | ||||
| Either type of stream can be created by either endpoint, can | ||||
| concurrently send data interleaved with other streams, and can be | concurrently send data interleaved with other streams, and can be | |||
| cancelled. | cancelled. | |||
| 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 | |||
| skipping to change at page 56, line 17 ¶ | skipping to change at page 63, line 33 ¶ | |||
| streams is also flow controlled, with each peer declaring the maximum | streams is also flow controlled, with each peer declaring the maximum | |||
| stream ID it is willing to accept at a given time. | 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. Stream Identifiers | 10.1. Stream Identifiers | |||
| Streams are identified by an unsigned 32-bit integer, referred to as | Streams are identified by an unsigned 62-bit integer, referred to as | |||
| the Stream ID. To avoid Stream ID collision, clients MUST initiate | the Stream ID. The least significant two bits of the Stream ID are | |||
| streams using odd-numbered Stream IDs; servers MUST initiate streams | used to identify the type of stream (unidirectional or bidirectional) | |||
| using even-numbered Stream IDs. If an endpoint receives a frame | and the initiator of the stream. | |||
| which corresponds to a stream which is allocated to it (i.e., odd- | ||||
| numbered for the client or even-numbered for the server) but which it | ||||
| has not yet created, it MUST close the connection with error code | ||||
| STREAM_STATE_ERROR. | ||||
| Stream ID 0 (0x0) is reserved for the cryptographic handshake. | The least significant bit (0x1) of the Stream ID identifies the | |||
| Stream 0 MUST NOT be used for application data, and is the first | initiator of the stream. Clients initiate even-numbered streams | |||
| client-initiated stream. | (those with the least significant bit set to 0); servers initiate | |||
| odd-numbered streams (with the bit set to 1). Separation of the | ||||
| stream identifiers ensures that client and server are able to open | ||||
| streams without the latency imposed by negotiating for an identifier. | ||||
| A QUIC endpoint MUST NOT reuse a Stream ID. Streams MUST be created | If an endpoint receives a frame for a stream that it expects to | |||
| in sequential order. Open streams can be used in any order. Streams | initiate (i.e., odd-numbered for the client or even-numbered for the | |||
| that are used out of order result in lower-numbered streams in the | server), but which it has not yet opened, it MUST close the | |||
| same direction being counted as open. | connection with error code STREAM_STATE_ERROR. | |||
| Stream IDs are usually encoded as a 32-bit integer, though the STREAM | The second least significant bit (0x2) of the Stream ID | |||
| frame (Section 8.15) permits a shorter encoding when the leading bits | differentiates between unidirectional streams and bidirectional | |||
| of the stream ID are zero. | streams. Unidirectional streams always have this bit set to 1 and | |||
| bidirectional streams have this bit set to 0. | ||||
| 10.2. Life of a Stream | The two type bits from a Stream ID therefore identify streams as | |||
| summarized in Table 5. | ||||
| The semantics of QUIC streams is based on HTTP/2 streams, and the | +----------+----------------------------------+ | |||
| lifecycle of a QUIC stream therefore closely follows that of an | | Low Bits | Stream Type | | |||
| HTTP/2 stream [RFC7540], with some differences to accommodate the | +----------+----------------------------------+ | |||
| possibility of out-of-order delivery due to the use of multiple | | 0x0 | Client-Initiated, Bidirectional | | |||
| streams in QUIC. The lifecycle of a QUIC stream is shown in the | | | | | |||
| following figure and described below. | | 0x1 | Server-Initiated, Bidirectional | | |||
| | | | | ||||
| | 0x2 | Client-Initiated, Unidirectional | | ||||
| | | | | ||||
| | 0x3 | Server-Initiated, Unidirectional | | ||||
| +----------+----------------------------------+ | ||||
| +--------+ | Table 5: Stream ID Types | |||
| | | | ||||
| | idle | | ||||
| | | | ||||
| +--------+ | ||||
| | | ||||
| send/recv STREAM/RST | ||||
| recv MSD/SB | ||||
| | | ||||
| v | ||||
| recv FIN/ +--------+ send FIN/ | ||||
| recv RST | | send RST | ||||
| ,---------| open |-----------. | ||||
| / | | \ | ||||
| v +--------+ v | ||||
| +----------+ +----------+ | ||||
| | half | | half | | ||||
| | closed | | closed | | ||||
| | (remote) | | (local) | | ||||
| +----------+ +----------+ | ||||
| | | | ||||
| | send FIN/ +--------+ recv FIN/ | | ||||
| \ send RST | | recv RST / | ||||
| `----------->| closed |<-------------' | ||||
| | | | ||||
| +--------+ | ||||
| send: endpoint sends this frame | Stream ID 0 (0x0) is a client-initiated, bidirectional stream that is | |||
| recv: endpoint receives this frame | used for the cryptographic handshake. Stream 0 MUST NOT be used for | |||
| application data. | ||||
| STREAM: a STREAM frame | A QUIC endpoint MUST NOT reuse a Stream ID. Open streams can be used | |||
| FIN: FIN flag in a STREAM frame | in any order. Streams that are used out of order result in opening | |||
| RST: RST_STREAM frame | all lower-numbered streams of the same type in the same direction. | |||
| MSD: MAX_STREAM_DATA frame | ||||
| SB: STREAM_BLOCKED frame | ||||
| Figure 10: Lifecycle of a stream | Stream IDs are encoded as a variable-length integer (see | |||
| Section 8.1). | ||||
| Note that this diagram shows stream state transitions and the frames | 10.2. Stream States | |||
| and flags that affect those transitions only. It is possible for a | ||||
| single frame to cause two transitions: receiving a RST_STREAM frame, | ||||
| or a STREAM frame with the FIN flag cause the stream state to move | ||||
| from "idle" to "open" and then immediately to one of the "half- | ||||
| closed" states. | ||||
| The recipient of a frame that changes stream state will have a | This section describes the two types of QUIC stream in terms of the | |||
| delayed view of the state of a stream while the frame is in transit. | states of their send or receive components. Two state machines are | |||
| Endpoints do not coordinate the creation of streams; they are created | described: one for streams on which an endpoint transmits data | |||
| unilaterally by either endpoint. Endpoints can use acknowledgments | (Section 10.2.1); another for streams from which an endpoint receives | |||
| to understand the peer's subjective view of stream state at any given | data (Section 10.2.2). | |||
| time. | ||||
| In the absence of more specific guidance elsewhere in this document, | Unidirectional streams use the applicable state machine directly. | |||
| implementations SHOULD treat the receipt of a frame that is not | Bidirectional streams use both state machines. For the most part, | |||
| expressly permitted in the description of a state as a connection | the use of these state machines is the same whether the stream is | |||
| error (see Section 12). | unidirectional or bidirectional. The conditions for opening a stream | |||
| are slightly more complex for a bidirectional stream because the | ||||
| opening of either send or receive causes the stream to open in both | ||||
| directions. | ||||
| 10.2.1. idle | Opening a stream causes all lower-numbered streams of the same type | |||
| to implicitly open. This includes both send and receive streams if | ||||
| the stream is bidirectional. For bidirectional streams, an endpoint | ||||
| can send data on an implicitly opened stream. On both unidirectional | ||||
| and bidirectional streams, an endpoint MAY send MAX_STREAM_DATA or | ||||
| STOP_SENDING on implicitly opened streams. An endpoint SHOULD NOT | ||||
| implicitly open streams that it initiates, instead opening streams in | ||||
| order. | ||||
| All streams start in the "idle" state. | Note: These states are largely informative. This document uses | |||
| stream states to describe rules for when and how different types | ||||
| of frames can be sent and the reactions that are expected when | ||||
| different types of frames are received. Though these state | ||||
| machines are intended to be useful in implementing QUIC, these | ||||
| states aren't intended to constrain implementations. An | ||||
| implementation can define a different state machine as long as its | ||||
| behavior is consistent with an implementation that implements | ||||
| these states. | ||||
| The following transitions are valid from this state: | 10.2.1. Send Stream States | |||
| Sending or receiving a STREAM or RST_STREAM frame causes the | Figure 10 shows the states for the part of a stream that sends data | |||
| identified stream to become "open". The stream identifier for a new | to a peer. | |||
| stream is selected as described in Section 10.1. A RST_STREAM frame, | ||||
| or a STREAM frame with the FIN flag set also causes a stream to | ||||
| become "half-closed". | ||||
| An endpoint might receive MAX_STREAM_DATA or STREAM_BLOCKED frames on | o | |||
| peer-initiated streams that are "idle" if there is loss or reordering | | Application Open | |||
| of packets. Receiving these frames also causes the stream to become | | Open Paired Stream (bidirectional) | |||
| "open". | v | |||
| +-------+ | ||||
| | Open | Send RST_STREAM | ||||
| | |-----------------------. | ||||
| +-------+ | | ||||
| | | | ||||
| | Send STREAM / | | ||||
| | STREAM_BLOCKED | | ||||
| v | | ||||
| +-------+ | | ||||
| | Send | Send RST_STREAM | | ||||
| | |---------------------->| | ||||
| +-------+ | | ||||
| | | | ||||
| | Send STREAM + FIN | | ||||
| v v | ||||
| +-------+ +-------+ | ||||
| | Data | Send RST_STREAM | Reset | | ||||
| | Sent +------------------>| Sent | | ||||
| +-------+ +-------+ | ||||
| | | | ||||
| | Recv All ACKs | Recv ACK | ||||
| v v | ||||
| +-------+ +-------+ | ||||
| | Data | | Reset | | ||||
| | Recvd | | Recvd | | ||||
| +-------+ +-------+ | ||||
| An endpoint MUST NOT send a STREAM or RST_STREAM frame for a stream | Figure 10: States for Send Streams | |||
| ID that is higher than the peers advertised maximum stream ID (see | ||||
| Section 8.7). | ||||
| 10.2.2. open | The sending part of stream that the endpoint initiates (types 0 and 2 | |||
| for clients, 1 and 3 for servers) is opened by the application or | ||||
| application protocol. The "Open" state represents a newly created | ||||
| stream that is able to accept data from the application. Stream data | ||||
| might be buffered in this state in preparation for sending. | ||||
| A stream in the "open" state may be used by both peers to send frames | The sending part of a bidirectional stream initiated by a peer (type | |||
| of any type. In this state, endpoints can send MAX_STREAM_DATA and | 0 for a server, type 1 for a client) enters the "Open" state if the | |||
| MUST observe the value advertised by its receiving peer (see | receiving part enters the "Recv" state. | |||
| Section 11). | ||||
| Opening a stream causes all lower-numbered streams in the same | Sending the first STREAM or STREAM_BLOCKED frame causes a send stream | |||
| direction to become open. Thus, opening an odd-numbered stream | to enter the "Send" state. An implementation might choose to defer | |||
| causes all "idle", odd-numbered streams with a lower identifier to | allocating a Stream ID to a send stream until it sends the first | |||
| become open and the same applies to even numbered streams. Endpoints | frame and enters this state, which can allow for better stream | |||
| open streams in increasing numeric order, but loss or reordering can | prioritization. | |||
| cause packets that open streams to arrive out of order. | ||||
| From the "open" state, either endpoint can send a frame with the FIN | In the "Send" state, an endpoint transmits - and retransmits as | |||
| flag set, which causes the stream to transition into one of the | necessary - data in STREAM frames. The endpoint respects the flow | |||
| "half-closed" states. This flag can be set on the frame that opens | control limits of its peer, accepting MAX_STREAM_DATA frames. An | |||
| the stream, which causes the stream to immediately become "half- | endpoint in the "Send" state generates STREAM_BLOCKED frames if it | |||
| closed". Once an endpoint has completed sending all stream data and | encounters flow control limits. | |||
| a STREAM frame with a FIN flag, the stream state becomes "half-closed | ||||
| (local)". When an endpoint receives all stream data and a FIN flag | ||||
| the stream state becomes "half-closed (remote)". An endpoint MUST | ||||
| NOT consider the stream state to have changed until all data has been | ||||
| sent or received. | ||||
| A RST_STREAM frame on an "open" stream also causes the stream to | After the application indicates that stream data is complete and a | |||
| become "half-closed". A stream that becomes "open" as a result of | STREAM frame containing the FIN bit is sent, the send stream enters | |||
| sending or receiving RST_STREAM immediately becomes "half-closed". | the "Data Sent" state. From this state, the endpoint only | |||
| Sending a RST_STREAM frame causes the stream to become "half-closed | retransmits stream data as necessary. The endpoint no longer needs | |||
| (local)"; receiving RST_STREAM causes the stream to become "half- | to track flow control limits or send STREAM_BLOCKED frames for a send | |||
| closed (remote)". | stream in this state. The endpoint can ignore any MAX_STREAM_DATA | |||
| frames it receives from its peer in this state; MAX_STREAM_DATA | ||||
| frames might be received until the peer receives the final stream | ||||
| offset. | ||||
| Any frame type that mentions a stream ID can be sent in this state. | Once all stream data has been successfully acknowledged, the send | |||
| stream enters the "Data Recvd" state, which is a terminal state. | ||||
| 10.2.3. half-closed (local) | From any of the "Open", "Send", or "Data Sent" states, an application | |||
| can signal that it wishes to abandon transmission of stream data. | ||||
| Similarly, the endpoint might receive a STOP_SENDING frame from its | ||||
| peer. In either case, the endpoint sends a RST_STREAM frame, which | ||||
| causes the stream to enter the "Reset Sent" state. | ||||
| A stream that is in the "half-closed (local)" state MUST NOT be used | An endpoint MAY send a RST_STREAM as the first frame on a send | |||
| for sending on new STREAM frames. Retransmission of data that has | stream; this causes the send stream to open and then immediately | |||
| already been sent on STREAM frames is permitted. An endpoint MAY | transition to the "Reset Sent" state. | |||
| also send MAX_STREAM_DATA and STOP_SENDING in this state. | ||||
| An application can decide to abandon a stream in this state. An | Once a packet containing a RST_STREAM has been acknowledged, the send | |||
| endpoint can send RST_STREAM for a stream that was closed with the | stream enters the "Reset Recvd" state, which is a terminal state. | |||
| FIN flag. The final offset carried in this RST_STREAM frame MUST be | ||||
| the same as the previously established final offset. | ||||
| An endpoint that closes a stream MUST NOT send data beyond the final | 10.2.2. Receive Stream States | |||
| offset that it has chosen, see Section 10.2.5 for details. | ||||
| A stream transitions from this state to "closed" when a STREAM frame | Figure 11 shows the states for the part of a stream that receives | |||
| that contains a FIN flag is received and all prior data has arrived, | data from a peer. The states for a receive stream mirror only some | |||
| or when a RST_STREAM frame is received. | of the states of the send stream at the peer. A receive stream | |||
| doesn't track states on the send stream that cannot be observed, such | ||||
| as the "Open" state; instead, receive streams track the delivery of | ||||
| data to the application or application protocol some of which cannot | ||||
| be observed by the sender. | ||||
| An endpoint can receive any frame that mentions a stream ID in this | o | |||
| state. Providing flow-control credit using MAX_STREAM_DATA frames is | | Recv STREAM / STREAM_BLOCKED / RST_STREAM | |||
| necessary to continue receiving flow-controlled frames. In this | | Open Paired Stream (bidirectional) | |||
| state, a receiver MAY ignore MAX_STREAM_DATA frames for this stream, | | Recv MAX_STREAM_DATA | |||
| which might arrive for a short period after a frame bearing the FIN | v | |||
| flag is sent. | +-------+ | |||
| | Recv | Recv RST_STREAM | ||||
| | |-----------------------. | ||||
| +-------+ | | ||||
| | | | ||||
| | Recv STREAM + FIN | | ||||
| v | | ||||
| +-------+ | | ||||
| | Size | Recv RST_STREAM | | ||||
| | Known +---------------------->| | ||||
| +-------+ | | ||||
| | | | ||||
| | Recv All Data | | ||||
| v v | ||||
| +-------+ +-------+ | ||||
| | Data | Recv RST_STREAM | Reset | | ||||
| | Recvd +<-- (optional) --->| Recvd | | ||||
| +-------+ +-------+ | ||||
| | | | ||||
| | App Read All Data | App Read RST | ||||
| v v | ||||
| +-------+ +-------+ | ||||
| | Data | | Reset | | ||||
| | Read | | Read | | ||||
| +-------+ +-------+ | ||||
| 10.2.4. half-closed (remote) | Figure 11: States for Receive Streams | |||
| A stream is "half-closed (remote)" when the stream is no longer being | The receiving part of a stream initiated by a peer (types 1 and 3 for | |||
| used by the peer to send any data. An endpoint will have either | a client, or 0 and 2 for a server) are created when the first STREAM, | |||
| received all data that a peer has sent or will have received a | STREAM_BLOCKED, RST_STREAM, or MAX_STREAM_DATA (bidirectional only, | |||
| RST_STREAM frame and discarded any received data. | see below) is received for that stream. The initial state for a | |||
| receive stream is "Recv". Receiving a RST_STREAM frame causes the | ||||
| receive stream to immediately transition to the "Reset Recvd". | ||||
| Once all data has been either received or discarded, a sender is no | The receive stream enters the "Recv" state when the sending part of a | |||
| longer obligated to update the maximum received data for the | bidirectional stream initiated by the endpoint (type 0 for a client, | |||
| connection. | type 1 for a server) enters the "Open" state. | |||
| Due to reordering, an endpoint could continue receiving frames for | A bidirectional stream also opens when a MAX_STREAM_DATA frame is | |||
| the stream even after the stream is closed for sending. Frames | received. Receiving a MAX_STREAM_DATA frame implies that the remote | |||
| received after a peer closes a stream SHOULD be discarded. An | peer has opened the stream and is providing flow control credit. A | |||
| endpoint MAY choose to limit the period over which it ignores frames | MAX_STREAM_DATA frame might arrive before a STREAM or STREAM_BLOCKED | |||
| and treat frames that arrive after this time as being in error. | frame if packets are lost or reordered. | |||
| An endpoint may receive a RST_STREAM in this state, such as when the | In the "Recv" state, the endpoint receives STREAM and STREAM_BLOCKED | |||
| peer resets the stream after sending a FIN on it. In this case, the | frames. Incoming data is buffered and reassembled into the correct | |||
| endpoint MAY discard any data that it already received on that | order for delivery to the application. As data is consumed by the | |||
| stream. The endpoint SHOULD close the connection with a | application and buffer space becomes available, the endpoint sends | |||
| FINAL_OFFSET_ERROR if the received RST_STREAM carries a different | MAX_STREAM_DATA frames to allow the peer to send more data. | |||
| offset from the one already established. | ||||
| An endpoint will know the final offset of the data it receives on a | When a STREAM frame with a FIN bit is received, the final offset (see | |||
| stream when it reaches the "half-closed (remote)" state, see | Section 11.3) is known. The receive stream enters the "Size Known" | |||
| Section 11.3 for details. | state. In this state, the endpoint no longer needs to send | |||
| MAX_STREAM_DATA frames, it only receives any retransmissions of | ||||
| stream data. | ||||
| A stream in this state can be used by the endpoint to send any frame | Once all data for the stream has been received, the receive stream | |||
| that mentions a stream ID. In this state, the endpoint MUST observe | enters the "Data Recvd" state. This might happen as a result of | |||
| advertised stream and connection data limits (see Section 11). | receiving the same STREAM frame that causes the transition to "Size | |||
| Known". In this state, the endpoint has all stream data. Any STREAM | ||||
| or STREAM_BLOCKED frames it receives for the stream can be discarded. | ||||
| A stream transitions from this state to "closed" by completing | The "Data Recvd" state persists until stream data has been delivered | |||
| transmission of all data. This includes sending all data carried in | to the application or application protocol. Once stream data has | |||
| STREAM frames including the terminal STREAM frame that contains a FIN | been delivered, the stream enters the "Data Read" state, which is a | |||
| flag. | terminal state. | |||
| A stream also becomes "closed" when the endpoint sends a RST_STREAM | Receiving a RST_STREAM frame in the "Recv" or "Size Known" states | |||
| frame. | causes the stream to enter the "Reset Recvd" state. This might cause | |||
| the delivery of stream data to the application to be interrupted. | ||||
| 10.2.5. closed | It is possible that all stream data is received when a RST_STREAM is | |||
| received (that is, from the "Data Recvd" state). Similarly, it is | ||||
| possible for remaining stream data to arrive after receiving a | ||||
| RST_STREAM frame (the "Reset Recvd" state). An implementation is | ||||
| able to manage this situation as they choose. Sending RST_STREAM | ||||
| means that an endpoint cannot guarantee delivery of stream data; | ||||
| however there is no requirement that stream data not be delivered if | ||||
| a RST_STREAM is received. An implementation MAY interrupt delivery | ||||
| of stream data, discard any data that was not consumed, and signal | ||||
| the existence of the RST_STREAM immediately. Alternatively, the | ||||
| RST_STREAM signal might be suppressed or withheld if stream data is | ||||
| completely received. In the latter case, the receive stream | ||||
| effectively transitions to "Data Recvd" from "Reset Recvd". | ||||
| The "closed" state is the terminal state for a stream. Reordering | Once the application has been delivered the signal indicating that | |||
| might cause frames to be received after closing, see Section 10.2.4. | the receive stream was reset, the receive stream transitions to the | |||
| "Reset Read" state, which is a terminal state. | ||||
| If the application resets a stream that is already in the "closed" | 10.2.3. Permitted Frame Types | |||
| state, a RST_STREAM frame MAY still be sent in order to cancel | ||||
| retransmissions of previously-sent STREAM frames. | The sender of a stream sends just three frame types that affect the | |||
| state of a stream at either sender or receiver: STREAM | ||||
| (Section 8.17), STREAM_BLOCKED (Section 8.11), and RST_STREAM | ||||
| (Section 8.3). | ||||
| A sender MUST NOT send any of these frames from a terminal state | ||||
| ("Data Recvd" or "Reset Recvd"). A sender MUST NOT send STREAM or | ||||
| STREAM_BLOCKED after sending a RST_STREAM; that is, in the "Reset | ||||
| Sent" state in addition to the terminal states. A receiver could | ||||
| receive any of these frames in any state, but only due to the | ||||
| possibility of delayed delivery of packets carrying them. | ||||
| The receiver of a stream sends MAX_STREAM_DATA (Section 8.7) and | ||||
| STOP_SENDING frames (Section 8.14). | ||||
| The receiver only sends MAX_STREAM_DATA in the "Recv" state. A | ||||
| receiver can send STOP_SENDING in any state where it has not received | ||||
| a RST_STREAM frame; that is states other than "Reset Recvd" or "Reset | ||||
| Read". However there is little value in sending a STOP_SENDING frame | ||||
| after all stream data has been received in the "Data Recvd" state. A | ||||
| sender could receive these frames in any state as a result of delayed | ||||
| delivery of packets. | ||||
| 10.2.4. Bidirectional Stream States | ||||
| A bidirectional stream is composed of a send stream and a receive | ||||
| stream. Implementations may represent states of the bidirectional | ||||
| stream as composites of send and receive stream states. The simplest | ||||
| model presents the stream as "open" when either send or receive | ||||
| stream is in a non-terminal state and "closed" when both send and | ||||
| receive streams are in a terminal state. | ||||
| Table 6 shows a more complex mapping of bidirectional stream states | ||||
| that loosely correspond to the stream states in HTTP/2 [HTTP2]. This | ||||
| shows that multiple states on send or receive streams are mapped to | ||||
| the same composite state. Note that this is just one possibility for | ||||
| such a mapping; this mapping requires that data is acknowledged | ||||
| before the transition to a "closed" or "half-closed" state. | ||||
| +-----------------------+---------------------+---------------------+ | ||||
| | Send Stream | Receive Stream | Composite State | | ||||
| +-----------------------+---------------------+---------------------+ | ||||
| | No Stream/Open | No Stream/Recv *1 | idle | | ||||
| | | | | | ||||
| | Open/Send/Data Sent | Recv/Size Known | open | | ||||
| | | | | | ||||
| | Open/Send/Data Sent | Data Recvd/Data | half-closed | | ||||
| | | Read | (remote) | | ||||
| | | | | | ||||
| | Open/Send/Data Sent | Reset Recvd/Reset | half-closed | | ||||
| | | Read | (remote) | | ||||
| | | | | | ||||
| | Data Recvd | Recv/Size Known | half-closed (local) | | ||||
| | | | | | ||||
| | Reset Sent/Reset | Recv/Size Known | half-closed (local) | | ||||
| | Recvd | | | | ||||
| | | | | | ||||
| | Data Recvd | Recv/Size Known | half-closed (local) | | ||||
| | | | | | ||||
| | Reset Sent/Reset | Data Recvd/Data | closed | | ||||
| | Recvd | Read | | | ||||
| | | | | | ||||
| | Reset Sent/Reset | Reset Recvd/Reset | closed | | ||||
| | Recvd | Read | | | ||||
| | | | | | ||||
| | Data Recvd | Data Recvd/Data | closed | | ||||
| | | Read | | | ||||
| | | | | | ||||
| | Data Recvd | Reset Recvd/Reset | closed | | ||||
| | | Read | | | ||||
| +-----------------------+---------------------+---------------------+ | ||||
| Table 6: Possible Mapping of Stream States to HTTP/2 | ||||
| Note (*1): A stream is considered "idle" if it has not yet been | ||||
| created, or if the receive stream is in the "Recv" state without | ||||
| yet having received any frames. | ||||
| 10.3. Solicited State Transitions | 10.3. Solicited State Transitions | |||
| If an endpoint is no longer interested in the data it is receiving on | If an endpoint is no longer interested in the data it is receiving on | |||
| a stream, it MAY send a STOP_SENDING frame identifying that stream to | a stream, it MAY send a STOP_SENDING frame identifying that stream to | |||
| prompt closure of the stream in the opposite direction. This | prompt closure of the stream in the opposite direction. This | |||
| typically indicates that the receiving application is no longer | typically indicates that the receiving application is no longer | |||
| reading data it receives from the stream, but is not a guarantee that | reading data it receives from the stream, but is not a guarantee that | |||
| incoming data will be ignored. | incoming data will be ignored. | |||
| STREAM frames received after sending STOP_SENDING are still counted | STREAM frames received after sending STOP_SENDING are still counted | |||
| toward the connection and stream flow-control windows, even though | toward the connection and stream flow-control windows, even though | |||
| these frames will be discarded upon receipt. This avoids potential | these frames will be discarded upon receipt. This avoids potential | |||
| ambiguity about which STREAM frames count toward flow control. | ambiguity about which STREAM frames count toward flow control. | |||
| STOP_SENDING can only be sent for any stream that is not "idle", | A STOP_SENDING frame requests that the receiving endpoint send a | |||
| however it is mostly useful for streams in the "open" or "half-closed | RST_STREAM frame. An endpoint that receives a STOP_SENDING frame | |||
| (local)" states. A STOP_SENDING frame requests that the receiving | MUST send a RST_STREAM frame for that stream, and can use an error | |||
| endpoint send a RST_STREAM frame. An endpoint that receives a | code of STOPPING. If the STOP_SENDING frame is received on a send | |||
| STOP_SENDING frame MUST send a RST_STREAM frame for that stream with | stream that is already in the "Data Sent" state, a RST_STREAM frame | |||
| an error code of STOPPING. If the STOP_SENDING frame is received on | MAY still be sent in order to cancel retransmission of previously- | |||
| a stream that is already in the "half-closed (local)" or "closed" | sent STREAM frames. | |||
| states, a RST_STREAM frame MAY still be sent in order to cancel | ||||
| retransmission of previously-sent STREAM frames. | ||||
| While STOP_SENDING frames are retransmittable, an implementation MAY | STOP_SENDING SHOULD only be sent for a receive stream that has not | |||
| choose not to retransmit a lost STOP_SENDING frame if the stream has | been reset. STOP_SENDING is most useful for streams in the "Recv" or | |||
| already been closed in the appropriate direction since the frame was | "Size Known" states. | |||
| first generated. See Section 9. | ||||
| An endpoint is expected to send another STOP_SENDING frame if a | ||||
| packet containing a previous STOP_SENDING is lost. However, once | ||||
| either all stream data or a RST_STREAM frame has been received for | ||||
| the stream - that is, the stream is in any state other than "Recv" or | ||||
| "Size Known" - sending a STOP_SENDING frame is unnecessary. | ||||
| 10.4. Stream Concurrency | 10.4. Stream Concurrency | |||
| An endpoint limits the number of concurrently active incoming streams | An endpoint limits the number of concurrently active incoming streams | |||
| by adjusting the maximum stream ID. An initial value is set in the | by adjusting the maximum stream ID. An initial value is set in the | |||
| transport parameters (see Section 7.4.1) and is subsequently | transport parameters (see Section 7.4.1) and is subsequently | |||
| increased by MAX_STREAM_ID frames (see Section 8.7). | increased by MAX_STREAM_ID frames (see Section 8.8). | |||
| The maximum stream ID is specific to each endpoint and applies only | The maximum stream ID is specific to each endpoint and applies only | |||
| to the peer that receives the setting. That is, clients specify the | to the peer that receives the setting. That is, clients specify the | |||
| maximum stream ID the server can initiate, and servers specify the | maximum stream ID the server can initiate, and servers specify the | |||
| maximum stream ID the client can initiate. Each endpoint may respond | maximum stream ID the client can initiate. Each endpoint may respond | |||
| on streams initiated by the other peer, regardless of whether it is | on streams initiated by the other peer, regardless of whether it is | |||
| permitted to initiated new streams. | 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 with an ID greater than the limit it has | that receives a STREAM frame with an ID greater than the limit it has | |||
| skipping to change at page 62, line 19 ¶ | skipping to change at page 73, line 19 ¶ | |||
| encapsulating data on a stream until the stream is terminated in that | encapsulating data on a stream until the stream is terminated in that | |||
| direction. Streams are an ordered byte-stream abstraction, and they | direction. Streams are an ordered byte-stream abstraction, and they | |||
| have no other structure within them. STREAM frame boundaries are not | have no other structure within them. STREAM frame boundaries are not | |||
| expected to be preserved in retransmissions from the sender or during | expected to be preserved in retransmissions from the sender or during | |||
| delivery to the application at the receiver. | delivery to the application at the receiver. | |||
| When new data is to be sent on a stream, a sender MUST set the | When new data is to be sent on a stream, a sender MUST set the | |||
| encapsulating STREAM frame's offset field to the stream offset of the | encapsulating STREAM frame's offset field to the stream offset of the | |||
| first byte of this new data. The first byte of data that is sent on | first byte of this new data. The first byte of data that is sent on | |||
| a stream has the stream offset 0. 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^62. 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. | |||
| An endpoint MUST NOT send data on any stream without ensuring that it | An endpoint MUST NOT send data on any stream without ensuring that it | |||
| is within the data limits set by its peer. The cryptographic | is within the data limits set by its peer. The cryptographic | |||
| handshake stream, Stream 0, is exempt from the connection-level data | handshake stream, Stream 0, is exempt from the connection-level data | |||
| limits established by MAX_DATA. Data on stream 0 other than the | limits established by MAX_DATA. Data on stream 0 other than the | |||
| initial cryptographic handshake message is still subject to stream- | initial cryptographic handshake message is still subject to stream- | |||
| skipping to change at page 62, line 45 ¶ | skipping to change at page 73, line 45 ¶ | |||
| handshake message. | handshake message. | |||
| 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.6. Stream Prioritization | 10.6. 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 [HTTP2], shows that effective prioritization strategies have a | |||
| a significant positive impact on performance. | significant positive impact on performance. | |||
| QUIC does not provide frames for exchanging prioritization | QUIC does not provide frames for exchanging prioritization | |||
| information. Instead it relies on receiving priority information | information. Instead it relies on receiving priority information | |||
| from the application that uses QUIC. Protocols that use QUIC are | from the application that uses QUIC. Protocols that use QUIC are | |||
| able to 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. | |||
| skipping to change at page 63, line 44 ¶ | skipping to change at page 74, line 44 ¶ | |||
| 11. Flow Control | 11. Flow Control | |||
| It is necessary to limit the amount of data that a sender may have | It is necessary to limit the amount of data that a sender may have | |||
| outstanding at any time, so as to prevent a fast sender from | outstanding at any time, so as to prevent a fast sender from | |||
| overwhelming a slow receiver, or to prevent a malicious sender from | overwhelming a slow receiver, or to prevent a malicious sender from | |||
| consuming significant resources at a receiver. This section | consuming significant resources at a receiver. This section | |||
| describes QUIC's flow-control mechanisms. | describes QUIC's flow-control mechanisms. | |||
| QUIC employs a credit-based flow-control scheme similar to HTTP/2's | QUIC employs a credit-based flow-control scheme similar to HTTP/2's | |||
| flow control [RFC7540]. A receiver advertises the number of octets | flow control [HTTP2]. A receiver advertises the number of octets it | |||
| it is prepared to receive on a given stream and for the entire | 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 data receiver sends MAX_STREAM_DATA or MAX_DATA frames to the | A data receiver sends MAX_STREAM_DATA or MAX_DATA frames to the | |||
| sender to advertise additional credit. MAX_STREAM_DATA frames send | sender to advertise additional credit. MAX_STREAM_DATA frames send | |||
| the the maximum absolute byte offset of a stream, while MAX_DATA | the the maximum absolute byte offset of a stream, while MAX_DATA | |||
| sends the maximum sum of the absolute byte offsets of all streams | sends the maximum sum of the absolute byte offsets of all streams | |||
| skipping to change at page 64, line 23 ¶ | skipping to change at page 75, line 23 ¶ | |||
| advertisement; that is, once a receiver advertises an offset, it MUST | advertisement; that is, once a receiver advertises an offset, it MUST | |||
| NOT subsequently advertise a smaller offset. A sender could receive | NOT subsequently advertise a smaller offset. A sender could receive | |||
| MAX_DATA or MAX_STREAM_DATA frames out of order; a sender MUST | MAX_DATA or MAX_STREAM_DATA frames out of order; a sender MUST | |||
| therefore ignore any flow control offset that does not move the | therefore ignore any flow control offset that does not move the | |||
| window forward. | window forward. | |||
| A receiver MUST close the connection with a FLOW_CONTROL_ERROR error | A receiver MUST close the connection with a FLOW_CONTROL_ERROR error | |||
| (Section 12) if the peer violates the advertised connection or stream | (Section 12) if the peer violates the advertised connection or stream | |||
| data limits. | data limits. | |||
| A sender MUST send BLOCKED frames to indicate it has data to write | A sender SHOULD send BLOCKED or STREAM_BLOCKED frames to indicate it | |||
| but is blocked by lack of connection or stream flow control credit. | has data to write but is blocked by flow control limits. These | |||
| BLOCKED frames are expected to be sent infrequently in common cases, | frames are expected to be sent infrequently in common cases, but they | |||
| but they are considered useful for debugging and monitoring purposes. | are considered useful for debugging and monitoring purposes. | |||
| A receiver advertises credit for a stream by sending a | A receiver advertises credit for a stream by sending a | |||
| MAX_STREAM_DATA frame with the Stream ID set appropriately. A | MAX_STREAM_DATA frame with the Stream ID set appropriately. A | |||
| receiver could use the current offset of data consumed to determine | receiver could use the current offset of data consumed to determine | |||
| the flow control offset to be advertised. A receiver MAY send | the flow control offset to be advertised. A receiver MAY send | |||
| MAX_STREAM_DATA frames in multiple packets in order to make sure that | MAX_STREAM_DATA frames in multiple packets in order to make sure that | |||
| the sender receives an update before running out of flow control | the sender receives an update before running out of flow control | |||
| credit, even if one of 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 | |||
| skipping to change at page 66, line 24 ¶ | skipping to change at page 77, line 24 ¶ | |||
| Implementations will likely want to increase the maximum stream ID as | Implementations will likely want to increase the maximum stream ID as | |||
| peer-initiated streams close. A receiver MAY also advance the | peer-initiated streams close. A receiver MAY also advance the | |||
| maximum stream ID based on current activity, system conditions, and | maximum stream ID based on current activity, system conditions, and | |||
| other environmental factors. | other environmental factors. | |||
| 11.2.1. Blocking on Flow Control | 11.2.1. Blocking on Flow Control | |||
| If a sender does not receive a MAX_DATA or MAX_STREAM_DATA frame when | If a sender does not receive a MAX_DATA or MAX_STREAM_DATA frame when | |||
| it has run out of flow control credit, the sender will be blocked and | it has run out of flow control credit, the sender will be blocked and | |||
| MUST send a BLOCKED or STREAM_BLOCKED frame. These frames are | SHOULD send a BLOCKED or STREAM_BLOCKED frame. These frames are | |||
| expected to be useful for debugging at the receiver; they do not | expected to be useful for debugging at the receiver; they do not | |||
| require any other action. A receiver SHOULD NOT wait for a BLOCKED | require any other action. A receiver SHOULD NOT wait for a BLOCKED | |||
| or STREAM_BLOCKED frame before sending MAX_DATA or MAX_STREAM_DATA, | 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 | since doing so will mean that a sender is unable to send for an | |||
| entire round trip. | entire round trip. | |||
| For smooth operation of the congestion controller, it is generally | For smooth operation of the congestion controller, it is generally | |||
| considered best to not let the sender go into quiescence if | considered best to not let the sender go into quiescence if | |||
| avoidable. To avoid blocking a sender, and to reasonably account for | avoidable. To avoid blocking a sender, and to reasonably account for | |||
| the possibiity of loss, a receiver should send a MAX_DATA or | the possibiity of loss, a receiver should send a MAX_DATA or | |||
| MAX_STREAM_DATA frame at least two roundtrips before it expects the | MAX_STREAM_DATA frame at least two roundtrips before it expects the | |||
| sender to get blocked. | sender to get blocked. | |||
| A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | |||
| when it reaches a data limit. A sender MUST NOT send multiple | when it reaches a data limit. A sender SHOULD NOT send multiple | |||
| BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | |||
| original frame is determined to be lost. Another BLOCKED or | original frame is determined to be lost. Another BLOCKED or | |||
| STREAM_BLOCKED frame can be sent after the data limit is increased. | STREAM_BLOCKED frame can be sent after the data limit is increased. | |||
| 11.3. Stream Final Offset | 11.3. Stream Final Offset | |||
| The final offset is the count of the number of octets that are | 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 | transmitted on a stream. For a stream that is reset, the final | |||
| offset is carried explicitly in the RST_STREAM frame. Otherwise, the | offset is carried explicitly in a RST_STREAM frame. Otherwise, the | |||
| final offset is the offset of the end of the data carried in STREAM | final offset is the offset of the end of the data carried in a STREAM | |||
| frame marked with a FIN flag. | frame marked with a FIN flag, or 0 in the case of incoming | |||
| unidirectional streams. | ||||
| An endpoint will know the final offset for a stream when the stream | An endpoint will know the final offset for a stream when the receive | |||
| enters the "half-closed (remote)" state. However, if there is | stream enters the "Size Known" or "Reset Recvd" state. | |||
| 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 | An endpoint MUST NOT send data on a stream at or beyond the final | |||
| offset. | offset. | |||
| Once a final offset for a stream is known, it cannot change. If a | 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 | RST_STREAM or STREAM frame causes the final offset to change for a | |||
| stream, an endpoint SHOULD respond with a FINAL_OFFSET_ERROR error | stream, an endpoint SHOULD respond with a FINAL_OFFSET_ERROR error | |||
| (see Section 12). A receiver SHOULD treat receipt of data at or | (see Section 12). A receiver SHOULD treat receipt of data at or | |||
| beyond the final offset as a FINAL_OFFSET_ERROR error, even after a | beyond the final offset as a FINAL_OFFSET_ERROR error, even after a | |||
| stream is closed. Generating these errors is not mandatory, but only | stream is closed. Generating these errors is not mandatory, but only | |||
| skipping to change at page 67, line 34 ¶ | skipping to change at page 78, line 32 ¶ | |||
| 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 | |||
| is used. | is used. | |||
| A stateless reset (Section 7.8.4) is not suitable for any error that | A stateless reset (Section 7.9.4) is not suitable for any error that | |||
| can be signaled with a CONNECTION_CLOSE, APPLICATION_CLOSE, or | can be signaled with a CONNECTION_CLOSE, APPLICATION_CLOSE, or | |||
| RST_STREAM frame. A stateless reset MUST NOT be used by an endpoint | RST_STREAM frame. A stateless reset MUST NOT be used by an endpoint | |||
| that has the state necessary to send a frame on the connection. | that has the state necessary to send a frame on 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 or APPLICATION_CLOSE frame (Section 8.3, | CONNECTION_CLOSE or APPLICATION_CLOSE frame (Section 8.4, | |||
| Section 8.4). An endpoint MAY close the connection in this manner | Section 8.5). An endpoint MAY close the connection in this manner | |||
| even if the error only affects a single stream. | even if the error only affects a single stream. | |||
| Application protocols can signal application-specific protocol errors | Application protocols can signal application-specific protocol errors | |||
| using the APPLICATION_CLOSE frame. Errors that are specific to the | using the APPLICATION_CLOSE frame. Errors that are specific to the | |||
| transport, including all those described in this document, are | transport, including all those described in this document, are | |||
| carried in a CONNECTION_CLOSE frame. Other than the type of error | carried in a CONNECTION_CLOSE frame. Other than the type of error | |||
| code they carry, these frames are identical in format and semantics. | code they carry, these frames are identical in format and semantics. | |||
| A CONNECTION_CLOSE or APPLICATION_CLOSE frame could be sent in a | A CONNECTION_CLOSE or APPLICATION_CLOSE frame could be sent in a | |||
| packet that is lost. An endpoint SHOULD be prepared to retransmit a | packet that is lost. An endpoint SHOULD be prepared to retransmit a | |||
| packet containing either frame type if it receives more packets on a | packet containing either frame type if it receives more packets on a | |||
| terminated connection. Limiting the number of retransmissions and | terminated connection. Limiting the number of retransmissions and | |||
| the time over which this final packet is sent limits the effort | the time over which this final packet is sent limits the effort | |||
| expended on terminated connections. | expended on terminated connections. | |||
| An endpoint that chooses not to retransmit packets containing | An endpoint that chooses not to retransmit packets containing | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE risks a peer missing the first | CONNECTION_CLOSE or APPLICATION_CLOSE risks a peer missing the first | |||
| such packet. The only mechanism available to an endpoint that | such packet. The only mechanism available to an endpoint that | |||
| continues to receive data for a terminated connection is to use the | continues to receive data for a terminated connection is to use the | |||
| stateless reset process (Section 7.8.4). | stateless reset process (Section 7.9.4). | |||
| An endpoint that receives an invalid CONNECTION_CLOSE or | An endpoint that receives an invalid CONNECTION_CLOSE or | |||
| APPLICATION_CLOSE frame MUST NOT signal the existence of the error to | APPLICATION_CLOSE frame MUST NOT signal the existence of the error to | |||
| its peer. | its peer. | |||
| 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 send a RST_STREAM | connection in a recoverable state, the endpoint can send a RST_STREAM | |||
| frame (Section 8.2) with an appropriate error code to terminate just | frame (Section 8.3) with an appropriate error code to terminate just | |||
| the affected stream. | the affected stream. | |||
| Stream 0 is critical to the functioning of the entire connection. If | Stream 0 is critical to the functioning of the entire connection. If | |||
| stream 0 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 | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| RST_STREAM MUST be instigated by the application and MUST carry an | RST_STREAM MUST be instigated by the application and MUST carry an | |||
| application error code. Resetting a stream without knowledge of the | application error code. Resetting a stream without knowledge of the | |||
| application protocol could cause the protocol to enter an | application protocol could cause the protocol to enter an | |||
| skipping to change at page 69, line 47 ¶ | skipping to change at page 80, line 47 ¶ | |||
| VERSION_NEGOTIATION_ERROR (0x9): An endpoint received transport | VERSION_NEGOTIATION_ERROR (0x9): An endpoint received transport | |||
| parameters that contained version negotiation parameters that | parameters that contained version negotiation parameters that | |||
| disagreed with the version negotiation that it performed. This | disagreed with the version negotiation that it performed. This | |||
| error code indicates a potential version downgrade attack. | error code indicates a potential version downgrade attack. | |||
| PROTOCOL_VIOLATION (0xA): An endpoint detected an error with | PROTOCOL_VIOLATION (0xA): An endpoint detected an error with | |||
| protocol compliance that was not covered by more specific error | protocol compliance that was not covered by more specific error | |||
| codes. | codes. | |||
| UNSOLICITED_PONG (0xB): An endpoint received a PONG frame that did | ||||
| not correspond to any PING frame that it previously sent. | ||||
| FRAME_ERROR (0x1XX): An endpoint detected an error in a specific | FRAME_ERROR (0x1XX): An endpoint detected an error in a specific | |||
| frame type. The frame type is included as the last octet of the | frame type. The frame type is included as the last octet of the | |||
| error code. For example, an error in a MAX_STREAM_ID frame would | error code. For example, an error in a MAX_STREAM_ID frame would | |||
| be indicated with the code (0x106). | be indicated with the code (0x106). | |||
| See Section 14.2 for details of registering new error codes. | See Section 14.2 for details of registering new error codes. | |||
| 12.4. Application Protocol Error Codes | 12.4. Application Protocol Error Codes | |||
| Application protocol error codes are 16-bit unsigned integers, but | Application protocol error codes are 16-bit unsigned integers, but | |||
| the management of application error codes are left to application | the management of application error codes are left to application | |||
| protocols. Application protocol error codes are used for the | protocols. Application protocol error codes are used for the | |||
| RST_STREAM (Section 8.2) and APPLICATION_CLOSE (Section 8.4) frames. | RST_STREAM (Section 8.3) and APPLICATION_CLOSE (Section 8.5) frames. | |||
| There is no restriction on the use of the 16-bit error code space for | There is no restriction on the use of the 16-bit error code space for | |||
| application protocols. However, QUIC reserves the error code with a | application protocols. However, QUIC reserves the error code with a | |||
| value of 0 to mean STOPPING. The application error code of STOPPING | value of 0 to mean STOPPING. The application error code of STOPPING | |||
| (0) is used by the transport to cancel a stream in response to | (0) is used by the transport to cancel a stream in response to | |||
| receipt of a STOP_SENDING frame. | receipt of a STOP_SENDING frame. | |||
| 13. Security and Privacy Considerations | 13. Security and Privacy Considerations | |||
| 13.1. Spoofed ACK Attack | 13.1. Spoofed ACK Attack | |||
| skipping to change at page 72, line 41 ¶ | skipping to change at page 83, line 45 ¶ | |||
| Specification: A reference to a publicly available specification for | Specification: A reference to a publicly available specification for | |||
| 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 7. | |||
| +--------+-------------------------+---------------+ | +--------+----------------------------+---------------+ | |||
| | Value | Parameter Name | Specification | | | Value | Parameter Name | Specification | | |||
| +--------+-------------------------+---------------+ | +--------+----------------------------+---------------+ | |||
| | 0x0000 | initial_max_stream_data | Section 7.4.1 | | | 0x0000 | initial_max_stream_data | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0001 | initial_max_data | Section 7.4.1 | | | 0x0001 | initial_max_data | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0002 | initial_max_stream_id | Section 7.4.1 | | | 0x0002 | initial_max_stream_id_bidi | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0003 | idle_timeout | Section 7.4.1 | | | 0x0003 | idle_timeout | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0004 | omit_connection_id | Section 7.4.1 | | | 0x0004 | omit_connection_id | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0005 | max_packet_size | Section 7.4.1 | | | 0x0005 | max_packet_size | Section 7.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0006 | stateless_reset_token | Section 7.4.1 | | | 0x0006 | stateless_reset_token | Section 7.4.1 | | |||
| +--------+-------------------------+---------------+ | | | | | | |||
| | 0x0007 | ack_delay_exponent | Section 7.4.1 | | ||||
| | | | | | ||||
| | 0x0008 | initial_max_stream_id_uni | Section 7.4.1 | | ||||
| +--------+----------------------------+---------------+ | ||||
| Table 4: Initial QUIC Transport Parameters Entries | Table 7: Initial QUIC Transport Parameters Entries | |||
| 14.2. QUIC Transport Error Codes Registry | 14.2. QUIC Transport Error Codes Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Transport Error | IANA [SHALL add/has added] a registry for "QUIC Transport Error | |||
| Codes" under a "QUIC Protocol" heading. | Codes" under a "QUIC Protocol" heading. | |||
| The "QUIC Transport Error Codes" registry governs a 16-bit space. | The "QUIC Transport Error Codes" 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 | |||
| policies. Values with the first byte in the range 0x00 to 0xfe (in | policies. Values with the first byte in the range 0x00 to 0xfe (in | |||
| hexadecimal) are assigned via the Specification Required policy | hexadecimal) are assigned via the Specification Required policy | |||
| skipping to change at page 73, line 50 ¶ | skipping to change at page 85, line 5 ¶ | |||
| between 0x0000 and 0xfeff). | between 0x0000 and 0xfeff). | |||
| Code: A short mnemonic for the parameter. | Code: A short mnemonic for the parameter. | |||
| Description: A brief description of the error code semantics, which | Description: A brief description of the error code semantics, which | |||
| MAY be a summary if a specification reference is provided. | MAY be a summary if a specification reference is provided. | |||
| Specification: A reference to a publicly available specification for | Specification: A reference to a publicly available specification for | |||
| the value. | the value. | |||
| The initial contents of this registry are shown in Table 5. Note | The initial contents of this registry are shown in Table 8. Note | |||
| that FRAME_ERROR takes the range from 0x100 to 0x1FF and private use | that FRAME_ERROR takes the range from 0x100 to 0x1FF and private use | |||
| occupies the range from 0xFE00 to 0xFFFF. | occupies the range from 0xFE00 to 0xFFFF. | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| | Value | Error | Description | Specificatio | | | Value | Error | Description | Specificatio | | |||
| | | | | n | | | | | | n | | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| | 0x0 | NO_ERROR | No error | Section 12.3 | | | 0x0 | NO_ERROR | No error | Section 12.3 | | |||
| | | | | | | | | | | | | |||
| | 0x1 | INTERNAL_ERROR | Implementatio | Section 12.3 | | | 0x1 | INTERNAL_ERROR | Implementatio | Section 12.3 | | |||
| skipping to change at page 74, line 44 ¶ | skipping to change at page 86, line 44 ¶ | |||
| | | | parameters | | | | | | parameters | | | |||
| | | | | | | | | | | | | |||
| | 0x9 | VERSION_NEGOTIATION_ER | Version | Section 12.3 | | | 0x9 | VERSION_NEGOTIATION_ER | Version | Section 12.3 | | |||
| | | ROR | negotiation | | | | | ROR | negotiation | | | |||
| | | | failure | | | | | | failure | | | |||
| | | | | | | | | | | | | |||
| | 0xA | PROTOCOL_VIOLATION | Generic | Section 12.3 | | | 0xA | PROTOCOL_VIOLATION | Generic | Section 12.3 | | |||
| | | | protocol | | | | | | protocol | | | |||
| | | | violation | | | | | | violation | | | |||
| | | | | | | | | | | | | |||
| | 0xB | UNSOLICITED_PONG | Unsolicited | Section 12.3 | | ||||
| | | | PONG frame | | | ||||
| | | | | | | ||||
| | 0x100-0x1 | FRAME_ERROR | Specific | Section 12.3 | | | 0x100-0x1 | FRAME_ERROR | Specific | Section 12.3 | | |||
| | FF | | frame format | | | | FF | | frame format | | | |||
| | | | error | | | | | | error | | | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| Table 5: Initial QUIC Transport Error Codes Entries | Table 8: Initial QUIC Transport Error Codes 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-21 (work in progress), | Version 1.3", draft-ietf-tls-tls13-22 (work in progress), | |||
| July 2017. | November 2017. | |||
| [PLPMTUD] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | [PLPMTUD] 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, | |||
| <https://www.rfc-editor.org/info/rfc4821>. | <https://www.rfc-editor.org/info/rfc4821>. | |||
| [PMTUDv4] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | [PMTUDv4] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | |||
| DOI 10.17487/RFC1191, November 1990, | DOI 10.17487/RFC1191, November 1990, | |||
| <https://www.rfc-editor.org/info/rfc1191>. | <https://www.rfc-editor.org/info/rfc1191>. | |||
| [PMTUDv6] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | [PMTUDv6] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | |||
| "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | |||
| DOI 10.17487/RFC8201, July 2017, | DOI 10.17487/RFC8201, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8201>. | <https://www.rfc-editor.org/info/rfc8201>. | |||
| [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", draft-ietf-quic-recovery-07 (work | and Congestion Control", draft-ietf-quic-recovery-00 (work | |||
| in progress), October 2017. | in progress), December 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", draft-ietf-quic- | Layer Security (TLS) to Secure QUIC", draft-ietf-quic- | |||
| tls-07 (work in progress), October 2017. | tls-00 (work in progress), December 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, | |||
| <https://www.rfc-editor.org/info/rfc1191>. | <https://www.rfc-editor.org/info/rfc1191>. | |||
| [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, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 76, line 15 ¶ | skipping to change at page 88, line 15 ¶ | |||
| [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | |||
| "Randomness Requirements for Security", BCP 106, RFC 4086, | "Randomness Requirements for Security", BCP 106, RFC 4086, | |||
| DOI 10.17487/RFC4086, June 2005, | DOI 10.17487/RFC4086, June 2005, | |||
| <https://www.rfc-editor.org/info/rfc4086>. | <https://www.rfc-editor.org/info/rfc4086>. | |||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
| 15.2. Informative References | 15.2. Informative References | |||
| [EARLY-DESIGN] | [EARLY-DESIGN] | |||
| Roskind, J., "QUIC: Multiplexed Transport Over UDP", | Roskind, J., "QUIC: Multiplexed Transport Over UDP", | |||
| December 2013, <https://goo.gl/dMVtFi>. | December 2013, <https://goo.gl/dMVtFi>. | |||
| [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7540>. | ||||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | |||
| Hashing for Message Authentication", RFC 2104, | Hashing for Message Authentication", RFC 2104, | |||
| DOI 10.17487/RFC2104, February 1997, | DOI 10.17487/RFC2104, February 1997, | |||
| <https://www.rfc-editor.org/info/rfc2104>. | <https://www.rfc-editor.org/info/rfc2104>. | |||
| [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | |||
| RFC 2360, DOI 10.17487/RFC2360, June 1998, | RFC 2360, DOI 10.17487/RFC2360, June 1998, | |||
| <https://www.rfc-editor.org/info/rfc2360>. | <https://www.rfc-editor.org/info/rfc2360>. | |||
| [RFC4787] Audet, F., Ed. and C. Jennings, "Network Address | [RFC4787] Audet, F., Ed. and C. Jennings, "Network Address | |||
| skipping to change at page 77, line 5 ¶ | skipping to change at page 89, line 10 ¶ | |||
| [RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | [RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | |||
| "TCP Extensions for Multipath Operation with Multiple | "TCP Extensions for Multipath Operation with Multiple | |||
| Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | |||
| <https://www.rfc-editor.org/info/rfc6824>. | <https://www.rfc-editor.org/info/rfc6824>. | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7540>. | ||||
| [SLOWLORIS] | [SLOWLORIS] | |||
| RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | |||
| <https://web.archive.org/web/20150315054838/ | <https://web.archive.org/web/20150315054838/ | |||
| http://ha.ckers.org/slowloris/>. | http://ha.ckers.org/slowloris/>. | |||
| [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | |||
| Communication Review Vol. 37, pp. 361, | Communication Review Vol. 37, pp. 361, | |||
| DOI 10.1145/1282427.1282421, October 2007. | DOI 10.1145/1282427.1282421, October 2007. | |||
| 15.3. URIs | 15.3. URIs | |||
| [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | |||
| [2] https://github.com/quicwg | [2] https://github.com/quicwg | |||
| [3] https://github.com/quicwg/base-drafts/labels/transport | [3] https://github.com/quicwg/base-drafts/labels/-transport | |||
| [4] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | [4] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | |||
| Appendix A. Contributors | Appendix A. Contributors | |||
| The original authors of this specification were Ryan Hamilton, Jana | The original authors of this specification were Ryan Hamilton, Jana | |||
| Iyengar, Ian Swett, and Alyssa Wilk. | Iyengar, Ian Swett, and Alyssa Wilk. | |||
| The original design and rationale behind this protocol draw | The original design and rationale behind this protocol draw | |||
| significantly from work by Jim Roskind [EARLY-DESIGN]. In | significantly from work by Jim Roskind [EARLY-DESIGN]. In | |||
| skipping to change at page 78, line 12 ¶ | skipping to change at page 90, line 12 ¶ | |||
| 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-06 | C.1. Since draft-ietf-quic-transport-07 | |||
| o Replaced FNV-1a with AES-GCM for all "Cleartext" packets. | o Employ variable-length integer encodings throughout (#595) | |||
| C.2. Since draft-ietf-quic-transport-05 | o Draining period can terminate early (#869) | |||
| C.2. Since draft-ietf-quic-transport-06 | ||||
| o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | ||||
| o Split error code space between application and transport (#485) | ||||
| o Stateless reset token moved to end (#820) | ||||
| o 1-RTT-protected long header types removed (#848) | ||||
| o No acknowledgments during draining period (#852) | ||||
| o Remove "application close" as a separate close type (#854) | ||||
| o Remove timestamps from the ACK frame (#841) | ||||
| o Require transport parameters to only appear once (#792) | ||||
| C.3. Since draft-ietf-quic-transport-05 | ||||
| o Stateless token is server-only (#726) | o Stateless token is server-only (#726) | |||
| o Refactor section on connection termination (#733, #748, #328, | o Refactor section on connection termination (#733, #748, #328, | |||
| #177) | #177) | |||
| o Limit size of Version Negotiation packet (#585) | o Limit size of Version Negotiation packet (#585) | |||
| o Clarify when and what to ack (#736) | o Clarify when and what to ack (#736) | |||
| o Renamed STREAM_ID_NEEDED to STREAM_ID_BLOCKED | o Renamed STREAM_ID_NEEDED to STREAM_ID_BLOCKED | |||
| o Clarify Keep-alive requirements (#729) | o Clarify Keep-alive requirements (#729) | |||
| C.3. Since draft-ietf-quic-transport-04 | C.4. Since draft-ietf-quic-transport-04 | |||
| o Introduce STOP_SENDING frame, RST_STREAM only resets in one | o Introduce STOP_SENDING frame, RST_STREAM only resets in one | |||
| direction (#165) | direction (#165) | |||
| o Removed GOAWAY; application protocols are responsible for graceful | o Removed GOAWAY; application protocols are responsible for graceful | |||
| shutdown (#696) | shutdown (#696) | |||
| o Reduced the number of error codes (#96, #177, #184, #211) | o Reduced the number of error codes (#96, #177, #184, #211) | |||
| o Version validation fields can't move or change (#121) | o Version validation fields can't move or change (#121) | |||
| skipping to change at page 79, line 4 ¶ | skipping to change at page 91, line 26 ¶ | |||
| o Removed versions from the transport parameters in a | o Removed versions from the transport parameters in a | |||
| NewSessionTicket message (#547) | NewSessionTicket message (#547) | |||
| o Clarify the meaning of "bytes in flight" (#550) | o Clarify the meaning of "bytes in flight" (#550) | |||
| o Public reset is now stateless reset and not visible to the path | o Public reset is now stateless reset and not visible to the path | |||
| (#215) | (#215) | |||
| o Reordered bits and fields in STREAM frame (#620) | o Reordered bits and fields in STREAM frame (#620) | |||
| o Clarifications to the stream state machine (#572, #571) | o Clarifications to the stream state machine (#572, #571) | |||
| o Increased the maximum length of the Largest Acknowledged field in | o Increased the maximum length of the Largest Acknowledged field in | |||
| ACK frames to 64 bits (#629) | ACK frames to 64 bits (#629) | |||
| o truncate_connection_id is renamed to omit_connection_id (#659) | o truncate_connection_id is renamed to omit_connection_id (#659) | |||
| o CONNECTION_CLOSE terminates the connection like TCP RST (#330, | o CONNECTION_CLOSE terminates the connection like TCP RST (#330, | |||
| #328) | #328) | |||
| o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | |||
| C.4. Since draft-ietf-quic-transport-03 | C.5. Since draft-ietf-quic-transport-03 | |||
| o Change STREAM and RST_STREAM layout | o Change STREAM and RST_STREAM layout | |||
| o Add MAX_STREAM_ID settings | o Add MAX_STREAM_ID settings | |||
| C.5. Since draft-ietf-quic-transport-02 | C.6. Since draft-ietf-quic-transport-02 | |||
| o The size of the initial packet payload has a fixed minimum (#267, | o The size of the initial packet payload has a fixed minimum (#267, | |||
| #472) | #472) | |||
| o Define when Version Negotiation packets are ignored (#284, #294, | o Define when Version Negotiation packets are ignored (#284, #294, | |||
| #241, #143, #474) | #241, #143, #474) | |||
| o The 64-bit FNV-1a algorithm is used for integrity protection of | o The 64-bit FNV-1a algorithm is used for integrity protection of | |||
| unprotected packets (#167, #480, #481, #517) | unprotected packets (#167, #480, #481, #517) | |||
| skipping to change at page 80, line 4 ¶ | skipping to change at page 92, line 27 ¶ | |||
| o Version 1 of QUIC uses TLS; a new version is needed to use a | o Version 1 of QUIC uses TLS; a new version is needed to use a | |||
| different handshake protocol (#516) | different handshake protocol (#516) | |||
| o STREAM frames have a reduced number of offset lengths (#543, #430) | o STREAM frames have a reduced number of offset lengths (#543, #430) | |||
| o Split some frames into separate connection- and stream- level | o Split some frames into separate connection- and stream- level | |||
| frames (#443) | frames (#443) | |||
| * WINDOW_UPDATE split into MAX_DATA and MAX_STREAM_DATA (#450) | * WINDOW_UPDATE split into MAX_DATA and MAX_STREAM_DATA (#450) | |||
| * BLOCKED split to match WINDOW_UPDATE split (#454) | * BLOCKED split to match WINDOW_UPDATE split (#454) | |||
| * Define STREAM_ID_NEEDED frame (#455) | * Define STREAM_ID_NEEDED frame (#455) | |||
| o A NEW_CONNECTION_ID frame supports connection migration without | o A NEW_CONNECTION_ID frame supports connection migration without | |||
| linkability (#232, #491, #496) | linkability (#232, #491, #496) | |||
| o Transport parameters for 0-RTT are retained from a previous | o Transport parameters for 0-RTT are retained from a previous | |||
| connection (#405, #513, #512) | connection (#405, #513, #512) | |||
| * A client in 0-RTT no longer required to reset excess streams | * A client in 0-RTT no longer required to reset excess streams | |||
| (#425, #479) | (#425, #479) | |||
| o Expanded security considerations (#440, #444, #445, #448) | o Expanded security considerations (#440, #444, #445, #448) | |||
| C.6. Since draft-ietf-quic-transport-01 | C.7. 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 (#49, #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, | |||
| skipping to change at page 82, line 17 ¶ | skipping to change at page 94, 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.7. Since draft-ietf-quic-transport-00 | C.8. 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.8. Since draft-hamilton-quic-transport-protocol-01 | C.9. Since draft-hamilton-quic-transport-protocol-01 | |||
| o Adopted as base for draft-ietf-quic-tls | o Adopted as base for draft-ietf-quic-tls | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| o Added IANA Considerations section | o Added IANA Considerations section | |||
| o Moved Contributors and Acknowledgments to appendices | o Moved Contributors and Acknowledgments to appendices | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 325 change blocks. | ||||
| 903 lines changed or deleted | 1426 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/ | ||||