| draft-ietf-quic-transport-10.txt | draft-ietf-quic-transport-11.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: September 6, 2018 Mozilla | Expires: October 19, 2018 Mozilla | |||
| March 05, 2018 | April 17, 2018 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-10 | draft-ietf-quic-transport-11 | |||
| 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 September 6, 2018. | This Internet-Draft will expire on October 19, 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 . . . . . . . . . . . . . . . . . 5 | 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 6 | 2.1. Notational Conventions . . . . . . . . . . . . . . . . . 6 | |||
| 3. A QUIC Overview . . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Low-Latency Connection Establishment . . . . . . . . . . 7 | 4. Packet Types and Formats . . . . . . . . . . . . . . . . . . 8 | |||
| 3.2. Stream Multiplexing . . . . . . . . . . . . . . . . . . . 7 | 4.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 3.3. Rich Signaling for Congestion Control and Loss Recovery . 7 | 4.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.4. Stream and Connection Flow Control . . . . . . . . . . . 7 | 4.3. Version Negotiation Packet . . . . . . . . . . . . . . . 12 | |||
| 3.5. Authenticated and Encrypted Header and Payload . . . . . 8 | 4.4. Cryptographic Handshake Packets . . . . . . . . . . . . . 14 | |||
| 3.6. Connection Migration and Resilience to NAT Rebinding . . 8 | 4.4.1. Initial Packet . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.7. Version Negotiation . . . . . . . . . . . . . . . . . . . 9 | 4.4.2. Retry Packet . . . . . . . . . . . . . . . . . . . . 15 | |||
| 4. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 4.4.3. Handshake Packet . . . . . . . . . . . . . . . . . . 16 | |||
| 5. Packet Types and Formats . . . . . . . . . . . . . . . . . . 10 | 4.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.1. Long Header . . . . . . . . . . . . . . . . . . . . . . . 10 | 4.6. Coaslescing Packets . . . . . . . . . . . . . . . . . . . 17 | |||
| 5.2. Short Header . . . . . . . . . . . . . . . . . . . . . . 12 | 4.7. Connection ID . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 5.3. Version Negotiation Packet . . . . . . . . . . . . . . . 13 | 4.8. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 5.4. Cryptographic Handshake Packets . . . . . . . . . . . . . 14 | 4.8.1. Initial Packet Number . . . . . . . . . . . . . . . . 20 | |||
| 5.4.1. Initial Packet . . . . . . . . . . . . . . . . . . . 15 | 5. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 20 | |||
| 5.4.2. Retry Packet . . . . . . . . . . . . . . . . . . . . 15 | 6. Life of a Connection . . . . . . . . . . . . . . . . . . . . 22 | |||
| 5.4.3. Handshake Packet . . . . . . . . . . . . . . . . . . 16 | 6.1. Matching Packets to Connections . . . . . . . . . . . . . 23 | |||
| 5.5. Protected Packets . . . . . . . . . . . . . . . . . . . . 17 | 6.1.1. Client Packet Handling . . . . . . . . . . . . . . . 23 | |||
| 5.6. Connection ID . . . . . . . . . . . . . . . . . . . . . . 17 | 6.1.2. Server Packet Handling . . . . . . . . . . . . . . . 23 | |||
| 5.7. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 18 | 6.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.7.1. Initial Packet Number . . . . . . . . . . . . . . . . 19 | 6.2.1. Sending Version Negotiation Packets . . . . . . . . . 25 | |||
| 6. Frames and Frame Types . . . . . . . . . . . . . . . . . . . 19 | 6.2.2. Handling Version Negotiation Packets . . . . . . . . 25 | |||
| 7. Life of a Connection . . . . . . . . . . . . . . . . . . . . 21 | 6.2.3. Using Reserved Versions . . . . . . . . . . . . . . . 26 | |||
| 7.1. Matching Packets to Connections . . . . . . . . . . . . . 22 | 6.3. Cryptographic and Transport Handshake . . . . . . . . . . 26 | |||
| 7.1.1. Client Packet Handling . . . . . . . . . . . . . . . 22 | 6.4. Transport Parameters . . . . . . . . . . . . . . . . . . 27 | |||
| 7.1.2. Server Packet Handling . . . . . . . . . . . . . . . 22 | 6.4.1. Transport Parameter Definitions . . . . . . . . . . . 29 | |||
| 7.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 23 | 6.4.2. Values of Transport Parameters for 0-RTT . . . . . . 30 | |||
| 7.2.1. Sending Version Negotiation Packets . . . . . . . . . 23 | 6.4.3. New Transport Parameters . . . . . . . . . . . . . . 31 | |||
| 7.2.2. Handling Version Negotiation Packets . . . . . . . . 24 | 6.4.4. Version Negotiation Validation . . . . . . . . . . . 31 | |||
| 7.2.3. Using Reserved Versions . . . . . . . . . . . . . . . 24 | 6.5. Stateless Retries . . . . . . . . . . . . . . . . . . . . 33 | |||
| 7.3. Cryptographic and Transport Handshake . . . . . . . . . . 25 | 6.6. Proof of Source Address Ownership . . . . . . . . . . . . 33 | |||
| 7.4. Transport Parameters . . . . . . . . . . . . . . . . . . 26 | 6.6.1. Client Address Validation Procedure . . . . . . . . . 34 | |||
| 7.4.1. Transport Parameter Definitions . . . . . . . . . . . 28 | 6.6.2. Address Validation on Session Resumption . . . . . . 35 | |||
| 7.4.2. Values of Transport Parameters for 0-RTT . . . . . . 30 | 6.6.3. Address Validation Token Integrity . . . . . . . . . 35 | |||
| 7.4.3. New Transport Parameters . . . . . . . . . . . . . . 30 | 6.7. Path Validation . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 7.4.4. Version Negotiation Validation . . . . . . . . . . . 31 | 6.7.1. Initiation . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 7.5. Stateless Retries . . . . . . . . . . . . . . . . . . . . 32 | 6.7.2. Response . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 7.6. Proof of Source Address Ownership . . . . . . . . . . . . 33 | 6.7.3. Completion . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 7.6.1. Client Address Validation Procedure . . . . . . . . . 33 | 6.7.4. Abandonment . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 7.6.2. Address Validation on Session Resumption . . . . . . 34 | 6.8. Connection Migration . . . . . . . . . . . . . . . . . . 38 | |||
| 7.6.3. Address Validation Token Integrity . . . . . . . . . 35 | 6.8.1. Probing a New Path . . . . . . . . . . . . . . . . . 38 | |||
| 7.7. Connection Migration . . . . . . . . . . . . . . . . . . 35 | 6.8.2. Initiating Connection Migration . . . . . . . . . . . 39 | |||
| 7.7.1. Privacy Implications of Connection Migration . . . . 36 | 6.8.3. Responding to Connection Migration . . . . . . . . . 39 | |||
| 7.7.2. Address Validation for Migrated Connections . . . . . 37 | 6.8.4. Loss Detection and Congestion Control . . . . . . . . 41 | |||
| 7.8. Spurious Connection Migrations . . . . . . . . . . . . . 39 | 6.8.5. Privacy Implications of Connection Migration . . . . 42 | |||
| 7.9. Connection Termination . . . . . . . . . . . . . . . . . 40 | 6.9. Connection Termination . . . . . . . . . . . . . . . . . 43 | |||
| 7.9.1. Closing and Draining Connection States . . . . . . . 40 | 6.9.1. Closing and Draining Connection States . . . . . . . 44 | |||
| 7.9.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 41 | 6.9.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . 45 | |||
| 7.9.3. Immediate Close . . . . . . . . . . . . . . . . . . . 41 | 6.9.3. Immediate Close . . . . . . . . . . . . . . . . . . . 45 | |||
| 7.9.4. Stateless Reset . . . . . . . . . . . . . . . . . . . 42 | 6.9.4. Stateless Reset . . . . . . . . . . . . . . . . . . . 46 | |||
| 8. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 45 | 7. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 49 | |||
| 8.1. Variable-Length Integer Encoding . . . . . . . . . . . . 45 | 7.1. Variable-Length Integer Encoding . . . . . . . . . . . . 49 | |||
| 8.2. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 46 | 7.2. PADDING Frame . . . . . . . . . . . . . . . . . . . . . . 50 | |||
| 8.3. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 46 | 7.3. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 50 | |||
| 8.4. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 47 | 7.4. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 51 | |||
| 8.5. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 48 | 7.5. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . . 52 | |||
| 8.6. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 48 | 7.6. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 8.7. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 49 | 7.7. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . . 53 | |||
| 8.8. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 50 | 7.8. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . . 54 | |||
| 8.9. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 50 | 7.9. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 8.10. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 51 | 7.10. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . . 55 | |||
| 8.11. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 51 | 7.11. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 55 | |||
| 8.12. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 52 | 7.12. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . . 56 | |||
| 8.13. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 52 | 7.13. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . . 56 | |||
| 8.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 53 | 7.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 58 | |||
| 8.15. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 54 | 7.15. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 8.15.1. ACK Block Section . . . . . . . . . . . . . . . . . 55 | 7.15.1. ACK Block Section . . . . . . . . . . . . . . . . . 60 | |||
| 8.15.2. Sending ACK Frames . . . . . . . . . . . . . . . . . 57 | 7.15.2. Sending ACK Frames . . . . . . . . . . . . . . . . . 61 | |||
| 8.15.3. ACK Frames and Packet Protection . . . . . . . . . . 58 | 7.15.3. ACK Frames and Packet Protection . . . . . . . . . . 62 | |||
| 8.16. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 59 | 7.16. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 63 | |||
| 8.17. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . . 59 | 7.17. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . . 63 | |||
| 8.18. STREAM Frames . . . . . . . . . . . . . . . . . . . . . . 60 | 7.18. STREAM Frames . . . . . . . . . . . . . . . . . . . . . . 64 | |||
| 9. Packetization and Reliability . . . . . . . . . . . . . . . . 61 | 8. Packetization and Reliability . . . . . . . . . . . . . . . . 65 | |||
| 9.1. Packet Processing and Acknowledgment . . . . . . . . . . 62 | 8.1. Packet Processing and Acknowledgment . . . . . . . . . . 66 | |||
| 9.2. Retransmission of Information . . . . . . . . . . . . . . 62 | 8.2. Retransmission of Information . . . . . . . . . . . . . . 66 | |||
| 9.3. Packet Size . . . . . . . . . . . . . . . . . . . . . . . 64 | 8.3. Packet Size . . . . . . . . . . . . . . . . . . . . . . . 68 | |||
| 9.4. Path Maximum Transmission Unit . . . . . . . . . . . . . 64 | 8.4. Path Maximum Transmission Unit . . . . . . . . . . . . . 68 | |||
| 9.4.1. Special Considerations for PMTU Discovery . . . . . . 65 | 8.4.1. Special Considerations for PMTU Discovery . . . . . . 69 | |||
| 9.4.2. Special Considerations for Packetization Layer PMTU | 8.4.2. Special Considerations for Packetization Layer PMTU | |||
| Discovery . . . . . . . . . . . . . . . . . . . . . . 66 | Discovery . . . . . . . . . . . . . . . . . . . . . . 70 | |||
| 10. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 66 | 9. Streams: QUIC's Data Structuring Abstraction . . . . . . . . 70 | |||
| 10.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 67 | 9.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 71 | |||
| 10.2. Stream States . . . . . . . . . . . . . . . . . . . . . 68 | 9.2. Stream States . . . . . . . . . . . . . . . . . . . . . . 72 | |||
| 10.2.1. Send Stream States . . . . . . . . . . . . . . . . . 69 | 9.2.1. Send Stream States . . . . . . . . . . . . . . . . . 73 | |||
| 10.2.2. Receive Stream States . . . . . . . . . . . . . . . 71 | 9.2.2. Receive Stream States . . . . . . . . . . . . . . . . 75 | |||
| 10.2.3. Permitted Frame Types . . . . . . . . . . . . . . . 74 | 9.2.3. Permitted Frame Types . . . . . . . . . . . . . . . . 77 | |||
| 10.2.4. Bidirectional Stream States . . . . . . . . . . . . 74 | 9.2.4. Bidirectional Stream States . . . . . . . . . . . . . 77 | |||
| 10.3. Solicited State Transitions . . . . . . . . . . . . . . 75 | 9.3. Solicited State Transitions . . . . . . . . . . . . . . . 78 | |||
| 10.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 76 | 9.4. Stream Concurrency . . . . . . . . . . . . . . . . . . . 79 | |||
| 10.5. Sending and Receiving Data . . . . . . . . . . . . . . . 77 | 9.5. Sending and Receiving Data . . . . . . . . . . . . . . . 80 | |||
| 10.6. Stream Prioritization . . . . . . . . . . . . . . . . . 77 | 9.6. Stream Prioritization . . . . . . . . . . . . . . . . . . 80 | |||
| 11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 78 | 10. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 11.1. Edge Cases and Other Considerations . . . . . . . . . . 79 | 10.1. Edge Cases and Other Considerations . . . . . . . . . . 83 | |||
| 11.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 80 | 10.1.1. Response to a RST_STREAM . . . . . . . . . . . . . . 83 | |||
| 11.1.2. Data Limit Increments . . . . . . . . . . . . . . . 80 | 10.1.2. Data Limit Increments . . . . . . . . . . . . . . . 83 | |||
| 11.1.3. Handshake Exemption . . . . . . . . . . . . . . . . 81 | 10.1.3. Handshake Exemption . . . . . . . . . . . . . . . . 84 | |||
| 11.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 81 | 10.2. Stream Limit Increment . . . . . . . . . . . . . . . . . 84 | |||
| 11.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 81 | 10.2.1. Blocking on Flow Control . . . . . . . . . . . . . . 84 | |||
| 11.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 82 | 10.3. Stream Final Offset . . . . . . . . . . . . . . . . . . 85 | |||
| 12. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 82 | 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 85 | |||
| 12.1. Connection Errors . . . . . . . . . . . . . . . . . . . 83 | 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 86 | |||
| 12.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 83 | 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 87 | |||
| 12.3. Transport Error Codes . . . . . . . . . . . . . . . . . 84 | 11.3. Transport Error Codes . . . . . . . . . . . . . . . . . 87 | |||
| 12.4. Application Protocol Error Codes . . . . . . . . . . . . 85 | 11.4. Application Protocol Error Codes . . . . . . . . . . . . 88 | |||
| 13. Security and Privacy Considerations . . . . . . . . . . . . . 85 | 12. Security and Privacy Considerations . . . . . . . . . . . . . 89 | |||
| 13.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 86 | 12.1. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 89 | |||
| 13.2. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 86 | 12.2. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 89 | |||
| 13.3. Stream Fragmentation and Reassembly Attacks . . . . . . 87 | 12.3. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 90 | |||
| 13.4. Stream Commitment Attack . . . . . . . . . . . . . . . . 87 | 12.4. Stream Fragmentation and Reassembly Attacks . . . . . . 90 | |||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 87 | 12.5. Stream Commitment Attack . . . . . . . . . . . . . . . . 90 | |||
| 14.1. QUIC Transport Parameter Registry . . . . . . . . . . . 87 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 91 | |||
| 14.2. QUIC Transport Error Codes Registry . . . . . . . . . . 89 | 13.1. QUIC Transport Parameter Registry . . . . . . . . . . . 91 | |||
| 15. References . . . . . . . . . . . . . . . . . . . . . . . . . 90 | 13.2. QUIC Transport Error Codes Registry . . . . . . . . . . 92 | |||
| 15.1. Normative References . . . . . . . . . . . . . . . . . . 90 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 94 | |||
| 15.2. Informative References . . . . . . . . . . . . . . . . . 92 | 14.1. Normative References . . . . . . . . . . . . . . . . . . 94 | |||
| 15.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 93 | 14.2. Informative References . . . . . . . . . . . . . . . . . 95 | |||
| Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 93 | 14.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 96 | |||
| Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 93 | Appendix A. Contributors . . . . . . . . . . . . . . . . . . . . 96 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 93 | Appendix B. Acknowledgments . . . . . . . . . . . . . . . . . . 97 | |||
| C.1. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 94 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 97 | |||
| C.2. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 94 | C.1. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 97 | |||
| C.3. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 95 | C.2. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 98 | |||
| C.4. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 96 | C.3. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 98 | |||
| C.5. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 96 | C.4. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 99 | |||
| C.6. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 96 | C.5. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 100 | |||
| C.7. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 97 | C.6. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 100 | |||
| C.8. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 97 | C.7. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 100 | |||
| C.9. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 98 | C.8. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 101 | |||
| C.10. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 100 | C.9. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 101 | |||
| C.11. Since draft-hamilton-quic-transport-protocol-01 . . . . . 100 | C.10. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 102 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 100 | C.11. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 104 | |||
| C.12. Since draft-hamilton-quic-transport-protocol-01 . . . . . 104 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 105 | ||||
| 1. Introduction | 1. Introduction | |||
| QUIC is a multiplexed and secure transport protocol that runs on top | QUIC is a multiplexed and secure transport protocol that runs on top | |||
| of UDP. QUIC aims to provide a flexible set of features that allow | of UDP. QUIC aims to provide a flexible set of features that allow | |||
| it to be a general-purpose transport for multiple applications. | it to be a general-purpose secure transport for multiple | |||
| applications. | ||||
| o Version negotiation | ||||
| o Low-latency connection establishment | ||||
| o Authenticated and encrypted header and payload | ||||
| o Stream multiplexing | ||||
| o Stream and connection-level flow control | ||||
| o Connection migration and resilience to NAT rebinding | ||||
| QUIC implements techniques learned from experience with TCP, SCTP and | QUIC implements techniques learned from experience with TCP, SCTP and | |||
| other transport protocols. QUIC uses UDP as substrate so as to not | other transport protocols. QUIC uses UDP as substrate so as to not | |||
| require changes to legacy client operating systems and middleboxes to | require changes to legacy client operating systems and middleboxes to | |||
| be deployable. QUIC authenticates all of its headers and encrypts | be deployable. QUIC authenticates all of its headers and encrypts | |||
| most of the data it exchanges, including its signaling. This allows | most of the data it exchanges, including its signaling. This allows | |||
| the protocol to evolve without incurring a dependency on upgrades to | the protocol to evolve without incurring a dependency on upgrades to | |||
| middleboxes. This document describes the core QUIC protocol, | middleboxes. This document describes the core QUIC protocol, | |||
| including the conceptual design, wire format, and mechanisms of the | including the conceptual design, wire format, and mechanisms of the | |||
| QUIC protocol for connection establishment, stream multiplexing, | QUIC protocol for connection establishment, stream multiplexing, | |||
| stream and connection-level flow control, and data reliability. | stream and connection-level flow control, connection migration, and | |||
| data reliability. | ||||
| Accompanying documents describe QUIC's loss detection and congestion | Accompanying documents describe QUIC's loss detection and congestion | |||
| control [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | control [QUIC-RECOVERY], and the use of TLS 1.3 for key negotiation | |||
| [QUIC-TLS]. | [QUIC-TLS]. | |||
| QUIC version 1 conforms to the protocol invariants in | QUIC version 1 conforms to the protocol invariants in | |||
| [QUIC-INVARIANTS]. | [QUIC-INVARIANTS]. | |||
| 2. Conventions and Definitions | 2. Conventions and Definitions | |||
| skipping to change at page 6, line 11 ¶ | skipping to change at page 6, line 27 ¶ | |||
| Server: The endpoint accepting incoming QUIC connections. | Server: The endpoint accepting incoming QUIC connections. | |||
| Endpoint: The client or server end of a connection. | Endpoint: The client or server end of a connection. | |||
| Stream: A logical, bi-directional channel of ordered bytes within a | Stream: A logical, bi-directional channel of ordered bytes within a | |||
| QUIC connection. | QUIC connection. | |||
| Connection: A conversation between two QUIC endpoints with a single | Connection: A conversation between two QUIC endpoints with a single | |||
| encryption context that multiplexes streams within it. | encryption context that multiplexes streams within it. | |||
| Connection ID: The 64-bit unsigned number used as an identifier for | Connection ID: An opaque identifier that is used to identify a QUIC | |||
| a QUIC connection. | connection at an endpoint. Each endpoint sets a value that its | |||
| peer includes in packets. | ||||
| QUIC packet: A well-formed UDP payload that can be parsed by a QUIC | QUIC packet: A well-formed UDP payload that can be parsed by a QUIC | |||
| receiver. | receiver. | |||
| QUIC is a name, not an acronym. | ||||
| 2.1. Notational Conventions | 2.1. Notational Conventions | |||
| Packet and frame diagrams use the format described in Section 3.1 of | Packet and frame diagrams use the format described in Section 3.1 of | |||
| [RFC2360], with the following additional conventions: | [RFC2360], with the following additional conventions: | |||
| [x] Indicates that x is optional | [x] Indicates that x is optional | |||
| x (A) Indicates that x is A bits long | x (A) Indicates that x is A bits long | |||
| x (A/B/C) ... Indicates that x is one of A, B, or C bits long | x (A/B/C) ... Indicates that x is one of A, B, or C bits long | |||
| x (i) ... Indicates that x uses the variable-length encoding in | x (i) ... Indicates that x uses the variable-length encoding in | |||
| Section 8.1 | Section 7.1 | |||
| x (*) ... Indicates that x is variable-length | x (*) ... Indicates that x is variable-length | |||
| 3. A QUIC Overview | 3. Versions | |||
| This section briefly describes QUIC's key mechanisms and benefits. | ||||
| Key strengths of QUIC include: | ||||
| o Low-latency connection establishment | ||||
| o Multiplexing without head-of-line blocking | ||||
| o Authenticated and encrypted header and payload | ||||
| o Rich signaling for congestion control and loss recovery | ||||
| o Stream and connection flow control | ||||
| o Connection migration and resilience to NAT rebinding | ||||
| o Version negotiation | ||||
| 3.1. Low-Latency Connection Establishment | ||||
| QUIC relies on a combined cryptographic and transport handshake for | ||||
| setting up a secure transport connection. QUIC connections are | ||||
| expected to commonly use 0-RTT handshakes, meaning that for most QUIC | ||||
| connections, data can be sent immediately following the client | ||||
| handshake packet, without waiting for a reply from the server. QUIC | ||||
| provides a dedicated stream (Stream ID 0) to be used for performing | ||||
| the cryptographic handshake and QUIC options negotiation. The format | ||||
| of the QUIC options and parameters used during negotiation are | ||||
| described in this document, but the handshake protocol that runs on | ||||
| Stream ID 0 is described in the accompanying cryptographic handshake | ||||
| draft [QUIC-TLS]. | ||||
| 3.2. Stream Multiplexing | ||||
| When application messages are transported over TCP, independent | ||||
| application messages can suffer from head-of-line blocking. When an | ||||
| application multiplexes many streams atop TCP's single-bytestream | ||||
| abstraction, a loss of a TCP segment results in blocking of all | ||||
| subsequent segments until a retransmission arrives, irrespective of | ||||
| the application streams that are encapsulated in subsequent segments. | ||||
| QUIC ensures that lost packets carrying data for an individual stream | ||||
| only impact that specific stream. Data received on other streams can | ||||
| continue to be reassembled and delivered to the application. | ||||
| 3.3. Rich Signaling for Congestion Control and Loss Recovery | ||||
| QUIC's packet framing and acknowledgments carry rich information that | ||||
| help both congestion control and loss recovery in fundamental ways. | ||||
| Each QUIC packet carries a new packet number, including those | ||||
| carrying retransmitted data. This obviates the need for a separate | ||||
| mechanism to distinguish acknowledgments for retransmissions from | ||||
| those for original transmissions, avoiding TCP's retransmission | ||||
| ambiguity problem. QUIC acknowledgments also explicitly encode the | ||||
| delay between the receipt of a packet and its acknowledgment being | ||||
| sent, and together with the monotonically-increasing packet numbers, | ||||
| this allows for precise network roundtrip-time (RTT) calculation. | ||||
| QUIC's ACK frames support multiple ACK blocks, so QUIC is more | ||||
| resilient to reordering than TCP with SACK support, as well as able | ||||
| to keep more bytes on the wire when there is reordering or loss. | ||||
| 3.4. Stream and Connection Flow Control | ||||
| QUIC implements stream- and connection-level flow control. At a high | ||||
| level, a QUIC receiver advertises the maximum amount of data that it | ||||
| is willing to receive on each stream. As data is sent, received, and | ||||
| delivered on a particular stream, the receiver sends MAX_STREAM_DATA | ||||
| frames that increase the advertised limit for that stream, allowing | ||||
| the peer to send more data on that stream. | ||||
| In addition to this stream-level flow control, QUIC implements | ||||
| connection-level flow control to limit the aggregate buffer that a | ||||
| QUIC receiver is willing to allocate to all streams on a connection. | ||||
| Connection-level flow control works in the same way as stream-level | ||||
| flow control, but the bytes delivered and the limits are aggregated | ||||
| across all streams. | ||||
| 3.5. Authenticated and Encrypted Header and Payload | ||||
| TCP headers appear in plaintext on the wire and are not | ||||
| authenticated, causing a plethora of injection and header | ||||
| manipulation issues for TCP, such as receive-window manipulation and | ||||
| sequence-number overwriting. While some of these are mechanisms used | ||||
| by middleboxes to improve TCP performance, others are active attacks. | ||||
| Even "performance-enhancing" middleboxes that routinely interpose on | ||||
| the transport state machine end up limiting the evolvability of the | ||||
| transport protocol, as has been observed in the design of MPTCP | ||||
| [RFC6824] and in its subsequent deployability issues. | ||||
| Generally, QUIC packets are always authenticated and the payload is | ||||
| typically fully encrypted. The parts of the packet header which are | ||||
| not encrypted are still authenticated by the receiver, so as to | ||||
| thwart any packet injection or manipulation by third parties. Some | ||||
| early handshake packets, such as the Version Negotiation packet, are | ||||
| not encrypted, but information sent in these unencrypted handshake | ||||
| packets is later verified as part of cryptographic processing. | ||||
| 3.6. Connection Migration and Resilience to NAT Rebinding | ||||
| QUIC connections are identified by a Connection ID, a 64-bit unsigned | ||||
| number randomly generated by the server. QUIC's consistent | ||||
| connection ID allows connections to survive changes to the client's | ||||
| IP and port, such as those caused by NAT rebindings or by the client | ||||
| changing network connectivity to a new address. QUIC provides | ||||
| automatic cryptographic verification of a rebound client, since the | ||||
| client continues to use the same session key for encrypting and | ||||
| decrypting packets. The consistent connection ID can be used to | ||||
| allow migration of the connection to a new server IP address as well, | ||||
| since the Connection ID remains consistent across changes in the | ||||
| client's and the server's network addresses. | ||||
| 3.7. Version Negotiation | ||||
| QUIC version negotiation allows for multiple versions of the protocol | ||||
| to be deployed and used concurrently. Version negotiation is | ||||
| described in Section 7.2. | ||||
| 4. Versions | ||||
| QUIC versions are identified using a 32-bit unsigned number. | QUIC versions are identified using a 32-bit unsigned number. | |||
| The version 0x00000000 is reserved to represent version negotiation. | The version 0x00000000 is reserved to represent version negotiation. | |||
| This version of the specification is identified by the number | This version of the specification is identified by the number | |||
| 0x00000001. | 0x00000001. | |||
| Other versions of QUIC might have different properties to this | Other versions of QUIC might have different properties to this | |||
| version. The properties of QUIC that are guaranteed to be consistent | version. The properties of QUIC that are guaranteed to be consistent | |||
| across all versions of the protocol are described in | across all versions of the protocol are described in | |||
| skipping to change at page 10, line 8 ¶ | skipping to change at page 8, line 5 ¶ | |||
| (0x00000001), is reserved for the version of the protocol that is | (0x00000001), is reserved for the version of the protocol that is | |||
| published as an RFC. | published as an RFC. | |||
| Version numbers used to identify IETF drafts are created by adding | Version numbers used to identify IETF drafts are created by adding | |||
| the draft number to 0xff000000. For example, draft-ietf-quic- | the draft number to 0xff000000. For example, draft-ietf-quic- | |||
| transport-13 would be identified as 0xff00000D. | transport-13 would be identified as 0xff00000D. | |||
| Implementors are encouraged to register version numbers of QUIC that | Implementors are encouraged to register version numbers of QUIC that | |||
| they are using for private experimentation on the github wiki [4]. | they are using for private experimentation on the github wiki [4]. | |||
| 5. Packet Types and Formats | 4. Packet Types and Formats | |||
| We first describe QUIC's packet types and their formats, since some | We first describe QUIC's packet types and their formats, since some | |||
| are referenced in subsequent mechanisms. | are referenced in subsequent mechanisms. | |||
| All numeric values are encoded in network byte order (that is, big- | All numeric values are encoded in network byte order (that is, big- | |||
| endian) and all field sizes are in bits. When discussing individual | endian) and all field sizes are in bits. When discussing individual | |||
| bits of fields, the least significant bit is referred to as bit 0. | bits of fields, the least significant bit is referred to as bit 0. | |||
| Hexadecimal notation is used for describing the value of fields. | Hexadecimal notation is used for describing the value of fields. | |||
| Any QUIC packet has either a long or a short header, as indicated by | Any QUIC packet has either a long or a short header, as indicated by | |||
| the Header Form bit. Long headers are expected to be used early in | the Header Form bit. Long headers are expected to be used early in | |||
| the connection before version negotiation and establishment of 1-RTT | the connection before version negotiation and establishment of 1-RTT | |||
| keys. Short headers are minimal version-specific headers, which are | keys. Short headers are minimal version-specific headers, which are | |||
| used after version negotiation and 1-RTT keys are established. | used after version negotiation and 1-RTT keys are established. | |||
| 5.1. Long Header | 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) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | ||||
| + Connection ID (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Destination Connection ID (0/32..144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Source Connection ID (0/32..144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Payload Length (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Packet Number (32) | | | Packet Number (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 1: Long Header Format | Figure 1: Long Header Format | |||
| Long headers are used for packets that are sent prior to the | Long headers are used for packets that are sent prior to the | |||
| completion of version negotiation and establishment of 1-RTT keys. | completion of version negotiation and establishment of 1-RTT keys. | |||
| Once both conditions are met, a sender switches to sending packets | Once both conditions are met, a sender switches to sending packets | |||
| using the short header (Section 5.2). The long form allows for | using the short header (Section 4.2). The long form allows for | |||
| special packets - such as the Version Negotiation packet - to be | special packets - such as the Version Negotiation packet - to be | |||
| represented in this uniform fixed-length packet format. A long | represented in this uniform fixed-length packet format. A long | |||
| header contains the following fields: | header contains the following fields: | |||
| Header Form: The most significant bit (0x80) of octet 0 (the first | Header Form: The most significant bit (0x80) of octet 0 (the first | |||
| octet) is set to 1 for long headers. | octet) is set to 1 for long headers. | |||
| Long Packet Type: The remaining seven bits of octet 0 contain the | Long Packet Type: The remaining seven bits of octet 0 contain the | |||
| packet type. This field can indicate one of 128 packet types. | packet type. This field can indicate one of 128 packet types. | |||
| The types specified for this version are listed in Table 1. | The types specified for this version are listed in Table 1. | |||
| Connection ID: Octets 1 through 8 contain the connection ID. | Version: The QUIC Version is a 32-bit field that follows the Type. | |||
| Section 5.6 describes the use of this field in more detail. | This field indicates which version of QUIC is in use and | |||
| determines how the rest of the protocol fields are interpreted. | ||||
| Version: Octets 9 to 12 contain the selected protocol version. This | DCIL and SCIL: Octet 1 contains the lengths of the two connection ID | |||
| field indicates which version of QUIC is in use and determines how | fields that follow it. These lengths are encoded as two 4-bit | |||
| the rest of the protocol fields are interpreted. | unsigned integers. The Destination Connection ID Length (DCIL) | |||
| field occupies the 4 high bits of the octet and the Source | ||||
| Connection ID Length (SCIL) field occupies the 4 low bits of the | ||||
| octet. An encoded length of 0 indicates that the connection ID is | ||||
| also 0 octets in length. Non-zero encoded lengths are increased | ||||
| by 3 to get the full length of the connection ID, producing a | ||||
| length between 4 and 18 octets inclusive. For example, an octet | ||||
| with the value 0x50 describes an 8-octet Destination Connection ID | ||||
| and a zero-length Source Connection ID. | ||||
| Packet Number: Octets 13 to 16 contain the packet number. | Destination Connection ID: The Destination Connection ID field | |||
| Section 5.7 describes the use of packet numbers. | 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 | ||||
| field in more detail. | ||||
| Payload: Octets from 17 onwards (the rest of QUIC packet) are the | Source Connection ID: The Source Connection ID field follows the | |||
| payload of the packet. | Destination Connection ID and is either 0 octets in length or | |||
| between 4 and 18 octets. Section 4.7 describes the use of this | ||||
| field in more detail. | ||||
| Payload Length: The length of the Payload field in octets, encoded | ||||
| as a variable-length integer (Section 7.1). | ||||
| Packet Number: The Packet Number is a 32-bit field that follows the | ||||
| two connection IDs. Section 4.8 describes the use of packet | ||||
| numbers. | ||||
| Payload: The payload of the packet. | ||||
| The following packet types are defined: | The following packet types are defined: | |||
| +------+-----------------+---------------+ | +------+-----------------+---------------+ | |||
| | Type | Name | Section | | | Type | Name | Section | | |||
| +------+-----------------+---------------+ | +------+-----------------+---------------+ | |||
| | 0x7F | Initial | Section 5.4.1 | | | 0x7F | Initial | Section 4.4.1 | | |||
| | | | | | | | | | | |||
| | 0x7E | Retry | Section 5.4.2 | | | 0x7E | Retry | Section 4.4.2 | | |||
| | | | | | | | | | | |||
| | 0x7D | Handshake | Section 5.4.3 | | | 0x7D | Handshake | Section 4.4.3 | | |||
| | | | | | | | | | | |||
| | 0x7C | 0-RTT Protected | Section 5.5 | | | 0x7C | 0-RTT Protected | Section 4.5 | | |||
| +------+-----------------+---------------+ | +------+-----------------+---------------+ | |||
| Table 1: Long Header Packet Types | Table 1: Long Header Packet Types | |||
| The header form, packet type, connection ID, packet number and | The header form, type, connection ID lengths octet, destination and | |||
| version fields of a long header packet are version-independent. The | source connection IDs, and version fields of a long header packet are | |||
| types of packets defined in Table 1 are version-specific. See | version-independent. The packet number and values for packet types | |||
| [QUIC-INVARIANTS] for details on how packets from different versions | defined in Table 1 are version-specific. See [QUIC-INVARIANTS] for | |||
| of QUIC are interpreted. | details on how packets from different versions of QUIC are | |||
| interpreted. | ||||
| The interpretation of the fields and the payload are specific to a | The interpretation of the fields and the payload are specific to a | |||
| 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. | |||
| 5.2. Short Header | End of the Payload field (which is also the end of the long header | |||
| packet) is determined by the value of the Payload Length field. | ||||
| Senders can coalesce multiple long header packets into one UDP | ||||
| datagram. See Section 4.6 for more details. | ||||
| 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|C|K|1|0|T T T| | |0|K|1|1|0|R|T T| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | Destination Connection ID (0..144) ... | |||
| + [Connection ID (64)] + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) ... | | Packet Number (8/16/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Protected Payload (*) ... | | Protected Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 2: Short Header Format | Figure 2: Short Header Format | |||
| The short header can be used after the version and 1-RTT keys are | The short header can be used after the version and 1-RTT keys are | |||
| negotiated. This header form has the following fields: | negotiated. This header form has the following fields: | |||
| Header Form: The most significant bit (0x80) of octet 0 is set to 0 | Header Form: The most significant bit (0x80) of octet 0 is set to 0 | |||
| for the short header. | for the short header. | |||
| Omit Connection ID Flag: The second bit (0x40) of octet 0 indicates | Key Phase Bit: The second bit (0x40) of octet 0 indicates the key | |||
| whether the Connection ID field is omitted. If set to 0, then the | ||||
| Connection ID field is present; if set to 1, the Connection ID | ||||
| field is omitted. The Connection ID field can only be omitted if | ||||
| the omit_connection_id transport parameter (Section 7.4.1) is | ||||
| specified by the intended recipient of the packet. | ||||
| Key Phase Bit: The third bit (0x20) of octet 0 indicates the key | ||||
| phase, which allows a recipient of a packet to identify the packet | phase, which allows a recipient of a packet to identify the packet | |||
| protection keys that are used to protect the packet. See | protection keys that are used to protect the packet. See | |||
| [QUIC-TLS] for details. | [QUIC-TLS] for details. | |||
| [[Editor's Note: this section should be removed and the bit | [[Editor's Note: this section should be removed and the bit | |||
| definitions changed before this draft goes to the IESG.]] | definitions changed before this draft goes to the IESG.]] | |||
| Fourth bit: The fourth bit (0x10) of octet 0 is set to 1. | Third Bit: The third bit (0x20) of octet 0 is set to 1. | |||
| [[Editor's Note: this section should be removed and the bit | ||||
| definitions changed before this draft goes to the IESG.]] | ||||
| Fourth Bit: The fourth bit (0x10) of octet 0 is set to 1. | ||||
| [[Editor's Note: this section should be removed and the bit | [[Editor's Note: this section should be removed and the bit | |||
| definitions changed before this draft goes to the IESG.]] | definitions changed before this draft goes to the IESG.]] | |||
| Google QUIC Demultipexing Bit: The fifth bit (0x8) of octet 0 is set | Google QUIC Demultipexing Bit: The fifth bit (0x8) of octet 0 is set | |||
| to 0. This allows implementations of Google QUIC to distinguish | to 0. This allows implementations of Google QUIC to distinguish | |||
| Google QUIC packets from short header packets sent by a client | Google QUIC packets from short header packets sent by a client | |||
| 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. | |||
| Short Packet Type: The remaining 3 bits of octet 0 include one of 8 | Reserved: The sixth bit (0x4) of octet 0 is reserved for | |||
| experimentation. | ||||
| Short Packet Type: The remaining 2 bits of octet 0 include one of 4 | ||||
| packet types. Table 2 lists the types that are defined for short | packet types. Table 2 lists the types that are defined for short | |||
| packets. | packets. | |||
| Connection ID: If the Omit Connection ID Flag is not set, a | Destination Connection ID: The Destination Connection ID is a | |||
| connection ID occupies octets 1 through 8 of the packet. See | connection ID that is chosen by the intended recipient of the | |||
| Section 5.6 for more details. | packet. See Section 4.7 for more details. | |||
| Packet Number: The length of the packet number field depends on the | Packet Number: The length of the packet number field depends on the | |||
| packet type. This field can be 1, 2 or 4 octets long depending on | packet type. This field can be 1, 2 or 4 octets long depending on | |||
| the short packet type. | the short packet type. | |||
| Protected Payload: Packets with a short header always include a | Protected Payload: Packets with a short header always include a | |||
| 1-RTT protected payload. | 1-RTT protected payload. | |||
| The packet type in a short header currently determines only the size | The packet type in a short header currently determines only the size | |||
| of the packet number field. Additional types can be used to signal | of the packet number field. Additional types can be used to signal | |||
| skipping to change at page 13, line 39 ¶ | skipping to change at page 12, line 21 ¶ | |||
| +------+--------------------+ | +------+--------------------+ | |||
| | 0x0 | 1 octet | | | 0x0 | 1 octet | | |||
| | | | | | | | | |||
| | 0x1 | 2 octets | | | 0x1 | 2 octets | | |||
| | | | | | | | | |||
| | 0x2 | 4 octets | | | 0x2 | 4 octets | | |||
| +------+--------------------+ | +------+--------------------+ | |||
| Table 2: Short Header Packet Types | Table 2: Short Header Packet Types | |||
| The header form, omit connection ID flag, and connection ID of a | The header form and connection ID field of a short header packet are | |||
| short header packet are version-independent. The remaining fields | version-independent. The remaining fields are specific to the | |||
| are specific to the selected QUIC version. See [QUIC-INVARIANTS] for | selected QUIC version. See [QUIC-INVARIANTS] for details on how | |||
| details on how packets from different versions of QUIC are | packets from different versions of QUIC are interpreted. | |||
| interpreted. | ||||
| 5.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 packet headers defined above. Upon receipt by a | does not use the long packet header (see Section 4.1. Upon receipt | |||
| client, it will appear to be a packet using the long header, but will | by a client, it will appear to be a packet using the long header, but | |||
| be identified as a Version Negotiation packet based on the Version | will be identified as a Version Negotiation packet based on the | |||
| field. | Version field having a value of 0. | |||
| The Version Negotiation packet is a response to a client packet that | The Version Negotiation packet is a response to a client packet that | |||
| contains a version that is not supported by the server, and is only | contains a version that is not supported by the server, and is only | |||
| sent by servers. | sent by servers. | |||
| The layout of a Version Negotiation packet is: | The layout of a Version Negotiation packet is: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1| Unused (7) | | |1| Unused (7) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | ||||
| + Connection ID (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Destination Connection ID (0/32..144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Source Connection ID (0/32..144) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Supported Version 1 (32) ... | | Supported Version 1 (32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Supported Version 2 (32)] ... | | [Supported Version 2 (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | [Supported Version N (32)] ... | | [Supported Version N (32)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 3: Version Negotiation Packet | Figure 3: Version Negotiation Packet | |||
| The value in the Unused field is selected randomly by the server. | The value in the Unused field is selected randomly by the server. | |||
| The Connection ID field echoes the corresponding value from the | ||||
| triggering client packet. This allows clients some assurance that | The Version field of a Version Negotiation packet MUST be set to | |||
| the server received the packet and that the Version Negotiation | 0x00000000. | |||
| packet is in fact from the server. The Version field MUST be set to | ||||
| 0x00000000. The remainder of the Version Negotiation packet is a | The server MUST include the value from the Source Connection ID field | |||
| list of 32-bit versions which the server supports. | of the packet it receives in the Destination Connection ID field. | |||
| The value for Source Connection ID MUST be copied from the | ||||
| Destination Connection ID of the received packet, which is initially | ||||
| randomly selected by a client. Echoing both connection IDs gives | ||||
| clients some assurance that the server received the packet and that | ||||
| the Version Negotiation packet was not generated by an off-path | ||||
| attacker. | ||||
| The remainder of the Version Negotiation packet is a list of 32-bit | ||||
| versions which the server supports. | ||||
| A Version Negotiation packet cannot be explicitly acknowledged in an | 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. | |||
| See Section 7.2 for a description of the version negotiation process. | The Version Negotiation packet does not include the Packet Number and | |||
| Length fields present in other packets that use the long header form. | ||||
| 5.4. Cryptographic Handshake Packets | Consequently, a Version Negotiation packet consumes an entire UDP | |||
| datagram. | ||||
| See Section 6.2 for a description of the version negotiation process. | ||||
| 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 5.4.1), Retry (Section 5.4.2) and | carried in Initial (Section 4.4.1), Retry (Section 4.4.2) and | |||
| Handshake (Section 5.4.3) packets. | Handshake (Section 4.4.3) 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, | |||
| handshake packets are protected with a connection- and version- | handshake packets are protected with a connection- and version- | |||
| specific key, as described in [QUIC-TLS]. This protection does not | specific key, as described in [QUIC-TLS]. This protection does not | |||
| provide confidentiality or integrity against on-path attackers, but | provide confidentiality or integrity against on-path attackers, but | |||
| provides some level of protection against off-path attackers. | provides some level of protection against off-path attackers. | |||
| 5.4.1. 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 cryptographic handshake message sent by the client. | |||
| The client populates the connection ID field with randomly selected | If the client has not previously received a Retry packet from the | |||
| values, unless it has received a packet from the server. If the | server, it populates the Destination Connection ID field with a | |||
| client has received a packet from the server, the connection ID field | randomly selected value. This MUST be at least 8 octets in length. | |||
| uses the value provided by the server. | 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, but is not included in server packets. | ||||
| If the client received a Retry packet and is sending a second Initial | ||||
| packet, 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. | ||||
| The client populates the Source Connection ID field with a value of | ||||
| its choosing and sets the low bits of the ConnID Len field to match. | ||||
| The first Initial packet that is sent by a client contains a | The first Initial packet that is sent by a client contains a | |||
| randomized packet number. All subsequent packets contain a packet | randomized packet number. All subsequent packets contain a packet | |||
| number that is incremented by one, see (Section 5.7). | number that is incremented by one, see (Section 4.8). | |||
| The payload of an Initial packet consists of a STREAM frame (or | The payload of an Initial packet conveys a STREAM frame (or frames) | |||
| frames) for stream 0 containing a cryptographic handshake message, | for stream 0 containing a cryptographic handshake message. The | |||
| with enough PADDING frames that the packet is at least 1200 octets | stream in this packet always starts at an offset of 0 (see | |||
| (see Section 9). The stream in this packet always starts at an | Section 6.5) and the complete cryptographic handshake message MUST | |||
| offset of 0 (see Section 7.5) and the complete cryptographic | fit in a single packet (see Section 6.3). | |||
| handshake message MUST fit in a single packet (see Section 7.3). | ||||
| The payload of a UDP datagram carrying the Initial packet MUST be | ||||
| expanded to at least 1200 octets (see Section 8), by adding PADDING | ||||
| frames to the Initial packet and/or by combining the Initial packet | ||||
| with a 0-RTT packet (see Section 4.6). | ||||
| The client uses the Initial packet type for any packet that contains | The client uses the Initial packet type for any packet that contains | |||
| an initial cryptographic handshake message. This includes all cases | an initial cryptographic handshake message. This includes all cases | |||
| where a new packet containing the initial cryptographic message needs | where a new packet containing the initial cryptographic message needs | |||
| to be created, this includes the packets sent after receiving a | to be created, this includes the packets sent after receiving a | |||
| Version Negotiation (Section 5.3) or Retry packet (Section 5.4.2). | Version Negotiation (Section 4.3) or Retry packet (Section 4.4.2). | |||
| 5.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 cryptographic handshake messages and acknowledgments. 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 7.5). | Section 6.5). | |||
| The server includes a connection ID of its choice in the connection | The server populates the Destination Connection ID with the | |||
| ID field. The client MUST use this connection ID for any subsequent | connection ID that the client included in the Source Connection ID of | |||
| packets that it sends. | the Initial packet. This might be a zero-length value. | |||
| The server includes a connection ID of its choice in the Source | ||||
| Connection ID field. The client MUST use this connection ID in the | ||||
| Destination Connection ID of subsequent packets that it sends. | ||||
| The packet number field echoes the packet number field from the | The packet number field echoes the packet number field from the | |||
| triggering client packet. | triggering client packet. | |||
| 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. Receiving another Initial packet implicitly acknowledges a | |||
| Retry packet. | Retry packet. | |||
| After receiving a Retry packet, the client uses a new Initial packet | After receiving a Retry packet, the client uses a new Initial packet | |||
| containing the next cryptographic handshake message. The client | containing the next cryptographic handshake message. The client | |||
| skipping to change at page 16, line 21 ¶ | skipping to change at page 16, line 4 ¶ | |||
| After receiving a Retry packet, the client uses a new Initial packet | After receiving a Retry packet, the client uses a new Initial packet | |||
| containing the next cryptographic handshake message. The client | containing the next cryptographic handshake message. The client | |||
| retains the state of its cryptographic handshake, but discards all | retains the state of its cryptographic handshake, but discards all | |||
| transport state. The Initial packet that is generated in response to | transport state. The Initial packet that is generated in response to | |||
| a Retry packet includes STREAM frames on stream 0 that start again at | a Retry packet includes STREAM frames on stream 0 that start again at | |||
| an offset of 0. | an offset of 0. | |||
| Continuing the cryptographic handshake is necessary to ensure that an | Continuing the cryptographic handshake is necessary to ensure that an | |||
| attacker cannot force a downgrade of any cryptographic parameters. | attacker cannot force a downgrade of any cryptographic parameters. | |||
| In addition to continuing the cryptographic handshake, the client | In addition to continuing the cryptographic handshake, the client | |||
| MUST remember the results of any version negotiation that occurred | MUST remember the results of any version negotiation that occurred | |||
| (see Section 7.2). The client MAY also retain any observed RTT or | (see Section 6.2). The client MAY also retain any observed RTT or | |||
| congestion state that it has accumulated for the flow, but other | congestion state that it has accumulated for the flow, but other | |||
| transport state MUST be discarded. | transport state MUST be discarded. | |||
| The payload of the Retry packet contains a single STREAM frame on | The payload of the Retry packet contains at least two frames. It | |||
| stream 0 with offset 0 containing the server's cryptographic | MUST include a STREAM frame on stream 0 with offset 0 containing the | |||
| stateless retry material. It MUST NOT contain any other frames. The | server's cryptographic stateless retry material. It MUST also | |||
| next STREAM frame sent by the server will also start at stream offset | include an ACK frame to acknowledge the client's Initial packet. It | |||
| 0. | MAY additionally include PADDING frames. The next STREAM frame sent | |||
| by the server will also start at stream offset 0. | ||||
| 5.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. | |||
| The connection ID field in a Handshake packet contains a connection | The Destination Connection ID field in a Handshake packet contains a | |||
| ID that is chosen by the server (see Section 5.6). | connection ID that is chosen by the recipient of the packet; the | |||
| Source Connection ID includes the connection ID that the sender of | ||||
| the packet wishes to use (see Section 4.7). | ||||
| The first Handshake packet sent by a server contains a randomized | The first Handshake packet sent by a server contains a randomized | |||
| packet number. This value is increased for each subsequent packet | packet number. This value is increased for each subsequent packet | |||
| sent by the server as described in Section 5.7. The client | sent by the server as described in Section 4.8. The client | |||
| increments the packet number from its previous packet by one for each | increments the packet number from its previous packet by one for each | |||
| Handshake packet that it sends (which might be an Initial, 0-RTT | Handshake packet that it sends (which might be an Initial, 0-RTT | |||
| Protected, or Handshake packet). | Protected, or Handshake packet). | |||
| Servers MUST NOT send more than three Handshake packets without | Servers MUST NOT send more than three Handshake packets without | |||
| receiving a packet from a verified source address. Source addresses | receiving a packet from a verified source address. Source addresses | |||
| can be verified through an address validation token, receipt of the | can be verified through an address validation token, receipt of the | |||
| final cryptographic message from the client, or by receiving a valid | final cryptographic message from the client, or by receiving a valid | |||
| PATH_RESPONSE frame from the client. | PATH_RESPONSE frame from the client. | |||
| If the server expects to generate more than three Handshake packets | If the server expects to generate more than three Handshake packets | |||
| in response to an Initial packet, it SHOULD include a PATH_CHALLENGE | in response to an Initial packet, it SHOULD include a PATH_CHALLENGE | |||
| frame in each Handshake packet that it sends. After receiving at | frame in each Handshake packet that it sends. After receiving at | |||
| least one valid PATH_RESPONSE frame, the server can send its | least one valid PATH_RESPONSE frame, the server can send its | |||
| remaining Handshake packets. Servers can instead perform address | remaining Handshake packets. Servers can instead perform address | |||
| validation using a Retry packet; this requires less state on the | validation using a Retry packet; this requires less state on the | |||
| server, but could involve additional computational effort depending | server, but could involve additional computational effort depending | |||
| on implementation choices. | on implementation choices. | |||
| The payload of this packet contains STREAM frames and could contain | The payload of this packet contains STREAM frames and could contain | |||
| PADDING, ACK, PATH_CHALLENGE, or PATH_RESPONSE frames. | PADDING, ACK, PATH_CHALLENGE, or PATH_RESPONSE frames. Handshake | |||
| packets MAY contain CONNECTION_CLOSE frames if the handshake is | ||||
| unsuccessful. | ||||
| 5.5. Protected Packets | 4.5. Protected Packets | |||
| Packets that are protected with 0-RTT keys are sent with long | Packets that are protected with 0-RTT keys are sent with long | |||
| headers; all packets protected with 1-RTT keys are sent with short | headers; all packets protected with 1-RTT keys are sent with short | |||
| headers. The different packet types explicitly indicate the | headers. The different packet types explicitly indicate the | |||
| encryption level and therefore the keys that are used to remove | encryption level and therefore the keys that are used to remove | |||
| packet protection. | packet protection. | |||
| Packets protected with 0-RTT keys use a type value of 0x7C. The | Packets protected with 0-RTT keys use a type value of 0x7C. The | |||
| connection ID field for a 0-RTT packet is selected by the client. | connection ID fields for a 0-RTT packet MUST match the values used in | |||
| 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 a Handshake packet | |||
| (Section 5.4.3), if that packet does not complete the handshake. | (Section 4.4.3), if that packet does not complete the handshake. | |||
| Even if the client receives a different connection ID in the | Even if the client receives a different connection ID in the | |||
| Handshake packet, it MUST continue to use the connection ID selected | Handshake packet, it MUST continue to use the same Destination | |||
| by the client for 0-RTT packets, see Section 5.6. | 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 increases | The packet number field contains a packet number, which increases | |||
| with each packet sent, see Section 5.7 for details. | with each packet sent, see Section 4.8 for details. | |||
| The payload is protected using authenticated encryption. [QUIC-TLS] | The payload is protected using authenticated encryption. [QUIC-TLS] | |||
| describes packet protection in detail. After decryption, the | describes packet protection in detail. After decryption, the | |||
| plaintext consists of a sequence of frames, as described in | plaintext consists of a sequence of frames, as described in | |||
| Section 6. | Section 5. | |||
| 5.6. Connection ID | 4.6. Coaslescing Packets | |||
| QUIC connections are identified by their 64-bit Connection ID. All | A sender can coalesce multiple QUIC packets (typically a | |||
| long headers contain a Connection ID. Short headers indicate the | Cryptographic Handshake packet and a Protected packet) into one UDP | |||
| presence of a Connection ID using the Omit Connection ID flag. When | datagram. This can reduce the number of UDP datagrams needed to send | |||
| present, the Connection ID is in the same location in all packet | application data during the handshake and immediately afterwards. A | |||
| headers, making it straightforward for middleboxes, such as load | packet with a short header does not include a length, so it has to be | |||
| balancers, to locate and use it. | the last packet included in a UDP datagram. | |||
| The client MUST choose a random connection ID and use it in Initial | The sender MUST NOT coalesce QUIC packets belonging to different QUIC | |||
| packets (Section 5.4.1) and 0-RTT packets (Section 5.5). | connections into a single UDP datagram. | |||
| When the server receives a Initial packet and decides to proceed with | Every QUIC packet that is coalesced into a single UDP datagram is | |||
| the handshake, it chooses a new value for the connection ID and sends | separate and complete. Though the values of some fields in the | |||
| that in a Retry (Section 5.4.2) or Handshake (Section 5.4.3) packet. | packet header might be redundant, no fields are omitted. The | |||
| The server MAY choose to use the value that the client initially | receiver of coalesced QUIC packets MUST individually process each | |||
| selects. | QUIC packet and separately acknowledge them, as if they were received | |||
| as the payload of different UDP datagrams. | ||||
| Once the client receives the connection ID that the server has | 4.7. Connection ID | |||
| chosen, it MUST use it for all subsequent Handshake (Section 5.4.3) | ||||
| and 1-RTT (Section 5.5) packets but not for 0-RTT packets | ||||
| (Section 5.5). | ||||
| Server's Version Negotiation (Section 5.3) and Retry (Section 5.4.2) | A connection ID is used to ensure consistent routing of packets. The | |||
| packets MUST use connection ID selected by the client. | long header contains two connection IDs: the Destination Connection | |||
| ID is chosen by the recipient of the packet and is used to provide | ||||
| consistent routing; the Source Connection ID is used to set the | ||||
| Destination Connection ID used by the peer. | ||||
| 5.7. Packet Numbers | During the handshake, packets with the long header are used to | |||
| establish the connection ID that each endpoint uses. Each endpoint | ||||
| uses the Source Connection ID field to specify the connection ID that | ||||
| is used in the Destination Connection ID field of packets being sent | ||||
| to them. Upon receiving a packet, each endpoint sets the Destination | ||||
| Connection ID it sends to match the value of the Source Connection ID | ||||
| that they receive. | ||||
| During the handshake, an endpoint might receive multiple packets with | ||||
| the long header, and thus be given multiple opportunities to update | ||||
| the Destination Connection ID it sends. A client MUST only change | ||||
| 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 | ||||
| Handshake); a server MUST set its value based on the Initial packet. | ||||
| Any additional changes are not permitted; if subsequent packets of | ||||
| those types include a different Source Connection ID, they MUST be | ||||
| discarded. This avoids problems that might arise from stateless | ||||
| processing of multiple Initial packets producing different connection | ||||
| IDs. | ||||
| Short headers only include the Destination Connection ID and omit the | ||||
| explicit length. The length of the Destination Connection ID field | ||||
| is expected to be known to endpoints. | ||||
| Endpoints using a connection-ID based load balancer could agree with | ||||
| the load balancer on a fixed or minimum length and on an encoding for | ||||
| connection IDs. This fixed portion could encode an explicit length, | ||||
| which allows the entire connection ID to vary in length and still be | ||||
| used by the load balancer. | ||||
| The very first packet sent by a client includes a random value for | ||||
| Destination Connection ID. The same value MUST be used for all 0-RTT | ||||
| packets sent on that connection (Section 4.5). This randomized value | ||||
| is used to determine the handshake packet protection keys (see | ||||
| Section 5.3.2 of [QUIC-TLS]). | ||||
| A Version Negotiation (Section 4.3) packet MUST use both connection | ||||
| IDs selected by the client, swapped to ensure correct routing toward | ||||
| the client. | ||||
| The connection ID can change over the lifetime of a connection, | ||||
| especially in response to connection migration (Section 6.8). | ||||
| NEW_CONNECTION_ID frames (Section 7.13) are used to provide new | ||||
| connection ID values. | ||||
| 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 increase by at least | receiving. The packet number for sending MUST increase by at least | |||
| one after sending any packet, unless otherwise specified (see | one after sending any packet, unless otherwise specified (see | |||
| Section 5.7.1). | Section 4.8.1). | |||
| A QUIC endpoint MUST NOT reuse a packet number within the same | A QUIC endpoint MUST NOT reuse a packet number within the same | |||
| connection (that is, under the same cryptographic keys). If the | connection (that is, under the same cryptographic keys). If the | |||
| packet number for sending reaches 2^62 - 1, the sender MUST close the | packet number for sending reaches 2^62 - 1, the sender MUST close the | |||
| connection without sending a CONNECTION_CLOSE frame or any further | connection without sending a CONNECTION_CLOSE frame or any further | |||
| packets; a server MAY send a Stateless Reset (Section 7.9.4) in | packets; a server MAY send a Stateless Reset (Section 6.9.4) in | |||
| response to further packets that it receives. | response to further packets that it receives. | |||
| For the packet header, the number of bits required to represent the | For the packet header, the number of bits required to represent the | |||
| packet number are reduced by including only the least significant | packet number are reduced by including only the least significant | |||
| bits of the packet number. The actual packet number for each packet | bits of the packet number. The actual packet number for each packet | |||
| is reconstructed at the receiver based on the largest packet number | is reconstructed at the receiver based on the largest packet number | |||
| received on a successfully authenticated packet. | received on a successfully authenticated packet. | |||
| A packet number is decoded by finding the packet number value that is | A packet number is decoded by finding the packet number value that is | |||
| closest to the next expected packet. The next expected packet is the | closest to the next expected packet. The next expected packet is the | |||
| skipping to change at page 19, line 24 ¶ | skipping to change at page 20, line 14 ¶ | |||
| As a result, the size of the packet number encoding is at least one | As a result, the size of the packet number encoding is at least one | |||
| more than the base 2 logarithm of the number of contiguous | more than the base 2 logarithm of the number of contiguous | |||
| unacknowledged packet numbers, including the new packet. | unacknowledged packet numbers, including the new packet. | |||
| For example, if an endpoint has received an acknowledgment for packet | For example, if an endpoint has received an acknowledgment for packet | |||
| 0x6afa2f, sending a packet with a number of 0x6b4264 requires a | 0x6afa2f, sending a packet with a number of 0x6b4264 requires a | |||
| 16-bit or larger packet number encoding; whereas a 32-bit packet | 16-bit or larger packet number encoding; whereas a 32-bit packet | |||
| number is needed to send a packet with a number of 0x6bc107. | number is needed to send a packet with a number of 0x6bc107. | |||
| A Version Negotiation packet (Section 5.3) does not include a packet | A Version Negotiation packet (Section 4.3) does not include a packet | |||
| number. The Retry packet (Section 5.4.2) has special rules for | number. The Retry packet (Section 4.4.2) has special rules for | |||
| populating the packet number field. | populating the packet number field. | |||
| 5.7.1. Initial Packet Number | 4.8.1. Initial Packet Number | |||
| The initial value for packet number MUST be selected randomly from a | The initial value for packet number MUST be selected randomly from a | |||
| range between 0 and 2^32 - 1025 (inclusive). This value is selected | range between 0 and 2^32 - 1025 (inclusive). This value is selected | |||
| so that Initial and Handshake packets exercise as many possible | so that Initial and Handshake packets exercise as many possible | |||
| values for the Packet Number field as possible. | values for the Packet Number field as possible. | |||
| Limiting the range allows both for loss of packets and for any | Limiting the range allows both for loss of packets and for any | |||
| stateless exchanges. Packet numbers are incremented for subsequent | stateless exchanges. Packet numbers are incremented for subsequent | |||
| packets, but packet loss and stateless handling can both mean that | packets, but packet loss and stateless handling can both mean that | |||
| the first packet sent by an endpoint isn't necessarily the first | the first packet sent by an endpoint isn't necessarily the first | |||
| packet received by its peer. The first packet received by a peer | packet received by its peer. The first packet received by a peer | |||
| cannot be 2^32 or greater or the recipient will incorrectly assume a | cannot be 2^32 or greater or the recipient will incorrectly assume a | |||
| packet number that is 2^32 values lower and discard the packet. | packet number that is 2^32 values lower and discard the packet. | |||
| Use of a secure random number generator [RFC4086] is not necessary | Use of a secure random number generator [RFC4086] is not necessary | |||
| for generating the initial packet number, nor is it necessary that | for generating the initial packet number, nor is it necessary that | |||
| the value be uniformly distributed. | the value be uniformly distributed. | |||
| 6. Frames and Frame Types | 5. Frames and Frame Types | |||
| The payload of all packets, after removing packet protection, | The payload of all packets, after removing packet protection, | |||
| consists of a sequence of frames, as shown in Figure 4. Version | consists of a sequence of frames, as shown in Figure 4. Version | |||
| Negotiation and Stateless Reset do not contain frames. | Negotiation and Stateless Reset do not contain frames. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame 1 (*) ... | | Frame 1 (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 20, line 35 ¶ | skipping to change at page 21, line 35 ¶ | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type (8) | Type-Dependent Fields (*) ... | | Type (8) | Type-Dependent Fields (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: Generic Frame Layout | Figure 5: Generic Frame Layout | |||
| Frame types are listed in Table 3. Note that the Frame Type byte in | Frame types are listed in Table 3. Note that the Frame Type byte in | |||
| STREAM and ACK frames is used to carry other frame-specific flags. | STREAM frames is used to carry other frame-specific flags. For all | |||
| For all other frames, the Frame Type byte simply identifies the | other frames, the Frame Type byte simply identifies the frame. These | |||
| frame. These frames are explained in more detail as they are | frames are explained in more detail as they are referenced later in | |||
| referenced later in the document. | the document. | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| | Type Value | Frame Type Name | Definition | | | Type Value | Frame Type Name | Definition | | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| | 0x00 | PADDING | Section 8.2 | | | 0x00 | PADDING | Section 7.2 | | |||
| | | | | | | | | | | |||
| | 0x01 | RST_STREAM | Section 8.3 | | | 0x01 | RST_STREAM | Section 7.3 | | |||
| | | | | | | | | | | |||
| | 0x02 | CONNECTION_CLOSE | Section 8.4 | | | 0x02 | CONNECTION_CLOSE | Section 7.4 | | |||
| | | | | | | | | | | |||
| | 0x03 | APPLICATION_CLOSE | Section 8.5 | | | 0x03 | APPLICATION_CLOSE | Section 7.5 | | |||
| | | | | | | | | | | |||
| | 0x04 | MAX_DATA | Section 8.6 | | | 0x04 | MAX_DATA | Section 7.6 | | |||
| | | | | | | | | | | |||
| | 0x05 | MAX_STREAM_DATA | Section 8.7 | | | 0x05 | MAX_STREAM_DATA | Section 7.7 | | |||
| | | | | | | | | | | |||
| | 0x06 | MAX_STREAM_ID | Section 8.8 | | | 0x06 | MAX_STREAM_ID | Section 7.8 | | |||
| | | | | | | | | | | |||
| | 0x07 | PING | Section 8.9 | | | 0x07 | PING | Section 7.9 | | |||
| | | | | | | | | | | |||
| | 0x08 | BLOCKED | Section 8.10 | | | 0x08 | BLOCKED | Section 7.10 | | |||
| | | | | | | | | | | |||
| | 0x09 | STREAM_BLOCKED | Section 8.11 | | | 0x09 | STREAM_BLOCKED | Section 7.11 | | |||
| | | | | | | | | | | |||
| | 0x0a | STREAM_ID_BLOCKED | Section 8.12 | | | 0x0a | STREAM_ID_BLOCKED | Section 7.12 | | |||
| | | | | | | | | | | |||
| | 0x0b | NEW_CONNECTION_ID | Section 8.13 | | | 0x0b | NEW_CONNECTION_ID | Section 7.13 | | |||
| | | | | | | | | | | |||
| | 0x0c | STOP_SENDING | Section 8.14 | | | 0x0c | STOP_SENDING | Section 7.14 | | |||
| | | | | | | | | | | |||
| | 0x0d | ACK | Section 8.15 | | | 0x0d | ACK | Section 7.15 | | |||
| | | | | | | | | | | |||
| | 0x0e | PATH_CHALLENGE | Section 8.16 | | | 0x0e | PATH_CHALLENGE | Section 7.16 | | |||
| | | | | | | | | | | |||
| | 0x0f | PATH_RESPONSE | Section 8.17 | | | 0x0f | PATH_RESPONSE | Section 7.17 | | |||
| | | | | | | | | | | |||
| | 0x10 - 0x17 | STREAM | Section 8.18 | | | 0x10 - 0x17 | STREAM | Section 7.18 | | |||
| +-------------+-------------------+--------------+ | +-------------+-------------------+--------------+ | |||
| Table 3: Frame Types | Table 3: Frame Types | |||
| 7. 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 7.3. Once | connection establishment latency, as described in Section 6.3. Once | |||
| established, a connection may migrate to a different IP or port at | established, a connection may migrate to a different IP or port at | |||
| either endpoint, due to NAT rebinding or mobility, as described in | either endpoint, due to NAT rebinding or mobility, as described in | |||
| Section 7.7. Finally a connection may be terminated by either | Section 6.8. Finally a connection may be terminated by either | |||
| endpoint, as described in Section 7.9. | endpoint, as described in Section 6.9. | |||
| 7.1. Matching Packets to Connections | 6.1. Matching Packets to Connections | |||
| Incoming packets are classified on receipt. Packets can either be | Incoming packets are classified on receipt. Packets can either be | |||
| associated with an existing connection, 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 the packet with an existing connection. If | Hosts try to associate a packet with an existing connection. If the | |||
| the packet has a 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 a | |||
| NEW_CONNECTION_ID frame (Section 8.13) would associate more than one | NEW_CONNECTION_ID frame (Section 7.13) would associate more than one | |||
| connection ID with a connection. | connection ID with a connection. | |||
| If there is no connection ID, but the packet matches the address/port | If the Destination Connection ID is zero length and the packet | |||
| tuple of a connection where the host did not require connection IDs, | matches the address/port tuple of a connection where the host did not | |||
| QUIC processes the packet as part of that connection. Endpoints MUST | require connection IDs, QUIC processes the packet as part of that | |||
| drop packets that omit connection IDs if they do not meet both of | connection. Endpoints MUST drop packets with zero-length Destination | |||
| these criteria. | Connection ID fields if they do not correspond to a single | |||
| connection. | ||||
| 7.1.1. Client Packet Handling | ||||
| If a client receives a packet with an unknown connection ID, and it | 6.1.1. Client Packet Handling | |||
| matches the tuple of a connection with no received packets, it is a | ||||
| reply to an Initial packet with a server-generated connection ID and | ||||
| will be processed accordingly. Clients SHOULD discard any packets | ||||
| with new connection IDs that do not meet these criteria. | ||||
| Note that a successfully associated packet may be a Version | Valid packets sent to clients always include a Destination Connection | |||
| Negotiation packet, which is handled in accordance with | ID that matches the value the client selects. Clients that choose to | |||
| Section 7.2.2. | receive zero-length connection IDs can use the address/port tuple to | |||
| identify a connection. Packets that don't match an existing | ||||
| 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 encrypted with a key it has not yet computed. Clients MAY | connection that are encrypted with a key it has not yet computed. | |||
| drop these packets, or MAY buffer them in anticipation of later | Clients MAY drop these packets, or MAY buffer them in anticipation of | |||
| packets that allow it to compute the key. | later packets that allow it to compute the key. | |||
| 7.1.2. Server Packet Handling | If a client receives a packet that has an unsupported version, it | |||
| MUST discard that packet. | ||||
| 6.1.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 7.2.1. Servers MAY rate control these packets | described in Section 6.2.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 | ||||
| semantics and encodings for any version-specific field. In | ||||
| particular, different packet protection keys might be used for | ||||
| different versions. Servers that do not support a particular version | ||||
| are unlikely to be able to decrypt the content of the packet. | ||||
| Servers SHOULD NOT attempt to decode or decrypt a packet from an | ||||
| unknown version, but instead send a Version Negotiation packet, | ||||
| 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 7.1. If not matched, the server | a connection as described in Section 6.1. 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 7.3). | specification, the server proceeds with the handshake (Section 6.3). | |||
| 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 7.9.4) if a connection ID | They SHOULD send a Stateless Reset (Section 6.9.4) if a connection ID | |||
| is present in the header. | is present in the header. | |||
| 7.2. Version Negotiation | 6.2. 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 7.1 for details. | new connection, see Section 6.1 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 that the server responds if there are any mutually | |||
| supported versions. | supported versions. | |||
| 7.2.1. Sending Version Negotiation Packets | 6.2.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 | server, the server responds with a Version Negotiation packet (see | |||
| (Section 5.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. | |||
| 7.2.2. Handling Version Negotiation Packets | 6.2.2. Handling Version Negotiation Packets | |||
| When the client receives a Version Negotiation packet, it first | When the client receives a Version Negotiation packet, it first | |||
| checks that the connection ID matches the connection ID the client | checks that the Destination and Source Connection ID fields match the | |||
| sent. If this check fails, the packet MUST be discarded. | Source and Destination Connection ID fields in a packet that the | |||
| 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 Client | connection using that version. Though the contents of the Initial | |||
| Initial packet the client sends might not change in response to | packet the client sends might not change in response to version | |||
| version negotiation, a client MUST increase the packet number it uses | negotiation, a client MUST increase the packet number it uses on | |||
| on every packet it sends. Packets MUST continue to use long headers | every packet it sends. Packets MUST continue to use long headers and | |||
| and MUST include the new negotiated protocol version. | MUST include the new negotiated protocol version. | |||
| The client MUST use the long header format and include its selected | The client MUST use the long header format and include its selected | |||
| version on all packets until it has 1-RTT keys and it has received a | version on all packets until it has 1-RTT keys and it has received a | |||
| packet from the server which is not a Version Negotiation packet. | packet from the server which is not a Version Negotiation packet. | |||
| A client MUST NOT change the version it uses unless it is in response | A client MUST NOT change the version it uses unless it is in response | |||
| to a Version Negotiation packet from the server. Once a client | to a Version Negotiation packet from the server. Once a client | |||
| receives a packet from the server which is not a Version Negotiation | receives a packet from the server which is not a Version Negotiation | |||
| packet, it MUST 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 7.4.4). | cryptographic handshake (see Section 6.4.4). | |||
| 7.2.3. Using Reserved Versions | 6.2.3. Using Reserved Versions | |||
| For a server to use a new version in the future, clients must | For a server to use a new version in the future, clients must | |||
| correctly handle unsupported versions. To help ensure this, a server | correctly handle unsupported versions. To help ensure this, a server | |||
| SHOULD include a reserved version (see Section 4) while generating a | SHOULD include a reserved version (see Section 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 7.4.4) only validates | validation of version negotiation (see Section 6.4.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. | |||
| 7.3. Cryptographic and Transport Handshake | 6.3. Cryptographic and Transport Handshake | |||
| QUIC relies on a combined cryptographic and transport handshake to | QUIC relies on a combined cryptographic and transport handshake to | |||
| minimize connection establishment latency. QUIC allocates stream 0 | minimize connection establishment latency. QUIC allocates stream 0 | |||
| for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | for the cryptographic handshake. Version 0x00000001 of QUIC uses TLS | |||
| 1.3 as described in [QUIC-TLS]; a different QUIC version number could | 1.3 as described in [QUIC-TLS]; a different QUIC version number could | |||
| indicate that a different cryptographic handshake protocol is in use. | indicate that a different cryptographic handshake protocol is in use. | |||
| QUIC provides this stream with reliable, ordered delivery of data. | QUIC provides this stream with reliable, ordered delivery of data. | |||
| In return, the cryptographic handshake provides QUIC with: | In return, the cryptographic handshake provides QUIC with: | |||
| skipping to change at page 25, line 33 ¶ | skipping to change at page 26, line 48 ¶ | |||
| * 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 7.4) | Section 6.4) | |||
| o authenticated confirmation of version negotiation (see | o authenticated confirmation of version negotiation (see | |||
| Section 7.4.4) | Section 6.4.4) | |||
| o authenticated negotiation of an application protocol (TLS uses | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [RFC7301] for this purpose) | ALPN [RFC7301] for this purpose) | |||
| o for the server, the ability to carry data that provides assurance | o for the server, the ability to carry data that provides assurance | |||
| that the client can receive packets that are addressed with the | that the client can receive packets that are addressed with the | |||
| transport address that is claimed by the client (see Section 7.6) | transport address that is claimed by the client (see Section 6.6) | |||
| The initial cryptographic handshake message MUST be sent in a single | The initial cryptographic handshake message MUST be sent in a single | |||
| packet. Any second attempt that is triggered by address validation | packet. Any second attempt that is triggered by address validation | |||
| MUST also be sent within a single packet. This avoids having to | MUST also be sent within a single packet. This avoids having to | |||
| reassemble a message from multiple packets. Reassembling messages | reassemble a message from multiple packets. Reassembling messages | |||
| requires that a server maintain state prior to establishing a | requires that a server maintain state prior to establishing a | |||
| connection, exposing the server to a denial of service risk. | connection, exposing the server to a denial of service risk. | |||
| The first client packet of the cryptographic handshake protocol MUST | The first client packet of the cryptographic handshake protocol MUST | |||
| fit within a 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 | Details of how TLS is integrated with QUIC is provided in more detail | |||
| in [QUIC-TLS]. | in [QUIC-TLS]. | |||
| 7.4. Transport Parameters | 6.4. Transport Parameters | |||
| During connection establishment, both endpoints make authenticated | During connection establishment, both endpoints make authenticated | |||
| declarations of their transport parameters. These declarations are | declarations of their transport parameters. These declarations are | |||
| made unilaterally by each endpoint. Endpoints are required to comply | made unilaterally by each endpoint. Endpoints are required to comply | |||
| with the restrictions implied by these parameters; the description of | with the restrictions implied by these parameters; the description of | |||
| each parameter includes rules for its handling. | each parameter includes rules for its handling. | |||
| The format of the transport parameters is the TransportParameters | The format of the transport parameters is the TransportParameters | |||
| struct from Figure 6. This is described using the presentation | struct from Figure 6. This is described using the presentation | |||
| language from Section 3 of [I-D.ietf-tls-tls13]. | language from Section 3 of [I-D.ietf-tls-tls13]. | |||
| uint32 QuicVersion; | uint32 QuicVersion; | |||
| enum { | enum { | |||
| initial_max_stream_data(0), | initial_max_stream_data(0), | |||
| initial_max_data(1), | initial_max_data(1), | |||
| initial_max_stream_id_bidi(2), | initial_max_stream_id_bidi(2), | |||
| idle_timeout(3), | idle_timeout(3), | |||
| omit_connection_id(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_stream_id_uni(8), | initial_max_stream_id_uni(8), | |||
| (65535) | (65535) | |||
| } TransportParameterId; | } TransportParameterId; | |||
| struct { | struct { | |||
| TransportParameterId parameter; | TransportParameterId parameter; | |||
| opaque value<0..2^16-1>; | opaque value<0..2^16-1>; | |||
| skipping to change at page 27, line 48 ¶ | skipping to change at page 28, line 47 ¶ | |||
| 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 7.4.4) before the connection establishment is considered | Section 6.4.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 7.4.1. Any given parameter MUST appear at most once in a | in Section 6.4.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. | |||
| 7.4.1. Transport Parameter Definitions | 6.4.1. Transport Parameter Definitions | |||
| An endpoint MUST include the following parameters in its encoded | An endpoint MUST include the following parameters in its encoded | |||
| TransportParameters: | TransportParameters: | |||
| initial_max_stream_data (0x0000): The initial stream maximum data | initial_max_stream_data (0x0000): The initial stream maximum data | |||
| parameter contains the initial value for the maximum data that can | parameter contains the initial value for the maximum data that can | |||
| be sent on any newly created stream. This parameter is encoded as | be sent on any newly created stream. This parameter is encoded as | |||
| an unsigned 32-bit integer in units of octets. This is equivalent | an unsigned 32-bit integer in units of octets. This is equivalent | |||
| to an implicit MAX_STREAM_DATA frame (Section 8.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. | |||
| initial_max_data (0x0001): The initial maximum data parameter | initial_max_data (0x0001): The initial maximum data parameter | |||
| contains the initial value for the maximum amount of data that can | contains the initial value for the maximum amount of data that can | |||
| be sent on the connection. This parameter is encoded as an | be sent on the connection. This parameter is encoded as an | |||
| unsigned 32-bit integer in units of octets. This is equivalent to | unsigned 32-bit integer in units of octets. This is equivalent to | |||
| sending a MAX_DATA (Section 8.6) for the connection immediately | sending a MAX_DATA (Section 7.6) for the connection immediately | |||
| after completing the handshake. | after completing the handshake. | |||
| idle_timeout (0x0003): The idle timeout is a value in seconds that | idle_timeout (0x0003): The idle timeout is a value in seconds that | |||
| is encoded as an unsigned 16-bit integer. The maximum value is | is encoded as an unsigned 16-bit integer. The maximum value is | |||
| 600 seconds (10 minutes). | 600 seconds (10 minutes). | |||
| A server MUST include the following transport parameters: | ||||
| stateless_reset_token (0x0006): The Stateless Reset Token is used in | ||||
| verifying a stateless reset, see Section 7.9.4. This parameter is | ||||
| a sequence of 16 octets. | ||||
| A client MUST NOT include a stateless reset token. A server MUST | ||||
| treat receipt of a stateless_reset_token transport parameter as a | ||||
| connection error of type TRANSPORT_PARAMETER_ERROR. | ||||
| An endpoint MAY use the following transport parameters: | An endpoint MAY use the following transport parameters: | |||
| initial_max_stream_id_bidi (0x0002): The initial maximum stream ID | initial_max_streams_bidi (0x0002): The initial maximum bidirectional | |||
| parameter contains the initial maximum stream number the peer may | streams parameter contains the initial maximum number of | |||
| initiate for bidirectional streams, encoded as an unsigned 32-bit | application-owned bidirectional streams the peer may initiate, | |||
| integer. This value MUST be a valid bidirectional stream ID for a | encoded as an unsigned 16-bit integer. If this parameter is | |||
| peer-initiated stream (that is, the two least significant bits are | absent or zero, application-owned bidirectional streams cannot be | |||
| set to 0 by a server and to 1 by a client). If an invalid value | created until a MAX_STREAM_ID frame is sent. Note that a value of | |||
| is provided, the recipient MUST generate a connection error of | 0 does not prevent the cryptographic handshake stream (that is, | |||
| type TRANSPORT_PARAMETER_ERROR. Setting this parameter is | stream 0) from being used. Setting this parameter is equivalent | |||
| equivalent to sending a MAX_STREAM_ID (Section 8.8) immediately | to sending a MAX_STREAM_ID (Section 7.8) immediately after | |||
| after completing the handshake. The maximum bidirectional stream | completing the handshake containing the corresponding Stream ID. | |||
| ID is set to 0 if this parameter is absent, preventing the | For example, a value of 0x05 would be equivalent to receiving a | |||
| creation of new bidirectional streams until a MAX_STREAM_ID frame | MAX_STREAM_ID containing 20 when received by a client or 17 when | |||
| is sent. Note that a default value of 0 does not prevent the | received by a server. | |||
| cryptographic handshake stream (that is, stream 0) from being | ||||
| used. | ||||
| initial_max_stream_id_uni (0x0008): The initial maximum stream ID | ||||
| parameter contains the initial maximum stream number the peer may | ||||
| initiate for unidirectional streams, encoded as an unsigned 32-bit | ||||
| integer. The value MUST be a valid unidirectional ID for the | ||||
| recipient (that is, the two least significant bits are set to 2 by | ||||
| a server and to 3 by a client). If an invalid value is provided, | ||||
| the recipient MUST generate a connection error of type | ||||
| TRANSPORT_PARAMETER_ERROR. Setting this parameter is equivalent | ||||
| to sending a MAX_STREAM_ID (Section 8.8) immediately after | ||||
| completing the handshake. The maximum unidirectional stream ID is | ||||
| set to 0 if this parameter is absent, preventing the creation of | ||||
| new unidirectional streams until a MAX_STREAM_ID frame is sent. | ||||
| omit_connection_id (0x0004): The omit connection identifier | initial_max_stream_id_uni (0x0008): The initial maximum | |||
| parameter indicates that packets sent to the endpoint that | unidirectional streams parameter contains the initial maximum | |||
| advertises this parameter MAY omit the connection ID in packets | number of application-owned unidirectional streams the peer may | |||
| using short header format. This can be used by an endpoint where | initiate, encoded as an unsigned 16-bit integer. If this | |||
| it knows that source and destination IP address and port are | parameter is absent or zero, unidirectional streams cannot be | |||
| sufficient for it to identify a connection. This parameter is | created until a MAX_STREAM_ID frame is sent. Setting this | |||
| zero length. Absence of this parameter means that the connection | parameter is equivalent to sending a MAX_STREAM_ID (Section 7.8) | |||
| ID MUST be present in every packet sent to this endpoint. | immediately after completing the handshake containing the | |||
| corresponding Stream ID. For example, a value of 0x05 would be | ||||
| equivalent to receiving a MAX_STREAM_ID containing 18 when | ||||
| received by a client or 19 when received by a server. | ||||
| max_packet_size (0x0005): The maximum packet size parameter places a | max_packet_size (0x0005): The maximum packet size parameter places a | |||
| limit on the size of packets that the endpoint is willing to | limit on the size of packets that the endpoint is willing to | |||
| receive, encoded as an unsigned 16-bit integer. This indicates | receive, encoded as an unsigned 16-bit integer. This indicates | |||
| that packets larger than this limit will be dropped. The default | that packets larger than this limit will be dropped. The default | |||
| for this parameter is the maximum permitted UDP payload of 65527. | for this parameter is the maximum permitted UDP payload of 65527. | |||
| Values below 1200 are invalid. This limit only applies to | Values below 1200 are invalid. This limit only applies to | |||
| protected packets (Section 5.5). | protected packets (Section 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 8.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, | |||
| Handshake, and Retry packets. Values above 20 are invalid. | Handshake, and Retry packets. Values above 20 are invalid. | |||
| 7.4.2. Values of Transport Parameters for 0-RTT | A server MAY include the following transport parameters: | |||
| stateless_reset_token (0x0006): The Stateless Reset Token is used in | ||||
| verifying a stateless reset, see Section 6.9.4. This parameter is | ||||
| a sequence of 16 octets. | ||||
| A client MUST NOT include a stateless reset token. A server MUST | ||||
| treat receipt of a stateless_reset_token transport parameter as a | ||||
| connection error of type TRANSPORT_PARAMETER_ERROR. | ||||
| 6.4.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 30, line 39 ¶ | skipping to change at page 31, line 21 ¶ | |||
| Omitting or setting a zero value for certain transport parameters can | Omitting or setting a zero value for certain transport parameters can | |||
| result in 0-RTT data being enabled, but not usable. The following | result in 0-RTT data being enabled, but not usable. The following | |||
| transport parameters SHOULD be set to non-zero values for 0-RTT: | transport parameters SHOULD be set to non-zero values for 0-RTT: | |||
| initial_max_stream_id_bidi, initial_max_stream_id_uni, | initial_max_stream_id_bidi, initial_max_stream_id_uni, | |||
| initial_max_data, initial_max_stream_data. | initial_max_data, initial_max_stream_data. | |||
| A server MUST reject 0-RTT data or even abort a handshake if the | A server MUST reject 0-RTT data or even abort a handshake if the | |||
| implied values for transport parameters cannot be supported. | implied values for transport parameters cannot be supported. | |||
| 7.4.3. New Transport Parameters | 6.4.3. New Transport Parameters | |||
| New transport parameters can be used to negotiate new protocol | New transport parameters can be used to negotiate new protocol | |||
| behavior. An endpoint MUST ignore transport parameters that it does | behavior. An endpoint MUST ignore transport parameters that it does | |||
| not support. Absence of a transport parameter therefore disables any | not support. Absence of a transport parameter therefore disables any | |||
| optional protocol feature that is negotiated using the parameter. | optional protocol feature that is negotiated using the parameter. | |||
| New transport parameters can be registered according to the rules in | New transport parameters can be registered according to the rules in | |||
| Section 14.1. | Section 13.1. | |||
| 7.4.4. Version Negotiation Validation | 6.4.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 7.2). | retroactively authenticate the choice of version (see Section 6.2). | |||
| The cryptographic handshake provides integrity protection for the | The cryptographic handshake provides integrity protection for the | |||
| negotiated version as part of the transport parameters (see | negotiated version as part of the transport parameters (see | |||
| Section 7.4). As a result, attacks on version negotiation by an | Section 6.4). 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 5.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 | |||
| initial_version value. | initial_version value. | |||
| A server that does not maintain state for every packet it receives | A server that does not maintain state for every packet it receives | |||
| (i.e., a stateless server) uses a different process. If the | (i.e., a stateless server) uses a different process. If the | |||
| initial_version matches the version of QUIC that is in use, a | initial_version matches the version of QUIC that is in use, a | |||
| stateless server can accept the value. | stateless server can accept the value. | |||
| skipping to change at page 32, line 6 ¶ | skipping to change at page 32, line 34 ¶ | |||
| The negotiated_version field is the version that is in use. This | The negotiated_version field is the version that is in use. This | |||
| MUST be set by the server to the value that is on the Initial packet | MUST be set by the server to the value that is on the Initial packet | |||
| that it accepts (not an Initial packet that triggers a Retry or | that it accepts (not an Initial packet that triggers a Retry or | |||
| Version Negotiation packet). A client that receives a | Version Negotiation packet). A client that receives a | |||
| negotiated_version that does not match the version of QUIC that is in | negotiated_version that does not match the version of QUIC that is in | |||
| use MUST terminate the connection with a VERSION_NEGOTIATION_ERROR | use MUST terminate the connection with a VERSION_NEGOTIATION_ERROR | |||
| error code. | error code. | |||
| The server includes a list of versions that it would send in any | The server includes a list of versions that it would send in any | |||
| version negotiation packet (Section 5.3) in the supported_versions | version negotiation packet (Section 4.3) in the supported_versions | |||
| field. The server populates this field even if it did not send a | field. The server populates this field even if it did not send a | |||
| version negotiation packet. | version negotiation packet. | |||
| The client validates that the negotiated_version is included in the | The client validates that the negotiated_version is included in the | |||
| supported_versions list and - if version negotiation was performed - | supported_versions list and - if version negotiation was performed - | |||
| that it would have selected the negotiated version. A client MUST | that it would have selected the negotiated version. A client MUST | |||
| terminate the connection with a VERSION_NEGOTIATION_ERROR error code | terminate the connection with a VERSION_NEGOTIATION_ERROR error code | |||
| if the current QUIC version is not listed in the supported_versions | if the current QUIC version is not listed in the supported_versions | |||
| list. A client MUST terminate with a VERSION_NEGOTIATION_ERROR error | list. A client MUST terminate with a VERSION_NEGOTIATION_ERROR error | |||
| code if version negotiation occurred but it would have selected a | code if version negotiation occurred but it would have selected a | |||
| skipping to change at page 32, line 29 ¶ | skipping to change at page 33, line 8 ¶ | |||
| When an endpoint accepts multiple QUIC versions, it can potentially | When an endpoint accepts multiple QUIC versions, it can potentially | |||
| interpret transport parameters as they are defined by any of the QUIC | interpret transport parameters as they are defined by any of the QUIC | |||
| versions it supports. The version field in the QUIC packet header is | versions it supports. The version field in the QUIC packet header is | |||
| authenticated using transport parameters. The position and the | authenticated using transport parameters. The position and the | |||
| format of the version fields in transport parameters MUST either be | format of the version fields in transport parameters MUST either be | |||
| identical across different QUIC versions, or be unambiguously | identical across different QUIC versions, or be unambiguously | |||
| different to ensure no confusion about their interpretation. One way | different to ensure no confusion about their interpretation. One way | |||
| that a new format could be introduced is to define a TLS extension | that a new format could be introduced is to define a TLS extension | |||
| with a different codepoint. | with a different codepoint. | |||
| 7.5. Stateless Retries | 6.5. Stateless Retries | |||
| A server can process an initial cryptographic handshake messages from | A server can process an initial cryptographic handshake messages from | |||
| a client without committing any state. This allows a server to | a client without committing any state. This allows a server to | |||
| perform address validation (Section 7.6, or to defer connection | perform address validation (Section 6.6, or to defer connection | |||
| establishment costs. | establishment costs. | |||
| A server that generates a response to an initial packet without | A server that generates a response to an initial packet without | |||
| retaining connection state MUST use the Retry packet (Section 5.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 reset its transport state and to | |||
| continue the connection attempt with new connection state while | continue the connection attempt with new connection state while | |||
| maintaining the state of the cryptographic handshake. | maintaining the state of the cryptographic handshake. | |||
| A server MUST NOT send multiple Retry packets in response to a client | A server MUST NOT send multiple Retry packets in response to a client | |||
| handshake packet. Thus, any cryptographic handshake message that is | handshake packet. Thus, any cryptographic handshake message that is | |||
| sent MUST fit within a single packet. | sent MUST fit within a single packet. | |||
| In TLS, the Retry packet type is used to carry the HelloRetryRequest | In TLS, the Retry packet type is used to carry the HelloRetryRequest | |||
| message. | message. | |||
| 7.6. Proof of Source Address Ownership | 6.6. Proof of Source Address Ownership | |||
| Transport protocols commonly spend a round trip checking that a | Transport protocols commonly spend a round trip checking that a | |||
| client owns the transport address (IP and port) that it claims. | client owns the transport address (IP and port) that it claims. | |||
| Verifying that a client can receive packets sent to its claimed | Verifying that a client can receive packets sent to its claimed | |||
| transport address protects against spoofing of this information by | transport address protects against spoofing of this information by | |||
| malicious clients. | malicious clients. | |||
| This technique is used primarily to avoid QUIC from being used for | This technique is used primarily to avoid QUIC from being used for | |||
| 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 | |||
| skipping to change at page 33, line 45 ¶ | skipping to change at page 34, line 20 ¶ | |||
| To send additional data prior to completing the cryptographic | To send additional data prior to completing the cryptographic | |||
| handshake, the server then needs to validate that the client owns the | handshake, the server then needs to validate that the client owns the | |||
| address that it claims. | address that it claims. | |||
| Source address validation is therefore performed during the | Source address validation is therefore performed during the | |||
| establishment of a connection. TLS provides the tools that support | establishment of a connection. TLS provides the tools that support | |||
| the feature, but basic validation is performed by the core transport | the feature, but basic validation is performed by the core transport | |||
| protocol. | protocol. | |||
| A different type of source address validation is performed after a | A different type of source address validation is performed after a | |||
| connection migration, see Section 7.7.2. | connection migration, see Section 6.7. | |||
| 7.6.1. Client Address Validation Procedure | 6.6.1. Client Address Validation Procedure | |||
| QUIC uses token-based address validation. Any time the server wishes | QUIC uses token-based address validation. Any time the server wishes | |||
| to validate a client address, it provides the client with a token. | to validate a client address, it provides the client with a token. | |||
| As long as the token cannot be easily guessed (see Section 7.6.3), if | As long as the token cannot be easily guessed (see Section 6.6.3), if | |||
| the client is able to return that token, it proves to the server that | the client is able to return that token, it proves to the server that | |||
| it received the token. | it received the token. | |||
| During the processing of the cryptographic handshake messages from a | During the processing of the cryptographic handshake messages from a | |||
| client, TLS will request that QUIC make a decision about whether to | client, TLS will request that QUIC make a decision about whether to | |||
| proceed based on the information it has. TLS will provide QUIC with | proceed based on the information it has. TLS will provide QUIC with | |||
| any token that was provided by the client. For an initial packet, | any token that was provided by the client. For an initial packet, | |||
| QUIC can decide to abort the connection, allow it to proceed, or | QUIC can decide to abort the connection, allow it to proceed, or | |||
| request address validation. | request address validation. | |||
| skipping to change at page 34, line 36 ¶ | skipping to change at page 35, line 11 ¶ | |||
| asks QUIC a second time whether the token is acceptable. In | asks QUIC a second time whether the token is acceptable. In | |||
| response, QUIC can either abort the connection or permit it to | response, QUIC can either abort the connection or permit it to | |||
| proceed. | proceed. | |||
| A connection MAY be accepted without address validation - or with | A connection MAY be accepted without address validation - or with | |||
| only limited validation - but a server SHOULD limit the data it sends | only limited validation - but a server SHOULD limit the data it sends | |||
| toward an unvalidated address. Successful completion of the | toward an unvalidated address. Successful completion of the | |||
| cryptographic handshake implicitly provides proof that the client has | cryptographic handshake implicitly provides proof that the client has | |||
| received packets from the server. | received packets from the server. | |||
| 7.6.2. Address Validation on Session Resumption | 6.6.2. Address Validation on Session Resumption | |||
| A server MAY provide clients with an address validation token during | A server MAY provide clients with an address validation token during | |||
| one connection that can be used on a subsequent connection. Address | one connection that can be used on a subsequent connection. Address | |||
| validation is especially important with 0-RTT because a server | validation is especially important with 0-RTT because a server | |||
| potentially sends a significant amount of data to a client in | potentially sends a significant amount of data to a client in | |||
| response to 0-RTT data. | response to 0-RTT data. | |||
| A different type of token is needed when resuming. Unlike the token | A different type of token is needed when resuming. Unlike the token | |||
| that is created during a handshake, there might be some time between | that is created during a handshake, there might be some time between | |||
| when the token is created and when the token is subsequently used. | when the token is created and when the token is subsequently used. | |||
| Thus, a resumption token SHOULD include an expiration time. It is | Thus, a resumption token SHOULD include an expiration time. It is | |||
| also unlikely that the client port number is the same on two | also unlikely that the client port number is the same on two | |||
| different connections; validating the port is therefore unlikely to | different connections; validating the port is therefore unlikely to | |||
| be successful. | be successful. | |||
| This token can be provided to the cryptographic handshake immediately | This token can be provided to the cryptographic handshake immediately | |||
| after establishing a connection. QUIC might also generate an updated | after establishing a connection. QUIC might also generate an updated | |||
| token if significant time passes or the client address changes for | token if significant time passes or the client address changes for | |||
| any reason (see Section 7.7). The cryptographic handshake is | any reason (see Section 6.8). The cryptographic handshake is | |||
| responsible for providing the client with the token. In TLS the | responsible for providing the client with the token. In TLS the | |||
| token is included in the ticket that is used for resumption and | token is included in the ticket that is used for resumption and | |||
| 0-RTT, which is carried in a NewSessionTicket message. | 0-RTT, which is carried in a NewSessionTicket message. | |||
| 7.6.3. Address Validation Token Integrity | 6.6.3. Address Validation Token Integrity | |||
| An address validation token MUST be difficult to guess. Including a | An address validation token MUST be difficult to guess. Including a | |||
| large enough random value in the token would be sufficient, but this | large enough random value in the token would be sufficient, but this | |||
| depends on the server remembering the value it sends to clients. | depends on the server remembering the value it sends to clients. | |||
| A token-based scheme allows the server to offload any state | A token-based scheme allows the server to offload any state | |||
| associated with validation to the client. For this design to work, | associated with validation to the client. For this design to work, | |||
| the token MUST be covered by integrity protection against | the token MUST be covered by integrity protection against | |||
| modification or falsification by clients. Without integrity | modification or falsification by clients. Without integrity | |||
| protection, malicious clients could generate or guess values for | protection, malicious clients could generate or guess values for | |||
| skipping to change at page 35, line 37 ¶ | skipping to change at page 36, line 10 ¶ | |||
| In TLS the address validation token is often bundled with the | In TLS the address validation token is often bundled with the | |||
| information that TLS requires, such as the resumption secret. In | information that TLS requires, such as the resumption secret. In | |||
| this case, adding integrity protection can be delegated to the | this case, adding integrity protection can be delegated to the | |||
| cryptographic handshake protocol, avoiding redundant protection. If | cryptographic handshake protocol, avoiding redundant protection. If | |||
| integrity protection is delegated to the cryptographic handshake, an | integrity protection is delegated to the cryptographic handshake, an | |||
| integrity failure will result in immediate cryptographic handshake | integrity failure will result in immediate cryptographic handshake | |||
| failure. If integrity protection is performed by QUIC, QUIC MUST | failure. If integrity protection is performed by QUIC, QUIC MUST | |||
| abort the connection if the integrity check fails with a | abort the connection if the integrity check fails with a | |||
| PROTOCOL_VIOLATION error code. | PROTOCOL_VIOLATION error code. | |||
| 7.7. Connection Migration | 6.7. Path Validation | |||
| QUIC connections are identified by their 64-bit Connection ID. | Path validation is used by an endpoint to verify reachability of a | |||
| QUIC's consistent connection ID allows connections to survive changes | peer over a specific path. That is, it tests reachability between a | |||
| to the client's IP and/or port, such as those caused by client or | specific local address and a specific peer address, where an address | |||
| server migrating to a new network. Connection migration allows a | is the two-tuple of IP address and port. Path validation tests that | |||
| client to retain any shared state with a connection when they move | packets can be both sent to and received from a peer. | |||
| networks. This includes state that can be hard to recover such as | ||||
| outstanding requests, which might otherwise be lost with no easy way | ||||
| to retry them. | ||||
| An endpoint that receives packets that contain a source IP address | Path validation is used during connection migration (see Section 6.8) | |||
| and port that has not yet been used can start sending new packets | by the migrating endpoint to verify reachability of a peer from a new | |||
| with those as a destination IP address and port. Packets exchanged | local address. Path validation is also used by the peer to verify | |||
| between endpoints can then follow the new path. | that the migrating endpoint is able to receive packets sent to its | |||
| new address. That is, that the packets received from the migrating | ||||
| endpoint do not carry a spoofed source address. | ||||
| Due to variations in path latency or packet reordering, packets from | Path validation can be used at any time by either endpoint. For | |||
| different source addresses might be reordered. The packet with the | instance, an endpoint might check that a peer is still in possession | |||
| highest packet number MUST be used to determine which path to use. | of its address after a period of quiescence. | |||
| Endpoints also need to be prepared to receive packets from an older | ||||
| source address. | ||||
| An endpoint MUST validate that its peer can receive packets at the | Path validation is not designed as a NAT traversal mechanism. Though | |||
| new address before sending any significant quantity of data to that | the mechanism described here might be effective for the creation of | |||
| address, or it risks being used for denial of service. See | NAT bindings that support NAT traversal, the expectation is that one | |||
| Section 7.7.2 for details. | or other peer is able to receive packets without first having sent a | |||
| packet on that path. Effective NAT traversal needs additional | ||||
| synchronization mechanisms that are not provided here. | ||||
| 7.7.1. Privacy Implications of Connection Migration | An endpoint MAY bundle PATH_CHALLENGE and PATH_RESPONSE frames that | |||
| are used for path validation with other frames. For instance, an | ||||
| endpoint may pad a packet carrying a PATH_CHALLENGE for PMTU | ||||
| discovery, or an endpoint may bundle a PATH_RESPONSE with its own | ||||
| PATH_CHALLENGE. | ||||
| Using a stable connection ID on multiple network paths allows a | 6.7.1. Initiation | |||
| passive observer to correlate activity between those paths. A client | ||||
| that moves between networks might not wish to have their activity | ||||
| correlated by any entity other than a server. The NEW_CONNECTION_ID | ||||
| message can be sent by a server to provide an unlinkable connection | ||||
| ID for use in case the client wishes to explicitly break linkability | ||||
| between two points of network attachment. | ||||
| A client might need to send packets on multiple networks without | To initiate path validation, an endpoint sends a PATH_CHALLENGE frame | |||
| receiving any response from the server. To ensure that the client is | containing a random payload on the path to be validated. | |||
| not linkable across each of these changes, a new connection ID and | ||||
| packet number gap are needed for each network. To support this, a | ||||
| server sends multiple NEW_CONNECTION_ID messages. Each | ||||
| NEW_CONNECTION_ID is marked with a sequence number. Connection IDs | ||||
| MUST be used in the order in which they are numbered. | ||||
| A client which wishes to break linkability upon changing networks | An endpoint MAY send additional PATH_CHALLENGE frames to handle | |||
| MUST use the connection ID provided by the server as well as | packet loss. An endpoint SHOULD NOT send a PATH_CHALLENGE more | |||
| incrementing the packet sequence number by an externally | frequently than it would an Initial packet, ensuring that connection | |||
| unpredictable value computed as described in Section 7.7.1.1. Packet | migration is no more load on a new path than establishing a new | |||
| number gaps are cumulative. A client might skip connection IDs, but | connection. | |||
| it MUST ensure that it applies the associated packet number gaps for | ||||
| connection IDs that it skips in addition to the packet number gap | ||||
| associated with the connection ID that it does use. | ||||
| A server that receives a packet that is marked with a new connection | The endpoint MUST use fresh random data in every PATH_CHALLENGE frame | |||
| ID recovers the packet number by adding the cumulative packet number | so that it can associate the peer's response with the causative | |||
| gap to its expected packet number. A server SHOULD discard packets | PATH_CHALLENGE. | |||
| that contain a smaller gap than it advertised. | ||||
| For instance, a server might provide a packet number gap of 7 | 6.7.2. Response | |||
| associated with a new connection ID. If the server received packet | ||||
| 10 using the previous connection ID, it should expect packets on the | ||||
| new connection ID to start at 18. A packet with the new connection | ||||
| ID and a packet number of 17 is discarded as being in error. | ||||
| 7.7.1.1. Packet Number Gap | On receiving a PATH_CHALLENGE frame, an endpoint MUST respond | |||
| immediately by echoing the data contained in the PATH_CHALLENGE frame | ||||
| in a PATH_RESPONSE frame, with the following stipulation. Since a | ||||
| PATH_CHALLENGE might be sent from a spoofed address, an endpoint MAY | ||||
| limit the rate at which it sends PATH_RESPONSE frames and MAY | ||||
| silently discard PATH_CHALLENGE frames that would cause it to respond | ||||
| at a higher rate. | ||||
| In order to avoid linkage, the packet number gap MUST be externally | To ensure that packets can be both sent to and received from the | |||
| indistinguishable from random. The packet number gap for a | peer, the PATH_RESPONSE MUST be sent on the same path as the | |||
| connection ID with sequence number is computed by encoding the | triggering PATH_CHALLENGE: from the same local address on which the | |||
| sequence number as a 32-bit integer in big-endian format, and then | PATH_CHALLENGE was received, to the same remote address from which | |||
| computing: | the PATH_CHALLENGE was received. | |||
| Gap = HKDF-Expand-Label(packet_number_secret, | 6.7.3. Completion | |||
| "QUIC packet sequence gap", sequence, 4) | ||||
| The output of HKDF-Expand-Label is interpreted as a big-endian | A new address is considered valid when a PATH_RESPONSE frame is | |||
| number. "packet_number_secret" is derived from the TLS key exchange, | received containing data that was sent in a previous PATH_CHALLENGE. | |||
| as described in Section 5.6 of [QUIC-TLS]. | Receipt of an acknowledgment for a packet containing a PATH_CHALLENGE | |||
| frame is not adequate validation, since the acknowledgment can be | ||||
| spoofed by a malicious peer. | ||||
| 7.7.2. Address Validation for Migrated Connections | For path validation to be successful, a PATH_RESPONSE frame MUST be | |||
| received from the same remote address to which the corresponding | ||||
| PATH_CHALLENGE was sent. If a PATH_RESPONSE frame is received from a | ||||
| different remote address than the one to which the PATH_CHALLENGE was | ||||
| sent, path validation is considered to have failed, even if the data | ||||
| matches that sent in the PATH_CHALLENGE. | ||||
| An endpoint that receives a packet from a new remote IP address and | Additionally, the PATH_RESPONSE frame MUST be received on the same | |||
| port (or just a new remote port) on packets from its peer is likely | local address from which the corresponding PATH_CHALLENGE was sent. | |||
| seeing a connection migration at the peer. | If a PATH_RESPONSE frame is received on a different local address | |||
| 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 | ||||
| the PATH_CHALLENGE. Thus, the endpoint considers the path to be | ||||
| valid when a PATH_RESPONSE frame is received on the same path with | ||||
| the same payload as the PATH_CHALLENGE frame. | ||||
| However, it is also possible that the peer is spoofing its source | 6.7.4. Abandonment | |||
| address in order to cause the endpoint to send excessive amounts of | ||||
| data to an unwilling host. If the endpoint sends significantly more | ||||
| data than the peer, connection migration might be used to amplify the | ||||
| volume of data that an attacker can generate toward a victim. | ||||
| Thus, when seeing a new remote transport address, an endpoint MUST | An endpoint SHOULD abandon path validation after sending some number | |||
| verify that its peer can receive and respond to packets at that new | of PATH_CHALLENGE frames or after some time has passed. When setting | |||
| address. By providing copies of the data that it receives, the peer | this timer, implementations are cautioned that the new path could | |||
| proves that it is receiving packets at the new address and consents | have a longer round-trip time than the original. | |||
| to receive data. | ||||
| Prior to validating the new remote address, and endpoint MUST limit | Note that the endpoint might receive packets containing other frames | |||
| the amount of data and packets that it sends to its peer. At a | on the new path, but a PATH_RESPONSE frame with appropriate data is | |||
| minimum, this needs to consider the possibility that packets are sent | required for path validation to succeed. | |||
| without congestion feedback. | ||||
| Once a connection is established, address validation is relatively | If path validation fails, the path is deemed unusable. This does not | |||
| simple (see Section 7.6 for the process that is used during the | necessarily imply a failure of the connection - endpoints can | |||
| handshake). An endpoint validates a remote address by sending a | continue sending packets over other paths as appropriate. If no | |||
| PATH_CHALLENGE frame containing a payload that is hard to guess. | paths are available, an endpoint can wait for a new path to become | |||
| This frame MUST be sent in a packet that is sent to the new address. | available or close the connection. | |||
| Once a PATH_RESPONSE frame containing the same payload is received, | ||||
| the address is considered to be valid. | ||||
| The new address is not considered valid until a PATH_RESPONSE frame | A path validation might be abandoned for other reasons besides | |||
| containing the same payload is received, even if the packet | failure. Primarily, this happens if a connection migration to a new | |||
| containing the PATH_CHALLENGE frame is acknowledged. | path is initiated while a path validation on the old path is in | |||
| progress. | ||||
| The PATH_RESPONSE frame can use any path on its return. | 6.8. Connection Migration | |||
| An endpoint MAY send multiple PATH_CHALLENGE frames to handle packet | QUIC allows connections to survive changes to endpoint addresses | |||
| loss or to make additional measurements on a new network path. | (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 | ||||
| which an endpoint migrates to a new address. | ||||
| An endpoint MUST use fresh random data in every PATH_CHALLENGE frame | An endpoint MUST NOT initiate connection migration before the | |||
| so that it can associate the peer's response with the causative | handshake is finished and the endpoint has 1-RTT keys. | |||
| PATH_CHALLENGE. | ||||
| If the PATH_CHALLENGE frame is determined to be lost, a new | This document limits migration of connections to new client | |||
| PATH_CHALLENGE frame SHOULD be generated. This PATH_CHALLENGE frame | addresses. Clients are responsible for initiating all migrations. | |||
| MUST include new data that is similarly difficult to guess. | Servers do not send non-probing packets (see Section 6.8.1) toward a | |||
| client address until it sees a non-probing packet from that address. | ||||
| If a client receives packets from an unknown server address, the | ||||
| client MAY discard these packets. Migrating a connection to a new | ||||
| server address is left for future work. | ||||
| If validation of the new remote address fails, after allowing enough | 6.8.1. Probing a New Path | |||
| time for recovering from possible loss of packets carrying | ||||
| PATH_CHALLENGE and PATH_RESPONSE frames, the endpoint MUST terminate | ||||
| the connection. When setting this timer, implementations are | ||||
| cautioned that the new path could have a longer round trip time than | ||||
| the original. The endpoint MUST NOT send a CONNECTION_CLOSE frame in | ||||
| this case; it has to assume that the remote peer cannot want to | ||||
| receive any more packets. | ||||
| If the remote address is validated successfully, the endpoint MAY | An endpoint MAY probe for peer reachability from a new local address | |||
| increase the rate that it sends on the new path using the state from | using path validation Section 6.7 prior to migrating the connection | |||
| the previous path. The capacity available on the new path might not | to the new local address. Failure of path validation simply means | |||
| be the same as the old path. An endpoint MUST NOT restore its send | that the new path is not usable for this connection. Failure to | |||
| rate unless it is reasonably sure that the path is the same as the | validate a path does not cause the connection to end unless there are | |||
| previous path. For instance, a change in only port number is likely | no valid alternative paths available. | |||
| indicative of a rebinding in a middlebox and not a complete change in | ||||
| path. This determination likely depends on heuristics, which could | ||||
| be imperfect; if the new path capacity is significantly reduced, | ||||
| ultimately this relies on the congestion controller responding to | ||||
| congestion signals and reduce send rates appropriately. | ||||
| After verifying an address, the endpoint SHOULD update any address | An endpoint uses a new connection ID for probes sent from a new local | |||
| validation tokens (Section 7.6) that it has issued to its peer if | address, see Section 6.8.5 for further discussion. | |||
| those are no longer valid based on the changed address. | ||||
| Address validation using the PATH_CHALLENGE frame MAY be used at any | Receiving a PATH_CHALLENGE frame from a peer indicates that the peer | |||
| time by either peer. For instance, an endpoint might check that a | is probing for reachability on a path. An endpoint sends a | |||
| peer is still in possession of its address after a period of | PATH_RESPONSE in response as per Section 6.7. | |||
| quiescence. | ||||
| Upon seeing a connection migration, an endpoint that sees a new | PATH_CHALLENGE, PATH_RESPONSE, and PADDING frames are "probing | |||
| address MUST abandon any address validation it is performing with | frames", and all other frames are "non-probing frames". A packet | |||
| other addresses on the expectation that the validation is likely to | containing only probing frames is a "probing packet", and a packet | |||
| fail. Abandoning address validation primarily means not closing the | containing any other frame is a "non-probing packet". | |||
| connection when a PATH_RESPONSE frame is not received, but it could | ||||
| also mean ceasing subsequent transmissions of the PATH_CHALLENGE | ||||
| frame. An endpoint MUST ignore any subsequently received | ||||
| PATH_RESPONSE frames from that address. | ||||
| 7.8. Spurious Connection Migrations | 6.8.2. Initiating Connection Migration | |||
| A connection migration could be triggered by an attacker that is able | A endpoint can migrate a connection to a new local address by sending | |||
| to capture and forward a packet such that it arrives before the | packets containing frames other than probing frames from that | |||
| legitimate copy of that packet. Such a packet will appear to be a | address. | |||
| legitimate connection migration and the legitimate copy will be | ||||
| dropped as a duplicate. | ||||
| After a spurious migration, validation of the source address will | Each endpoint validates its peer's address during connection | |||
| fail because the entity at the source address does not have the | establishment. Therefore, a migrating endpoint can send to its peer | |||
| necessary cryptographic keys to read or respond to the PATH_CHALLENGE | knowing that the peer is willing to receive at the peer's current | |||
| frame that is sent to it, even if it wanted to. Such a spurious | address. Thus an endpoint can migrate to a new local address without | |||
| connection migration could result in the connection being dropped | first validating the peer's address. | |||
| when the source address validation fails. This grants an attacker | ||||
| the ability to terminate the connection. | ||||
| Receipt of packets with higher packet numbers from the legitimate | When migrating, the new path might not support the endpoint's current | |||
| address will trigger another connection migration. This will cause | sending rate. Therefore, the endpoint resets its congestion | |||
| the validation of the address of the spurious migration to be | controller, as described in Section 6.8.4. | |||
| abandoned. | ||||
| To ensure that a peer sends packets from the legitimate address | Receiving acknowledgments for data sent on the new path serves as | |||
| before the validation of the new address can fail, an endpoint SHOULD | proof of the peer's reachability from the new address. Note that | |||
| attempt to validate the old remote address before attempting to | since acknowledgments may be received on any path, return | |||
| validate the new address. If the connection migration is spurious, | reachability on the new path is not established. To establish return | |||
| then the legitimate address will be used to respond and the | reachability on the new path, an endpoint MAY concurrently initiate | |||
| connection will migrate back to the old address. | path validation Section 6.7 on the new path. | |||
| As with any address validation, packets containing a PATH_CHALLENGE | 6.8.3. Responding to Connection Migration | |||
| frame validating an address MUST be sent to the address being | ||||
| validated. Consequently, during a migration of a peer, an endpoint | ||||
| could be sending to multiple remote addresses. | ||||
| An endpoint MAY abandon address validation for an address that it | Receiving a packet from a new peer address containing a non-probing | |||
| considers to be already valid. That is, if successive connection | frame indicates that the peer has migrated to that address. | |||
| migrations occur in quick succession with the final remote address | ||||
| being identical to the initial remote address, the endpoint MAY | ||||
| abandon address validation for that address. | ||||
| 7.9. Connection Termination | In response to such a packet, an endpoint MUST start sending | |||
| subsequent packets to the new peer address and MUST initiate path | ||||
| validation (Section 6.7) to verify the peer's ownership of the | ||||
| unvalidated address. | ||||
| 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 | ||||
| Section 6.8.3.2. An endpoint MAY skip validation of a peer address | ||||
| if that address has been seen recently. | ||||
| An endpoint only changes the address that it sends packets to in | ||||
| response to the highest-numbered non-probing packet. This ensures | ||||
| that an endpoint does not send packets to an old peer address in the | ||||
| case that it receives reordered packets. | ||||
| After changing the address to which it sends non-probing packets, an | ||||
| endpoint could abandon any path validation for other addresses. | ||||
| Receiving a packet from a new peer address might be the result of a | ||||
| NAT rebinding at the peer. | ||||
| After verifying a new client address, the server SHOULD send new | ||||
| address validation tokens (Section 6.6) to the client. | ||||
| 6.8.3.1. Handling Address Spoofing by a Peer | ||||
| 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 | ||||
| the endpoint sends significantly more data than the spoofing peer, | ||||
| connection migration might be used to amplify the volume of data that | ||||
| an attacker can generate toward a victim. | ||||
| As described in Section 6.8.3, an endpoint is required to validate a | ||||
| 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 | ||||
| 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 | ||||
| per estimated round-trip time (kMinimumWindow, as defined in | ||||
| [QUIC-RECOVERY]). In the absence of this limit, an endpoint risks | ||||
| being used for a denial of service attack against an unsuspecting | ||||
| victim. Note that since the endpoint will not have any round-trip | ||||
| time measurements to this address, the estimate SHOULD be the default | ||||
| initial value (see [QUIC-RECOVERY]). | ||||
| 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. | ||||
| 6.8.3.2. Handling Address Spoofing by an On-path Attacker | ||||
| An on-path attacker could cause a spurious connection migration by | ||||
| copying and forwarding a packet with a spoofed address such that it | ||||
| arrives before the original packet. The packet with the spoofed | ||||
| address will be seen to come from a migrating connection, and the | ||||
| original packet will be seen as a duplicate and dropped. After a | ||||
| spurious migration, validation of the source address will fail | ||||
| because the entity at the source address does not have the necessary | ||||
| cryptographic keys to read or respond to the PATH_CHALLENGE frame | ||||
| that is sent to it even if it wanted to. | ||||
| To protect the connection from failing due to such a spurious | ||||
| migration, an endpoint MUST revert to using the last validated peer | ||||
| address when validation of a new peer address fails. | ||||
| If an endpoint has no state about the last validated peer address, it | ||||
| MUST close the connection silently by discarding all connection | ||||
| state. This results in new packets on the connection being handled | ||||
| generically. For instance, an endpoint MAY send a stateless reset in | ||||
| response to any further incoming packets. | ||||
| Note that receipt of packets with higher packet numbers from the | ||||
| legitimate peer address will trigger another connection migration. | ||||
| This will cause the validation of the address of the spurious | ||||
| migration to be abandoned. | ||||
| 6.8.4. Loss Detection and Congestion Control | ||||
| 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 | ||||
| congestion control or RTT estimation for the new path. | ||||
| On confirming a peer's ownership of its new address, an endpoint | ||||
| SHOULD immediately reset the congestion controller and round-trip | ||||
| time estimator for the new path. | ||||
| An endpoint MUST NOT return to the send rate used for the previous | ||||
| path unless it is reasonably sure that the previous send rate is | ||||
| valid for the new path. For instance, a change in the client's port | ||||
| number is likely indicative of a rebinding in a middlebox and not a | ||||
| complete change in path. This determination likely depends on | ||||
| heuristics, which could be imperfect; if the new path capacity is | ||||
| significantly reduced, ultimately this relies on the congestion | ||||
| controller responding to congestion signals and reducing send rates | ||||
| appropriately. | ||||
| There may be apparent reordering at the receiver when an endpoint | ||||
| sends data and probes from/to multiple addresses during the migration | ||||
| period, since the two resulting paths may have different round-trip | ||||
| times. A receiver of packets on multiple paths will still send ACK | ||||
| frames covering all received packets. | ||||
| While multiple paths might be used during connection migration, a | ||||
| single congestion control context and a single loss recovery context | ||||
| (as described in [QUIC-RECOVERY]) may be adequate. A sender can make | ||||
| exceptions for probe packets so that their loss detection is | ||||
| independent and does not unduly cause the congestion controller to | ||||
| reduce its sending rate. An endpoint might arm a separate alarm when | ||||
| 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, the endpoint might send a new | ||||
| PATH_CHALLENGE, and restart the alarm for a longer period of time. | ||||
| 6.8.5. Privacy Implications of Connection Migration | ||||
| Using a stable connection ID on multiple network paths allows a | ||||
| passive observer to correlate activity between those paths. An | ||||
| endpoint that moves between networks might not wish to have their | ||||
| activity correlated by any entity other than a server. The | ||||
| NEW_CONNECTION_ID message can be sent by both endpoints to provide an | ||||
| unlinkable connection ID for use in case a peer wishes to explicitly | ||||
| break linkability between two points of network attachment. | ||||
| 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 and | ||||
| packet number gap are needed for each network. To support this, each | ||||
| endpoint sends multiple NEW_CONNECTION_ID messages. Each | ||||
| NEW_CONNECTION_ID is marked with a sequence number. Connection IDs | ||||
| MUST be used in the order in which they are numbered. | ||||
| 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 which wishes to break linkability upon changing networks | ||||
| MUST use the connection ID provided by its peer as well as | ||||
| incrementing the packet sequence number by an externally | ||||
| unpredictable value computed as described in Section 6.8.5.1. Packet | ||||
| number gaps are cumulative. An endpoint might skip connection IDs, | ||||
| but it MUST ensure that it applies the associated packet number gaps | ||||
| for connection IDs that it skips in addition to the packet number gap | ||||
| associated with the connection ID that it does use. | ||||
| An endpoint that receives a packet that is marked with a new | ||||
| connection ID recovers the packet number by adding the cumulative | ||||
| packet number gap to its expected packet number. An endpoint MUST | ||||
| discard packets that contain a smaller gap than it advertised. | ||||
| Clients MAY change connection ID at any time based on implementation- | ||||
| specific concerns. For example, after a period of network inactivity | ||||
| NAT rebinding might occur when the client begins sending data again. | ||||
| A client might wish to reduce linkability by employing a new | ||||
| connection ID and source UDP port when sending traffic after a period | ||||
| of inactivity. Changing the UDP port from which it sends packets at | ||||
| the same time might cause the packet to appear as a connection | ||||
| migration. This ensures that the mechanisms that support migration | ||||
| are exercised even for clients that don't experience NAT rebindings | ||||
| or genuine migrations. Changing port number can cause a peer to | ||||
| reset its congestion state (see Section 6.8.4), so the port SHOULD | ||||
| only be changed infrequently. | ||||
| An endpoint that receives a successfully authenticated packet with a | ||||
| 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. | ||||
| For instance, a server might provide a packet number gap of 7 | ||||
| associated with a new connection ID. If the server received packet | ||||
| 10 using the previous connection ID, it should expect packets on the | ||||
| new connection ID to start at 18. A packet with the new connection | ||||
| ID and a packet number of 17 is discarded as being in error. | ||||
| 6.8.5.1. Packet Number Gap | ||||
| In order to avoid linkage, the packet number gap MUST be externally | ||||
| indistinguishable from random. The packet number gap for a | ||||
| connection ID with sequence number is computed by encoding the | ||||
| sequence number as a 32-bit integer in big-endian format, and then | ||||
| computing: | ||||
| Gap = HKDF-Expand-Label(packet_number_secret, | ||||
| "QUIC packet sequence gap", sequence, 4) | ||||
| The output of HKDF-Expand-Label is interpreted as a big-endian | ||||
| number. "packet_number_secret" is derived from the TLS key exchange, | ||||
| as described in Section 5.6 of [QUIC-TLS]. | ||||
| 6.9. Connection Termination | ||||
| Connections should remain open until they become idle for a pre- | Connections should remain open until they become idle for a pre- | |||
| negotiated period of time. A QUIC connection, once established, can | negotiated period of time. A QUIC connection, once established, can | |||
| be terminated in one of three ways: | be terminated in one of three ways: | |||
| o idle timeout (Section 7.9.2) | o idle timeout (Section 6.9.2) | |||
| o immediate close (Section 6.9.3) | ||||
| o immediate close (Section 7.9.3) | ||||
| o stateless reset (Section 7.9.4) | o stateless reset (Section 6.9.4) | |||
| 7.9.1. Closing and Draining Connection States | 6.9.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 7.9.3) and optionally after an idle timeout | close (Section 6.9.3). While closing, an endpoint MUST NOT send | |||
| (Section 7.9.2). While closing, an endpoint MUST NOT send packets | packets unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE | |||
| unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE frame | frame (see Section 6.9.3 for details). | |||
| (see Section 7.9.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 41, line 20 ¶ | skipping to change at page 45, line 11 ¶ | |||
| 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 7.9.4) is sent. | (Section 6.9.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 connection migration (Section 7.7), while in the closing | indicating a client connection migration (Section 6.8), while in the | |||
| period. An endpoint in the closing state MUST strictly limit the | closing period. An endpoint in the closing state MUST strictly limit | |||
| number of packets it sends to this new address as though the address | the number of packets it sends to this new address until the address | |||
| were not validated (see Section 7.7.2). A server in the closing | is validated (see Section 6.7). A server in the closing state MAY | |||
| state MAY instead choose to discard packets received from a new | instead choose to discard packets received from a new source address. | |||
| source address. | ||||
| 7.9.2. Idle Timeout | 6.9.2. Idle Timeout | |||
| A connection that remains idle for longer than the idle timeout (see | A connection that remains idle for longer than the idle timeout (see | |||
| Section 7.4.1) is closed. A connection enters the draining state | Section 6.4.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. | |||
| 7.9.3. Immediate Close | 6.9.3. Immediate Close | |||
| An endpoint sends a closing frame, either CONNECTION_CLOSE or | An endpoint sends a closing frame, either CONNECTION_CLOSE or | |||
| APPLICATION_CLOSE, to terminate the connection immediately. Either | APPLICATION_CLOSE, to terminate the connection immediately. Either | |||
| 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 | |||
| skipping to change at page 42, line 40 ¶ | skipping to change at page 46, line 29 ¶ | |||
| An immediate close can be used after an application protocol has | An immediate close can be used after an application protocol has | |||
| arranged to close a connection. This might be after the application | arranged to close a connection. This might be after the application | |||
| protocols negotiates a graceful shutdown. The application protocol | protocols negotiates a graceful shutdown. The application protocol | |||
| exchanges whatever messages that are needed to cause both endpoints | exchanges whatever messages that are needed to cause both endpoints | |||
| to agree to close the connection, after which the application | to agree to close the connection, after which the application | |||
| requests that the connection be closed. The application protocol can | requests that the connection be closed. The application protocol can | |||
| use an APPLICATION_CLOSE message with an appropriate error code to | use an APPLICATION_CLOSE message with an appropriate error code to | |||
| signal closure. | signal closure. | |||
| 7.9.4. Stateless Reset | 6.9.4. Stateless Reset | |||
| A stateless reset is provided as an option of last resort for a | A stateless reset is provided as an option of last resort for a | |||
| server that does not have access to the state of a connection. A | server that does not have access to the state of a connection. A | |||
| server crash or outage might result in clients continuing to send | server crash or outage might result in clients continuing to send | |||
| data to a server that is unable to properly continue the connection. | data to a server that is unable to properly continue the connection. | |||
| A server that wishes to communicate a fatal connection error MUST use | A server that wishes to communicate a fatal connection error MUST use | |||
| a 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, the server sends a stateless_reset_token | |||
| value during the handshake in the transport parameters. This value | value during the handshake in the transport parameters. This value | |||
| is protected by encryption, so only client and server know this | is protected by encryption, so only client and server know this | |||
| value. | value. | |||
| A server that receives packets that it cannot process sends a packet | A server that receives packets that it cannot process sends a packet | |||
| in the following layout: | in the following layout: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |0|C|K|Type (5) | | |0|K| Type (6) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | Destination Connection ID (144) ... | |||
| + [Connection ID (64)] + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) | | | Packet Number (8/16/32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Random Octets (*) ... | | Random Octets (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| A server copies the connection ID field from the packet that triggers | This design ensures that a stateless reset packet is - to the extent | |||
| the stateless reset. A server omits the connection ID if explicitly | possible - indistinguishable from a regular packet with a short | |||
| configured to do so, or if the client packet did not include a | header. | |||
| connection ID. | ||||
| A server generates a random 18-octet Destination Connection ID field. | ||||
| For a client that depends on the server including a connection ID, | ||||
| 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 | ||||
| Connection ID is critical for routing toward the client, then this | ||||
| packet could be incorrectly routed. This causes the stateless | ||||
| reset to be ineffective in causing errors to be quickly detected | ||||
| and recovered. In this case, clients will need to rely on other | ||||
| methods - such as timers - to detect that the connection has | ||||
| failed. | ||||
| o The randomly generated connection ID can be used by entities other | ||||
| than the client to identify this as a potential stateless reset. | ||||
| A server that occasionally uses different connection IDs might | ||||
| introduce some uncertainty about this. | ||||
| The Packet Number field is set to a randomized value. The server | The Packet Number field is set to a randomized value. The server | |||
| SHOULD send a packet with a short header and a type of 0x1F. This | SHOULD send a packet with a short header and a type of 0x1F. This | |||
| produces the shortest possible packet number encoding, which | produces the shortest possible packet number encoding, which | |||
| minimizes the perceived gap between the last packet that the server | minimizes the perceived gap between the last packet that the server | |||
| sent and this packet. A server MAY use a different short header | sent and this packet. A server MAY use a different short header | |||
| type, indicating a different packet number length, but a longer | type, indicating a different packet number length, but a longer | |||
| packet number encoding might allow this message to be identified as a | packet number encoding might allow this message to be identified as a | |||
| stateless reset more easily using heuristics. | stateless reset more easily using heuristics. | |||
| After the Packet Number, the server pads the message with an | After the Packet Number, the server pads the message with an | |||
| arbitrary number of octets containing random values. | 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. | |||
| This design ensures that a stateless reset packet is - to the extent | ||||
| possible - indistinguishable from a regular packet. | ||||
| A stateless reset is not appropriate for signaling error conditions. | A stateless reset is not appropriate for signaling error conditions. | |||
| An endpoint that wishes to communicate a fatal connection error MUST | An endpoint that wishes to communicate a fatal connection error MUST | |||
| use a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has | use a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has | |||
| sufficient state to do so. | sufficient state to do so. | |||
| This stateless reset design is specific to QUIC version 1. A server | This stateless reset design is specific to QUIC version 1. A server | |||
| that supports multiple versions of QUIC needs to generate a stateless | that supports multiple versions of QUIC needs to generate a stateless | |||
| reset that will be accepted by clients that support any version that | reset that will be accepted by clients that support any version that | |||
| the server might support (or might have supported prior to losing | the server might support (or might have supported prior to losing | |||
| state). Designers of new versions of QUIC need to be aware of this | state). Designers of new versions of QUIC need to be aware of this | |||
| and either reuse this design, or use a portion of the packet other | and either reuse this design, or use a portion of the packet other | |||
| than the last 16 octets for carrying data. | than the last 16 octets for carrying data. | |||
| 7.9.4.1. Detecting a Stateless Reset | 6.9.4.1. Detecting a Stateless Reset | |||
| A client detects a potential stateless reset when a packet with a | A client detects a potential stateless reset when a packet with a | |||
| short header either cannot be decrypted or is marked as a duplicate | short header either cannot be decrypted or is marked as a duplicate | |||
| packet. The client then compares the last 16 octets of the packet | packet. The client then compares the last 16 octets of the packet | |||
| with the Stateless Reset Token provided by the server in its | with the Stateless Reset Token provided by the server in its | |||
| transport parameters. If these values are identical, the client MUST | transport parameters. If these values are identical, the client MUST | |||
| enter the draining period and not send any further packets on this | enter the draining period and not send any further packets on this | |||
| connection. If the comparison fails, the packet can be discarded. | connection. If the comparison fails, the packet can be discarded. | |||
| 7.9.4.2. Calculating a Stateless Reset Token | 6.9.4.2. Calculating a Stateless Reset Token | |||
| The stateless reset token MUST be difficult to guess. In order to | The stateless reset token MUST be difficult to guess. In order to | |||
| create a Stateless Reset Token, a server could randomly generate | create a Stateless Reset Token, a server could randomly generate | |||
| [RFC4086] a secret for every connection that it creates. However, | [RFC4086] a secret for every connection that it creates. However, | |||
| this presents a coordination problem when there are multiple servers | this presents a coordination problem when there are multiple servers | |||
| in a cluster or a storage problem for a server that might lose state. | in a cluster or a storage problem for a server that might lose state. | |||
| Stateless reset specifically exists to handle the case where state is | Stateless reset specifically exists to handle the case where state is | |||
| lost, so this approach is suboptimal. | lost, so this approach is suboptimal. | |||
| A single static key can be used across all connections to the same | A single static key can be used across all connections to the same | |||
| 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, | |||
| a the connection ID for the connection (see Section 5.6), and an | the server's connection ID (see Section 4.7), and an identifier for | |||
| identifier for the server instance. A server could use HMAC | the server instance. A server could use HMAC [RFC2104] (for example, | |||
| [RFC2104] (for example, HMAC(static_key, server_id || connection_id)) | HMAC(static_key, server_id || connection_id)) or HKDF [RFC5869] (for | |||
| or HKDF [RFC5869] (for example, using the static key as input keying | example, using the static key as input keying material, with server | |||
| material, with server and connection identifiers as salt). The | and connection identifiers as salt). The output of this function is | |||
| output of this function is truncated to 16 octets to produce the | truncated to 16 octets to produce the Stateless Reset Token for that | |||
| Stateless Reset Token for that connection. | connection. | |||
| A server that loses state can use the same method to generate a valid | A server that loses state can use the same method to generate a valid | |||
| Stateless Reset Secret. The connection ID comes from the packet that | Stateless Reset Secret. The connection ID comes from the packet that | |||
| the server receives. | the server receives. | |||
| This design relies on the client always sending a connection ID in | This design relies on the client always sending a connection ID in | |||
| its packets so that the server can use the connection ID from a | its packets so that the server can use the connection ID from a | |||
| packet to reset the connection. A server that uses this design | packet to reset the connection. A server that uses this design | |||
| cannot allow clients to omit a connection ID (that is, it cannot use | cannot allow clients to use a zero-length connection ID. | |||
| the truncate_connection_id transport parameter Section 7.4.1). | ||||
| 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 | server instance, connection ID, and static key cannot occur for | |||
| another connection. A connection ID from a connection that is reset | another connection. A connection ID from a connection that is reset | |||
| by revealing the Stateless Reset Token cannot be reused for new | by 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 server without first changing to use a | |||
| different static key or server identifier. | different static key or server identifier. | |||
| Note that Stateless Reset messages do not have any cryptographic | Note that Stateless Reset messages do not have any cryptographic | |||
| protection. | protection. | |||
| 8. Frame Types and Formats | 7. Frame Types and Formats | |||
| As described in Section 6, 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. | |||
| 8.1. Variable-Length Integer Encoding | 7.1. Variable-Length Integer Encoding | |||
| QUIC frames use a common variable-length encoding for all non- | QUIC frames use a common variable-length encoding for all non- | |||
| negative integer values. This encoding ensures that smaller integer | negative integer values. This encoding ensures that smaller integer | |||
| values need fewer octets to encode. | values need fewer octets to encode. | |||
| The QUIC variable-length integer encoding reserves the two most | The QUIC variable-length integer encoding reserves the two most | |||
| significant bits of the first octet to encode the base 2 logarithm of | significant bits of the first octet to encode the base 2 logarithm of | |||
| the integer encoding length in octets. The integer value is encoded | the integer encoding length in octets. The integer value is encoded | |||
| on the remaining bits, in network byte order. | on the remaining bits, in network byte order. | |||
| skipping to change at page 46, line 25 ¶ | skipping to change at page 50, line 25 ¶ | |||
| +------+--------+-------------+-----------------------+ | +------+--------+-------------+-----------------------+ | |||
| Table 4: Summary of Integer Encodings | Table 4: Summary of Integer Encodings | |||
| For example, the eight octet sequence c2 19 7c 5e ff 14 e8 8c (in | For example, the eight octet sequence c2 19 7c 5e ff 14 e8 8c (in | |||
| hexadecimal) decodes to the decimal value 151288809941952652; the | hexadecimal) decodes to the decimal value 151288809941952652; the | |||
| four octet sequence 9d 7f 3e 7d decodes to 494878333; the two octet | four octet sequence 9d 7f 3e 7d decodes to 494878333; the two octet | |||
| sequence 7b bd decodes to 15293; and the single octet 25 decodes to | sequence 7b bd decodes to 15293; and the single octet 25 decodes to | |||
| 37 (as does the two octet sequence 40 25). | 37 (as does the two octet sequence 40 25). | |||
| Error codes (Section 12.3) are described using integers, but do not | Error codes (Section 11.3) are described using integers, but do not | |||
| use this encoding. | use this encoding. | |||
| 8.2. PADDING Frame | 7.2. PADDING Frame | |||
| The PADDING frame (type=0x00) has no semantic value. PADDING frames | The PADDING frame (type=0x00) has no semantic value. PADDING frames | |||
| can be used to increase the size of a packet. Padding can be used to | can be used to increase the size of a packet. Padding can be used to | |||
| increase an initial client packet to the minimum required size, or to | increase an initial client packet to the minimum required size, or to | |||
| provide protection against traffic analysis for protected packets. | provide protection against traffic analysis for protected packets. | |||
| A PADDING frame has no content. That is, a PADDING frame consists of | A PADDING frame has no content. That is, a PADDING frame consists of | |||
| the single octet that identifies the frame as a PADDING frame. | the single octet that identifies the frame as a PADDING frame. | |||
| 8.3. RST_STREAM Frame | 7.3. RST_STREAM Frame | |||
| An endpoint may use a RST_STREAM frame (type=0x01) to abruptly | An endpoint may use a RST_STREAM frame (type=0x01) to abruptly | |||
| terminate a stream. | terminate a stream. | |||
| After sending a RST_STREAM, an endpoint ceases transmission and | After sending a RST_STREAM, an endpoint ceases transmission and | |||
| retransmission of STREAM frames on the identified stream. A receiver | retransmission of STREAM frames on the identified stream. A receiver | |||
| of RST_STREAM can discard any data that it already received on that | of RST_STREAM can discard any data that it already received on that | |||
| stream. | stream. | |||
| An endpoint that receives a RST_STREAM frame for a send-only stream | An endpoint that receives a RST_STREAM frame for a send-only stream | |||
| skipping to change at page 47, line 21 ¶ | skipping to change at page 51, line 21 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Final Offset (i) ... | | Final Offset (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Stream ID: A variable-length integer encoding of the Stream ID of | Stream ID: A variable-length integer encoding of the Stream ID of | |||
| the stream being terminated. | the stream being terminated. | |||
| Application Protocol Error Code: A 16-bit application protocol error | Application Protocol Error Code: A 16-bit application protocol error | |||
| code (see Section 12.4) which indicates why the stream is being | code (see Section 11.4) which indicates why the stream is being | |||
| closed. | closed. | |||
| Final Offset: A variable-length integer indicating the absolute byte | Final Offset: A variable-length integer indicating the absolute byte | |||
| offset of the end of data written on this stream by the RST_STREAM | offset of the end of data written on this stream by the RST_STREAM | |||
| sender. | sender. | |||
| 8.4. CONNECTION_CLOSE frame | 7.4. CONNECTION_CLOSE frame | |||
| An endpoint sends a CONNECTION_CLOSE frame (type=0x02) to notify its | An endpoint sends a CONNECTION_CLOSE frame (type=0x02) to notify its | |||
| peer that the connection is being closed. CONNECTION_CLOSE is used | peer that the connection is being closed. CONNECTION_CLOSE is used | |||
| to signal errors at the QUIC layer, or the absence of errors (with | to signal errors at the QUIC layer, or the absence of errors (with | |||
| the NO_ERROR code). | the NO_ERROR code). | |||
| If there are open streams that haven't been explicitly closed, they | If there are open streams that haven't been explicitly closed, they | |||
| are implicitly closed when the connection is closed. | are implicitly closed when the connection is closed. | |||
| The CONNECTION_CLOSE frame is as follows: | The CONNECTION_CLOSE frame is as follows: | |||
| skipping to change at page 48, line 4 ¶ | skipping to change at page 52, line 4 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (16) | Reason Phrase Length (i) ... | | Error Code (16) | Reason Phrase Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase (*) ... | | Reason Phrase (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields of a CONNECTION_CLOSE frame are as follows: | The fields of a CONNECTION_CLOSE frame are as follows: | |||
| Error Code: A 16-bit error code which indicates the reason for | Error Code: A 16-bit error code which indicates the reason for | |||
| closing this connection. CONNECTION_CLOSE uses codes from the | closing this connection. CONNECTION_CLOSE uses codes from the | |||
| space defined in Section 12.3 (APPLICATION_CLOSE uses codes from | space defined in Section 11.3 (APPLICATION_CLOSE uses codes from | |||
| the application protocol error code space, see Section 12.4). | the application protocol error code space, see Section 11.4). | |||
| 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]. | |||
| 8.5. APPLICATION_CLOSE frame | 7.5. APPLICATION_CLOSE frame | |||
| An APPLICATION_CLOSE frame (type=0x03) uses the same format as the | An APPLICATION_CLOSE frame (type=0x03) uses the same format as the | |||
| CONNECTION_CLOSE frame (Section 8.4), except that it uses error codes | CONNECTION_CLOSE frame (Section 7.4), except that it uses error codes | |||
| from the application protocol error code space (Section 12.4) instead | from the application protocol error code space (Section 11.4) instead | |||
| of the transport error code space. | of the transport error code space. | |||
| Other than the error code space, the format and semantics of the | Other than the error code space, the format and semantics of the | |||
| APPLICATION_CLOSE frame are identical to the CONNECTION_CLOSE frame. | APPLICATION_CLOSE frame are identical to the CONNECTION_CLOSE frame. | |||
| 8.6. MAX_DATA Frame | 7.6. MAX_DATA Frame | |||
| The MAX_DATA frame (type=0x04) is used in flow control to inform the | The MAX_DATA frame (type=0x04) is used in flow control to inform the | |||
| peer of the maximum amount of data that can be sent on the connection | peer of the maximum amount of data that can be sent on the connection | |||
| as a whole. | as a whole. | |||
| The frame is as follows: | The frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 49, line 7 ¶ | skipping to change at page 53, line 7 ¶ | |||
| 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, with the | |||
| exception of data on stream 0. The sum of the largest received | exception of data on stream 0. The sum of the largest received | |||
| offsets on all streams - including streams in terminal states, but | offsets on all streams - including streams in terminal states, but | |||
| excluding stream 0 - MUST NOT exceed the value advertised by a | excluding stream 0 - MUST NOT exceed the value advertised by a | |||
| receiver. 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 7.4.2). | result of a change in the initial limits (see Section 6.4.2). | |||
| 8.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. | |||
| An endpoint that receives a MAX_STREAM_DATA frame for a send-only | An endpoint that receives a MAX_STREAM_DATA frame for a send-only | |||
| stream it has not opened MUST terminate the connection with error | stream it has not opened MUST terminate the connection with error | |||
| skipping to change at page 50, line 10 ¶ | skipping to change at page 54, line 10 ¶ | |||
| stream. Loss or reordering can mean that the largest received offset | stream. Loss or reordering can mean that the largest received offset | |||
| on a stream can be greater than the total size of data received on | on a stream can be greater than the total size of data received on | |||
| that stream. Receiving STREAM frames might not increase the largest | that stream. Receiving STREAM frames might not increase the largest | |||
| received offset. | received offset. | |||
| The data sent on a stream MUST NOT exceed the largest maximum stream | The data sent on a stream MUST NOT exceed the largest maximum stream | |||
| data value advertised by the receiver. An endpoint MUST terminate a | data value advertised by the receiver. An endpoint MUST terminate a | |||
| connection with a FLOW_CONTROL_ERROR error if it receives more data | connection with a FLOW_CONTROL_ERROR error if it receives more data | |||
| than the largest maximum stream data that it has sent for the | than the largest maximum stream data that it has sent for the | |||
| affected stream, unless this is a result of a change in the initial | affected stream, unless this is a result of a change in the initial | |||
| limits (see Section 7.4.2). | limits (see Section 6.4.2). | |||
| 8.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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Stream ID (i) ... | | Maximum Stream ID (i) ... | |||
| skipping to change at page 50, line 43 ¶ | skipping to change at page 54, line 43 ¶ | |||
| Loss or reordering can mean that a MAX_STREAM_ID frame can be | Loss or reordering can mean that a MAX_STREAM_ID frame can be | |||
| received which states a lower stream limit than the client has | received which states a lower stream limit than the client has | |||
| previously received. MAX_STREAM_ID frames which do not increase the | previously received. MAX_STREAM_ID frames which do not increase the | |||
| maximum stream ID MUST be ignored. | maximum stream ID MUST be ignored. | |||
| A peer MUST NOT initiate a stream with a higher stream ID than the | A peer MUST NOT initiate a stream with a higher stream ID than the | |||
| greatest maximum stream ID it has received. An endpoint MUST | greatest maximum stream ID it has received. An endpoint MUST | |||
| terminate a connection with a STREAM_ID_ERROR error if a peer | terminate a connection with a STREAM_ID_ERROR error if a peer | |||
| initiates a stream with a higher stream ID than it has sent, unless | initiates a stream with a higher stream ID than it has sent, unless | |||
| this is a result of a change in the initial limits (see | this is a result of a change in the initial limits (see | |||
| Section 7.4.2). | Section 6.4.2). | |||
| 8.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. | |||
| The PING frame can be used to keep a connection alive when an | The PING frame can be used to keep a connection alive when an | |||
| application or application protocol wishes to prevent the connection | application or application protocol wishes to prevent the connection | |||
| from timing out. An application protocol SHOULD provide guidance | from timing out. An application protocol SHOULD provide guidance | |||
| about the conditions under which generating a PING is recommended. | about the conditions under which generating a PING is recommended. | |||
| This guidance SHOULD indicate whether it is the client or the server | This guidance SHOULD indicate whether it is the client or the server | |||
| that is expected to send the PING. Having both endpoints send PING | that is expected to send the PING. Having both endpoints send PING | |||
| frames without coordination can produce an excessive number of | frames without coordination can produce an excessive number of | |||
| packets and poor performance. | packets and poor performance. | |||
| A connection will time out if no packets are sent or received for a | A connection will time out if no packets are sent or received for a | |||
| period longer than the time specified in the idle_timeout transport | period longer than the time specified in the idle_timeout transport | |||
| parameter (see Section 7.9). However, state in middleboxes might | parameter (see Section 6.9). However, state in middleboxes might | |||
| time out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | time out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | |||
| minute timeout interval, experience shows that sending packets every | minute timeout interval, experience shows that sending packets every | |||
| 15 to 30 seconds is necessary to prevent the majority of middleboxes | 15 to 30 seconds is necessary to prevent the majority of middleboxes | |||
| from losing state for UDP flows. | from losing state for UDP flows. | |||
| 8.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 11.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 | |||
| flow control algorithms (see Section 11.1.2). | flow control algorithms (see Section 10.1.2). | |||
| The BLOCKED frame is as follows: | The BLOCKED frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (i) ... | | Offset (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The BLOCKED frame contains a single field. | The BLOCKED frame contains a single field. | |||
| Offset: A variable-length integer indicating the connection-level | Offset: A variable-length integer indicating the connection-level | |||
| offset at which the blocking occurred. | offset at which the blocking occurred. | |||
| 8.11. STREAM_BLOCKED Frame | 7.11. STREAM_BLOCKED Frame | |||
| A sender SHOULD send a STREAM_BLOCKED frame (type=0x09) when it | A sender SHOULD send a STREAM_BLOCKED frame (type=0x09) when it | |||
| wishes to send data, but is unable to due to stream-level flow | wishes to send data, but is unable to due to stream-level flow | |||
| control. This frame is analogous to BLOCKED (Section 8.10). | control. This frame is analogous to BLOCKED (Section 7.10). | |||
| An endpoint that receives a STREAM_BLOCKED frame for a send-only | An endpoint that receives a STREAM_BLOCKED frame for a send-only | |||
| stream MUST terminate the connection with error PROTOCOL_VIOLATION. | stream MUST terminate the connection with error PROTOCOL_VIOLATION. | |||
| The STREAM_BLOCKED frame is as follows: | The STREAM_BLOCKED frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| skipping to change at page 52, line 21 ¶ | skipping to change at page 56, line 21 ¶ | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The STREAM_BLOCKED frame contains two fields: | The STREAM_BLOCKED frame contains two fields: | |||
| Stream ID: A variable-length integer indicating the stream which is | Stream ID: A variable-length integer indicating the stream which is | |||
| flow control blocked. | flow control blocked. | |||
| Offset: A variable-length integer indicating the offset of the | Offset: A variable-length integer indicating the offset of the | |||
| stream at which the blocking occurred. | stream at which the blocking occurred. | |||
| 8.12. STREAM_ID_BLOCKED Frame | 7.12. STREAM_ID_BLOCKED Frame | |||
| A sender MAY send a STREAM_ID_BLOCKED frame (type=0x0a) when it | A sender MAY send a STREAM_ID_BLOCKED frame (type=0x0a) when it | |||
| wishes to open a stream, but is unable to due to the maximum stream | wishes to open a stream, but is unable to due to the maximum stream | |||
| ID limit set by its peer (see Section 8.8). This does not open the | ID limit set by its peer (see Section 7.8). This does not open the | |||
| stream, but informs the peer that a new stream was needed, but the | stream, but informs the peer that a new stream was needed, but the | |||
| stream limit prevented the creation of the stream. | stream limit prevented the creation of the stream. | |||
| The STREAM_ID_BLOCKED frame is as follows: | The STREAM_ID_BLOCKED frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| 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. | |||
| 8.13. NEW_CONNECTION_ID Frame | 7.13. NEW_CONNECTION_ID Frame | |||
| A server sends a NEW_CONNECTION_ID frame (type=0x0b) to provide the | An endpoint sends a NEW_CONNECTION_ID frame (type=0x0b) to provide | |||
| client 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 7.7.1). | linkability when migrating connections (see Section 6.8.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) ... | |||
| + Connection ID (64) + | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Sequence: A variable-length integer. This value starts at 0 and | Sequence: A variable-length integer. This value starts at 0 and | |||
| increases by 1 for each connection ID that is provided by the | increases by 1 for each connection ID that is provided by the | |||
| server. The connection ID that is assigned during the handshake | server. The connection ID that is assigned during the handshake | |||
| is assumed to have a sequence of -1. That is, the value selected | is assumed to have a sequence of -1. That is, the value selected | |||
| during the handshake comes immediately before the first value that | during the handshake comes immediately before the first value that | |||
| a server can send. | a server can send. | |||
| Connection ID: A 64-bit connection ID. | Length: An 8-bit unsigned integer containing the length of the | |||
| connection ID. Values less than 4 and greater than 18 are invalid | ||||
| and MUST be treated as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| 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 7.9.4). | Section 6.9.4). | |||
| 8.14. STOP_SENDING Frame | An endpoint MUST NOT send this frame if it currently requires that | |||
| its peer send packets with a zero-length Destination Connection ID. | ||||
| 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. | ||||
| 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 error of type PROTOCOL_VIOLATION. | ||||
| 7.14. STOP_SENDING Frame | ||||
| An endpoint may use a STOP_SENDING frame (type=0x0c) to communicate | An endpoint may use a STOP_SENDING frame (type=0x0c) to communicate | |||
| that incoming data is being discarded on receipt at application | that incoming data is being discarded on receipt at application | |||
| request. This signals a peer to abruptly terminate transmission on a | request. This signals a peer to abruptly terminate transmission on a | |||
| stream. | stream. | |||
| An endpoint that receives a STOP_SENDING frame for a receive-only | Receipt of a STOP_SENDING frame is only valid for a send stream that | |||
| stream MUST terminate the connection with error PROTOCOL_VIOLATION. | exists and is not in the "Ready" state (see Section 9.2.1). | |||
| Receiving a STOP_SENDING frame for a send stream that is "Ready" or | ||||
| non-existent MUST be treated as a connection error of type | ||||
| PROTOCOL_VIOLATION. An endpoint that receives a STOP_SENDING frame | ||||
| for a receive-only stream MUST terminate the connection with error | ||||
| PROTOCOL_VIOLATION. | ||||
| The STOP_SENDING frame is as follows: | The STOP_SENDING frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Application Error Code (16) | | | Application Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | The fields are: | |||
| Stream ID: A variable-length integer carrying the Stream ID of the | Stream ID: A variable-length integer carrying the Stream ID of the | |||
| stream being ignored. | stream being ignored. | |||
| Application Error Code: A 16-bit, application-specified reason the | Application Error Code: A 16-bit, application-specified reason the | |||
| sender is ignoring the stream (see Section 12.4). | sender is ignoring the stream (see Section 11.4). | |||
| 8.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. A sent packet that has never been | they have received and processed. A sent packet that has never been | |||
| acknowledged is missing. The ACK frame contains any number of ACK | acknowledged is missing. The ACK frame contains any number of ACK | |||
| blocks. ACK blocks are ranges of acknowledged packets. | blocks. ACK blocks are ranges of acknowledged packets. | |||
| Unlike TCP SACKs, QUIC acknowledgements are irrevocable. Once a | Unlike TCP SACKs, QUIC acknowledgements are irrevocable. Once a | |||
| packet has been acknowledged, even if it does not appear in a future | packet has been acknowledged, even if it does not appear in a future | |||
| ACK frame, it remains acknowledged. | ACK frame, it remains acknowledged. | |||
| 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. | |||
| A sender MAY intentionally skip packet numbers to introduce entropy | ||||
| into the connection, to avoid opportunistic acknowledgement attacks. | ||||
| The sender SHOULD close the connection if an unsent packet number is | ||||
| acknowledged. The format of the ACK frame is efficient at expressing | ||||
| even long blocks of missing packets, allowing for large, | ||||
| unpredictable gaps. | ||||
| An ACK frame is shown below. | An ACK frame is shown below. | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Largest Acknowledged (i) ... | | Largest Acknowledged (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Delay (i) ... | | ACK Delay (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ACK Block Count (i) ... | | ACK Block Count (i) ... | |||
| skipping to change at page 55, line 34 ¶ | skipping to change at page 59, line 38 ¶ | |||
| 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 7.4.1). Scaling in this fashion | multiplier of 8 (see Section 6.4.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 8.15.1. | been successfully received, see Section 7.15.1. | |||
| 8.15.1. ACK Block Section | 7.15.1. ACK Block Section | |||
| The ACK Block Section consists of alternating Gap and ACK Block | The ACK Block Section consists of alternating Gap and ACK Block | |||
| fields in descending packet number order. A First Ack Block field is | fields in descending packet number order. A First Ack Block field is | |||
| followed by a variable number of alternating Gap and Additional ACK | followed by a variable number of alternating Gap and Additional ACK | |||
| Blocks. The number of Gap and Additional ACK Block fields is | Blocks. The number of Gap and Additional ACK Block fields is | |||
| determined by the ACK Block Count field. | determined by the ACK Block Count field. | |||
| Gap and ACK Block fields use a relative integer encoding for | Gap and ACK Block fields use a relative integer encoding for | |||
| efficiency. Though each encoded value is positive, the values are | efficiency. Though each encoded value is positive, the values are | |||
| subtracted, so that each ACK Block describes progressively lower- | subtracted, so that each ACK Block describes progressively lower- | |||
| skipping to change at page 57, line 34 ¶ | skipping to change at page 61, line 42 ¶ | |||
| 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. | |||
| ACK Block (repeated): A variable-length integer indicating the | ACK Block (repeated): A variable-length integer indicating the | |||
| number of contiguous acknowledged packets preceding the largest | number of contiguous acknowledged packets preceding the largest | |||
| packet number, as determined by the preceding Gap. | packet number, as determined by the preceding Gap. | |||
| 8.15.2. Sending ACK Frames | 7.15.2. Sending ACK Frames | |||
| Implementations MUST NOT generate packets that only contain ACK | Implementations MUST NOT generate packets that only contain ACK | |||
| frames in response to packets which only contain ACK frames. | frames in response to packets which only contain ACK frames. | |||
| However, they MUST acknowledge packets containing only ACK frames | However, they MUST acknowledge packets containing only ACK frames | |||
| when sending ACK frames in response to other packets. | when sending ACK frames in response to other packets. | |||
| Implementations MUST NOT send more than one ACK frame per received | Implementations MUST NOT send more than one packet containing only | |||
| packet that contains frames other than ACK frames. Packets | ACK frames per received packet that contains frames other than ACK | |||
| containing non-ACK frames MUST be acknowledged immediately or when a | frames. Packets containing non-ACK frames MUST be acknowledged | |||
| delayed ack timer expires. | immediately or when a delayed ack timer expires. | |||
| To limit ACK blocks to those that have not yet been received by the | To limit ACK blocks to those that have not yet been received by the | |||
| sender, the receiver SHOULD track which ACK frames have been | sender, the receiver SHOULD track which ACK frames have been | |||
| acknowledged by its peer. Once an ACK frame has been acknowledged, | acknowledged by its peer. Once an ACK frame has been acknowledged, | |||
| the packets it acknowledges SHOULD NOT be acknowledged again. | the packets it acknowledges SHOULD NOT be acknowledged again. | |||
| A receiver that is only sending ACK frames will not receive | Because ACK frames are not sent in response to ACK-only packets, a | |||
| acknowledgments for its packets. Sending an occasional MAX_DATA or | receiver that is only sending ACK frames will only receive | |||
| MAX_STREAM_DATA frame as data is received will ensure that | acknowledgements for its packets if the sender includes them in | |||
| acknowledgements are generated by a peer. Otherwise, an endpoint MAY | packets with non-ACK frames. A sender SHOULD bundle ACK frames with | |||
| send a PING frame once per RTT to solicit an acknowledgment. | other frames when possible. | |||
| 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. | |||
| 8.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 that acknowledge protected packets MUST be carried in a | |||
| packet that has an equivalent or greater level of packet protection. | packet that has an equivalent or greater level of packet protection. | |||
| Packets that are protected with 1-RTT keys MUST be acknowledged in | Packets that are protected with 1-RTT keys MUST be acknowledged in | |||
| packets that are also protected with 1-RTT keys. | packets that are also protected with 1-RTT keys. | |||
| A packet that is not protected and claims to acknowledge a packet | A packet that is not protected and claims to acknowledge a packet | |||
| number that was sent with packet protection is not valid. An | number that was sent with packet protection is not valid. An | |||
| unprotected packet that carries acknowledgments for protected packets | unprotected packet that carries acknowledgments for protected packets | |||
| skipping to change at page 59, line 13 ¶ | skipping to change at page 63, line 21 ¶ | |||
| protection keys. | protection keys. | |||
| For instance, a server acknowledges a TLS ClientHello in the packet | For instance, a server acknowledges a TLS ClientHello in the packet | |||
| that carries the TLS ServerHello; similarly, a client can acknowledge | that carries the TLS ServerHello; similarly, a client can acknowledge | |||
| a TLS HelloRetryRequest in the packet containing a second TLS | a TLS HelloRetryRequest in the packet containing a second TLS | |||
| ClientHello. The complete set of server handshake messages (TLS | ClientHello. The complete set of server handshake messages (TLS | |||
| ServerHello through to Finished) might be acknowledged by a client in | ServerHello through to Finished) might be acknowledged by a client in | |||
| protected packets, because it is certain that the server is able to | protected packets, because it is certain that the server is able to | |||
| decipher the packet. | decipher the packet. | |||
| 8.16. PATH_CHALLENGE Frame | 7.16. 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 address 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + 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 8.17) containing the same Data. | (Section 7.17) containing the same Data. | |||
| 8.17. PATH_RESPONSE Frame | 7.17. 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 8.16). | frame (Section 7.16). | |||
| 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. | |||
| 8.18. STREAM Frames | 7.18. 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 60, line 50 ¶ | skipping to change at page 65, line 6 ¶ | |||
| | [Length (i)] ... | | [Length (i)] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream Data (*) ... | | Stream Data (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 9: STREAM Frame Format | Figure 9: STREAM Frame Format | |||
| The STREAM frame contains the following fields: | The STREAM frame contains the following fields: | |||
| Stream ID: 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 10.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. | |||
| Length: A variable-length integer specifying the length of the | Length: A variable-length integer specifying the length of the | |||
| Stream Data field in this STREAM frame. This field is present | Stream Data field in this STREAM frame. This field is present | |||
| when the LEN bit is set to 1. When the LEN bit is set to 0, the | when the LEN bit is set to 1. When the LEN bit is set to 0, the | |||
| Stream Data field consumes all the remaining octets in the packet. | Stream Data field consumes all the remaining octets in the packet. | |||
| Stream Data: The bytes from the designated stream to be delivered. | Stream Data: The bytes from the designated stream to be delivered. | |||
| A stream frame's Stream Data MUST NOT be empty, unless the FIN bit is | A stream frame's Stream Data MUST NOT be empty, unless the offset is | |||
| set. When the FIN flag is sent on an empty STREAM frame, the offset | 0 or the FIN bit is set. When the FIN flag is sent on an empty | |||
| in the STREAM frame is the offset of the next byte that would be | STREAM frame, the offset in the STREAM frame is the offset of the | |||
| sent. | next byte that would be sent. | |||
| The first byte in the stream has an offset of 0. The largest offset | The first byte in the stream has an offset of 0. The largest offset | |||
| delivered on a stream - the sum of the re-constructed offset and data | delivered on a stream - the sum of the re-constructed offset and data | |||
| length - MUST be less than 2^62. | length - MUST be less than 2^62. | |||
| Stream multiplexing is achieved by interleaving STREAM frames from | Stream multiplexing is achieved by interleaving STREAM frames from | |||
| multiple streams into one or more QUIC packets. A single QUIC packet | multiple streams into one or more QUIC packets. A single QUIC packet | |||
| can include multiple STREAM frames from one or more streams. | can include multiple STREAM frames from one or more streams. | |||
| Implementation note: One of the benefits of QUIC is avoidance of | Implementation note: One of the benefits of QUIC is avoidance of | |||
| head-of-line blocking across multiple streams. When a packet loss | head-of-line blocking across multiple streams. When a packet loss | |||
| occurs, only streams with data in that packet are blocked waiting for | occurs, only streams with data in that packet are blocked waiting for | |||
| a retransmission to be received, while other streams can continue | a retransmission to be received, while other streams can continue | |||
| making progress. Note that when data from multiple streams is | making progress. Note that when data from multiple streams is | |||
| bundled into a single QUIC packet, loss of that packet blocks all | bundled into a single QUIC packet, loss of that packet blocks all | |||
| 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. | |||
| 9. Packetization and Reliability | 8. Packetization and Reliability | |||
| A sender bundles one or more frames in a QUIC packet (see Section 6). | 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 | |||
| determine whether and for how long to wait. This waiting period is | determine whether and for how long to wait. This waiting period is | |||
| an implementation decision, and an implementation should be careful | an implementation decision, and an implementation should be careful | |||
| to delay conservatively, since any delay is likely to increase | to delay conservatively, since any delay is likely to increase | |||
| application-visible latency. | application-visible latency. | |||
| 9.1. Packet Processing and Acknowledgment | 8.1. Packet Processing and Acknowledgment | |||
| A packet MUST NOT be acknowledged until packet protection has been | A packet MUST NOT be acknowledged until packet protection has been | |||
| successfully removed and all frames contained in the packet have been | successfully removed and all frames contained in the packet have been | |||
| processed. Any stream state transitions triggered by the frame MUST | processed. Any stream state transitions triggered by the frame MUST | |||
| have occurred. For STREAM frames, this means the data has been | have occurred. For STREAM frames, this means the data has been | |||
| enqueued in preparation to be received by the application protocol, | enqueued in preparation to be received by the application protocol, | |||
| but it does not require that data is delivered and consumed. | but it does not require that data is delivered and consumed. | |||
| Once the packet has been fully processed, a receiver acknowledges | Once the packet has been fully processed, a receiver acknowledges | |||
| receipt by sending one or more ACK frames containing the packet | receipt by sending one or more ACK frames containing the packet | |||
| number of the received packet. To avoid creating an indefinite | number of the received packet. To avoid creating an indefinite | |||
| feedback loop, an endpoint MUST NOT send an ACK frame in response to | feedback loop, an endpoint MUST NOT send an ACK frame in response to | |||
| a packet containing only ACK or PADDING frames, even if there are | a packet containing only ACK or PADDING frames, even if there are | |||
| packet gaps which precede the received packet. The endpoint MUST | packet gaps which precede the received packet. The endpoint MUST | |||
| acknowledge packets containing only ACK or PADDING frames in the next | acknowledge packets containing only ACK or PADDING frames in the next | |||
| ACK frame that it sends. | ACK frame that it sends. | |||
| Strategies and implications of the frequency of generating | Strategies and implications of the frequency of generating | |||
| acknowledgments are discussed in more detail in [QUIC-RECOVERY]. | acknowledgments are discussed in more detail in [QUIC-RECOVERY]. | |||
| 9.2. Retransmission of Information | 8.2. Retransmission of Information | |||
| QUIC packets that are determined to be lost are not retransmitted | QUIC packets that are determined to be lost are not retransmitted | |||
| 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 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 8.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 | |||
| frame, is sent until acknowledged or until all stream data is | frame, is sent until acknowledged or until all stream data is | |||
| 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 10.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 7.9. | when packet loss is detected, but as described in Section 6.9. | |||
| 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 64, line 19 ¶ | skipping to change at page 68, line 21 ¶ | |||
| o New connection IDs are sent in NEW_CONNECTION_ID frames and | o New connection IDs are sent in NEW_CONNECTION_ID frames and | |||
| retransmitted if the packet containing them is lost. | retransmitted if the packet containing them is lost. | |||
| o PADDING frames contain no information, so lost PADDING frames do | o PADDING frames contain no information, so lost PADDING frames do | |||
| not require repair. | not require repair. | |||
| Upon detecting losses, a sender MUST take appropriate congestion | Upon detecting losses, a sender MUST take appropriate congestion | |||
| control action. The details of loss detection and congestion control | control action. The details of loss detection and congestion control | |||
| are described in [QUIC-RECOVERY]. | are described in [QUIC-RECOVERY]. | |||
| 9.3. Packet Size | 8.3. Packet Size | |||
| The QUIC packet size includes the QUIC header and integrity check, | The QUIC packet size includes the QUIC header and integrity check, | |||
| but not the UDP or IP header. | but not the UDP or IP header. | |||
| Clients MUST pad any Initial packet it sends to have a QUIC packet | Clients MUST pad any Initial packet it sends to have a QUIC packet | |||
| size of at least 1200 octets. Sending an Initial packet of this size | size of at least 1200 octets. Sending an Initial packet of this size | |||
| ensures that the network path supports a reasonably sized packet, and | ensures that the network path supports a reasonably sized packet, and | |||
| helps reduce the amplitude of amplification attacks caused by server | helps reduce the amplitude of amplification attacks caused by server | |||
| responses toward an unverified client address. | responses toward an unverified client address. | |||
| An Initial packet MAY exceed 1200 octets if the client knows that the | An Initial packet MAY exceed 1200 octets if the client knows that the | |||
| Path Maximum Transmission Unit (PMTU) supports the size that it | Path Maximum Transmission Unit (PMTU) supports the size that it | |||
| chooses. | chooses. | |||
| A server MAY send a CONNECTION_CLOSE frame with error code | A server MAY send a CONNECTION_CLOSE frame with error code | |||
| PROTOCOL_VIOLATION in response to an Initial packet smaller than 1200 | PROTOCOL_VIOLATION in response to an Initial packet smaller than 1200 | |||
| octets. It MUST NOT send any other frame type in response, or | octets. It MUST NOT send any other frame type in response, or | |||
| otherwise behave as if any part of the offending packet was processed | otherwise behave as if any part of the offending packet was processed | |||
| as valid. | as valid. | |||
| 9.4. Path Maximum Transmission Unit | 8.4. Path Maximum Transmission Unit | |||
| The Path Maximum Transmission Unit (PMTU) is the maximum size of the | The Path Maximum Transmission Unit (PMTU) is the maximum size of the | |||
| entire IP header, UDP header, and UDP payload. The UDP payload | entire IP header, UDP header, and UDP payload. The UDP payload | |||
| includes the QUIC packet header, protected payload, and any | includes the QUIC packet header, protected payload, and any | |||
| authentication fields. | authentication fields. | |||
| All QUIC packets SHOULD be sized to fit within the estimated PMTU to | All QUIC packets SHOULD be sized to fit within the estimated PMTU to | |||
| avoid IP fragmentation or packet drops. To optimize bandwidth | avoid IP fragmentation or packet drops. To optimize bandwidth | |||
| efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | |||
| ([PLPMTUD]). Endpoints MAY use PMTU Discovery ([PMTUDv4], [PMTUDv6]) | ([PLPMTUD]). Endpoints MAY use PMTU Discovery ([PMTUDv4], [PMTUDv6]) | |||
| skipping to change at page 65, line 29 ¶ | skipping to change at page 69, 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. | |||
| 9.4.1. Special Considerations for PMTU Discovery | 8.4.1. Special Considerations for PMTU Discovery | |||
| Traditional ICMP-based path MTU discovery in IPv4 [RFC1191] is | Traditional ICMP-based path MTU discovery in IPv4 [RFC1191] is | |||
| potentially vulnerable to off-path attacks that successfully guess | potentially vulnerable to off-path attacks that successfully guess | |||
| the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | |||
| value. TCP connections mitigate this risk by using the (at minimum) | value. TCP connections mitigate this risk by using the (at minimum) | |||
| 8 bytes of transport header echoed in the ICMP message to validate | 8 bytes of transport header echoed in the ICMP message to validate | |||
| the TCP sequence number as valid for the current connection. | the TCP sequence number as valid for the current connection. | |||
| However, as QUIC operates over UDP, in IPv4 the echoed information | However, as QUIC operates over UDP, in IPv4 the echoed information | |||
| could consist only of the IP and UDP headers, which usually has | could consist only of the IP and UDP headers, which usually has | |||
| insufficient entropy to mitigate off-path attacks. | insufficient entropy to mitigate off-path attacks. | |||
| skipping to change at page 66, line 9 ¶ | skipping to change at page 70, line 13 ¶ | |||
| spurious. | spurious. | |||
| o Store additional information from the IP or UDP headers from DF | o Store additional information from the IP or UDP headers from DF | |||
| packets (for example, the IP ID or UDP checksum) to further | packets (for example, the IP ID or UDP checksum) to further | |||
| authenticate incoming Datagram Too Big messages. | authenticate incoming Datagram Too Big messages. | |||
| o Any reduction in PMTU due to a report contained in an ICMP packet | o Any reduction in PMTU due to a report contained in an ICMP packet | |||
| is provisional until QUIC's loss detection algorithm determines | is provisional until QUIC's loss detection algorithm determines | |||
| that the packet is actually lost. | that the packet is actually lost. | |||
| 9.4.2. Special Considerations for Packetization Layer PMTU Discovery | 8.4.2. Special Considerations for Packetization Layer PMTU Discovery | |||
| The PADDING frame provides a useful option for PMTU probe packets | The PADDING frame provides a useful option for PMTU probe packets | |||
| that does not exist in other transports. PADDING frames generate | that does not exist in other transports. PADDING frames generate | |||
| acknowledgements, but their content need not be delivered reliably. | acknowledgements, but their content need not be delivered reliably. | |||
| PADDING frames may delay the delivery of application data, as they | PADDING frames may delay the delivery of application data, as they | |||
| consume the congestion window. However, by definition their likely | consume the congestion window. However, by definition their likely | |||
| loss in a probe packet does not require delay-inducing retransmission | loss in a probe packet does not require delay-inducing retransmission | |||
| of application data. | of application data. | |||
| When implementing the algorithm in Section 7.2 of [RFC4821], the | When implementing the algorithm in Section 7.2 of [RFC4821], the | |||
| initial value of search_low SHOULD be consistent with the IPv6 | initial value of search_low SHOULD be consistent with the IPv6 | |||
| minimum packet size. Paths that do not support this size cannot | minimum packet size. Paths that do not support this size cannot | |||
| deliver Initial packets, and therefore are not QUIC-compliant. | deliver Initial packets, and therefore are not QUIC-compliant. | |||
| Section 7.3 of [RFC4821] discusses tradeoffs between small and large | Section 7.3 of [RFC4821] discusses tradeoffs between small and large | |||
| increases in the size of probe packets. As QUIC probe packets need | increases in the size of probe packets. As QUIC probe packets need | |||
| not contain application data, aggressive increases in probe size | not contain application data, aggressive increases in probe size | |||
| carry fewer consequences. | carry fewer consequences. | |||
| 10. Streams: QUIC's Data Structuring Abstraction | 9. Streams: QUIC's Data Structuring Abstraction | |||
| Streams in QUIC provide a lightweight, ordered byte-stream | Streams in QUIC provide a lightweight, ordered byte-stream | |||
| abstraction. | abstraction. | |||
| There are two basic types of stream in QUIC. Unidirectional streams | There are two basic types of stream in QUIC. Unidirectional streams | |||
| carry data in one direction only; bidirectional streams allow for | carry data in one direction only; bidirectional streams allow for | |||
| data to be sent in both directions. Different stream identifiers are | data to be sent in both directions. Different stream identifiers are | |||
| used to distinguish between unidirectional and bidirectional streams, | used to distinguish between unidirectional and bidirectional streams, | |||
| as well as to create a separation between streams that are initiated | as well as to create a separation between streams that are initiated | |||
| by the client and server (see Section 10.1). | by the client and server (see Section 9.1). | |||
| Either type of stream can be created by either endpoint, can | Either type of stream can be created by either endpoint, can | |||
| concurrently send data interleaved with other streams, and can be | concurrently send data interleaved with other streams, and can be | |||
| cancelled. | cancelled. | |||
| Stream offsets allow for the octets on a stream to be placed in | Stream offsets allow for the octets on a stream to be placed in | |||
| order. An endpoint MUST be capable of delivering data received on a | order. An endpoint MUST be capable of delivering data received on a | |||
| stream in order. Implementations MAY choose to offer the ability to | stream in order. Implementations MAY choose to offer the ability to | |||
| deliver data out of order. There is no means of ensuring ordering | deliver data out of order. There is no means of ensuring ordering | |||
| between octets on different streams. | between octets on different streams. | |||
| skipping to change at page 67, line 17 ¶ | skipping to change at page 71, line 22 ¶ | |||
| Streams are individually flow controlled, allowing an endpoint to | Streams are individually flow controlled, allowing an endpoint to | |||
| limit memory commitment and to apply back pressure. The creation of | limit memory commitment and to apply back pressure. The creation of | |||
| streams is also flow controlled, with each peer declaring the maximum | streams is also flow controlled, with each peer declaring the maximum | |||
| stream ID it is willing to accept at a given time. | stream ID it is willing to accept at a given time. | |||
| An alternative view of QUIC streams is as an elastic "message" | An alternative view of QUIC streams is as an elastic "message" | |||
| abstraction, similar to the way ephemeral streams are used in SST | abstraction, similar to the way ephemeral streams are used in SST | |||
| [SST], which may be a more appealing description for some | [SST], which may be a more appealing description for some | |||
| applications. | applications. | |||
| 10.1. Stream Identifiers | 9.1. Stream Identifiers | |||
| Streams are identified by an unsigned 62-bit integer, referred to as | Streams are identified by an unsigned 62-bit integer, referred to as | |||
| the Stream ID. The least significant two bits of the Stream ID are | the Stream ID. The least significant two bits of the Stream ID are | |||
| used to identify the type of stream (unidirectional or bidirectional) | used to identify the type of stream (unidirectional or bidirectional) | |||
| and the initiator of the stream. | and the initiator of the stream. | |||
| The least significant bit (0x1) of the Stream ID identifies the | The least significant bit (0x1) of the Stream ID identifies the | |||
| initiator of the stream. Clients initiate even-numbered streams | initiator of the stream. Clients initiate even-numbered streams | |||
| (those with the least significant bit set to 0); servers initiate | (those with the least significant bit set to 0); servers initiate | |||
| odd-numbered streams (with the bit set to 1). Separation of the | odd-numbered streams (with the bit set to 1). Separation of the | |||
| skipping to change at page 68, line 23 ¶ | skipping to change at page 72, line 23 ¶ | |||
| | | | | | | | | |||
| | 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 | Stream ID 0 (0x0) is a client-initiated, bidirectional stream that is | |||
| used for the cryptographic handshake. Stream 0 MUST NOT be used for | used for the cryptographic handshake. Stream 0 MUST NOT be used for | |||
| application data. | application data. | |||
| A QUIC endpoint MUST NOT reuse a Stream ID. Open streams can be used | A QUIC endpoint MUST NOT reuse a Stream ID. Streams can be used in | |||
| in any order. Streams that are used out of order result in opening | any order. Streams that are used out of order result in opening all | |||
| 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 8.1). | Section 7.1). | |||
| 10.2. Stream States | 9.2. Stream States | |||
| This section describes the two types of QUIC stream in terms of the | This section describes the two types of QUIC stream in terms of the | |||
| states of their send or receive components. Two state machines are | states of their send or receive components. Two state machines are | |||
| described: one for streams on which an endpoint transmits data | described: one for streams on which an endpoint transmits data | |||
| (Section 10.2.1); another for streams from which an endpoint receives | (Section 9.2.1); another for streams from which an endpoint receives | |||
| data (Section 10.2.2). | data (Section 9.2.2). | |||
| Unidirectional streams use the applicable state machine directly. | Unidirectional streams use the applicable state machine directly. | |||
| Bidirectional streams use both state machines. For the most part, | Bidirectional streams use both state machines. For the most part, | |||
| the use of these state machines is the same whether the stream is | the use of these state machines is the same whether the stream is | |||
| unidirectional or bidirectional. The conditions for opening a stream | unidirectional or bidirectional. The conditions for opening a stream | |||
| are slightly more complex for a bidirectional stream because the | are slightly more complex for a bidirectional stream because the | |||
| opening of either send or receive causes the stream to open in both | opening of either send or receive sides causes the stream to open in | |||
| directions. | both directions. | |||
| Opening a stream causes all lower-numbered streams of the same type | An endpoint can open streams up to its maximum stream limit in any | |||
| to implicitly open. This includes both send and receive streams if | order, however endpoints SHOULD open the send side of streams for | |||
| the stream is bidirectional. For bidirectional streams, an endpoint | each type in order. | |||
| can send data on an implicitly opened stream. On both unidirectional | ||||
| and bidirectional streams, an endpoint MAY send MAX_STREAM_DATA or | ||||
| STOP_SENDING on implicitly opened streams. An endpoint SHOULD NOT | ||||
| implicitly open streams that it initiates, instead opening streams in | ||||
| order. | ||||
| Note: These states are largely informative. This document uses | Note: These states are largely informative. This document uses | |||
| stream states to describe rules for when and how different types | stream states to describe rules for when and how different types | |||
| 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. | |||
| 10.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 10 shows the states for the part of a stream that sends data | |||
| to a peer. | to a peer. | |||
| o | o | |||
| | Open Stream (Sending) | | Create Stream (Sending) | |||
| | Open Bidirectional Stream (Receiving) | | Create Bidirectional Stream (Receiving) | |||
| v | v | |||
| +-------+ | +-------+ | |||
| | Open | Send RST_STREAM | | Ready | Send RST_STREAM | |||
| | |-----------------------. | | |-----------------------. | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Send STREAM / | | | Send STREAM / | | |||
| | STREAM_BLOCKED | | | STREAM_BLOCKED | | |||
| v | | v | | |||
| +-------+ | | +-------+ | | |||
| | Send | Send RST_STREAM | | | Send | Send RST_STREAM | | |||
| | |---------------------->| | | |---------------------->| | |||
| +-------+ | | +-------+ | | |||
| skipping to change at page 70, line 40 ¶ | skipping to change at page 73, line 51 ¶ | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | | Reset | | | Data | | Reset | | |||
| | Recvd | | Recvd | | | Recvd | | Recvd | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| Figure 10: States for Send Streams | Figure 10: 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 "Open" 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 "Open" 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. | |||
| Sending the first STREAM or STREAM_BLOCKED frame causes a send stream | Sending the first STREAM or STREAM_BLOCKED frame causes a send stream | |||
| to enter the "Send" state. An implementation might choose to defer | to enter the "Send" state. An implementation might choose to defer | |||
| allocating a Stream ID to a send stream until it sends the first | allocating a Stream ID to a send stream until it sends the first | |||
| frame and enters this state, which can allow for better stream | frame and enters this state, which can allow for better stream | |||
| prioritization. | prioritization. | |||
| In the "Send" state, an endpoint transmits - and retransmits as | In the "Send" state, an endpoint transmits - and retransmits as | |||
| necessary - data in STREAM frames. The endpoint respects the flow | necessary - data in STREAM frames. The endpoint respects the flow | |||
| skipping to change at page 71, line 24 ¶ | skipping to change at page 74, line 36 ¶ | |||
| retransmits stream data as necessary. The endpoint no longer needs | retransmits stream data as necessary. The endpoint no longer needs | |||
| to track flow control limits or send STREAM_BLOCKED frames for a send | to track flow control limits or send STREAM_BLOCKED frames for a send | |||
| stream in this state. The endpoint can ignore any MAX_STREAM_DATA | stream in this state. The endpoint can ignore any MAX_STREAM_DATA | |||
| frames it receives from its peer in this state; MAX_STREAM_DATA | frames it receives from its peer in this state; MAX_STREAM_DATA | |||
| frames might be received until the peer receives the final stream | frames might be received until the peer receives the final stream | |||
| offset. | offset. | |||
| Once all stream data has been successfully acknowledged, the send | Once all stream data has been successfully acknowledged, the send | |||
| stream enters the "Data Recvd" state, which is a terminal state. | stream enters the "Data Recvd" state, which is a terminal state. | |||
| From any of the "Open", "Send", or "Data Sent" states, an application | From any of the "Ready", "Send", or "Data Sent" states, an | |||
| can signal that it wishes to abandon transmission of stream data. | application can signal that it wishes to abandon transmission of | |||
| Similarly, the endpoint might receive a STOP_SENDING frame from its | stream data. Similarly, the endpoint might receive a STOP_SENDING | |||
| peer. In either case, the endpoint sends a RST_STREAM frame, which | frame from its peer. In either case, the endpoint sends a RST_STREAM | |||
| causes the stream to enter the "Reset Sent" state. | frame, which causes the stream to enter the "Reset Sent" state. | |||
| 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. | |||
| 10.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 11 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 "Open" 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 | |||
| | Open Bidirectional Stream (Sending) | | Create Bidirectional Stream (Sending) | |||
| | Recv MAX_STREAM_DATA | | Recv MAX_STREAM_DATA | |||
| v | v | |||
| +-------+ | +-------+ | |||
| | Recv | Recv RST_STREAM | | Recv | Recv RST_STREAM | |||
| | |-----------------------. | | |-----------------------. | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Recv STREAM + FIN | | | Recv STREAM + FIN | | |||
| v | | v | | |||
| +-------+ | | +-------+ | | |||
| skipping to change at page 72, line 47 ¶ | skipping to change at page 76, line 9 ¶ | |||
| 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, | |||
| type 1 for a server) enters the "Open" state. | type 1 for a server) enters the "Ready" state. | |||
| A bidirectional stream also opens when a MAX_STREAM_DATA frame is | A bidirectional stream also opens when a MAX_STREAM_DATA frame is | |||
| received. Receiving a MAX_STREAM_DATA frame implies that the remote | received. Receiving a MAX_STREAM_DATA frame implies that the remote | |||
| peer has opened the stream and is providing flow control credit. A | peer has opened the stream and is providing flow control credit. A | |||
| MAX_STREAM_DATA frame might arrive before a STREAM or STREAM_BLOCKED | MAX_STREAM_DATA frame might arrive before a STREAM or STREAM_BLOCKED | |||
| frame if packets are lost or reordered. | frame if packets are lost or reordered. | |||
| In the "Recv" state, the endpoint receives STREAM and STREAM_BLOCKED | In the "Recv" state, the endpoint receives STREAM and STREAM_BLOCKED | |||
| frames. Incoming data is buffered and can be reassembled into the | frames. Incoming data is buffered and can be reassembled into the | |||
| correct order for delivery to the application. As data is consumed | correct order for delivery to the application. As data is consumed | |||
| by the application and buffer space becomes available, the endpoint | by the application and buffer space becomes available, the endpoint | |||
| sends MAX_STREAM_DATA frames to allow the peer to send more data. | sends MAX_STREAM_DATA frames to allow the peer to send more data. | |||
| When a STREAM frame with a FIN bit is received, the final offset (see | When a STREAM frame with a FIN bit is received, the final offset (see | |||
| Section 11.3) is known. The receive stream enters the "Size Known" | Section 10.3) is known. The receive stream enters the "Size Known" | |||
| state. In this state, the endpoint no longer needs to send | state. In this state, the endpoint no longer needs to send | |||
| MAX_STREAM_DATA frames, it only receives any retransmissions of | MAX_STREAM_DATA frames, it only receives any retransmissions of | |||
| stream data. | stream data. | |||
| Once all data for the stream has been received, the receive stream | Once all data for the stream has been received, the receive stream | |||
| enters the "Data Recvd" state. This might happen as a result of | enters the "Data Recvd" state. This might happen as a result of | |||
| receiving the same STREAM frame that causes the transition to "Size | receiving the same STREAM frame that causes the transition to "Size | |||
| Known". In this state, the endpoint has all stream data. Any STREAM | Known". In this state, the endpoint has all stream data. Any STREAM | |||
| or STREAM_BLOCKED frames it receives for the stream can be discarded. | or STREAM_BLOCKED frames it receives for the stream can be discarded. | |||
| skipping to change at page 74, line 5 ¶ | skipping to change at page 77, line 14 ¶ | |||
| of stream data, discard any data that was not consumed, and signal | of stream data, discard any data that was not consumed, and signal | |||
| the existence of the RST_STREAM immediately. Alternatively, the | the existence of the RST_STREAM immediately. Alternatively, the | |||
| RST_STREAM signal might be suppressed or withheld if stream data is | RST_STREAM signal might be suppressed or withheld if stream data is | |||
| completely received. In the latter case, the receive stream | completely received. In the latter case, the receive stream | |||
| 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. | |||
| 10.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 8.18), STREAM_BLOCKED (Section 8.11), and RST_STREAM | (Section 7.18), STREAM_BLOCKED (Section 7.11), and RST_STREAM | |||
| (Section 8.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 8.7) and | The receiver of a stream sends MAX_STREAM_DATA (Section 7.7) and | |||
| STOP_SENDING frames (Section 8.14). | STOP_SENDING frames (Section 7.14). | |||
| The receiver only sends MAX_STREAM_DATA in the "Recv" state. A | The receiver only sends MAX_STREAM_DATA in the "Recv" state. A | |||
| receiver can send STOP_SENDING in any state where it has not received | receiver can send STOP_SENDING in any state where it has not received | |||
| a RST_STREAM frame; that is states other than "Reset Recvd" or "Reset | a RST_STREAM frame; that is states other than "Reset Recvd" or "Reset | |||
| Read". However there is little value in sending a STOP_SENDING frame | Read". However there is little value in sending a STOP_SENDING frame | |||
| after all stream data has been received in the "Data Recvd" state. A | after all stream data has been received in the "Data Recvd" state. A | |||
| sender could receive these frames in any state as a result of delayed | sender could receive these frames in any state as a result of delayed | |||
| delivery of packets. | delivery of packets. | |||
| 10.2.4. Bidirectional Stream States | 9.2.4. Bidirectional Stream States | |||
| A bidirectional stream is composed of a send stream and a receive | A bidirectional stream is composed of a send stream and a receive | |||
| stream. Implementations may represent states of the bidirectional | stream. Implementations may represent states of the bidirectional | |||
| stream as composites of send and receive stream states. The simplest | stream as composites of send and receive stream states. The simplest | |||
| model presents the stream as "open" when either send or receive | model presents the stream as "open" when either send or receive | |||
| stream is in a non-terminal state and "closed" when both send and | stream is in a non-terminal state and "closed" when both send and | |||
| receive streams are in a terminal state. | receive streams are in a terminal state. | |||
| Table 6 shows a more complex mapping of bidirectional stream states | Table 6 shows a more complex mapping of bidirectional stream states | |||
| that loosely correspond to the stream states in HTTP/2 [HTTP2]. This | that loosely correspond to the stream states in HTTP/2 [HTTP2]. This | |||
| shows that multiple states on send or receive streams are mapped to | shows that multiple states on send or receive streams are mapped to | |||
| the same composite state. Note that this is just one possibility for | the same composite state. Note that this is just one possibility for | |||
| such a mapping; this mapping requires that data is acknowledged | such a mapping; this mapping requires that data is acknowledged | |||
| before the transition to a "closed" or "half-closed" state. | before the transition to a "closed" or "half-closed" state. | |||
| +-----------------------+---------------------+---------------------+ | +-----------------------+---------------------+---------------------+ | |||
| | Send Stream | Receive Stream | Composite State | | | Send Stream | Receive Stream | Composite State | | |||
| +-----------------------+---------------------+---------------------+ | +-----------------------+---------------------+---------------------+ | |||
| | No Stream/Open | No Stream/Recv *1 | idle | | | No Stream/Ready | No Stream/Recv *1 | idle | | |||
| | | | | | | | | | | |||
| | Open/Send/Data Sent | Recv/Size Known | open | | | Ready/Send/Data Sent | Recv/Size Known | open | | |||
| | | | | | | | | | | |||
| | Open/Send/Data Sent | Data Recvd/Data | half-closed | | | Ready/Send/Data Sent | Data Recvd/Data | half-closed | | |||
| | | Read | (remote) | | | | Read | (remote) | | |||
| | | | | | | | | | | |||
| | Open/Send/Data Sent | Reset Recvd/Reset | half-closed | | | Ready/Send/Data Sent | Reset Recvd/Reset | half-closed | | |||
| | | Read | (remote) | | | | Read | (remote) | | |||
| | | | | | | | | | | |||
| | Data Recvd | Recv/Size Known | half-closed (local) | | | Data Recvd | Recv/Size Known | half-closed (local) | | |||
| | | | | | | | | | | |||
| | Reset Sent/Reset | Recv/Size Known | half-closed (local) | | | Reset Sent/Reset | Recv/Size Known | half-closed (local) | | |||
| | Recvd | | | | | Recvd | | | | |||
| | | | | | | | | | | |||
| | Data Recvd | Recv/Size Known | half-closed (local) | | | Data Recvd | Recv/Size Known | half-closed (local) | | |||
| | | | | | | | | | | |||
| | Reset Sent/Reset | Data Recvd/Data | closed | | | Reset Sent/Reset | Data Recvd/Data | closed | | |||
| skipping to change at page 75, line 44 ¶ | skipping to change at page 78, line 46 ¶ | |||
| | Data Recvd | Reset Recvd/Reset | closed | | | Data Recvd | Reset Recvd/Reset | closed | | |||
| | | Read | | | | | Read | | | |||
| +-----------------------+---------------------+---------------------+ | +-----------------------+---------------------+---------------------+ | |||
| Table 6: Possible Mapping of Stream States to HTTP/2 | Table 6: Possible Mapping of Stream States to HTTP/2 | |||
| Note (*1): A stream is considered "idle" if it has not yet been | Note (*1): A stream is considered "idle" if it has not yet been | |||
| created, or if the receive stream is in the "Recv" state without | created, or if the receive stream is in the "Recv" state without | |||
| yet having received any frames. | yet having received any frames. | |||
| 10.3. Solicited State Transitions | 9.3. Solicited State Transitions | |||
| If an endpoint is no longer interested in the data it is receiving on | If an endpoint is no longer interested in the data it is receiving on | |||
| a stream, it MAY send a STOP_SENDING frame identifying that stream to | a stream, it MAY send a STOP_SENDING frame identifying that stream to | |||
| prompt closure of the stream in the opposite direction. This | prompt closure of the stream in the opposite direction. This | |||
| typically indicates that the receiving application is no longer | typically indicates that the receiving application is no longer | |||
| reading data it receives from the stream, but is not a guarantee that | reading data it receives from the stream, but is not a guarantee that | |||
| incoming data will be ignored. | incoming data will be ignored. | |||
| STREAM frames received after sending STOP_SENDING are still counted | STREAM frames received after sending STOP_SENDING are still counted | |||
| toward the connection and stream flow-control windows, even though | toward the connection and stream flow-control windows, even though | |||
| skipping to change at page 76, line 28 ¶ | skipping to change at page 79, line 30 ¶ | |||
| STOP_SENDING SHOULD only be sent for a receive stream that has not | STOP_SENDING SHOULD only be sent for a receive stream that has not | |||
| been reset. STOP_SENDING is most useful for streams in the "Recv" or | been reset. STOP_SENDING is most useful for streams in the "Recv" or | |||
| "Size Known" states. | "Size Known" states. | |||
| 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. | |||
| 10.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 7.4.1) and is subsequently | transport parameters (see Section 6.4.1) and is subsequently | |||
| increased by MAX_STREAM_ID frames (see Section 8.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 12), 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 7.4.2). | offsets (see Section 6.4.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. | |||
| 10.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 | |||
| receive data. Each endpoint may send a series of STREAM frames | receive data. Each endpoint may send a series of STREAM frames | |||
| encapsulating data on a stream until the stream is terminated in that | encapsulating data on a stream until the stream is terminated in that | |||
| direction. Streams are an ordered byte-stream abstraction, and they | direction. Streams are an ordered byte-stream abstraction, and they | |||
| have no other structure within them. STREAM frame boundaries are not | have no other structure within them. STREAM frame boundaries are not | |||
| expected to be preserved in retransmissions from the sender or during | expected to be preserved in retransmissions from the sender or during | |||
| delivery to the application at the receiver. | delivery to the application at the receiver. | |||
| When new data is to be sent on a stream, a sender MUST set the | When new data is to be sent on a stream, a sender MUST set the | |||
| skipping to change at page 77, line 37 ¶ | skipping to change at page 80, line 40 ¶ | |||
| handshake stream, Stream 0, is exempt from the connection-level data | handshake stream, Stream 0, is exempt from the connection-level data | |||
| limits established by MAX_DATA. Data on stream 0 other than the | limits established by MAX_DATA. Data on stream 0 other than the | |||
| initial cryptographic handshake message is still subject to stream- | initial cryptographic handshake message is still subject to stream- | |||
| level data limits and MAX_STREAM_DATA. This message is exempt from | level data limits and MAX_STREAM_DATA. This message is exempt from | |||
| flow control because it needs to be sent in a single packet | flow control because it needs to be sent in a single packet | |||
| regardless of the server's flow control state. This rule applies | regardless of the server's flow control state. This rule applies | |||
| even for 0-RTT handshakes where the remembered value of | even for 0-RTT handshakes where the remembered value of | |||
| MAX_STREAM_DATA would not permit sending a full initial cryptographic | MAX_STREAM_DATA would not permit sending a full initial cryptographic | |||
| handshake message. | handshake message. | |||
| Flow control is described in detail in Section 11, 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]. | |||
| 10.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 | |||
| significant positive impact on performance. | significant positive impact on performance. | |||
| QUIC does not provide frames for exchanging prioritization | QUIC does not provide frames for exchanging prioritization | |||
| information. Instead it relies on receiving priority information | information. Instead it relies on receiving priority information | |||
| from the application that uses QUIC. Protocols that use QUIC are | from the application that uses QUIC. Protocols that use QUIC are | |||
| skipping to change at page 78, line 29 ¶ | skipping to change at page 81, line 35 ¶ | |||
| 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 | Stream 0 MUST be prioritized over other streams prior to the | |||
| completion of the cryptographic handshake. This includes the | completion of the cryptographic handshake. This includes the | |||
| retransmission of the second flight of client handshake messages, | retransmission of the second flight of client handshake messages, | |||
| that is, the TLS Finished and any client authentication messages. | that is, the TLS Finished and any client authentication messages. | |||
| STREAM frames that are determined to be lost SHOULD be retransmitted | STREAM 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. | |||
| 11. Flow Control | 10. Flow Control | |||
| It is necessary to limit the amount of data that a sender may have | It is necessary to limit the amount of data that a sender may have | |||
| outstanding at any time, so as to prevent a fast sender from | outstanding at any time, so as to prevent a fast sender from | |||
| overwhelming a slow receiver, or to prevent a malicious sender from | overwhelming a slow receiver, or to prevent a malicious sender from | |||
| consuming significant resources at a receiver. This section | consuming significant resources at a receiver. This section | |||
| describes QUIC's flow-control mechanisms. | describes QUIC's flow-control mechanisms. | |||
| QUIC employs a credit-based flow-control scheme similar to HTTP/2's | QUIC employs a credit-based flow-control scheme similar to HTTP/2's | |||
| flow control [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 | |||
| skipping to change at page 79, line 20 ¶ | skipping to change at page 82, line 24 ¶ | |||
| 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 | |||
| (Section 12) if the peer violates the advertised connection or stream | (Section 11) if the peer violates the advertised connection or stream | |||
| data limits. | data limits. | |||
| A sender SHOULD send BLOCKED or STREAM_BLOCKED frames to indicate it | A sender SHOULD send BLOCKED or STREAM_BLOCKED frames to indicate it | |||
| has data to write but is blocked by flow control limits. These | has data to write but is blocked by flow control limits. These | |||
| frames are expected to be sent infrequently in common cases, but they | frames are expected to be sent infrequently in common cases, but they | |||
| are considered useful for debugging and monitoring purposes. | are considered useful for debugging and monitoring purposes. | |||
| A receiver advertises credit for a stream by sending a | A receiver advertises credit for a stream by sending a | |||
| MAX_STREAM_DATA frame with the Stream ID set appropriately. A | MAX_STREAM_DATA frame with the Stream ID set appropriately. A | |||
| receiver could use the current offset of data consumed to determine | receiver could use the current offset of data consumed to determine | |||
| skipping to change at page 79, line 45 ¶ | skipping to change at page 83, line 5 ¶ | |||
| 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 except stream 0. A receiver | |||
| advertises credit for a connection by sending a MAX_DATA frame. A | advertises credit for a connection by sending a MAX_DATA frame. A | |||
| receiver maintains a cumulative sum of bytes received on all | receiver maintains a cumulative sum of bytes received on all | |||
| contributing streams, which are used to check for flow control | contributing streams, which are used to check for flow control | |||
| violations. A receiver might use a sum of bytes consumed on all | violations. A receiver might use a sum of bytes consumed on all | |||
| contributing streams to determine the maximum data limit to be | contributing streams to determine the maximum data limit to be | |||
| advertised. | advertised. | |||
| 11.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 | |||
| expects more data can be received, then the connection can be in a | expects more data can be received, then the connection can be in a | |||
| deadlock, with the sender waiting for a MAX_DATA or MAX_STREAM_DATA | deadlock, with the sender waiting for a MAX_DATA or MAX_STREAM_DATA | |||
| skipping to change at page 80, line 28 ¶ | skipping to change at page 83, line 36 ¶ | |||
| sent on the stream to make the same adjustment in its connection flow | sent on the stream to make the same adjustment in its connection flow | |||
| controller. | controller. | |||
| To avoid this de-synchronization, a RST_STREAM sender MUST include | To avoid this de-synchronization, a RST_STREAM sender MUST include | |||
| the final byte offset sent on the stream in the RST_STREAM frame. On | the final byte offset sent on the stream in the RST_STREAM frame. On | |||
| receiving a RST_STREAM frame, a receiver definitively knows how many | receiving a RST_STREAM frame, a receiver definitively knows how many | |||
| bytes were sent on that stream before the RST_STREAM frame, and the | bytes were sent on that stream before the RST_STREAM frame, and the | |||
| receiver MUST use the final offset to account for all bytes sent on | receiver MUST use the final offset to account for all bytes sent on | |||
| the stream in its connection level flow controller. | the stream in its connection level flow controller. | |||
| 11.1.1. Response to a RST_STREAM | 10.1.1. Response to a RST_STREAM | |||
| RST_STREAM terminates one direction of a stream abruptly. Whether | RST_STREAM terminates one direction of a stream abruptly. Whether | |||
| any action or response can or should be taken on the data already | any action or response can or should be taken on the data already | |||
| received is an application-specific issue, but it will often be the | received is an application-specific issue, but it will often be the | |||
| case that upon receipt of a RST_STREAM an endpoint will choose to | case that upon receipt of a RST_STREAM an endpoint will choose to | |||
| stop sending data in its own direction. If the sender of a | stop sending data in its own direction. If the sender of a | |||
| RST_STREAM wishes to explicitly state that no future data will be | RST_STREAM wishes to explicitly state that no future data will be | |||
| processed, that endpoint MAY send a STOP_SENDING frame at the same | processed, that endpoint MAY send a STOP_SENDING frame at the same | |||
| time. | time. | |||
| 11.1.2. Data Limit Increments | 10.1.2. Data Limit Increments | |||
| This document leaves when and how many bytes to advertise in a | This document leaves when and how many bytes to advertise in a | |||
| MAX_DATA or MAX_STREAM_DATA to implementations, but offers a few | MAX_DATA or MAX_STREAM_DATA to implementations, but offers a few | |||
| considerations. These frames contribute to connection overhead. | considerations. These frames contribute to connection overhead. | |||
| Therefore frequently sending frames with small changes is | Therefore frequently sending frames with small changes is | |||
| undesirable. At the same time, infrequent updates require larger | undesirable. At the same time, infrequent updates require larger | |||
| 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 roundtrip 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. | |||
| 11.1.3. Handshake Exemption | 10.1.3. Handshake Exemption | |||
| During the initial handshake, an endpoint could need to send a larger | 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 | message on stream 0 than would ordinarily be permitted by the peer's | |||
| initial stream flow control window. Since MAX_STREAM_DATA frames are | initial stream flow control window. Since MAX_STREAM_DATA frames are | |||
| not permitted in these early packets, the peer cannot provide | not permitted in these early packets, the peer cannot provide | |||
| additional flow control window in order to complete the handshake. | additional flow control window in order to complete the handshake. | |||
| Endpoints MAY exceed the flow control limits on stream 0 prior to the | Endpoints MAY exceed the flow control limits on stream 0 prior to the | |||
| completion of the cryptographic handshake. (That is, in Initial, | completion of the cryptographic handshake. (That is, in Initial, | |||
| Retry, and Handshake packets.) However, once the handshake is | Retry, and Handshake packets.) However, once the handshake is | |||
| complete, endpoints MUST NOT send additional data beyond the peer's | complete, endpoints MUST NOT send additional data beyond the peer's | |||
| permitted offset. If the amount of data sent during the handshake | permitted offset. If the amount of data sent during the handshake | |||
| exceeds the peer's maximum offset, the endpoint cannot send | exceeds the peer's maximum offset, the endpoint cannot send | |||
| additional data on stream 0 until the peer has sent a MAX_STREAM_DATA | additional data on stream 0 until the peer has sent a MAX_STREAM_DATA | |||
| frame indicating a larger maximum offset. | frame indicating a larger maximum offset. | |||
| 11.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 | |||
| maximum stream ID based on current activity, system conditions, and | maximum stream ID based on current activity, system conditions, and | |||
| other environmental factors. | other environmental factors. | |||
| 11.2.1. Blocking on Flow Control | 10.2.1. Blocking on Flow Control | |||
| If a sender does not receive a MAX_DATA or MAX_STREAM_DATA frame when | If a sender does not receive a MAX_DATA or MAX_STREAM_DATA frame when | |||
| it has run out of flow control credit, the sender will be blocked and | it has run out of flow control credit, the sender will be blocked and | |||
| SHOULD send a BLOCKED or STREAM_BLOCKED frame. These frames are | SHOULD send a BLOCKED or STREAM_BLOCKED frame. These frames are | |||
| expected to be useful for debugging at the receiver; they do not | expected to be useful for debugging at the receiver; they do not | |||
| require any other action. A receiver SHOULD NOT wait for a BLOCKED | require any other action. A receiver SHOULD NOT wait for a BLOCKED | |||
| or STREAM_BLOCKED frame before sending MAX_DATA or MAX_STREAM_DATA, | or STREAM_BLOCKED frame before sending MAX_DATA or MAX_STREAM_DATA, | |||
| since doing so will mean that a sender is unable to send for an | since doing so will mean that a sender is unable to send for an | |||
| entire round trip. | entire round trip. | |||
| For smooth operation of the congestion controller, it is generally | For smooth operation of the congestion controller, it is generally | |||
| considered best to not let the sender go into quiescence if | considered best to not let the sender go into quiescence if | |||
| avoidable. To avoid blocking a sender, and to reasonably account for | avoidable. To avoid blocking a sender, and to reasonably account for | |||
| the possibiity of loss, a receiver should send a MAX_DATA or | the possibiity of loss, a receiver should send a MAX_DATA or | |||
| MAX_STREAM_DATA frame at least two roundtrips before it expects the | MAX_STREAM_DATA frame at least two round trips before it expects the | |||
| sender to get blocked. | sender to get blocked. | |||
| A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | |||
| when it reaches a data limit. A sender SHOULD NOT send multiple | when it reaches a data limit. A sender SHOULD NOT send multiple | |||
| BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | |||
| original frame is determined to be lost. Another BLOCKED or | original frame is determined to be lost. Another BLOCKED or | |||
| STREAM_BLOCKED frame can be sent after the data limit is increased. | STREAM_BLOCKED frame can be sent after the data limit is increased. | |||
| 11.3. Stream Final Offset | 10.3. Stream Final Offset | |||
| The final offset is the count of the number of octets that are | The final offset is the count of the number of octets that are | |||
| transmitted on a stream. For a stream that is reset, the final | transmitted on a stream. For a stream that is reset, the final | |||
| offset is carried explicitly in a RST_STREAM frame. Otherwise, the | offset is carried explicitly in a RST_STREAM frame. Otherwise, the | |||
| final offset is the offset of the end of the data carried in a STREAM | final offset is the offset of the end of the data carried in a STREAM | |||
| frame marked with a FIN flag, or 0 in the case of incoming | frame marked with a FIN flag, or 0 in the case of incoming | |||
| unidirectional streams. | unidirectional streams. | |||
| An endpoint will know the final offset for a stream when the receive | An endpoint will know the final offset for a stream when the receive | |||
| stream enters the "Size Known" or "Reset Recvd" state. | stream enters the "Size Known" or "Reset Recvd" state. | |||
| An endpoint MUST NOT send data on a stream at or beyond the final | An endpoint MUST NOT send data on a stream at or beyond the final | |||
| offset. | offset. | |||
| Once a final offset for a stream is known, it cannot change. If a | Once a final offset for a stream is known, it cannot change. If a | |||
| RST_STREAM or STREAM frame causes the final offset to change for a | RST_STREAM or STREAM frame causes the final offset to change for a | |||
| stream, an endpoint SHOULD respond with a FINAL_OFFSET_ERROR error | stream, an endpoint SHOULD respond with a FINAL_OFFSET_ERROR error | |||
| (see Section 12). A receiver SHOULD treat receipt of data at or | (see Section 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. | |||
| 12. 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. Errors can affect an entire connection (see | error to its peer. Both transport-level and application-level errors | |||
| Section 12.1), or a single stream (see Section 12.2). | can affect an entire connection (see Section 11.1), while only | |||
| application-level errors can be isolated to a single stream (see | ||||
| Section 11.2). | ||||
| The most appropriate error code (Section 12.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 7.9.4) is not suitable for any error that | A stateless reset (Section 6.9.4) is not suitable for any error that | |||
| can be signaled with a CONNECTION_CLOSE, APPLICATION_CLOSE, or | can be signaled with a CONNECTION_CLOSE, APPLICATION_CLOSE, or | |||
| RST_STREAM frame. A stateless reset MUST NOT be used by an endpoint | RST_STREAM frame. A stateless reset MUST NOT be used by an endpoint | |||
| that has the state necessary to send a frame on the connection. | that has the state necessary to send a frame on the connection. | |||
| 12.1. Connection Errors | 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 8.4, | CONNECTION_CLOSE or APPLICATION_CLOSE frame (Section 7.4, | |||
| Section 8.5). An endpoint MAY close the connection in this manner | Section 7.5). An endpoint MAY close the connection in this manner | |||
| even if the error only affects a single stream. | even if the error only affects a single stream. | |||
| Application protocols can signal application-specific protocol errors | Application protocols can signal application-specific protocol errors | |||
| using the APPLICATION_CLOSE frame. Errors that are specific to the | using the APPLICATION_CLOSE frame. Errors that are specific to the | |||
| transport, including all those described in this document, are | transport, including all those described in this document, are | |||
| carried in a CONNECTION_CLOSE frame. Other than the type of error | carried in a CONNECTION_CLOSE frame. Other than the type of error | |||
| code they carry, these frames are identical in format and semantics. | code they carry, these frames are identical in format and semantics. | |||
| A CONNECTION_CLOSE or APPLICATION_CLOSE frame could be sent in a | A CONNECTION_CLOSE or APPLICATION_CLOSE frame could be sent in a | |||
| packet that is lost. An endpoint SHOULD be prepared to retransmit a | packet that is lost. An endpoint SHOULD be prepared to retransmit a | |||
| packet containing either frame type if it receives more packets on a | packet containing either frame type if it receives more packets on a | |||
| terminated connection. Limiting the number of retransmissions and | terminated connection. Limiting the number of retransmissions and | |||
| the time over which this final packet is sent limits the effort | the time over which this final packet is sent limits the effort | |||
| expended on terminated connections. | expended on terminated connections. | |||
| An endpoint that chooses not to retransmit packets containing | An endpoint that chooses not to retransmit packets containing | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE risks a peer missing the first | CONNECTION_CLOSE or APPLICATION_CLOSE risks a peer missing the first | |||
| such packet. The only mechanism available to an endpoint that | such packet. The only mechanism available to an endpoint that | |||
| continues to receive data for a terminated connection is to use the | continues to receive data for a terminated connection is to use the | |||
| stateless reset process (Section 7.9.4). | stateless reset process (Section 6.9.4). | |||
| An endpoint that receives an invalid CONNECTION_CLOSE or | An endpoint that receives an invalid CONNECTION_CLOSE or | |||
| APPLICATION_CLOSE frame MUST NOT signal the existence of the error to | APPLICATION_CLOSE frame MUST NOT signal the existence of the error to | |||
| its peer. | its peer. | |||
| 12.2. Stream Errors | 11.2. Stream Errors | |||
| If the error affects a single stream, but otherwise leaves the | If an application-level error affects a single stream, but otherwise | |||
| connection in a recoverable state, the endpoint can send a RST_STREAM | leaves the connection in a recoverable state, the endpoint can send a | |||
| frame (Section 8.3) with an appropriate error code to terminate just | RST_STREAM frame (Section 7.3) with an appropriate error code to | |||
| the affected stream. | terminate just the affected stream. | |||
| Stream 0 is critical to the functioning of the entire connection. If | Stream 0 is critical to the functioning of the entire connection. If | |||
| stream 0 is closed with either a RST_STREAM or STREAM frame bearing | stream 0 is closed with either a RST_STREAM or STREAM frame bearing | |||
| the FIN flag, an endpoint MUST generate a connection error of type | the FIN flag, an endpoint MUST generate a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| RST_STREAM MUST be instigated by the application and MUST carry an | Other than STOPPING (Section 9.3), RST_STREAM MUST be instigated by | |||
| application error code. Resetting a stream without knowledge of the | the application and MUST carry an application error code. Resetting | |||
| application protocol could cause the protocol to enter an | a stream without knowledge of the application protocol could cause | |||
| unrecoverable state. Application protocols might require certain | the protocol to enter an unrecoverable state. Application protocols | |||
| streams to be reliably delivered in order to guarantee consistent | might require certain streams to be reliably delivered in order to | |||
| state between endpoints. | guarantee consistent state between endpoints. | |||
| 12.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. | |||
| This section lists the defined QUIC transport error codes that may be | This section lists the defined QUIC transport error codes that may be | |||
| used in a CONNECTION_CLOSE frame. These errors apply to the entire | used in a CONNECTION_CLOSE frame. These errors apply to the entire | |||
| connection. | connection. | |||
| NO_ERROR (0x0): An endpoint uses this with CONNECTION_CLOSE to | NO_ERROR (0x0): An endpoint uses this with CONNECTION_CLOSE to | |||
| signal that the connection is being closed abruptly in the absence | signal that the connection is being closed abruptly in the absence | |||
| of any error. | of any error. | |||
| INTERNAL_ERROR (0x1): The endpoint encountered an internal error and | INTERNAL_ERROR (0x1): The endpoint encountered an internal error and | |||
| cannot continue with the connection. | cannot continue with the connection. | |||
| SERVER_BUSY (0x2): The server is currently busy and does not accept | SERVER_BUSY (0x2): The server is currently busy and does not accept | |||
| any new connections. | any new connections. | |||
| FLOW_CONTROL_ERROR (0x3): An endpoint received more data than it | FLOW_CONTROL_ERROR (0x3): An endpoint received more data than it | |||
| permitted in its advertised data limits (see Section 11). | permitted in its advertised data limits (see Section 10). | |||
| STREAM_ID_ERROR (0x4): An endpoint received a frame for a stream | STREAM_ID_ERROR (0x4): An endpoint received a frame for a stream | |||
| identifier that exceeded its advertised maximum stream ID. | identifier that exceeded its advertised maximum stream ID. | |||
| STREAM_STATE_ERROR (0x5): An endpoint received a frame for a stream | STREAM_STATE_ERROR (0x5): An endpoint received a frame for a stream | |||
| that was not in a state that permitted that frame (see | that was not in a state that permitted that frame (see | |||
| Section 10.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_FORMAT_ERROR (0x7): An endpoint received a frame that was | |||
| skipping to change at page 85, line 31 ¶ | skipping to change at page 88, line 44 ¶ | |||
| 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 | FRAME_ERROR (0x1XX): An endpoint detected an error in a specific | |||
| frame type. The frame type is included as the last octet of the | frame type. The frame type is included as the last octet of the | |||
| error code. For example, an error in a MAX_STREAM_ID frame would | error code. For example, an error in a MAX_STREAM_ID frame would | |||
| be indicated with the code (0x106). | be indicated with the code (0x106). | |||
| Codes for errors occuring when TLS is used for the crypto handshake | Codes for errors occuring when TLS is used for the crypto handshake | |||
| are defined in Section 11 of [QUIC-TLS]. See Section 14.2 for | are defined in Section 11 of [QUIC-TLS]. See Section 13.2 for | |||
| details of registering new error codes. | details of registering new error codes. | |||
| 12.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 8.3) and APPLICATION_CLOSE (Section 8.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. | |||
| 13. Security and Privacy Considerations | 12. Security and Privacy Considerations | |||
| 13.1. Spoofed ACK Attack | ||||
| 12.1. 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 7.6) from the server and then release the IP address it used | (Section 6.6) 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 86, line 33 ¶ | skipping to change at page 89, line 42 ¶ | |||
| 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. | |||
| 13.2. Slowloris Attacks | 12.2. Optimistic ACK Attack | |||
| An endpoint that acknowledges packets it has not received might cause | ||||
| a congestion controller to permit sending at rates beyond what the | ||||
| network supports. An endpoint MAY skip packet numbers when sending | ||||
| packets to detect this behavior. An endpoint can then immediately | ||||
| close the connection with a connection error of type | ||||
| PROTOCOL_VIOLATION (see Section 6.9.3). | ||||
| 12.3. 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. | |||
| 13.3. Stream Fragmentation and Reassembly Attacks | 12.4. 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. | |||
| 13.4. Stream Commitment Attack | 12.5. 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 10.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 10.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. | |||
| 14. IANA Considerations | 13. IANA Considerations | |||
| 14.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 | |||
| Use [RFC8126]. | Use [RFC8126]. | |||
| skipping to change at page 88, line 33 ¶ | skipping to change at page 92, line 8 ¶ | |||
| readily accessible. The expert(s) are encouraged to be biased | readily accessible. The expert(s) are encouraged to be biased | |||
| towards approving registrations unless they are abusive, frivolous, | towards approving registrations unless they are abusive, frivolous, | |||
| or actively harmful (not merely aesthetically displeasing, or | or actively harmful (not merely aesthetically displeasing, or | |||
| architecturally dubious). | architecturally dubious). | |||
| The initial contents of this registry are shown in Table 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 7.4.1 | | | 0x0000 | initial_max_stream_data | Section 6.4.1 | | |||
| | | | | | ||||
| | 0x0001 | initial_max_data | Section 7.4.1 | | ||||
| | | | | | | | | | | |||
| | 0x0002 | initial_max_stream_id_bidi | Section 7.4.1 | | | 0x0001 | initial_max_data | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0003 | idle_timeout | Section 7.4.1 | | | 0x0002 | initial_max_stream_id_bidi | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0004 | omit_connection_id | Section 7.4.1 | | | 0x0003 | idle_timeout | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0005 | max_packet_size | Section 7.4.1 | | | 0x0005 | max_packet_size | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0006 | stateless_reset_token | Section 7.4.1 | | | 0x0006 | stateless_reset_token | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0007 | ack_delay_exponent | Section 7.4.1 | | | 0x0007 | ack_delay_exponent | Section 6.4.1 | | |||
| | | | | | | | | | | |||
| | 0x0008 | initial_max_stream_id_uni | Section 7.4.1 | | | 0x0008 | initial_max_stream_id_uni | Section 6.4.1 | | |||
| +--------+----------------------------+---------------+ | +--------+----------------------------+---------------+ | |||
| Table 7: Initial QUIC Transport Parameters Entries | Table 7: Initial QUIC Transport Parameters Entries | |||
| 14.2. QUIC Transport Error Codes Registry | 13.2. QUIC Transport Error Codes Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Transport Error | IANA [SHALL add/has added] a registry for "QUIC Transport Error | |||
| Codes" under a "QUIC Protocol" heading. | Codes" under a "QUIC Protocol" heading. | |||
| The "QUIC Transport Error Codes" registry governs a 16-bit space. | The "QUIC Transport Error Codes" registry governs a 16-bit space. | |||
| This space is split into two spaces that are governed by different | This space is split into two spaces that are governed by different | |||
| policies. Values with the first byte in the range 0x00 to 0xfe (in | policies. Values with the first byte in the range 0x00 to 0xfe (in | |||
| hexadecimal) are assigned via the Specification Required policy | hexadecimal) are assigned via the Specification Required policy | |||
| [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 89, line 38 ¶ | skipping to change at page 93, line 13 ¶ | |||
| 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. Note | |||
| that FRAME_ERROR takes the range from 0x100 to 0x1FF and private use | that FRAME_ERROR takes the range from 0x100 to 0x1FF and private use | |||
| occupies the range from 0xFE00 to 0xFFFF. | occupies the range from 0xFE00 to 0xFFFF. | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| | Value | Error | Description | Specificatio | | | Value | Error | Description | Specificatio | | |||
| | | | | n | | | | | | n | | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| | 0x0 | NO_ERROR | No error | Section 12.3 | | | 0x0 | NO_ERROR | No error | Section 11.3 | | |||
| | | | | | | | | | | | | |||
| | 0x1 | INTERNAL_ERROR | Implementatio | Section 12.3 | | | 0x1 | INTERNAL_ERROR | Implementatio | Section 11.3 | | |||
| | | | n error | | | | | | n error | | | |||
| | | | | | | | | | | | | |||
| | 0x2 | SERVER_BUSY | Server | Section 12.3 | | | 0x2 | SERVER_BUSY | Server | Section 11.3 | | |||
| | | | currently | | | | | | currently | | | |||
| | | | busy | | | | | | busy | | | |||
| | | | | | | | | | | | | |||
| | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 12.3 | | | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 11.3 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | 0x4 | STREAM_ID_ERROR | Invalid | Section 12.3 | | | 0x4 | STREAM_ID_ERROR | Invalid | Section 11.3 | | |||
| | | | stream ID | | | | | | stream ID | | | |||
| | | | | | | | | | | | | |||
| | 0x5 | STREAM_STATE_ERROR | Frame | Section 12.3 | | | 0x5 | STREAM_STATE_ERROR | Frame | Section 11.3 | | |||
| | | | received in | | | | | | received in | | | |||
| | | | invalid | | | | | | invalid | | | |||
| | | | stream state | | | | | | stream state | | | |||
| | | | | | | | | | | | | |||
| | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 12.3 | | | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 11.3 | | |||
| | | | final stream | | | | | | final stream | | | |||
| | | | offset | | | | | | offset | | | |||
| | | | | | | | | | | | | |||
| | 0x7 | FRAME_FORMAT_ERROR | Generic frame | Section 12.3 | | | 0x7 | FRAME_FORMAT_ERROR | Generic frame | Section 11.3 | | |||
| | | | format error | | | | | | format error | | | |||
| | | | | | | | | | | | | |||
| | 0x8 | TRANSPORT_PARAMETER_ER | Error in | Section 12.3 | | | 0x8 | TRANSPORT_PARAMETER_ER | Error in | Section 11.3 | | |||
| | | ROR | transport | | | | | ROR | transport | | | |||
| | | | parameters | | | | | | parameters | | | |||
| | | | | | | | | | | | | |||
| | 0x9 | VERSION_NEGOTIATION_ER | Version | Section 12.3 | | | 0x9 | VERSION_NEGOTIATION_ER | Version | Section 11.3 | | |||
| | | ROR | negotiation | | | | | ROR | negotiation | | | |||
| | | | failure | | | | | | failure | | | |||
| | | | | | | | | | | | | |||
| | 0xA | PROTOCOL_VIOLATION | Generic | Section 12.3 | | | 0xA | PROTOCOL_VIOLATION | Generic | Section 11.3 | | |||
| | | | protocol | | | | | | protocol | | | |||
| | | | violation | | | | | | violation | | | |||
| | | | | | | | | | | | | |||
| | 0xB | UNSOLICITED_PATH_RESPO | Unsolicited | Section 12.3 | | | 0xB | UNSOLICITED_PATH_RESPO | Unsolicited | Section 11.3 | | |||
| | | NSE | PATH_RESPONSE | | | | | NSE | PATH_RESPONSE | | | |||
| | | | frame | | | | | | frame | | | |||
| | | | | | | | | | | | | |||
| | 0x100-0x1 | FRAME_ERROR | Specific | Section 12.3 | | | 0x100-0x1 | FRAME_ERROR | Specific | Section 11.3 | | |||
| | FF | | frame format | | | | FF | | frame format | | | |||
| | | | error | | | | | | error | | | |||
| +-----------+------------------------+---------------+--------------+ | +-----------+------------------------+---------------+--------------+ | |||
| Table 8: Initial QUIC Transport Error Codes Entries | Table 8: Initial QUIC Transport Error Codes Entries | |||
| 15. References | 14. References | |||
| 15.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), | |||
| July 2017. | July 2017. | |||
| [PLPMTUD] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | [PLPMTUD] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | |||
| Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007, | Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007, | |||
| <https://www.rfc-editor.org/info/rfc4821>. | <https://www.rfc-editor.org/info/rfc4821>. | |||
| skipping to change at page 91, line 17 ¶ | skipping to change at page 94, line 39 ¶ | |||
| <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-10 (work | and Congestion Control", draft-ietf-quic-recovery-10 (work | |||
| in progress), March 2018. | in progress), April 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-10 (work in progress), March 2018. | tls-10 (work in progress), April 2018. | |||
| [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | |||
| DOI 10.17487/RFC1191, November 1990, | DOI 10.17487/RFC1191, November 1990, | |||
| <https://www.rfc-editor.org/info/rfc1191>. | <https://www.rfc-editor.org/info/rfc1191>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at page 92, line 9 ¶ | skipping to change at page 95, line 32 ¶ | |||
| [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>. | |||
| 15.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-00 (work in progress), March | draft-ietf-quic-invariants-01 (work in progress), April | |||
| 2018. | 2018. | |||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | |||
| Hashing for Message Authentication", RFC 2104, | Hashing for Message Authentication", RFC 2104, | |||
| DOI 10.17487/RFC2104, February 1997, | DOI 10.17487/RFC2104, February 1997, | |||
| <https://www.rfc-editor.org/info/rfc2104>. | <https://www.rfc-editor.org/info/rfc2104>. | |||
| [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | |||
| RFC 2360, DOI 10.17487/RFC2360, June 1998, | RFC 2360, DOI 10.17487/RFC2360, June 1998, | |||
| <https://www.rfc-editor.org/info/rfc2360>. | <https://www.rfc-editor.org/info/rfc2360>. | |||
| skipping to change at page 92, line 44 ¶ | skipping to change at page 96, line 19 ¶ | |||
| [RFC4787] Audet, F., Ed. and C. Jennings, "Network Address | [RFC4787] Audet, F., Ed. and C. Jennings, "Network Address | |||
| Translation (NAT) Behavioral Requirements for Unicast | Translation (NAT) Behavioral Requirements for Unicast | |||
| UDP", BCP 127, RFC 4787, DOI 10.17487/RFC4787, January | UDP", BCP 127, RFC 4787, DOI 10.17487/RFC4787, January | |||
| 2007, <https://www.rfc-editor.org/info/rfc4787>. | 2007, <https://www.rfc-editor.org/info/rfc4787>. | |||
| [RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand | [RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand | |||
| Key Derivation Function (HKDF)", RFC 5869, | Key Derivation Function (HKDF)", RFC 5869, | |||
| DOI 10.17487/RFC5869, May 2010, | DOI 10.17487/RFC5869, May 2010, | |||
| <https://www.rfc-editor.org/info/rfc5869>. | <https://www.rfc-editor.org/info/rfc5869>. | |||
| [RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | ||||
| "TCP Extensions for Multipath Operation with Multiple | ||||
| Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | ||||
| <https://www.rfc-editor.org/info/rfc6824>. | ||||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [SLOWLORIS] | [SLOWLORIS] | |||
| RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | |||
| <https://web.archive.org/web/20150315054838/ | <https://web.archive.org/web/20150315054838/ | |||
| http://ha.ckers.org/slowloris/>. | http://ha.ckers.org/slowloris/>. | |||
| [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | |||
| Communication Review Vol. 37, pp. 361, | Communication Review Vol. 37, pp. 361, | |||
| DOI 10.1145/1282427.1282421, October 2007. | DOI 10.1145/1282427.1282421, October 2007. | |||
| 15.3. URIs | 14.3. URIs | |||
| [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | [1] https://mailarchive.ietf.org/arch/search/?email_list=quic | |||
| [2] https://github.com/quicwg | [2] https://github.com/quicwg | |||
| [3] https://github.com/quicwg/base-drafts/labels/-transport | [3] https://github.com/quicwg/base-drafts/labels/-transport | |||
| [4] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | [4] https://github.com/quicwg/base-drafts/wiki/QUIC-Versions | |||
| Appendix A. Contributors | Appendix A. Contributors | |||
| skipping to change at page 94, line 7 ¶ | skipping to change at page 97, line 25 ¶ | |||
| discussions and public ones on the quic@ietf.org and proto- | discussions and public ones on the quic@ietf.org and proto- | |||
| quic@chromium.org mailing lists. Our thanks to all. | quic@chromium.org mailing lists. Our thanks to all. | |||
| Appendix C. Change Log | Appendix C. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| C.1. Since draft-ietf-quic-transport-09 | C.1. Since draft-ietf-quic-transport-10 | |||
| o Swap payload length and packed number fields in long header | ||||
| (#1294) | ||||
| o Clarified that CONNECTION_CLOSE is allowed in Handshake packet | ||||
| (#1274) | ||||
| o Spin bit reserved (#1283) | ||||
| o Coalescing multiple QUIC packets in a UDP datagram (#1262, #1285) | ||||
| o A more complete connection migration (#1249) | ||||
| o Refine opportunistic ACK defense text (#305, #1030, #1185) | ||||
| o A Stateless Reset Token isn't mandatory (#818, #1191) | ||||
| o Removed implicit stream opening (#896, #1193) | ||||
| o An empty STREAM frame can be used to open a stream without sending | ||||
| data (#901, #1194) | ||||
| o Define stream counts in transport parameters rather than a maximum | ||||
| stream ID (#1023, #1065) | ||||
| o STOP_SENDING is now prohibited before streams are used (#1050) | ||||
| o Recommend including ACK in Retry packets and allow PADDING (#1067, | ||||
| #882) | ||||
| o Endpoints now become closing after an idle timeout (#1178, #1179) | ||||
| o Remove implication that Version Negotiation is sent when a packet | ||||
| of the wrong version is received (#1197) | ||||
| C.2. 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, #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) | |||
| 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, #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) | |||
| C.2. Since draft-ietf-quic-transport-08 | o Endpoints now set the connection ID that their peer uses. | |||
| Connection IDs are variable length. Removed the | ||||
| omit_connection_id transport parameter and the corresponding short | ||||
| header flag. (#1089, #1052, #1146, #821, #745, #821, #1166, #1151) | ||||
| C.3. 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) | |||
| o Clarified stream state machine (#634, #662, #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.3. Since draft-ietf-quic-transport-07 | C.4. 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 96, line 5 ¶ | skipping to change at page 100, line 15 ¶ | |||
| 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.4. Since draft-ietf-quic-transport-06 | C.5. 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.5. Since draft-ietf-quic-transport-05 | C.6. 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.6. Since draft-ietf-quic-transport-04 | C.7. 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 97, line 24 ¶ | skipping to change at page 101, line 34 ¶ | |||
| 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.7. Since draft-ietf-quic-transport-03 | C.8. 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.8. Since draft-ietf-quic-transport-02 | C.9. 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 98, line 27 ¶ | skipping to change at page 102, line 37 ¶ | |||
| 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.9. Since draft-ietf-quic-transport-01 | C.10. 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 100, line 25 ¶ | skipping to change at page 104, line 36 ¶ | |||
| 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.10. Since draft-ietf-quic-transport-00 | C.11. 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.11. Since draft-hamilton-quic-transport-protocol-01 | C.12. Since draft-hamilton-quic-transport-protocol-01 | |||
| o Adopted as base for draft-ietf-quic-tls | o Adopted as base for draft-ietf-quic-tls | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| o Added IANA Considerations section | o Added IANA Considerations section | |||
| o Moved Contributors and Acknowledgments to appendices | o Moved Contributors and Acknowledgments to appendices | |||
| Authors' Addresses | Authors' Addresses | |||
| Jana Iyengar (editor) | Jana Iyengar (editor) | |||
| Fastly | Fastly | |||
| Email: jri.ietf@gmail.com | Email: jri.ietf@gmail.com | |||
| End of changes. 389 change blocks. | ||||
| 987 lines changed or deleted | 1225 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/ | ||||