| draft-ietf-quic-transport-12.txt | draft-ietf-quic-transport-13.txt | |||
|---|---|---|---|---|
| QUIC J. Iyengar, Ed. | QUIC J. Iyengar, Ed. | |||
| Internet-Draft Fastly | Internet-Draft Fastly | |||
| Intended status: Standards Track M. Thomson, Ed. | Intended status: Standards Track M. Thomson, Ed. | |||
| Expires: November 23, 2018 Mozilla | Expires: December 30, 2018 Mozilla | |||
| May 22, 2018 | June 28, 2018 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-12 | draft-ietf-quic-transport-13 | |||
| Abstract | Abstract | |||
| This document defines the core of the QUIC transport protocol. This | This document defines the core of the QUIC transport protocol. This | |||
| document describes connection establishment, packet format, | document describes connection establishment, packet format, | |||
| multiplexing and reliability. Accompanying documents describe the | multiplexing and reliability. Accompanying documents describe the | |||
| cryptographic handshake and loss detection. | cryptographic handshake and loss detection. | |||
| Note to Readers | Note to Readers | |||
| skipping to change at page 1, line 44 ¶ | skipping to change at page 1, line 44 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at 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 November 23, 2018. | This Internet-Draft will expire on December 30, 2018. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 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 . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 6 | 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 6 | 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 7 | |||
| 3. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | 4. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 8 | 4.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 10 | 4.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.3. Version Negotiation Packet . . . . . . . . . . . . . . . 12 | 4.3. Version Negotiation Packet . . . . . . . . . . . . . . . 12 | |||
| 4.4. Cryptographic Handshake Packets . . . . . . . . . . . . . 13 | 4.4. Cryptographic Handshake Packets . . . . . . . . . . . . . 14 | |||
| 4.4.1. Initial Packet . . . . . . . . . . . . . . . . . . . 13 | 4.4.1. Initial Packet . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.4.2. Retry Packet . . . . . . . . . . . . . . . . . . . . 14 | 4.4.2. Retry Packet . . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.4.3. Handshake Packet . . . . . . . . . . . . . . . . . . 15 | 4.4.3. Handshake Packet . . . . . . . . . . . . . . . . . . 18 | |||
| 4.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 16 | 4.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.6. Coalescing Packets . . . . . . . . . . . . . . . . . . . 17 | 4.6. Coalescing Packets . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.7. Connection ID . . . . . . . . . . . . . . . . . . . . . . 17 | 4.7. Connection ID Encoding . . . . . . . . . . . . . . . . . 20 | |||
| 4.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 18 | 4.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 5. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 20 | 5. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 23 | |||
| 6. Life of a Connection . . . . . . . . . . . . . . . . . . . . 22 | 5.1. Extension Frames . . . . . . . . . . . . . . . . . . . . 26 | |||
| 6.1. Matching Packets to Connections . . . . . . . . . . . . . 23 | 6. Life of a Connection . . . . . . . . . . . . . . . . . . . . 26 | |||
| 6.1.1. Client Packet Handling . . . . . . . . . . . . . . . 23 | 6.1. Connection ID . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6.1.2. Server Packet Handling . . . . . . . . . . . . . . . 23 | 6.2. Matching Packets to Connections . . . . . . . . . . . . . 28 | |||
| 6.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 24 | 6.2.1. Client Packet Handling . . . . . . . . . . . . . . . 28 | |||
| 6.2.1. Sending Version Negotiation Packets . . . . . . . . . 25 | 6.2.2. Server Packet Handling . . . . . . . . . . . . . . . 29 | |||
| 6.2.2. Handling Version Negotiation Packets . . . . . . . . 25 | 6.3. Version Negotiation . . . . . . . . . . . . . . . . . . . 29 | |||
| 6.2.3. Using Reserved Versions . . . . . . . . . . . . . . . 26 | 6.3.1. Sending Version Negotiation Packets . . . . . . . . . 30 | |||
| 6.3. Cryptographic and Transport Handshake . . . . . . . . . . 26 | 6.3.2. Handling Version Negotiation Packets . . . . . . . . 30 | |||
| 6.4. Transport Parameters . . . . . . . . . . . . . . . . . . 27 | 6.3.3. Using Reserved Versions . . . . . . . . . . . . . . . 31 | |||
| 6.4.1. Transport Parameter Definitions . . . . . . . . . . . 29 | 6.4. Cryptographic and Transport Handshake . . . . . . . . . . 31 | |||
| 6.4.2. Values of Transport Parameters for 0-RTT . . . . . . 31 | 6.5. Example Handshake Flows . . . . . . . . . . . . . . . . . 32 | |||
| 6.4.3. New Transport Parameters . . . . . . . . . . . . . . 31 | 6.6. Transport Parameters . . . . . . . . . . . . . . . . . . 34 | |||
| 6.4.4. Version Negotiation Validation . . . . . . . . . . . 32 | 6.6.1. Transport Parameter Definitions . . . . . . . . . . . 36 | |||
| 6.6.2. Values of Transport Parameters for 0-RTT . . . . . . 38 | ||||
| 6.5. Stateless Retries . . . . . . . . . . . . . . . . . . . . 33 | 6.6.3. New Transport Parameters . . . . . . . . . . . . . . 38 | |||
| 6.6. Proof of Source Address Ownership . . . . . . . . . . . . 34 | 6.6.4. Version Negotiation Validation . . . . . . . . . . . 39 | |||
| 6.6.1. Client Address Validation Procedure . . . . . . . . . 34 | 6.7. Stateless Retries . . . . . . . . . . . . . . . . . . . . 40 | |||
| 6.6.2. Address Validation on Session Resumption . . . . . . 35 | 6.8. Using Explicit Congestion Notification . . . . . . . . . 40 | |||
| 6.6.3. Address Validation Token Integrity . . . . . . . . . 36 | 6.9. Proof of Source Address Ownership . . . . . . . . . . . . 42 | |||
| 6.7. Path Validation . . . . . . . . . . . . . . . . . . . . . 36 | 6.9.1. Client Address Validation Procedure . . . . . . . . . 43 | |||
| 6.7.1. Initiation . . . . . . . . . . . . . . . . . . . . . 37 | 6.9.2. Address Validation for Future Connections . . . . . . 44 | |||
| 6.7.2. Response . . . . . . . . . . . . . . . . . . . . . . 37 | 6.9.3. Address Validation Token Integrity . . . . . . . . . 44 | |||
| 6.7.3. Completion . . . . . . . . . . . . . . . . . . . . . 38 | 6.10. Path Validation . . . . . . . . . . . . . . . . . . . . . 44 | |||
| 6.7.4. Abandonment . . . . . . . . . . . . . . . . . . . . . 38 | 6.10.1. Initiation . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 6.8. Connection Migration . . . . . . . . . . . . . . . . . . 39 | 6.10.2. Response . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 6.8.1. Probing a New Path . . . . . . . . . . . . . . . . . 39 | 6.10.3. Completion . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 6.8.2. Initiating Connection Migration . . . . . . . . . . . 39 | 6.10.4. Abandonment . . . . . . . . . . . . . . . . . . . . 46 | |||
| 6.8.3. Responding to Connection Migration . . . . . . . . . 40 | 6.11. Connection Migration . . . . . . . . . . . . . . . . . . 47 | |||
| 6.8.4. Loss Detection and Congestion Control . . . . . . . . 42 | 6.11.1. Probing a New Path . . . . . . . . . . . . . . . . . 47 | |||
| 6.8.5. Privacy Implications of Connection Migration . . . . 42 | 6.11.2. Initiating Connection Migration . . . . . . . . . . 48 | |||
| 6.9. Server's Preferred Address . . . . . . . . . . . . . . . 44 | 6.11.3. Responding to Connection Migration . . . . . . . . . 48 | |||
| 6.9.1. Communicating A Preferred Address . . . . . . . . . . 44 | 6.11.4. Loss Detection and Congestion Control . . . . . . . 50 | |||
| 6.9.2. Responding to Connection Migration . . . . . . . . . 44 | 6.11.5. Privacy Implications of Connection Migration . . . . 51 | |||
| 6.9.3. Interaction of Client Migration and Preferred Address 45 | 6.12. Server's Preferred Address . . . . . . . . . . . . . . . 51 | |||
| 6.10. Connection Termination . . . . . . . . . . . . . . . . . 45 | 6.12.1. Communicating A Preferred Address . . . . . . . . . 52 | |||
| 6.10.1. Closing and Draining Connection States . . . . . . . 45 | 6.12.2. Responding to Connection Migration . . . . . . . . . 52 | |||
| 6.10.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 47 | 6.12.3. Interaction of Client Migration and Preferred | |||
| 6.10.3. Immediate Close . . . . . . . . . . . . . . . . . . 47 | Address . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 6.10.4. Stateless Reset . . . . . . . . . . . . . . . . . . 48 | 6.13. Connection Termination . . . . . . . . . . . . . . . . . 53 | |||
| 7. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 51 | 6.13.1. Closing and Draining Connection States . . . . . . . 53 | |||
| 7.1. Variable-Length Integer Encoding . . . . . . . . . . . . 51 | 6.13.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 54 | |||
| 7.2. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 52 | 6.13.3. Immediate Close . . . . . . . . . . . . . . . . . . 55 | |||
| 7.3. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 52 | 6.13.4. Stateless Reset . . . . . . . . . . . . . . . . . . 56 | |||
| 7.4. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 53 | 7. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 59 | |||
| 7.5. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 53 | 7.1. Variable-Length Integer Encoding . . . . . . . . . . . . 59 | |||
| 7.6. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 54 | 7.2. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 60 | |||
| 7.7. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 54 | 7.3. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 60 | |||
| 7.8. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 55 | 7.4. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 61 | |||
| 7.9. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 56 | 7.5. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 62 | |||
| 7.10. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 57 | 7.6. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 62 | |||
| 7.11. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 57 | 7.7. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 62 | |||
| 7.12. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 58 | 7.8. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 63 | |||
| 7.13. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 58 | 7.9. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 64 | |||
| 7.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 59 | 7.10. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 65 | |||
| 7.15. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 60 | 7.11. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 65 | |||
| 7.15.1. ACK Block Section . . . . . . . . . . . . . . . . . 61 | 7.12. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 66 | |||
| 7.15.2. Sending ACK Frames . . . . . . . . . . . . . . . . . 63 | 7.13. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 66 | |||
| 7.15.3. ACK Frames and Packet Protection . . . . . . . . . . 64 | 7.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 68 | |||
| 7.16. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 65 | 7.15. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 68 | |||
| 7.17. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . . 65 | 7.15.1. ACK Block Section . . . . . . . . . . . . . . . . . 70 | |||
| 7.18. STREAM Frames . . . . . . . . . . . . . . . . . . . . . . 65 | 7.15.2. Sending ACK Frames . . . . . . . . . . . . . . . . . 71 | |||
| 8. Packetization and Reliability . . . . . . . . . . . . . . . . 67 | 7.15.3. ACK Frames and Packet Protection . . . . . . . . . . 72 | |||
| 8.1. Packet Processing and Acknowledgment . . . . . . . . . . 67 | 7.16. ACK_ECN Frame . . . . . . . . . . . . . . . . . . . . . . 72 | |||
| 8.2. Retransmission of Information . . . . . . . . . . . . . . 68 | 7.17. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 73 | |||
| 8.3. Packet Size . . . . . . . . . . . . . . . . . . . . . . . 70 | 7.18. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . . 74 | |||
| 8.4. Path Maximum Transmission Unit . . . . . . . . . . . . . 70 | 7.19. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . . 74 | |||
| 8.4.1. Special Considerations for PMTU Discovery . . . . . . 71 | 7.20. STREAM Frames . . . . . . . . . . . . . . . . . . . . . . 74 | |||
| 7.21. CRYPTO Frame . . . . . . . . . . . . . . . . . . . . . . 76 | ||||
| 8. Packetization and Reliability . . . . . . . . . . . . . . . . 77 | ||||
| 8.1. Packet Processing and Acknowledgment . . . . . . . . . . 78 | ||||
| 8.2. Retransmission of Information . . . . . . . . . . . . . . 78 | ||||
| 8.3. Packet Size . . . . . . . . . . . . . . . . . . . . . . . 80 | ||||
| 8.4. Path Maximum Transmission Unit . . . . . . . . . . . . . 80 | ||||
| 8.4.1. IPv4 PMTU Discovery . . . . . . . . . . . . . . . . . 81 | ||||
| 8.4.2. Special Considerations for Packetization Layer PMTU | 8.4.2. Special Considerations for Packetization Layer PMTU | |||
| Discovery . . . . . . . . . . . . . . . . . . . . . . 71 | Discovery . . . . . . . . . . . . . . . . . . . . . . 82 | |||
| 9. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 72 | 9. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 82 | |||
| 9.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 73 | 9.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 83 | |||
| 9.2. Stream States . . . . . . . . . . . . . . . . . . . . . . 74 | 9.2. Stream States . . . . . . . . . . . . . . . . . . . . . . 84 | |||
| 9.2.1. Send Stream States . . . . . . . . . . . . . . . . . 74 | 9.2.1. Send Stream States . . . . . . . . . . . . . . . . . 85 | |||
| 9.2.2. Receive Stream States . . . . . . . . . . . . . . . . 76 | 9.2.2. Receive Stream States . . . . . . . . . . . . . . . . 86 | |||
| 9.2.3. Permitted Frame Types . . . . . . . . . . . . . . . . 79 | 9.2.3. Permitted Frame Types . . . . . . . . . . . . . . . . 89 | |||
| 9.2.4. Bidirectional Stream States . . . . . . . . . . . . . 79 | 9.2.4. Bidirectional Stream States . . . . . . . . . . . . . 89 | |||
| 9.3. Solicited State Transitions . . . . . . . . . . . . . . . 80 | 9.3. Solicited State Transitions . . . . . . . . . . . . . . . 90 | |||
| 9.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 81 | 9.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 91 | |||
| 9.5. Sending and Receiving Data . . . . . . . . . . . . . . . 82 | 9.5. Sending and Receiving Data . . . . . . . . . . . . . . . 92 | |||
| 9.6. Stream Prioritization . . . . . . . . . . . . . . . . . . 82 | 9.6. Stream Prioritization . . . . . . . . . . . . . . . . . . 92 | |||
| 10. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 83 | 10. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 93 | |||
| 10.1. Edge Cases and Other Considerations . . . . . . . . . . 85 | 10.1. Edge Cases and Other Considerations . . . . . . . . . . 94 | |||
| 10.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 85 | 10.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 95 | |||
| 10.1.2. Data Limit Increments . . . . . . . . . . . . . . . 85 | 10.1.2. Data Limit Increments . . . . . . . . . . . . . . . 95 | |||
| 10.1.3. Handshake Exemption . . . . . . . . . . . . . . . . 86 | 10.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 96 | |||
| 10.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 86 | 10.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 96 | |||
| 10.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 86 | 10.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 96 | |||
| 10.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 87 | 10.4. Flow Control for Crytographic Handshake . . . . . . . . 97 | |||
| 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 87 | 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 97 | |||
| 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 88 | 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 97 | |||
| 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 89 | 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 98 | |||
| 11.3. Transport Error Codes . . . . . . . . . . . . . . . . . 89 | 11.3. Transport Error Codes . . . . . . . . . . . . . . . . . 98 | |||
| 11.4. Application Protocol Error Codes . . . . . . . . . . . . 90 | 11.4. Application Protocol Error Codes . . . . . . . . . . . . 100 | |||
| 12. Security Considerations . . . . . . . . . . . . . . . . . . . 91 | 12. Security Considerations . . . . . . . . . . . . . . . . . . . 100 | |||
| 12.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 91 | 12.1. Handshake Denial of Service . . . . . . . . . . . . . . 100 | |||
| 12.2. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 91 | 12.2. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 101 | |||
| 12.3. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 92 | 12.3. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 102 | |||
| 12.4. Stream Fragmentation and Reassembly Attacks . . . . . . 92 | 12.4. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 102 | |||
| 12.5. Stream Commitment Attack . . . . . . . . . . . . . . . . 92 | 12.5. Stream Fragmentation and Reassembly Attacks . . . . . . 102 | |||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 93 | 12.6. Stream Commitment Attack . . . . . . . . . . . . . . . . 103 | |||
| 13.1. QUIC Transport Parameter Registry . . . . . . . . . . . 93 | 12.7. Explicit Congestion Notification Attacks . . . . . . . . 103 | |||
| 13.2. QUIC Transport Error Codes Registry . . . . . . . . . . 94 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 103 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 96 | 13.1. QUIC Transport Parameter Registry . . . . . . . . . . . 104 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . 96 | 13.2. QUIC Frame Type Registry . . . . . . . . . . . . . . . . 105 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . 97 | 13.3. QUIC Transport Error Codes Registry . . . . . . . . . . 106 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 98 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 108 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 98 | 14.1. Normative References . . . . . . . . . . . . . . . . . . 108 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 99 | 14.2. Informative References . . . . . . . . . . . . . . . . . 109 | |||
| C.1. Since draft-ietf-quic-transport-11 . . . . . . . . . . . 99 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 110 | |||
| C.2. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 99 | A.1. Since draft-ietf-quic-transport-12 . . . . . . . . . . . 110 | |||
| C.3. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 100 | A.2. Since draft-ietf-quic-transport-11 . . . . . . . . . . . 111 | |||
| C.4. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 100 | A.3. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 111 | |||
| C.5. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 101 | A.4. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 112 | |||
| C.6. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 102 | A.5. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 113 | |||
| C.7. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 102 | A.6. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 113 | |||
| C.8. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 102 | A.7. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 114 | |||
| C.9. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 103 | A.8. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 115 | |||
| C.10. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 103 | A.9. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 115 | |||
| C.11. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 104 | A.10. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 116 | |||
| C.12. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 106 | A.11. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 116 | |||
| C.13. Since draft-hamilton-quic-transport-protocol-01 . . . . . 106 | A.12. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 117 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 107 | A.13. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 119 | |||
| A.14. Since draft-hamilton-quic-transport-protocol-01 . . . . . 119 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 119 | ||||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 119 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 120 | ||||
| 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 secure transport for multiple | it to be a general-purpose secure transport for multiple | |||
| applications. | applications. | |||
| o Version negotiation | o Version negotiation | |||
| skipping to change at page 8, line 22 ¶ | skipping to change at page 9, line 4 ¶ | |||
| 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. | |||
| 4.1. Long Header | 4.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) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | |DCIL(4)|SCIL(4)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0/32..144) ... | | Destination Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Source Connection ID (0/32..144) ... | | Source Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload Length (i) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) | | | Packet Number (8/16/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. | |||
| skipping to change at page 9, line 16 ¶ | skipping to change at page 9, line 45 ¶ | |||
| 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. | |||
| Version: The QUIC Version is a 32-bit field that follows the Type. | Version: The QUIC Version is a 32-bit field that follows the Type. | |||
| This field indicates which version of QUIC is in use and | This field indicates which version of QUIC is in use and | |||
| determines how the rest of the protocol fields are interpreted. | determines how the rest of the protocol fields are interpreted. | |||
| DCIL and SCIL: Octet 1 contains the lengths of the two connection ID | DCIL and SCIL: The octet following the version contains the lengths | |||
| fields that follow it. These lengths are encoded as two 4-bit | of the two connection ID fields that follow it. These lengths are | |||
| unsigned integers. The Destination Connection ID Length (DCIL) | encoded as two 4-bit unsigned integers. The Destination | |||
| field occupies the 4 high bits of the octet and the Source | Connection ID Length (DCIL) field occupies the 4 high bits of the | |||
| Connection ID Length (SCIL) field occupies the 4 low bits of the | octet and the Source Connection ID Length (SCIL) field occupies | |||
| octet. An encoded length of 0 indicates that the connection ID is | the 4 low bits of the octet. An encoded length of 0 indicates | |||
| also 0 octets in length. Non-zero encoded lengths are increased | that the connection ID is also 0 octets in length. Non-zero | |||
| by 3 to get the full length of the connection ID, producing a | encoded lengths are increased by 3 to get the full length of the | |||
| length between 4 and 18 octets inclusive. For example, an octet | connection ID, producing a length between 4 and 18 octets | |||
| with the value 0x50 describes an 8-octet Destination Connection ID | inclusive. For example, an octet with the value 0x50 describes an | |||
| and a zero-length Source Connection ID. | 8-octet Destination Connection ID and a zero-length Source | |||
| Connection ID. | ||||
| Destination Connection ID: The Destination Connection ID field | Destination Connection ID: The Destination Connection ID field | |||
| follows the connection ID lengths and is either 0 octets in length | follows the connection ID lengths and is either 0 octets in length | |||
| or between 4 and 18 octets. Section 4.7 describes the use of this | or between 4 and 18 octets. Section 4.7 describes the use of this | |||
| field in more detail. | field in more detail. | |||
| Source Connection ID: The Source Connection ID field follows the | Source Connection ID: The Source Connection ID field follows the | |||
| Destination Connection ID and is either 0 octets in length or | Destination Connection ID and is either 0 octets in length or | |||
| between 4 and 18 octets. Section 4.7 describes the use of this | between 4 and 18 octets. Section 4.7 describes the use of this | |||
| field in more detail. | field in more detail. | |||
| Payload Length: The length of the Payload field in octets, encoded | Length: The length of the remainder of the packet (that is, the | |||
| as a variable-length integer (Section 7.1). | Packet Number and Payload fields) in octets, encoded as a | |||
| variable-length integer (Section 7.1). | ||||
| Packet Number: The packet number field is 1, 2, or 4 octets long. | Packet Number: The packet number field is 1, 2, or 4 octets long. | |||
| The packet number has confidentiality protection separate from | The packet number has confidentiality protection separate from | |||
| packet protection, as described in Section 5.6 of [QUIC-TLS]. The | packet protection, as described in Section 5.6 of [QUIC-TLS]. The | |||
| length of the packet number field is encoded in the plaintext | length of the packet number field is encoded in the plaintext | |||
| packet number. See Section 4.8 for details. | packet number. See Section 4.8 for details. | |||
| Payload: The payload of the packet. | Payload: The payload of the packet. | |||
| The following packet types are defined: | The following packet types are defined: | |||
| skipping to change at page 10, line 30 ¶ | skipping to change at page 11, line 11 ¶ | |||
| source connection IDs, and version fields of a long header packet are | source connection IDs, and version fields of a long header packet are | |||
| version-independent. The packet number and values for packet types | version-independent. The packet number and values for packet types | |||
| defined in Table 1 are version-specific. See [QUIC-INVARIANTS] for | defined in Table 1 are version-specific. See [QUIC-INVARIANTS] for | |||
| details on how packets from different versions of QUIC are | details on how packets from different versions of QUIC are | |||
| interpreted. | 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 | |||
| version and packet type. Type-specific semantics for this version | version and packet type. Type-specific semantics for this version | |||
| are described in the following sections. | are described in the following sections. | |||
| The end of the Payload field (which is also the end of the long | The end of the packet is determined by the Length field. The Length | |||
| header packet) is determined by the value of the Payload Length | field covers the both the Packet Number and Payload fields, both of | |||
| field. Senders can sometimes coalesce multiple packets into one UDP | which are confidentiality protected and initially of unknown length. | |||
| The size of the Payload field is learned once the packet number | ||||
| protection is removed. | ||||
| Senders can sometimes coalesce multiple packets into one UDP | ||||
| datagram. See Section 4.6 for more details. | datagram. See Section 4.6 for more details. | |||
| 4.2. Short Header | 4.2. Short Header | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |0|K|1|1|0|R R R| | |0|K|1|1|0|R R R| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0..144) ... | | Destination Connection ID (0..144) ... | |||
| skipping to change at page 11, line 39 ¶ | skipping to change at page 12, line 26 ¶ | |||
| because Google QUIC servers expect the connection ID to always be | because Google QUIC servers expect the connection ID to always be | |||
| present. The special interpretation of this bit SHOULD be removed | present. The special interpretation of this bit SHOULD be removed | |||
| from this specification when Google QUIC has finished | from this specification when Google QUIC has finished | |||
| transitioning to the new header format. | transitioning to the new header format. | |||
| Reserved: The sixth, seventh, and eighth bits (0x7) of octet 0 are | Reserved: The sixth, seventh, and eighth bits (0x7) of octet 0 are | |||
| reserved for experimentation. | reserved for experimentation. | |||
| Destination Connection ID: The Destination Connection ID is a | Destination Connection ID: The Destination Connection ID is a | |||
| connection ID that is chosen by the intended recipient of the | connection ID that is chosen by the intended recipient of the | |||
| packet. See Section 4.7 for more details. | packet. See Section 6.1 for more details. | |||
| Packet Number: The packet number field is 1, 2, or 4 octets long. | Packet Number: The packet number field is 1, 2, or 4 octets long. | |||
| The packet number has confidentiality protection separate from | The packet number has confidentiality protection separate from | |||
| packet protection, as described in Section 5.6 of [QUIC-TLS]. The | packet protection, as described in Section 5.6 of [QUIC-TLS]. The | |||
| length of the packet number field is encoded in the plaintext | length of the packet number field is encoded in the plaintext | |||
| packet number. See Section 4.8 for details. | packet number. See Section 4.8 for details. | |||
| 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 | ||||
| of the packet number field. Additional types can be used to signal | ||||
| the presence of other fields. | ||||
| The header form and connection ID field of a short header packet are | The header form and connection ID field of a short header packet are | |||
| version-independent. The remaining fields are specific to the | version-independent. The remaining fields are specific to the | |||
| selected QUIC version. See [QUIC-INVARIANTS] for details on how | selected QUIC version. See [QUIC-INVARIANTS] for details on how | |||
| packets from different versions of QUIC are interpreted. | packets from different versions of QUIC are interpreted. | |||
| 4.3. Version Negotiation Packet | 4.3. Version Negotiation Packet | |||
| A Version Negotiation packet is inherently not version-specific, and | A Version Negotiation packet is inherently not version-specific, and | |||
| does not use the long packet header (see Section 4.1. Upon receipt | does not use the long packet header (see Section 4.1. Upon receipt | |||
| by a client, it will appear to be a packet using the long header, but | by a client, it will appear to be a packet using the long header, but | |||
| skipping to change at page 13, line 26 ¶ | skipping to change at page 14, line 10 ¶ | |||
| A Version Negotiation packet cannot be explicitly acknowledged in an | A Version Negotiation packet cannot be explicitly acknowledged in an | |||
| ACK frame by a client. Receiving another Initial packet implicitly | ACK frame by a client. Receiving another Initial packet implicitly | |||
| acknowledges a Version Negotiation packet. | acknowledges a Version Negotiation packet. | |||
| The Version Negotiation packet does not include the Packet Number and | The Version Negotiation packet does not include the Packet Number and | |||
| Length fields present in other packets that use the long header form. | Length fields present in other packets that use the long header form. | |||
| Consequently, a Version Negotiation packet consumes an entire UDP | Consequently, a Version Negotiation packet consumes an entire UDP | |||
| datagram. | datagram. | |||
| See Section 6.2 for a description of the version negotiation process. | See Section 6.3 for a description of the version negotiation process. | |||
| 4.4. Cryptographic Handshake Packets | 4.4. Cryptographic Handshake Packets | |||
| Once version negotiation is complete, the cryptographic handshake is | Once version negotiation is complete, the cryptographic handshake is | |||
| used to agree on cryptographic keys. The cryptographic handshake is | used to agree on cryptographic keys. The cryptographic handshake is | |||
| carried in Initial (Section 4.4.1), Retry (Section 4.4.2) and | carried in Initial (Section 4.4.1) and Handshake (Section 4.4.3) | |||
| Handshake (Section 4.4.3) packets. | packets. | |||
| All these packets use the long header and contain the current QUIC | All these packets use the long header and contain the current QUIC | |||
| version in the version field. | version in the version field. | |||
| In order to prevent tampering by version-unaware middleboxes, | In order to prevent tampering by version-unaware middleboxes, Initial | |||
| handshake packets are protected with a connection- and version- | packets are protected with connection- and version-specific keys | |||
| specific key, as described in [QUIC-TLS]. This protection does not | (Initial keys) 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. | |||
| 4.4.1. Initial Packet | 4.4.1. Initial Packet | |||
| The Initial packet uses long headers with a type value of 0x7F. It | The Initial packet uses long headers with a type value of 0x7F. It | |||
| carries the first cryptographic handshake message sent by the client. | carries the first CRYPTO frames sent by the client and server to | |||
| perform key exchange, and may carry ACKs in either direction. The | ||||
| Initial packet is protected by Initial keys as described in | ||||
| [QUIC-TLS]. | ||||
| If the client has not previously received a Retry packet from the | The Initial packet has two additional header fields that follow the | |||
| server, it populates the Destination Connection ID field with a | normal Long Header. | |||
| randomly selected value. This MUST be at least 8 octets in length. | ||||
| Until a packet is received from the server, the client MUST use the | ||||
| same random value unless it also changes the Source Connection ID | ||||
| (which effectively starts a new connection attempt). The randomized | ||||
| Destination Connection ID is used to determine packet protection | ||||
| keys. | ||||
| If the client received a Retry packet and is sending a second Initial | 0 1 2 3 | |||
| packet, then it sets the Destination Connection ID to the value from | 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 | |||
| the Source Connection ID in the Retry packet. Changing Destination | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Connection ID also results in a change to the keys used to protect | | Token Length (i) ... | |||
| the Initial packet. | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Token (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Token Length: A variable-length integer specifying the length of the | ||||
| Token field, in bytes. It may be zero if no token is present. | ||||
| Initial packets sent by the server MUST include a zero-length | ||||
| token. | ||||
| Token: An optional token blob previously received in either a Retry | ||||
| packet or NEW_TOKEN frame. | ||||
| The client and server use the Initial packet type for any packet that | ||||
| contains an initial cryptographic handshake message. In addition to | ||||
| the first packet(s). This includes all cases where a new packet | ||||
| containing the initial cryptographic message needs to be created, | ||||
| such as the packets sent after receiving a Version Negotiation | ||||
| (Section 4.3) or Retry packet (Section 4.4.2). | ||||
| A server sends its first Initial packet in response to a client | ||||
| Initial. A server may send multiple Initial packets. The | ||||
| cryptographic key exchange could require multiple round trips or | ||||
| retransmissions of this data. | ||||
| The payload of an Initial packet includes a CRYPTO frame (or frames) | ||||
| containing a cryptographic handshake message, ACK frames, or both. | ||||
| The first CRYPTO frame sent always begins at an offset of 0 (see | ||||
| Section 6.4). The client's complete first message MUST fit in a | ||||
| single packet (see Section 6.4). Note that if the server sends a | ||||
| HelloRetryRequest, the client will send a second Initial packet with | ||||
| a CRYPTO frame with an offset starting at the end of the CRYPTO | ||||
| stream in the first Initial. | ||||
| 4.4.1.1. Connection IDs | ||||
| When an Initial packet is sent by a client which has not previously | ||||
| received a Retry packet from the server, it populates the Destination | ||||
| Connection ID field with an unpredictable value. This MUST be at | ||||
| least 8 octets in length. Until a packet is received from the | ||||
| server, the client MUST use the same value unless it abandons the | ||||
| connection attempt and starts a new one. The initial Destination | ||||
| Connection ID is used to determine packet protection keys for Initial | ||||
| packets. | ||||
| The client populates the Source Connection ID field with a value of | The client populates the Source Connection ID field with a value of | |||
| its choosing and sets the SCIL field to match. | its choosing and sets the SCIL field to match. | |||
| The first Initial packet that is sent by a client contains a packet | The Destination Connection ID field in the server's Initial packet | |||
| number of 0. All subsequent packets contain a packet number that is | contains a connection ID that is chosen by the recipient of the | |||
| incremented by at least one, see (Section 4.8). | packet (i.e., the client); the Source Connection ID includes the | |||
| connection ID that the sender of the packet wishes to use (see | ||||
| Section 6.1). The server MUST use consistent Source Connection IDs | ||||
| during the handshake. | ||||
| The payload of an Initial packet conveys a STREAM frame (or frames) | On first receiving an Initial or Retry packet from the server, the | |||
| for stream 0 containing a cryptographic handshake message. The | client uses the Source Connection ID supplied by the server as the | |||
| stream in this packet always starts at an offset of 0 (see | Destination Connection ID for subsequent packets. Once a client has | |||
| Section 6.5) and the complete cryptographic handshake message MUST | received an Initial packet from the server, it MUST discard any | |||
| fit in a single packet (see Section 6.3). | packet it receives with a different Source Connection ID. | |||
| 4.4.1.2. Tokens | ||||
| If the client has a suitable token available from a previous | ||||
| connection, it SHOULD populate the Token field. | ||||
| If the client received a Retry packet from the server and sends an | ||||
| Initial packet in response, then it sets the Destination Connection | ||||
| ID to the value from the Source Connection ID in the Retry packet. | ||||
| Changing Destination Connection ID also results in a change to the | ||||
| keys used to protect the Initial packet. It also sets the Token | ||||
| field to the token provided in the Retry. The client MUST NOT change | ||||
| the Source Connection ID because the server could include the | ||||
| connection ID as part of its token validation logic. | ||||
| When a server receives an Initial packet with an address validation | ||||
| token, it SHOULD attempt to validate it. If the token is invalid | ||||
| then the server SHOULD proceed as if the client did not have a | ||||
| validated address, including potentially sending a Retry. If the | ||||
| validation succeeds, the server SHOULD then allow the handshake to | ||||
| proceed (see Section 6.7). | ||||
| Note: The rationale for treating the client as unvalidated rather | ||||
| than discarding the packet is that the client might have received | ||||
| the token in a previous connection using the NEW_TOKEN frame, and | ||||
| if the server has lost state, it might be unable to validate the | ||||
| token at all, leading to connection failure if the packet is | ||||
| discarded. | ||||
| 4.4.1.3. Starting Packet Numbers | ||||
| The first Initial packet contains a packet number of 0. Each packet | ||||
| sent after the Initial packet is associated with a packet number | ||||
| space and its packet number increases monotonically in that space | ||||
| (see Section 4.8). | ||||
| 4.4.1.4. Minimum Packet Size | ||||
| The payload of a UDP datagram carrying the Initial packet MUST be | The payload of a UDP datagram carrying the Initial packet MUST be | |||
| expanded to at least 1200 octets (see Section 8), by adding PADDING | expanded to at least 1200 octets (see Section 8), by adding PADDING | |||
| frames to the Initial packet and/or by combining the Initial packet | frames to the Initial packet and/or by combining the Initial packet | |||
| with a 0-RTT packet (see Section 4.6). | with a 0-RTT packet (see Section 4.6). | |||
| The client uses the Initial packet type for any packet that contains | ||||
| an initial cryptographic handshake message. This includes all cases | ||||
| where a new packet containing the initial cryptographic message needs | ||||
| to be created, this includes the packets sent after receiving a | ||||
| Version Negotiation (Section 4.3) or Retry packet (Section 4.4.2). | ||||
| 4.4.2. Retry Packet | 4.4.2. Retry Packet | |||
| A Retry packet uses long headers with a type value of 0x7E. It | A Retry packet uses long headers with a type value of 0x7E. It | |||
| carries cryptographic handshake messages and acknowledgments. It is | carries an address validation token created by the server. It is | |||
| used by a server that wishes to perform a stateless retry (see | used by a server that wishes to perform a stateless retry (see | |||
| Section 6.5). | Section 6.7). | |||
| 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ODCIL(8 | Original Destination Connection ID (*) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Retry Token (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| A Retry packet is not encrypted at all. Instead, the payload of a | ||||
| Retry packet contains two values in the clear. | ||||
| ODCIL: The length of the Original Destination Connection ID. | ||||
| Original Destination Connection ID: The Destination Connection ID | ||||
| from the Initial packet that this Retry is in response to. The | ||||
| length of this field is given in DCIL. | ||||
| Retry Token: An opaque token that the server can use to validate the | ||||
| client's address. | ||||
| The server populates the Destination Connection ID with the | The server populates the Destination Connection ID with the | |||
| connection ID that the client included in the Source Connection ID of | connection ID that the client included in the Source Connection ID of | |||
| the Initial packet. This might be a zero-length value. | the Initial packet. This might be a zero-length value. | |||
| The server includes a connection ID of its choice in the Source | The server includes a connection ID of its choice in the Source | |||
| Connection ID field. The client MUST use this connection ID in the | Connection ID field. The client MUST use this connection ID in the | |||
| Destination Connection ID of subsequent packets that it sends. | Destination Connection ID of subsequent packets that it sends. | |||
| The Packet Number field of a Retry packet MUST be set to 0. This | The Packet Number field of a Retry packet MUST be set to 0. This | |||
| value is subsequently protected as normal. [[Editor's Note: This | value is subsequently protected as normal. [[Editor's Note: This | |||
| isn't ideal, because it creates a "cheat" where the client assumes a | isn't ideal, because it creates a "cheat" where the client assumes a | |||
| value. That's a problem, so I'm tempted to suggest that this include | value. That's a problem, so I'm tempted to suggest that this include | |||
| any value less than 2^30 so that normal processing works - and can be | any value less than 2^30 so that normal processing works - and can be | |||
| properly exercised.]] | properly exercised.]] | |||
| A Retry packet is never explicitly acknowledged in an ACK frame by a | A Retry packet is never explicitly acknowledged in an ACK frame by a | |||
| client. Receiving another Initial packet implicitly acknowledges a | client. | |||
| Retry packet. | ||||
| After receiving a Retry packet, the client uses a new Initial packet | A server MUST only send a Retry in response to a client Initial | |||
| containing the next cryptographic handshake message. The client | packet. | |||
| retains the state of its cryptographic handshake, but discards all | ||||
| transport state. The Initial packet that is generated in response to | ||||
| a Retry packet includes STREAM frames on stream 0 that start again at | ||||
| an offset of 0. | ||||
| Continuing the cryptographic handshake is necessary to ensure that an | If the Original Destination Connection ID field does not match the | |||
| attacker cannot force a downgrade of any cryptographic parameters. | Destination Connection ID from most recent the Initial packet it | |||
| In addition to continuing the cryptographic handshake, the client | sent, clients MUST discard the packet. This prevents an off-path | |||
| MUST remember the results of any version negotiation that occurred | attacker from injecting a Retry packet with a bogus new Source | |||
| (see Section 6.2). The client MAY also retain any observed RTT or | Connection ID. | |||
| congestion state that it has accumulated for the flow, but other | ||||
| transport state MUST be discarded. | ||||
| The payload of the Retry packet contains at least two frames. It | Otherwise, the client SHOULD respond with a new Initial packet with | |||
| MUST include a STREAM frame on stream 0 with offset 0 containing the | the Token field set to the token received in the Retry packet. | |||
| server's cryptographic stateless retry material. It MUST also | ||||
| include an ACK frame to acknowledge the client's Initial packet. It | ||||
| MAY additionally include PADDING frames. The next STREAM frame sent | ||||
| by the server will also start at stream offset 0. | ||||
| 4.4.3. Handshake Packet | 4.4.3. Handshake Packet | |||
| A Handshake packet uses long headers with a type value of 0x7D. It | A Handshake packet uses long headers with a type value of 0x7D. It | |||
| is used to carry acknowledgments and cryptographic handshake messages | is used to carry acknowledgments and cryptographic handshake messages | |||
| from the server and client. | from the server and client. | |||
| A server sends its cryptographic handshake in one or more Handshake | A server sends its cryptographic handshake in one or more Handshake | |||
| packets in response to an Initial packet if it does not send a Retry | packets in response to an Initial packet if it does not send a Retry | |||
| packet. Once a client has received a Handshake packet from a server, | packet. Once a client has received a Handshake packet from a server, | |||
| it uses Handshake packets to send subsequent cryptographic handshake | it uses Handshake packets to send subsequent cryptographic handshake | |||
| messages and acknowledgments to the server. | messages and acknowledgments to the server. | |||
| The Destination Connection ID field in a Handshake packet contains a | The Destination Connection ID field in a Handshake packet contains a | |||
| connection ID that is chosen by the recipient of the packet; the | connection ID that is chosen by the recipient of the packet; the | |||
| Source Connection ID includes the connection ID that the sender of | Source Connection ID includes the connection ID that the sender of | |||
| the packet wishes to use (see Section 4.7). | the packet wishes to use (see Section 4.7). | |||
| The first Handshake packet sent by a server contains a packet number | The first Handshake packet sent by a server contains a packet number | |||
| of 0. Packet numbers are incremented normally for other Handshake | of 0. Handshake packets are their own packet number space. Packet | |||
| packets. | numbers are incremented normally for other Handshake packets. | |||
| Servers MUST NOT send more than three Handshake packets without | ||||
| receiving a packet from a verified source address. Source addresses | ||||
| can be verified through an address validation token, receipt of the | ||||
| final cryptographic message from the client, or by receiving a valid | ||||
| PATH_RESPONSE frame from the client. | ||||
| If the server expects to generate more than three Handshake packets | Servers MUST NOT send more than three datagrams including Initial and | |||
| in response to an Initial packet, it SHOULD include a PATH_CHALLENGE | Handshake packets without receiving a packet from a verified source | |||
| frame in each Handshake packet that it sends. After receiving at | address. Source addresses can be verified through an address | |||
| least one valid PATH_RESPONSE frame, the server can send its | validation token (delivered via a Retry packet or a NEW_TOKEN frame) | |||
| remaining Handshake packets. Servers can instead perform address | or by receiving any message from the client encrypted using the | |||
| validation using a Retry packet; this requires less state on the | Handshake keys. | |||
| server, but could involve additional computational effort depending | ||||
| on implementation choices. | ||||
| The payload of this packet contains STREAM frames and could contain | The payload of this packet contains CRYPTO frames and could contain | |||
| PADDING, ACK, PATH_CHALLENGE, or PATH_RESPONSE frames. Handshake | PADDING, or ACK frames. Handshake packets MAY contain | |||
| packets MAY contain CONNECTION_CLOSE frames if the handshake is | CONNECTION_CLOSE frames if the handshake is unsuccessful. | |||
| unsuccessful. | ||||
| 4.5. Protected Packets | 4.5. Protected Packets | |||
| All QUIC packets are protected. Packets that are protected with the | All QUIC packets use packet protection. Packets that are protected | |||
| static handshake keys or the 0-RTT keys are sent with long headers; | with the static handshake keys or the 0-RTT keys are sent with long | |||
| all packets protected with 1-RTT keys are sent with short headers. | headers; all packets protected with 1-RTT keys are sent with short | |||
| The different packet types explicitly indicate the encryption level | headers. The different packet types explicitly indicate the | |||
| and therefore the keys that are used to remove packet protection. | encryption level and therefore the keys that are used to remove | |||
| packet protection. 0-RTT and 1-RTT protected packets share a single | ||||
| packet number space. | ||||
| Packets protected with handshake keys only use packet protection to | ||||
| ensure that the sender of the packet is on the network path. This | ||||
| packet protection is not effective confidentiality protection; any | ||||
| entity that receives the Initial packet from a client can recover the | ||||
| keys necessary to remove packet protection or to generate packets | ||||
| that will be successfully authenticated. | ||||
| Packets protected with 0-RTT and 1-RTT keys are expected to have | ||||
| confidentiality and data origin authentication; the cryptographic | ||||
| handshake ensures that only the communicating endpoints receive the | ||||
| corresponding keys. | ||||
| Packets protected with 0-RTT keys use a type value of 0x7C. The | Packets protected with 0-RTT keys use a type value of 0x7C. The | |||
| connection ID fields for a 0-RTT packet MUST match the values used in | connection ID fields for a 0-RTT packet MUST match the values used in | |||
| the Initial packet (Section 4.4.1). | the Initial packet (Section 4.4.1). | |||
| The client can send 0-RTT packets after receiving a Handshake packet | The client can send 0-RTT packets after receiving an Initial | |||
| (Section 4.4.3), if that packet does not complete the handshake. | Section 4.4.1 or Handshake (Section 4.4.3) packet, if that packet | |||
| Even if the client receives a different connection ID in the | does not complete the handshake. Even if the client receives a | |||
| Handshake packet, it MUST continue to use the same Destination | different connection ID in the Handshake packet, it MUST continue to | |||
| Connection ID for 0-RTT packets, see Section 4.7. | use the same Destination Connection ID for 0-RTT packets, see | |||
| Section 4.7. | ||||
| 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 has | The packet number field contains a packet number, which has | |||
| additional confidentiality protection that is applied after packet | additional confidentiality protection that is applied after packet | |||
| protection is applied (see [QUIC-TLS] for details). The underlying | protection is applied (see [QUIC-TLS] for details). The underlying | |||
| packet number increases with each packet sent, see Section 4.8 for | packet number increases with each packet sent, see Section 4.8 for | |||
| details. | 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 5. | Section 5. | |||
| 4.6. Coalescing Packets | 4.6. Coalescing Packets | |||
| A sender can coalesce multiple QUIC packets (typically a | A sender can coalesce multiple QUIC packets (typically a | |||
| Cryptographic Handshake packet and a Protected packet) into one UDP | Cryptographic Handshake packet and a Protected packet) into one UDP | |||
| datagram. This can reduce the number of UDP datagrams needed to send | datagram. This can reduce the number of UDP datagrams needed to send | |||
| application data during the handshake and immediately afterwards. A | application data during the handshake and immediately afterwards. It | |||
| packet with a short header does not include a length, so it has to be | is not necessary for senders to coalesce packets, though failing to | |||
| the last packet included in a UDP datagram. | do so will require sending a significantly larger number of datagrams | |||
| during the handshake. Receivers MUST be able to process coalesced | ||||
| packets. | ||||
| The sender MUST NOT coalesce QUIC packets belonging to different QUIC | Senders SHOULD coalesce packets in order of increasing encryption | |||
| connections into a single UDP datagram. | levels (Initial, Handshake, 0-RTT, 1-RTT), as this makes it more | |||
| likely the receiver will be able to process all the packets in a | ||||
| single pass. A packet with a short header does not include a length, | ||||
| so it will always be the last packet included in a UDP datagram. | ||||
| Senders MUST NOT coalesce QUIC packets with different Destination | ||||
| Connection IDs into a single UDP datagram. Receivers SHOULD ignore | ||||
| any subsequent packets with a different Destination Connection ID | ||||
| than the first packet in the datagram. | ||||
| Every QUIC packet that is coalesced into a single UDP datagram is | Every QUIC packet that is coalesced into a single UDP datagram is | |||
| separate and complete. Though the values of some fields in the | separate and complete. Though the values of some fields in the | |||
| packet header might be redundant, no fields are omitted. The | packet header might be redundant, no fields are omitted. The | |||
| receiver of coalesced QUIC packets MUST individually process each | receiver of coalesced QUIC packets MUST individually process each | |||
| QUIC packet and separately acknowledge them, as if they were received | QUIC packet and separately acknowledge them, as if they were received | |||
| as the payload of different UDP datagrams. | as the payload of different UDP datagrams. If one or more packets in | |||
| a datagram cannot be processed yet (because the keys are not yet | ||||
| available) or processing fails (decryption failure, unknown type, | ||||
| etc.), the receiver MUST still attempt to process the remaining | ||||
| packets. The skipped packets MAY either be discarded or buffered for | ||||
| later processing, just as if the packets were received out-of-order | ||||
| in separate datagrams. | ||||
| 4.7. Connection ID | 4.7. Connection ID Encoding | |||
| A connection ID is used to ensure consistent routing of packets. The | A connection ID is used to ensure consistent routing of packets, as | |||
| long header contains two connection IDs: the Destination Connection | described in Section 6.1. The long header contains two connection | |||
| ID is chosen by the recipient of the packet and is used to provide | IDs: the Destination Connection ID is chosen by the recipient of the | |||
| consistent routing; the Source Connection ID is used to set the | packet and is used to provide consistent routing; the Source | |||
| Destination Connection ID used by the peer. | Connection ID is used to set the Destination Connection ID used by | |||
| the peer. | ||||
| During the handshake, packets with the long header are used to | During the handshake, packets with the long header are used to | |||
| establish the connection ID that each endpoint uses. Each endpoint | establish the connection ID that each endpoint uses. Each endpoint | |||
| uses the Source Connection ID field to specify the connection ID that | uses the Source Connection ID field to specify the connection ID that | |||
| is used in the Destination Connection ID field of packets being sent | is used in the Destination Connection ID field of packets being sent | |||
| to them. Upon receiving a packet, each endpoint sets the Destination | to them. Upon receiving a packet, each endpoint sets the Destination | |||
| Connection ID it sends to match the value of the Source Connection ID | Connection ID it sends to match the value of the Source Connection ID | |||
| that they receive. | that they receive. | |||
| During the handshake, an endpoint might receive multiple packets with | During the handshake, an endpoint might receive multiple packets with | |||
| the long header, and thus be given multiple opportunities to update | the long header, and thus be given multiple opportunities to update | |||
| the Destination Connection ID it sends. A client MUST only change | the Destination Connection ID it sends. A client MUST only change | |||
| the value it sends in the Destination Connection ID in response to | the value it sends in the Destination Connection ID in response to | |||
| the first packet of each type it receives from the server (Retry or | the first packet of each type it receives from the server (Retry or | |||
| Handshake); a server MUST set its value based on the Initial packet. | Initial); a server MUST set its value based on the Initial packet. | |||
| Any additional changes are not permitted; if subsequent packets of | Any additional changes are not permitted; if subsequent packets of | |||
| those types include a different Source Connection ID, they MUST be | those types include a different Source Connection ID, they MUST be | |||
| discarded. This avoids problems that might arise from stateless | discarded. This avoids problems that might arise from stateless | |||
| processing of multiple Initial packets producing different connection | processing of multiple Initial packets producing different connection | |||
| IDs. | IDs. | |||
| Short headers only include the Destination Connection ID and omit the | Short headers only include the Destination Connection ID and omit the | |||
| explicit length. The length of the Destination Connection ID field | explicit length. The length of the Destination Connection ID field | |||
| is expected to be known to endpoints. | is expected to be known to endpoints. | |||
| skipping to change at page 18, line 35 ¶ | skipping to change at page 21, line 33 ¶ | |||
| Destination Connection ID. The same value MUST be used for all 0-RTT | Destination Connection ID. The same value MUST be used for all 0-RTT | |||
| packets sent on that connection (Section 4.5). This randomized value | packets sent on that connection (Section 4.5). This randomized value | |||
| is used to determine the handshake packet protection keys (see | is used to determine the handshake packet protection keys (see | |||
| Section 5.3.2 of [QUIC-TLS]). | Section 5.3.2 of [QUIC-TLS]). | |||
| A Version Negotiation (Section 4.3) packet MUST use both connection | A Version Negotiation (Section 4.3) packet MUST use both connection | |||
| IDs selected by the client, swapped to ensure correct routing toward | IDs selected by the client, swapped to ensure correct routing toward | |||
| the client. | the client. | |||
| The connection ID can change over the lifetime of a connection, | The connection ID can change over the lifetime of a connection, | |||
| especially in response to connection migration (Section 6.8). | especially in response to connection migration (Section 6.11). | |||
| NEW_CONNECTION_ID frames (Section 7.13) are used to provide new | NEW_CONNECTION_ID frames (Section 7.13) are used to provide new | |||
| connection ID values. | connection ID values. | |||
| 4.8. Packet Numbers | 4.8. Packet Numbers | |||
| The packet number is an integer in the range 0 to 2^62-1. The value | The packet number is an integer in the range 0 to 2^62-1. The value | |||
| is used in determining the cryptographic nonce for packet encryption. | is used in determining the cryptographic nonce for packet encryption. | |||
| Each endpoint maintains a separate packet number for sending and | Each endpoint maintains a separate packet number for sending and | |||
| receiving. The packet number for sending MUST start at zero for the | receiving. | |||
| first packet sent and MUST increase by at least one after sending a | ||||
| packet. | ||||
| A QUIC endpoint MUST NOT reuse a packet number within the same | Packet numbers are divided into 3 spaces in QUIC: | |||
| connection (that is, under the same cryptographic keys). If the | ||||
| packet number for sending reaches 2^62 - 1, the sender MUST close the | o Initial space: All Initial packets Section 4.4.1 are in this | |||
| connection without sending a CONNECTION_CLOSE frame or any further | space. | |||
| packets; a server MAY send a Stateless Reset (Section 6.10.4) in | ||||
| response to further packets that it receives. | o Handshake space: All Handshake packets Section 4.4.3 are in this | |||
| space. | ||||
| o Application data space: All 0-RTT and 1-RTT encrypted packets | ||||
| Section 4.5 are in this space. | ||||
| As described in [QUIC-TLS], each packet type uses different | ||||
| encryption keys. | ||||
| Conceptually, a packet number space is the encryption context in | ||||
| which a packet can be processed and ACKed. Initial packets can only | ||||
| be sent with Initial encryption keys and ACKed in packets which are | ||||
| also Initial packets. Similarly, Handshake packets can only be sent | ||||
| and acknowledged in Handshake packets. | ||||
| This enforces cryptographic separation between the data sent in the | ||||
| different packet sequence number spaces. Each packet number space | ||||
| starts at packet number 0. Subsequent packets sent in the same | ||||
| packet number space MUST increase the packet number by at least one. | ||||
| 0-RTT and 1-RTT data exist in the same packet number space to make | ||||
| loss recovery algorithms easier to implement between the two packet | ||||
| types. | ||||
| A QUIC endpoint MUST NOT reuse a packet number within the same packet | ||||
| number space in one connection (that is, under the same cryptographic | ||||
| keys). If the packet number for sending reaches 2^62 - 1, the sender | ||||
| MUST close the connection without sending a CONNECTION_CLOSE frame or | ||||
| any further packets; an endpoint MAY send a Stateless Reset | ||||
| (Section 6.13.4) in response to further packets that it receives. | ||||
| In the QUIC long and short packet headers, the number of bits | In the QUIC long and short packet headers, the number of bits | |||
| required to represent the packet number are reduced by including only | required to represent the packet number are reduced by including only | |||
| a variable number of the least significant bits of the packet number. | a variable number of the least significant bits of the packet number. | |||
| One or two of the most significant bits of the first octet determine | One or two of the most significant bits of the first octet determine | |||
| how many bits of the packet number are provided, as shown in Table 2. | how many bits of the packet number are provided, as shown in Table 2. | |||
| +---------------------+----------------+--------------+ | +---------------------+----------------+--------------+ | |||
| | First octet pattern | Encoded Length | Bits Present | | | First octet pattern | Encoded Length | Bits Present | | |||
| +---------------------+----------------+--------------+ | +---------------------+----------------+--------------+ | |||
| skipping to change at page 19, line 41 ¶ | skipping to change at page 23, line 18 ¶ | |||
| reconstructed at the receiver based on the number of significant bits | reconstructed at the receiver based on the number of significant bits | |||
| present, the content of those bits, and the largest packet number | present, the content of those bits, and the largest packet number | |||
| received on a successfully authenticated packet. Recovering the full | received on a successfully authenticated packet. Recovering the full | |||
| packet number is necessary to successfully remove packet protection. | packet number is necessary to successfully remove packet protection. | |||
| Once packet number protection is removed, the packet number is | Once packet number protection is removed, the packet number is | |||
| decoded by finding the packet number value that is closest to the | decoded by finding the packet number value that is closest to the | |||
| next expected packet. The next expected packet is the highest | next expected packet. The next expected packet is the highest | |||
| received packet number plus one. For example, if the 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 14-bit value of 0x1f94 will be decoded as | then a packet containing a 14-bit value of 0x9b3 will be decoded as | |||
| 0xaa831f94. | 0xaa8309b3. | |||
| 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 | |||
| twice as large a range than the difference between the largest | twice as large a range than the difference between the largest | |||
| acknowledged packet and packet number being sent. A peer receiving | acknowledged packet and packet number being sent. A peer receiving | |||
| the packet will then correctly decode the packet number, unless the | the packet will then correctly decode the packet number, unless the | |||
| packet is delayed in transit such that it arrives after many higher- | packet is delayed in transit such that it arrives after many higher- | |||
| numbered packets have been received. An endpoint SHOULD use a large | numbered packets have been received. An endpoint SHOULD use a large | |||
| enough packet number encoding to allow the packet number to be | enough packet number encoding to allow the packet number to be | |||
| recovered even if the packet arrives after packets that are sent | recovered even if the packet arrives after packets that are sent | |||
| afterwards. | afterwards. | |||
| skipping to change at page 20, line 45 ¶ | skipping to change at page 24, line 23 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame N (*) ... | | Frame N (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: Contents of Protected Payload | Figure 4: Contents of Protected Payload | |||
| Protected payloads MUST contain at least one frame, and MAY contain | Protected payloads MUST contain at least one frame, and MAY contain | |||
| multiple frames and multiple frame types. | multiple frames and multiple frame types. | |||
| Frames MUST fit within a single QUIC packet and MUST NOT span a QUIC | Frames MUST fit within a single QUIC packet and MUST NOT span a QUIC | |||
| packet boundary. Each frame begins with a Frame Type byte, | packet boundary. Each frame begins with a Frame Type, indicating its | |||
| indicating its type, followed by additional type-dependent fields: | type, followed by additional type-dependent fields: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type (8) | Type-Dependent Fields (*) ... | | Type (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Type-Dependent Fields (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: Generic Frame Layout | Figure 5: Generic Frame Layout | |||
| Frame types are listed in Table 3. Note that the Frame Type byte in | The frame types defined in this specification are listed in Table 3. | |||
| STREAM frames is used to carry other frame-specific flags. For all | The Frame Type in STREAM frames is used to carry other frame-specific | |||
| other frames, the Frame Type byte simply identifies the frame. These | flags. For all other frames, the Frame Type field simply identifies | |||
| frames are explained in more detail as they are referenced later in | the frame. These frames are explained in more detail as they are | |||
| the document. | referenced later in the document. | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| | Type Value | Frame Type Name | Definition | | | Type Value | Frame Type Name | Definition | | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| | 0x00 | PADDING | Section 7.2 | | | 0x00 | PADDING | Section 7.2 | | |||
| | | | | | | | | | | |||
| | 0x01 | RST_STREAM | Section 7.3 | | | 0x01 | RST_STREAM | Section 7.3 | | |||
| | | | | | | | | | | |||
| | 0x02 | CONNECTION_CLOSE | Section 7.4 | | | 0x02 | CONNECTION_CLOSE | Section 7.4 | | |||
| | | | | | | | | | | |||
| skipping to change at page 22, line 36 ¶ | skipping to change at page 25, line 36 ¶ | |||
| | 0x09 | STREAM_BLOCKED | Section 7.11 | | | 0x09 | STREAM_BLOCKED | Section 7.11 | | |||
| | | | | | | | | | | |||
| | 0x0a | STREAM_ID_BLOCKED | Section 7.12 | | | 0x0a | STREAM_ID_BLOCKED | Section 7.12 | | |||
| | | | | | | | | | | |||
| | 0x0b | NEW_CONNECTION_ID | Section 7.13 | | | 0x0b | NEW_CONNECTION_ID | Section 7.13 | | |||
| | | | | | | | | | | |||
| | 0x0c | STOP_SENDING | Section 7.14 | | | 0x0c | STOP_SENDING | Section 7.14 | | |||
| | | | | | | | | | | |||
| | 0x0d | ACK | Section 7.15 | | | 0x0d | ACK | Section 7.15 | | |||
| | | | | | | | | | | |||
| | 0x0e | PATH_CHALLENGE | Section 7.16 | | | 0x0e | PATH_CHALLENGE | Section 7.17 | | |||
| | | | | | | | | | | |||
| | 0x0f | PATH_RESPONSE | Section 7.17 | | | 0x0f | PATH_RESPONSE | Section 7.18 | | |||
| | | | | | | | | | | |||
| | 0x10 - 0x17 | STREAM | Section 7.18 | | | 0x10 - 0x17 | STREAM | Section 7.20 | | |||
| | | | | | ||||
| | 0x18 | CRYPTO | Section 7.21 | | ||||
| | | | | | ||||
| | 0x19 | NEW_TOKEN | Section 7.19 | | ||||
| | | | | | ||||
| | 0x20 | ACK_ECN | Section 7.16 | | ||||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| Table 3: Frame Types | Table 3: Frame Types | |||
| All QUIC frames are idempotent. That is, a valid frame does not | ||||
| cause undesirable side effects or errors when received more than | ||||
| once. | ||||
| The Frame Type field uses a variable length integer encoding (see | ||||
| Section 7.1) with one exception. To ensure simple and efficient | ||||
| implementations of frame parsing, a frame type MUST use the shortest | ||||
| possible encoding. Though a two-, four- or eight-octet encoding of | ||||
| the frame types defined in this document is possible, the Frame Type | ||||
| field for these frames are encoded on a single octet. For instance, | ||||
| though 0x4007 is a legitimate two-octet encoding for a variable- | ||||
| length integer with a value of 7, PING frames are always encoded as a | ||||
| single octet with the value 0x07. An endpoint MUST treat the receipt | ||||
| of a frame type that uses a longer encoding than necessary as a | ||||
| connection error of type PROTOCOL_VIOLATION. | ||||
| 5.1. Extension Frames | ||||
| QUIC frames do not use a self-describing encoding. An endpoint | ||||
| therefore needs to understand the syntax of all frames before it can | ||||
| successfully process a packet. This allows for efficient encoding of | ||||
| frames, but it means that an endpoint cannot send a frame of a type | ||||
| that is unknown to its peer. | ||||
| An extension to QUIC that wishes to use a new type of frame MUST | ||||
| first ensure that a peer is able to understand the frame. An | ||||
| endpoint can use a transport parameter to signal its willingness to | ||||
| receive one or more extension frame types with the one transport | ||||
| parameter. | ||||
| An IANA registry is used to manage the assignment of frame types, see | ||||
| Section 13.2. | ||||
| 6. Life of a Connection | 6. 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 6.3. Once | connection establishment latency, as described in Section 6.4. Once | |||
| established, a connection may migrate to a different IP or port at | established, a connection may migrate to a different IP or port at | |||
| either endpoint, due to NAT rebinding or mobility, as described in | either endpoint, due to NAT rebinding or mobility, as described in | |||
| Section 6.8. Finally a connection may be terminated by either | Section 6.11. Finally a connection may be terminated by either | |||
| endpoint, as described in Section 6.10. | endpoint, as described in Section 6.13. | |||
| 6.1. Matching Packets to Connections | 6.1. Connection ID | |||
| Each connection is identified by a collection of identifiers assigned | ||||
| to it. A connection ID can be 0 octets in length (and thus unlikely | ||||
| to be unique), or between 4 and 18 octets (inclusive). Connection | ||||
| IDs are selected independently in each direction. | ||||
| The primary function of a connection ID is to ensure that changes in | ||||
| addressing at lower protocol layers (UDP, IP, and below) don't cause | ||||
| packets for a QUIC connection to be delivered to the wrong endpoint. | ||||
| Each endpoint selects connection IDs using an implementation-specific | ||||
| (and perhaps deployment-specific) method which will allow packets | ||||
| with that connection ID to be routed back to the endpoint and | ||||
| identified by the endpoint upon receipt. | ||||
| A zero-length connection ID MAY be used when the connection ID is not | ||||
| needed for routing and the address/port tuple of packets is | ||||
| sufficient to associate them to a connection. An endpoint whose peer | ||||
| has selected a zero-length connection ID MUST continue to use a zero- | ||||
| length connection ID for the lifetime of the connection and MUST NOT | ||||
| send packets from any other local address. | ||||
| When an endpoint has requested a non-zero-length connection ID, it | ||||
| will issue a series of connection IDs over the lifetime of a | ||||
| connection. The series of connection IDs issued by an endpoint is | ||||
| ordered, with the final connection ID selected during the handshake | ||||
| coming first. Additional connection IDs are provided using the | ||||
| NEW_CONNECTION_ID frame (Section 7.13), each with a specified | ||||
| sequence number. The series of connection IDs issued SHOULD be | ||||
| contiguous, but might not appear to be upon receipt due to reordering | ||||
| or loss. | ||||
| Each connection ID MUST be used on only one local address. When | ||||
| packets are sent for the first time on a new local address, a new | ||||
| connection ID MUST be used with a higher sequence number than any | ||||
| connection ID previously used on any local address. At any time, an | ||||
| endpoint MAY change to a new connection ID on a local address already | ||||
| in use. | ||||
| An endpoint MUST NOT send packets with a connection ID which has a | ||||
| lower sequence number than the highest sequence number of any | ||||
| connection ID ever sent or received on that local address. This | ||||
| ensures that when an endpoint migrates to a new path or changes | ||||
| connection ID on an existing path, the packets will use a new | ||||
| connection ID in both directions. | ||||
| Implementations SHOULD ensure that peers have a connection ID with a | ||||
| matching sequence number available when changing to a new connection | ||||
| ID. An implementation could do this by always supplying a | ||||
| corresponding connection ID to a peer for each connection ID received | ||||
| from that peer. | ||||
| While endpoints select connection IDs as appropriate for their | ||||
| implementation, the connection ID MUST NOT include the unprotected | ||||
| sequence number. Endpoints need to be able to recover the sequence | ||||
| number associated with each connection ID they generate without | ||||
| relying on information available to unaffiliate parties. A | ||||
| connection ID that encodes an unencrypted sequence number could be | ||||
| used to correlate connection IDs across network paths. | ||||
| 6.2. 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, or - for servers - | associated with an existing connection, or - for servers - | |||
| potentially create a new connection. | potentially create a new connection. | |||
| Hosts try to associate a packet with an existing connection. If the | Hosts try to associate a packet with an existing connection. If the | |||
| packet has a Destination Connection ID corresponding to an existing | packet has a Destination Connection ID corresponding to an existing | |||
| connection, QUIC processes that packet accordingly. Note that a | connection, QUIC processes that packet accordingly. Note that more | |||
| NEW_CONNECTION_ID frame (Section 7.13) would associate more than one | than one connection ID can be associated with a connection; see | |||
| connection ID with a connection. | Section 6.1. | |||
| If the Destination Connection ID is zero length and the packet | If the Destination Connection ID is zero length and the packet | |||
| matches the address/port tuple of a connection where the host did not | matches the address/port tuple of a connection where the host did not | |||
| require connection IDs, QUIC processes the packet as part of that | require connection IDs, QUIC processes the packet as part of that | |||
| connection. Endpoints MUST drop packets with zero-length Destination | connection. Endpoints MUST drop packets with zero-length Destination | |||
| Connection ID fields if they do not correspond to a single | Connection ID fields if they do not correspond to a single | |||
| connection. | connection. | |||
| 6.1.1. Client Packet Handling | 6.2.1. Client Packet Handling | |||
| Valid packets sent to clients always include a Destination Connection | Valid packets sent to clients always include a Destination Connection | |||
| ID that matches the value the client selects. Clients that choose to | ID that matches the value the client selects. Clients that choose to | |||
| receive zero-length connection IDs can use the address/port tuple to | receive zero-length connection IDs can use the address/port tuple to | |||
| identify a connection. Packets that don't match an existing | identify a connection. Packets that don't match an existing | |||
| connection MAY be discarded. | connection MAY be discarded. | |||
| Due to packet reordering or loss, clients might receive packets for a | Due to packet reordering or loss, clients might receive packets for a | |||
| connection that are encrypted with a key it has not yet computed. | connection that are encrypted with a key it has not yet computed. | |||
| Clients MAY drop these packets, or MAY buffer them in anticipation of | Clients MAY drop these packets, or MAY buffer them in anticipation of | |||
| later packets that allow it to compute the key. | later packets that allow it to compute the key. | |||
| If a client receives a packet that has an unsupported version, it | If a client receives a packet that has an unsupported version, it | |||
| MUST discard that packet. | MUST discard that packet. | |||
| 6.1.2. Server Packet Handling | 6.2.2. Server Packet Handling | |||
| If a server receives a packet that has an unsupported version and | If a server receives a packet that has an unsupported version and | |||
| sufficient length to be an Initial packet for some version supported | sufficient length to be an Initial packet for some version supported | |||
| by the server, it SHOULD send a Version Negotiation packet as | by the server, it SHOULD send a Version Negotiation packet as | |||
| described in Section 6.2.1. Servers MAY rate control these packets | described in Section 6.3.1. Servers MAY rate control these packets | |||
| to avoid storms of Version Negotiation packets. | to avoid storms of Version Negotiation packets. | |||
| The first packet for an unsupported version can use different | The first packet for an unsupported version can use different | |||
| semantics and encodings for any version-specific field. In | semantics and encodings for any version-specific field. In | |||
| particular, different packet protection keys might be used for | particular, different packet protection keys might be used for | |||
| different versions. Servers that do not support a particular version | different versions. Servers that do not support a particular version | |||
| are unlikely to be able to decrypt the content of the packet. | are unlikely to be able to decrypt the content of the packet. | |||
| Servers SHOULD NOT attempt to decode or decrypt a packet from an | Servers SHOULD NOT attempt to decode or decrypt a packet from an | |||
| unknown version, but instead send a Version Negotiation packet, | unknown version, but instead send a Version Negotiation packet, | |||
| provided that the packet is sufficiently long. | provided that the packet is sufficiently long. | |||
| Servers MUST drop other packets that contain unsupported versions. | Servers MUST drop other packets that contain unsupported versions. | |||
| Packets with a supported version, or no version field, are matched to | Packets with a supported version, or no version field, are matched to | |||
| a connection as described in Section 6.1. If not matched, the server | a connection as described in Section 6.2. If not matched, the server | |||
| continues below. | continues below. | |||
| If the packet is an Initial packet fully conforming with the | If the packet is an Initial packet fully conforming with the | |||
| specification, the server proceeds with the handshake (Section 6.3). | specification, the server proceeds with the handshake (Section 6.4). | |||
| This commits the server to the version that the client selected. | This commits the server to the version that the client selected. | |||
| If a server isn't currently accepting any new connections, it SHOULD | If a server isn't currently accepting any new connections, it SHOULD | |||
| send a Handshake packet containing a CONNECTION_CLOSE frame with | send a Handshake packet containing a CONNECTION_CLOSE frame with | |||
| error code SERVER_BUSY. | error code SERVER_BUSY. | |||
| If the packet is a 0-RTT packet, the server MAY buffer a limited | If the packet is a 0-RTT packet, the server MAY buffer a limited | |||
| number of these packets in anticipation of a late-arriving Initial | number of these packets in anticipation of a late-arriving Initial | |||
| Packet. Clients are forbidden from sending Handshake packets prior | Packet. Clients are forbidden from sending Handshake packets prior | |||
| to receiving a server response, so servers SHOULD ignore any such | to receiving a server response, so servers SHOULD ignore any such | |||
| packets. | packets. | |||
| Servers MUST drop incoming packets under all other circumstances. | Servers MUST drop incoming packets under all other circumstances. | |||
| They SHOULD send a Stateless Reset (Section 6.10.4) if a connection | They SHOULD send a Stateless Reset (Section 6.13.4) if a connection | |||
| ID is present in the header. | ID is present in the header. | |||
| 6.2. Version Negotiation | 6.3. Version Negotiation | |||
| Version negotiation ensures that client and server agree to a QUIC | Version negotiation ensures that client and server agree to a QUIC | |||
| version that is mutually supported. A server sends a Version | version that is mutually supported. A server sends a Version | |||
| Negotiation packet in response to each packet that might initiate a | Negotiation packet in response to each packet that might initiate a | |||
| new connection, see Section 6.1 for details. | new connection, see Section 6.2 for details. | |||
| The size of the first packet sent by a client will determine whether | The size of the first packet sent by a client will determine whether | |||
| a server sends a Version Negotiation packet. Clients that support | a server sends a Version Negotiation packet. Clients that support | |||
| multiple QUIC versions SHOULD pad their Initial packets to reflect | multiple QUIC versions SHOULD pad their Initial packets to reflect | |||
| the largest minimum Initial packet size of all their versions. This | the largest minimum Initial packet size of all their versions. This | |||
| ensures that that the server responds if there are any mutually | ensures that the server responds if there are any mutually supported | |||
| supported versions. | versions. | |||
| 6.2.1. Sending Version Negotiation Packets | 6.3.1. Sending Version Negotiation Packets | |||
| If the version selected by the client is not acceptable to the | If the version selected by the client is not acceptable to the | |||
| server, the server responds with a Version Negotiation packet (see | server, the server responds with a Version Negotiation packet (see | |||
| Section 4.3). This includes a list of versions that the server will | Section 4.3). This includes a list of versions that the server will | |||
| accept. | accept. | |||
| This system allows a server to process packets with unsupported | This system allows a server to process packets with unsupported | |||
| versions without retaining state. Though either the Initial packet | versions without retaining state. Though either the Initial packet | |||
| or the Version Negotiation packet that is sent in response could be | or 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. | |||
| 6.2.2. Handling Version Negotiation Packets | 6.3.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 Destination and Source Connection ID fields match the | checks that the Destination and Source Connection ID fields match the | |||
| Source and Destination Connection ID fields in a packet that the | Source and Destination Connection ID fields in a packet that the | |||
| client sent. If this check fails, the packet MUST be discarded. | client sent. If this 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 Initial | connection using that version. Though the contents of the Initial | |||
| skipping to change at page 25, line 51 ¶ | skipping to change at page 31, line 10 ¶ | |||
| packet, it MUST discard other Version Negotiation packets on the same | packet, it MUST discard other Version Negotiation packets on the same | |||
| connection. Similarly, a client MUST ignore a Version Negotiation | connection. Similarly, a client MUST ignore a Version Negotiation | |||
| packet if it has already received and acted on a Version Negotiation | packet if it has already received and acted on a Version Negotiation | |||
| packet. | packet. | |||
| A client MUST ignore a Version Negotiation packet that lists the | A client MUST ignore a Version Negotiation packet that lists the | |||
| client's chosen version. | client's chosen version. | |||
| Version negotiation packets have no cryptographic protection. The | Version negotiation packets have no cryptographic protection. The | |||
| result of the negotiation MUST be revalidated as part of the | result of the negotiation MUST be revalidated as part of the | |||
| cryptographic handshake (see Section 6.4.4). | cryptographic handshake (see Section 6.6.4). | |||
| 6.2.3. Using Reserved Versions | 6.3.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 3) while generating a | SHOULD include a reserved version (see Section 3) 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. The | maintaining state for packets that it rejects in this fashion. The | |||
| validation of version negotiation (see Section 6.4.4) only validates | validation of version negotiation (see Section 6.6.4) only validates | |||
| the result of version negotiation, which is the same no matter which | the result of version negotiation, which is the same no matter which | |||
| reserved version was sent. A server MAY therefore send different | reserved version was sent. A server MAY therefore send different | |||
| reserved version numbers in the Version Negotiation Packet and in its | reserved version numbers in the Version Negotiation Packet and in its | |||
| transport parameters. | transport parameters. | |||
| 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. | |||
| 6.3. Cryptographic and Transport Handshake | 6.4. 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 uses the CRYPTO | |||
| for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | frame Section 7.21 to transmit the cryptographic handshake. Version | |||
| 1.3 as described in [QUIC-TLS]; a different QUIC version number could | 0x00000001 of QUIC uses TLS 1.3 as described in [QUIC-TLS]; a | |||
| indicate that a different cryptographic handshake protocol is in use. | different QUIC version number could indicate that a different | |||
| cryptographic handshake protocol is in use. | ||||
| QUIC provides this stream with reliable, ordered delivery of data. | QUIC provides reliable, ordered delivery of the cryptographic | |||
| In return, the cryptographic handshake provides QUIC with: | handshake data. QUIC packet protection ensures confidentiality and | |||
| integrity protection that meets the requirements of the cryptographic | ||||
| handshake protocol: | ||||
| o authenticated key exchange, where | o authenticated key exchange, where | |||
| * a server is always authenticated, | * a server is always authenticated, | |||
| * a client is optionally authenticated, | * a client is optionally authenticated, | |||
| * every connection produces distinct and unrelated keys, | * every connection produces distinct and unrelated keys, | |||
| * keying material is usable for packet protection for both 0-RTT | * keying material is usable for packet protection for both 0-RTT | |||
| and 1-RTT packets, and | and 1-RTT packets, and | |||
| * 1-RTT keys have forward secrecy | * 1-RTT keys have forward secrecy | |||
| o authenticated values for the transport parameters of the peer (see | o authenticated values for the transport parameters of the peer (see | |||
| Section 6.4) | Section 6.6) | |||
| o authenticated confirmation of version negotiation (see | o authenticated confirmation of version negotiation (see | |||
| Section 6.4.4) | Section 6.6.4) | |||
| o authenticated negotiation of an application protocol (TLS uses | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [RFC7301] for this purpose) | ALPN [RFC7301] for this purpose) | |||
| o for the server, the ability to carry data that provides assurance | o for the server, the ability to carry data that provides assurance | |||
| that the client can receive packets that are addressed with the | that the client can receive packets that are addressed with the | |||
| transport address that is claimed by the client (see Section 6.6) | transport address that is claimed by the client (see Section 6.9) | |||
| The initial cryptographic handshake message MUST be sent in a single | The initial CRYPTO frame MUST be sent in a single packet. Any second | |||
| packet. Any second attempt that is triggered by address validation | attempt that is triggered by address validation MUST also be sent | |||
| MUST also be sent within a single packet. This avoids having to | within a single packet. This avoids having to reassemble a message | |||
| reassemble a message from multiple packets. Reassembling messages | from multiple packets. | |||
| requires that a server maintain state prior to establishing a | ||||
| connection, exposing the server to a denial of service risk. | ||||
| The first client packet of the cryptographic handshake protocol MUST | The first client packet of the cryptographic handshake protocol MUST | |||
| fit within a 1232 octet QUIC packet payload. This includes overheads | fit within a 1232 octet QUIC packet payload. This includes overheads | |||
| that reduce the space available to the cryptographic handshake | that reduce the space available to the cryptographic handshake | |||
| protocol. | protocol. | |||
| Details of how TLS is integrated with QUIC is provided in more detail | The CRYPTO frame can be sent in different packet number spaces. | |||
| in [QUIC-TLS]. | CRYPTO frames in each packet number space carry a separate sequence | |||
| of handshake data starting from an offset of 0. | ||||
| 6.4. Transport Parameters | 6.5. Example Handshake Flows | |||
| Details of how TLS is integrated with QUIC are provided in | ||||
| [QUIC-TLS], but some examples are provided here. | ||||
| Figure 6 provides an overview of the 1-RTT handshake. Each line | ||||
| shows a QUIC packet with the packet type and packet number shown | ||||
| first, followed by the contents. So, for instance the first packet | ||||
| is of type Initial, with packet number 0, and contains a CRYPTO frame | ||||
| carrying the ClientHello. | ||||
| Note that multiple QUIC packets - even of different encryption levels | ||||
| - may be coalesced into a single UDP datagram (see Section 4.6, and | ||||
| so this handshake may consist of as few as 4 UDP datagrams, or any | ||||
| number more. For instance, the server's first flight contains | ||||
| packets from the Initial encryption level (obfuscation), the | ||||
| Handshake level, and "0.5-RTT data" from the server at the 1-RTT | ||||
| encryption level. | ||||
| Client Server | ||||
| Initial[0]: CRYPTO[CH] -> | ||||
| Initial[0]: CRYPTO[SH] ACK[0] | ||||
| Handshake[0]: CRYPTO[EE, CERT, CV, FIN] | ||||
| <- 1-RTT[0]: STREAM[1, "..."] | ||||
| Initial[1]: ACK[0] | ||||
| Handshake[0]: CRYPTO[FIN], ACK[0] | ||||
| 1-RTT[0]: STREAM[0, "..."], ACK[0] -> | ||||
| 1-RTT[1]: STREAM[55, "..."], ACK[0] | ||||
| <- Handshake[1]: ACK[0] | ||||
| Figure 6: Example 1-RTT Handshake | ||||
| Figure 7 shows an example of a connection with a 0-RTT handshake and | ||||
| a single packet of 0-RTT data. Note that as described in | ||||
| Section 4.8, the server ACKs the 0-RTT data at the 1-RTT encryption | ||||
| level, and the client's sequence numbers at the 1-RTT encryption | ||||
| level continue to increment from its 0-RTT packets. | ||||
| Client Server | ||||
| Initial[0]: CRYPTO[CH] | ||||
| 0-RTT[0]: STREAM[0, "..."] -> | ||||
| Initial[0]: CRYPTO[SH] ACK[0] | ||||
| Handshake[0] CRYPTO[EE, CERT, CV, FIN] | ||||
| <- 1-RTT[0]: STREAM[1, "..."] ACK[0] | ||||
| Initial[1]: ACK[0] | ||||
| 0-RTT[1]: CRYPTO[EOED] | ||||
| Handshake[0]: CRYPTO[FIN], ACK[0] | ||||
| 1-RTT[2]: STREAM[0, "..."] ACK[0] -> | ||||
| 1-RTT[1]: STREAM[55, "..."], ACK[1,2] | ||||
| <- Handshake[1]: ACK[0] | ||||
| Figure 7: Example 1-RTT Handshake | ||||
| 6.6. Transport Parameters | ||||
| During connection establishment, both endpoints make authenticated | During connection establishment, both endpoints make authenticated | |||
| declarations of their transport parameters. These declarations are | declarations of their transport parameters. These declarations are | |||
| made unilaterally by each endpoint. Endpoints are required to comply | made unilaterally by each endpoint. Endpoints are required to comply | |||
| with the restrictions implied by these parameters; the description of | with the restrictions implied by these parameters; the description of | |||
| each parameter includes rules for its handling. | each parameter includes rules for its handling. | |||
| The format of the transport parameters is the TransportParameters | The format of the transport parameters is the TransportParameters | |||
| struct from Figure 6. This is described using the presentation | struct from Figure 8. 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_bidi_streams(2), | initial_max_bidi_streams(2), | |||
| idle_timeout(3), | idle_timeout(3), | |||
| preferred_address(4), | preferred_address(4), | |||
| max_packet_size(5), | max_packet_size(5), | |||
| stateless_reset_token(6), | stateless_reset_token(6), | |||
| ack_delay_exponent(7), | ack_delay_exponent(7), | |||
| initial_max_uni_streams(8), | initial_max_uni_streams(8), | |||
| disable_migration(9), | ||||
| (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) { | |||
| skipping to change at page 28, line 45 ¶ | skipping to change at page 35, line 46 ¶ | |||
| } TransportParameters; | } TransportParameters; | |||
| struct { | struct { | |||
| enum { IPv4(4), IPv6(6), (15) } ipVersion; | enum { IPv4(4), IPv6(6), (15) } ipVersion; | |||
| opaque ipAddress<4..2^8-1>; | opaque ipAddress<4..2^8-1>; | |||
| uint16 port; | uint16 port; | |||
| opaque connectionId<0..18>; | opaque connectionId<0..18>; | |||
| opaque statelessResetToken[16]; | opaque statelessResetToken[16]; | |||
| } PreferredAddress; | } PreferredAddress; | |||
| Figure 6: Definition of TransportParameters | Figure 8: Definition of TransportParameters | |||
| The "extension_data" field of the quic_transport_parameters extension | The "extension_data" field of the quic_transport_parameters extension | |||
| defined in [QUIC-TLS] contains a TransportParameters value. TLS | defined in [QUIC-TLS] contains a TransportParameters value. TLS | |||
| encoding rules are therefore used to encode the transport parameters. | encoding rules are therefore used to encode the transport parameters. | |||
| QUIC encodes transport parameters into a sequence of octets, which | QUIC encodes transport parameters into a sequence of octets, which | |||
| are then included in the cryptographic handshake. Once the handshake | are then included in the cryptographic handshake. Once the handshake | |||
| completes, the transport parameters declared by the peer are | completes, the transport parameters declared by the peer are | |||
| available. Each endpoint validates the value provided by its peer. | available. Each endpoint validates the value provided by its peer. | |||
| In particular, version negotiation MUST be validated (see | In particular, version negotiation MUST be validated (see | |||
| Section 6.4.4) before the connection establishment is considered | Section 6.6.4) before the connection establishment is considered | |||
| properly complete. | properly complete. | |||
| Definitions for each of the defined transport parameters are included | Definitions for each of the defined transport parameters are included | |||
| in Section 6.4.1. Any given parameter MUST appear at most once in a | in Section 6.6.1. Any given parameter MUST appear at most once in a | |||
| given transport parameters extension. An endpoint MUST treat receipt | given transport parameters extension. An endpoint MUST treat receipt | |||
| of duplicate transport parameters as a connection error of type | of duplicate transport parameters as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR. | TRANSPORT_PARAMETER_ERROR. | |||
| 6.4.1. Transport Parameter Definitions | 6.6.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 7.7) being sent on | to an implicit MAX_STREAM_DATA frame (Section 7.7) being sent on | |||
| all streams immediately after opening. | all streams immediately after opening. | |||
| skipping to change at page 29, line 46 ¶ | skipping to change at page 36, line 49 ¶ | |||
| is encoded as an unsigned 16-bit integer. The maximum value is | is encoded as an unsigned 16-bit integer. The maximum value is | |||
| 600 seconds (10 minutes). | 600 seconds (10 minutes). | |||
| An endpoint MAY use the following transport parameters: | An endpoint MAY use the following transport parameters: | |||
| initial_max_bidi_streams (0x0002): The initial maximum bidirectional | initial_max_bidi_streams (0x0002): The initial maximum bidirectional | |||
| streams parameter contains the initial maximum number of | streams parameter contains the initial maximum number of | |||
| application-owned bidirectional streams the peer may initiate, | application-owned bidirectional streams the peer may initiate, | |||
| encoded as an unsigned 16-bit integer. If this parameter is | encoded as an unsigned 16-bit integer. If this parameter is | |||
| absent or zero, application-owned bidirectional streams cannot be | absent or zero, application-owned bidirectional streams cannot be | |||
| created until a MAX_STREAM_ID frame is sent. Note that a value of | created until a MAX_STREAM_ID frame is sent. Setting this | |||
| 0 does not prevent the cryptographic handshake stream (that is, | parameter is equivalent to sending a MAX_STREAM_ID (Section 7.8) | |||
| stream 0) from being used. Setting this parameter is equivalent | immediately after completing the handshake containing the | |||
| to sending a MAX_STREAM_ID (Section 7.8) immediately after | corresponding Stream ID. For example, a value of 0x05 would be | |||
| completing the handshake containing the corresponding Stream ID. | equivalent to receiving a MAX_STREAM_ID containing 16 when | |||
| For example, a value of 0x05 would be equivalent to receiving a | received by a client or 17 when received by a server. | |||
| MAX_STREAM_ID containing 20 when received by a client or 17 when | ||||
| received by a server. | ||||
| initial_max_uni_streams (0x0008): The initial maximum unidirectional | initial_max_uni_streams (0x0008): The initial maximum unidirectional | |||
| streams parameter contains the initial maximum number of | streams parameter contains the initial maximum number of | |||
| application-owned unidirectional streams the peer may initiate, | application-owned unidirectional streams the peer may initiate, | |||
| encoded as an unsigned 16-bit integer. If this parameter is | encoded as an unsigned 16-bit integer. If this parameter is | |||
| absent or zero, unidirectional streams cannot be created until a | absent or zero, unidirectional streams cannot be created until a | |||
| MAX_STREAM_ID frame is sent. Setting this parameter is equivalent | MAX_STREAM_ID frame is sent. Setting this parameter is equivalent | |||
| to sending a MAX_STREAM_ID (Section 7.8) immediately after | to sending a MAX_STREAM_ID (Section 7.8) immediately after | |||
| completing the handshake containing the corresponding Stream ID. | completing the handshake containing the corresponding Stream ID. | |||
| For example, a value of 0x05 would be equivalent to receiving a | For example, a value of 0x05 would be equivalent to receiving a | |||
| skipping to change at page 30, line 31 ¶ | skipping to change at page 37, line 31 ¶ | |||
| 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 4.5). | protected packets (Section 4.5). | |||
| ack_delay_exponent (0x0007): An 8-bit unsigned integer value | ack_delay_exponent (0x0007): An 8-bit unsigned integer value | |||
| indicating an exponent used to decode the ACK Delay field in the | indicating an exponent used to decode the ACK Delay field in the | |||
| ACK frame, see Section 7.15. If this value is absent, a default | ACK frame, see Section 7.15. If this value is absent, a default | |||
| value of 3 is assumed (indicating a multiplier of 8). The default | value of 3 is assumed (indicating a multiplier of 8). The default | |||
| value is also used for ACK frames that are sent in Initial, | value is also used for ACK frames that are sent in Initial and | |||
| Handshake, and Retry packets. Values above 20 are invalid. | Handshake packets. Values above 20 are invalid. | |||
| disable_migration (0x0009): The endpoint does not support connection | ||||
| migration (Section 6.11). Peers MUST NOT send any packets, | ||||
| including probing packets (Section 6.11.1), from a local address | ||||
| other than that used to perform the handshake. This parameter is | ||||
| a zero-length value. | ||||
| A server MAY include the following transport parameters: | A server MAY 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 6.10.4. This parameter | verifying a stateless reset, see Section 6.13.4. This parameter | |||
| is a sequence of 16 octets. | is a sequence of 16 octets. | |||
| preferred_address (0x0004): The server's Preferred Address is used | preferred_address (0x0004): The server's Preferred Address is used | |||
| to effect a change in server address at the end of the handshake, | to effect a change in server address at the end of the handshake, | |||
| as described in Section 6.9. | as described in Section 6.12. | |||
| A client MUST NOT include a stateless reset token or a preferred | A client MUST NOT include a stateless reset token or a preferred | |||
| address. A server MUST treat receipt of either transport parameter | address. A server MUST treat receipt of either transport parameter | |||
| as a connection error of type TRANSPORT_PARAMETER_ERROR. | as a connection error of type TRANSPORT_PARAMETER_ERROR. | |||
| 6.4.2. Values of Transport Parameters for 0-RTT | 6.6.2. Values of Transport Parameters for 0-RTT | |||
| A client that attempts to send 0-RTT data MUST remember the transport | A client that attempts to send 0-RTT data MUST remember the transport | |||
| parameters used by the server. The transport parameters that the | parameters used by the server. The transport parameters that the | |||
| server advertises during connection establishment apply to all | server advertises during connection establishment apply to all | |||
| connections that are resumed using the keying material established | connections that are resumed using the keying material established | |||
| during that handshake. Remembered transport parameters apply to the | during that handshake. Remembered transport parameters apply to the | |||
| new connection until the handshake completes and new transport | new connection until the handshake completes and new transport | |||
| parameters from the server can be provided. | parameters from the server can be provided. | |||
| 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 31, line 43 ¶ | skipping to change at page 38, line 47 ¶ | |||
| initial_max_bidi_streams, initial_max_uni_streams, initial_max_data, | initial_max_bidi_streams, initial_max_uni_streams, initial_max_data, | |||
| initial_max_stream_data. | initial_max_stream_data. | |||
| The value of the server's previous preferred_address MUST NOT be used | The value of the server's previous preferred_address MUST NOT be used | |||
| when establishing a new connection; rather, the client should wait to | when establishing a new connection; rather, the client should wait to | |||
| observe the server's new preferred_address value in the handshake. | observe the server's new preferred_address value in the handshake. | |||
| 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. | |||
| 6.4.3. New Transport Parameters | 6.6.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 13.1. | Section 13.1. | |||
| 6.4.4. Version Negotiation Validation | 6.6.4. Version Negotiation Validation | |||
| Though the cryptographic handshake has integrity protection, two | Though the cryptographic handshake has integrity protection, two | |||
| forms of QUIC version downgrade are possible. In the first, an | forms of QUIC version downgrade are possible. In the first, an | |||
| attacker replaces the QUIC version in the Initial packet. In the | attacker replaces the QUIC version in the Initial packet. In the | |||
| second, a fake Version Negotiation packet is sent by an attacker. To | second, a fake Version Negotiation packet is sent by an attacker. To | |||
| protect against these attacks, the transport parameters include three | protect against these attacks, the transport parameters include three | |||
| fields that encode version information. These parameters are used to | fields that encode version information. These parameters are used to | |||
| retroactively authenticate the choice of version (see Section 6.2). | retroactively authenticate the choice of version (see Section 6.3). | |||
| 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 6.4). As a result, attacks on version negotiation by an | Section 6.6). As a result, attacks on version negotiation by an | |||
| attacker can be detected. | attacker can be detected. | |||
| The client includes the initial_version field in its transport | The client includes the initial_version field in its transport | |||
| parameters. The initial_version is the version that the client | parameters. The initial_version is the version that the client | |||
| initially attempted to use. If the server did not send a Version | initially attempted to use. If the server did not send a Version | |||
| Negotiation packet Section 4.3, this will be identical to the | Negotiation packet Section 4.3, this will be identical to the | |||
| negotiated_version field in the server transport parameters. | 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 | |||
| skipping to change at page 33, line 29 ¶ | skipping to change at page 40, line 32 ¶ | |||
| 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. | |||
| 6.5. Stateless Retries | 6.7. 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 6.6), or to defer connection | perform address validation (Section 6.9), 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 Retry packet (Section 4.4.2). | retaining connection state MUST use the Retry packet (Section 4.4.2). | |||
| This packet causes a client to reset its transport state and to | This packet causes a client to restart the connection attempt and | |||
| continue the connection attempt with new connection state while | includes the token in the new Initial packet (Section 4.4.1) to prove | |||
| maintaining the state of the cryptographic handshake. | source address ownership. | |||
| A server MUST NOT send multiple Retry packets in response to a client | 6.8. Using Explicit Congestion Notification | |||
| handshake packet. Thus, any cryptographic handshake message that is | ||||
| sent MUST fit within a single packet. | ||||
| In TLS, the Retry packet type is used to carry the HelloRetryRequest | QUIC endpoints use Explicit Congestion Notification (ECN) [RFC3168] | |||
| message. | to detect and respond to network congestion. ECN allows a network | |||
| node to indicate congestion in the network by setting a codepoint in | ||||
| the IP header of a packet instead of dropping it. Endpoints react to | ||||
| congestion by reducing their sending rate in response, as described | ||||
| in [QUIC-RECOVERY]. | ||||
| 6.6. Proof of Source Address Ownership | To use ECN, QUIC endpoints first determine whether a path and peer | |||
| support ECN marking. Verifying the path occurs at the beginning of a | ||||
| connection and when the connection migrates to a new path (see | ||||
| Section 6.11). | ||||
| Each endpoint independently verifies and enables ECN for the path | ||||
| from it to the peer. | ||||
| To verify that both a path and the peer support ECN, an endpoint MUST | ||||
| set one of the ECN Capable Transport (ECT) codepoints - ECT(0) or | ||||
| ECT(1) - in the IP header [RFC8311] of all outgoing packets. | ||||
| If an ECT codepoint set in the IP header is not corrupted by a | ||||
| network device, then a received packet contains either the codepoint | ||||
| sent by the peer or the Congestion Experienced (CE) codepoint set by | ||||
| a network device that is experiencing congestion. | ||||
| On receiving a packet with an ECT or CE codepoint, an endpoint that | ||||
| supports ECN increases the corresponding ECT(0), ECT(1), or CE count, | ||||
| and includes these counters in subsequent (see Section 8.1) ACK_ECN | ||||
| frames (see Section 7.16). | ||||
| A packet detected by a receiver as a duplicate does not affect the | ||||
| receiver's local ECN codepoint counts to mitigate security concerns | ||||
| (Section 12.7). | ||||
| If an endpoint receives a packet without an ECT or CE codepoint, it | ||||
| responds per Section 8.1 with an ACK frame. | ||||
| If an endpoint does not support ECN or does not have access to | ||||
| received ECN codepoints, it acknowledges received packets per | ||||
| Section 8.1 with an ACK frame. | ||||
| If a packet sent with an ECT codepoint is newly acknowledged by the | ||||
| peer in an ACK frame, the endpoint stops setting ECT codepoints in | ||||
| subsequent packets, with the expectation that either the network or | ||||
| the peer no longer supports ECN. | ||||
| To protect the connection from arbitrary corruption of ECN codepoints | ||||
| by the network, an endpoint verifies the following when an ACK_ECN | ||||
| frame is received: | ||||
| o The total increase in ECT(0), ECT(1), and CE counters reported in | ||||
| the ACK_ECN frame MUST be equal to the total number of packets | ||||
| newly acknowledged in this ACK_ECN frame. | ||||
| o The increase in ECT(0) and ECT(1) counters MUST be no greater than | ||||
| the number of packets newly acknowledged that were sent with the | ||||
| corresponding codepoint. | ||||
| Upon successful verification, an endpoint continues to set ECT | ||||
| codepoints in subsequent packets with the expectation that the path | ||||
| is ECN-capable. | ||||
| If verification fails, then the endpoint ceases setting ECT | ||||
| codepoints in subsequent packets with the expectation that either the | ||||
| network or the peer does not support ECN. | ||||
| If an endpoint sets ECT codepoints on outgoing packets and encounters | ||||
| a retransmission timeout due to the absence of acknowledgments from | ||||
| the peer (see [QUIC-RECOVERY]), the endpoint MAY cease setting ECT | ||||
| codepoints in subsequent packets. Doing so allows the connection to | ||||
| traverse network elements that drop packets carrying ECT or CE | ||||
| codepoints in the IP header. | ||||
| 6.9. Proof of Source Address Ownership | ||||
| Transport protocols commonly spend a round trip checking that a | Transport protocols commonly spend a round trip checking that a | |||
| client owns the transport address (IP and port) that it claims. | client owns the transport address (IP and port) that it claims. | |||
| Verifying that a client can receive packets sent to its claimed | Verifying that a client can receive packets sent to its claimed | |||
| transport address protects against spoofing of this information by | transport address protects against spoofing of this information by | |||
| malicious clients. | malicious clients. | |||
| This technique is used primarily to avoid QUIC from being used for | This technique is used primarily to avoid QUIC from being used for | |||
| traffic amplification attack. In such an attack, a packet is sent to | traffic amplification attack. In such an attack, a packet is sent to | |||
| a server with spoofed source address information that identifies a | a server with spoofed source address information that identifies a | |||
| victim. If a server generates more or larger packets in response to | victim. If a server generates more or larger packets in response to | |||
| that packet, the attacker can use the server to send more data toward | that packet, the attacker can use the server to send more data toward | |||
| the victim than it would be able to send on its own. | the victim than it would be able to send on its own. | |||
| Several methods are used in QUIC to mitigate this attack. Firstly, | Several methods are used in QUIC to mitigate this attack. Firstly, | |||
| the initial handshake packet is padded to at least 1200 octets. This | the initial handshake packet is padded to at least 1200 octets. This | |||
| allows a server to send a similar amount of data without risking | allows a server to send a similar amount of data without risking | |||
| causing an amplification attack toward an unproven remote address. | causing an amplification attack toward an unproven remote address. | |||
| A server eventually confirms that a client has received its messages | A server eventually confirms that a client has received its messages | |||
| when the cryptographic handshake successfully completes. This might | when the first Handshake-level message is received. This might be | |||
| be insufficient, either because the server wishes to avoid the | insufficient, either because the server wishes to avoid the | |||
| computational cost of completing the handshake, or it might be that | computational cost of completing the handshake, or it might be that | |||
| the size of the packets that are sent during the handshake is too | the size of the packets that are sent during the handshake is too | |||
| large. This is especially important for 0-RTT, where the server | large. This is especially important for 0-RTT, where the server | |||
| might wish to provide application data traffic - such as a response | might wish to provide application data traffic - such as a response | |||
| to a request - in response to the data carried in the early data from | to a request - in response to the data carried in the early data from | |||
| the client. | the client. | |||
| To send additional data prior to completing the cryptographic | To send additional data prior to completing the cryptographic | |||
| handshake, the server then needs to validate that the client owns the | handshake, the server then needs to validate that the client owns the | |||
| address that it claims. | address that it claims. | |||
| Source address validation is therefore performed during the | Source address validation is therefore performed by the core | |||
| establishment of a connection. TLS provides the tools that support | transport protocol during the establishment of a connection. | |||
| the feature, but basic validation is performed by the core transport | ||||
| protocol. | ||||
| A different type of source address validation is performed after a | A different type of source address validation is performed after a | |||
| connection migration, see Section 6.7. | connection migration, see Section 6.10. | |||
| 6.6.1. Client Address Validation Procedure | 6.9.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 6.6.3), if | As long as the token's authenticity can be checked (see | |||
| the client is able to return that token, it proves to the server that | Section 6.9.3) and the client is able to return that token, it proves | |||
| it received the token. | to the server that it received the token. | |||
| During the processing of the cryptographic handshake messages from a | ||||
| client, TLS will request that QUIC make a decision about whether to | ||||
| proceed based on the information it has. TLS will provide QUIC with | ||||
| any token that was provided by the client. For an initial packet, | ||||
| QUIC can decide to abort the connection, allow it to proceed, or | ||||
| request address validation. | ||||
| If QUIC decides to request address validation, it provides the | Upon receiving the client's Initial packet, the server can request | |||
| cryptographic handshake with a token. The contents of this token are | address validation by sending a Retry packet containing a token. | |||
| consumed by the server that generates the token, so there is no need | This token is repeated in the client's next Initial packet. Because | |||
| for a single well-defined format. A token could include information | the token is consumed by the server that generates it, there is no | |||
| about the claimed client address (IP and port), a timestamp, and any | need for a single well-defined format. A token could include | |||
| other supplementary information the server will need to validate the | information about the claimed client address (IP and port), a | |||
| token in the future. | timestamp, and any other supplementary information the server will | |||
| need to validate the token in the future. | ||||
| The cryptographic handshake is responsible for enacting validation by | The Retry packet is sent to the client and a legitimate client will | |||
| sending the address validation token to the client. A legitimate | respond with an Initial packet containing the token from the Retry | |||
| client will include a copy of the token when it attempts to continue | packet when it continues the handshake. In response to receiving the | |||
| the handshake. The cryptographic handshake extracts the token then | token, a server can either abort the connection or permit it to | |||
| asks QUIC a second time whether the token is acceptable. In | ||||
| response, QUIC can either abort the connection or permit it to | ||||
| proceed. | proceed. | |||
| A connection MAY be accepted without address validation - or with | A connection MAY be accepted without address validation - or with | |||
| only limited validation - but a server SHOULD limit the data it sends | only limited validation - but a server SHOULD limit the data it sends | |||
| toward an unvalidated address. Successful completion of the | toward an unvalidated address. Successful completion of the | |||
| cryptographic handshake implicitly provides proof that the client has | cryptographic handshake implicitly provides proof that the client has | |||
| received packets from the server. | received packets from the server. | |||
| 6.6.2. Address Validation on Session Resumption | The client should allow for additional Retry packets being sent in | |||
| response to Initial packets sent containing a token. There are | ||||
| several situations in which the server might not be able to use the | ||||
| previously generated token to validate the client's address and must | ||||
| send a new Retry. A reasonable limit to the number of tries the | ||||
| client allows for, before giving up, is 3. That is, the client MUST | ||||
| echo the address validation token from a new Retry packet up to 3 | ||||
| times. After that, it MAY give up on the connection attempt. | ||||
| 6.9.2. Address Validation for Future Connections | ||||
| A server MAY provide clients with an address validation token during | A server MAY provide clients with an address validation token during | |||
| one connection that can be used on a subsequent connection. Address | one connection that can be used on a subsequent connection. Address | |||
| validation is especially important with 0-RTT because a server | validation is especially important with 0-RTT because a server | |||
| potentially sends a significant amount of data to a client in | potentially sends a significant amount of data to a client in | |||
| response to 0-RTT data. | response to 0-RTT data. | |||
| A different type of token is needed when resuming. Unlike the token | The server uses the NEW_TOKEN frame Section 7.19 to provide the | |||
| that is created during a handshake, there might be some time between | client with an address validation token that can be used to validate | |||
| when the token is created and when the token is subsequently used. | future connections. The client may then use this token to validate | |||
| Thus, a resumption token SHOULD include an expiration time. It is | future connections by including it in the Initial packet's header. | |||
| also unlikely that the client port number is the same on two | The client MUST NOT use the token provided in a Retry for future | |||
| different connections; validating the port is therefore unlikely to | connections. | |||
| be successful. | ||||
| This token can be provided to the cryptographic handshake immediately | Unlike the token that is created for a Retry packet, there might be | |||
| after establishing a connection. QUIC might also generate an updated | some time between when the token is created and when the token is | |||
| token if significant time passes or the client address changes for | subsequently used. Thus, a resumption token SHOULD include an | |||
| any reason (see Section 6.8). The cryptographic handshake is | expiration time. The server MAY include either an explicit | |||
| responsible for providing the client with the token. In TLS the | expiration time or an issued timestamp and dynamically calculate the | |||
| token is included in the ticket that is used for resumption and | expiration time. It is also unlikely that the client port number is | |||
| 0-RTT, which is carried in a NewSessionTicket message. | the same on two different connections; validating the port is | |||
| therefore unlikely to be successful. | ||||
| 6.6.3. Address Validation Token Integrity | 6.9.3. Address Validation Token Integrity | |||
| An address validation token MUST be difficult to guess. Including a | An address validation token MUST be difficult to guess. Including a | |||
| large enough random value in the token would be sufficient, but this | large enough random value in the token would be sufficient, but this | |||
| depends on the server remembering the value it sends to clients. | depends on the server remembering the value it sends to clients. | |||
| A token-based scheme allows the server to offload any state | A token-based scheme allows the server to offload any state | |||
| associated with validation to the client. For this design to work, | associated with validation to the client. For this design to work, | |||
| the token MUST be covered by integrity protection against | the token MUST be covered by integrity protection against | |||
| modification or falsification by clients. Without integrity | modification or falsification by clients. Without integrity | |||
| protection, malicious clients could generate or guess values for | protection, malicious clients could generate or guess values for | |||
| tokens that would be accepted by the server. Only the server | tokens that would be accepted by the server. Only the server | |||
| requires access to the integrity protection key for tokens. | requires access to the integrity protection key for tokens. | |||
| In TLS the address validation token is often bundled with the | 6.10. Path Validation | |||
| information that TLS requires, such as the resumption secret. In | ||||
| this case, adding integrity protection can be delegated to the | ||||
| cryptographic handshake protocol, avoiding redundant protection. If | ||||
| integrity protection is delegated to the cryptographic handshake, an | ||||
| integrity failure will result in immediate cryptographic handshake | ||||
| failure. If integrity protection is performed by QUIC, QUIC MUST | ||||
| abort the connection if the integrity check fails with a | ||||
| PROTOCOL_VIOLATION error code. | ||||
| 6.7. Path Validation | ||||
| Path validation is used by an endpoint to verify reachability of a | Path validation is used by an endpoint to verify reachability of a | |||
| peer over a specific path. That is, it tests reachability between a | peer over a specific path. That is, it tests reachability between a | |||
| specific local address and a specific peer address, where an address | specific local address and a specific peer address, where an address | |||
| is the two-tuple of IP address and port. Path validation tests that | is the two-tuple of IP address and port. Path validation tests that | |||
| packets can be both sent to and received from a peer. | packets can be both sent to and received from a peer. | |||
| Path validation is used during connection migration (see Section 6.8 | Path validation is used during connection migration (see Section 6.11 | |||
| and Section 6.9) by the migrating endpoint to verify reachability of | and Section 6.12) by the migrating endpoint to verify reachability of | |||
| a peer from a new local address. Path validation is also used by the | a peer from a new local address. Path validation is also used by the | |||
| peer to verify that the migrating endpoint is able to receive packets | peer to verify that the migrating endpoint is able to receive packets | |||
| sent to the its new address. That is, that the packets received from | sent to the its new address. That is, that the packets received from | |||
| the migrating endpoint do not carry a spoofed source address. | the migrating endpoint do not carry a spoofed source address. | |||
| Path validation can be used at any time by either endpoint. For | Path validation can be used at any time by either endpoint. For | |||
| instance, an endpoint might check that a peer is still in possession | instance, an endpoint might check that a peer is still in possession | |||
| of its address after a period of quiescence. | of its address after a period of quiescence. | |||
| Path validation is not designed as a NAT traversal mechanism. Though | Path validation is not designed as a NAT traversal mechanism. Though | |||
| skipping to change at page 37, line 22 ¶ | skipping to change at page 45, line 26 ¶ | |||
| or other peer is able to receive packets without first having sent a | or other peer is able to receive packets without first having sent a | |||
| packet on that path. Effective NAT traversal needs additional | packet on that path. Effective NAT traversal needs additional | |||
| synchronization mechanisms that are not provided here. | synchronization mechanisms that are not provided here. | |||
| An endpoint MAY bundle PATH_CHALLENGE and PATH_RESPONSE frames that | An endpoint MAY bundle PATH_CHALLENGE and PATH_RESPONSE frames that | |||
| are used for path validation with other frames. For instance, an | are used for path validation with other frames. For instance, an | |||
| endpoint may pad a packet carrying a PATH_CHALLENGE for PMTU | endpoint may pad a packet carrying a PATH_CHALLENGE for PMTU | |||
| discovery, or an endpoint may bundle a PATH_RESPONSE with its own | discovery, or an endpoint may bundle a PATH_RESPONSE with its own | |||
| PATH_CHALLENGE. | PATH_CHALLENGE. | |||
| 6.7.1. Initiation | 6.10.1. Initiation | |||
| To initiate path validation, an endpoint sends a PATH_CHALLENGE frame | To initiate path validation, an endpoint sends a PATH_CHALLENGE frame | |||
| containing a random payload on the path to be validated. | containing a random payload on the path to be validated. | |||
| An endpoint MAY send additional PATH_CHALLENGE frames to handle | An endpoint MAY send additional PATH_CHALLENGE frames to handle | |||
| packet loss. An endpoint SHOULD NOT send a PATH_CHALLENGE more | packet loss. An endpoint SHOULD NOT send a PATH_CHALLENGE more | |||
| frequently than it would an Initial packet, ensuring that connection | frequently than it would an Initial packet, ensuring that connection | |||
| migration is no more load on a new path than establishing a new | migration is no more load on a new path than establishing a new | |||
| connection. | connection. | |||
| The endpoint MUST use fresh random data in every PATH_CHALLENGE frame | The endpoint MUST use fresh random data in every PATH_CHALLENGE frame | |||
| so that it can associate the peer's response with the causative | so that it can associate the peer's response with the causative | |||
| PATH_CHALLENGE. | PATH_CHALLENGE. | |||
| 6.7.2. Response | 6.10.2. Response | |||
| On receiving a PATH_CHALLENGE frame, an endpoint MUST respond | On receiving a PATH_CHALLENGE frame, an endpoint MUST respond | |||
| immediately by echoing the data contained in the PATH_CHALLENGE frame | immediately by echoing the data contained in the PATH_CHALLENGE frame | |||
| in a PATH_RESPONSE frame, with the following stipulation. Since a | in a PATH_RESPONSE frame, with the following stipulation. Since a | |||
| PATH_CHALLENGE might be sent from a spoofed address, an endpoint MAY | PATH_CHALLENGE might be sent from a spoofed address, an endpoint MAY | |||
| limit the rate at which it sends PATH_RESPONSE frames and MAY | limit the rate at which it sends PATH_RESPONSE frames and MAY | |||
| silently discard PATH_CHALLENGE frames that would cause it to respond | silently discard PATH_CHALLENGE frames that would cause it to respond | |||
| at a higher rate. | at a higher rate. | |||
| To ensure that packets can be both sent to and received from the | To ensure that packets can be both sent to and received from the | |||
| peer, the PATH_RESPONSE MUST be sent on the same path as the | peer, the PATH_RESPONSE MUST be sent on the same path as the | |||
| triggering PATH_CHALLENGE: from the same local address on which the | triggering PATH_CHALLENGE: from the same local address on which the | |||
| PATH_CHALLENGE was received, to the same remote address from which | PATH_CHALLENGE was received, to the same remote address from which | |||
| the PATH_CHALLENGE was received. | the PATH_CHALLENGE was received. | |||
| 6.7.3. Completion | 6.10.3. Completion | |||
| A new address is considered valid when a PATH_RESPONSE frame is | A new address is considered valid when a PATH_RESPONSE frame is | |||
| received containing data that was sent in a previous PATH_CHALLENGE. | received containing data that was sent in a previous PATH_CHALLENGE. | |||
| Receipt of an acknowledgment for a packet containing a PATH_CHALLENGE | Receipt of an acknowledgment for a packet containing a PATH_CHALLENGE | |||
| frame is not adequate validation, since the acknowledgment can be | frame is not adequate validation, since the acknowledgment can be | |||
| spoofed by a malicious peer. | spoofed by a malicious peer. | |||
| For path validation to be successful, a PATH_RESPONSE frame MUST be | For path validation to be successful, a PATH_RESPONSE frame MUST be | |||
| received from the same remote address to which the corresponding | received from the same remote address to which the corresponding | |||
| PATH_CHALLENGE was sent. If a PATH_RESPONSE frame is received from a | PATH_CHALLENGE was sent. If a PATH_RESPONSE frame is received from a | |||
| skipping to change at page 38, line 29 ¶ | skipping to change at page 46, line 35 ¶ | |||
| Additionally, the PATH_RESPONSE frame MUST be received on the same | Additionally, the PATH_RESPONSE frame MUST be received on the same | |||
| local address from which the corresponding PATH_CHALLENGE was sent. | local address from which the corresponding PATH_CHALLENGE was sent. | |||
| If a PATH_RESPONSE frame is received on a different local address | If a PATH_RESPONSE frame is received on a different local address | |||
| than the one from which the PATH_CHALLENGE was sent, path validation | than the one from which the PATH_CHALLENGE was sent, path validation | |||
| is considered to have failed, even if the data matches that sent in | is considered to have failed, even if the data matches that sent in | |||
| the PATH_CHALLENGE. Thus, the endpoint considers the path to be | the PATH_CHALLENGE. Thus, the endpoint considers the path to be | |||
| valid when a PATH_RESPONSE frame is received on the same path with | valid when a PATH_RESPONSE frame is received on the same path with | |||
| the same payload as the PATH_CHALLENGE frame. | the same payload as the PATH_CHALLENGE frame. | |||
| 6.7.4. Abandonment | 6.10.4. Abandonment | |||
| An endpoint SHOULD abandon path validation after sending some number | An endpoint SHOULD abandon path validation after sending some number | |||
| of PATH_CHALLENGE frames or after some time has passed. When setting | of PATH_CHALLENGE frames or after some time has passed. When setting | |||
| this timer, implementations are cautioned that the new path could | this timer, implementations are cautioned that the new path could | |||
| have a longer round-trip time than the original. | have a longer round-trip time than the original. | |||
| Note that the endpoint might receive packets containing other frames | Note that the endpoint might receive packets containing other frames | |||
| on the new path, but a PATH_RESPONSE frame with appropriate data is | on the new path, but a PATH_RESPONSE frame with appropriate data is | |||
| required for path validation to succeed. | required for path validation to succeed. | |||
| skipping to change at page 39, line 5 ¶ | skipping to change at page 47, line 10 ¶ | |||
| necessarily imply a failure of the connection - endpoints can | necessarily imply a failure of the connection - endpoints can | |||
| continue sending packets over other paths as appropriate. If no | continue sending packets over other paths as appropriate. If no | |||
| paths are available, an endpoint can wait for a new path to become | paths are available, an endpoint can wait for a new path to become | |||
| available or close the connection. | available or close the connection. | |||
| A path validation might be abandoned for other reasons besides | A path validation might be abandoned for other reasons besides | |||
| failure. Primarily, this happens if a connection migration to a new | failure. Primarily, this happens if a connection migration to a new | |||
| path is initiated while a path validation on the old path is in | path is initiated while a path validation on the old path is in | |||
| progress. | progress. | |||
| 6.8. Connection Migration | 6.11. Connection Migration | |||
| QUIC allows connections to survive changes to endpoint addresses | QUIC allows connections to survive changes to endpoint addresses | |||
| (that is, IP address and/or port), such as those caused by a endpoint | (that is, IP address and/or port), such as those caused by a endpoint | |||
| migrating to a new network. This section describes the process by | migrating to a new network. This section describes the process by | |||
| which an endpoint migrates to a new address. | which an endpoint migrates to a new address. | |||
| An endpoint MUST NOT initiate connection migration before the | An endpoint MUST NOT initiate connection migration before the | |||
| handshake is finished and the endpoint has 1-RTT keys. | handshake is finished and the endpoint has 1-RTT keys. An endpoint | |||
| also MUST NOT initiate connection migration if the peer sent the | ||||
| "disable_migration" transport parameter during the handshake. An | ||||
| endpoint which has sent this transport parameter, but detects that a | ||||
| peer has nonetheless migrated to a different network MAY treat this | ||||
| as a connection error of type INVALID_MIGRATION. However, note that | ||||
| not all changes of peer address are intentional migrations. The peer | ||||
| could experience an unintended change of address due to NAT | ||||
| rebinding; endpoints SHOULD perform path validation (Section 6.10) if | ||||
| the rebinding does not cause the connection to fail. | ||||
| This document limits migration of connections to new client | This document limits migration of connections to new client | |||
| addresses, except as described in Section 6.9. Clients are | addresses, except as described in Section 6.12. Clients are | |||
| responsible for initiating all migrations. Servers do not send non- | responsible for initiating all migrations. Servers do not send non- | |||
| probing packets (see Section 6.8.1) toward a client address until it | probing packets (see Section 6.11.1) toward a client address until it | |||
| sees a non-probing packet from that address. If a client receives | sees a non-probing packet from that address. If a client receives | |||
| packets from an unknown server address, the client MAY discard these | packets from an unknown server address, the client MAY discard these | |||
| packets. | packets. | |||
| 6.8.1. Probing a New Path | 6.11.1. Probing a New Path | |||
| An endpoint MAY probe for peer reachability from a new local address | An endpoint MAY probe for peer reachability from a new local address | |||
| using path validation Section 6.7 prior to migrating the connection | using path validation Section 6.10 prior to migrating the connection | |||
| to the new local address. Failure of path validation simply means | to the new local address. Failure of path validation simply means | |||
| that the new path is not usable for this connection. Failure to | that the new path is not usable for this connection. Failure to | |||
| validate a path does not cause the connection to end unless there are | validate a path does not cause the connection to end unless there are | |||
| no valid alternative paths available. | no valid alternative paths available. | |||
| An endpoint uses a new connection ID for probes sent from a new local | An endpoint uses a new connection ID for probes sent from a new local | |||
| address, see Section 6.8.5 for further discussion. | address, see Section 6.11.5 for further discussion. | |||
| Receiving a PATH_CHALLENGE frame from a peer indicates that the peer | Receiving a PATH_CHALLENGE frame from a peer indicates that the peer | |||
| is probing for reachability on a path. An endpoint sends a | is probing for reachability on a path. An endpoint sends a | |||
| PATH_RESPONSE in response as per Section 6.7. | PATH_RESPONSE in response as per Section 6.10. | |||
| PATH_CHALLENGE, PATH_RESPONSE, and PADDING frames are "probing | PATH_CHALLENGE, PATH_RESPONSE, and PADDING frames are "probing | |||
| frames", and all other frames are "non-probing frames". A packet | frames", and all other frames are "non-probing frames". A packet | |||
| containing only probing frames is a "probing packet", and a packet | containing only probing frames is a "probing packet", and a packet | |||
| containing any other frame is a "non-probing packet". | containing any other frame is a "non-probing packet". | |||
| 6.8.2. Initiating Connection Migration | 6.11.2. Initiating Connection Migration | |||
| A endpoint can migrate a connection to a new local address by sending | A endpoint can migrate a connection to a new local address by sending | |||
| packets containing frames other than probing frames from that | packets containing frames other than probing frames from that | |||
| address. | address. | |||
| Each endpoint validates its peer's address during connection | Each endpoint validates its peer's address during connection | |||
| establishment. Therefore, a migrating endpoint can send to its peer | establishment. Therefore, a migrating endpoint can send to its peer | |||
| knowing that the peer is willing to receive at the peer's current | knowing that the peer is willing to receive at the peer's current | |||
| address. Thus an endpoint can migrate to a new local address without | address. Thus an endpoint can migrate to a new local address without | |||
| first validating the peer's address. | first validating the peer's address. | |||
| When migrating, the new path might not support the endpoint's current | When migrating, the new path might not support the endpoint's current | |||
| sending rate. Therefore, the endpoint resets its congestion | sending rate. Therefore, the endpoint resets its congestion | |||
| controller, as described in Section 6.8.4. | controller, as described in Section 6.11.4. | |||
| The new path might not have the same ECN capability. Therefore, the | ||||
| endpoint verifies ECN capability as described in Section 6.8. | ||||
| Receiving acknowledgments for data sent on the new path serves as | Receiving acknowledgments for data sent on the new path serves as | |||
| proof of the peer's reachability from the new address. Note that | proof of the peer's reachability from the new address. Note that | |||
| since acknowledgments may be received on any path, return | since acknowledgments may be received on any path, return | |||
| reachability on the new path is not established. To establish return | reachability on the new path is not established. To establish return | |||
| reachability on the new path, an endpoint MAY concurrently initiate | reachability on the new path, an endpoint MAY concurrently initiate | |||
| path validation Section 6.7 on the new path. | path validation Section 6.10 on the new path. | |||
| 6.8.3. Responding to Connection Migration | 6.11.3. Responding to Connection Migration | |||
| Receiving a packet from a new peer address containing a non-probing | Receiving a packet from a new peer address containing a non-probing | |||
| frame indicates that the peer has migrated to that address. | frame indicates that the peer has migrated to that address. | |||
| In response to such a packet, an endpoint MUST start sending | In response to such a packet, an endpoint MUST start sending | |||
| subsequent packets to the new peer address and MUST initiate path | subsequent packets to the new peer address and MUST initiate path | |||
| validation (Section 6.7) to verify the peer's ownership of the | validation (Section 6.10) to verify the peer's ownership of the | |||
| unvalidated address. | unvalidated address. | |||
| An endpoint MAY send data to an unvalidated peer address, but it MUST | An endpoint MAY send data to an unvalidated peer address, but it MUST | |||
| protect against potential attacks as described in Section 6.8.3.1 and | protect against potential attacks as described in Section 6.11.3.1 | |||
| Section 6.8.3.2. An endpoint MAY skip validation of a peer address | and Section 6.11.3.2. An endpoint MAY skip validation of a peer | |||
| if that address has been seen recently. | address if that address has been seen recently. | |||
| An endpoint only changes the address that it sends packets to in | An endpoint only changes the address that it sends packets to in | |||
| response to the highest-numbered non-probing packet. This ensures | response to the highest-numbered non-probing packet. This ensures | |||
| that an endpoint does not send packets to an old peer address in the | that an endpoint does not send packets to an old peer address in the | |||
| case that it receives reordered packets. | case that it receives reordered packets. | |||
| After changing the address to which it sends non-probing packets, an | After changing the address to which it sends non-probing packets, an | |||
| endpoint could abandon any path validation for other addresses. | endpoint could abandon any path validation for other addresses. | |||
| Receiving a packet from a new peer address might be the result of a | Receiving a packet from a new peer address might be the result of a | |||
| NAT rebinding at the peer. | NAT rebinding at the peer. | |||
| After verifying a new client address, the server SHOULD send new | After verifying a new client address, the server SHOULD send new | |||
| address validation tokens (Section 6.6) to the client. | address validation tokens (Section 6.9) to the client. | |||
| 6.8.3.1. Handling Address Spoofing by a Peer | 6.11.3.1. Handling Address Spoofing by a Peer | |||
| It is possible that a peer is spoofing its source address to cause an | It is possible that a peer is spoofing its source address to cause an | |||
| endpoint to send excessive amounts of data to an unwilling host. If | endpoint to send excessive amounts of data to an unwilling host. If | |||
| the endpoint sends significantly more data than the spoofing peer, | the endpoint sends significantly more data than the spoofing peer, | |||
| connection migration might be used to amplify the volume of data that | connection migration might be used to amplify the volume of data that | |||
| an attacker can generate toward a victim. | an attacker can generate toward a victim. | |||
| As described in Section 6.8.3, an endpoint is required to validate a | As described in Section 6.11.3, an endpoint is required to validate a | |||
| peer's new address to confirm the peer's possession of the new | peer's new address to confirm the peer's possession of the new | |||
| address. Until a peer's address is deemed valid, an endpoint MUST | address. Until a peer's address is deemed valid, an endpoint MUST | |||
| limit the rate at which it sends data to this address. The endpoint | limit the rate at which it sends data to this address. The endpoint | |||
| MUST NOT send more than a minimum congestion window's worth of data | MUST NOT send more than a minimum congestion window's worth of data | |||
| per estimated round-trip time (kMinimumWindow, as defined in | per estimated round-trip time (kMinimumWindow, as defined in | |||
| [QUIC-RECOVERY]). In the absence of this limit, an endpoint risks | [QUIC-RECOVERY]). In the absence of this limit, an endpoint risks | |||
| being used for a denial of service attack against an unsuspecting | being used for a denial of service attack against an unsuspecting | |||
| victim. Note that since the endpoint will not have any round-trip | victim. Note that since the endpoint will not have any round-trip | |||
| time measurements to this address, the estimate SHOULD be the default | time measurements to this address, the estimate SHOULD be the default | |||
| initial value (see [QUIC-RECOVERY]). | initial value (see [QUIC-RECOVERY]). | |||
| If an endpoint skips validation of a peer address as described in | If an endpoint skips validation of a peer address as described in | |||
| Section 6.8.3, it does not need to limit its sending rate. | Section 6.11.3, it does not need to limit its sending rate. | |||
| 6.8.3.2. Handling Address Spoofing by an On-path Attacker | 6.11.3.2. Handling Address Spoofing by an On-path Attacker | |||
| An on-path attacker could cause a spurious connection migration by | An on-path attacker could cause a spurious connection migration by | |||
| copying and forwarding a packet with a spoofed address such that it | copying and forwarding a packet with a spoofed address such that it | |||
| arrives before the original packet. The packet with the spoofed | arrives before the original packet. The packet with the spoofed | |||
| address will be seen to come from a migrating connection, and the | address will be seen to come from a migrating connection, and the | |||
| original packet will be seen as a duplicate and dropped. After a | original packet will be seen as a duplicate and dropped. After a | |||
| spurious migration, validation of the source address will fail | spurious migration, validation of the source address will fail | |||
| because the entity at the source address does not have the necessary | because the entity at the source address does not have the necessary | |||
| cryptographic keys to read or respond to the PATH_CHALLENGE frame | cryptographic keys to read or respond to the PATH_CHALLENGE frame | |||
| that is sent to it even if it wanted to. | that is sent to it even if it wanted to. | |||
| skipping to change at page 42, line 5 ¶ | skipping to change at page 50, line 20 ¶ | |||
| MUST close the connection silently by discarding all connection | MUST close the connection silently by discarding all connection | |||
| state. This results in new packets on the connection being handled | state. This results in new packets on the connection being handled | |||
| generically. For instance, an endpoint MAY send a stateless reset in | generically. For instance, an endpoint MAY send a stateless reset in | |||
| response to any further incoming packets. | response to any further incoming packets. | |||
| Note that receipt of packets with higher packet numbers from the | Note that receipt of packets with higher packet numbers from the | |||
| legitimate peer address will trigger another connection migration. | legitimate peer address will trigger another connection migration. | |||
| This will cause the validation of the address of the spurious | This will cause the validation of the address of the spurious | |||
| migration to be abandoned. | migration to be abandoned. | |||
| 6.8.4. Loss Detection and Congestion Control | 6.11.4. Loss Detection and Congestion Control | |||
| The capacity available on the new path might not be the same as the | The capacity available on the new path might not be the same as the | |||
| old path. Packets sent on the old path SHOULD NOT contribute to | old path. Packets sent on the old path SHOULD NOT contribute to | |||
| congestion control or RTT estimation for the new path. | congestion control or RTT estimation for the new path. | |||
| On confirming a peer's ownership of its new address, an endpoint | On confirming a peer's ownership of its new address, an endpoint | |||
| SHOULD immediately reset the congestion controller and round-trip | SHOULD immediately reset the congestion controller and round-trip | |||
| time estimator for the new path. | time estimator for the new path. | |||
| An endpoint MUST NOT return to the send rate used for the previous | An endpoint MUST NOT return to the send rate used for the previous | |||
| skipping to change at page 42, line 42 ¶ | skipping to change at page 51, line 8 ¶ | |||
| single congestion control context and a single loss recovery context | single congestion control context and a single loss recovery context | |||
| (as described in [QUIC-RECOVERY]) may be adequate. A sender can make | (as described in [QUIC-RECOVERY]) may be adequate. A sender can make | |||
| exceptions for probe packets so that their loss detection is | exceptions for probe packets so that their loss detection is | |||
| independent and does not unduly cause the congestion controller to | independent and does not unduly cause the congestion controller to | |||
| reduce its sending rate. An endpoint might arm a separate alarm when | reduce its sending rate. An endpoint might arm a separate alarm when | |||
| a PATH_CHALLENGE is sent, which is disarmed when the corresponding | a PATH_CHALLENGE is sent, which is disarmed when the corresponding | |||
| PATH_RESPONSE is received. If the alarm fires before the | PATH_RESPONSE is received. If the alarm fires before the | |||
| PATH_RESPONSE is received, the endpoint might send a new | PATH_RESPONSE is received, the endpoint might send a new | |||
| PATH_CHALLENGE, and restart the alarm for a longer period of time. | PATH_CHALLENGE, and restart the alarm for a longer period of time. | |||
| 6.8.5. Privacy Implications of Connection Migration | 6.11.5. 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. An | passive observer to correlate activity between those paths. An | |||
| endpoint that moves between networks might not wish to have their | endpoint that moves between networks might not wish to have their | |||
| activity correlated by any entity other than their peer. The | activity correlated by any entity other than their peer, so different | |||
| NEW_CONNECTION_ID message can be sent to provide an unlinkable | connection IDs are used when sending from different local addresses, | |||
| connection ID for use in case a peer wishes to explicitly break | as discussed in Section 6.1. | |||
| linkability between two points of network attachment. | ||||
| An endpoint that does not require the use of a connection ID should | ||||
| not request that its peer use a connection ID. Such an endpoint does | ||||
| not need to provide new connection IDs using the NEW_CONNECTION_ID | ||||
| frame. | ||||
| An endpoint might need to send packets on multiple networks without | ||||
| receiving any response from its peer. To ensure that the endpoint is | ||||
| not linkable across each of these changes, a new connection ID is | ||||
| needed for each network. To support this, multiple NEW_CONNECTION_ID | ||||
| messages are needed. Each NEW_CONNECTION_ID is marked with a | ||||
| sequence number. Connection IDs MUST be used in the order in which | ||||
| they are numbered. | ||||
| An endpoint that to break linkability upon changing networks MUST use | This eliminates the use of the connection ID for linking activity | |||
| a previously unused connection ID provided by its peer. Protection | from the same connection on different networks. Protection of packet | |||
| of packet numbers ensures that packet numbers cannot be used to | numbers ensures that packet numbers cannot be used to correlate | |||
| correlate connections. Other properties of packets, such as timing | activity. This does not prevent other properties of packets, such as | |||
| and size, might be used to correlate activity, but no explicit | timing and size, from being used to correlate activity. | |||
| correlation can be used to link activity across paths. | ||||
| Clients MAY change connection ID at any time based on implementation- | Clients MAY move to a new connection ID at any time based on | |||
| specific concerns. For example, after a period of network inactivity | implementation-specific concerns. For example, after a period of | |||
| NAT rebinding might occur when the client begins sending data again. | network inactivity NAT rebinding might occur when the client begins | |||
| sending data again. | ||||
| A client might wish to reduce linkability by employing a new | A client might wish to reduce linkability by employing a new | |||
| connection ID and source UDP port when sending traffic after a period | connection ID and source UDP port when sending traffic after a period | |||
| of inactivity. Changing the UDP port from which it sends packets at | of inactivity. Changing the UDP port from which it sends packets at | |||
| the same time might cause the packet to appear as a connection | the same time might cause the packet to appear as a connection | |||
| migration. This ensures that the mechanisms that support migration | migration. This ensures that the mechanisms that support migration | |||
| are exercised even for clients that don't experience NAT rebindings | are exercised even for clients that don't experience NAT rebindings | |||
| or genuine migrations. Changing port number can cause a peer to | or genuine migrations. Changing port number can cause a peer to | |||
| reset its congestion state (see Section 6.8.4), so the port SHOULD | reset its congestion state (see Section 6.11.4), so the port SHOULD | |||
| only be changed infrequently. | only be changed infrequently. | |||
| An endpoint that receives a successfully authenticated packet with a | 6.12. Server's Preferred Address | |||
| previously unused connection ID MUST use the next available | ||||
| connection ID for any packets it sends to that address. To avoid | ||||
| changing connection IDs multiple times when packets arrive out of | ||||
| order, endpoints MUST change only in response to a packet that | ||||
| increases the largest received packet number. Failing to do this | ||||
| could allow for use of that connection ID to link activity on new | ||||
| paths. There is no need to move to a new connection ID if the | ||||
| address of a peer changes without also changing the connection ID. | ||||
| 6.9. Server's Preferred Address | ||||
| QUIC allows servers to accept connections on one IP address and | QUIC allows servers to accept connections on one IP address and | |||
| attempt to transfer these connections to a more preferred address | attempt to transfer these connections to a more preferred address | |||
| shortly after the handshake. This is particularly useful when | shortly after the handshake. This is particularly useful when | |||
| clients initially connect to an address shared by multiple servers | clients initially connect to an address shared by multiple servers | |||
| but would prefer to use a unicast address to ensure connection | but would prefer to use a unicast address to ensure connection | |||
| stability. This section describes the protocol for migrating a | stability. This section describes the protocol for migrating a | |||
| connection to a preferred server address. | connection to a preferred server address. | |||
| Migrating a connection to a new server address mid-connection is left | Migrating a connection to a new server address mid-connection is left | |||
| for future work. If a client receives packets from a new server | for future work. If a client receives packets from a new server | |||
| address not indicated by the preferred_address transport parameter, | address not indicated by the preferred_address transport parameter, | |||
| the client SHOULD discard these packets. | the client SHOULD discard these packets. | |||
| 6.9.1. Communicating A Preferred Address | 6.12.1. Communicating A Preferred Address | |||
| A server conveys a preferred address by including the | A server conveys a preferred address by including the | |||
| preferred_address transport parameter in the TLS handshake. | preferred_address transport parameter in the TLS handshake. | |||
| Once the handshake is finished, the client SHOULD initiate path | Once the handshake is finished, the client SHOULD initiate path | |||
| validation (see Section 6.7) of the server's preferred address using | validation (see Section 6.10) of the server's preferred address using | |||
| the connection ID provided in the preferred_address transport | the connection ID provided in the preferred_address transport | |||
| parameter. | parameter. | |||
| If path validation succeeds, the client SHOULD immediately begin | If path validation succeeds, the client SHOULD immediately begin | |||
| sending all future packets to the new server address using the new | sending all future packets to the new server address using the new | |||
| connection ID and discontinue use of the old server address. If path | connection ID and discontinue use of the old server address. If path | |||
| validation fails, the client MUST continue sending all future packets | validation fails, the client MUST continue sending all future packets | |||
| to the server's original IP address. | to the server's original IP address. | |||
| 6.9.2. Responding to Connection Migration | 6.12.2. Responding to Connection Migration | |||
| A server might receive a packet addressed to its preferred IP address | A server might receive a packet addressed to its preferred IP address | |||
| at any time after the handshake is completed. If this packet | at any time after the handshake is completed. If this packet | |||
| contains a PATH_CHALLENGE frame, the server sends a PATH_RESPONSE | contains a PATH_CHALLENGE frame, the server sends a PATH_RESPONSE | |||
| frame as per Section 6.7, but the server MUST continue sending all | frame as per Section 6.10, but the server MUST continue sending all | |||
| other packets from its original IP address. | other packets from its original IP address. | |||
| The server SHOULD also initiate path validation of the client using | The server SHOULD also initiate path validation of the client using | |||
| its preferred address and the address from which it received the | its preferred address and the address from which it received the | |||
| client probe. This helps to guard against spurious migration | client probe. This helps to guard against spurious migration | |||
| initiated by an attacker. | initiated by an attacker. | |||
| Once the server has completed its path validation and has received a | Once the server has completed its path validation and has received a | |||
| non-probing packet with a new largest packet number on its preferred | non-probing packet with a new largest packet number on its preferred | |||
| address, the server begins sending to the client exclusively from its | address, the server begins sending to the client exclusively from its | |||
| preferred IP address. It SHOULD drop packets for this connection | preferred IP address. It SHOULD drop packets for this connection | |||
| received on the old IP address, but MAY continue to process delayed | received on the old IP address, but MAY continue to process delayed | |||
| packets. | packets. | |||
| 6.9.3. Interaction of Client Migration and Preferred Address | 6.12.3. Interaction of Client Migration and Preferred Address | |||
| A client might need to perform a connection migration before it has | A client might need to perform a connection migration before it has | |||
| migrated to the server's preferred address. In this case, the client | migrated to the server's preferred address. In this case, the client | |||
| SHOULD perform path validation to both the original and preferred | SHOULD perform path validation to both the original and preferred | |||
| server address from the client's new address concurrently. | server address from the client's new address concurrently. | |||
| If path validation of the server's preferred address succeeds, the | If path validation of the server's preferred address succeeds, the | |||
| client MUST abandon validation of the original address and migrate to | client MUST abandon validation of the original address and migrate to | |||
| using the server's preferred address. If path validation of the | using the server's preferred address. If path validation of the | |||
| server's preferred address fails, but validation of the server's | server's preferred address fails, but validation of the server's | |||
| original address succeeds, the client MAY migrate to using the | original address succeeds, the client MAY migrate to using the | |||
| original address from the client's new address. | original address from the client's new address. | |||
| If the connection to the server's preferred address is not from the | If the connection to the server's preferred address is not from the | |||
| same client address, the server MUST protect against potential | same client address, the server MUST protect against potential | |||
| attacks as described in Section 6.8.3.1 and Section 6.8.3.2. In | attacks as described in Section 6.11.3.1 and Section 6.11.3.2. In | |||
| addition to intentional simultaneous migration, this might also occur | addition to intentional simultaneous migration, this might also occur | |||
| because the client's access network used a different NAT binding for | because the client's access network used a different NAT binding for | |||
| the server's preferred address. | the server's preferred address. | |||
| Servers SHOULD initiate path validation to the client's new address | Servers SHOULD initiate path validation to the client's new address | |||
| upon receiving a probe packet from a different address. Servers MUST | upon receiving a probe packet from a different address. Servers MUST | |||
| NOT send more than a minimum congestion window's worth of non-probing | NOT send more than a minimum congestion window's worth of non-probing | |||
| packets to the new address before path validation is complete. | packets to the new address before path validation is complete. | |||
| 6.10. Connection Termination | 6.13. 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 6.10.2) | o idle timeout (Section 6.13.2) | |||
| o immediate close (Section 6.10.3) | o immediate close (Section 6.13.3) | |||
| o stateless reset (Section 6.10.4) | o stateless reset (Section 6.13.4) | |||
| 6.10.1. Closing and Draining Connection States | 6.13.1. Closing and Draining Connection States | |||
| The closing and draining connection states exist to ensure that | The closing and draining connection states exist to ensure that | |||
| connections close cleanly and that delayed or reordered packets are | connections close cleanly and that delayed or reordered packets are | |||
| properly discarded. These states SHOULD persist for three times the | properly discarded. These states SHOULD persist for three times the | |||
| current Retransmission Timeout (RTO) interval as defined in | current Retransmission Timeout (RTO) interval as defined in | |||
| [QUIC-RECOVERY]. | [QUIC-RECOVERY]. | |||
| An endpoint enters a closing period after initiating an immediate | An endpoint enters a closing period after initiating an immediate | |||
| close (Section 6.10.3). While closing, an endpoint MUST NOT send | close (Section 6.13.3). While closing, an endpoint MUST NOT send | |||
| packets unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE | packets unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE | |||
| frame (see Section 6.10.3 for details). | frame (see Section 6.13.3 for details). | |||
| In the closing state, only a packet containing a closing frame can be | In the closing state, only a packet containing a closing frame can be | |||
| sent. An endpoint retains only enough information to generate a | sent. An endpoint retains only enough information to generate a | |||
| packet containing a closing frame and to identify packets as | packet containing a closing frame and to identify packets as | |||
| belonging to the connection. The connection ID and QUIC version is | belonging to the connection. The connection ID and QUIC version is | |||
| sufficient information to identify packets for a closing connection; | sufficient information to identify packets for a closing connection; | |||
| an endpoint can discard all other connection state. An endpoint MAY | an endpoint can discard all other connection state. An endpoint MAY | |||
| retain packet protection keys for incoming packets to allow it to | retain packet protection keys for incoming packets to allow it to | |||
| read and process a closing frame. | read and process a closing frame. | |||
| skipping to change at page 46, line 47 ¶ | skipping to change at page 54, line 33 ¶ | |||
| an abbreviated draining period which can allow for faster resource | an abbreviated draining period which can allow for faster resource | |||
| recovery. Servers that retain an open socket for accepting new | recovery. Servers that retain an open socket for accepting new | |||
| connections SHOULD NOT exit the closing or draining period early. | connections SHOULD NOT exit the closing or draining period early. | |||
| Once the closing or draining period has ended, an endpoint SHOULD | Once the closing or draining period has ended, an endpoint SHOULD | |||
| discard all connection state. This results in new packets on the | discard all connection state. This results in new packets on the | |||
| connection being handled generically. For instance, an endpoint MAY | connection being handled generically. For instance, an endpoint MAY | |||
| send a stateless reset in response to any further incoming packets. | send a stateless reset in response to any further incoming packets. | |||
| The draining and closing periods do not apply when a stateless reset | The draining and closing periods do not apply when a stateless reset | |||
| (Section 6.10.4) is sent. | (Section 6.13.4) is sent. | |||
| An endpoint is not expected to handle key updates when it is closing | An endpoint is not expected to handle key updates when it is closing | |||
| or draining. A key update might prevent the endpoint from moving | or draining. A key update might prevent the endpoint from moving | |||
| from the closing state to draining, but it otherwise has no impact. | from the closing state to draining, but it otherwise has no impact. | |||
| An endpoint could receive packets from a new source address, | An endpoint could receive packets from a new source address, | |||
| indicating a client connection migration (Section 6.8), while in the | indicating a client connection migration (Section 6.11), while in the | |||
| closing period. An endpoint in the closing state MUST strictly limit | closing period. An endpoint in the closing state MUST strictly limit | |||
| the number of packets it sends to this new address until the address | the number of packets it sends to this new address until the address | |||
| is validated (see Section 6.7). A server in the closing state MAY | is validated (see Section 6.10). A server in the closing state MAY | |||
| instead choose to discard packets received from a new source address. | instead choose to discard packets received from a new source address. | |||
| 6.10.2. Idle Timeout | 6.13.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 6.4.1) is closed. A connection enters the draining state | Section 6.6.1) is closed. A connection enters the draining state | |||
| when the idle timeout expires. | 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 both endpoints. An endpoint that sends packets near | synchronized on both endpoints. An endpoint that sends packets near | |||
| the end of an idle period could have those packets discarded if its | the end of an idle period could have those packets discarded if its | |||
| peer enters the draining state before the packet is received. | peer enters the draining state before the packet is received. | |||
| 6.10.3. Immediate Close | 6.13.3. Immediate Close | |||
| An endpoint sends a closing frame, either CONNECTION_CLOSE or | An endpoint sends a closing frame (CONNECTION_CLOSE or | |||
| APPLICATION_CLOSE, to terminate the connection immediately. Either | APPLICATION_CLOSE) to terminate the connection immediately. Any | |||
| closing frame causes all streams to immediately become closed; open | closing frame causes all streams to immediately become closed; open | |||
| streams can be assumed to be implicitly reset. | streams can be assumed to be implicitly reset. | |||
| After sending a closing frame, endpoints immediately enter the | After sending a closing frame, endpoints immediately enter the | |||
| closing state. During the closing period, an endpoint that sends a | closing state. During the closing period, an endpoint that sends a | |||
| closing frame SHOULD respond to any packet that it receives with | closing frame SHOULD respond to any packet that it receives with | |||
| another packet containing a closing frame. To minimize the state | another packet containing a closing frame. To minimize the state | |||
| that an endpoint maintains for a closing connection, endpoints MAY | 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 a closing frame. For | number of packets they generate containing a closing frame. For | |||
| skipping to change at page 48, line 16 ¶ | skipping to change at page 56, line 5 ¶ | |||
| 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. | |||
| 6.10.4. Stateless Reset | 6.13.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 an | |||
| server that does not have access to the state of a connection. A | endpoint that does not have access to the state of a connection. A | |||
| server crash or outage might result in clients continuing to send | crash or outage might result in peers continuing to send data to an | |||
| data to a server that is unable to properly continue the connection. | endpoint that is unable to properly continue the connection. An | |||
| A server that wishes to communicate a fatal connection error MUST use | endpoint that wishes to communicate a fatal connection error MUST use | |||
| a closing frame if it has sufficient state to do so. | a closing frame if it has sufficient state to do so. | |||
| To support this process, the server sends a stateless_reset_token | To support this process, a token is sent by endpoints. The token is | |||
| value during the handshake in the transport parameters. This value | carried in the NEW_CONNECTION_ID frame sent by either peer, and | |||
| is protected by encryption, so only client and server know this | servers can specify the stateless_reset_token transport parameter | |||
| value. | during the handshake (clients cannot because their transport | |||
| parameters don't have confidentiality protection). This value is | ||||
| protected by encryption, so only client and server know this value. | ||||
| A server that receives packets that it cannot process sends a packet | An endpoint that receives packets that it cannot process sends a | |||
| in the following layout: | packet 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|K| Type (6) | | |0|K|1|1|0|0|0|0| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Destination Connection ID (144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Packet Number (8/16/32) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Random Octets (*) ... | | Random Octets (160..) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| 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 with a short | possible - indistinguishable from a regular packet with a short | |||
| header. | header. | |||
| A server generates a random 18-octet Destination Connection ID field. | The message consists of a header octet, followed by random octets of | |||
| For a client that depends on the server including a connection ID, | arbitrary length, followed by a Stateless Reset Token. | |||
| this will mean that this value differs from previous packets. Ths | ||||
| results in two problems: | ||||
| o The packet might not reach the client. If the Destination | A stateless reset will be interpreted by a recipient as a packet with | |||
| Connection ID is critical for routing toward the client, then this | a short header. For the packet to appear as valid, the Random Octets | |||
| field needs to include at least 20 octets of random or unpredictable | ||||
| values. This is intended to allow for a destination connection ID of | ||||
| the maximum length permitted, a packet number, and minimal payload. | ||||
| The Stateless Reset Token corresponds to the minimum expansion of the | ||||
| packet protection AEAD. More random octets might be necessary if the | ||||
| endpoint could have negotiated a packet protection scheme with a | ||||
| larger minimum AEAD expansion. | ||||
| An endpoint SHOULD NOT send a stateless reset that is significantly | ||||
| larger than the packet it receives. Endpoints MUST discard packets | ||||
| that are too small to be valid QUIC packets. With the set of AEAD | ||||
| functions defined in [QUIC-TLS], packets less than 19 octets long are | ||||
| never valid. | ||||
| An endpoint cannot determine the Source Connection ID from a packet | ||||
| with a short header, therefore it cannot set the Destination | ||||
| Connection ID in the stateless reset packet. The destination | ||||
| connection ID will therefore differ from the value used in previous | ||||
| packets. A random Destination Connection ID makes the connection ID | ||||
| appear to be the result of moving to a new connection ID that was | ||||
| provided using a NEW_CONNECTION_ID frame (Section 7.13). | ||||
| Using a randomized connection ID results in two problems: | ||||
| o The packet might not reach the peer. If the Destination | ||||
| Connection ID is critical for routing toward the peer, then this | ||||
| packet could be incorrectly routed. This causes the stateless | packet could be incorrectly routed. This causes the stateless | |||
| reset to be ineffective in causing errors to be quickly detected | reset to be ineffective in causing errors to be quickly detected | |||
| and recovered. In this case, clients will need to rely on other | and recovered. In this case, endpoints will need to rely on other | |||
| methods - such as timers - to detect that the connection has | methods - such as timers - to detect that the connection has | |||
| failed. | failed. | |||
| o The randomly generated connection ID can be used by entities other | o The randomly generated connection ID can be used by entities other | |||
| than the client to identify this as a potential stateless reset. | than the peer to identify this as a potential stateless reset. An | |||
| A server that occasionally uses different connection IDs might | endpoint that occasionally uses different connection IDs might | |||
| introduce some uncertainty about this. | introduce some uncertainty about this. | |||
| The Packet Number field is set to a randomized value. The server | ||||
| SHOULD send a packet with a short header and a packet number length | ||||
| of 1 octet. Using the shortest possible packet number encoding | ||||
| minimizes the perceived gap between the last packet that the server | ||||
| sent and this packet. A server MAY indicate a different packet | ||||
| number length, but a longer packet number encoding might allow this | ||||
| message to be identified as a stateless reset more easily using | ||||
| heuristics. | ||||
| After the Packet Number, the server pads the message with an | ||||
| arbitrary number of octets containing random values. | ||||
| Finally, the last 16 octets of the packet are set to the value of the | Finally, the last 16 octets of the packet are set to the value of the | |||
| Stateless Reset Token. | Stateless Reset Token. | |||
| 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. | |||
| This stateless reset design is specific to QUIC version 1. A server | This stateless reset design is specific to QUIC version 1. An | |||
| that supports multiple versions of QUIC needs to generate a stateless | endpoint that supports multiple versions of QUIC needs to generate a | |||
| reset that will be accepted by clients that support any version that | stateless reset that will be accepted by peers that support any | |||
| the server might support (or might have supported prior to losing | version that the endpoint might support (or might have supported | |||
| state). Designers of new versions of QUIC need to be aware of this | prior to losing state). Designers of new versions of QUIC need to be | |||
| and either reuse this design, or use a portion of the packet other | aware of this and either reuse this design, or use a portion of the | |||
| than the last 16 octets for carrying data. | packet other than the last 16 octets for carrying data. | |||
| 6.10.4.1. Detecting a Stateless Reset | 6.13.4.1. Detecting a Stateless Reset | |||
| A client detects a potential stateless reset when a packet with a | An endpoint 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 endpoint 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 its peer, either in a | |||
| transport parameters. If these values are identical, the client MUST | NEW_CONNECTION_ID frame or the server's transport parameters. If | |||
| enter the draining period and not send any further packets on this | these values are identical, the endpoint MUST enter the draining | |||
| connection. If the comparison fails, the packet can be discarded. | period and not send any further packets on this connection. If the | |||
| comparison fails, the packet can be discarded. | ||||
| 6.10.4.2. Calculating a Stateless Reset Token | 6.13.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, an endpoint 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 | |||
| in a cluster or a storage problem for a server that might lose state. | instances in a cluster or a storage problem for a endpoint that might | |||
| Stateless reset specifically exists to handle the case where state is | lose state. Stateless reset specifically exists to handle the case | |||
| lost, so this approach is suboptimal. | where state is 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 | |||
| endpoint by generating the proof using a second iteration of a | endpoint by generating the proof using a second iteration of a | |||
| preimage-resistant function that takes three inputs: the static key, | preimage-resistant function that takes three inputs: the static key, | |||
| the server's connection ID (see Section 4.7), and an identifier for | the connection ID chosen by the endpoint (see Section 6.1), and an | |||
| the server instance. A server could use HMAC [RFC2104] (for example, | instance identifier. An endpoint could use HMAC [RFC2104] (for | |||
| HMAC(static_key, server_id || connection_id)) or HKDF [RFC5869] (for | example, HMAC(static_key, instance_id || connection_id)) or HKDF | |||
| example, using the static key as input keying material, with server | [RFC5869] (for example, using the static key as input keying | |||
| and connection identifiers as salt). The output of this function is | material, with instance and connection identifiers as salt). The | |||
| truncated to 16 octets to produce the Stateless Reset Token for that | output of this function is truncated to 16 octets to produce the | |||
| connection. | Stateless Reset Token for that connection. | |||
| A server that loses state can use the same method to generate a valid | An endpoint that loses state can use the same method to generate a | |||
| Stateless Reset Secret. The connection ID comes from the packet that | valid Stateless Reset Token. The connection ID comes from the packet | |||
| the server receives. | that the endpoint receives. An instance that receives a packet for | |||
| another instance might be able to recover the instance identifier | ||||
| using the connection ID. Alternatively, the instance identifier | ||||
| might be omitted from the calculation of the Stateless Reset Token so | ||||
| that all instances are equally able to generate a stateless reset. | ||||
| This design relies on the client always sending a connection ID in | This design relies on the peer always sending a connection ID in its | |||
| its packets so that the server can use the connection ID from a | packets so that the endpoint can use the connection ID from a packet | |||
| packet to reset the connection. A server that uses this design | to reset the connection. An endpoint that uses this design cannot | |||
| cannot allow clients to use a zero-length connection ID. | allow its peers to send packets with a zero-length destination | |||
| connection ID. | ||||
| Revealing the Stateless Reset Token allows any entity to terminate | Revealing the Stateless Reset Token allows any entity to terminate | |||
| the connection, so a value can only be used once. This method for | the connection, so a value can only be used once. This method for | |||
| choosing the Stateless Reset Token means that the combination of | choosing the Stateless Reset Token means that the combination of | |||
| server instance, connection ID, and static key cannot occur for | instance, connection ID, and static key cannot occur for another | |||
| another connection. A connection ID from a connection that is reset | connection. A connection ID from a connection that is reset by | |||
| by revealing the Stateless Reset Token cannot be reused for new | revealing the Stateless Reset Token cannot be reused for new | |||
| connections at the same server without first changing to use a | connections at the same instance without first changing to use a | |||
| different static key or server identifier. | different static key or instance identifier. | |||
| Note that Stateless Reset messages do not have any cryptographic | Note that Stateless Reset messages do not have any cryptographic | |||
| protection. | protection. | |||
| 7. Frame Types and Formats | 7. Frame Types and Formats | |||
| As described in Section 5, packets contain one or more frames. This | As described in Section 5, packets contain one or more frames. This | |||
| section describes the format and semantics of the core QUIC frame | section describes the format and semantics of the core QUIC frame | |||
| types. | types. | |||
| skipping to change at page 53, line 24 ¶ | skipping to change at page 61, line 28 ¶ | |||
| 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 (i) ... | | Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Frame Type (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | 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 11.3 (APPLICATION_CLOSE uses codes from | space defined in Section 11.3 (APPLICATION_CLOSE uses codes from | |||
| the application protocol error code space, see Section 11.4). | the application protocol error code space, see Section 11.4). | |||
| Frame Type: The type of frame that triggered the error. A value of | ||||
| 0 (equivalent to the mention of the PADDING frame) is used when | ||||
| the frame type is unknown. | ||||
| Reason Phrase Length: A variable-length integer specifying the | Reason Phrase Length: A variable-length integer specifying the | |||
| length of the reason phrase in bytes. Note that a | length of the reason phrase in bytes. Note that a | |||
| CONNECTION_CLOSE frame cannot be split between packets, so in | CONNECTION_CLOSE frame cannot be split between packets, so in | |||
| practice any limits on packet size will also limit the space | practice any limits on packet size will also limit the space | |||
| available for a reason 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]. | |||
| skipping to change at page 54, line 28 ¶ | skipping to change at page 62, line 40 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Data (i) ... | | Maximum Data (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_DATA frame are as follows: | The fields in the MAX_DATA frame are as follows: | |||
| Maximum Data: A variable-length 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 octets. | of octets. | |||
| All data sent in STREAM frames counts toward this limit, with the | All data sent in STREAM frames counts toward this limit. The sum of | |||
| exception of data on stream 0. The sum of the largest received | the largest received offsets on all streams - including streams in | |||
| offsets on all streams - including streams in terminal states, but | terminal states - MUST NOT exceed the value advertised by a receiver. | |||
| excluding stream 0 - MUST NOT exceed the value advertised by a | An 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 6.4.2). | result of a change in the initial limits (see Section 6.6.2). | |||
| 7.7. MAX_STREAM_DATA Frame | 7.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. | |||
| An endpoint that receives a MAX_STREAM_DATA frame for a receive-only | An endpoint that receives a MAX_STREAM_DATA frame for a receive-only | |||
| stream MUST terminate the connection with error PROTOCOL_VIOLATION. | stream MUST terminate the connection with error PROTOCOL_VIOLATION. | |||
| skipping to change at page 55, line 36 ¶ | skipping to change at page 63, line 46 ¶ | |||
| 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 6.4.2). | limits (see Section 6.6.2). | |||
| 7.8. MAX_STREAM_ID Frame | 7.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 | |||
| skipping to change at page 56, line 21 ¶ | skipping to change at page 64, line 31 ¶ | |||
| 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 6.4.2). | Section 6.6.2). | |||
| 7.9. PING Frame | 7.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. The PING frame | |||
| contains no additional fields. | contains no additional fields. | |||
| The receiver of a PING frame simply needs to acknowledge the packet | The receiver of a PING frame simply needs to acknowledge the packet | |||
| containing this frame. | containing this frame. | |||
| skipping to change at page 56, line 43 ¶ | skipping to change at page 65, line 4 ¶ | |||
| 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. | |||
| 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 6.10). However, state in middleboxes might | parameter (see Section 6.13). 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. | |||
| 7.10. BLOCKED Frame | 7.10. BLOCKED Frame | |||
| A sender SHOULD send a BLOCKED frame (type=0x08) when it wishes to | A sender SHOULD send a BLOCKED frame (type=0x08) when it wishes to | |||
| send 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 10.2.1). BLOCKED frames can be used as input to tuning of | Section 10.2.1). BLOCKED frames can be used as input to tuning of | |||
| skipping to change at page 58, line 30 ¶ | skipping to change at page 66, line 36 ¶ | |||
| The STREAM_ID_BLOCKED frame contains a single field. | The STREAM_ID_BLOCKED frame contains a single field. | |||
| Stream ID: A variable-length integer indicating the highest stream | Stream ID: A variable-length integer indicating the highest stream | |||
| ID that the sender was permitted to open. | ID that the sender was permitted to open. | |||
| 7.13. NEW_CONNECTION_ID Frame | 7.13. NEW_CONNECTION_ID Frame | |||
| An endpoint sends a NEW_CONNECTION_ID frame (type=0x0b) to provide | An endpoint sends a NEW_CONNECTION_ID frame (type=0x0b) to provide | |||
| its peer with alternative connection IDs that can be used to break | its peer with alternative connection IDs that can be used to break | |||
| linkability when migrating connections (see Section 6.8.5). | linkability when migrating connections (see Section 6.11.5). | |||
| 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 (i) ... | | Sequence (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (8) | Connection ID (32..144) ... | | Length (8) | Connection ID (32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 59, line 21 ¶ | skipping to change at page 67, line 39 ¶ | |||
| Length: An 8-bit unsigned integer containing the length of the | Length: An 8-bit unsigned integer containing the length of the | |||
| connection ID. Values less than 4 and greater than 18 are invalid | connection ID. Values less than 4 and greater than 18 are invalid | |||
| and MUST be treated as a connection error of type | and MUST be treated as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| Connection ID: A connection ID of the specified length. | Connection ID: A connection ID of the specified length. | |||
| 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 6.10.4). | Section 6.13.4). | |||
| An endpoint MUST NOT send this frame if it currently requires that | An endpoint MUST NOT send this frame if it currently requires that | |||
| its peer send packets with a zero-length Destination Connection ID. | its peer send packets with a zero-length Destination Connection ID. | |||
| Changing the length of a connection ID to or from zero-length makes | Changing the length of a connection ID to or from zero-length makes | |||
| it difficult to identify when the value of the connection ID changed. | it difficult to identify when the value of the connection ID changed. | |||
| An endpoint that is sending packets with a zero-length Destination | An endpoint that is sending packets with a zero-length Destination | |||
| Connection ID MUST treat receipt of a NEW_CONNECTION_ID frame as a | Connection ID MUST treat receipt of a NEW_CONNECTION_ID frame as a | |||
| connection error of type PROTOCOL_VIOLATION. | connection error of type PROTOCOL_VIOLATION. | |||
| 7.14. STOP_SENDING Frame | 7.14. STOP_SENDING Frame | |||
| skipping to change at page 60, line 31 ¶ | skipping to change at page 68, line 48 ¶ | |||
| 7.15. ACK Frame | 7.15. ACK Frame | |||
| Receivers send ACK frames (type=0x0d) to inform senders which packets | Receivers send ACK frames (type=0x0d) to inform senders which packets | |||
| they have received and processed. The ACK frame contains any number | they have received and processed. The ACK frame contains any number | |||
| of ACK blocks. ACK blocks are ranges of acknowledged packets. | of ACK blocks. ACK blocks are ranges of acknowledged packets. | |||
| QUIC acknowledgements are irrevocable. Once acknowledged, a packet | QUIC acknowledgements are irrevocable. Once acknowledged, a packet | |||
| remains acknowledged, even if it does not appear in a future ACK | remains acknowledged, even if it does not appear in a future ACK | |||
| frame. This is unlike TCP SACKs ([RFC2018]). | frame. This is unlike TCP SACKs ([RFC2018]). | |||
| It is expected that a sender will reuse the same packet number across | ||||
| different packet number spaces. ACK frames only acknowledge the | ||||
| packet numbers that were transmitted by the sender in the same packet | ||||
| number space of the packet that the ACK was received in. | ||||
| A client MUST NOT acknowledge Retry packets. Retry packets include | A client MUST NOT acknowledge Retry packets. Retry packets include | |||
| the packet number from the Initial packet it responds to. Version | the packet number from the Initial packet it responds to. Version | |||
| Negotiation packets cannot be acknowledged because they do not | Negotiation packets cannot be acknowledged because they do not | |||
| contain a packet number. Rather than relying on ACK frames, these | contain a packet number. Rather than relying on ACK frames, these | |||
| packets are implicitly acknowledged by the next Initial packet sent | packets are implicitly acknowledged by the next Initial packet sent | |||
| by the client. | by the client. | |||
| An ACK frame is shown below. | An ACK frame is shown below. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| skipping to change at page 60, line 52 ¶ | skipping to change at page 69, line 26 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Largest Acknowledged (i) ... | | Largest Acknowledged (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Delay (i) ... | | ACK Delay (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Block Count (i) ... | | ACK Block Count (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Blocks (*) ... | | ACK Blocks (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: ACK Frame Format | Figure 9: ACK Frame Format | |||
| The fields in the ACK frame are as follows: | The fields in the ACK frame are as follows: | |||
| Largest Acknowledged: A variable-length integer representing the | Largest Acknowledged: A variable-length integer representing the | |||
| largest packet number the peer is acknowledging; this is usually | largest packet number the peer is acknowledging; this is usually | |||
| the largest packet number that the peer has received prior to | the largest packet number that the peer has received prior to | |||
| generating the ACK frame. Unlike the packet number in the QUIC | generating the ACK frame. Unlike the packet number in the QUIC | |||
| long or short header, the value in an ACK frame is not truncated. | long or short header, the value in an ACK frame is not truncated. | |||
| ACK Delay: A variable-length integer including the time in | ACK Delay: A variable-length integer including the time in | |||
| microseconds that the largest acknowledged packet, as indicated in | microseconds that the largest acknowledged packet, as indicated in | |||
| the Largest Acknowledged field, was received by this peer to when | 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 | 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 | 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_delay_exponent" transport parameter set by the sender | |||
| of the ACK frame. The "ack_delay_exponent" defaults to 3, or a | of the ACK frame. The "ack_delay_exponent" defaults to 3, or a | |||
| multiplier of 8 (see Section 6.4.1). Scaling in this fashion | multiplier of 8 (see Section 6.6.1). Scaling in this fashion | |||
| allows for a larger range of values with a shorter encoding at the | allows for a larger range of values with a shorter encoding at the | |||
| cost of lower resolution. | cost of lower resolution. | |||
| ACK Block Count: The number of Additional ACK Block (and Gap) fields | ACK Block Count: The number of Additional ACK Block (and Gap) fields | |||
| after the First ACK Block. | after the First ACK Block. | |||
| ACK Blocks: Contains one or more blocks of packet numbers which have | ACK Blocks: Contains one or more blocks of packet numbers which have | |||
| been successfully received, see Section 7.15.1. | been successfully received, see Section 7.15.1. | |||
| 7.15.1. ACK Block Section | 7.15.1. ACK Block Section | |||
| skipping to change at page 62, line 25 ¶ | skipping to change at page 70, line 40 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Additional ACK Block (i) ... | | Additional ACK Block (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Gap (i) ... | | Gap (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Additional ACK Block (i) ... | | Additional ACK Block (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 8: ACK Block Section | Figure 10: ACK Block Section | |||
| Each ACK Block acknowledges a contiguous range of packets by | Each ACK Block acknowledges a contiguous range of packets by | |||
| indicating the number of acknowledged packets that precede the | indicating the number of acknowledged packets that precede the | |||
| largest packet number in that block. A value of zero indicates that | largest packet number in that block. A value of zero indicates that | |||
| only the largest packet number is acknowledged. Larger ACK Block | only the largest packet number is acknowledged. Larger ACK Block | |||
| values indicate a larger range, with corresponding lower values for | values indicate a larger range, with corresponding lower values for | |||
| the smallest packet number in the range. Thus, given a largest | the smallest packet number in the range. Thus, given a largest | |||
| packet number for the ACK, the smallest value is determined by the | packet number for the ACK, the smallest value is determined by the | |||
| formula: | formula: | |||
| skipping to change at page 63, line 9 ¶ | skipping to change at page 71, line 25 ¶ | |||
| the encoded value of the Gap Field. | the encoded value of the Gap Field. | |||
| The value of the Gap field establishes the largest packet number | The value of the Gap field establishes the largest packet number | |||
| value for the ACK block that follows the gap using the following | value for the ACK block that follows the gap using the following | |||
| formula: | formula: | |||
| largest = previous_smallest - gap - 2 | largest = previous_smallest - gap - 2 | |||
| If the calculated value for largest or smallest packet number for any | If the calculated value for largest or smallest packet number for any | |||
| ACK Block is negative, an endpoint MUST generate a connection error | ACK Block is negative, an endpoint MUST generate a connection error | |||
| of type FRAME_ERROR indicating an error in an ACK frame (that is, | of type FRAME_ENCODING_ERROR indicating an error in an ACK frame. | |||
| 0x10d). | ||||
| The fields in the ACK Block Section are: | The fields in the ACK Block Section are: | |||
| First ACK Block: A variable-length integer indicating the number of | First ACK Block: A variable-length integer indicating the number of | |||
| contiguous packets preceding the Largest Acknowledged that are | contiguous packets preceding the Largest Acknowledged that are | |||
| being acknowledged. | being acknowledged. | |||
| Gap (repeated): A variable-length integer indicating the number of | Gap (repeated): A variable-length integer indicating the number of | |||
| contiguous unacknowledged packets preceding the packet number one | contiguous unacknowledged packets preceding the packet number one | |||
| lower than the smallest in the preceding ACK Block. | lower than the smallest in the preceding ACK Block. | |||
| skipping to change at page 63, line 48 ¶ | skipping to change at page 72, line 16 ¶ | |||
| sender, the receiver SHOULD track which ACK frames have been | sender, the receiver SHOULD track which ACK frames have been | |||
| acknowledged by its peer. Once an ACK frame has been acknowledged, | acknowledged by its peer. Once an ACK frame has been acknowledged, | |||
| the packets it acknowledges SHOULD NOT be acknowledged again. | the packets it acknowledges SHOULD NOT be acknowledged again. | |||
| Because ACK frames are not sent in response to ACK-only packets, a | Because ACK frames are not sent in response to ACK-only packets, a | |||
| receiver that is only sending ACK frames will only receive | receiver that is only sending ACK frames will only receive | |||
| acknowledgements for its packets if the sender includes them in | acknowledgements for its packets if the sender includes them in | |||
| packets with non-ACK frames. A sender SHOULD bundle ACK frames with | packets with non-ACK frames. A sender SHOULD bundle ACK frames with | |||
| other frames when possible. | other frames when possible. | |||
| Endpoints can only acknowledge packets sent in a particular packet | ||||
| number space by sending ACK frames in packets from the same packet | ||||
| number space. | ||||
| To limit receiver state or the size of ACK frames, a receiver MAY | To limit receiver state or the size of ACK frames, a receiver MAY | |||
| limit the number of ACK blocks it sends. A receiver can do this even | limit the number of ACK blocks it sends. A receiver can do this even | |||
| without receiving acknowledgment of its ACK frames, with the | without receiving acknowledgment of its ACK frames, with the | |||
| knowledge this could cause the sender to unnecessarily retransmit | knowledge this could cause the sender to unnecessarily retransmit | |||
| some data. Standard QUIC [QUIC-RECOVERY] algorithms declare packets | some data. Standard QUIC [QUIC-RECOVERY] algorithms declare packets | |||
| lost after sufficiently newer packets are acknowledged. Therefore, | lost after sufficiently newer packets are acknowledged. Therefore, | |||
| the receiver SHOULD repeatedly acknowledge newly received packets in | the receiver SHOULD repeatedly acknowledge newly received packets in | |||
| preference to packets received in the past. | preference to packets received in the past. | |||
| 7.15.3. ACK Frames and Packet Protection | 7.15.3. ACK Frames and Packet Protection | |||
| ACK frames that acknowledge protected packets MUST be carried in a | ACK frames MUST only be carried in a packet that has the same packet | |||
| packet that has an equivalent or greater level of packet protection. | number space as the packet being ACKed (see Section 4.5). For | |||
| instance, packets that are protected with 1-RTT keys MUST be | ||||
| Packets that are protected with 1-RTT keys MUST be acknowledged in | 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 | ||||
| number that was sent with packet protection is not valid. An | ||||
| unprotected packet that carries acknowledgments for protected packets | ||||
| MUST be discarded in its entirety. | ||||
| Packets that a client sends with 0-RTT packet protection MUST be | Packets that a client sends with 0-RTT packet protection MUST be | |||
| acknowledged by the server in packets protected by 1-RTT keys. This | acknowledged by the server in packets protected by 1-RTT keys. This | |||
| can mean that the client is unable to use these acknowledgments if | can mean that the client is unable to use these acknowledgments if | |||
| the server cryptographic handshake messages are delayed or lost. | the server cryptographic handshake messages are delayed or lost. | |||
| Note that the same limitation applies to other data sent by the | Note that the same limitation applies to other data sent by the | |||
| server protected by the 1-RTT keys. | server protected by the 1-RTT keys. | |||
| Unprotected packets, such as those that carry the initial | Endpoints SHOULD send acknowledgments for packets containing CRYPTO | |||
| cryptographic handshake messages, MAY be acknowledged in unprotected | frames with a reduced delay; see Section 3.5.1 of [QUIC-RECOVERY]. | |||
| packets. Unprotected packets are vulnerable to falsification or | ||||
| modification. Unprotected packets can be acknowledged along with | ||||
| protected packets in a protected packet. | ||||
| An endpoint SHOULD acknowledge packets containing cryptographic | 7.16. ACK_ECN Frame | |||
| handshake messages in the next unprotected packet that it sends, | ||||
| unless it is able to acknowledge those packets in later packets | ||||
| protected by 1-RTT keys. At the completion of the cryptographic | ||||
| handshake, both peers send unprotected packets containing | ||||
| cryptographic handshake messages followed by packets protected by | ||||
| 1-RTT keys. An endpoint SHOULD acknowledge the unprotected packets | ||||
| that complete the cryptographic handshake in a protected packet, | ||||
| because its peer is guaranteed to have access to 1-RTT packet | ||||
| protection keys. | ||||
| For instance, a server acknowledges a TLS ClientHello in the packet | The ACK_ECN frame (type=0x20) is used by an endpoint that supports | |||
| that carries the TLS ServerHello; similarly, a client can acknowledge | ECN to acknowledge packets received with ECN codepoints of ECT(0), | |||
| a TLS HelloRetryRequest in the packet containing a second TLS | ECT(1), or CE in the packet's IP header. | |||
| ClientHello. The complete set of server handshake messages (TLS | ||||
| ServerHello through to Finished) might be acknowledged by a client in | ||||
| protected packets, because it is certain that the server is able to | ||||
| decipher the packet. | ||||
| 7.16. PATH_CHALLENGE 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 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Largest Acknowledged (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Delay (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(0) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(1) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECN-CE Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Block Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Blocks (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 11: ACK_ECN Frame Format | ||||
| An ACK_ECN frame contains all the elements of the ACK frame | ||||
| (Section 7.15) with the addition of three counts following the ACK | ||||
| Delay field. | ||||
| ECT(0) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(0) codepoint. | ||||
| ECT(1) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(1) codepoint. | ||||
| CE Count: A variable-length integer representing the total number | ||||
| packets received with the CE codepoint. | ||||
| 7.17. PATH_CHALLENGE Frame | ||||
| Endpoints can use PATH_CHALLENGE frames (type=0x0e) to check | Endpoints can use PATH_CHALLENGE frames (type=0x0e) to check | |||
| reachability to the peer and for path validation during connection | reachability to the peer and for path validation during connection | |||
| establishment and connection migration. | establishment and connection migration. | |||
| PATH_CHALLENGE frames contain an 8-byte payload. | PATH_CHALLENGE frames contain an 8-byte payload. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 65, line 20 ¶ | skipping to change at page 74, line 4 ¶ | |||
| PATH_CHALLENGE frames contain an 8-byte payload. | PATH_CHALLENGE frames contain an 8-byte payload. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Data (8) + | + Data (8) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Data: This 8-byte field contains arbitrary data. | Data: This 8-byte field contains arbitrary data. | |||
| A PATH_CHALLENGE frame containing 8 octets that are hard to guess is | A PATH_CHALLENGE frame containing 8 octets that are hard to guess is | |||
| sufficient to ensure that it is easier to receive the packet than it | sufficient to ensure that it is easier to receive the packet than it | |||
| is to guess the value correctly. | is to guess the value correctly. | |||
| The recipient of this frame MUST generate a PATH_RESPONSE frame | The recipient of this frame MUST generate a PATH_RESPONSE frame | |||
| (Section 7.17) containing the same Data. | (Section 7.18) containing the same Data. | |||
| 7.17. PATH_RESPONSE Frame | 7.18. PATH_RESPONSE Frame | |||
| The PATH_RESPONSE frame (type=0x0f) is sent in response to a | The PATH_RESPONSE frame (type=0x0f) is sent in response to a | |||
| PATH_CHALLENGE frame. Its format is identical to the PATH_CHALLENGE | PATH_CHALLENGE frame. Its format is identical to the PATH_CHALLENGE | |||
| frame (Section 7.16). | frame (Section 7.17). | |||
| If the content of a PATH_RESPONSE frame does not match the content of | If the content of a PATH_RESPONSE frame does not match the content of | |||
| a PATH_CHALLENGE frame previously sent by the endpoint, the endpoint | a PATH_CHALLENGE frame previously sent by the endpoint, the endpoint | |||
| MAY generate a connection error of type UNSOLICITED_PATH_RESPONSE. | MAY generate a connection error of type UNSOLICITED_PATH_RESPONSE. | |||
| 7.18. STREAM Frames | 7.19. NEW_TOKEN frame | |||
| A server sends a NEW_TOKEN frame (type=0x19) to provide the client a | ||||
| token to send in a the header of an Initial packet for a future | ||||
| connection. | ||||
| The NEW_TOKEN frame is as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Token Length (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Token (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields of a NEW_TOKEN frame are as follows: | ||||
| Token Length: A variable-length integer specifying the length of the | ||||
| token in bytes. | ||||
| Token: An opaque blob that the client may use with a future Initial | ||||
| packet. | ||||
| 7.20. STREAM Frames | ||||
| STREAM frames implicitly create a stream and carry stream data. The | STREAM frames implicitly create a stream and carry stream data. The | |||
| STREAM frame takes the form 0b00010XXX (or the set of values from | STREAM frame takes the form 0b00010XXX (or the set of values from | |||
| 0x10 to 0x17). The value of the three low-order bits of the frame | 0x10 to 0x17). The value of the three low-order bits of the frame | |||
| type determine the fields that are present in the frame. | type determine the fields that are present in the frame. | |||
| o The OFF bit (0x04) in the frame type is set to indicate that there | o The OFF bit (0x04) in the frame type is set to indicate that there | |||
| is an Offset field present. When set to 1, the Offset field is | is an Offset field present. When set to 1, the Offset field is | |||
| present; when set to 0, the Offset field is absent and the Stream | present; when set to 0, the Offset field is absent and the Stream | |||
| Data starts at an offset of 0 (that is, the frame contains the | Data starts at an offset of 0 (that is, the frame contains the | |||
| skipping to change at page 66, line 33 ¶ | skipping to change at page 75, line 40 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Offset (i)] ... | | [Offset (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Length (i)] ... | | [Length (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream Data (*) ... | | Stream Data (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: STREAM Frame Format | Figure 12: STREAM Frame Format | |||
| The STREAM frame contains the following fields: | The STREAM frame contains the following fields: | |||
| Stream ID: A variable-length integer indicating the stream ID of the | Stream ID: A variable-length integer indicating the stream ID of the | |||
| stream (see Section 9.1). | stream (see Section 9.1). | |||
| Offset: A variable-length integer specifying the byte offset in the | Offset: A variable-length integer specifying the byte offset in the | |||
| stream for the data in this STREAM frame. This field is present | stream for the data in this STREAM frame. This field is present | |||
| when the OFF bit is set to 1. When the Offset field is absent, | when the OFF bit is set to 1. When the Offset field is absent, | |||
| the offset is 0. | the offset is 0. | |||
| skipping to change at page 67, line 26 ¶ | skipping to change at page 76, line 33 ¶ | |||
| Implementation note: One of the benefits of QUIC is avoidance of | Implementation note: One of the benefits of QUIC is avoidance of | |||
| head-of-line blocking across multiple streams. When a packet loss | head-of-line blocking across multiple streams. When a packet loss | |||
| occurs, only streams with data in that packet are blocked waiting for | occurs, only streams with data in that packet are blocked waiting for | |||
| a retransmission to be received, while other streams can continue | a retransmission to be received, while other streams can continue | |||
| making progress. Note that when data from multiple streams is | making progress. Note that when data from multiple streams is | |||
| bundled into a single QUIC packet, loss of that packet blocks all | bundled into a single QUIC packet, loss of that packet blocks all | |||
| those streams from making progress. An implementation is therefore | those streams from making progress. An implementation is therefore | |||
| advised to bundle as few streams as necessary in outgoing packets | advised to bundle as few streams as necessary in outgoing packets | |||
| without losing transmission efficiency to underfilled packets. | without losing transmission efficiency to underfilled packets. | |||
| 7.21. CRYPTO Frame | ||||
| The CRYPTO frame (type=0x18) is used to transmit cryptographic | ||||
| handshake messages. It can be sent in all packet types. The CRYPTO | ||||
| frame offers the cryptographic protocol an in-order stream of bytes. | ||||
| CRYPTO frames are functionally identical to STREAM frames, except | ||||
| that they do not bear a stream identifier; they are not flow | ||||
| controlled; and they do not carry markers for optional offset, | ||||
| optional length, and the end of the stream. | ||||
| A CRYPTO frame is shown below. | ||||
| 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) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Length (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Crypto Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 13: CRYPTO Frame Format | ||||
| The CRYPTO frame contains the following fields: | ||||
| Offset: A variable-length integer specifying the byte offset in the | ||||
| stream for the data in this CRYPTO frame. | ||||
| Length: A variable-length integer specifying the length of the | ||||
| Crypto Data field in this CRYPTO frame. | ||||
| Crypto Data: The cryptographic message data. | ||||
| There is a separate flow of cryptographic handshake data in each | ||||
| encryption level, each of which starts at an offset of 0. This | ||||
| implies that each encryption level is treated as a separate CRYPTO | ||||
| stream of data. | ||||
| Unlike STREAM frames, which include a Stream ID indicating to which | ||||
| stream the data belongs, the CRYPTO frame carries data for a single | ||||
| stream per encryption level. The stream does not have an explicit | ||||
| end, so CRYPTO frames do not have a FIN bit. | ||||
| 8. Packetization and Reliability | 8. Packetization and Reliability | |||
| A sender bundles one or more frames in a QUIC packet (see Section 5). | A sender bundles one or more frames in a QUIC packet (see Section 5). | |||
| A sender SHOULD minimize per-packet bandwidth and computational costs | A sender SHOULD minimize per-packet bandwidth and computational costs | |||
| by bundling as many frames as possible within a QUIC packet. A | by bundling as many frames as possible within a QUIC packet. A | |||
| sender MAY wait for a short period of time to bundle multiple frames | sender MAY wait for a short period of time to bundle multiple frames | |||
| before sending a packet that is not maximally packed, to avoid | before sending a packet that is not maximally packed, to avoid | |||
| sending out large numbers of small packets. An implementation may | sending out large numbers of small packets. An implementation may | |||
| use knowledge about application sending behavior or heuristics to | use knowledge about application sending behavior or heuristics to | |||
| skipping to change at page 68, line 26 ¶ | skipping to change at page 78, line 39 ¶ | |||
| whole. The same applies to the frames that are contained within lost | whole. The same applies to the frames that are contained within lost | |||
| packets. Instead, the information that might be carried in frames is | packets. Instead, the information that might be carried in frames is | |||
| sent again in new frames as needed. | sent again in new frames as needed. | |||
| New frames and packets are used to carry information that is | New frames and packets are used to carry information that is | |||
| determined to have been lost. In general, information is sent again | determined to have been lost. In general, information is sent again | |||
| when a packet containing that information is determined to be lost | when a packet containing that information is determined to be lost | |||
| and sending ceases when a packet containing that information is | and sending ceases when a packet containing that information is | |||
| acknowledged. | acknowledged. | |||
| o Data sent in CRYPTO frames are retransmitted according to the | ||||
| rules in [QUIC-RECOVERY], until either all data has been | ||||
| acknowledged or the crypto state machine implicitly knows that the | ||||
| peer received the data. | ||||
| o Application data sent in STREAM frames is retransmitted in new | o Application data sent in STREAM frames is retransmitted in new | |||
| STREAM frames unless the endpoint has sent a RST_STREAM for that | STREAM frames unless the endpoint has sent a RST_STREAM for that | |||
| stream. Once an endpoint sends a RST_STREAM frame, no further | stream. Once an endpoint sends a RST_STREAM frame, no further | |||
| STREAM frames are needed. | STREAM frames are needed. | |||
| o The most recent set of acknowledgments are sent in ACK frames. An | o The most recent set of acknowledgments are sent in ACK frames. An | |||
| ACK frame SHOULD contain all unacknowledged acknowledgments, as | ACK frame SHOULD contain all unacknowledged acknowledgments, as | |||
| described in Section 7.15.2. | described in Section 7.15.2. | |||
| o Cancellation of stream transmission, as carried in a RST_STREAM | o Cancellation of stream transmission, as carried in a RST_STREAM | |||
| skipping to change at page 68, line 47 ¶ | skipping to change at page 79, line 17 ¶ | |||
| acknowledged by the peer (that is, either the "Reset Recvd" or | acknowledged by the peer (that is, either the "Reset Recvd" or | |||
| "Data Recvd" state is reached on the send stream). The content of | "Data Recvd" state is reached on the send stream). The content of | |||
| a RST_STREAM frame MUST NOT change when it is sent again. | a RST_STREAM frame MUST NOT change when it is sent again. | |||
| o Similarly, a request to cancel stream transmission, as encoded in | o Similarly, a request to cancel stream transmission, as encoded in | |||
| a STOP_SENDING frame, is sent until the receive stream enters | a STOP_SENDING frame, is sent until the receive stream enters | |||
| either a "Data Recvd" or "Reset Recvd" state, see Section 9.3. | either a "Data Recvd" or "Reset Recvd" state, see Section 9.3. | |||
| o Connection close signals, including those that use | o Connection close signals, including those that use | |||
| CONNECTION_CLOSE and APPLICATION_CLOSE frames, are not sent again | CONNECTION_CLOSE and APPLICATION_CLOSE frames, are not sent again | |||
| when packet loss is detected, but as described in Section 6.10. | when packet loss is detected, but as described in Section 6.13. | |||
| o The current connection maximum data is sent in MAX_DATA frames. | o The current connection maximum data is sent in MAX_DATA frames. | |||
| An updated value is sent in a MAX_DATA frame if the packet | An updated value is sent in a MAX_DATA frame if the packet | |||
| containing the most recently sent MAX_DATA frame is declared lost, | containing the most recently sent MAX_DATA frame is declared lost, | |||
| or when the endpoint decides to update the limit. Care is | or when the endpoint decides to update the limit. Care is | |||
| necessary to avoid sending this frame too often as the limit can | necessary to avoid sending this frame too often as the limit can | |||
| increase frequently and cause an unnecessarily large number of | increase frequently and cause an unnecessarily large number of | |||
| MAX_DATA frames to be sent. | MAX_DATA frames to be sent. | |||
| o The current maximum stream data offset is sent in MAX_STREAM_DATA | o The current maximum stream data offset is sent in MAX_STREAM_DATA | |||
| skipping to change at page 71, line 17 ¶ | skipping to change at page 81, line 32 ¶ | |||
| most modern IPv4 networks. An endpoint MUST NOT reduce its MTU below | most modern IPv4 networks. An endpoint MUST NOT reduce its MTU below | |||
| this number, even if it receives signals that indicate a smaller | this number, even if it receives signals that indicate a smaller | |||
| limit might exist. | limit might exist. | |||
| If a QUIC endpoint determines that the PMTU between any pair of local | If a QUIC endpoint determines that the PMTU between any pair of local | |||
| and remote IP addresses has fallen below 1280 octets, it MUST | and remote IP addresses has fallen below 1280 octets, it MUST | |||
| immediately cease sending QUIC packets on the affected path. This | immediately cease sending QUIC packets on the affected path. This | |||
| could result in termination of the connection if an alternative path | could result in termination of the connection if an alternative path | |||
| cannot be found. | cannot be found. | |||
| 8.4.1. Special Considerations for PMTU Discovery | 8.4.1. IPv4 PMTU Discovery | |||
| Traditional ICMP-based path MTU discovery in IPv4 [PMTUDv4] is | Traditional ICMP-based path MTU discovery in IPv4 [PMTUDv4] is | |||
| potentially vulnerable to off-path attacks that successfully guess | potentially vulnerable to off-path attacks that successfully guess | |||
| the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | |||
| value. TCP connections mitigate this risk by using the (at minimum) | value. TCP connections mitigate this risk by using the (at minimum) | |||
| 8 bytes of transport header echoed in the ICMP message to validate | 8 bytes of transport header echoed in the ICMP message to validate | |||
| the TCP sequence number as valid for the current connection. | the TCP sequence number as valid for the current connection. | |||
| However, as QUIC operates over UDP, in IPv4 the echoed information | However, as QUIC operates over UDP, in IPv4 the echoed information | |||
| could consist only of the IP and UDP headers, which usually has | could consist only of the IP and UDP headers, which usually has | |||
| insufficient entropy to mitigate off-path attacks. | insufficient entropy to mitigate off-path attacks. | |||
| skipping to change at page 73, line 46 ¶ | skipping to change at page 84, line 19 ¶ | |||
| | | | | | | | | |||
| | 0x1 | Server-Initiated, Bidirectional | | | 0x1 | Server-Initiated, Bidirectional | | |||
| | | | | | | | | |||
| | 0x2 | Client-Initiated, Unidirectional | | | 0x2 | Client-Initiated, Unidirectional | | |||
| | | | | | | | | |||
| | 0x3 | Server-Initiated, Unidirectional | | | 0x3 | Server-Initiated, Unidirectional | | |||
| +----------+----------------------------------+ | +----------+----------------------------------+ | |||
| Table 5: Stream ID Types | Table 5: Stream ID Types | |||
| Stream ID 0 (0x0) is a client-initiated, bidirectional stream that is | The first bi-directional stream opened by the client is stream 0. | |||
| used for the cryptographic handshake. Stream 0 MUST NOT be used for | ||||
| application data. | ||||
| A QUIC endpoint MUST NOT reuse a Stream ID. Streams can be used in | A QUIC endpoint MUST NOT reuse a Stream ID. Streams can be used in | |||
| any order. Streams that are used out of order result in opening all | any order. Streams that are used out of order result in opening all | |||
| lower-numbered streams of the same type in the same direction. | lower-numbered streams of the same type in the same direction. | |||
| Stream IDs are encoded as a variable-length integer (see | Stream IDs are encoded as a variable-length integer (see | |||
| Section 7.1). | Section 7.1). | |||
| 9.2. Stream States | 9.2. Stream States | |||
| skipping to change at page 74, line 40 ¶ | skipping to change at page 85, line 11 ¶ | |||
| of frames can be sent and the reactions that are expected when | of frames can be sent and the reactions that are expected when | |||
| different types of frames are received. Though these state | different types of frames are received. Though these state | |||
| machines are intended to be useful in implementing QUIC, these | machines are intended to be useful in implementing QUIC, these | |||
| states aren't intended to constrain implementations. An | states aren't intended to constrain implementations. An | |||
| implementation can define a different state machine as long as its | implementation can define a different state machine as long as its | |||
| behavior is consistent with an implementation that implements | behavior is consistent with an implementation that implements | |||
| these states. | these states. | |||
| 9.2.1. Send Stream States | 9.2.1. Send Stream States | |||
| Figure 10 shows the states for the part of a stream that sends data | Figure 14 shows the states for the part of a stream that sends data | |||
| to a peer. | to a peer. | |||
| o | o | |||
| | Create Stream (Sending) | | Create Stream (Sending) | |||
| | Create Bidirectional Stream (Receiving) | | Create Bidirectional Stream (Receiving) | |||
| v | v | |||
| +-------+ | +-------+ | |||
| | Ready | Send RST_STREAM | | Ready | Send RST_STREAM | |||
| | |-----------------------. | | |-----------------------. | |||
| +-------+ | | +-------+ | | |||
| skipping to change at page 75, line 36 ¶ | skipping to change at page 85, line 45 ¶ | |||
| | Sent +------------------>| Sent | | | Sent +------------------>| Sent | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | | | | | | |||
| | Recv All ACKs | Recv ACK | | Recv All ACKs | Recv ACK | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | | Reset | | | Data | | Reset | | |||
| | Recvd | | Recvd | | | Recvd | | Recvd | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| Figure 10: States for Send Streams | Figure 14: States for Send Streams | |||
| The sending part of stream that the endpoint initiates (types 0 and 2 | 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 | for clients, 1 and 3 for servers) is opened by the application or | |||
| application protocol. The "Ready" state represents a newly created | application protocol. The "Ready" state represents a newly created | |||
| stream that is able to accept data from the application. Stream data | stream that is able to accept data from the application. Stream data | |||
| might be buffered in this state in preparation for sending. | might be buffered in this state in preparation for sending. | |||
| The sending part of a bidirectional stream initiated by a peer (type | The sending part of a bidirectional stream initiated by a peer (type | |||
| 0 for a server, type 1 for a client) enters the "Ready" state if the | 0 for a server, type 1 for a client) enters the "Ready" state if the | |||
| receiving part enters the "Recv" state. | receiving part enters the "Recv" state. | |||
| skipping to change at page 76, line 39 ¶ | skipping to change at page 86, line 49 ¶ | |||
| An endpoint MAY send a RST_STREAM as the first frame on a send | An endpoint MAY send a RST_STREAM as the first frame on a send | |||
| stream; this causes the send stream to open and then immediately | stream; this causes the send stream to open and then immediately | |||
| transition to the "Reset Sent" state. | transition to the "Reset Sent" state. | |||
| Once a packet containing a RST_STREAM has been acknowledged, the send | Once a packet containing a RST_STREAM has been acknowledged, the send | |||
| stream enters the "Reset Recvd" state, which is a terminal state. | stream enters the "Reset Recvd" state, which is a terminal state. | |||
| 9.2.2. Receive Stream States | 9.2.2. Receive Stream States | |||
| Figure 11 shows the states for the part of a stream that receives | Figure 15 shows the states for the part of a stream that receives | |||
| data from a peer. The states for a receive stream mirror only some | data from a peer. The states for a receive stream mirror only some | |||
| of the states of the send stream at the peer. A receive stream | 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 | doesn't track states on the send stream that cannot be observed, such | |||
| as the "Ready" state; instead, receive streams track the delivery of | as the "Ready" state; instead, receive streams track the delivery of | |||
| data to the application or application protocol some of which cannot | data to the application or application protocol some of which cannot | |||
| be observed by the sender. | be observed by the sender. | |||
| o | o | |||
| | Recv STREAM / STREAM_BLOCKED / RST_STREAM | | Recv STREAM / STREAM_BLOCKED / RST_STREAM | |||
| | Create Bidirectional Stream (Sending) | | Create Bidirectional Stream (Sending) | |||
| skipping to change at page 77, line 36 ¶ | skipping to change at page 87, line 39 ¶ | |||
| | Recvd +<-- (optional) --->| Recvd | | | Recvd +<-- (optional) --->| Recvd | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | | | | | | |||
| | App Read All Data | App Read RST | | App Read All Data | App Read RST | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | | Reset | | | Data | | Reset | | |||
| | Read | | Read | | | Read | | Read | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| Figure 11: States for Receive Streams | Figure 15: States for Receive Streams | |||
| The receiving part of a stream initiated by a peer (types 1 and 3 for | The receiving part of a stream initiated by a peer (types 1 and 3 for | |||
| a client, or 0 and 2 for a server) are created when the first STREAM, | a client, or 0 and 2 for a server) are created when the first STREAM, | |||
| STREAM_BLOCKED, RST_STREAM, or MAX_STREAM_DATA (bidirectional only, | STREAM_BLOCKED, RST_STREAM, or MAX_STREAM_DATA (bidirectional only, | |||
| see below) is received for that stream. The initial state for a | 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 is "Recv". Receiving a RST_STREAM frame causes the | |||
| receive stream to immediately transition to the "Reset Recvd". | receive stream to immediately transition to the "Reset Recvd". | |||
| The receive stream enters the "Recv" state when the sending part of a | The receive stream enters the "Recv" state when the sending part of a | |||
| bidirectional stream initiated by the endpoint (type 0 for a client, | bidirectional stream initiated by the endpoint (type 0 for a client, | |||
| skipping to change at page 79, line 9 ¶ | skipping to change at page 89, line 13 ¶ | |||
| effectively transitions to "Data Recvd" from "Reset Recvd". | effectively transitions to "Data Recvd" from "Reset Recvd". | |||
| Once the application has been delivered the signal indicating that | Once the application has been delivered the signal indicating that | |||
| the receive stream was reset, the receive stream transitions to the | the receive stream was reset, the receive stream transitions to the | |||
| "Reset Read" state, which is a terminal state. | "Reset Read" state, which is a terminal state. | |||
| 9.2.3. Permitted Frame Types | 9.2.3. Permitted Frame Types | |||
| The sender of a stream sends just three frame types that affect the | The sender of a stream sends just three frame types that affect the | |||
| state of a stream at either sender or receiver: STREAM | state of a stream at either sender or receiver: STREAM | |||
| (Section 7.18), STREAM_BLOCKED (Section 7.11), and RST_STREAM | (Section 7.20), STREAM_BLOCKED (Section 7.11), and RST_STREAM | |||
| (Section 7.3). | (Section 7.3). | |||
| A sender MUST NOT send any of these frames from a terminal state | 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 | ("Data Recvd" or "Reset Recvd"). A sender MUST NOT send STREAM or | |||
| STREAM_BLOCKED after sending a RST_STREAM; that is, in the "Reset | STREAM_BLOCKED after sending a RST_STREAM; that is, in the "Reset | |||
| Sent" state in addition to the terminal states. A receiver could | Sent" state in addition to the terminal states. A receiver could | |||
| receive any of these frames in any state, but only due to the | receive any of these frames in any state, but only due to the | |||
| possibility of delayed delivery of packets carrying them. | possibility of delayed delivery of packets carrying them. | |||
| The receiver of a stream sends MAX_STREAM_DATA (Section 7.7) and | The receiver of a stream sends MAX_STREAM_DATA (Section 7.7) and | |||
| skipping to change at page 81, line 32 ¶ | skipping to change at page 91, line 32 ¶ | |||
| An endpoint is expected to send another STOP_SENDING frame if a | An endpoint is expected to send another STOP_SENDING frame if a | |||
| packet containing a previous STOP_SENDING is lost. However, once | packet containing a previous STOP_SENDING is lost. However, once | |||
| either all stream data or a RST_STREAM frame has been received for | 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 | the stream - that is, the stream is in any state other than "Recv" or | |||
| "Size Known" - sending a STOP_SENDING frame is unnecessary. | "Size Known" - sending a STOP_SENDING frame is unnecessary. | |||
| 9.4. Stream Concurrency | 9.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 6.4.1) and is subsequently | transport parameters (see Section 6.6.1) and is subsequently | |||
| increased by MAX_STREAM_ID frames (see Section 7.8). | increased by MAX_STREAM_ID frames (see Section 7.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 | |||
| sent MUST treat this as a stream error of type STREAM_ID_ERROR | sent MUST treat this as a stream error of type STREAM_ID_ERROR | |||
| (Section 11), unless this is a result of a change in the initial | (Section 11), unless this is a result of a change in the initial | |||
| offsets (see Section 6.4.2). | offsets (see Section 6.6.2). | |||
| A receiver MUST NOT renege on an advertisement; that is, once a | A receiver MUST NOT renege on an advertisement; that is, once a | |||
| receiver advertises a stream ID via a MAX_STREAM_ID frame, it MUST | receiver advertises a stream ID via a MAX_STREAM_ID frame, it MUST | |||
| NOT subsequently advertise a smaller maximum ID. A sender may | NOT subsequently advertise a smaller maximum ID. A sender may | |||
| receive MAX_STREAM_ID frames out of order; a sender MUST therefore | receive MAX_STREAM_ID frames out of order; a sender MUST therefore | |||
| ignore any MAX_STREAM_ID that does not increase the maximum. | ignore any MAX_STREAM_ID that does not increase the maximum. | |||
| 9.5. Sending and Receiving Data | 9.5. Sending and Receiving Data | |||
| Once a stream is created, endpoints may use the stream to send and | Once a stream is created, endpoints may use the stream to send and | |||
| skipping to change at page 82, line 34 ¶ | skipping to change at page 92, line 34 ¶ | |||
| an ordered byte-stream requires that an endpoint buffer any data that | an ordered byte-stream requires that an endpoint buffer any data that | |||
| is received out of order, up to the advertised flow control limit. | is received out of order, up to the advertised flow control limit. | |||
| An endpoint could receive the same octets multiple times; octets that | An endpoint could receive the same octets multiple times; octets that | |||
| have already been received can be discarded. The value for a given | have already been received can be discarded. The value for a given | |||
| octet MUST NOT change if it is sent multiple times; an endpoint MAY | octet MUST NOT change if it is sent multiple times; an endpoint MAY | |||
| treat receipt of a changed octet as a connection error of type | treat receipt of a changed octet as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| 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. | |||
| handshake stream, Stream 0, is exempt from the connection-level data | ||||
| limits established by MAX_DATA. Data on stream 0 other than the | ||||
| initial cryptographic handshake message is still subject to stream- | ||||
| level data limits and MAX_STREAM_DATA. This message is exempt from | ||||
| flow control because it needs to be sent in a single packet | ||||
| regardless of the server's flow control state. This rule applies | ||||
| even for 0-RTT handshakes where the remembered value of | ||||
| MAX_STREAM_DATA would not permit sending a full initial cryptographic | ||||
| handshake message. | ||||
| Flow control is described in detail in Section 10, and congestion | Flow control is described in detail in Section 10, and congestion | |||
| control is described in the companion document [QUIC-RECOVERY]. | control is described in the companion document [QUIC-RECOVERY]. | |||
| 9.6. Stream Prioritization | 9.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 [HTTP2], shows that effective prioritization strategies have a | HTTP/2 [HTTP2], shows that effective prioritization strategies have a | |||
| skipping to change at page 83, line 32 ¶ | skipping to change at page 93, line 23 ¶ | |||
| Stream priority is most relevant when deciding which stream data will | Stream priority is most relevant when deciding which stream data will | |||
| be transmitted. Often, there will be limits on what can be | be transmitted. Often, there will be limits on what can be | |||
| transmitted as a result of connection flow control or the current | transmitted as a result of connection flow control or the current | |||
| congestion controller state. | congestion controller state. | |||
| Giving preference to the transmission of its own management frames | Giving preference to the transmission of its own management frames | |||
| ensures that the protocol functions efficiently. That is, | ensures that the protocol functions efficiently. That is, | |||
| prioritizing frames other than STREAM frames ensures that loss | prioritizing frames other than STREAM frames ensures that loss | |||
| recovery, congestion control, and flow control operate effectively. | recovery, congestion control, and flow control operate effectively. | |||
| Stream 0 MUST be prioritized over other streams prior to the | CRYPTO frames SHOULD be prioritized over other streams prior to the | |||
| completion of the cryptographic handshake. This includes the | completion of the cryptographic handshake. This includes the | |||
| retransmission of the second flight of client handshake messages, | retransmission of the second flight of client handshake messages, | |||
| that is, the TLS Finished and any client authentication messages. | that is, the TLS Finished and any client authentication messages. | |||
| STREAM data in frames determined to be lost SHOULD be retransmitted | STREAM data in frames determined to be lost SHOULD be retransmitted | |||
| before sending new data, unless application priorities indicate | before sending new data, unless application priorities indicate | |||
| otherwise. Retransmitting lost stream data can fill in gaps, which | otherwise. Retransmitting lost stream data can fill in gaps, which | |||
| allows the peer to consume already received data and free up flow | allows the peer to consume already received data and free up flow | |||
| control window. | control window. | |||
| skipping to change at page 84, line 16 ¶ | skipping to change at page 94, line 7 ¶ | |||
| flow control [HTTP2]. A receiver advertises the number of octets it | flow control [HTTP2]. A receiver advertises the number of octets 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 maximum absolute byte offset of a stream, while MAX_DATA sends | |||
| sends the maximum sum of the absolute byte offsets of all streams | the maximum of the sum of the absolute byte offsets of all streams. | |||
| other than stream 0. | ||||
| A receiver MAY advertise a larger offset at any point by sending | A receiver MAY advertise a larger offset at any point by sending | |||
| MAX_DATA or MAX_STREAM_DATA frames. A receiver MUST NOT renege on an | MAX_DATA or MAX_STREAM_DATA frames. A receiver MUST NOT renege on an | |||
| 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 | |||
| skipping to change at page 84, line 46 ¶ | skipping to change at page 94, line 36 ¶ | |||
| 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 | |||
| sent in STREAM frames on all streams except stream 0. A receiver | sent in STREAM frames on all streams. A receiver advertises credit | |||
| advertises credit for a connection by sending a MAX_DATA frame. A | for a connection by sending a MAX_DATA frame. A receiver maintains a | |||
| receiver maintains a cumulative sum of bytes received on all | cumulative sum of bytes received on all contributing streams, which | |||
| contributing streams, which are used to check for flow control | are used to check for flow control violations. A receiver might use | |||
| violations. A receiver might use a sum of bytes consumed on all | a sum of bytes consumed on all contributing streams to determine the | |||
| contributing streams to determine the maximum data limit to be | maximum data limit to be advertised. | |||
| advertised. | ||||
| 10.1. Edge Cases and Other Considerations | 10.1. Edge Cases and Other Considerations | |||
| There are some edge cases which must be considered when dealing with | There are some edge cases which must be considered when dealing with | |||
| stream and connection level flow control. Given enough time, both | stream and connection level flow control. Given enough time, both | |||
| endpoints must agree on flow control state. If one end believes it | endpoints must agree on flow control state. If one end believes it | |||
| can send more than the other end is willing to receive, the | can send more than the other end is willing to receive, the | |||
| connection will be torn down when too much data arrives. | connection will be torn down when too much data arrives. | |||
| Conversely if a sender believes it is blocked, while endpoint B | Conversely if a sender believes it is blocked, while endpoint B | |||
| skipping to change at page 86, line 15 ¶ | skipping to change at page 96, line 5 ¶ | |||
| increments to limits if blocking is to be avoided. Thus, larger | increments to limits if blocking is to be avoided. Thus, larger | |||
| updates require a receiver to commit to larger resource commitments. | updates require a receiver to commit to larger resource commitments. | |||
| Thus there is a tradeoff between resource commitment and overhead | Thus there is a tradeoff between resource commitment and overhead | |||
| when determining how large a limit is advertised. | when determining how large a limit is advertised. | |||
| A receiver MAY use an autotuning mechanism to tune the frequency and | A receiver MAY use an autotuning mechanism to tune the frequency and | |||
| amount that it increases data limits based on a round-trip time | amount that it increases data limits based on a round-trip time | |||
| estimate and the rate at which the receiving application consumes | estimate and the rate at which the receiving application consumes | |||
| data, similar to common TCP implementations. | data, similar to common TCP implementations. | |||
| 10.1.3. Handshake Exemption | ||||
| During the initial handshake, an endpoint could need to send a larger | ||||
| message on stream 0 than would ordinarily be permitted by the peer's | ||||
| initial stream flow control window. Since MAX_STREAM_DATA frames are | ||||
| not permitted in these early packets, the peer cannot provide | ||||
| additional flow control window in order to complete the handshake. | ||||
| Endpoints MAY exceed the flow control limits on stream 0 prior to the | ||||
| completion of the cryptographic handshake. (That is, in Initial, | ||||
| Retry, and Handshake packets.) However, once the handshake is | ||||
| complete, endpoints MUST NOT send additional data beyond the peer's | ||||
| permitted offset. If the amount of data sent during the handshake | ||||
| exceeds the peer's maximum offset, the endpoint cannot send | ||||
| additional data on stream 0 until the peer has sent a MAX_STREAM_DATA | ||||
| frame indicating a larger maximum offset. | ||||
| 10.2. Stream Limit Increment | 10.2. Stream Limit Increment | |||
| As with flow control, this document leaves when and how many streams | As with flow control, this document leaves when and how many streams | |||
| to make available to a peer via MAX_STREAM_ID to implementations, but | to make available to a peer via MAX_STREAM_ID to implementations, but | |||
| offers a few considerations. MAX_STREAM_ID frames constitute minimal | offers a few considerations. MAX_STREAM_ID frames constitute minimal | |||
| overhead, while withholding MAX_STREAM_ID frames can prevent the peer | overhead, while withholding MAX_STREAM_ID frames can prevent the peer | |||
| from using the available parallelism. | from using the available parallelism. | |||
| 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 | |||
| skipping to change at page 87, line 46 ¶ | skipping to change at page 97, line 18 ¶ | |||
| 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 11). A receiver SHOULD treat receipt of data at or | (see Section 11). 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 | |||
| because requiring that an endpoint generate these errors also means | because requiring that an endpoint generate these errors also means | |||
| that the endpoint needs to maintain the final offset state for closed | that the endpoint needs to maintain the final offset state for closed | |||
| streams, which could mean a significant state commitment. | streams, which could mean a significant state commitment. | |||
| 10.4. Flow Control for Crytographic Handshake | ||||
| Data sent in CRYPTO frames is not flow controlled in the same way as | ||||
| STREAM frames. QUIC relies on the cryptographic protocol | ||||
| implementation to avoid excessive buffering of data, see [QUIC-TLS]. | ||||
| The implementation SHOULD provide an interface to QUIC to tell it | ||||
| about its buffering limits so that there is not excessive buffering | ||||
| at multiple layers. | ||||
| 11. Error Handling | 11. Error Handling | |||
| An endpoint that detects an error SHOULD signal the existence of that | An endpoint that detects an error SHOULD signal the existence of that | |||
| error to its peer. Both transport-level and application-level errors | error to its peer. Both transport-level and application-level errors | |||
| can affect an entire connection (see Section 11.1), while only | can affect an entire connection (see Section 11.1), while only | |||
| application-level errors can be isolated to a single stream (see | application-level errors can be isolated to a single stream (see | |||
| Section 11.2). | Section 11.2). | |||
| The most appropriate error code (Section 11.3) SHOULD be included in | The most appropriate error code (Section 11.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 6.10.4) is not suitable for any error that | A stateless reset (Section 6.13.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. | |||
| 11.1. Connection Errors | 11.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 7.4, | CONNECTION_CLOSE or APPLICATION_CLOSE frame (Section 7.4, | |||
| skipping to change at page 88, line 43 ¶ | skipping to change at page 98, line 22 ¶ | |||
| 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 6.10.4). | stateless reset process (Section 6.13.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. | |||
| 11.2. Stream Errors | 11.2. Stream Errors | |||
| If an application-level error affects a single stream, but otherwise | If an application-level error affects a single stream, but otherwise | |||
| leaves the connection in a recoverable state, the endpoint can send a | leaves the connection in a recoverable state, the endpoint can send a | |||
| RST_STREAM frame (Section 7.3) with an appropriate error code to | RST_STREAM frame (Section 7.3) with an appropriate error code to | |||
| terminate just the affected stream. | terminate just the affected stream. | |||
| 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 | ||||
| the FIN flag, an endpoint MUST generate a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| Other than STOPPING (Section 9.3), RST_STREAM MUST be instigated by | Other than STOPPING (Section 9.3), RST_STREAM MUST be instigated by | |||
| the application and MUST carry an application error code. Resetting | the application and MUST carry an application error code. Resetting | |||
| a stream without knowledge of the application protocol could cause | a stream without knowledge of the application protocol could cause | |||
| the protocol to enter an unrecoverable state. Application protocols | the protocol to enter an unrecoverable state. Application protocols | |||
| might require certain streams to be reliably delivered in order to | might require certain streams to be reliably delivered in order to | |||
| guarantee consistent state between endpoints. | guarantee consistent state between endpoints. | |||
| 11.3. Transport Error Codes | 11.3. Transport Error Codes | |||
| QUIC error codes are 16-bit unsigned integers. | QUIC error codes are 16-bit unsigned integers. | |||
| skipping to change at page 90, line 13 ¶ | skipping to change at page 99, line 29 ¶ | |||
| Section 9.2). | Section 9.2). | |||
| FINAL_OFFSET_ERROR (0x6): An endpoint received a STREAM frame | FINAL_OFFSET_ERROR (0x6): An endpoint received a STREAM frame | |||
| containing data that exceeded the previously established final | containing data that exceeded the previously established final | |||
| offset. Or an endpoint received a RST_STREAM frame containing a | offset. Or an endpoint received a RST_STREAM frame containing a | |||
| final offset that was lower than the maximum offset of data that | final offset that was lower than the maximum offset of data that | |||
| was already received. Or an endpoint received a RST_STREAM frame | was already received. Or an endpoint received a RST_STREAM frame | |||
| containing a different final offset to the one already | containing a different final offset to the one already | |||
| established. | established. | |||
| FRAME_FORMAT_ERROR (0x7): An endpoint received a frame that was | FRAME_ENCODING_ERROR (0x7): An endpoint received a frame that was | |||
| badly formatted. For instance, an empty STREAM frame that omitted | badly formatted. For instance, an empty STREAM frame that omitted | |||
| the FIN flag, or an ACK frame that has more acknowledgment ranges | the FIN flag, or an ACK frame that has more acknowledgment ranges | |||
| than the remainder of the packet could carry. This is a generic | than the remainder of the packet could carry. | |||
| error code; an endpoint SHOULD use the more specific frame format | ||||
| error codes (0x1XX) if possible. | ||||
| TRANSPORT_PARAMETER_ERROR (0x8): An endpoint received transport | TRANSPORT_PARAMETER_ERROR (0x8): An endpoint received transport | |||
| parameters that were badly formatted, included an invalid value, | parameters that were badly formatted, included an invalid value, | |||
| was absent even though it is mandatory, was present though it is | was absent even though it is mandatory, was present though it is | |||
| forbidden, or is otherwise in error. | forbidden, or is otherwise in error. | |||
| 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_PATH_RESPONSE (0xB): An endpoint received a | UNSOLICITED_PATH_RESPONSE (0xB): An endpoint received a | |||
| PATH_RESPONSE frame that did not correspond to any PATH_CHALLENGE | PATH_RESPONSE frame that did not correspond to any PATH_CHALLENGE | |||
| frame that it previously sent. | frame that it previously sent. | |||
| FRAME_ERROR (0x1XX): An endpoint detected an error in a specific | INVALID_MIGRATION (0xC): A peer has migrated to a different network | |||
| frame type. The frame type is included as the last octet of the | when the endpoint had disabled migration. | |||
| error code. For example, an error in a MAX_STREAM_ID frame would | ||||
| be indicated with the code (0x106). | ||||
| Codes for errors occuring when TLS is used for the crypto handshake | CRYPTO_ERROR (0x1XX): The cryptographic handshake failed. A range | |||
| are defined in Section 11 of [QUIC-TLS]. See Section 13.2 for | of 256 values is reserved for carrying error codes specific to the | |||
| details of registering new error codes. | cryptographic handshake that is used. Codes for errors occuring | |||
| when TLS is used for the crypto handshake are defined in | ||||
| Section 11 of [QUIC-TLS]. | ||||
| See Section 13.3 for details of registering new error codes. | ||||
| 11.4. Application Protocol Error Codes | 11.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 7.3) and APPLICATION_CLOSE (Section 7.5) frames. | RST_STREAM (Section 7.3) and APPLICATION_CLOSE (Section 7.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. | |||
| 12. Security Considerations | 12. Security Considerations | |||
| 12.1. Spoofed ACK Attack | 12.1. Handshake Denial of Service | |||
| As an encrypted and authenticated transport QUIC provides a range of | ||||
| protections against denial of service. Once the cryptographic | ||||
| handshake is complete, QUIC endpoints discard most packets that are | ||||
| not authenticated, greatly limiting the ability of an attacker to | ||||
| interfere with existing connections. | ||||
| Once a connection is established QUIC endpoints might accept some | ||||
| unauthenticated ICMP packets (see Section 8.4.1), but the use of | ||||
| these packets is extremely limited. The only other type of packet | ||||
| that an endpoint might accept is a stateless reset (Section 6.13.4) | ||||
| which relies on the token being kept secret until it is used. | ||||
| During the creation of a connection, QUIC only provides protection | ||||
| against attack from off the network path. All QUIC packets contain | ||||
| proof that the recipient saw a preceding packet from its peer. | ||||
| The first mechanism used is the source and destination connection | ||||
| IDs, which are required to match those set by a peer. Except for an | ||||
| Initial and stateless reset packets, an endpoint only accepts packets | ||||
| that include a destination connection that matches a connection ID | ||||
| the endpoint previously chose. This is the only protection offered | ||||
| for Version Negotiation packets. | ||||
| The destination connection ID in an Initial packet is selected by a | ||||
| client to be unpredictable, which serves an additional purpose. The | ||||
| packets that carry the cryptographic handshake are protected with a | ||||
| key that is derived from this connection ID and salt specific to the | ||||
| QUIC version. This allows endpoints to use the same process for | ||||
| authenticating packets that they receive as they use after the | ||||
| cryptographic handshake completes. Packets that cannot be | ||||
| authenticated are discarded. Protecting packets in this fashion | ||||
| provides a strong assurance that the sender of the packet saw the | ||||
| Initial packet and understood it. | ||||
| These protections are not intended to be effective against an | ||||
| attacker that is able to receive QUIC packets prior to the connection | ||||
| being established. Such an attacker can potentially send packets | ||||
| that will be accepted by QUIC endpoints. This version of QUIC | ||||
| attempts to detect this sort of attack, but it expects that endpoints | ||||
| will fail to establish a connection rather than recovering. For the | ||||
| most part, the cryptographic handshake protocol [QUIC-TLS] is | ||||
| responsible for detecting tampering during the handshake, though | ||||
| additional validation is required for version negotiation (see | ||||
| Section 6.6.4). | ||||
| Endpoints are permitted to use other methods to detect and attempt to | ||||
| recover from interference with the handshake. Invalid packets may be | ||||
| identified and discarded using other methods, but no specific method | ||||
| is mandated in this document. | ||||
| 12.2. Spoofed ACK Attack | ||||
| An attacker might be able to receive an address validation token | An attacker might be able to receive an address validation token | |||
| (Section 6.6) from the server and then release the IP address it used | (Section 6.9) from the server and then release the IP address it used | |||
| to acquire that token. The attacker may, in the future, spoof this | to acquire that token. The attacker may, in the future, spoof this | |||
| same address (which now presumably addresses a different endpoint), | same address (which now presumably addresses a different endpoint), | |||
| and initiate a 0-RTT connection with a server on the victim's behalf. | and initiate a 0-RTT connection with a server on the victim's behalf. | |||
| The attacker can then spoof ACK frames to the server which cause the | The attacker can then spoof ACK frames to the server which cause the | |||
| server to send excessive amounts of data toward the new owner of the | server to send excessive amounts of data toward the new owner of the | |||
| IP address. | IP address. | |||
| There are two possible mitigations to this attack. The simplest one | There are two possible mitigations to this attack. The simplest one | |||
| is that a server can unilaterally create a gap in packet-number | is that a server can unilaterally create a gap in packet-number | |||
| space. In the non-attack scenario, the client will send an ACK frame | space. In the non-attack scenario, the client will send an ACK frame | |||
| skipping to change at page 91, line 42 ¶ | skipping to change at page 102, line 15 ¶ | |||
| The second mitigation is that the server can require that | The second mitigation is that the server can require that | |||
| acknowledgments for sent packets match the encryption level of the | acknowledgments for sent packets match the encryption level of the | |||
| sent packet. This mitigation is useful if the connection has an | sent packet. This mitigation is useful if the connection has an | |||
| ephemeral forward-secure key that is generated and used for every new | ephemeral forward-secure key that is generated and used for every new | |||
| connection. If a packet sent is protected with a forward-secure key, | connection. If a packet sent is protected with a forward-secure key, | |||
| then any acknowledgments that are received for them MUST also be | then any acknowledgments that are received for them MUST also be | |||
| forward-secure protected. Since the attacker will not have the | forward-secure protected. Since the attacker will not have the | |||
| forward secure key, the attacker will not be able to generate | forward secure key, the attacker will not be able to generate | |||
| forward-secure protected packets with ACK frames. | forward-secure protected packets with ACK frames. | |||
| 12.2. Optimistic ACK Attack | 12.3. Optimistic ACK Attack | |||
| An endpoint that acknowledges packets it has not received might cause | An endpoint that acknowledges packets it has not received might cause | |||
| a congestion controller to permit sending at rates beyond what the | a congestion controller to permit sending at rates beyond what the | |||
| network supports. An endpoint MAY skip packet numbers when sending | network supports. An endpoint MAY skip packet numbers when sending | |||
| packets to detect this behavior. An endpoint can then immediately | packets to detect this behavior. An endpoint can then immediately | |||
| close the connection with a connection error of type | close the connection with a connection error of type | |||
| PROTOCOL_VIOLATION (see Section 6.10.3). | PROTOCOL_VIOLATION (see Section 6.13.3). | |||
| 12.3. Slowloris Attacks | 12.4. Slowloris Attacks | |||
| The attacks commonly known as Slowloris [SLOWLORIS] try to keep many | The attacks commonly known as Slowloris [SLOWLORIS] try to keep many | |||
| connections to the target endpoint open and hold them open as long as | connections to the target endpoint open and hold them open as long as | |||
| possible. These attacks can be executed against a QUIC endpoint by | possible. These attacks can be executed against a QUIC endpoint by | |||
| generating the minimum amount of activity necessary to avoid being | generating the minimum amount of activity necessary to avoid being | |||
| closed for inactivity. This might involve sending small amounts of | closed for inactivity. This might involve sending small amounts of | |||
| data, gradually opening flow control windows in order to control the | data, gradually opening flow control windows in order to control the | |||
| sender rate, or manufacturing ACK frames that simulate a high loss | sender rate, or manufacturing ACK frames that simulate a high loss | |||
| rate. | rate. | |||
| QUIC deployments SHOULD provide mitigations for the Slowloris | QUIC deployments SHOULD provide mitigations for the Slowloris | |||
| attacks, such as increasing the maximum number of clients the server | attacks, such as increasing the maximum number of clients the server | |||
| will allow, limiting the number of connections a single IP address is | will allow, limiting the number of connections a single IP address is | |||
| allowed to make, imposing restrictions on the minimum transfer speed | allowed to make, imposing restrictions on the minimum transfer speed | |||
| a connection is allowed to have, and restricting the length of time | a connection is allowed to have, and restricting the length of time | |||
| an endpoint is allowed to stay connected. | an endpoint is allowed to stay connected. | |||
| 12.4. Stream Fragmentation and Reassembly Attacks | 12.5. Stream Fragmentation and Reassembly Attacks | |||
| An adversarial endpoint might intentionally fragment the data on | An adversarial endpoint might intentionally fragment the data on | |||
| stream buffers in order to cause disproportionate memory commitment. | stream buffers in order to cause disproportionate memory commitment. | |||
| An adversarial endpoint could open a stream and send some STREAM | An adversarial endpoint could open a stream and send some STREAM | |||
| frames containing arbitrary fragments of the stream content. | frames containing arbitrary fragments of the stream content. | |||
| The attack is mitigated if flow control windows correspond to | The attack is mitigated if flow control windows correspond to | |||
| available memory. However, some receivers will over-commit memory | available memory. However, some receivers will over-commit memory | |||
| and advertise flow control offsets in the aggregate that exceed | and advertise flow control offsets in the aggregate that exceed | |||
| actual available memory. The over-commitment strategy can lead to | actual available memory. The over-commitment strategy can lead to | |||
| better performance when endpoints are well behaved, but renders | better performance when endpoints are well behaved, but renders | |||
| endpoints vulnerable to the stream fragmentation attack. | endpoints vulnerable to the stream fragmentation attack. | |||
| QUIC deployments SHOULD provide mitigations against the stream | QUIC deployments SHOULD provide mitigations against the stream | |||
| fragmentation attack. Mitigations could consist of avoiding over- | fragmentation attack. Mitigations could consist of avoiding over- | |||
| committing memory, delaying reassembly of STREAM frames, implementing | committing memory, delaying reassembly of STREAM frames, implementing | |||
| heuristics based on the age and duration of reassembly holes, or some | heuristics based on the age and duration of reassembly holes, or some | |||
| combination. | combination. | |||
| 12.5. Stream Commitment Attack | 12.6. Stream Commitment Attack | |||
| An adversarial endpoint can open lots of streams, exhausting state on | An adversarial endpoint can open lots of streams, exhausting state on | |||
| an endpoint. The adversarial endpoint could repeat the process on a | an endpoint. The adversarial endpoint could repeat the process on a | |||
| large number of connections, in a manner similar to SYN flooding | large number of connections, in a manner similar to SYN flooding | |||
| attacks in TCP. | attacks in TCP. | |||
| Normally, clients will open streams sequentially, as explained in | Normally, clients will open streams sequentially, as explained in | |||
| Section 9.1. However, when several streams are initiated at short | Section 9.1. However, when several streams are initiated at short | |||
| intervals, transmission error may cause STREAM DATA frames opening | intervals, transmission error may cause STREAM DATA frames opening | |||
| streams to be received out of sequence. A receiver is obligated to | streams to be received out of sequence. A receiver is obligated to | |||
| open intervening streams if a higher-numbered stream ID is received. | open intervening streams if a higher-numbered stream ID is received. | |||
| Thus, on a new connection, opening stream 2000001 opens 1 million | Thus, on a new connection, opening stream 2000001 opens 1 million | |||
| streams, as required by the specification. | streams, as required by the specification. | |||
| The number of active streams is limited by the concurrent stream | The number of active streams is limited by the concurrent stream | |||
| limit transport parameter, as explained in Section 9.4. If chosen | limit transport parameter, as explained in Section 9.4. If chosen | |||
| judisciously, this limit mitigates the effect of the stream | judisciously, this limit mitigates the effect of the stream | |||
| commitment attack. However, setting the limit too low could affect | commitment attack. However, setting the limit too low could affect | |||
| performance when applications expect to open large number of streams. | performance when applications expect to open large number of streams. | |||
| 13. IANA Considerations | 12.7. Explicit Congestion Notification Attacks | |||
| An on-path attacker could manipulate the value of ECN codepoints in | ||||
| the IP header to influence the sender's rate. [RFC3168] discusses | ||||
| manipulations and their effects in more detail. | ||||
| An on-the-side attacker can duplicate and send packets with modified | ||||
| ECN codepoints to affect the sender's rate. If duplicate packets are | ||||
| discarded by a receiver, an off-path attacker will need to race the | ||||
| duplicate packet against the original to be successful in this | ||||
| attack. Therefore, QUIC receivers ignore ECN codepoints set in | ||||
| duplicate packets (see Section 6.8). | ||||
| 13. IANA Considerations | ||||
| 13.1. QUIC Transport Parameter Registry | 13.1. QUIC Transport Parameter Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | |||
| under a "QUIC Protocol" heading. | under a "QUIC Protocol" heading. | |||
| The "QUIC Transport Parameters" registry governs a 16-bit space. | The "QUIC Transport Parameters" registry governs a 16-bit space. | |||
| This space is split into two spaces that are governed by different | This space is split into two spaces that are governed by different | |||
| 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 | |||
| [RFC8126]. Values with the first byte 0xff are reserved for Private | [RFC8126]. Values with the first byte 0xff are reserved for Private | |||
| skipping to change at page 93, line 40 ¶ | skipping to change at page 104, line 27 ¶ | |||
| Value: The numeric value of the assignment (registrations will be | Value: The numeric value of the assignment (registrations will be | |||
| between 0x0000 and 0xfeff). | between 0x0000 and 0xfeff). | |||
| Parameter Name: A short mnemonic for the parameter. | Parameter Name: A short mnemonic for the parameter. | |||
| 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. Expert(s) are encouraged to be biased towards | |||
| towards approving registrations unless they are abusive, frivolous, | approving registrations unless they are abusive, frivolous, or | |||
| or actively harmful (not merely aesthetically displeasing, or | actively harmful (not merely aesthetically displeasing, or | |||
| architecturally dubious). | architecturally dubious). | |||
| The initial contents of this registry are shown in Table 7. | 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 6.4.1 | | | 0x0000 | initial_max_stream_data | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0001 | initial_max_data | Section 6.4.1 | | | 0x0001 | initial_max_data | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0002 | initial_max_bidi_streams | Section 6.4.1 | | | 0x0002 | initial_max_bidi_streams | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0003 | idle_timeout | Section 6.4.1 | | | 0x0003 | idle_timeout | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0004 | preferred_address | Section 6.4.1 | | | 0x0004 | preferred_address | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0005 | max_packet_size | Section 6.4.1 | | | 0x0005 | max_packet_size | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0006 | stateless_reset_token | Section 6.4.1 | | | 0x0006 | stateless_reset_token | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0007 | ack_delay_exponent | Section 6.4.1 | | | 0x0007 | ack_delay_exponent | Section 6.6.1 | | |||
| | | | | | | | | | | |||
| | 0x0008 | initial_max_uni_streams | Section 6.4.1 | | | 0x0008 | initial_max_uni_streams | Section 6.6.1 | | |||
| +--------+--------------------------+---------------+ | +--------+--------------------------+---------------+ | |||
| Table 7: Initial QUIC Transport Parameters Entries | Table 7: Initial QUIC Transport Parameters Entries | |||
| 13.2. QUIC Transport Error Codes Registry | 13.2. QUIC Frame Type Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a | ||||
| "QUIC Protocol" heading. | ||||
| The "QUIC Frame Types" registry governs a 62-bit space. This space | ||||
| is split into three spaces that are governed by different policies. | ||||
| Values between 0x00 and 0x3f (in hexadecimal) are assigned via the | ||||
| Standards Action or IESG Review policies [RFC8126]. Values from 0x40 | ||||
| to 0x3fff operate on the Specification Required policy [RFC8126]. | ||||
| All other values are assigned to Private Use [RFC8126]. | ||||
| Registrations MUST include the following fields: | ||||
| Value: The numeric value of the assignment (registrations will be | ||||
| between 0x00 and 0x3fff). A range of values MAY be assigned. | ||||
| Frame Name: A short mnemonic for the frame type. | ||||
| Specification: A reference to a publicly available specification for | ||||
| the value. | ||||
| The nominated expert(s) verify that a specification exists and is | ||||
| readily accessible. Specifications for new registrations need to | ||||
| describe the means by which an endpoint might determine that it can | ||||
| send the identified type of frame. An accompanying transport | ||||
| parameter registration (see Section 13.1) is expected for most | ||||
| registrations. The specification needs to describe the format and | ||||
| assigned semantics of any fields in the frame. | ||||
| Expert(s) are encouraged to be biased towards approving registrations | ||||
| unless they are abusive, frivolous, or actively harmful (not merely | ||||
| aesthetically displeasing, or architecturally dubious). | ||||
| The initial contents of this registry are tabulated in Table 3. | ||||
| 13.3. 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 | |||
| [RFC8126]. Values with the first byte 0xff are reserved for Private | [RFC8126]. Values with the first byte 0xff are reserved for Private | |||
| Use [RFC8126]. | Use [RFC8126]. | |||
| skipping to change at page 95, line 5 ¶ | skipping to change at page 106, line 41 ¶ | |||
| 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 8. Note | The initial contents of this registry are shown in Table 8. Values | |||
| that FRAME_ERROR takes the range from 0x100 to 0x1FF and private use | from 0xFF00 to 0xFFFF are reserved for Private Use [RFC8126]. | |||
| occupies the range from 0xFE00 to 0xFFFF. | ||||
| +-----------+------------------------+---------------+--------------+ | +------+---------------------------+----------------+---------------+ | |||
| | Value | Error | Description | Specificatio | | | Valu | Error | Description | Specification | | |||
| | | | | n | | | e | | | | | |||
| +-----------+------------------------+---------------+--------------+ | +------+---------------------------+----------------+---------------+ | |||
| | 0x0 | NO_ERROR | No error | Section 11.3 | | | 0x0 | NO_ERROR | No error | Section 11.3 | | |||
| | | | | | | | | | | | | |||
| | 0x1 | INTERNAL_ERROR | Implementatio | Section 11.3 | | | 0x1 | INTERNAL_ERROR | Implementation | Section 11.3 | | |||
| | | | n error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | 0x2 | SERVER_BUSY | Server | Section 11.3 | | | 0x2 | SERVER_BUSY | Server | Section 11.3 | | |||
| | | | currently | | | | | | currently busy | | | |||
| | | | busy | | | | | | | | | |||
| | | | | | | | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 11.3 | | |||
| | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 11.3 | | | | | error | | | |||
| | | | error | | | | | | | | | |||
| | | | | | | | 0x4 | STREAM_ID_ERROR | Invalid stream | Section 11.3 | | |||
| | 0x4 | STREAM_ID_ERROR | Invalid | Section 11.3 | | | | | ID | | | |||
| | | | stream ID | | | | | | | | | |||
| | | | | | | | 0x5 | STREAM_STATE_ERROR | Frame received | Section 11.3 | | |||
| | 0x5 | STREAM_STATE_ERROR | Frame | Section 11.3 | | | | | in invalid | | | |||
| | | | received in | | | | | | stream state | | | |||
| | | | invalid | | | | | | | | | |||
| | | | stream state | | | | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 11.3 | | |||
| | | | | | | | | | final stream | | | |||
| | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 11.3 | | | | | offset | | | |||
| | | | final stream | | | | | | | | | |||
| | | | offset | | | | 0x7 | FRAME_ENCODING_ERROR | Frame encoding | Section 11.3 | | |||
| | | | | | | | | | error | | | |||
| | 0x7 | FRAME_FORMAT_ERROR | Generic frame | Section 11.3 | | | | | | | | |||
| | | | format error | | | | 0x8 | TRANSPORT_PARAMETER_ERROR | Error in | Section 11.3 | | |||
| | | | | | | | | | transport | | | |||
| | 0x8 | TRANSPORT_PARAMETER_ER | Error in | Section 11.3 | | | | | parameters | | | |||
| | | ROR | transport | | | | | | | | | |||
| | | | parameters | | | | 0x9 | VERSION_NEGOTIATION_ERROR | Version | Section 11.3 | | |||
| | | | | | | | | | negotiation | | | |||
| | 0x9 | VERSION_NEGOTIATION_ER | Version | Section 11.3 | | | | | failure | | | |||
| | | ROR | negotiation | | | | | | | | | |||
| | | | failure | | | | 0xA | PROTOCOL_VIOLATION | Generic | Section 11.3 | | |||
| | | | | | | | | | protocol | | | |||
| | 0xA | PROTOCOL_VIOLATION | Generic | Section 11.3 | | | | | violation | | | |||
| | | | protocol | | | | | | | | | |||
| | | | violation | | | | 0xB | UNSOLICITED_PATH_RESPONSE | Unsolicited | Section 11.3 | | |||
| | | | | | | | | | PATH_RESPONSE | | | |||
| | 0xB | UNSOLICITED_PATH_RESPO | Unsolicited | Section 11.3 | | | | | frame | | | |||
| | | NSE | PATH_RESPONSE | | | | | | | | | |||
| | | | frame | | | | 0xC | INVALID_MIGRATION | Violated | Section 11.3 | | |||
| | | | | | | | | | disabled | | | |||
| | 0x100-0x1 | FRAME_ERROR | Specific | Section 11.3 | | | | | migration | | | |||
| | FF | | frame format | | | +------+---------------------------+----------------+---------------+ | |||
| | | | error | | | ||||
| +-----------+------------------------+---------------+--------------+ | ||||
| Table 8: Initial QUIC Transport Error Codes Entries | Table 8: Initial QUIC Transport Error Codes Entries | |||
| 14. References | 14. References | |||
| 14.1. Normative References | 14.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-21 (work in progress), | |||
| skipping to change at page 96, line 38 ¶ | skipping to change at page 108, line 29 ¶ | |||
| 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-12 (work | and Congestion Control", draft-ietf-quic-recovery-13 (work | |||
| in progress), May 2018. | in progress), June 2018. | |||
| [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-12 (work in progress), May 2018. | tls-13 (work in progress), June 2018. | |||
| [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>. | |||
| [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | ||||
| of Explicit Congestion Notification (ECN) to IP", | ||||
| RFC 3168, DOI 10.17487/RFC3168, September 2001, | ||||
| <https://www.rfc-editor.org/info/rfc3168>. | ||||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
| 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | |||
| 2003, <https://www.rfc-editor.org/info/rfc3629>. | 2003, <https://www.rfc-editor.org/info/rfc3629>. | |||
| [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 | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8311] Black, D., "Relaxing Restrictions on Explicit Congestion | ||||
| Notification (ECN) Experimentation", RFC 8311, | ||||
| DOI 10.17487/RFC8311, January 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8311>. | ||||
| 14.2. Informative References | 14.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 | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
| Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
| draft-ietf-quic-invariants-01 (work in progress), May | draft-ietf-quic-invariants-01 (work in progress), June | |||
| 2018. | 2018. | |||
| [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | |||
| Selective Acknowledgment Options", RFC 2018, | Selective Acknowledgment Options", RFC 2018, | |||
| DOI 10.17487/RFC2018, October 1996, | DOI 10.17487/RFC2018, October 1996, | |||
| <https://www.rfc-editor.org/info/rfc2018>. | <https://www.rfc-editor.org/info/rfc2018>. | |||
| [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, | |||
| skipping to change at page 98, line 29 ¶ | skipping to change at page 110, line 29 ¶ | |||
| [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. | |||
| Appendix A. Contributors | Appendix A. Change Log | |||
| The original authors of this specification were Ryan Hamilton, Jana | *RFC Editor's Note:* Please remove this section prior to | |||
| Iyengar, Ian Swett, and Alyssa Wilk. | publication of a final version of this document. | |||
| The original design and rationale behind this protocol draw | Issue and pull request numbers are listed with a leading octothorp. | |||
| significantly from work by Jim Roskind [EARLY-DESIGN]. In | ||||
| alphabetical order, the contributors to the pre-IETF QUIC project at | ||||
| Google are: Britt Cyr, Jeremy Dorfman, Ryan Hamilton, Jana Iyengar, | ||||
| Fedor Kouranov, Charles Krasic, Jo Kulik, Adam Langley, Jim Roskind, | ||||
| Robbie Shade, Satyam Shekhar, Cherie Shi, Ian Swett, Raman Tenneti, | ||||
| Victor Vasiliev, Antonio Vicente, Patrik Westin, Alyssa Wilk, Dale | ||||
| Worley, Fan Yang, Dan Zhang, Daniel Ziegler. | ||||
| Appendix B. Acknowledgments | A.1. Since draft-ietf-quic-transport-12 | |||
| Special thanks are due to the following for helping shape pre-IETF | o Changes to integration of the TLS handshake (#829, #1018, #1094, | |||
| QUIC and its deployment: Chris Bentzel, Misha Efimov, Roberto Peon, | #1165, #1190, #1233, #1242, #1252, #1450) | |||
| Alistair Riddoch, Siddharth Vijayakrishnan, and Assar Westerlund. | ||||
| This document has benefited immensely from various private | * The cryptographic handshake uses CRYPTO frames, not stream 0 | |||
| discussions and public ones on the quic@ietf.org and proto- | ||||
| quic@chromium.org mailing lists. Our thanks to all. | ||||
| Appendix C. Change Log | * QUIC packet protection is used in place of TLS record | |||
| protection | ||||
| *RFC Editor's Note:* Please remove this section prior to | * Separate QUIC packet number spaces are used for the handshake | |||
| publication of a final version of this document. | ||||
| Issue and pull request numbers are listed with a leading octothorp. | * Changed Retry to be independent of the cryptographic handshake | |||
| C.1. Since draft-ietf-quic-transport-11 | * Added NEW_TOKEN frame and Token fields to Initial packet | |||
| * Limit the use of HelloRetryRequest to address TLS needs (like | ||||
| key shares) | ||||
| o Enable server to transition connections to a preferred address | ||||
| (#560, #1251, #1373) | ||||
| o Added ECN feedback mechanisms and handling; new ACK_ECN frame | ||||
| (#804, #805, #1372) | ||||
| o Changed rules and recommendations for use of new connection IDs | ||||
| (#1258, #1264, #1276, #1280, #1419, #1452, #1453, #1465) | ||||
| o Added a transport parameter to disable intentional connection | ||||
| migration (#1271, #1447) | ||||
| o Packets from different connection ID can't be coalesced (#1287, | ||||
| #1423) | ||||
| o Fixed sampling method for packet number encryption; the length | ||||
| field in long headers includes the packet number field in addition | ||||
| to the packet payload (#1387, #1389) | ||||
| o Stateless Reset is now symmetric and subject to size constraints | ||||
| (#466, #1346) | ||||
| o Added frame type extension mechanism (#58, #1473) | ||||
| A.2. Since draft-ietf-quic-transport-11 | ||||
| o Enable server to transition connections to a preferred address | o Enable server to transition connections to a preferred address | |||
| (#560, #1251) | (#560, #1251) | |||
| o Packet numbers are encrypted (#1174, #1043, #1048, #1034, #850, | o Packet numbers are encrypted (#1174, #1043, #1048, #1034, #850, | |||
| #990, #734, #1079) | #990, #734, #1317, #1267, #1079) | |||
| o Packet numbers use a variable-length encoding (#989, #1334) | o Packet numbers use a variable-length encoding (#989, #1334) | |||
| o STREAM frames can now be empty (#1350) | o STREAM frames can now be empty (#1350) | |||
| C.2. Since draft-ietf-quic-transport-10 | A.3. Since draft-ietf-quic-transport-10 | |||
| o Swap payload length and packed number fields in long header | o Swap payload length and packed number fields in long header | |||
| (#1294) | (#1294) | |||
| o Clarified that CONNECTION_CLOSE is allowed in Handshake packet | o Clarified that CONNECTION_CLOSE is allowed in Handshake packet | |||
| (#1274) | (#1274) | |||
| o Spin bit reserved (#1283) | o Spin bit reserved (#1283) | |||
| o Coalescing multiple QUIC packets in a UDP datagram (#1262, #1285) | o Coalescing multiple QUIC packets in a UDP datagram (#1262, #1285) | |||
| o A more complete connection migration (#1249) | o A more complete connection migration (#1249) | |||
| o Refine opportunistic ACK defense text (#305, #1030, #1185) | o Refine opportunistic ACK defense text (#305, #1030, #1185) | |||
| o A Stateless Reset Token isn't mandatory (#818, #1191) | o A Stateless Reset Token isn't mandatory (#818, #1191) | |||
| o Removed implicit stream opening (#896, #1193) | o Removed implicit stream opening (#896, #1193) | |||
| skipping to change at page 100, line 4 ¶ | skipping to change at page 112, line 21 ¶ | |||
| o Removed implicit stream opening (#896, #1193) | o Removed implicit stream opening (#896, #1193) | |||
| o An empty STREAM frame can be used to open a stream without sending | o An empty STREAM frame can be used to open a stream without sending | |||
| data (#901, #1194) | data (#901, #1194) | |||
| o Define stream counts in transport parameters rather than a maximum | o Define stream counts in transport parameters rather than a maximum | |||
| stream ID (#1023, #1065) | stream ID (#1023, #1065) | |||
| o STOP_SENDING is now prohibited before streams are used (#1050) | o STOP_SENDING is now prohibited before streams are used (#1050) | |||
| o Recommend including ACK in Retry packets and allow PADDING (#1067, | o Recommend including ACK in Retry packets and allow PADDING (#1067, | |||
| #882) | #882) | |||
| o Endpoints now become closing after an idle timeout (#1178, #1179) | o Endpoints now become closing after an idle timeout (#1178, #1179) | |||
| o Remove implication that Version Negotiation is sent when a packet | o Remove implication that Version Negotiation is sent when a packet | |||
| of the wrong version is received (#1197) | of the wrong version is received (#1197) | |||
| C.3. Since draft-ietf-quic-transport-09 | A.4. Since draft-ietf-quic-transport-09 | |||
| o Added PATH_CHALLENGE and PATH_RESPONSE frames to replace PING with | o Added PATH_CHALLENGE and PATH_RESPONSE frames to replace PING with | |||
| Data and PONG frame. Changed ACK frame type from 0x0e to 0x0d. | Data and PONG frame. Changed ACK frame type from 0x0e to 0x0d. | |||
| (#1091, #725, #1086) | (#1091, #725, #1086) | |||
| o A server can now only send 3 packets without validating the client | o A server can now only send 3 packets without validating the client | |||
| address (#38, #1090) | address (#38, #1090) | |||
| o Delivery order of stream data is no longer strongly specified | o Delivery order of stream data is no longer strongly specified | |||
| (#252, #1070) | (#252, #1070) | |||
| skipping to change at page 100, line 33 ¶ | skipping to change at page 113, line 4 ¶ | |||
| o Rework of packet handling and version negotiation (#1038) | o Rework of packet handling and version negotiation (#1038) | |||
| o Stream 0 is now exempt from flow control until the handshake | o Stream 0 is now exempt from flow control until the handshake | |||
| completes (#1074, #725, #825, #1082) | completes (#1074, #725, #825, #1082) | |||
| o Improved retransmission rules for all frame types: information is | o Improved retransmission rules for all frame types: information is | |||
| retransmitted, not packets or frames (#463, #765, #1095, #1053) | retransmitted, not packets or frames (#463, #765, #1095, #1053) | |||
| o Added an error code for server busy signals (#1137) | o Added an error code for server busy signals (#1137) | |||
| o Endpoints now set the connection ID that their peer uses. | o Endpoints now set the connection ID that their peer uses. | |||
| Connection IDs are variable length. Removed the | Connection IDs are variable length. Removed the | |||
| omit_connection_id transport parameter and the corresponding short | omit_connection_id transport parameter and the corresponding short | |||
| header flag. (#1089, #1052, #1146, #821, #745, #821, #1166, #1151) | header flag. (#1089, #1052, #1146, #821, #745, #821, #1166, #1151) | |||
| C.4. Since draft-ietf-quic-transport-08 | A.5. Since draft-ietf-quic-transport-08 | |||
| o Clarified requirements for BLOCKED usage (#65, #924) | o Clarified requirements for BLOCKED usage (#65, #924) | |||
| o BLOCKED frame now includes reason for blocking (#452, #924, #927, | o BLOCKED frame now includes reason for blocking (#452, #924, #927, | |||
| #928) | #928) | |||
| o GAP limitation in ACK Frame (#613) | o GAP limitation in ACK Frame (#613) | |||
| o Improved PMTUD description (#614, #1036) | o Improved PMTUD description (#614, #1036) | |||
| skipping to change at page 101, line 4 ¶ | skipping to change at page 113, line 21 ¶ | |||
| o Clarified requirements for BLOCKED usage (#65, #924) | o Clarified requirements for BLOCKED usage (#65, #924) | |||
| o BLOCKED frame now includes reason for blocking (#452, #924, #927, | o BLOCKED frame now includes reason for blocking (#452, #924, #927, | |||
| #928) | #928) | |||
| o GAP limitation in ACK Frame (#613) | o GAP limitation in ACK Frame (#613) | |||
| o Improved PMTUD description (#614, #1036) | o Improved PMTUD description (#614, #1036) | |||
| o Clarified stream state machine (#634, #662, #743, #894) | o Clarified stream state machine (#634, #662, #743, #894) | |||
| o Reserved versions don't need to be generated deterministically | o Reserved versions don't need to be generated deterministically | |||
| (#831, #931) | (#831, #931) | |||
| o You don't always need the draining period (#871) | o You don't always need the draining period (#871) | |||
| o Stateless reset clarified as version-specific (#930, #986) | o Stateless reset clarified as version-specific (#930, #986) | |||
| o initial_max_stream_id_x transport parameters are optional (#970, | o initial_max_stream_id_x transport parameters are optional (#970, | |||
| #971) | #971) | |||
| o Ack Delay assumes a default value during the handshake (#1007, | o Ack Delay assumes a default value during the handshake (#1007, | |||
| #1009) | #1009) | |||
| o Removed transport parameters from NewSessionTicket (#1015) | o Removed transport parameters from NewSessionTicket (#1015) | |||
| C.5. Since draft-ietf-quic-transport-07 | A.6. Since draft-ietf-quic-transport-07 | |||
| o The long header now has version before packet number (#926, #939) | o The long header now has version before packet number (#926, #939) | |||
| o Rename and consolidate packet types (#846, #822, #847) | o Rename and consolidate packet types (#846, #822, #847) | |||
| o Packet types are assigned new codepoints and the Connection ID | o Packet types are assigned new codepoints and the Connection ID | |||
| Flag is inverted (#426, #956) | Flag is inverted (#426, #956) | |||
| o Removed type for Version Negotiation and use Version 0 (#963, | o Removed type for Version Negotiation and use Version 0 (#963, | |||
| #968) | #968) | |||
| skipping to change at page 102, line 15 ¶ | skipping to change at page 114, line 33 ¶ | |||
| o Address validation for connection migration (#161, #732, #878) | o Address validation for connection migration (#161, #732, #878) | |||
| o Clearly defined retransmission rules for BLOCKED (#452, #65, #924) | o Clearly defined retransmission rules for BLOCKED (#452, #65, #924) | |||
| o negotiated_version is sent in server transport parameters (#710, | o negotiated_version is sent in server transport parameters (#710, | |||
| #959) | #959) | |||
| o Increased the range over which packet numbers are randomized | o Increased the range over which packet numbers are randomized | |||
| (#864, #850, #964) | (#864, #850, #964) | |||
| C.6. Since draft-ietf-quic-transport-06 | A.7. Since draft-ietf-quic-transport-06 | |||
| o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | |||
| o Split error code space between application and transport (#485) | o Split error code space between application and transport (#485) | |||
| o Stateless reset token moved to end (#820) | o Stateless reset token moved to end (#820) | |||
| o 1-RTT-protected long header types removed (#848) | o 1-RTT-protected long header types removed (#848) | |||
| o No acknowledgments during draining period (#852) | o No acknowledgments during draining period (#852) | |||
| o Remove "application close" as a separate close type (#854) | o Remove "application close" as a separate close type (#854) | |||
| o Remove timestamps from the ACK frame (#841) | o Remove timestamps from the ACK frame (#841) | |||
| o Require transport parameters to only appear once (#792) | o Require transport parameters to only appear once (#792) | |||
| C.7. Since draft-ietf-quic-transport-05 | A.8. 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.8. Since draft-ietf-quic-transport-04 | A.9. 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 103, line 34 ¶ | skipping to change at page 116, line 5 ¶ | |||
| 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.9. Since draft-ietf-quic-transport-03 | A.10. 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.10. Since draft-ietf-quic-transport-02 | A.11. 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 104, line 31 ¶ | skipping to change at page 117, line 4 ¶ | |||
| * 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.11. Since draft-ietf-quic-transport-01 | A.12. 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) | |||
| skipping to change at page 106, line 36 ¶ | skipping to change at page 119, line 8 ¶ | |||
| 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.12. Since draft-ietf-quic-transport-00 | A.13. 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.13. Since draft-hamilton-quic-transport-protocol-01 | A.14. 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 | |||
| Acknowledgments | ||||
| Special thanks are due to the following for helping shape pre-IETF | ||||
| QUIC and its deployment: Chris Bentzel, Misha Efimov, Roberto Peon, | ||||
| Alistair Riddoch, Siddharth Vijayakrishnan, and Assar Westerlund. | ||||
| This document has benefited immensely from various private | ||||
| discussions and public ones on the quic@ietf.org and proto- | ||||
| quic@chromium.org mailing lists. Our thanks to all. | ||||
| Contributors | ||||
| The original authors of this specification were Ryan Hamilton, Jana | ||||
| Iyengar, Ian Swett, and Alyssa Wilk. | ||||
| The original design and rationale behind this protocol draw | ||||
| significantly from work by Jim Roskind [EARLY-DESIGN]. In | ||||
| alphabetical order, the contributors to the pre-IETF QUIC project at | ||||
| Google are: Britt Cyr, Jeremy Dorfman, Ryan Hamilton, Jana Iyengar, | ||||
| Fedor Kouranov, Charles Krasic, Jo Kulik, Adam Langley, Jim Roskind, | ||||
| Robbie Shade, Satyam Shekhar, Cherie Shi, Ian Swett, Raman Tenneti, | ||||
| Victor Vasiliev, Antonio Vicente, Patrik Westin, Alyssa Wilk, Dale | ||||
| Worley, Fan Yang, Dan Zhang, Daniel Ziegler. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Jana Iyengar (editor) | Jana Iyengar (editor) | |||
| Fastly | Fastly | |||
| Email: jri.ietf@gmail.com | Email: jri.ietf@gmail.com | |||
| Martin Thomson (editor) | Martin Thomson (editor) | |||
| Mozilla | Mozilla | |||
| End of changes. 295 change blocks. | ||||
| 825 lines changed or deleted | 1419 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/ | ||||