| draft-ietf-quic-transport-34.txt | draft-ietf-quic-transport-latest.txt | |||
|---|---|---|---|---|
| QUIC Working Group J. Iyengar, Ed. | Internet Engineering Task Force (IETF) J. Iyengar, Ed. | |||
| Internet-Draft Fastly | Request for Comments: 9000 Fastly | |||
| Intended status: Standards Track M. Thomson, Ed. | Category: Standards Track M. Thomson, Ed. | |||
| Expires: July 19, 2021 Mozilla | ISSN: 2070-1721 Mozilla | |||
| January 15, 2021 | May 2021 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-34 | ||||
| Abstract | Abstract | |||
| This document defines the core of the QUIC transport protocol. QUIC | This document defines the core of the QUIC transport protocol. QUIC | |||
| provides applications with flow-controlled streams for structured | provides applications with flow-controlled streams for structured | |||
| communication, low-latency connection establishment, and network path | communication, low-latency connection establishment, and network path | |||
| migration. QUIC includes security measures that ensure | migration. QUIC includes security measures that ensure | |||
| confidentiality, integrity, and availability in a range of deployment | confidentiality, integrity, and availability in a range of deployment | |||
| circumstances. Accompanying documents describe the integration of | circumstances. Accompanying documents describe the integration of | |||
| TLS for key negotiation, loss detection, and an exemplary congestion | TLS for key negotiation, loss detection, and an exemplary congestion | |||
| control algorithm. | control algorithm. | |||
| DO NOT DEPLOY THIS VERSION OF QUIC | ||||
| DO NOT DEPLOY THIS VERSION OF QUIC UNTIL IT IS IN AN RFC. This | ||||
| version is still a work in progress. For trial deployments, please | ||||
| use earlier versions. | ||||
| Note to Readers | ||||
| Discussion of this draft takes place on the QUIC working group | ||||
| mailing list (quic@ietf.org [1]), which is archived at | ||||
| <https://mailarchive.ietf.org/arch/search/?email_list=quic> | ||||
| Working Group information can be found at <https://github.com/ | ||||
| quicwg>; source code and issues list for this draft can be found at | ||||
| <https://github.com/quicwg/base-drafts/labels/-transport>. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on July 19, 2021. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9000. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 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. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 1.1. Document Structure . . . . . . . . . . . . . . . . . . . 8 | 1.1. Document Structure . . . . . . . . . . . . . . . . . . . 7 | |||
| 1.2. Terms and Definitions . . . . . . . . . . . . . . . . . . 10 | 1.2. Terms and Definitions . . . . . . . . . . . . . . . . . . 8 | |||
| 1.3. Notational Conventions . . . . . . . . . . . . . . . . . 11 | 1.3. Notational Conventions . . . . . . . . . . . . . . . . . 9 | |||
| 2. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 2. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 2.1. Stream Types and Identifiers . . . . . . . . . . . . . . 12 | 2.1. Stream Types and Identifiers . . . . . . . . . . . . . . 11 | |||
| 2.2. Sending and Receiving Data . . . . . . . . . . . . . . . 13 | 2.2. Sending and Receiving Data . . . . . . . . . . . . . . . 12 | |||
| 2.3. Stream Prioritization . . . . . . . . . . . . . . . . . . 14 | 2.3. Stream Prioritization . . . . . . . . . . . . . . . . . . 13 | |||
| 2.4. Operations on Streams . . . . . . . . . . . . . . . . . . 14 | 2.4. Operations on Streams . . . . . . . . . . . . . . . . . . 13 | |||
| 3. Stream States . . . . . . . . . . . . . . . . . . . . . . . . 15 | 3. Stream States . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.1. Sending Stream States . . . . . . . . . . . . . . . . . . 16 | 3.1. Sending Stream States . . . . . . . . . . . . . . . . . . 15 | |||
| 3.2. Receiving Stream States . . . . . . . . . . . . . . . . . 18 | 3.2. Receiving Stream States . . . . . . . . . . . . . . . . . 17 | |||
| 3.3. Permitted Frame Types . . . . . . . . . . . . . . . . . . 21 | 3.3. Permitted Frame Types . . . . . . . . . . . . . . . . . . 20 | |||
| 3.4. Bidirectional Stream States . . . . . . . . . . . . . . . 21 | 3.4. Bidirectional Stream States . . . . . . . . . . . . . . . 20 | |||
| 3.5. Solicited State Transitions . . . . . . . . . . . . . . . 22 | 3.5. Solicited State Transitions . . . . . . . . . . . . . . . 22 | |||
| 4. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 23 | 4. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.1. Data Flow Control . . . . . . . . . . . . . . . . . . . . 24 | 4.1. Data Flow Control . . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.2. Increasing Flow Control Limits . . . . . . . . . . . . . 25 | 4.2. Increasing Flow Control Limits . . . . . . . . . . . . . 24 | |||
| 4.3. Flow Control Performance . . . . . . . . . . . . . . . . 26 | 4.3. Flow Control Performance . . . . . . . . . . . . . . . . 25 | |||
| 4.4. Handling Stream Cancellation . . . . . . . . . . . . . . 26 | 4.4. Handling Stream Cancellation . . . . . . . . . . . . . . 25 | |||
| 4.5. Stream Final Size . . . . . . . . . . . . . . . . . . . . 27 | 4.5. Stream Final Size . . . . . . . . . . . . . . . . . . . . 26 | |||
| 4.6. Controlling Concurrency . . . . . . . . . . . . . . . . . 27 | 4.6. Controlling Concurrency . . . . . . . . . . . . . . . . . 27 | |||
| 5. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 5. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.1. Connection ID . . . . . . . . . . . . . . . . . . . . . . 29 | 5.1. Connection ID . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.1.1. Issuing Connection IDs . . . . . . . . . . . . . . . 30 | 5.1.1. Issuing Connection IDs . . . . . . . . . . . . . . . 29 | |||
| 5.1.2. Consuming and Retiring Connection IDs . . . . . . . . 31 | 5.1.2. Consuming and Retiring Connection IDs . . . . . . . . 31 | |||
| 5.2. Matching Packets to Connections . . . . . . . . . . . . . 33 | 5.2. Matching Packets to Connections . . . . . . . . . . . . . 32 | |||
| 5.2.1. Client Packet Handling . . . . . . . . . . . . . . . 33 | 5.2.1. Client Packet Handling . . . . . . . . . . . . . . . 33 | |||
| 5.2.2. Server Packet Handling . . . . . . . . . . . . . . . 34 | 5.2.2. Server Packet Handling . . . . . . . . . . . . . . . 33 | |||
| 5.2.3. Considerations for Simple Load Balancers . . . . . . 35 | 5.2.3. Considerations for Simple Load Balancers . . . . . . 34 | |||
| 5.3. Operations on Connections . . . . . . . . . . . . . . . . 35 | 5.3. Operations on Connections . . . . . . . . . . . . . . . . 34 | |||
| 6. Version Negotiation . . . . . . . . . . . . . . . . . . . . . 36 | 6. Version Negotiation . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 6.1. Sending Version Negotiation Packets . . . . . . . . . . . 37 | 6.1. Sending Version Negotiation Packets . . . . . . . . . . . 36 | |||
| 6.2. Handling Version Negotiation Packets . . . . . . . . . . 37 | 6.2. Handling Version Negotiation Packets . . . . . . . . . . 36 | |||
| 6.2.1. Version Negotiation Between Draft Versions . . . . . 37 | 6.3. Using Reserved Versions . . . . . . . . . . . . . . . . . 37 | |||
| 6.3. Using Reserved Versions . . . . . . . . . . . . . . . . . 38 | 7. Cryptographic and Transport Handshake . . . . . . . . . . . . 37 | |||
| 7. Cryptographic and Transport Handshake . . . . . . . . . . . . 38 | 7.1. Example Handshake Flows . . . . . . . . . . . . . . . . . 39 | |||
| 7.1. Example Handshake Flows . . . . . . . . . . . . . . . . . 40 | 7.2. Negotiating Connection IDs . . . . . . . . . . . . . . . 40 | |||
| 7.2. Negotiating Connection IDs . . . . . . . . . . . . . . . 41 | 7.3. Authenticating Connection IDs . . . . . . . . . . . . . . 41 | |||
| 7.3. Authenticating Connection IDs . . . . . . . . . . . . . . 42 | 7.4. Transport Parameters . . . . . . . . . . . . . . . . . . 43 | |||
| 7.4. Transport Parameters . . . . . . . . . . . . . . . . . . 44 | 7.4.1. Values of Transport Parameters for 0-RTT . . . . . . 44 | |||
| 7.4.1. Values of Transport Parameters for 0-RTT . . . . . . 45 | 7.4.2. New Transport Parameters . . . . . . . . . . . . . . 46 | |||
| 7.4.2. New Transport Parameters . . . . . . . . . . . . . . 47 | 7.5. Cryptographic Message Buffering . . . . . . . . . . . . . 47 | |||
| 7.5. Cryptographic Message Buffering . . . . . . . . . . . . . 48 | 8. Address Validation . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 8. Address Validation . . . . . . . . . . . . . . . . . . . . . 48 | 8.1. Address Validation during Connection Establishment . . . 48 | |||
| 8.1. Address Validation During Connection Establishment . . . 49 | 8.1.1. Token Construction . . . . . . . . . . . . . . . . . 49 | |||
| 8.1.1. Token Construction . . . . . . . . . . . . . . . . . 50 | 8.1.2. Address Validation Using Retry Packets . . . . . . . 49 | |||
| 8.1.2. Address Validation using Retry Packets . . . . . . . 50 | 8.1.3. Address Validation for Future Connections . . . . . . 50 | |||
| 8.1.3. Address Validation for Future Connections . . . . . . 51 | 8.1.4. Address Validation Token Integrity . . . . . . . . . 52 | |||
| 8.1.4. Address Validation Token Integrity . . . . . . . . . 53 | 8.2. Path Validation . . . . . . . . . . . . . . . . . . . . . 53 | |||
| 8.2. Path Validation . . . . . . . . . . . . . . . . . . . . . 54 | 8.2.1. Initiating Path Validation . . . . . . . . . . . . . 54 | |||
| 8.2.1. Initiating Path Validation . . . . . . . . . . . . . 55 | 8.2.2. Path Validation Responses . . . . . . . . . . . . . . 55 | |||
| 8.2.2. Path Validation Responses . . . . . . . . . . . . . . 56 | 8.2.3. Successful Path Validation . . . . . . . . . . . . . 56 | |||
| 8.2.3. Successful Path Validation . . . . . . . . . . . . . 57 | 8.2.4. Failed Path Validation . . . . . . . . . . . . . . . 56 | |||
| 8.2.4. Failed Path Validation . . . . . . . . . . . . . . . 57 | 9. Connection Migration . . . . . . . . . . . . . . . . . . . . 57 | |||
| 9. Connection Migration . . . . . . . . . . . . . . . . . . . . 58 | 9.1. Probing a New Path . . . . . . . . . . . . . . . . . . . 58 | |||
| 9.1. Probing a New Path . . . . . . . . . . . . . . . . . . . 59 | 9.2. Initiating Connection Migration . . . . . . . . . . . . . 58 | |||
| 9.2. Initiating Connection Migration . . . . . . . . . . . . . 59 | 9.3. Responding to Connection Migration . . . . . . . . . . . 59 | |||
| 9.3. Responding to Connection Migration . . . . . . . . . . . 60 | 9.3.1. Peer Address Spoofing . . . . . . . . . . . . . . . . 59 | |||
| 9.3.1. Peer Address Spoofing . . . . . . . . . . . . . . . . 60 | 9.3.2. On-Path Address Spoofing . . . . . . . . . . . . . . 60 | |||
| 9.3.2. On-Path Address Spoofing . . . . . . . . . . . . . . 61 | 9.3.3. Off-Path Packet Forwarding . . . . . . . . . . . . . 60 | |||
| 9.3.3. Off-Path Packet Forwarding . . . . . . . . . . . . . 61 | 9.4. Loss Detection and Congestion Control . . . . . . . . . . 61 | |||
| 9.4. Loss Detection and Congestion Control . . . . . . . . . . 62 | 9.5. Privacy Implications of Connection Migration . . . . . . 62 | |||
| 9.5. Privacy Implications of Connection Migration . . . . . . 63 | 9.6. Server's Preferred Address . . . . . . . . . . . . . . . 64 | |||
| 9.6. Server's Preferred Address . . . . . . . . . . . . . . . 65 | 9.6.1. Communicating a Preferred Address . . . . . . . . . . 64 | |||
| 9.6.1. Communicating a Preferred Address . . . . . . . . . . 65 | 9.6.2. Migration to a Preferred Address . . . . . . . . . . 64 | |||
| 9.6.2. Migration to a Preferred Address . . . . . . . . . . 65 | 9.6.3. Interaction of Client Migration and Preferred Address 65 | |||
| 9.6.3. Interaction of Client Migration and Preferred Address 66 | 9.7. Use of IPv6 Flow Label and Migration . . . . . . . . . . 66 | |||
| 9.7. Use of IPv6 Flow-Label and Migration . . . . . . . . . . 67 | 10. Connection Termination . . . . . . . . . . . . . . . . . . . 66 | |||
| 10. Connection Termination . . . . . . . . . . . . . . . . . . . 67 | 10.1. Idle Timeout . . . . . . . . . . . . . . . . . . . . . . 66 | |||
| 10.1. Idle Timeout . . . . . . . . . . . . . . . . . . . . . . 67 | 10.1.1. Liveness Testing . . . . . . . . . . . . . . . . . . 67 | |||
| 10.1.1. Liveness Testing . . . . . . . . . . . . . . . . . . 68 | 10.1.2. Deferring Idle Timeout . . . . . . . . . . . . . . . 67 | |||
| 10.1.2. Deferring Idle Timeout . . . . . . . . . . . . . . . 68 | 10.2. Immediate Close . . . . . . . . . . . . . . . . . . . . 68 | |||
| 10.2. Immediate Close . . . . . . . . . . . . . . . . . . . . 69 | 10.2.1. Closing Connection State . . . . . . . . . . . . . . 69 | |||
| 10.2.1. Closing Connection State . . . . . . . . . . . . . . 70 | 10.2.2. Draining Connection State . . . . . . . . . . . . . 70 | |||
| 10.2.2. Draining Connection State . . . . . . . . . . . . . 71 | 10.2.3. Immediate Close during the Handshake . . . . . . . . 70 | |||
| 10.2.3. Immediate Close During the Handshake . . . . . . . . 71 | 10.3. Stateless Reset . . . . . . . . . . . . . . . . . . . . 72 | |||
| 10.3. Stateless Reset . . . . . . . . . . . . . . . . . . . . 73 | 10.3.1. Detecting a Stateless Reset . . . . . . . . . . . . 74 | |||
| 10.3.1. Detecting a Stateless Reset . . . . . . . . . . . . 75 | 10.3.2. Calculating a Stateless Reset Token . . . . . . . . 75 | |||
| 10.3.2. Calculating a Stateless Reset Token . . . . . . . . 76 | 10.3.3. Looping . . . . . . . . . . . . . . . . . . . . . . 76 | |||
| 10.3.3. Looping . . . . . . . . . . . . . . . . . . . . . . 77 | 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 77 | |||
| 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 78 | 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 77 | |||
| 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 78 | 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 78 | |||
| 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 79 | 12. Packets and Frames . . . . . . . . . . . . . . . . . . . . . 79 | |||
| 12. Packets and Frames . . . . . . . . . . . . . . . . . . . . . 80 | 12.1. Protected Packets . . . . . . . . . . . . . . . . . . . 79 | |||
| 12.1. Protected Packets . . . . . . . . . . . . . . . . . . . 80 | 12.2. Coalescing Packets . . . . . . . . . . . . . . . . . . . 80 | |||
| 12.2. Coalescing Packets . . . . . . . . . . . . . . . . . . . 81 | 12.3. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 12.3. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 82 | 12.4. Frames and Frame Types . . . . . . . . . . . . . . . . . 82 | |||
| 12.4. Frames and Frame Types . . . . . . . . . . . . . . . . . 83 | 12.5. Frames and Number Spaces . . . . . . . . . . . . . . . . 86 | |||
| 12.5. Frames and Number Spaces . . . . . . . . . . . . . . . . 87 | 13. Packetization and Reliability . . . . . . . . . . . . . . . . 87 | |||
| 13. Packetization and Reliability . . . . . . . . . . . . . . . . 88 | 13.1. Packet Processing . . . . . . . . . . . . . . . . . . . 87 | |||
| 13.1. Packet Processing . . . . . . . . . . . . . . . . . . . 88 | 13.2. Generating Acknowledgments . . . . . . . . . . . . . . . 88 | |||
| 13.2. Generating Acknowledgments . . . . . . . . . . . . . . . 89 | 13.2.1. Sending ACK Frames . . . . . . . . . . . . . . . . . 88 | |||
| 13.2.1. Sending ACK Frames . . . . . . . . . . . . . . . . . 89 | 13.2.2. Acknowledgment Frequency . . . . . . . . . . . . . . 89 | |||
| 13.2.2. Acknowledgment Frequency . . . . . . . . . . . . . . 90 | 13.2.3. Managing ACK Ranges . . . . . . . . . . . . . . . . 90 | |||
| 13.2.3. Managing ACK Ranges . . . . . . . . . . . . . . . . 91 | 13.2.4. Limiting Ranges by Tracking ACK Frames . . . . . . . 91 | |||
| 13.2.4. Limiting Ranges by Tracking ACK Frames . . . . . . . 92 | 13.2.5. Measuring and Reporting Host Delay . . . . . . . . . 92 | |||
| 13.2.5. Measuring and Reporting Host Delay . . . . . . . . . 93 | 13.2.6. ACK Frames and Packet Protection . . . . . . . . . . 92 | |||
| 13.2.6. ACK Frames and Packet Protection . . . . . . . . . . 93 | 13.2.7. PADDING Frames Consume Congestion Window . . . . . . 92 | |||
| 13.2.7. PADDING Frames Consume Congestion Window . . . . . . 93 | 13.3. Retransmission of Information . . . . . . . . . . . . . 93 | |||
| 13.3. Retransmission of Information . . . . . . . . . . . . . 94 | 13.4. Explicit Congestion Notification . . . . . . . . . . . . 95 | |||
| 13.4. Explicit Congestion Notification . . . . . . . . . . . . 96 | 13.4.1. Reporting ECN Counts . . . . . . . . . . . . . . . . 96 | |||
| 13.4.1. Reporting ECN Counts . . . . . . . . . . . . . . . . 97 | 13.4.2. ECN Validation . . . . . . . . . . . . . . . . . . . 96 | |||
| 13.4.2. ECN Validation . . . . . . . . . . . . . . . . . . . 97 | 14. Datagram Size . . . . . . . . . . . . . . . . . . . . . . . . 98 | |||
| 14. Datagram Size . . . . . . . . . . . . . . . . . . . . . . . . 99 | 14.1. Initial Datagram Size . . . . . . . . . . . . . . . . . 99 | |||
| 14.1. Initial Datagram Size . . . . . . . . . . . . . . . . . 100 | 14.2. Path Maximum Transmission Unit . . . . . . . . . . . . . 100 | |||
| 14.2. Path Maximum Transmission Unit . . . . . . . . . . . . . 101 | 14.2.1. Handling of ICMP Messages by PMTUD . . . . . . . . . 101 | |||
| 14.2.1. Handling of ICMP Messages by PMTUD . . . . . . . . . 102 | 14.3. Datagram Packetization Layer PMTU Discovery . . . . . . 102 | |||
| 14.3. Datagram Packetization Layer PMTU Discovery . . . . . . 103 | 14.3.1. DPLPMTUD and Initial Connectivity . . . . . . . . . 102 | |||
| 14.3.1. DPLPMTUD and Initial Connectivity . . . . . . . . . 103 | 14.3.2. Validating the Network Path with DPLPMTUD . . . . . 102 | |||
| 14.3.2. Validating the Network Path with DPLPMTUD . . . . . 103 | 14.3.3. Handling of ICMP Messages by DPLPMTUD . . . . . . . 102 | |||
| 14.3.3. Handling of ICMP Messages by DPLPMTUD . . . . . . . 103 | 14.4. Sending QUIC PMTU Probes . . . . . . . . . . . . . . . . 102 | |||
| 14.4. Sending QUIC PMTU Probes . . . . . . . . . . . . . . . . 103 | 14.4.1. PMTU Probes Containing Source Connection ID . . . . 103 | |||
| 14.4.1. PMTU Probes Containing Source Connection ID . . . . 104 | 15. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 103 | |||
| 15. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 104 | 16. Variable-Length Integer Encoding . . . . . . . . . . . . . . 104 | |||
| 16. Variable-Length Integer Encoding . . . . . . . . . . . . . . 105 | 17. Packet Formats . . . . . . . . . . . . . . . . . . . . . . . 105 | |||
| 17. Packet Formats . . . . . . . . . . . . . . . . . . . . . . . 106 | 17.1. Packet Number Encoding and Decoding . . . . . . . . . . 105 | |||
| 17.1. Packet Number Encoding and Decoding . . . . . . . . . . 106 | 17.2. Long Header Packets . . . . . . . . . . . . . . . . . . 106 | |||
| 17.2. Long Header Packets . . . . . . . . . . . . . . . . . . 107 | 17.2.1. Version Negotiation Packet . . . . . . . . . . . . . 109 | |||
| 17.2.1. Version Negotiation Packet . . . . . . . . . . . . . 110 | 17.2.2. Initial Packet . . . . . . . . . . . . . . . . . . . 110 | |||
| 17.2.2. Initial Packet . . . . . . . . . . . . . . . . . . . 111 | 17.2.3. 0-RTT . . . . . . . . . . . . . . . . . . . . . . . 112 | |||
| 17.2.3. 0-RTT . . . . . . . . . . . . . . . . . . . . . . . 113 | ||||
| 17.2.4. Handshake Packet . . . . . . . . . . . . . . . . . . 114 | 17.2.4. Handshake Packet . . . . . . . . . . . . . . . . . . 114 | |||
| 17.2.5. Retry Packet . . . . . . . . . . . . . . . . . . . . 116 | 17.2.5. Retry Packet . . . . . . . . . . . . . . . . . . . . 115 | |||
| 17.3. Short Header Packets . . . . . . . . . . . . . . . . . . 118 | 17.3. Short Header Packets . . . . . . . . . . . . . . . . . . 117 | |||
| 17.3.1. 1-RTT Packet . . . . . . . . . . . . . . . . . . . . 118 | 17.3.1. 1-RTT Packet . . . . . . . . . . . . . . . . . . . . 117 | |||
| 17.4. Latency Spin Bit . . . . . . . . . . . . . . . . . . . . 120 | 17.4. Latency Spin Bit . . . . . . . . . . . . . . . . . . . . 119 | |||
| 18. Transport Parameter Encoding . . . . . . . . . . . . . . . . 121 | 18. Transport Parameter Encoding . . . . . . . . . . . . . . . . 120 | |||
| 18.1. Reserved Transport Parameters . . . . . . . . . . . . . 122 | 18.1. Reserved Transport Parameters . . . . . . . . . . . . . 121 | |||
| 18.2. Transport Parameter Definitions . . . . . . . . . . . . 122 | 18.2. Transport Parameter Definitions . . . . . . . . . . . . 121 | |||
| 19. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 126 | 19. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 125 | |||
| 19.1. PADDING Frames . . . . . . . . . . . . . . . . . . . . . 126 | 19.1. PADDING Frames . . . . . . . . . . . . . . . . . . . . . 125 | |||
| 19.2. PING Frames . . . . . . . . . . . . . . . . . . . . . . 127 | 19.2. PING Frames . . . . . . . . . . . . . . . . . . . . . . 126 | |||
| 19.3. ACK Frames . . . . . . . . . . . . . . . . . . . . . . . 127 | 19.3. ACK Frames . . . . . . . . . . . . . . . . . . . . . . . 126 | |||
| 19.3.1. ACK Ranges . . . . . . . . . . . . . . . . . . . . . 129 | 19.3.1. ACK Ranges . . . . . . . . . . . . . . . . . . . . . 128 | |||
| 19.3.2. ECN Counts . . . . . . . . . . . . . . . . . . . . . 130 | 19.3.2. ECN Counts . . . . . . . . . . . . . . . . . . . . . 129 | |||
| 19.4. RESET_STREAM Frames . . . . . . . . . . . . . . . . . . 131 | 19.4. RESET_STREAM Frames . . . . . . . . . . . . . . . . . . 130 | |||
| 19.5. STOP_SENDING Frames . . . . . . . . . . . . . . . . . . 132 | 19.5. STOP_SENDING Frames . . . . . . . . . . . . . . . . . . 131 | |||
| 19.6. CRYPTO Frames . . . . . . . . . . . . . . . . . . . . . 132 | 19.6. CRYPTO Frames . . . . . . . . . . . . . . . . . . . . . 131 | |||
| 19.7. NEW_TOKEN Frames . . . . . . . . . . . . . . . . . . . . 133 | 19.7. NEW_TOKEN Frames . . . . . . . . . . . . . . . . . . . . 132 | |||
| 19.8. STREAM Frames . . . . . . . . . . . . . . . . . . . . . 134 | 19.8. STREAM Frames . . . . . . . . . . . . . . . . . . . . . 133 | |||
| 19.9. MAX_DATA Frames . . . . . . . . . . . . . . . . . . . . 136 | 19.9. MAX_DATA Frames . . . . . . . . . . . . . . . . . . . . 135 | |||
| 19.10. MAX_STREAM_DATA Frames . . . . . . . . . . . . . . . . . 136 | 19.10. MAX_STREAM_DATA Frames . . . . . . . . . . . . . . . . . 135 | |||
| 19.11. MAX_STREAMS Frames . . . . . . . . . . . . . . . . . . . 137 | 19.11. MAX_STREAMS Frames . . . . . . . . . . . . . . . . . . . 136 | |||
| 19.12. DATA_BLOCKED Frames . . . . . . . . . . . . . . . . . . 138 | 19.12. DATA_BLOCKED Frames . . . . . . . . . . . . . . . . . . 137 | |||
| 19.13. STREAM_DATA_BLOCKED Frames . . . . . . . . . . . . . . . 139 | 19.13. STREAM_DATA_BLOCKED Frames . . . . . . . . . . . . . . . 138 | |||
| 19.14. STREAMS_BLOCKED Frames . . . . . . . . . . . . . . . . . 139 | 19.14. STREAMS_BLOCKED Frames . . . . . . . . . . . . . . . . . 138 | |||
| 19.15. NEW_CONNECTION_ID Frames . . . . . . . . . . . . . . . . 140 | 19.15. NEW_CONNECTION_ID Frames . . . . . . . . . . . . . . . . 139 | |||
| 19.16. RETIRE_CONNECTION_ID Frames . . . . . . . . . . . . . . 141 | 19.16. RETIRE_CONNECTION_ID Frames . . . . . . . . . . . . . . 140 | |||
| 19.17. PATH_CHALLENGE Frames . . . . . . . . . . . . . . . . . 142 | 19.17. PATH_CHALLENGE Frames . . . . . . . . . . . . . . . . . 141 | |||
| 19.18. PATH_RESPONSE Frames . . . . . . . . . . . . . . . . . . 143 | 19.18. PATH_RESPONSE Frames . . . . . . . . . . . . . . . . . . 142 | |||
| 19.19. CONNECTION_CLOSE Frames . . . . . . . . . . . . . . . . 143 | 19.19. CONNECTION_CLOSE Frames . . . . . . . . . . . . . . . . 142 | |||
| 19.20. HANDSHAKE_DONE Frames . . . . . . . . . . . . . . . . . 144 | 19.20. HANDSHAKE_DONE Frames . . . . . . . . . . . . . . . . . 143 | |||
| 19.21. Extension Frames . . . . . . . . . . . . . . . . . . . . 145 | 19.21. Extension Frames . . . . . . . . . . . . . . . . . . . . 144 | |||
| 20. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 145 | 20. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 144 | |||
| 20.1. Transport Error Codes . . . . . . . . . . . . . . . . . 146 | 20.1. Transport Error Codes . . . . . . . . . . . . . . . . . 145 | |||
| 20.2. Application Protocol Error Codes . . . . . . . . . . . . 147 | 20.2. Application Protocol Error Codes . . . . . . . . . . . . 146 | |||
| 21. Security Considerations . . . . . . . . . . . . . . . . . . . 148 | 21. Security Considerations . . . . . . . . . . . . . . . . . . . 147 | |||
| 21.1. Overview of Security Properties . . . . . . . . . . . . 148 | 21.1. Overview of Security Properties . . . . . . . . . . . . 147 | |||
| 21.1.1. Handshake . . . . . . . . . . . . . . . . . . . . . 148 | 21.1.1. Handshake . . . . . . . . . . . . . . . . . . . . . 147 | |||
| 21.1.2. Protected Packets . . . . . . . . . . . . . . . . . 150 | 21.1.2. Protected Packets . . . . . . . . . . . . . . . . . 149 | |||
| 21.1.3. Connection Migration . . . . . . . . . . . . . . . . 151 | 21.1.3. Connection Migration . . . . . . . . . . . . . . . . 150 | |||
| 21.2. Handshake Denial of Service . . . . . . . . . . . . . . 155 | 21.2. Handshake Denial of Service . . . . . . . . . . . . . . 154 | |||
| 21.3. Amplification Attack . . . . . . . . . . . . . . . . . . 156 | 21.3. Amplification Attack . . . . . . . . . . . . . . . . . . 155 | |||
| 21.4. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 156 | 21.4. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 155 | |||
| 21.5. Request Forgery Attacks . . . . . . . . . . . . . . . . 157 | 21.5. Request Forgery Attacks . . . . . . . . . . . . . . . . 156 | |||
| 21.5.1. Control Options for Endpoints . . . . . . . . . . . 158 | 21.5.1. Control Options for Endpoints . . . . . . . . . . . 157 | |||
| 21.5.2. Request Forgery with Client Initial Packets . . . . 159 | 21.5.2. Request Forgery with Client Initial Packets . . . . 158 | |||
| 21.5.3. Request Forgery with Preferred Addresses . . . . . . 160 | 21.5.3. Request Forgery with Preferred Addresses . . . . . . 159 | |||
| 21.5.4. Request Forgery with Spoofed Migration . . . . . . . 160 | 21.5.4. Request Forgery with Spoofed Migration . . . . . . . 159 | |||
| 21.5.5. Request Forgery with Version Negotiation . . . . . . 161 | 21.5.5. Request Forgery with Version Negotiation . . . . . . 160 | |||
| 21.5.6. Generic Request Forgery Countermeasures . . . . . . 161 | 21.5.6. Generic Request Forgery Countermeasures . . . . . . 160 | |||
| 21.6. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 162 | 21.6. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 161 | |||
| 21.7. Stream Fragmentation and Reassembly Attacks . . . . . . 162 | 21.7. Stream Fragmentation and Reassembly Attacks . . . . . . 161 | |||
| 21.8. Stream Commitment Attack . . . . . . . . . . . . . . . . 163 | 21.8. Stream Commitment Attack . . . . . . . . . . . . . . . . 162 | |||
| 21.9. Peer Denial of Service . . . . . . . . . . . . . . . . . 163 | 21.9. Peer Denial of Service . . . . . . . . . . . . . . . . . 162 | |||
| 21.10. Explicit Congestion Notification Attacks . . . . . . . . 164 | 21.10. Explicit Congestion Notification Attacks . . . . . . . . 163 | |||
| 21.11. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 164 | 21.11. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 163 | |||
| 21.12. Version Downgrade . . . . . . . . . . . . . . . . . . . 165 | 21.12. Version Downgrade . . . . . . . . . . . . . . . . . . . 164 | |||
| 21.13. Targeted Attacks by Routing . . . . . . . . . . . . . . 165 | 21.13. Targeted Attacks by Routing . . . . . . . . . . . . . . 164 | |||
| 21.14. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 165 | 21.14. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 164 | |||
| 22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 165 | 22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 164 | |||
| 22.1. Registration Policies for QUIC Registries . . . . . . . 166 | 22.1. Registration Policies for QUIC Registries . . . . . . . 165 | |||
| 22.1.1. Provisional Registrations . . . . . . . . . . . . . 166 | 22.1.1. Provisional Registrations . . . . . . . . . . . . . 165 | |||
| 22.1.2. Selecting Codepoints . . . . . . . . . . . . . . . . 167 | 22.1.2. Selecting Codepoints . . . . . . . . . . . . . . . . 166 | |||
| 22.1.3. Reclaiming Provisional Codepoints . . . . . . . . . 167 | 22.1.3. Reclaiming Provisional Codepoints . . . . . . . . . 166 | |||
| 22.1.4. Permanent Registrations . . . . . . . . . . . . . . 168 | 22.1.4. Permanent Registrations . . . . . . . . . . . . . . 167 | |||
| 22.2. QUIC Versions Registry . . . . . . . . . . . . . . . . . 168 | 22.2. QUIC Versions Registry . . . . . . . . . . . . . . . . . 167 | |||
| 22.3. QUIC Transport Parameter Registry . . . . . . . . . . . 169 | 22.3. QUIC Transport Parameters Registry . . . . . . . . . . . 168 | |||
| 22.4. QUIC Frame Types Registry . . . . . . . . . . . . . . . 171 | 22.4. QUIC Frame Types Registry . . . . . . . . . . . . . . . 170 | |||
| 22.5. QUIC Transport Error Codes Registry . . . . . . . . . . 171 | 22.5. QUIC Transport Error Codes Registry . . . . . . . . . . 170 | |||
| 23. References . . . . . . . . . . . . . . . . . . . . . . . . . 173 | ||||
| 23.1. Normative References . . . . . . . . . . . . . . . . . . 173 | 23. References . . . . . . . . . . . . . . . . . . . . . . . . . 172 | |||
| 23.2. Informative References . . . . . . . . . . . . . . . . . 175 | 23.1. Normative References . . . . . . . . . . . . . . . . . . 172 | |||
| 23.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 178 | 23.2. Informative References . . . . . . . . . . . . . . . . . 174 | |||
| Appendix A. Pseudocode . . . . . . . . . . . . . . . . . . . . . 178 | Appendix A. Pseudocode . . . . . . . . . . . . . . . . . . . . . 177 | |||
| A.1. Sample Variable-Length Integer Decoding . . . . . . . . . 178 | A.1. Sample Variable-Length Integer Decoding . . . . . . . . . 177 | |||
| A.2. Sample Packet Number Encoding Algorithm . . . . . . . . . 179 | A.2. Sample Packet Number Encoding Algorithm . . . . . . . . . 178 | |||
| A.3. Sample Packet Number Decoding Algorithm . . . . . . . . . 180 | A.3. Sample Packet Number Decoding Algorithm . . . . . . . . . 179 | |||
| A.4. Sample ECN Validation Algorithm . . . . . . . . . . . . . 181 | A.4. Sample ECN Validation Algorithm . . . . . . . . . . . . . 180 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 181 | Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 181 | |||
| B.1. Since draft-ietf-quic-transport-32 . . . . . . . . . . . 182 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 184 | |||
| B.2. Since draft-ietf-quic-transport-31 . . . . . . . . . . . 182 | ||||
| B.3. Since draft-ietf-quic-transport-30 . . . . . . . . . . . 183 | ||||
| B.4. Since draft-ietf-quic-transport-29 . . . . . . . . . . . 183 | ||||
| B.5. Since draft-ietf-quic-transport-28 . . . . . . . . . . . 184 | ||||
| B.6. Since draft-ietf-quic-transport-27 . . . . . . . . . . . 184 | ||||
| B.7. Since draft-ietf-quic-transport-26 . . . . . . . . . . . 185 | ||||
| B.8. Since draft-ietf-quic-transport-25 . . . . . . . . . . . 185 | ||||
| B.9. Since draft-ietf-quic-transport-24 . . . . . . . . . . . 185 | ||||
| B.10. Since draft-ietf-quic-transport-23 . . . . . . . . . . . 186 | ||||
| B.11. Since draft-ietf-quic-transport-22 . . . . . . . . . . . 187 | ||||
| B.12. Since draft-ietf-quic-transport-21 . . . . . . . . . . . 188 | ||||
| B.13. Since draft-ietf-quic-transport-20 . . . . . . . . . . . 188 | ||||
| B.14. Since draft-ietf-quic-transport-19 . . . . . . . . . . . 189 | ||||
| B.15. Since draft-ietf-quic-transport-18 . . . . . . . . . . . 190 | ||||
| B.16. Since draft-ietf-quic-transport-17 . . . . . . . . . . . 190 | ||||
| B.17. Since draft-ietf-quic-transport-16 . . . . . . . . . . . 191 | ||||
| B.18. Since draft-ietf-quic-transport-15 . . . . . . . . . . . 192 | ||||
| B.19. Since draft-ietf-quic-transport-14 . . . . . . . . . . . 192 | ||||
| B.20. Since draft-ietf-quic-transport-13 . . . . . . . . . . . 193 | ||||
| B.21. Since draft-ietf-quic-transport-12 . . . . . . . . . . . 193 | ||||
| B.22. Since draft-ietf-quic-transport-11 . . . . . . . . . . . 194 | ||||
| B.23. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 195 | ||||
| B.24. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 195 | ||||
| B.25. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 196 | ||||
| B.26. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 196 | ||||
| B.27. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 197 | ||||
| B.28. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 198 | ||||
| B.29. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 198 | ||||
| B.30. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 199 | ||||
| B.31. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 199 | ||||
| B.32. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 200 | ||||
| B.33. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 202 | ||||
| B.34. Since draft-hamilton-quic-transport-protocol-01 . . . . . 202 | ||||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 202 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 204 | ||||
| 1. Overview | 1. Overview | |||
| QUIC is a secure general-purpose transport protocol. This document | QUIC is a secure general-purpose transport protocol. This document | |||
| defines version 1 of QUIC, which conforms to the version-independent | defines version 1 of QUIC, which conforms to the version-independent | |||
| properties of QUIC defined in [QUIC-INVARIANTS]. | properties of QUIC defined in [QUIC-INVARIANTS]. | |||
| QUIC is a connection-oriented protocol that creates a stateful | QUIC is a connection-oriented protocol that creates a stateful | |||
| interaction between a client and server. | interaction between a client and server. | |||
| The QUIC handshake combines negotiation of cryptographic and | The QUIC handshake combines negotiation of cryptographic and | |||
| transport parameters. QUIC integrates the TLS ([TLS13]) handshake, | transport parameters. QUIC integrates the TLS handshake [TLS13], | |||
| although using a customized framing for protecting packets. The | although using a customized framing for protecting packets. The | |||
| integration of TLS and QUIC is described in more detail in | integration of TLS and QUIC is described in more detail in | |||
| [QUIC-TLS]. The handshake is structured to permit the exchange of | [QUIC-TLS]. The handshake is structured to permit the exchange of | |||
| application data as soon as possible. This includes an option for | application data as soon as possible. This includes an option for | |||
| clients to send data immediately (0-RTT), which requires some form of | clients to send data immediately (0-RTT), which requires some form of | |||
| prior communication or configuration to enable. | prior communication or configuration to enable. | |||
| Endpoints communicate in QUIC by exchanging QUIC packets. Most | Endpoints communicate in QUIC by exchanging QUIC packets. Most | |||
| packets contain frames, which carry control information and | packets contain frames, which carry control information and | |||
| application data between endpoints. QUIC authenticates the entirety | application data between endpoints. QUIC authenticates the entirety | |||
| of each packet and encrypts as much of each packet as is practical. | of each packet and encrypts as much of each packet as is practical. | |||
| QUIC packets are carried in UDP datagrams ([UDP]) to better | QUIC packets are carried in UDP datagrams [UDP] to better facilitate | |||
| facilitate deployment in existing systems and networks. | deployment in existing systems and networks. | |||
| Application protocols exchange information over a QUIC connection via | Application protocols exchange information over a QUIC connection via | |||
| streams, which are ordered sequences of bytes. Two types of stream | streams, which are ordered sequences of bytes. Two types of streams | |||
| can be created: bidirectional streams, which allow both endpoints to | can be created: bidirectional streams, which allow both endpoints to | |||
| send data; and unidirectional streams, which allow a single endpoint | send data; and unidirectional streams, which allow a single endpoint | |||
| to send data. A credit-based scheme is used to limit stream creation | to send data. A credit-based scheme is used to limit stream creation | |||
| and to bound the amount of data that can be sent. | and to bound the amount of data that can be sent. | |||
| QUIC provides the necessary feedback to implement reliable delivery | QUIC provides the necessary feedback to implement reliable delivery | |||
| and congestion control. An algorithm for detecting and recovering | and congestion control. An algorithm for detecting and recovering | |||
| from loss of data is described in [QUIC-RECOVERY]. QUIC depends on | from loss of data is described in Section 6 of [QUIC-RECOVERY]. QUIC | |||
| congestion control to avoid network congestion. An exemplary | depends on congestion control to avoid network congestion. An | |||
| congestion control algorithm is also described in [QUIC-RECOVERY]. | exemplary congestion control algorithm is described in Section 7 of | |||
| [QUIC-RECOVERY]. | ||||
| QUIC connections are not strictly bound to a single network path. | QUIC connections are not strictly bound to a single network path. | |||
| Connection migration uses connection identifiers to allow connections | Connection migration uses connection identifiers to allow connections | |||
| to transfer to a new network path. Only clients are able to migrate | to transfer to a new network path. Only clients are able to migrate | |||
| in this version of QUIC. This design also allows connections to | in this version of QUIC. This design also allows connections to | |||
| continue after changes in network topology or address mappings, such | continue after changes in network topology or address mappings, such | |||
| as might be caused by NAT rebinding. | as might be caused by NAT rebinding. | |||
| Once established, multiple options are provided for connection | Once established, multiple options are provided for connection | |||
| termination. Applications can manage a graceful shutdown, endpoints | termination. Applications can manage a graceful shutdown, endpoints | |||
| skipping to change at page 9, line 4 ¶ | skipping to change at page 7, line 40 ¶ | |||
| * Section 4 outlines the operation of flow control. | * Section 4 outlines the operation of flow control. | |||
| o Connections are the context in which QUIC endpoints communicate. | o Connections are the context in which QUIC endpoints communicate. | |||
| * Section 5 describes core concepts related to connections, | * Section 5 describes core concepts related to connections, | |||
| * Section 6 describes version negotiation, | * Section 6 describes version negotiation, | |||
| * Section 7 details the process for establishing connections, | * Section 7 details the process for establishing connections, | |||
| * Section 8 describes address validation and critical denial of | ||||
| * Section 8 describes address validation and critical denial-of- | ||||
| service mitigations, | service mitigations, | |||
| * Section 9 describes how endpoints migrate a connection to a new | * Section 9 describes how endpoints migrate a connection to a new | |||
| network path, | network path, | |||
| * Section 10 lists the options for terminating an open | * Section 10 lists the options for terminating an open | |||
| connection, and | connection, and | |||
| * Section 11 provides guidance for stream and connection error | * Section 11 provides guidance for stream and connection error | |||
| handling. | handling. | |||
| skipping to change at page 9, line 29 ¶ | skipping to change at page 8, line 18 ¶ | |||
| * Section 13 defines models for the transmission, retransmission, | * Section 13 defines models for the transmission, retransmission, | |||
| and acknowledgment of data, and | and acknowledgment of data, and | |||
| * Section 14 specifies rules for managing the size of datagrams | * Section 14 specifies rules for managing the size of datagrams | |||
| carrying QUIC packets. | carrying QUIC packets. | |||
| o Finally, encoding details of QUIC protocol elements are described | o Finally, encoding details of QUIC protocol elements are described | |||
| in: | in: | |||
| * Section 15 (Versions), | * Section 15 (versions), | |||
| * Section 16 (Integer Encoding), | * Section 16 (integer encoding), | |||
| * Section 17 (Packet Headers), | * Section 17 (packet headers), | |||
| * Section 18 (Transport Parameters), | * Section 18 (transport parameters), | |||
| * Section 19 (Frames), and | * Section 19 (frames), and | |||
| * Section 20 (Errors). | * Section 20 (errors). | |||
| 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 and other cryptographic | control [QUIC-RECOVERY], and the use of TLS and other cryptographic | |||
| mechanisms [QUIC-TLS]. | mechanisms [QUIC-TLS]. | |||
| This document defines QUIC version 1, which conforms to the protocol | This document defines QUIC version 1, which conforms to the protocol | |||
| invariants in [QUIC-INVARIANTS]. | invariants in [QUIC-INVARIANTS]. | |||
| To refer to QUIC version 1, cite this document. References to the | To refer to QUIC version 1, cite this document. References to the | |||
| limited set of version-independent properties of QUIC can cite | limited set of version-independent properties of QUIC can cite | |||
| [QUIC-INVARIANTS]. | [QUIC-INVARIANTS]. | |||
| 1.2. Terms and Definitions | 1.2. Terms and Definitions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Commonly used terms in the document are described below. | Commonly used terms in this document are described below. | |||
| QUIC: The transport protocol described by this document. QUIC is a | QUIC: The transport protocol described by this document. QUIC is a | |||
| name, not an acronym. | name, not an acronym. | |||
| Endpoint: An entity that can participate in a QUIC connection by | Endpoint: An entity that can participate in a QUIC connection by | |||
| generating, receiving, and processing QUIC packets. There are | generating, receiving, and processing QUIC packets. There are | |||
| only two types of endpoint in QUIC: client and server. | only two types of endpoints in QUIC: client and server. | |||
| Client: The endpoint that initiates a QUIC connection. | Client: The endpoint that initiates a QUIC connection. | |||
| Server: The endpoint that accepts a QUIC connection. | Server: The endpoint that accepts a QUIC connection. | |||
| QUIC packet: A complete processable unit of QUIC that can be | QUIC packet: A complete processable unit of QUIC that can be | |||
| encapsulated in a UDP datagram. One or more QUIC packets can be | encapsulated in a UDP datagram. One or more QUIC packets can be | |||
| encapsulated in a single UDP datagram. | encapsulated in a single UDP datagram. | |||
| Ack-eliciting Packet: A QUIC packet that contains frames other than | Ack-eliciting packet: A QUIC packet that contains frames other than | |||
| ACK, PADDING, and CONNECTION_CLOSE. These cause a recipient to | ACK, PADDING, and CONNECTION_CLOSE. These cause a recipient to | |||
| send an acknowledgment; see Section 13.2.1. | send an acknowledgment; see Section 13.2.1. | |||
| Frame: A unit of structured protocol information. There are | Frame: A unit of structured protocol information. There are | |||
| multiple frame types, each of which carries different information. | multiple frame types, each of which carries different information. | |||
| Frames are contained in QUIC packets. | Frames are contained in QUIC packets. | |||
| Address: When used without qualification, the tuple of IP version, | Address: When used without qualification, the tuple of IP version, | |||
| IP address, and UDP port number that represents one end of a | IP address, and UDP port number that represents one end of a | |||
| network path. | network path. | |||
| Connection ID: An identifier that is used to identify a QUIC | Connection ID: An identifier that is used to identify a QUIC | |||
| connection at an endpoint. Each endpoint selects one or more | connection at an endpoint. Each endpoint selects one or more | |||
| Connection IDs for its peer to include in packets sent towards the | connection IDs for its peer to include in packets sent towards the | |||
| endpoint. This value is opaque to the peer. | endpoint. This value is opaque to the peer. | |||
| Stream: A unidirectional or bidirectional channel of ordered bytes | Stream: A unidirectional or bidirectional channel of ordered bytes | |||
| within a QUIC connection. A QUIC connection can carry multiple | within a QUIC connection. A QUIC connection can carry multiple | |||
| simultaneous streams. | simultaneous streams. | |||
| Application: An entity that uses QUIC to send and receive data. | Application: An entity that uses QUIC to send and receive data. | |||
| This document uses the terms "QUIC packets", "UDP datagrams", and "IP | This document uses the terms "QUIC packets", "UDP datagrams", and "IP | |||
| packets" to refer to the units of the respective protocols. That is, | packets" to refer to the units of the respective protocols. That is, | |||
| skipping to change at page 11, line 28 ¶ | skipping to change at page 10, line 16 ¶ | |||
| surrounded by a pair of matching braces. Each field in this list is | surrounded by a pair of matching braces. Each field in this list is | |||
| separated by commas. | separated by commas. | |||
| Individual fields include length information, plus indications about | Individual fields include length information, plus indications about | |||
| fixed value, optionality, or repetitions. Individual fields use the | fixed value, optionality, or repetitions. Individual fields use the | |||
| following notational conventions, with all lengths in bits: | following notational conventions, with all lengths in bits: | |||
| x (A): Indicates that x is A bits long | x (A): Indicates that x is A bits long | |||
| x (i): Indicates that x holds an integer value using the variable- | x (i): Indicates that x holds an integer value using the variable- | |||
| length encoding in Section 16 | length encoding described in Section 16 | |||
| x (A..B): Indicates that x can be any length from A to B; A can be | x (A..B): Indicates that x can be any length from A to B; A can be | |||
| omitted to indicate a minimum of zero bits and B can be omitted to | omitted to indicate a minimum of zero bits, and B can be omitted | |||
| indicate no set upper limit; values in this format always end on | to indicate no set upper limit; values in this format always end | |||
| an byte boundary | on a byte boundary | |||
| x (L) = C: Indicates that x has a fixed value of C with the length | x (L) = C: Indicates that x has a fixed value of C; the length of x | |||
| described by L, which can use any of the three length forms above | is described by L, which can use any of the length forms above | |||
| x (L) = C..D: Indicates that x has a value in the range from C to D, | x (L) = C..D: Indicates that x has a value in the range from C to D, | |||
| inclusive, with the length described by L, as above | inclusive, with the length described by L, as above | |||
| [x (L)]: Indicates that x is optional (and has length of L) | [x (L)]: Indicates that x is optional and has a length of L | |||
| x (L) ...: Indicates that zero or more instances of x are present | x (L) ...: Indicates that x is repeated zero or more times and that | |||
| (and that each instance is length L) | each instance has a length of L | |||
| This document uses network byte order (that is, big endian) values. | This document uses network byte order (that is, big endian) values. | |||
| Fields are placed starting from the high-order bits of each byte. | Fields are placed starting from the high-order bits of each byte. | |||
| By convention, individual fields reference a complex field by using | By convention, individual fields reference a complex field by using | |||
| the name of the complex field. | the name of the complex field. | |||
| For example: | Figure 1 provides an example: | |||
| Example Structure { | Example Structure { | |||
| One-bit Field (1), | One-bit Field (1), | |||
| 7-bit Field with Fixed Value (7) = 61, | 7-bit Field with Fixed Value (7) = 61, | |||
| Field with Variable-Length Integer (i), | Field with Variable-Length Integer (i), | |||
| Arbitrary-Length Field (..), | Arbitrary-Length Field (..), | |||
| Variable-Length Field (8..24), | Variable-Length Field (8..24), | |||
| Field With Minimum Length (16..), | Field With Minimum Length (16..), | |||
| Field With Maximum Length (..128), | Field With Maximum Length (..128), | |||
| [Optional Field (64)], | [Optional Field (64)], | |||
| skipping to change at page 12, line 32 ¶ | skipping to change at page 11, line 32 ¶ | |||
| could be used to refer to the single-bit field in the most | could be used to refer to the single-bit field in the most | |||
| significant bit of the byte, such as One-bit Field in Figure 1. | significant bit of the byte, such as One-bit Field in Figure 1. | |||
| 2. Streams | 2. Streams | |||
| Streams in QUIC provide a lightweight, ordered byte-stream | Streams in QUIC provide a lightweight, ordered byte-stream | |||
| abstraction to an application. Streams can be unidirectional or | abstraction to an application. Streams can be unidirectional or | |||
| bidirectional. | bidirectional. | |||
| Streams can be created by sending data. Other processes associated | Streams can be created by sending data. Other processes associated | |||
| with stream management - ending, cancelling, and managing flow | with stream management -- ending, canceling, and managing flow | |||
| control - are all designed to impose minimal overheads. For | control -- are all designed to impose minimal overheads. For | |||
| instance, a single STREAM frame (Section 19.8) can open, carry data | instance, a single STREAM frame (Section 19.8) can open, carry data | |||
| for, and close a stream. Streams can also be long-lived and can last | for, and close a stream. Streams can also be long-lived and can last | |||
| the entire duration of a connection. | the entire duration of a connection. | |||
| Streams can be created by either endpoint, can concurrently send data | Streams can be created by either endpoint, can concurrently send data | |||
| interleaved with other streams, and can be cancelled. QUIC does not | interleaved with other streams, and can be canceled. QUIC does not | |||
| provide any means of ensuring ordering between bytes on different | provide any means of ensuring ordering between bytes on different | |||
| streams. | streams. | |||
| QUIC allows for an arbitrary number of streams to operate | QUIC allows for an arbitrary number of streams to operate | |||
| concurrently and for an arbitrary amount of data to be sent on any | concurrently and for an arbitrary amount of data to be sent on any | |||
| stream, subject to flow control constraints and stream limits; see | stream, subject to flow control constraints and stream limits; see | |||
| Section 4. | Section 4. | |||
| 2.1. Stream Types and Identifiers | 2.1. Stream Types and Identifiers | |||
| skipping to change at page 13, line 13 ¶ | skipping to change at page 12, line 13 ¶ | |||
| streams carry data in one direction: from the initiator of the stream | streams carry data in one direction: from the initiator of the stream | |||
| to its peer. Bidirectional streams allow for data to be sent in both | to its peer. Bidirectional streams allow for data to be sent in both | |||
| directions. | directions. | |||
| Streams are identified within a connection by a numeric value, | Streams are identified within a connection by a numeric value, | |||
| referred to as the stream ID. A stream ID is a 62-bit integer (0 to | referred to as the stream ID. A stream ID is a 62-bit integer (0 to | |||
| 2^62-1) that is unique for all streams on a connection. Stream IDs | 2^62-1) that is unique for all streams on a connection. Stream IDs | |||
| are encoded as variable-length integers; see Section 16. A QUIC | are encoded as variable-length integers; see Section 16. A QUIC | |||
| endpoint MUST NOT reuse a stream ID within a connection. | endpoint MUST NOT reuse a stream ID within a connection. | |||
| The least significant bit (0x1) of the stream ID identifies the | The least significant bit (0x01) of the stream ID identifies the | |||
| initiator of the stream. Client-initiated streams have even-numbered | initiator of the stream. Client-initiated streams have even-numbered | |||
| stream IDs (with the bit set to 0), and server-initiated streams have | stream IDs (with the bit set to 0), and server-initiated streams have | |||
| odd-numbered stream IDs (with the bit set to 1). | odd-numbered stream IDs (with the bit set to 1). | |||
| The second least significant bit (0x2) of the stream ID distinguishes | The second least significant bit (0x02) of the stream ID | |||
| between bidirectional streams (with the bit set to 0) and | distinguishes between bidirectional streams (with the bit set to 0) | |||
| unidirectional streams (with the bit set to 1). | and unidirectional streams (with the bit set to 1). | |||
| The two least significant bits from a stream ID therefore identify a | The two least significant bits from a stream ID therefore identify a | |||
| stream as one of four types, as summarized in Table 1. | stream as one of four types, as summarized in Table 1. | |||
| +------+----------------------------------+ | +------+----------------------------------+ | |||
| | Bits | Stream Type | | | Bits | Stream Type | | |||
| +------+----------------------------------+ | +------+----------------------------------+ | |||
| | 0x0 | Client-Initiated, Bidirectional | | | 0x00 | Client-Initiated, Bidirectional | | |||
| | | | | | | | | |||
| | 0x1 | Server-Initiated, Bidirectional | | | 0x01 | Server-Initiated, Bidirectional | | |||
| | | | | | | | | |||
| | 0x2 | Client-Initiated, Unidirectional | | | 0x02 | Client-Initiated, Unidirectional | | |||
| | | | | | | | | |||
| | 0x3 | Server-Initiated, Unidirectional | | | 0x03 | Server-Initiated, Unidirectional | | |||
| +------+----------------------------------+ | +------+----------------------------------+ | |||
| Table 1: Stream ID Types | Table 1: Stream ID Types | |||
| The stream space for each type begins at the minimum value (0x0 | The stream space for each type begins at the minimum value (0x00 | |||
| through 0x3 respectively); successive streams of each type are | through 0x03, respectively); successive streams of each type are | |||
| created with numerically increasing stream IDs. A stream ID that is | created with numerically increasing stream IDs. A stream ID that is | |||
| used out of order results in all streams of that type with lower- | used out of order results in all streams of that type with lower- | |||
| numbered stream IDs also being opened. | numbered stream IDs also being opened. | |||
| 2.2. Sending and Receiving Data | 2.2. Sending and Receiving Data | |||
| STREAM frames (Section 19.8) encapsulate data sent by an application. | STREAM frames (Section 19.8) encapsulate data sent by an application. | |||
| An endpoint uses the Stream ID and Offset fields in STREAM frames to | An endpoint uses the Stream ID and Offset fields in STREAM frames to | |||
| place data in order. | place data in order. | |||
| Endpoints MUST be able to deliver stream data to an application as an | Endpoints MUST be able to deliver stream data to an application as an | |||
| ordered byte-stream. Delivering an ordered byte-stream requires that | ordered byte stream. Delivering an ordered byte stream requires that | |||
| an endpoint buffer any data that is received out of order, up to the | an endpoint buffer any data that is received out of order, up to the | |||
| advertised flow control limit. | advertised flow control limit. | |||
| QUIC makes no specific allowances for delivery of stream data out of | QUIC makes no specific allowances for delivery of stream data out of | |||
| order. However, implementations MAY choose to offer the ability to | order. However, implementations MAY choose to offer the ability to | |||
| deliver data out of order to a receiving application. | deliver data out of order to a receiving application. | |||
| An endpoint could receive data for a stream at the same stream offset | An endpoint could receive data for a stream at the same stream offset | |||
| multiple times. Data that has already been received can be | multiple times. Data that has already been received can be | |||
| discarded. The data at a given offset MUST NOT change if it is sent | discarded. The data at a given offset MUST NOT change if it is sent | |||
| skipping to change at page 14, line 47 ¶ | skipping to change at page 13, line 47 ¶ | |||
| information. Instead, it relies on receiving priority information | information. Instead, it relies on receiving priority information | |||
| from the application. | from the application. | |||
| A QUIC implementation SHOULD provide ways in which an application can | A QUIC implementation SHOULD provide ways in which an application can | |||
| indicate the relative priority of streams. An implementation uses | indicate the relative priority of streams. An implementation uses | |||
| information provided by the application to determine how to allocate | information provided by the application to determine how to allocate | |||
| resources to active streams. | resources to active streams. | |||
| 2.4. Operations on Streams | 2.4. Operations on Streams | |||
| This document does not define an API for QUIC, but instead defines a | This document does not define an API for QUIC; it instead defines a | |||
| set of functions on streams that application protocols can rely upon. | set of functions on streams that application protocols can rely upon. | |||
| An application protocol can assume that a QUIC implementation | An application protocol can assume that a QUIC implementation | |||
| provides an interface that includes the operations described in this | provides an interface that includes the operations described in this | |||
| section. An implementation designed for use with a specific | section. An implementation designed for use with a specific | |||
| application protocol might provide only those operations that are | application protocol might provide only those operations that are | |||
| used by that protocol. | used by that protocol. | |||
| On the sending part of a stream, an application protocol can: | On the sending part of a stream, an application protocol can: | |||
| o write data, understanding when stream flow control credit | o write data, understanding when stream flow control credit | |||
| skipping to change at page 15, line 37 ¶ | skipping to change at page 14, line 37 ¶ | |||
| An application protocol can also request to be informed of state | An application protocol can also request to be informed of state | |||
| changes on streams, including when the peer has opened or reset a | changes on streams, including when the peer has opened or reset a | |||
| stream, when a peer aborts reading on a stream, when new data is | stream, when a peer aborts reading on a stream, when new data is | |||
| available, and when data can or cannot be written to the stream due | available, and when data can or cannot be written to the stream due | |||
| to flow control. | to flow control. | |||
| 3. Stream States | 3. Stream States | |||
| This section describes streams in terms of their send or receive | This section describes streams in terms of their send or receive | |||
| components. Two state machines are described: one for the streams on | components. Two state machines are described: one for the streams on | |||
| which an endpoint transmits data (Section 3.1), and another for | which an endpoint transmits data (Section 3.1) and another for | |||
| streams on which an endpoint receives data (Section 3.2). | streams on which an endpoint receives data (Section 3.2). | |||
| Unidirectional streams use either the sending or receiving state | Unidirectional streams use either the sending or receiving state | |||
| machine depending on the stream type and endpoint role. | machine, depending on the stream type and endpoint role. | |||
| Bidirectional streams use both state machines at both endpoints. For | Bidirectional streams use both state machines at both endpoints. For | |||
| the most part, the use of these state machines is the same whether | the most part, the use of these state machines is the same whether | |||
| the stream is unidirectional or bidirectional. The conditions for | the stream is unidirectional or bidirectional. The conditions for | |||
| opening a stream are slightly more complex for a bidirectional stream | opening a stream are slightly more complex for a bidirectional stream | |||
| because the opening of either the send or receive side causes the | because the opening of either the send or receive side causes the | |||
| stream to open in both directions. | stream to open in both directions. | |||
| The state machines shown in this section are largely informative. | The state machines shown in this section are largely informative. | |||
| This document uses stream states to describe rules for when and how | This document uses stream states to describe rules for when and how | |||
| different types of frames can be sent and the reactions that are | different types of frames can be sent and the reactions that are | |||
| expected when different types of frames are received. Though these | expected when different types of frames are received. Though these | |||
| state machines are intended to be useful in implementing QUIC, these | state machines are intended to be useful in implementing QUIC, these | |||
| states are not intended to constrain implementations. An | states are not 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 these | behavior is consistent with an implementation that implements these | |||
| states. | states. | |||
| Note: In some cases, a single event or action can cause a transition | Note: In some cases, a single event or action can cause a | |||
| through multiple states. For instance, sending STREAM with a FIN | transition through multiple states. For instance, sending STREAM | |||
| bit set can cause two state transitions for a sending stream: from | with a FIN bit set can cause two state transitions for a sending | |||
| the Ready state to the Send state, and from the Send state to the | stream: from the "Ready" state to the "Send" state, and from the | |||
| Data Sent state. | "Send" state to the "Data Sent" state. | |||
| 3.1. Sending Stream States | 3.1. Sending Stream States | |||
| Figure 2 shows the states for the part of a stream that sends data to | Figure 2 shows the states for the part of a stream that sends data to | |||
| a peer. | a peer. | |||
| o | o | |||
| | Create Stream (Sending) | | Create Stream (Sending) | |||
| | Peer Creates Bidirectional Stream | | Peer Creates Bidirectional Stream | |||
| v | v | |||
| skipping to change at page 18, line 5 ¶ | skipping to change at page 17, line 5 ¶ | |||
| Sending the first STREAM or STREAM_DATA_BLOCKED frame causes a | Sending the first STREAM or STREAM_DATA_BLOCKED frame causes a | |||
| sending part of a stream to enter the "Send" state. An | sending part of a stream to enter the "Send" state. An | |||
| implementation might choose to defer allocating a stream ID to a | implementation might choose to defer allocating a stream ID to a | |||
| stream until it sends the first STREAM frame and enters this state, | stream until it sends the first STREAM frame and enters this state, | |||
| which can allow for better stream prioritization. | which can allow for better stream prioritization. | |||
| 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) starts in the "Ready" state when | 0 for a server, type 1 for a client) starts in the "Ready" state when | |||
| the receiving part is created. | the receiving part is created. | |||
| In the "Send" state, an endpoint transmits - and retransmits as | In the "Send" state, an endpoint transmits -- and retransmits as | |||
| necessary - stream data in STREAM frames. The endpoint respects the | necessary -- stream data in STREAM frames. The endpoint respects the | |||
| flow control limits set by its peer, and continues to accept and | flow control limits set by its peer and continues to accept and | |||
| process MAX_STREAM_DATA frames. An endpoint in the "Send" state | process MAX_STREAM_DATA frames. An endpoint in the "Send" state | |||
| generates STREAM_DATA_BLOCKED frames if it is blocked from sending by | generates STREAM_DATA_BLOCKED frames if it is blocked from sending by | |||
| stream flow control limits (Section 4.1). | stream flow control limits (Section 4.1). | |||
| After the application indicates that all stream data has been sent | After the application indicates that all stream data has been sent | |||
| and a STREAM frame containing the FIN bit is sent, the sending part | and a STREAM frame containing the FIN bit is sent, the sending part | |||
| of the stream enters the "Data Sent" state. From this state, the | of the stream enters the "Data Sent" state. From this state, the | |||
| endpoint only retransmits stream data as necessary. The endpoint | endpoint only retransmits stream data as necessary. The endpoint | |||
| does not need to check flow control limits or send | does not need to check flow control limits or send | |||
| STREAM_DATA_BLOCKED frames for a stream in this state. | STREAM_DATA_BLOCKED frames for a stream in this state. | |||
| MAX_STREAM_DATA frames might be received until the peer receives the | MAX_STREAM_DATA frames might be received until the peer receives the | |||
| final stream offset. The endpoint can safely ignore any | final stream offset. The endpoint can safely ignore any | |||
| MAX_STREAM_DATA frames it receives from its peer for a stream in this | MAX_STREAM_DATA frames it receives from its peer for a stream in this | |||
| state. | state. | |||
| Once all stream data has been successfully acknowledged, the sending | Once all stream data has been successfully acknowledged, the sending | |||
| part of the stream enters the "Data Recvd" state, which is a terminal | part of the stream enters the "Data Recvd" state, which is a terminal | |||
| state. | state. | |||
| From any of the "Ready", "Send", or "Data Sent" states, an | From any state that is one of "Ready", "Send", or "Data Sent", an | |||
| application can signal that it wishes to abandon transmission of | application can signal that it wishes to abandon transmission of | |||
| stream data. Alternatively, an endpoint might receive a STOP_SENDING | stream data. Alternatively, an endpoint might receive a STOP_SENDING | |||
| frame from its peer. In either case, the endpoint sends a | frame from its peer. In either case, the endpoint sends a | |||
| RESET_STREAM frame, which causes the stream to enter the "Reset Sent" | RESET_STREAM frame, which causes the stream to enter the "Reset Sent" | |||
| state. | state. | |||
| An endpoint MAY send a RESET_STREAM as the first frame that mentions | An endpoint MAY send a RESET_STREAM as the first frame that mentions | |||
| a stream; this causes the sending part of that stream to open and | a stream; this causes the sending part of that stream to open and | |||
| then immediately transition to the "Reset Sent" state. | then immediately transition to the "Reset Sent" state. | |||
| skipping to change at page 20, line 26 ¶ | skipping to change at page 19, line 26 ¶ | |||
| In the "Recv" state, the endpoint receives STREAM and | In the "Recv" state, the endpoint receives STREAM and | |||
| STREAM_DATA_BLOCKED frames. Incoming data is buffered and can be | STREAM_DATA_BLOCKED frames. Incoming data is buffered and can be | |||
| reassembled into the correct order for delivery to the application. | reassembled into the correct order for delivery to the application. | |||
| As data is consumed by the application and buffer space becomes | As data is consumed by the application and buffer space becomes | |||
| available, the endpoint sends MAX_STREAM_DATA frames to allow the | available, the endpoint sends MAX_STREAM_DATA frames to allow the | |||
| peer to send more data. | peer to send more data. | |||
| When a STREAM frame with a FIN bit is received, the final size of the | When a STREAM frame with a FIN bit is received, the final size of the | |||
| stream is known; see Section 4.5. The receiving part of the stream | stream is known; see Section 4.5. The receiving part of the stream | |||
| then enters the "Size Known" state. In this state, the endpoint no | then enters the "Size Known" state. In this state, the endpoint no | |||
| longer needs to send MAX_STREAM_DATA frames, it only receives any | longer needs to send MAX_STREAM_DATA frames; it only receives any | |||
| retransmissions of stream data. | retransmissions of stream data. | |||
| Once all data for the stream has been received, the receiving part | Once all data for the stream has been received, the receiving part | |||
| 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". After all data has been received, any STREAM or | Known". After all data has been received, any STREAM or | |||
| STREAM_DATA_BLOCKED frames for the stream can be discarded. | STREAM_DATA_BLOCKED frames for the stream can be discarded. | |||
| The "Data Recvd" state persists until stream data has been delivered | The "Data Recvd" state persists until stream data has been delivered | |||
| to the application. Once stream data has been delivered, the stream | to the application. Once stream data has been delivered, the stream | |||
| enters the "Data Read" state, which is a terminal state. | enters the "Data Read" state, which is a terminal state. | |||
| Receiving a RESET_STREAM frame in the "Recv" or "Size Known" states | Receiving a RESET_STREAM frame in the "Recv" or "Size Known" state | |||
| causes the stream to enter the "Reset Recvd" state. This might cause | causes the stream to enter the "Reset Recvd" state. This might cause | |||
| the delivery of stream data to the application to be interrupted. | the delivery of stream data to the application to be interrupted. | |||
| It is possible that all stream data has already been received when a | It is possible that all stream data has already been received when a | |||
| RESET_STREAM is received (that is, in the "Data Recvd" state). | RESET_STREAM is received (that is, in the "Data Recvd" state). | |||
| Similarly, it is possible for remaining stream data to arrive after | Similarly, it is possible for remaining stream data to arrive after | |||
| receiving a RESET_STREAM frame (the "Reset Recvd" state). An | receiving a RESET_STREAM frame (the "Reset Recvd" state). An | |||
| implementation is free to manage this situation as it chooses. | implementation is free to manage this situation as it chooses. | |||
| Sending RESET_STREAM means that an endpoint cannot guarantee delivery | Sending a RESET_STREAM means that an endpoint cannot guarantee | |||
| of stream data; however there is no requirement that stream data not | delivery of stream data; however, there is no requirement that stream | |||
| be delivered if a RESET_STREAM is received. An implementation MAY | data not be delivered if a RESET_STREAM is received. An | |||
| interrupt delivery of stream data, discard any data that was not | implementation MAY interrupt delivery of stream data, discard any | |||
| consumed, and signal the receipt of the RESET_STREAM. A RESET_STREAM | data that was not consumed, and signal the receipt of the | |||
| signal might be suppressed or withheld if stream data is completely | RESET_STREAM. A RESET_STREAM signal might be suppressed or withheld | |||
| received and is buffered to be read by the application. If the | if stream data is completely received and is buffered to be read by | |||
| RESET_STREAM is suppressed, the receiving part of the stream remains | the application. If the RESET_STREAM is suppressed, the receiving | |||
| in "Data Recvd". | part of the stream remains in "Data Recvd". | |||
| Once the application receives the signal indicating that the stream | Once the application receives the signal indicating that the stream | |||
| was reset, the receiving part of the stream transitions to the "Reset | was reset, the receiving part of the stream transitions to the "Reset | |||
| Read" state, which is a terminal state. | Read" state, which is a terminal state. | |||
| 3.3. Permitted Frame Types | 3.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 the sender or the receiver: STREAM | |||
| (Section 19.8), STREAM_DATA_BLOCKED (Section 19.13), and RESET_STREAM | (Section 19.8), STREAM_DATA_BLOCKED (Section 19.13), and RESET_STREAM | |||
| (Section 19.4). | (Section 19.4). | |||
| 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 a STREAM or | ("Data Recvd" or "Reset Recvd"). A sender MUST NOT send a STREAM or | |||
| STREAM_DATA_BLOCKED frame for a stream in the "Reset Sent" state or | STREAM_DATA_BLOCKED frame for a stream in the "Reset Sent" state or | |||
| any terminal state, that is, after sending a RESET_STREAM frame. A | any terminal state -- that is, after sending a RESET_STREAM frame. A | |||
| receiver could receive any of these three frames in any state, due to | receiver could receive any of these three frames in any state, due to | |||
| the possibility of delayed delivery of packets carrying them. | the possibility of delayed delivery of packets carrying them. | |||
| The receiver of a stream sends MAX_STREAM_DATA (Section 19.10) and | The receiver of a stream sends MAX_STREAM_DATA frames (Section 19.10) | |||
| STOP_SENDING frames (Section 19.5). | and STOP_SENDING frames (Section 19.5). | |||
| The receiver only sends MAX_STREAM_DATA in the "Recv" state. A | The receiver only sends MAX_STREAM_DATA frames in the "Recv" state. | |||
| receiver MAY send STOP_SENDING in any state where it has not received | A receiver MAY send a STOP_SENDING frame in any state where it has | |||
| a RESET_STREAM frame; that is states other than "Reset Recvd" or | not received a RESET_STREAM frame -- that is, states other than | |||
| "Reset Read". However there is little value in sending a | "Reset Recvd" or "Reset Read". However, there is little value in | |||
| STOP_SENDING frame in the "Data Recvd" state, since all stream data | sending a STOP_SENDING frame in the "Data Recvd" state, as all stream | |||
| has been received. A sender could receive either of these two frames | data has been received. A sender could receive either of these two | |||
| in any state as a result of delayed delivery of packets. | types of frames in any state as a result of delayed delivery of | |||
| packets. | ||||
| 3.4. Bidirectional Stream States | 3.4. Bidirectional Stream States | |||
| A bidirectional stream is composed of sending and receiving parts. | A bidirectional stream is composed of sending and receiving parts. | |||
| Implementations can represent states of the bidirectional stream as | Implementations can represent states of the bidirectional stream as | |||
| composites of sending and receiving stream states. The simplest | composites of sending and receiving stream states. The simplest | |||
| model presents the stream as "open" when either sending or receiving | model presents the stream as "open" when either sending or receiving | |||
| parts are in a non-terminal state and "closed" when both sending and | parts are in a non-terminal state and "closed" when both sending and | |||
| receiving streams are in terminal states. | receiving streams are in terminal states. | |||
| Table 2 shows a more complex mapping of bidirectional stream states | Table 2 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 defined in HTTP/2 | |||
| shows that multiple states on sending or receiving parts of streams | [HTTP2]. This shows that multiple states on sending or receiving | |||
| are mapped to the same composite state. Note that this is just one | parts of streams are mapped to the same composite state. Note that | |||
| possibility for such a mapping; this mapping requires that data is | this is just one possibility for such a mapping; this mapping | |||
| acknowledged before the transition to a "closed" or "half-closed" | requires that data be acknowledged before the transition to a | |||
| state. | "closed" or "half-closed" state. | |||
| +-----------------------+---------------------+---------------------+ | +----------------------+-----------------------+--------------------+ | |||
| | Sending Part | Receiving Part | Composite State | | | Sending Part | Receiving Part | Composite State | | |||
| +-----------------------+---------------------+---------------------+ | +----------------------+-----------------------+--------------------+ | |||
| | No Stream/Ready | No Stream/Recv *1 | idle | | | No Stream / Ready | No Stream / Recv (*1) | idle | | |||
| | | | | | | | | | | |||
| | Ready/Send/Data Sent | Recv/Size Known | open | | | Ready / Send / Data | Recv / Size Known | open | | |||
| | | | | | | Sent | | | | |||
| | Ready/Send/Data Sent | Data Recvd/Data | half-closed | | | | | | | |||
| | | Read | (remote) | | | Ready / Send / Data | Data Recvd / Data | half-closed | | |||
| | | | | | | Sent | Read | (remote) | | |||
| | Ready/Send/Data Sent | Reset Recvd/Reset | half-closed | | | | | | | |||
| | | Read | (remote) | | | Ready / Send / Data | Reset Recvd / Reset | half-closed | | |||
| | | | | | | Sent | Read | (remote) | | |||
| | Data Recvd | Recv/Size Known | half-closed (local) | | | | | | | |||
| | | | | | | Data Recvd | Recv / Size Known | half-closed | | |||
| | Reset Sent/Reset | Recv/Size Known | half-closed (local) | | | | | (local) | | |||
| | Recvd | | | | | | | | | |||
| | | | | | | Reset Sent / Reset | Recv / Size Known | half-closed | | |||
| | Reset Sent/Reset | Data Recvd/Data | closed | | | Recvd | | (local) | | |||
| | Recvd | Read | | | | | | | | |||
| | | | | | | Reset Sent / Reset | Data Recvd / Data | closed | | |||
| | Reset Sent/Reset | Reset Recvd/Reset | closed | | | Recvd | Read | | | |||
| | Recvd | Read | | | | | | | | |||
| | | | | | | Reset Sent / Reset | Reset Recvd / Reset | closed | | |||
| | Data Recvd | Data Recvd/Data | closed | | | Recvd | Read | | | |||
| | | Read | | | | | | | | |||
| | | | | | | Data Recvd | Data Recvd / Data | closed | | |||
| | Data Recvd | Reset Recvd/Reset | closed | | | | Read | | | |||
| | | Read | | | | | | | | |||
| +-----------------------+---------------------+---------------------+ | | Data Recvd | Reset Recvd / Reset | closed | | |||
| | | Read | | | ||||
| +----------------------+-----------------------+--------------------+ | ||||
| Table 2: Possible Mapping of Stream States to HTTP/2 | Table 2: 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 receiving part of the stream is in the "Recv" | created or if the receiving part of the stream is in the "Recv" | |||
| state without yet having received any frames. | state without yet having received any frames. | |||
| 3.5. Solicited State Transitions | 3.5. Solicited State Transitions | |||
| If an application is no longer interested in the data it is receiving | If an application is no longer interested in the data it is receiving | |||
| on a stream, it can abort reading the stream and specify an | on a stream, it can abort reading the stream and specify an | |||
| application error code. | application error code. | |||
| If the stream is in the "Recv" or "Size Known" states, the transport | If the stream is in the "Recv" or "Size Known" state, the transport | |||
| SHOULD signal this by sending a STOP_SENDING frame to prompt closure | SHOULD signal this by sending a STOP_SENDING frame to prompt closure | |||
| of the stream in the opposite direction. This typically indicates | of the stream in the opposite direction. This typically indicates | |||
| that the receiving application is no longer reading data it receives | that the receiving application is no longer reading data it receives | |||
| from the stream, but it is not a guarantee that incoming data will be | from the stream, but it is not a guarantee that incoming data will be | |||
| ignored. | ignored. | |||
| STREAM frames received after sending a STOP_SENDING frame are still | STREAM frames received after sending a STOP_SENDING frame are still | |||
| counted toward connection and stream flow control, even though these | counted toward connection and stream flow control, even though these | |||
| frames can be discarded upon receipt. | frames can be discarded upon receipt. | |||
| A STOP_SENDING frame requests that the receiving endpoint send a | A STOP_SENDING frame requests that the receiving endpoint send a | |||
| RESET_STREAM frame. An endpoint that receives a STOP_SENDING frame | RESET_STREAM frame. An endpoint that receives a STOP_SENDING frame | |||
| MUST send a RESET_STREAM frame if the stream is in the Ready or Send | MUST send a RESET_STREAM frame if the stream is in the "Ready" or | |||
| state. If the stream is in the "Data Sent" state, the endpoint MAY | "Send" state. If the stream is in the "Data Sent" state, the | |||
| defer sending the RESET_STREAM frame until the packets containing | endpoint MAY defer sending the RESET_STREAM frame until the packets | |||
| outstanding data are acknowledged or declared lost. If any | containing outstanding data are acknowledged or declared lost. If | |||
| outstanding data is declared lost, the endpoint SHOULD send a | any outstanding data is declared lost, the endpoint SHOULD send a | |||
| RESET_STREAM frame instead of retransmitting the data. | RESET_STREAM frame instead of retransmitting the data. | |||
| An endpoint SHOULD copy the error code from the STOP_SENDING frame to | An endpoint SHOULD copy the error code from the STOP_SENDING frame to | |||
| the RESET_STREAM frame it sends, but can use any application error | the RESET_STREAM frame it sends, but it can use any application error | |||
| code. An endpoint that sends a STOP_SENDING frame MAY ignore the | code. An endpoint that sends a STOP_SENDING frame MAY ignore the | |||
| error code in any RESET_STREAM frames subsequently received for that | error code in any RESET_STREAM frames subsequently received for that | |||
| stream. | stream. | |||
| STOP_SENDING SHOULD only be sent for a stream that has not been reset | STOP_SENDING SHOULD only be sent for a stream that has not been reset | |||
| by the peer. STOP_SENDING is most useful for streams in the "Recv" | by the peer. STOP_SENDING is most useful for streams in the "Recv" | |||
| or "Size Known" states. | or "Size Known" state. | |||
| 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 RESET_STREAM frame has been received for | either all stream data or a RESET_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" | |||
| "Size Known" - sending a STOP_SENDING frame is unnecessary. | or "Size Known" -- sending a STOP_SENDING frame is unnecessary. | |||
| An endpoint that wishes to terminate both directions of a | An endpoint that wishes to terminate both directions of a | |||
| bidirectional stream can terminate one direction by sending a | bidirectional stream can terminate one direction by sending a | |||
| RESET_STREAM frame, and it can encourage prompt termination in the | RESET_STREAM frame, and it can encourage prompt termination in the | |||
| opposite direction by sending a STOP_SENDING frame. | opposite direction by sending a STOP_SENDING frame. | |||
| 4. Flow Control | 4. Flow Control | |||
| Receivers need to limit the amount of data that they are required to | Receivers need to limit the amount of data that they are required to | |||
| buffer, in order to prevent a fast sender from overwhelming them or a | buffer, in order to prevent a fast sender from overwhelming them or a | |||
| skipping to change at page 24, line 4 ¶ | skipping to change at page 23, line 12 ¶ | |||
| RESET_STREAM frame, and it can encourage prompt termination in the | RESET_STREAM frame, and it can encourage prompt termination in the | |||
| opposite direction by sending a STOP_SENDING frame. | opposite direction by sending a STOP_SENDING frame. | |||
| 4. Flow Control | 4. Flow Control | |||
| Receivers need to limit the amount of data that they are required to | Receivers need to limit the amount of data that they are required to | |||
| buffer, in order to prevent a fast sender from overwhelming them or a | buffer, in order to prevent a fast sender from overwhelming them or a | |||
| malicious sender from consuming a large amount of memory. To enable | malicious sender from consuming a large amount of memory. To enable | |||
| a receiver to limit memory commitments for a connection, streams are | a receiver to limit memory commitments for a connection, streams are | |||
| flow controlled both individually and across a connection as a whole. | flow controlled both individually and across a connection as a whole. | |||
| A QUIC receiver controls the maximum amount of data the sender can | A QUIC receiver controls the maximum amount of data the sender can | |||
| send on a stream as well as across all streams at any time, as | send on a stream as well as across all streams at any time, as | |||
| described in Section 4.1 and Section 4.2. | described in Sections 4.1 and 4.2. | |||
| Similarly, to limit concurrency within a connection, a QUIC endpoint | Similarly, to limit concurrency within a connection, a QUIC endpoint | |||
| controls the maximum cumulative number of streams that its peer can | controls the maximum cumulative number of streams that its peer can | |||
| initiate, as described in Section 4.6. | initiate, as described in Section 4.6. | |||
| Data sent in CRYPTO frames is not flow controlled in the same way as | Data sent in CRYPTO frames is not flow controlled in the same way as | |||
| stream data. QUIC relies on the cryptographic protocol | stream data. QUIC relies on the cryptographic protocol | |||
| implementation to avoid excessive buffering of data; see [QUIC-TLS]. | implementation to avoid excessive buffering of data; see [QUIC-TLS]. | |||
| To avoid excessive buffering at multiple layers, QUIC implementations | To avoid excessive buffering at multiple layers, QUIC implementations | |||
| SHOULD provide an interface for the cryptographic protocol | SHOULD provide an interface for the cryptographic protocol | |||
| implementation to communicate its buffering limits. | implementation to communicate its buffering limits. | |||
| 4.1. Data Flow Control | 4.1. Data Flow Control | |||
| QUIC employs a limit-based flow-control scheme where a receiver | QUIC employs a limit-based flow control scheme where a receiver | |||
| advertises the limit of total bytes it is prepared to receive on a | advertises the limit of total bytes it is prepared to receive on a | |||
| given stream or for the entire connection. This leads to two levels | given stream or for the entire connection. This leads to two levels | |||
| of data flow control in QUIC: | of data flow control in QUIC: | |||
| o Stream flow control, which prevents a single stream from consuming | o Stream flow control, which prevents a single stream from consuming | |||
| the entire receive buffer for a connection by limiting the amount | the entire receive buffer for a connection by limiting the amount | |||
| of data that can be sent on each stream. | of data that can be sent on each stream. | |||
| o Connection flow control, which prevents senders from exceeding a | o Connection flow control, which prevents senders from exceeding a | |||
| receiver's buffer capacity for the connection, by limiting the | receiver's buffer capacity for the connection by limiting the | |||
| total bytes of stream data sent in STREAM frames on all streams. | total bytes of stream data sent in STREAM frames on all streams. | |||
| Senders MUST NOT send data in excess of either limit. | Senders MUST NOT send data in excess of either limit. | |||
| A receiver sets initial limits for all streams through transport | A receiver sets initial limits for all streams through transport | |||
| parameters during the handshake (Section 7.4). Subsequently, a | parameters during the handshake (Section 7.4). Subsequently, a | |||
| receiver sends MAX_STREAM_DATA (Section 19.10) or MAX_DATA | receiver sends MAX_STREAM_DATA frames (Section 19.10) or MAX_DATA | |||
| (Section 19.9) frames to the sender to advertise larger limits. | frames (Section 19.9) to the sender to advertise larger limits. | |||
| A receiver can advertise a larger limit for a stream by sending a | A receiver can advertise a larger limit for a stream by sending a | |||
| MAX_STREAM_DATA frame with the corresponding stream ID. A | MAX_STREAM_DATA frame with the corresponding stream ID. A | |||
| MAX_STREAM_DATA frame indicates the maximum absolute byte offset of a | MAX_STREAM_DATA frame indicates the maximum absolute byte offset of a | |||
| stream. A receiver could determine the flow control offset to be | stream. A receiver could determine the flow control offset to be | |||
| advertised based on the current offset of data consumed on that | advertised based on the current offset of data consumed on that | |||
| stream. | stream. | |||
| A receiver can advertise a larger limit for a connection by sending a | A receiver can advertise a larger limit for a connection by sending a | |||
| MAX_DATA frame, which indicates the maximum of the sum of the | MAX_DATA frame, which indicates the maximum of the sum of the | |||
| absolute byte offsets of all streams. A receiver maintains a | absolute byte offsets of all streams. A receiver maintains a | |||
| cumulative sum of bytes received on all streams, which is used to | cumulative sum of bytes received on all streams, which is used to | |||
| check for violations of the advertised connection or stream data | check for violations of the advertised connection or stream data | |||
| limits. A receiver could determine the maximum data limit to be | limits. A receiver could determine the maximum data limit to be | |||
| advertised based on the sum of bytes consumed on all streams. | advertised based on the sum of bytes consumed on all streams. | |||
| Once a receiver advertises a limit for the connection or a stream, it | Once a receiver advertises a limit for the connection or a stream, it | |||
| is not an error to advertise a smaller limit, but the smaller limit | is not an error to advertise a smaller limit, but the smaller limit | |||
| has no effect. | has no effect. | |||
| A receiver MUST close the connection with a FLOW_CONTROL_ERROR error | A receiver MUST close the connection with an error of type | |||
| (Section 11) if the sender violates the advertised connection or | FLOW_CONTROL_ERROR if the sender violates the advertised connection | |||
| stream data limits. | or stream data limits; see Section 11 for details on error handling. | |||
| A sender MUST ignore any MAX_STREAM_DATA or MAX_DATA frames that do | A sender MUST ignore any MAX_STREAM_DATA or MAX_DATA frames that do | |||
| not increase flow control limits. | not increase flow control limits. | |||
| If a sender has sent data up to the limit, it will be unable to send | If a sender has sent data up to the limit, it will be unable to send | |||
| new data and is considered blocked. A sender SHOULD send a | new data and is considered blocked. A sender SHOULD send a | |||
| STREAM_DATA_BLOCKED or DATA_BLOCKED frame to indicate to the receiver | STREAM_DATA_BLOCKED or DATA_BLOCKED frame to indicate to the receiver | |||
| that it has data to write but is blocked by flow control limits. If | that it has data to write but is blocked by flow control limits. If | |||
| a sender is blocked for a period longer than the idle timeout | a sender is blocked for a period longer than the idle timeout | |||
| (Section 10.1), the receiver might close the connection even when the | (Section 10.1), the receiver might close the connection even when the | |||
| skipping to change at page 26, line 18 ¶ | skipping to change at page 25, line 26 ¶ | |||
| A blocked sender is not required to send STREAM_DATA_BLOCKED or | A blocked sender is not required to send STREAM_DATA_BLOCKED or | |||
| DATA_BLOCKED frames. Therefore, a receiver MUST NOT wait for a | DATA_BLOCKED frames. Therefore, a receiver MUST NOT wait for a | |||
| STREAM_DATA_BLOCKED or DATA_BLOCKED frame before sending a | STREAM_DATA_BLOCKED or DATA_BLOCKED frame before sending a | |||
| MAX_STREAM_DATA or MAX_DATA frame; doing so could result in the | MAX_STREAM_DATA or MAX_DATA frame; doing so could result in the | |||
| sender being blocked for the rest of the connection. Even if the | sender being blocked for the rest of the connection. Even if the | |||
| sender sends these frames, waiting for them will result in the sender | sender sends these frames, waiting for them will result in the sender | |||
| being blocked for at least an entire round trip. | being blocked for at least an entire round trip. | |||
| When a sender receives credit after being blocked, it might be able | When a sender receives credit after being blocked, it might be able | |||
| to send a large amount of data in response, resulting in short-term | to send a large amount of data in response, resulting in short-term | |||
| congestion; see Section 7.7 in [QUIC-RECOVERY] for a discussion of | congestion; see Section 7.7 of [QUIC-RECOVERY] for a discussion of | |||
| how a sender can avoid this congestion. | how a sender can avoid this congestion. | |||
| 4.3. Flow Control Performance | 4.3. Flow Control Performance | |||
| If an endpoint cannot ensure that its peer always has available flow | If an endpoint cannot ensure that its peer always has available flow | |||
| control credit that is greater than the peer's bandwidth-delay | control credit that is greater than the peer's bandwidth-delay | |||
| product on this connection, its receive throughput will be limited by | product on this connection, its receive throughput will be limited by | |||
| flow control. | flow control. | |||
| Packet loss can cause gaps in the receive buffer, preventing the | Packet loss can cause gaps in the receive buffer, preventing the | |||
| skipping to change at page 27, line 24 ¶ | skipping to change at page 26, line 34 ¶ | |||
| receiver reliably, no matter how the stream is terminated. The final | receiver reliably, no matter how the stream is terminated. The final | |||
| size is the sum of the Offset and Length fields of a STREAM frame | size is the sum of the Offset and Length fields of a STREAM frame | |||
| with a FIN flag, noting that these fields might be implicit. | with a FIN flag, noting that these fields might be implicit. | |||
| Alternatively, the Final Size field of a RESET_STREAM frame carries | Alternatively, the Final Size field of a RESET_STREAM frame carries | |||
| this value. This guarantees that both endpoints agree on how much | this value. This guarantees that both endpoints agree on how much | |||
| flow control credit was consumed by the sender on that stream. | flow control credit was consumed by the sender on that stream. | |||
| An endpoint will know the final size for a stream when the receiving | An endpoint will know the final size for a stream when the receiving | |||
| part of the stream enters the "Size Known" or "Reset Recvd" state | part of the stream enters the "Size Known" or "Reset Recvd" state | |||
| (Section 3). The receiver MUST use the final size of the stream to | (Section 3). The receiver MUST use the final size of the stream to | |||
| account for all bytes sent on the stream in its connection level flow | account for all bytes sent on the stream in its connection-level flow | |||
| controller. | controller. | |||
| 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 | |||
| size. | size. | |||
| Once a final size for a stream is known, it cannot change. If a | Once a final size for a stream is known, it cannot change. If a | |||
| RESET_STREAM or STREAM frame is received indicating a change in the | RESET_STREAM or STREAM frame is received indicating a change in the | |||
| final size for the stream, an endpoint SHOULD respond with a | final size for the stream, an endpoint SHOULD respond with an error | |||
| FINAL_SIZE_ERROR error; see Section 11. A receiver SHOULD treat | of type FINAL_SIZE_ERROR; see Section 11 for details on error | |||
| receipt of data at or beyond the final size as a FINAL_SIZE_ERROR | handling. A receiver SHOULD treat receipt of data at or beyond the | |||
| error, even after a stream is closed. Generating these errors is not | final size as an error of type FINAL_SIZE_ERROR, even after a stream | |||
| mandatory, because requiring that an endpoint generate these errors | is closed. Generating these errors is not mandatory, because | |||
| also means that the endpoint needs to maintain the final size state | requiring that an endpoint generate these errors also means that the | |||
| for closed streams, which could mean a significant state commitment. | endpoint needs to maintain the final size state for closed streams, | |||
| which could mean a significant state commitment. | ||||
| 4.6. Controlling Concurrency | 4.6. Controlling Concurrency | |||
| An endpoint limits the cumulative number of incoming streams a peer | An endpoint limits the cumulative number of incoming streams a peer | |||
| can open. Only streams with a stream ID less than (max_stream * 4 + | can open. Only streams with a stream ID less than "(max_streams * 4 | |||
| initial_stream_id_for_type) can be opened; see Table 1. Initial | + first_stream_id_of_type)" can be opened; see Table 1. Initial | |||
| limits are set in the transport parameters; see Section 18.2. | limits are set in the transport parameters; see Section 18.2. | |||
| Subsequent limits are advertised using MAX_STREAMS frames; see | Subsequent limits are advertised using MAX_STREAMS frames; see | |||
| Section 19.11. Separate limits apply to unidirectional and | Section 19.11. Separate limits apply to unidirectional and | |||
| bidirectional streams. | bidirectional streams. | |||
| If a max_streams transport parameter or a MAX_STREAMS frame is | If a max_streams transport parameter or a MAX_STREAMS frame is | |||
| received with a value greater than 2^60, this would allow a maximum | received with a value greater than 2^60, this would allow a maximum | |||
| stream ID that cannot be expressed as a variable-length integer; see | stream ID that cannot be expressed as a variable-length integer; see | |||
| Section 16. If either is received, the connection MUST be closed | Section 16. If either is received, the connection MUST be closed | |||
| immediately with a connection error of type TRANSPORT_PARAMETER_ERROR | immediately with a connection error of type TRANSPORT_PARAMETER_ERROR | |||
| if the offending value was received in a transport parameter or of | if the offending value was received in a transport parameter or of | |||
| type FRAME_ENCODING_ERROR if it was received in a frame; see | type FRAME_ENCODING_ERROR if it was received in a frame; see | |||
| Section 10.2. | Section 10.2. | |||
| 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 frame with a stream ID exceeding the limit it has | that receives a frame with a stream ID exceeding the limit it has | |||
| sent MUST treat this as a connection error of type STREAM_LIMIT_ERROR | sent MUST treat this as a connection error of type | |||
| (Section 11). | STREAM_LIMIT_ERROR; see Section 11 for details on error handling. | |||
| Once a receiver advertises a stream limit using the MAX_STREAMS | Once a receiver advertises a stream limit using the MAX_STREAMS | |||
| frame, advertising a smaller limit has no effect. A receiver MUST | frame, advertising a smaller limit has no effect. MAX_STREAMS frames | |||
| ignore any MAX_STREAMS frame that does not increase the stream limit. | that do not increase the stream limit MUST be ignored. | |||
| As with stream and connection flow control, this document leaves | As with stream and connection flow control, this document leaves | |||
| implementations to decide when and how many streams should be | implementations to decide when and how many streams should be | |||
| advertised to a peer via MAX_STREAMS. Implementations might choose | advertised to a peer via MAX_STREAMS. Implementations might choose | |||
| to increase limits as streams are closed, to keep the number of | to increase limits as streams are closed, to keep the number of | |||
| streams available to peers roughly consistent. | streams available to peers roughly consistent. | |||
| An endpoint that is unable to open a new stream due to the peer's | An endpoint that is unable to open a new stream due to the peer's | |||
| limits SHOULD send a STREAMS_BLOCKED frame (Section 19.14). This | limits SHOULD send a STREAMS_BLOCKED frame (Section 19.14). This | |||
| signal is considered useful for debugging. An endpoint MUST NOT wait | signal is considered useful for debugging. An endpoint MUST NOT wait | |||
| skipping to change at page 29, line 51 ¶ | skipping to change at page 29, line 16 ¶ | |||
| Packets with long headers include Source Connection ID and | Packets with long headers include Source Connection ID and | |||
| Destination Connection ID fields. These fields are used to set the | Destination Connection ID fields. These fields are used to set the | |||
| connection IDs for new connections; see Section 7.2 for details. | connection IDs for new connections; see Section 7.2 for details. | |||
| Packets with short headers (Section 17.3) only include the | Packets with short headers (Section 17.3) only include the | |||
| Destination Connection ID and omit the explicit length. The length | Destination Connection ID and omit the explicit length. The length | |||
| of the Destination Connection ID field is expected to be known to | of the Destination Connection ID field is expected to be known to | |||
| endpoints. Endpoints using a load balancer that routes based on | endpoints. Endpoints using a load balancer that routes based on | |||
| connection ID could agree with the load balancer on a fixed length | connection ID could agree with the load balancer on a fixed length | |||
| for connection IDs, or agree on an encoding scheme. A fixed portion | for connection IDs or agree on an encoding scheme. A fixed portion | |||
| could encode an explicit length, which allows the entire connection | could encode an explicit length, which allows the entire connection | |||
| ID to vary in length and still be used by the load balancer. | ID to vary in length and still be used by the load balancer. | |||
| A Version Negotiation (Section 17.2.1) packet echoes the connection | A Version Negotiation (Section 17.2.1) packet echoes the connection | |||
| IDs selected by the client, both to ensure correct routing toward the | IDs selected by the client, both to ensure correct routing toward the | |||
| client and to demonstrate that the packet is in response to a packet | client and to demonstrate that the packet is in response to a packet | |||
| sent by the client. | sent by the client. | |||
| A zero-length connection ID can be used when a connection ID is not | A zero-length connection ID can be used when a connection ID is not | |||
| needed to route to the correct endpoint. However, multiplexing | needed to route to the correct endpoint. However, multiplexing | |||
| skipping to change at page 30, line 29 ¶ | skipping to change at page 29, line 42 ¶ | |||
| certain that those protocol features are not in use. | certain that those protocol features are not in use. | |||
| When an endpoint uses a non-zero-length connection ID, it needs to | When an endpoint uses a non-zero-length connection ID, it needs to | |||
| ensure that the peer has a supply of connection IDs from which to | ensure that the peer has a supply of connection IDs from which to | |||
| choose for packets sent to the endpoint. These connection IDs are | choose for packets sent to the endpoint. These connection IDs are | |||
| supplied by the endpoint using the NEW_CONNECTION_ID frame | supplied by the endpoint using the NEW_CONNECTION_ID frame | |||
| (Section 19.15). | (Section 19.15). | |||
| 5.1.1. Issuing Connection IDs | 5.1.1. Issuing Connection IDs | |||
| Each Connection ID has an associated sequence number to assist in | Each connection ID has an associated sequence number to assist in | |||
| detecting when NEW_CONNECTION_ID or RETIRE_CONNECTION_ID frames refer | detecting when NEW_CONNECTION_ID or RETIRE_CONNECTION_ID frames refer | |||
| to the same value. The initial connection ID issued by an endpoint | to the same value. The initial connection ID issued by an endpoint | |||
| is sent in the Source Connection ID field of the long packet header | is sent in the Source Connection ID field of the long packet header | |||
| (Section 17.2) during the handshake. The sequence number of the | (Section 17.2) during the handshake. The sequence number of the | |||
| initial connection ID is 0. If the preferred_address transport | initial connection ID is 0. If the preferred_address transport | |||
| parameter is sent, the sequence number of the supplied connection ID | parameter is sent, the sequence number of the supplied connection ID | |||
| is 1. | is 1. | |||
| Additional connection IDs are communicated to the peer using | Additional connection IDs are communicated to the peer using | |||
| NEW_CONNECTION_ID frames (Section 19.15). The sequence number on | NEW_CONNECTION_ID frames (Section 19.15). The sequence number on | |||
| skipping to change at page 31, line 52 ¶ | skipping to change at page 31, line 17 ¶ | |||
| An endpoint that selects a zero-length connection ID during the | An endpoint that selects a zero-length connection ID during the | |||
| handshake cannot issue a new connection ID. A zero-length | handshake cannot issue a new connection ID. A zero-length | |||
| Destination Connection ID field is used in all packets sent toward | Destination Connection ID field is used in all packets sent toward | |||
| such an endpoint over any network path. | such an endpoint over any network path. | |||
| 5.1.2. Consuming and Retiring Connection IDs | 5.1.2. Consuming and Retiring Connection IDs | |||
| An endpoint can change the connection ID it uses for a peer to | An endpoint can change the connection ID it uses for a peer to | |||
| another available one at any time during the connection. An endpoint | another available one at any time during the connection. An endpoint | |||
| consumes connection IDs in response to a migrating peer; see | consumes connection IDs in response to a migrating peer; see | |||
| Section 9.5 for more. | Section 9.5 for more details. | |||
| An endpoint maintains a set of connection IDs received from its peer, | An endpoint maintains a set of connection IDs received from its peer, | |||
| any of which it can use when sending packets. When the endpoint | any of which it can use when sending packets. When the endpoint | |||
| wishes to remove a connection ID from use, it sends a | wishes to remove a connection ID from use, it sends a | |||
| RETIRE_CONNECTION_ID frame to its peer. Sending a | RETIRE_CONNECTION_ID frame to its peer. Sending a | |||
| RETIRE_CONNECTION_ID frame indicates that the connection ID will not | RETIRE_CONNECTION_ID frame indicates that the connection ID will not | |||
| be used again and requests that the peer replace it with a new | be used again and requests that the peer replace it with a new | |||
| connection ID using a NEW_CONNECTION_ID frame. | connection ID using a NEW_CONNECTION_ID frame. | |||
| As discussed in Section 9.5, endpoints limit the use of a connection | As discussed in Section 9.5, endpoints limit the use of a connection | |||
| skipping to change at page 32, line 40 ¶ | skipping to change at page 32, line 6 ¶ | |||
| connection ID to the set of active connection IDs. This ordering | connection ID to the set of active connection IDs. This ordering | |||
| allows an endpoint to replace all active connection IDs without the | allows an endpoint to replace all active connection IDs without the | |||
| possibility of a peer having no available connection IDs and without | possibility of a peer having no available connection IDs and without | |||
| exceeding the limit the peer sets in the active_connection_id_limit | exceeding the limit the peer sets in the active_connection_id_limit | |||
| transport parameter; see Section 18.2. Failure to cease using the | transport parameter; see Section 18.2. Failure to cease using the | |||
| connection IDs when requested can result in connection failures, as | connection IDs when requested can result in connection failures, as | |||
| the issuing endpoint might be unable to continue using the connection | the issuing endpoint might be unable to continue using the connection | |||
| IDs with the active connection. | IDs with the active connection. | |||
| An endpoint SHOULD limit the number of connection IDs it has retired | An endpoint SHOULD limit the number of connection IDs it has retired | |||
| locally and have not yet been acknowledged. An endpoint SHOULD allow | locally for which RETIRE_CONNECTION_ID frames have not yet been | |||
| for sending and tracking a number of RETIRE_CONNECTION_ID frames of | acknowledged. An endpoint SHOULD allow for sending and tracking a | |||
| at least twice the active_connection_id limit. An endpoint MUST NOT | number of RETIRE_CONNECTION_ID frames of at least twice the value of | |||
| forget a connection ID without retiring it, though it MAY choose to | the active_connection_id_limit transport parameter. An endpoint MUST | |||
| treat having connection IDs in need of retirement that exceed this | NOT forget a connection ID without retiring it, though it MAY choose | |||
| to treat having connection IDs in need of retirement that exceed this | ||||
| limit as a connection error of type CONNECTION_ID_LIMIT_ERROR. | limit as a connection error of type CONNECTION_ID_LIMIT_ERROR. | |||
| Endpoints SHOULD NOT issue updates of the Retire Prior To field | Endpoints SHOULD NOT issue updates of the Retire Prior To field | |||
| before receiving RETIRE_CONNECTION_ID frames that retire all | before receiving RETIRE_CONNECTION_ID frames that retire all | |||
| connection IDs indicated by the previous Retire Prior To value. | connection IDs indicated by the previous Retire Prior To value. | |||
| 5.2. Matching Packets to Connections | 5.2. Matching Packets to Connections | |||
| Incoming packets are classified on receipt. Packets can either be | Incoming packets are classified on receipt. Packets can either be | |||
| associated with an existing connection, or - for servers - | associated with an existing connection or -- for servers -- | |||
| potentially create a new connection. | potentially create a new connection. | |||
| Endpoints try to associate a packet with an existing connection. If | Endpoints try to associate a packet with an existing connection. If | |||
| the packet has a non-zero-length Destination Connection ID | the packet has a non-zero-length Destination Connection ID | |||
| corresponding to an existing connection, QUIC processes that packet | corresponding to an existing connection, QUIC processes that packet | |||
| accordingly. Note that more than one connection ID can be associated | accordingly. Note that more than one connection ID can be associated | |||
| with a connection; see Section 5.1. | with a connection; see Section 5.1. | |||
| If the Destination Connection ID is zero length and the addressing | If the Destination Connection ID is zero length and the addressing | |||
| information in the packet matches the addressing information the | information in the packet matches the addressing information the | |||
| endpoint uses to identify a connection with a zero-length connection | endpoint uses to identify a connection with a zero-length connection | |||
| ID, QUIC processes the packet as part of that connection. An | ID, QUIC processes the packet as part of that connection. An | |||
| endpoint can use just destination IP and port or both source and | endpoint can use just destination IP and port or both source and | |||
| destination addresses for identification, though this makes | destination addresses for identification, though this makes | |||
| connections fragile as described in Section 5.1. | connections fragile as described in Section 5.1. | |||
| Endpoints can send a Stateless Reset (Section 10.3) for any packets | Endpoints can send a Stateless Reset (Section 10.3) for any packets | |||
| that cannot be attributed to an existing connection. A stateless | that cannot be attributed to an existing connection. A Stateless | |||
| reset allows a peer to more quickly identify when a connection | Reset allows a peer to more quickly identify when a connection | |||
| becomes unusable. | becomes unusable. | |||
| Packets that are matched to an existing connection are discarded if | Packets that are matched to an existing connection are discarded if | |||
| the packets are inconsistent with the state of that connection. For | the packets are inconsistent with the state of that connection. For | |||
| example, packets are discarded if they indicate a different protocol | example, packets are discarded if they indicate a different protocol | |||
| version than that of the connection, or if the removal of packet | version than that of the connection or if the removal of packet | |||
| protection is unsuccessful once the expected keys are available. | protection is unsuccessful once the expected keys are available. | |||
| Invalid packets that lack strong integrity protection, such as | Invalid packets that lack strong integrity protection, such as | |||
| Initial, Retry, or Version Negotiation, MAY be discarded. An | Initial, Retry, or Version Negotiation, MAY be discarded. An | |||
| endpoint MUST generate a connection error if processing the contents | endpoint MUST generate a connection error if processing the contents | |||
| of these packets prior to discovering an error, or fully revert any | of these packets prior to discovering an error, or fully revert any | |||
| changes made during that processing. | changes made during that processing. | |||
| 5.2.1. Client Packet Handling | 5.2.1. Client Packet Handling | |||
| Valid packets sent to clients always include a Destination Connection | Valid packets sent to clients always include a Destination Connection | |||
| ID that matches a value the client selects. Clients that choose to | ID that matches a value the client selects. Clients that choose to | |||
| receive zero-length connection IDs can use the local address and port | receive zero-length connection IDs can use the local address and port | |||
| to identify a connection. Packets that do not match an existing | to identify a connection. Packets that do not match an existing | |||
| connection, based on Destination Connection ID or, if this value is | connection -- based on Destination Connection ID or, if this value is | |||
| zero-length, local IP address and port, are discarded. | zero length, local IP address and port -- are discarded. | |||
| Due to packet reordering or loss, a client might receive packets for | Due to packet reordering or loss, a client might receive packets for | |||
| a connection that are encrypted with a key it has not yet computed. | a connection that are encrypted with a key it has not yet computed. | |||
| The client MAY drop these packets, or it MAY buffer them in | ||||
| The client MAY drop these packets, or MAY buffer them in anticipation | anticipation of later packets that allow it to compute the key. | |||
| of later packets that allow it to compute the key. | ||||
| If a client receives a packet that uses a different version than it | If a client receives a packet that uses a different version than it | |||
| initially selected, it MUST discard that packet. | initially selected, it MUST discard that packet. | |||
| 5.2.2. Server Packet Handling | 5.2.2. Server Packet Handling | |||
| If a server receives a packet that indicates an unsupported version | If a server receives a packet that indicates an unsupported version | |||
| and if the packet is large enough to initiate a new connection for | and if the packet is large enough to initiate a new connection for | |||
| any supported version, the server SHOULD send a Version Negotiation | any supported version, the server SHOULD send a Version Negotiation | |||
| packet as described in Section 6.1. A server MAY limit the number of | packet as described in Section 6.1. A server MAY limit the number of | |||
| skipping to change at page 34, line 28 ¶ | skipping to change at page 33, line 41 ¶ | |||
| Servers MUST drop smaller packets that specify unsupported versions. | Servers MUST drop smaller packets that specify unsupported versions. | |||
| The first packet for an unsupported version can use different | The first packet for an unsupported version can use different | |||
| semantics and encodings for any version-specific field. In | semantics and encodings for any version-specific field. In | |||
| particular, different packet protection keys might be used for | particular, different packet protection keys might be used for | |||
| different versions. Servers that do not support a particular version | different versions. Servers that do not support a particular version | |||
| are unlikely to be able to decrypt the payload of the packet or | are unlikely to be able to decrypt the payload of the packet or | |||
| properly interpret the result. Servers SHOULD respond with a Version | properly interpret the result. Servers SHOULD respond with a Version | |||
| Negotiation packet, provided that the datagram is sufficiently long. | Negotiation packet, provided that the datagram is sufficiently long. | |||
| 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 using the connection ID or - for packets with zero- | a connection using the connection ID or -- for packets with zero- | |||
| length connection IDs - the local address and port. These packets | length connection IDs -- the local address and port. These packets | |||
| are processed using the selected connection; otherwise, the server | are processed using the selected connection; otherwise, the server | |||
| continues below. | continues as described 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). | specification, the server proceeds with the handshake (Section 7). | |||
| 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 refuses to accept a new connection, it SHOULD send an | If a server refuses to accept a new connection, it SHOULD send an | |||
| Initial packet containing a CONNECTION_CLOSE frame with error code | Initial packet containing a CONNECTION_CLOSE frame with error code | |||
| CONNECTION_REFUSED. | CONNECTION_REFUSED. | |||
| 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 not able to send Handshake packets prior to | packet. Clients are not able to send Handshake packets prior to | |||
| receiving a server response, so servers SHOULD ignore any such | 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. | |||
| 5.2.3. Considerations for Simple Load Balancers | 5.2.3. Considerations for Simple Load Balancers | |||
| A server deployment could load balance among servers using only | A server deployment could load-balance among servers using only | |||
| source and destination IP addresses and ports. Changes to the | source and destination IP addresses and ports. Changes to the | |||
| client's IP address or port could result in packets being forwarded | client's IP address or port could result in packets being forwarded | |||
| to the wrong server. Such a server deployment could use one of the | to the wrong server. Such a server deployment could use one of the | |||
| following methods for connection continuity when a client's address | following methods for connection continuity when a client's address | |||
| changes. | changes. | |||
| o Servers could use an out-of-band mechanism to forward packets to | o Servers could use an out-of-band mechanism to forward packets to | |||
| the correct server based on Connection ID. | the correct server based on connection ID. | |||
| o If servers can use a dedicated server IP address or port, other | o If servers can use a dedicated server IP address or port, other | |||
| than the one that the client initially connects to, they could use | than the one that the client initially connects to, they could use | |||
| the preferred_address transport parameter to request that clients | the preferred_address transport parameter to request that clients | |||
| move connections to that dedicated address. Note that clients | move connections to that dedicated address. Note that clients | |||
| could choose not to use the preferred address. | could choose not to use the preferred address. | |||
| A server in a deployment that does not implement a solution to | A server in a deployment that does not implement a solution to | |||
| maintain connection continuity when the client address changes SHOULD | maintain connection continuity when the client address changes SHOULD | |||
| indicate migration is not supported using the | indicate that migration is not supported by using the | |||
| disable_active_migration transport parameter. The | disable_active_migration transport parameter. The | |||
| disable_active_migration transport parameter does not prohibit | disable_active_migration transport parameter does not prohibit | |||
| connection migration after a client has acted on a preferred_address | connection migration after a client has acted on a preferred_address | |||
| transport parameter. | transport parameter. | |||
| Server deployments that use this simple form of load balancing MUST | Server deployments that use this simple form of load balancing MUST | |||
| avoid the creation of a stateless reset oracle; see Section 21.11. | avoid the creation of a stateless reset oracle; see Section 21.11. | |||
| 5.3. Operations on Connections | 5.3. Operations on Connections | |||
| This document does not define an API for QUIC, but instead defines a | This document does not define an API for QUIC; it instead defines a | |||
| set of functions for QUIC connections that application protocols can | set of functions for QUIC connections that application protocols can | |||
| rely upon. An application protocol can assume that an implementation | rely upon. An application protocol can assume that an implementation | |||
| of QUIC provides an interface that includes the operations described | of QUIC provides an interface that includes the operations described | |||
| in this section. An implementation designed for use with a specific | in this section. An implementation designed for use with a specific | |||
| application protocol might provide only those operations that are | application protocol might provide only those operations that are | |||
| used by that protocol. | used by that protocol. | |||
| When implementing the client role, an application protocol can: | When implementing the client role, an application protocol can: | |||
| o open a connection, which begins the exchange described in | o open a connection, which begins the exchange described in | |||
| skipping to change at page 36, line 24 ¶ | skipping to change at page 35, line 36 ¶ | |||
| from the client's resumption ticket and accept or reject Early | from the client's resumption ticket and accept or reject Early | |||
| Data based on that information. | Data based on that information. | |||
| In either role, an application protocol can: | In either role, an application protocol can: | |||
| o configure minimum values for the initial number of permitted | o configure minimum values for the initial number of permitted | |||
| streams of each type, as communicated in the transport parameters | streams of each type, as communicated in the transport parameters | |||
| (Section 7.4); | (Section 7.4); | |||
| o control resource allocation for receive buffers by setting flow | o control resource allocation for receive buffers by setting flow | |||
| control limits both for streams and for the connection | control limits both for streams and for the connection; | |||
| o identify whether the handshake has completed successfully or is | o identify whether the handshake has completed successfully or is | |||
| still ongoing; | still ongoing; | |||
| o keep a connection from silently closing, either by generating PING | o keep a connection from silently closing, by either generating PING | |||
| frames (Section 19.2) or by requesting that the transport send | frames (Section 19.2) or requesting that the transport send | |||
| additional frames before the idle timeout expires (Section 10.1); | additional frames before the idle timeout expires (Section 10.1); | |||
| and | and | |||
| o immediately close (Section 10.2) the connection. | o immediately close (Section 10.2) the connection. | |||
| 6. Version Negotiation | 6. Version Negotiation | |||
| Version negotiation allows a server to indicate that it does not | Version negotiation allows a server to indicate that it does not | |||
| support the version the client used. A server sends a Version | support the version the client used. 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 | |||
| skipping to change at page 37, line 29 ¶ | skipping to change at page 36, line 46 ¶ | |||
| A server MAY limit the number of Version Negotiation packets it | A server MAY limit the number of Version Negotiation packets it | |||
| sends. For instance, a server that is able to recognize packets as | sends. For instance, a server that is able to recognize packets as | |||
| 0-RTT might choose not to send Version Negotiation packets in | 0-RTT might choose not to send Version Negotiation packets in | |||
| response to 0-RTT packets with the expectation that it will | response to 0-RTT packets with the expectation that it will | |||
| eventually receive an Initial packet. | eventually receive an Initial packet. | |||
| 6.2. Handling Version Negotiation Packets | 6.2. Handling Version Negotiation Packets | |||
| Version Negotiation packets are designed to allow for functionality | Version Negotiation packets are designed to allow for functionality | |||
| to be defined in the future that allows QUIC to negotiate the version | to be defined in the future that allows QUIC to negotiate the version | |||
| of QUIC to use for a connection. Future standards-track | of QUIC to use for a connection. Future Standards Track | |||
| specifications might change how implementations that support multiple | specifications might change how implementations that support multiple | |||
| versions of QUIC react to Version Negotiation packets received in | versions of QUIC react to Version Negotiation packets received in | |||
| response to an attempt to establish a connection using this version. | response to an attempt to establish a connection using this version. | |||
| A client that supports only this version of QUIC MUST abandon the | A client that supports only this version of QUIC MUST abandon the | |||
| current connection attempt if it receives a Version Negotiation | current connection attempt if it receives a Version Negotiation | |||
| packet, with the following two exceptions. A client MUST discard any | packet, with the following two exceptions. A client MUST discard any | |||
| Version Negotiation packet if it has received and successfully | Version Negotiation packet if it has received and successfully | |||
| processed any other packet, including an earlier Version Negotiation | processed any other packet, including an earlier Version Negotiation | |||
| packet. A client MUST discard a Version Negotiation packet that | packet. A client MUST discard a Version Negotiation packet that | |||
| lists the QUIC version selected by the client. | lists the QUIC version selected by the client. | |||
| How to perform version negotiation is left as future work defined by | How to perform version negotiation is left as future work defined by | |||
| future standards-track specifications. In particular, that future | future Standards Track specifications. In particular, that future | |||
| work will ensure robustness against version downgrade attacks; see | work will ensure robustness against version downgrade attacks; see | |||
| Section 21.12. | Section 21.12. | |||
| 6.2.1. Version Negotiation Between Draft Versions | ||||
| [[RFC editor: please remove this section before publication.]] | ||||
| When a draft implementation receives a Version Negotiation packet, it | ||||
| MAY use it to attempt a new connection with one of the versions | ||||
| listed in the packet, instead of abandoning the current connection | ||||
| attempt; see Section 6.2. | ||||
| The client MUST check that the Destination and Source Connection ID | ||||
| fields match the 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 | ||||
| client then selects an acceptable protocol version from the list | ||||
| provided by the server. The client then attempts to create a new | ||||
| connection using that version. The new connection MUST use a new | ||||
| random Destination Connection ID different from the one it had | ||||
| previously sent. | ||||
| Note that this mechanism does not protect against downgrade attacks | ||||
| and MUST NOT be used outside of draft implementations. | ||||
| 6.3. Using Reserved Versions | 6.3. Using Reserved Versions | |||
| For a server to use a new version in the future, clients need to | For a server to use a new version in the future, clients need to | |||
| correctly handle unsupported versions. Some version numbers | correctly handle unsupported versions. Some version numbers | |||
| (0x?a?a?a?a as defined in Section 15) are reserved for inclusion in | (0x?a?a?a?a, as defined in Section 15) are reserved for inclusion in | |||
| fields that contain version numbers. | fields that contain version numbers. | |||
| Endpoints MAY add reserved versions to any field where unknown or | Endpoints MAY add reserved versions to any field where unknown or | |||
| unsupported versions are ignored to test that a peer correctly | unsupported versions are ignored to test that a peer correctly | |||
| ignores the value. For instance, an endpoint could include a | ignores the value. For instance, an endpoint could include a | |||
| reserved version in a Version Negotiation packet; see Section 17.2.1. | reserved version in a Version Negotiation packet; see Section 17.2.1. | |||
| Endpoints MAY send packets with a reserved version to test that a | Endpoints MAY send packets with a reserved version to test that a | |||
| peer correctly discards the packet. | peer correctly discards the packet. | |||
| 7. Cryptographic and Transport Handshake | 7. Cryptographic and Transport Handshake | |||
| skipping to change at page 39, line 4 ¶ | skipping to change at page 37, line 45 ¶ | |||
| and uses TLS as described in [QUIC-TLS]; a different QUIC version | and uses TLS as described in [QUIC-TLS]; a different QUIC version | |||
| could indicate that a different cryptographic handshake protocol is | could indicate that a different cryptographic handshake protocol is | |||
| in use. | in use. | |||
| QUIC provides reliable, ordered delivery of the cryptographic | QUIC provides reliable, ordered delivery of the cryptographic | |||
| handshake data. QUIC packet protection is used to encrypt as much of | handshake data. QUIC packet protection is used to encrypt as much of | |||
| the handshake protocol as possible. The cryptographic handshake MUST | the handshake protocol as possible. The cryptographic handshake MUST | |||
| provide the following properties: | provide the following properties: | |||
| o authenticated key exchange, where | o authenticated key exchange, where | |||
| * a server is always authenticated, | * a server is always authenticated, | |||
| * a client is optionally authenticated, | * a client is optionally authenticated, | |||
| * every connection produces distinct and unrelated keys, and | * every connection produces distinct and unrelated keys, and | |||
| * 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 1-RTT packets. | |||
| o authenticated exchange of values for transport parameters of both | o authenticated exchange of values for transport parameters of both | |||
| endpoints, and confidentiality protection for server transport | endpoints, and confidentiality protection for server transport | |||
| parameters (see Section 7.4) | parameters (see Section 7.4). | |||
| o authenticated negotiation of an application protocol (TLS uses | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [ALPN] for this purpose) | Application-Layer Protocol Negotiation (ALPN) [ALPN] for this | |||
| purpose). | ||||
| The CRYPTO frame can be sent in different packet number spaces | The CRYPTO frame can be sent in different packet number spaces | |||
| (Section 12.3). The offsets used by CRYPTO frames to ensure ordered | (Section 12.3). The offsets used by CRYPTO frames to ensure ordered | |||
| delivery of cryptographic handshake data start from zero in each | delivery of cryptographic handshake data start from zero in each | |||
| packet number space. | packet number space. | |||
| Figure 4 shows a simplified handshake and the exchange of packets and | Figure 4 shows a simplified handshake and the exchange of packets and | |||
| frames that are used to advance the handshake. Exchange of | frames that are used to advance the handshake. Exchange of | |||
| application data during the handshake is enabled where possible, | application data during the handshake is enabled where possible, | |||
| shown with a '*'. Once the handshake is complete, endpoints are able | shown with an asterisk ("*"). Once the handshake is complete, | |||
| to exchange application data freely. | endpoints are able to exchange application data freely. | |||
| Client Server | Client Server | |||
| Initial (CRYPTO) | Initial (CRYPTO) | |||
| 0-RTT (*) ----------> | 0-RTT (*) ----------> | |||
| Initial (CRYPTO) | Initial (CRYPTO) | |||
| Handshake (CRYPTO) | Handshake (CRYPTO) | |||
| <---------- 1-RTT (*) | <---------- 1-RTT (*) | |||
| Handshake (CRYPTO) | Handshake (CRYPTO) | |||
| 1-RTT (*) ----------> | 1-RTT (*) ----------> | |||
| skipping to change at page 40, line 24 ¶ | skipping to change at page 39, line 20 ¶ | |||
| Section 8.1.2. | Section 8.1.2. | |||
| Once any address validation exchanges are complete, the cryptographic | Once any address validation exchanges are 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 17.2.2) and Handshake | handshake is carried in Initial (Section 17.2.2) and Handshake | |||
| (Section 17.2.4) packets. | (Section 17.2.4) packets. | |||
| Figure 5 provides an overview of the 1-RTT handshake. Each line | Figure 5 provides an overview of the 1-RTT handshake. Each line | |||
| shows a QUIC packet with the packet type and packet number shown | shows a QUIC packet with the packet type and packet number shown | |||
| first, followed by the frames that are typically contained in those | first, followed by the frames that are typically contained in those | |||
| packets. So, for instance the first packet is of type Initial, with | packets. For instance, the first packet is of type Initial, with | |||
| packet number 0, and contains a CRYPTO frame carrying the | packet number 0, and contains a CRYPTO frame carrying the | |||
| ClientHello. | ClientHello. | |||
| Multiple QUIC packets - even of different packet types - can be | Multiple QUIC packets -- even of different packet types -- can be | |||
| coalesced into a single UDP datagram; see Section 12.2. As a result, | coalesced into a single UDP datagram; see Section 12.2. As a result, | |||
| this handshake could consist of as few as 4 UDP datagrams, or any | this handshake could consist of as few as four UDP datagrams, or any | |||
| number more (subject to limits inherent to the protocol, such as | number more (subject to limits inherent to the protocol, such as | |||
| congestion control and anti-amplification). For instance, the | congestion control and anti-amplification). For instance, the | |||
| server's first flight contains Initial packets, Handshake packets, | server's first flight contains Initial packets, Handshake packets, | |||
| and "0.5-RTT data" in 1-RTT packets. | and "0.5-RTT data" in 1-RTT packets. | |||
| Client Server | Client Server | |||
| Initial[0]: CRYPTO[CH] -> | Initial[0]: CRYPTO[CH] -> | |||
| Initial[0]: CRYPTO[SH] ACK[0] | Initial[0]: CRYPTO[SH] ACK[0] | |||
| skipping to change at page 42, line 14 ¶ | skipping to change at page 41, line 9 ¶ | |||
| The Destination Connection ID field from the first Initial packet | The Destination Connection ID field from the first Initial packet | |||
| sent by a client is used to determine packet protection keys for | sent by a client is used to determine packet protection keys for | |||
| Initial packets. These keys change after receiving a Retry packet; | Initial packets. These keys change after receiving a Retry packet; | |||
| see Section 5.2 of [QUIC-TLS]. | see Section 5.2 of [QUIC-TLS]. | |||
| The client populates the Source Connection ID field with a value of | The client populates the Source Connection ID field with a value of | |||
| its choosing and sets the Source Connection ID Length field to | its choosing and sets the Source Connection ID Length field to | |||
| indicate the length. | indicate the length. | |||
| The first flight of 0-RTT packets use the same Destination Connection | 0-RTT packets in the first flight use the same Destination Connection | |||
| ID and Source Connection ID values as the client's first Initial | ID and Source Connection ID values as the client's first Initial | |||
| packet. | packet. | |||
| Upon first receiving an Initial or Retry packet from the server, the | Upon first receiving an Initial or Retry packet from the server, the | |||
| client uses the Source Connection ID supplied by the server as the | client uses the Source Connection ID supplied by the server as the | |||
| Destination Connection ID for subsequent packets, including any 0-RTT | Destination Connection ID for subsequent packets, including any 0-RTT | |||
| packets. This means that a client might have to change the | packets. This means that a client might have to change the | |||
| connection ID it sets in the Destination Connection ID field twice | connection ID it sets in the Destination Connection ID field twice | |||
| during connection establishment: once in response to a Retry, and | during connection establishment: once in response to a Retry packet | |||
| once in response to an Initial packet from the server. Once a client | and once in response to an Initial packet from the server. Once a | |||
| has received a valid Initial packet from the server, it MUST discard | client has received a valid Initial packet from the server, it MUST | |||
| any subsequent packet it receives on that connection with a different | discard any subsequent packet it receives on that connection with a | |||
| Source Connection ID. | different Source Connection ID. | |||
| A client MUST change the Destination Connection ID it uses for | A client MUST change the Destination Connection ID it uses for | |||
| sending packets in response to only the first received Initial or | sending packets in response to only the first received Initial or | |||
| Retry packet. A server MUST set the Destination Connection ID it | Retry packet. A server MUST set the Destination Connection ID it | |||
| uses for sending packets based on the first received Initial packet. | uses for sending packets based on the first received Initial packet. | |||
| Any further changes to the Destination Connection ID are only | Any further changes to the Destination Connection ID are only | |||
| permitted if the values are taken from NEW_CONNECTION_ID frames; if | permitted if the values are taken from NEW_CONNECTION_ID frames; if | |||
| subsequent Initial packets include a different Source Connection ID, | subsequent Initial packets include a different Source Connection ID, | |||
| they MUST be discarded. This avoids unpredictable outcomes that | they MUST be discarded. This avoids unpredictable outcomes that | |||
| might otherwise result from stateless processing of multiple Initial | might otherwise result from stateless processing of multiple Initial | |||
| skipping to change at page 43, line 20 ¶ | skipping to change at page 42, line 13 ¶ | |||
| original_destination_connection_id transport parameter; if the server | original_destination_connection_id transport parameter; if the server | |||
| sent a Retry packet, this refers to the first Initial packet received | sent a Retry packet, this refers to the first Initial packet received | |||
| before sending the Retry packet. If it sends a Retry packet, a | before sending the Retry packet. If it sends a Retry packet, a | |||
| server also includes the Source Connection ID field from the Retry | server also includes the Source Connection ID field from the Retry | |||
| packet in the retry_source_connection_id transport parameter. | packet in the retry_source_connection_id transport parameter. | |||
| The values provided by a peer for these transport parameters MUST | The values provided by a peer for these transport parameters MUST | |||
| match the values that an endpoint used in the Destination and Source | match the values that an endpoint used in the Destination and Source | |||
| Connection ID fields of Initial packets that it sent (and received, | Connection ID fields of Initial packets that it sent (and received, | |||
| for servers). Endpoints MUST validate that received transport | for servers). Endpoints MUST validate that received transport | |||
| parameters match received Connection ID values. Including connection | parameters match received connection ID values. Including connection | |||
| ID values in transport parameters and verifying them ensures that | ID values in transport parameters and verifying them ensures that an | |||
| that an attacker cannot influence the choice of connection ID for a | attacker cannot influence the choice of connection ID for a | |||
| successful connection by injecting packets carrying attacker-chosen | successful connection by injecting packets carrying attacker-chosen | |||
| connection IDs during the handshake. | connection IDs during the handshake. | |||
| An endpoint MUST treat absence of the initial_source_connection_id | An endpoint MUST treat the absence of the | |||
| transport parameter from either endpoint or absence of the | initial_source_connection_id transport parameter from either endpoint | |||
| original_destination_connection_id transport parameter from the | or the absence of the original_destination_connection_id transport | |||
| server as a connection error of type TRANSPORT_PARAMETER_ERROR. | parameter from the server as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR. | ||||
| An endpoint MUST treat the following as a connection error of type | An endpoint MUST treat the following as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR or PROTOCOL_VIOLATION: | TRANSPORT_PARAMETER_ERROR or PROTOCOL_VIOLATION: | |||
| o absence of the retry_source_connection_id transport parameter from | o absence of the retry_source_connection_id transport parameter from | |||
| the server after receiving a Retry packet, | the server after receiving a Retry packet, | |||
| o presence of the retry_source_connection_id transport parameter | o presence of the retry_source_connection_id transport parameter | |||
| when no Retry packet was received, or | when no Retry packet was received, or | |||
| skipping to change at page 44, line 29 ¶ | skipping to change at page 43, line 29 ¶ | |||
| Initial: DCID=S1, SCID=C1 -> | Initial: DCID=S1, SCID=C1 -> | |||
| <- Retry: DCID=C1, SCID=S2 | <- Retry: DCID=C1, SCID=S2 | |||
| Initial: DCID=S2, SCID=C1 -> | Initial: DCID=S2, SCID=C1 -> | |||
| <- Initial: DCID=C1, SCID=S3 | <- Initial: DCID=C1, SCID=S3 | |||
| ... | ... | |||
| 1-RTT: DCID=S3 -> | 1-RTT: DCID=S3 -> | |||
| <- 1-RTT: DCID=C1 | <- 1-RTT: DCID=C1 | |||
| Figure 8: Use of Connection IDs in a Handshake with Retry | Figure 8: Use of Connection IDs in a Handshake with Retry | |||
| In both cases (Figure 7 and Figure 8), the client sets the value of | In both cases (Figures 7 and 8), the client sets the value of the | |||
| the initial_source_connection_id transport parameter to "C1". | initial_source_connection_id transport parameter to "C1". | |||
| When the handshake does not include a Retry (Figure 7), the server | When the handshake does not include a Retry (Figure 7), the server | |||
| sets original_destination_connection_id to "S1" and | sets original_destination_connection_id to "S1" (note that this value | |||
| initial_source_connection_id to "S3". In this case, the server does | is chosen by the client) and initial_source_connection_id to "S3". | |||
| not include a retry_source_connection_id transport parameter. | In this case, the server does not include a | |||
| retry_source_connection_id transport parameter. | ||||
| When the handshake includes a Retry (Figure 8), the server sets | When the handshake includes a Retry (Figure 8), the server sets | |||
| original_destination_connection_id to "S1", | original_destination_connection_id to "S1", | |||
| retry_source_connection_id to "S2", and initial_source_connection_id | retry_source_connection_id to "S2", and initial_source_connection_id | |||
| to "S3". | to "S3". | |||
| 7.4. Transport Parameters | 7.4. Transport Parameters | |||
| During connection establishment, both endpoints make authenticated | During connection establishment, both endpoints make authenticated | |||
| declarations of their transport parameters. Endpoints are required | declarations of their transport parameters. Endpoints are required | |||
| skipping to change at page 45, line 27 ¶ | skipping to change at page 44, line 27 ¶ | |||
| TRANSPORT_PARAMETER_ERROR. | TRANSPORT_PARAMETER_ERROR. | |||
| An endpoint MUST NOT send a parameter more than once in a given | An endpoint MUST NOT send a parameter more than once in a given | |||
| transport parameters extension. An endpoint SHOULD treat receipt of | transport parameters extension. An endpoint SHOULD treat receipt of | |||
| duplicate transport parameters as a connection error of type | duplicate transport parameters as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR. | TRANSPORT_PARAMETER_ERROR. | |||
| Endpoints use transport parameters to authenticate the negotiation of | Endpoints use transport parameters to authenticate the negotiation of | |||
| connection IDs during the handshake; see Section 7.3. | connection IDs during the handshake; see Section 7.3. | |||
| Application Layer Protocol Negotiation (ALPN; see [ALPN]) allows | ALPN (see [ALPN]) allows clients to offer multiple application | |||
| clients to offer multiple application protocols during connection | protocols during connection establishment. The transport parameters | |||
| establishment. The transport parameters that a client includes | that a client includes during the handshake apply to all application | |||
| during the handshake apply to all application protocols that the | protocols that the client offers. Application protocols can | |||
| client offers. Application protocols can recommend values for | recommend values for transport parameters, such as the initial flow | |||
| transport parameters, such as the initial flow control limits. | control limits. However, application protocols that set constraints | |||
| However, application protocols that set constraints on values for | on values for transport parameters could make it impossible for a | |||
| transport parameters could make it impossible for a client to offer | client to offer multiple application protocols if these constraints | |||
| multiple application protocols if these constraints conflict. | conflict. | |||
| 7.4.1. Values of Transport Parameters for 0-RTT | 7.4.1. Values of Transport Parameters for 0-RTT | |||
| Using 0-RTT depends on both client and server using protocol | Using 0-RTT depends on both client and server using protocol | |||
| parameters that were negotiated from a previous connection. To | parameters that were negotiated from a previous connection. To | |||
| enable 0-RTT, endpoints store the value of the server transport | enable 0-RTT, endpoints store the values of the server transport | |||
| parameters from a connection and apply them to any 0-RTT packets that | parameters with any session tickets it receives on the connection. | |||
| are sent in subsequent connections to that peer that use a session | Endpoints also store any information required by the application | |||
| ticket issued on that connection. This information is stored with | protocol or cryptographic handshake; see Section 4.6 of [QUIC-TLS]. | |||
| any information required by the application protocol or cryptographic | The values of stored transport parameters are used when attempting | |||
| handshake; see Section 4.6 of [QUIC-TLS]. | 0-RTT using the session tickets. | |||
| Remembered transport parameters apply to the new connection until the | Remembered transport parameters apply to the new connection until the | |||
| handshake completes and the client starts sending 1-RTT packets. | handshake completes and the client starts sending 1-RTT packets. | |||
| Once the handshake completes, the client uses the transport | Once the handshake completes, the client uses the transport | |||
| parameters established in the handshake. Not all transport | parameters established in the handshake. Not all transport | |||
| parameters are remembered, as some do not apply to future connections | parameters are remembered, as some do not apply to future connections | |||
| or they have no effect on use of 0-RTT. | or they have no effect on the use of 0-RTT. | |||
| The definition of a new transport parameter (Section 7.4.2) MUST | The definition of a new transport parameter (Section 7.4.2) MUST | |||
| specify whether storing the transport parameter for 0-RTT is | specify whether storing the transport parameter for 0-RTT is | |||
| mandatory, optional, or prohibited. A client need not store a | mandatory, optional, or prohibited. A client need not store a | |||
| transport parameter it cannot process. | transport parameter it cannot process. | |||
| A client MUST NOT use remembered values for the following parameters: | A client MUST NOT use remembered values for the following parameters: | |||
| ack_delay_exponent, max_ack_delay, initial_source_connection_id, | ack_delay_exponent, max_ack_delay, initial_source_connection_id, | |||
| original_destination_connection_id, preferred_address, | original_destination_connection_id, preferred_address, | |||
| retry_source_connection_id, and stateless_reset_token. The client | retry_source_connection_id, and stateless_reset_token. The client | |||
| MUST use the server's new values in the handshake instead; if the | MUST use the server's new values in the handshake instead; if the | |||
| server does not provide new values, the default value is used. | server does not provide new values, the default values are used. | |||
| A client that attempts to send 0-RTT data MUST remember all other | A client that attempts to send 0-RTT data MUST remember all other | |||
| transport parameters used by the server that it is able to process. | transport parameters used by the server that it is able to process. | |||
| The server can remember these transport parameters, or store an | The server can remember these transport parameters or can store an | |||
| integrity-protected copy of the values in the ticket and recover the | integrity-protected copy of the values in the ticket and recover the | |||
| information when accepting 0-RTT data. A server uses the transport | information when accepting 0-RTT data. A server uses the transport | |||
| parameters in determining whether to accept 0-RTT data. | parameters in determining whether to accept 0-RTT data. | |||
| If 0-RTT data is accepted by the server, the server MUST NOT reduce | If 0-RTT data is accepted by the server, the server MUST NOT reduce | |||
| any limits or alter any values that might be violated by the client | any limits or alter any values that might be violated by the client | |||
| with its 0-RTT data. In particular, a server that accepts 0-RTT data | with its 0-RTT data. In particular, a server that accepts 0-RTT data | |||
| MUST NOT set values for the following parameters (Section 18.2) that | MUST NOT set values for the following parameters (Section 18.2) that | |||
| are smaller than the remembered value of the parameters. | are smaller than the remembered values of the parameters. | |||
| o active_connection_id_limit | o active_connection_id_limit | |||
| o initial_max_data | o initial_max_data | |||
| o initial_max_stream_data_bidi_local | o initial_max_stream_data_bidi_local | |||
| o initial_max_stream_data_bidi_remote | o initial_max_stream_data_bidi_remote | |||
| o initial_max_stream_data_uni | o initial_max_stream_data_uni | |||
| o initial_max_streams_bidi | o initial_max_streams_bidi | |||
| o initial_max_streams_uni | o initial_max_streams_uni | |||
| 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 applicable | result in 0-RTT data being enabled but not usable. The applicable | |||
| subset of transport parameters that permit sending of application | subset of transport parameters that permit the sending of application | |||
| data SHOULD be set to non-zero values for 0-RTT. This includes | data SHOULD be set to non-zero values for 0-RTT. This includes | |||
| initial_max_data and either initial_max_streams_bidi and | initial_max_data and either (1) initial_max_streams_bidi and | |||
| initial_max_stream_data_bidi_remote, or initial_max_streams_uni and | initial_max_stream_data_bidi_remote or (2) initial_max_streams_uni | |||
| initial_max_stream_data_uni. | and initial_max_stream_data_uni. | |||
| A server might provide larger initial stream flow control limits for | ||||
| streams than the remembered values that a client applies when sending | ||||
| 0-RTT. Once the handshake completes, the client updates the flow | ||||
| control limits on all sending streams using the updated values of | ||||
| initial_max_stream_data_bidi_remote and initial_max_stream_data_uni. | ||||
| A server MAY store and recover the previously sent values of the | A server MAY store and recover the previously sent values of the | |||
| max_idle_timeout, max_udp_payload_size, and disable_active_migration | max_idle_timeout, max_udp_payload_size, and disable_active_migration | |||
| parameters and reject 0-RTT if it selects smaller values. Lowering | parameters and reject 0-RTT if it selects smaller values. Lowering | |||
| the values of these parameters while also accepting 0-RTT data could | the values of these parameters while also accepting 0-RTT data could | |||
| degrade the performance of the connection. Specifically, lowering | degrade the performance of the connection. Specifically, lowering | |||
| the max_udp_payload_size could result in dropped packets leading to | the max_udp_payload_size could result in dropped packets, leading to | |||
| worse performance compared to rejecting 0-RTT data outright. | worse performance compared to rejecting 0-RTT data outright. | |||
| A server MUST reject 0-RTT data if the restored values for transport | A server MUST reject 0-RTT data if the restored values for transport | |||
| parameters cannot be supported. | parameters cannot be supported. | |||
| When sending frames in 0-RTT packets, a client MUST only use | When sending frames in 0-RTT packets, a client MUST only use | |||
| remembered transport parameters; importantly, it MUST NOT use updated | remembered transport parameters; importantly, it MUST NOT use updated | |||
| values that it learns from the server's updated transport parameters | values that it learns from the server's updated transport parameters | |||
| or from frames received in 1-RTT packets. Updated values of | or from frames received in 1-RTT packets. Updated values of | |||
| transport parameters from the handshake apply only to 1-RTT packets. | transport parameters from the handshake apply only to 1-RTT packets. | |||
| For instance, flow control limits from remembered transport | For instance, flow control limits from remembered transport | |||
| parameters apply to all 0-RTT packets even if those values are | parameters apply to all 0-RTT packets even if those values are | |||
| increased by the handshake or by frames sent in 1-RTT packets. A | increased by the handshake or by frames sent in 1-RTT packets. A | |||
| server MAY treat use of updated transport parameters in 0-RTT as a | server MAY treat the use of updated transport parameters in 0-RTT as | |||
| connection error of type PROTOCOL_VIOLATION. | a connection error of type PROTOCOL_VIOLATION. | |||
| 7.4.2. New Transport Parameters | 7.4.2. 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. The absence of a transport parameter therefore disables | |||
| optional protocol feature that is negotiated using the parameter. As | any optional protocol feature that is negotiated using the parameter. | |||
| described in Section 18.1, some identifiers are reserved in order to | As described in Section 18.1, some identifiers are reserved in order | |||
| exercise this requirement. | to exercise this requirement. | |||
| A client that does not understand a transport parameter can discard | A client that does not understand a transport parameter can discard | |||
| it and attempt 0-RTT on subsequent connections. However, if the | it and attempt 0-RTT on subsequent connections. However, if the | |||
| client adds support for a discarded transport parameter, it risks | client adds support for a discarded transport parameter, it risks | |||
| violating the constraints that the transport parameter establishes if | violating the constraints that the transport parameter establishes if | |||
| it attempts 0-RTT. New transport parameters can avoid this problem | it attempts 0-RTT. New transport parameters can avoid this problem | |||
| by setting a default of the most conservative value. Clients can | by setting a default of the most conservative value. Clients can | |||
| avoid this problem by remembering all parameters, even ones not | avoid this problem by remembering all parameters, even those not | |||
| currently supported. | currently supported. | |||
| New transport parameters can be registered according to the rules in | New transport parameters can be registered according to the rules in | |||
| Section 22.3. | Section 22.3. | |||
| 7.5. Cryptographic Message Buffering | 7.5. Cryptographic Message Buffering | |||
| Implementations need to maintain a buffer of CRYPTO data received out | Implementations need to maintain a buffer of CRYPTO data received out | |||
| of order. Because there is no flow control of CRYPTO frames, an | of order. Because there is no flow control of CRYPTO frames, an | |||
| endpoint could potentially force its peer to buffer an unbounded | endpoint could potentially force its peer to buffer an unbounded | |||
| skipping to change at page 49, line 5 ¶ | skipping to change at page 48, line 8 ¶ | |||
| peer is able to receive packets at the transport address that it | peer is able to receive packets at the transport address that it | |||
| claims. Therefore, after receiving packets from an address that is | claims. Therefore, after receiving packets from an address that is | |||
| not yet validated, an endpoint MUST limit the amount of data it sends | not yet validated, an endpoint MUST limit the amount of data it sends | |||
| to the unvalidated address to three times the amount of data received | to the unvalidated address to three times the amount of data received | |||
| from that address. This limit on the size of responses is known as | from that address. This limit on the size of responses is known as | |||
| the anti-amplification limit. | the anti-amplification limit. | |||
| Address validation is performed both during connection establishment | Address validation is performed both during connection establishment | |||
| (see Section 8.1) and during connection migration (see Section 8.2). | (see Section 8.1) and during connection migration (see Section 8.2). | |||
| 8.1. Address Validation During Connection Establishment | 8.1. Address Validation during Connection Establishment | |||
| Connection establishment implicitly provides address validation for | Connection establishment implicitly provides address validation for | |||
| both endpoints. In particular, receipt of a packet protected with | both endpoints. In particular, receipt of a packet protected with | |||
| Handshake keys confirms that the peer successfully processed an | Handshake keys confirms that the peer successfully processed an | |||
| Initial packet. Once an endpoint has successfully processed a | Initial packet. Once an endpoint has successfully processed a | |||
| Handshake packet from the peer, it can consider the peer address to | Handshake packet from the peer, it can consider the peer address to | |||
| have been validated. | have been validated. | |||
| Additionally, an endpoint MAY consider the peer address validated if | Additionally, an endpoint MAY consider the peer address validated if | |||
| the peer uses a connection ID chosen by the endpoint and the | the peer uses a connection ID chosen by the endpoint and the | |||
| skipping to change at page 49, line 48 ¶ | skipping to change at page 48, line 51 ¶ | |||
| necessary. A client that sends padded datagrams allows the server to | necessary. A client that sends padded datagrams allows the server to | |||
| send more data prior to completing address validation. | send more data prior to completing address validation. | |||
| Loss of an Initial or Handshake packet from the server can cause a | Loss of an Initial or Handshake packet from the server can cause a | |||
| deadlock if the client does not send additional Initial or Handshake | deadlock if the client does not send additional Initial or Handshake | |||
| packets. A deadlock could occur when the server reaches its anti- | packets. A deadlock could occur when the server reaches its anti- | |||
| amplification limit and the client has received acknowledgments for | amplification limit and the client has received acknowledgments for | |||
| all the data it has sent. In this case, when the client has no | all the data it has sent. In this case, when the client has no | |||
| reason to send additional packets, the server will be unable to send | reason to send additional packets, the server will be unable to send | |||
| more data because it has not validated the client's address. To | more data because it has not validated the client's address. To | |||
| prevent this deadlock, clients MUST send a packet on a probe timeout | prevent this deadlock, clients MUST send a packet on a Probe Timeout | |||
| (PTO, see Section 6.2 of [QUIC-RECOVERY]). Specifically, the client | (PTO); see Section 6.2 of [QUIC-RECOVERY]. Specifically, the client | |||
| MUST send an Initial packet in a UDP datagram that contains at least | MUST send an Initial packet in a UDP datagram that contains at least | |||
| 1200 bytes if it does not have Handshake keys, and otherwise send a | 1200 bytes if it does not have Handshake keys, and otherwise send a | |||
| Handshake packet. | Handshake packet. | |||
| A server might wish to validate the client address before starting | A server might wish to validate the client address before starting | |||
| the cryptographic handshake. QUIC uses a token in the Initial packet | the cryptographic handshake. QUIC uses a token in the Initial packet | |||
| to provide address validation prior to completing the handshake. | to provide address validation prior to completing the handshake. | |||
| This token is delivered to the client during connection establishment | This token is delivered to the client during connection establishment | |||
| with a Retry packet (see Section 8.1.2) or in a previous connection | with a Retry packet (see Section 8.1.2) or in a previous connection | |||
| using the NEW_TOKEN frame (see Section 8.1.3). | using the NEW_TOKEN frame (see Section 8.1.3). | |||
| In addition to sending limits imposed prior to address validation, | In addition to sending limits imposed prior to address validation, | |||
| servers are also constrained in what they can send by the limits set | servers are also constrained in what they can send by the limits set | |||
| by the congestion controller. Clients are only constrained by the | by the congestion controller. Clients are only constrained by the | |||
| congestion controller. | congestion controller. | |||
| 8.1.1. Token Construction | 8.1.1. Token Construction | |||
| A token sent in a NEW_TOKEN frame or a Retry packet MUST be | A token sent in a NEW_TOKEN frame or a Retry packet MUST be | |||
| constructed in a way that allows the server to identify how it was | constructed in a way that allows the server to identify how it was | |||
| provided to a client. These tokens are carried in the same field, | provided to a client. These tokens are carried in the same field but | |||
| but require different handling from servers. | require different handling from servers. | |||
| 8.1.2. Address Validation using Retry Packets | 8.1.2. Address Validation Using Retry Packets | |||
| Upon receiving the client's Initial packet, the server can request | Upon receiving the client's Initial packet, the server can request | |||
| address validation by sending a Retry packet (Section 17.2.5) | address validation by sending a Retry packet (Section 17.2.5) | |||
| containing a token. This token MUST be repeated by the client in all | containing a token. This token MUST be repeated by the client in all | |||
| Initial packets it sends for that connection after it receives the | Initial packets it sends for that connection after it receives the | |||
| Retry packet. | Retry packet. | |||
| In response to processing an Initial containing a token that was | In response to processing an Initial packet containing a token that | |||
| provided in a Retry packet, a server cannot send another Retry | was provided in a Retry packet, a server cannot send another Retry | |||
| packet; it can only refuse the connection or permit it to proceed. | packet; it can only refuse the connection or permit it to proceed. | |||
| As long as it is not possible for an attacker to generate a valid | As long as it is not possible for an attacker to generate a valid | |||
| token for its own address (see Section 8.1.4) and the client is able | token for its own address (see Section 8.1.4) and the client is able | |||
| to return that token, it proves to the server that it received the | to return that token, it proves to the server that it received the | |||
| token. | token. | |||
| A server can also use a Retry packet to defer the state and | A server can also use a Retry packet to defer the state and | |||
| processing costs of connection establishment. Requiring the server | processing costs of connection establishment. Requiring the server | |||
| to provide a different connection ID, along with the | to provide a different connection ID, along with the | |||
| skipping to change at page 52, line 40 ¶ | skipping to change at page 51, line 45 ¶ | |||
| connection to that server. | connection to that server. | |||
| A token allows a server to correlate activity between the connection | A token allows a server to correlate activity between the connection | |||
| where the token was issued and any connection where it is used. | where the token was issued and any connection where it is used. | |||
| Clients that want to break continuity of identity with a server can | Clients that want to break continuity of identity with a server can | |||
| discard tokens provided using the NEW_TOKEN frame. In comparison, a | discard tokens provided using the NEW_TOKEN frame. In comparison, a | |||
| token obtained in a Retry packet MUST be used immediately during the | token obtained in a Retry packet MUST be used immediately during the | |||
| connection attempt and cannot be used in subsequent connection | connection attempt and cannot be used in subsequent connection | |||
| attempts. | attempts. | |||
| A client SHOULD NOT reuse a NEW_TOKEN token for different connection | A client SHOULD NOT reuse a token from a NEW_TOKEN frame for | |||
| attempts. Reusing a token allows connections to be linked by | different connection attempts. Reusing a token allows connections to | |||
| entities on the network path; see Section 9.5. | be linked by entities on the network path; see Section 9.5. | |||
| Clients might receive multiple tokens on a single connection. Aside | Clients might receive multiple tokens on a single connection. Aside | |||
| from preventing linkability, any token can be used in any connection | from preventing linkability, any token can be used in any connection | |||
| attempt. Servers can send additional tokens to either enable address | attempt. Servers can send additional tokens to either enable address | |||
| validation for multiple connection attempts or to replace older | validation for multiple connection attempts or replace older tokens | |||
| tokens that might become invalid. For a client, this ambiguity means | that might become invalid. For a client, this ambiguity means that | |||
| that sending the most recent unused token is most likely to be | sending the most recent unused token is most likely to be effective. | |||
| effective. Though saving and using older tokens has no negative | Though saving and using older tokens have no negative consequences, | |||
| consequences, clients can regard older tokens as being less likely be | clients can regard older tokens as being less likely to be useful to | |||
| useful to the server for address validation. | the server for address validation. | |||
| When a server receives an Initial packet with an address validation | When a server receives an Initial packet with an address validation | |||
| token, it MUST attempt to validate the token, unless it has already | token, it MUST attempt to validate the token, unless it has already | |||
| completed address validation. If the token is invalid then the | completed address validation. If the token is invalid, then the | |||
| server SHOULD proceed as if the client did not have a validated | server SHOULD proceed as if the client did not have a validated | |||
| address, including potentially sending a Retry. Tokens provided with | address, including potentially sending a Retry packet. Tokens | |||
| NEW_TOKEN frames and Retry packets can be distinguished by servers | provided with NEW_TOKEN frames and Retry packets can be distinguished | |||
| (see Section 8.1.1), and the latter validated more strictly. If the | by servers (see Section 8.1.1), and the latter can be validated more | |||
| validation succeeds, the server SHOULD then allow the handshake to | strictly. If the validation succeeds, the server SHOULD then allow | |||
| proceed. | the handshake to proceed. | |||
| Note: The rationale for treating the client as unvalidated rather | Note: The rationale for treating the client as unvalidated rather | |||
| than discarding the packet is that the client might have received | than discarding the packet is that the client might have received | |||
| the token in a previous connection using the NEW_TOKEN frame, and | the token in a previous connection using the NEW_TOKEN frame, and | |||
| if the server has lost state, it might be unable to validate the | if the server has lost state, it might be unable to validate the | |||
| token at all, leading to connection failure if the packet is | token at all, leading to connection failure if the packet is | |||
| discarded. | discarded. | |||
| In a stateless design, a server can use encrypted and authenticated | In a stateless design, a server can use encrypted and authenticated | |||
| tokens to pass information to clients that the server can later | tokens to pass information to clients that the server can later | |||
| recover and use to validate a client address. Tokens are not | recover and use to validate a client address. Tokens are not | |||
| integrated into the cryptographic handshake and so they are not | integrated into the cryptographic handshake, and so they are not | |||
| authenticated. For instance, a client might be able to reuse a | authenticated. For instance, a client might be able to reuse a | |||
| token. To avoid attacks that exploit this property, a server can | token. To avoid attacks that exploit this property, a server can | |||
| limit its use of tokens to only the information needed to validate | limit its use of tokens to only the information needed to validate | |||
| client addresses. | client addresses. | |||
| Clients MAY use tokens obtained on one connection for any connection | Clients MAY use tokens obtained on one connection for any connection | |||
| attempt using the same version. When selecting a token to use, | attempt using the same version. When selecting a token to use, | |||
| clients do not need to consider other properties of the connection | clients do not need to consider other properties of the connection | |||
| that is being attempted, including the choice of possible application | that is being attempted, including the choice of possible application | |||
| protocols, session tickets, or other connection properties. | protocols, session tickets, or other connection properties. | |||
| skipping to change at page 54, line 13 ¶ | skipping to change at page 53, line 18 ¶ | |||
| requires access to the integrity protection key for tokens. | requires access to the integrity protection key for tokens. | |||
| There is no need for a single well-defined format for the token | There is no need for a single well-defined format for the token | |||
| because the server that generates the token also consumes it. Tokens | because the server that generates the token also consumes it. Tokens | |||
| sent in Retry packets SHOULD include information that allows the | sent in Retry packets SHOULD include information that allows the | |||
| server to verify that the source IP address and port in client | server to verify that the source IP address and port in client | |||
| packets remain constant. | packets remain constant. | |||
| Tokens sent in NEW_TOKEN frames MUST include information that allows | Tokens sent in NEW_TOKEN frames MUST include information that allows | |||
| the server to verify that the client IP address has not changed from | the server to verify that the client IP address has not changed from | |||
| when the token was issued. Servers can use tokens from NEW_TOKEN in | when the token was issued. Servers can use tokens from NEW_TOKEN | |||
| deciding not to send a Retry packet, even if the client address has | frames in deciding not to send a Retry packet, even if the client | |||
| changed. If the client IP address has changed, the server MUST | address has changed. If the client IP address has changed, the | |||
| adhere to the anti-amplification limit; see Section 8. Note that in | server MUST adhere to the anti-amplification limit; see Section 8. | |||
| the presence of NAT, this requirement might be insufficient to | Note that in the presence of NAT, this requirement might be | |||
| protect other hosts that share the NAT from amplification attack. | insufficient to protect other hosts that share the NAT from | |||
| amplification attacks. | ||||
| Attackers could replay tokens to use servers as amplifiers in DDoS | Attackers could replay tokens to use servers as amplifiers in DDoS | |||
| attacks. To protect against such attacks, servers MUST ensure that | attacks. To protect against such attacks, servers MUST ensure that | |||
| replay of tokens is prevented or limited. Servers SHOULD ensure that | replay of tokens is prevented or limited. Servers SHOULD ensure that | |||
| tokens sent in Retry packets are only accepted for a short time, as | tokens sent in Retry packets are only accepted for a short time, as | |||
| they are returned immediately by clients. Tokens that are provided | they are returned immediately by clients. Tokens that are provided | |||
| in NEW_TOKEN frames (Section 19.7) need to be valid for longer, but | in NEW_TOKEN frames (Section 19.7) need to be valid for longer but | |||
| SHOULD NOT be accepted multiple times. Servers are encouraged to | SHOULD NOT be accepted multiple times. Servers are encouraged to | |||
| allow tokens to be used only once, if possible; tokens MAY include | allow tokens to be used only once, if possible; tokens MAY include | |||
| additional information about clients to further narrow applicability | additional information about clients to further narrow applicability | |||
| or reuse. | or reuse. | |||
| 8.2. Path Validation | 8.2. Path Validation | |||
| Path validation is used by both peers during connection migration | Path validation is used by both peers during connection migration | |||
| (see Section 9) to verify reachability after a change of address. In | (see Section 9) to verify reachability after a change of address. In | |||
| path validation, endpoints test reachability between a specific local | path validation, endpoints test reachability between a specific local | |||
| address and a specific peer address, where an address is the two- | address and a specific peer address, where an address is the 2-tuple | |||
| tuple of IP address and port. | of IP address and port. | |||
| Path validation tests that packets sent on a path to a peer are | Path validation tests that packets sent on a path to a peer are | |||
| received by that peer. Path validation is used to ensure that | received by that peer. Path validation is used to ensure that | |||
| packets received from a migrating peer do not carry a spoofed source | packets received from a migrating peer do not carry a spoofed source | |||
| address. | address. | |||
| Path validation does not validate that a peer can send in the return | Path validation does not validate that a peer can send in the return | |||
| direction. Acknowledgments cannot be used for return path validation | direction. Acknowledgments cannot be used for return path validation | |||
| because they contain insufficient entropy and might be spoofed. | because they contain insufficient entropy and might be spoofed. | |||
| Endpoints independently determine reachability on each direction of a | Endpoints independently determine reachability on each direction of a | |||
| path, and therefore return reachability can only be established by | path, and therefore return reachability can only be established by | |||
| the peer. | the peer. | |||
| Path validation can be used at any time by either endpoint. For | Path validation can be used at any time by either endpoint. For | |||
| instance, an endpoint might check that a peer is still in possession | instance, an endpoint might check that a peer is still in possession | |||
| of its address after a period of quiescence. | of its address after a period of quiescence. | |||
| Path validation is not designed as a NAT traversal mechanism. Though | Path validation is not designed as a NAT traversal mechanism. Though | |||
| the mechanism described here might be effective for the creation of | the mechanism described here might be effective for the creation of | |||
| NAT bindings that support NAT traversal, the expectation is that one | NAT bindings that support NAT traversal, the expectation is that one | |||
| or other peer is able to receive packets without first having sent a | endpoint is able to receive packets without first having sent a | |||
| packet on that path. Effective NAT traversal needs additional | packet on that path. Effective NAT traversal needs additional | |||
| synchronization mechanisms that are not provided here. | synchronization mechanisms that are not provided here. | |||
| An endpoint MAY include other frames with the PATH_CHALLENGE and | An endpoint MAY include other frames with the PATH_CHALLENGE and | |||
| PATH_RESPONSE frames used for path validation. In particular, an | PATH_RESPONSE frames used for path validation. In particular, an | |||
| endpoint can include PADDING frames with a PATH_CHALLENGE frame for | endpoint can include PADDING frames with a PATH_CHALLENGE frame for | |||
| Path Maximum Transmission Unit Discovery (PMTUD; see Section 14.2.1); | Path Maximum Transmission Unit Discovery (PMTUD); see Section 14.2.1. | |||
| it can also include its own PATH_CHALLENGE frame with a PATH_RESPONSE | An endpoint can also include its own PATH_CHALLENGE frame when | |||
| frame. | sending a PATH_RESPONSE frame. | |||
| An endpoint uses a new connection ID for probes sent from a new local | An endpoint uses a new connection ID for probes sent from a new local | |||
| address; see Section 9.5. When probing a new path, an endpoint can | address; see Section 9.5. When probing a new path, an endpoint can | |||
| ensure that its peer has an unused connection ID available for | ensure that its peer has an unused connection ID available for | |||
| responses. Sending NEW_CONNECTION_ID and PATH_CHALLENGE frames in | responses. Sending NEW_CONNECTION_ID and PATH_CHALLENGE frames in | |||
| the same packet, if the peer's active_connection_id_limit permits, | the same packet, if the peer's active_connection_id_limit permits, | |||
| ensures that an unused connection ID will be available to the peer | ensures that an unused connection ID will be available to the peer | |||
| when sending a response. | when sending a response. | |||
| An endpoint can choose to simultaneously probe multiple paths. The | An endpoint can choose to simultaneously probe multiple paths. The | |||
| skipping to change at page 56, line 39 ¶ | skipping to change at page 55, line 41 ¶ | |||
| 8.2.2. Path Validation Responses | 8.2.2. Path Validation Responses | |||
| On receiving a PATH_CHALLENGE frame, an endpoint MUST respond by | On receiving a PATH_CHALLENGE frame, an endpoint MUST respond by | |||
| echoing the data contained in the PATH_CHALLENGE frame in a | echoing the data contained in the PATH_CHALLENGE frame in a | |||
| PATH_RESPONSE frame. An endpoint MUST NOT delay transmission of a | PATH_RESPONSE frame. An endpoint MUST NOT delay transmission of a | |||
| packet containing a PATH_RESPONSE frame unless constrained by | packet containing a PATH_RESPONSE frame unless constrained by | |||
| congestion control. | congestion control. | |||
| A PATH_RESPONSE frame MUST be sent on the network path where the | A PATH_RESPONSE frame MUST be sent on the network path where the | |||
| PATH_CHALLENGE was received. This ensures that path validation by a | PATH_CHALLENGE frame was received. This ensures that path validation | |||
| peer only succeeds if the path is functional in both directions. | by a peer only succeeds if the path is functional in both directions. | |||
| This requirement MUST NOT be enforced by the endpoint that initiates | This requirement MUST NOT be enforced by the endpoint that initiates | |||
| path validation as that would enable an attack on migration; see | path validation, as that would enable an attack on migration; see | |||
| Section 9.3.3. | Section 9.3.3. | |||
| An endpoint MUST expand datagrams that contain a PATH_RESPONSE frame | An endpoint MUST expand datagrams that contain a PATH_RESPONSE frame | |||
| to at least the smallest allowed maximum datagram size of 1200 bytes. | to at least the smallest allowed maximum datagram size of 1200 bytes. | |||
| This verifies that the path is able to carry datagrams of this size | This verifies that the path is able to carry datagrams of this size | |||
| in both directions. However, an endpoint MUST NOT expand the | in both directions. However, an endpoint MUST NOT expand the | |||
| datagram containing the PATH_RESPONSE if the resulting data exceeds | datagram containing the PATH_RESPONSE if the resulting data exceeds | |||
| the anti-amplification limit. This is expected to only occur if the | the anti-amplification limit. This is expected to only occur if the | |||
| received PATH_CHALLENGE was not sent in an expanded datagram. | received PATH_CHALLENGE was not sent in an expanded datagram. | |||
| skipping to change at page 57, line 18 ¶ | skipping to change at page 56, line 20 ¶ | |||
| additional PATH_RESPONSE frames. | additional PATH_RESPONSE frames. | |||
| 8.2.3. Successful Path Validation | 8.2.3. Successful Path Validation | |||
| Path validation succeeds when a PATH_RESPONSE frame is received that | Path validation succeeds when a PATH_RESPONSE frame is received that | |||
| contains the data that was sent in a previous PATH_CHALLENGE frame. | contains the data that was sent in a previous PATH_CHALLENGE frame. | |||
| A PATH_RESPONSE frame received on any network path validates the path | A PATH_RESPONSE frame received on any network path validates the path | |||
| on which the PATH_CHALLENGE was sent. | on which the PATH_CHALLENGE was sent. | |||
| If an endpoint sends a PATH_CHALLENGE frame in a datagram that is not | If an endpoint sends a PATH_CHALLENGE frame in a datagram that is not | |||
| expanded to at least 1200 bytes, and if the response to it validates | expanded to at least 1200 bytes and if the response to it validates | |||
| the peer address, the path is validated but not the path MTU. As a | the peer address, the path is validated but not the path MTU. As a | |||
| result, the endpoint can now send more than three times the amount of | result, the endpoint can now send more than three times the amount of | |||
| data that has been received. However, the endpoint MUST initiate | data that has been received. However, the endpoint MUST initiate | |||
| another path validation with an expanded datagram to verify that the | another path validation with an expanded datagram to verify that the | |||
| path supports the required MTU. | path supports the required MTU. | |||
| Receipt of an acknowledgment for a packet containing a PATH_CHALLENGE | Receipt of an acknowledgment for a packet containing a PATH_CHALLENGE | |||
| frame is not adequate validation, since the acknowledgment can be | frame is not adequate validation, since the acknowledgment can be | |||
| spoofed by a malicious peer. | spoofed by a malicious peer. | |||
| 8.2.4. Failed Path Validation | 8.2.4. Failed Path Validation | |||
| Path validation only fails when the endpoint attempting to validate | Path validation only fails when the endpoint attempting to validate | |||
| the path abandons its attempt to validate the path. | the path abandons its attempt to validate the path. | |||
| Endpoints SHOULD abandon path validation based on a timer. When | Endpoints SHOULD abandon path validation based on a timer. When | |||
| setting this timer, implementations are cautioned that the new path | setting this timer, implementations are cautioned that the new path | |||
| could have a longer round-trip time than the original. A value of | could have a longer round-trip time than the original. A value of | |||
| three times the larger of the current Probe Timeout (PTO) or the PTO | three times the larger of the current PTO or the PTO for the new path | |||
| for the new path (that is, using kInitialRtt as defined in | (using kInitialRtt, as defined in [QUIC-RECOVERY]) is RECOMMENDED. | |||
| [QUIC-RECOVERY]) is RECOMMENDED. | ||||
| This timeout allows for multiple PTOs to expire prior to failing path | This timeout allows for multiple PTOs to expire prior to failing path | |||
| validation, so that loss of a single PATH_CHALLENGE or PATH_RESPONSE | validation, so that loss of a single PATH_CHALLENGE or PATH_RESPONSE | |||
| frame does not cause path validation failure. | frame does not cause path validation failure. | |||
| Note that the endpoint might receive packets containing other frames | Note that the endpoint might receive packets containing other frames | |||
| on the new path, but a PATH_RESPONSE frame with appropriate data is | on the new path, but a PATH_RESPONSE frame with appropriate data is | |||
| required for path validation to succeed. | required for path validation to succeed. | |||
| When an endpoint abandons path validation, it determines that the | When an endpoint abandons path validation, it determines that the | |||
| path is unusable. This does not necessarily imply a failure of the | path is unusable. This does not necessarily imply a failure of the | |||
| connection - endpoints can continue sending packets over other paths | connection -- endpoints can continue sending packets over other paths | |||
| as appropriate. If no paths are available, an endpoint can wait for | as appropriate. If no paths are available, an endpoint can wait for | |||
| a new path to become available or close the connection. An endpoint | a new path to become available or close the connection. An endpoint | |||
| that has no valid network path to its peer MAY signal this using the | that has no valid network path to its peer MAY signal this using the | |||
| NO_VIABLE_PATH connection error, noting that this is only possible if | NO_VIABLE_PATH connection error, noting that this is only possible if | |||
| the network path exists but does not support the required MTU | the network path exists but does not support the required MTU | |||
| (Section 14). | (Section 14). | |||
| A path validation might be abandoned for other reasons besides | A path validation might be abandoned for other reasons besides | |||
| failure. Primarily, this happens if a connection migration to a new | failure. Primarily, this happens if a connection migration to a new | |||
| path is initiated while a path validation on the old path is in | path is initiated while a path validation on the old path is in | |||
| skipping to change at page 58, line 25 ¶ | skipping to change at page 57, line 27 ¶ | |||
| 9. Connection Migration | 9. Connection Migration | |||
| The use of a connection ID allows connections to survive changes to | The use of a connection ID allows connections to survive changes to | |||
| endpoint addresses (IP address and port), such as those caused by an | endpoint addresses (IP address and port), such as those caused by an | |||
| endpoint migrating to a new network. This section describes the | endpoint migrating to a new network. This section describes the | |||
| process by which an endpoint migrates to a new address. | process by which an endpoint migrates to a new address. | |||
| The design of QUIC relies on endpoints retaining a stable address for | The design of QUIC relies on endpoints retaining a stable address for | |||
| the duration of the handshake. An endpoint MUST NOT initiate | the duration of the handshake. An endpoint MUST NOT initiate | |||
| connection migration before the handshake is confirmed, as defined in | connection migration before the handshake is confirmed, as defined in | |||
| section 4.1.2 of [QUIC-TLS]. | Section 4.1.2 of [QUIC-TLS]. | |||
| If the peer sent the disable_active_migration transport parameter, an | If the peer sent the disable_active_migration transport parameter, an | |||
| endpoint also MUST NOT send packets (including probing packets; see | endpoint also MUST NOT send packets (including probing packets; see | |||
| Section 9.1) from a different local address to the address the peer | Section 9.1) from a different local address to the address the peer | |||
| used during the handshake, unless the endpoint has acted on a | used during the handshake, unless the endpoint has acted on a | |||
| preferred_address transport parameter from the peer. If the peer | preferred_address transport parameter from the peer. If the peer | |||
| violates this requirement, the endpoint MUST either drop the incoming | violates this requirement, the endpoint MUST either drop the incoming | |||
| packets on that path without generating a stateless reset or proceed | packets on that path without generating a Stateless Reset or proceed | |||
| with path validation and allow the peer to migrate. Generating a | with path validation and allow the peer to migrate. Generating a | |||
| stateless reset or closing the connection would allow third parties | Stateless Reset or closing the connection would allow third parties | |||
| in the network to cause connections to close by spoofing or otherwise | in the network to cause connections to close by spoofing or otherwise | |||
| manipulating observed traffic. | manipulating observed traffic. | |||
| Not all changes of peer address are intentional, or active, | Not all changes of peer address are intentional, or active, | |||
| migrations. The peer could experience NAT rebinding: a change of | migrations. The peer could experience NAT rebinding: a change of | |||
| address due to a middlebox, usually a NAT, allocating a new outgoing | address due to a middlebox, usually a NAT, allocating a new outgoing | |||
| port or even a new outgoing IP address for a flow. An endpoint MUST | port or even a new outgoing IP address for a flow. An endpoint MUST | |||
| perform path validation (Section 8.2) if it detects any change to a | perform path validation (Section 8.2) if it detects any change to a | |||
| peer's address, unless it has previously validated that address. | peer's address, unless it has previously validated that address. | |||
| skipping to change at page 59, line 35 ¶ | skipping to change at page 58, line 35 ¶ | |||
| packet containing any other frame is a "non-probing packet". | packet containing any other frame is a "non-probing packet". | |||
| 9.2. Initiating Connection Migration | 9.2. Initiating Connection Migration | |||
| An endpoint can migrate a connection to a new local address by | An endpoint can migrate a connection to a new local address by | |||
| sending packets containing non-probing frames from that address. | sending packets containing non-probing frames from that address. | |||
| Each endpoint validates its peer's address during connection | Each endpoint validates its peer's address during connection | |||
| establishment. Therefore, a migrating endpoint can send to its peer | establishment. Therefore, a migrating endpoint can send to its peer | |||
| knowing that the peer is willing to receive at the peer's current | knowing that the peer is willing to receive at the peer's current | |||
| address. Thus an endpoint can migrate to a new local address without | address. Thus, an endpoint can migrate to a new local address | |||
| first validating the peer's address. | without first validating the peer's address. | |||
| To establish reachability on the new path, an endpoint initiates path | To establish reachability on the new path, an endpoint initiates path | |||
| validation (Section 8.2) on the new path. An endpoint MAY defer path | validation (Section 8.2) on the new path. An endpoint MAY defer path | |||
| validation until after a peer sends the next non-probing frame to its | validation until after a peer sends the next non-probing frame to its | |||
| new address. | new address. | |||
| When migrating, the new path might not support the endpoint's current | When migrating, the new path might not support the endpoint's current | |||
| sending rate. Therefore, the endpoint resets its congestion | sending rate. Therefore, the endpoint resets its congestion | |||
| controller and RTT estimate, as described in Section 9.4. | controller and RTT estimate, as described in Section 9.4. | |||
| skipping to change at page 60, line 13 ¶ | skipping to change at page 59, line 13 ¶ | |||
| endpoint validates ECN capability as described in Section 13.4. | endpoint validates ECN capability as described in Section 13.4. | |||
| 9.3. Responding to Connection Migration | 9.3. Responding to Connection Migration | |||
| Receiving a packet from a new peer address containing a non-probing | Receiving a packet from a new peer address containing a non-probing | |||
| frame indicates that the peer has migrated to that address. | frame indicates that the peer has migrated to that address. | |||
| If the recipient permits the migration, it MUST send subsequent | If the recipient permits the migration, it MUST send subsequent | |||
| packets to the new peer address and MUST initiate path validation | packets to the new peer address and MUST initiate path validation | |||
| (Section 8.2) to verify the peer's ownership of the address if | (Section 8.2) to verify the peer's ownership of the address if | |||
| validation is not already underway. | validation is not already underway. If the recipient has no unused | |||
| connection IDs from the peer, it will not be able to send anything on | ||||
| the new path until the peer provides one; see Section 9.5. | ||||
| An endpoint only changes the address to which it sends packets in | An endpoint only changes the address to which it sends packets in | |||
| response to the highest-numbered non-probing packet. This ensures | response to the highest-numbered non-probing packet. This ensures | |||
| that an endpoint does not send packets to an old peer address in the | that an endpoint does not send packets to an old peer address in the | |||
| case that it receives reordered packets. | case that it receives reordered packets. | |||
| An endpoint MAY send data to an unvalidated peer address, but it MUST | An endpoint MAY send data to an unvalidated peer address, but it MUST | |||
| protect against potential attacks as described in Section 9.3.1 and | protect against potential attacks as described in Sections 9.3.1 and | |||
| Section 9.3.2. An endpoint MAY skip validation of a peer address if | 9.3.2. An endpoint MAY skip validation of a peer address if that | |||
| that address has been seen recently. In particular, if an endpoint | address has been seen recently. In particular, if an endpoint | |||
| returns to a previously-validated path after detecting some form of | returns to a previously validated path after detecting some form of | |||
| spurious migration, skipping address validation and restoring loss | spurious migration, skipping address validation and restoring loss | |||
| detection and congestion state can reduce the performance impact of | detection and congestion state can reduce the performance impact of | |||
| the attack. | the attack. | |||
| After changing the address to which it sends non-probing packets, an | After changing the address to which it sends non-probing packets, an | |||
| endpoint can abandon any path validation for other addresses. | endpoint can abandon any path validation for other addresses. | |||
| Receiving a packet from a new peer address could be the result of a | Receiving a packet from a new peer address could be the result of a | |||
| NAT rebinding at the peer. | NAT rebinding at the peer. | |||
| skipping to change at page 60, line 50 ¶ | skipping to change at page 60, line 4 ¶ | |||
| It is possible that a peer is spoofing its source address to cause an | It is possible that a peer is spoofing its source address to cause an | |||
| endpoint to send excessive amounts of data to an unwilling host. If | endpoint to send excessive amounts of data to an unwilling host. If | |||
| the endpoint sends significantly more data than the spoofing peer, | the endpoint sends significantly more data than the spoofing peer, | |||
| connection migration might be used to amplify the volume of data that | connection migration might be used to amplify the volume of data that | |||
| an attacker can generate toward a victim. | an attacker can generate toward a victim. | |||
| As described in Section 9.3, an endpoint is required to validate a | As described in Section 9.3, an endpoint is required to validate a | |||
| peer's new address to confirm the peer's possession of the new | peer's new address to confirm the peer's possession of the new | |||
| address. Until a peer's address is deemed valid, an endpoint limits | address. Until a peer's address is deemed valid, an endpoint limits | |||
| the amount of data it sends to that address; see Section 8. In the | the amount of data it sends to that address; see Section 8. In the | |||
| absence of this limit, an endpoint risks being used for a denial of | absence of this limit, an endpoint risks being used for a denial-of- | |||
| service attack against an unsuspecting victim. | service attack against an unsuspecting victim. | |||
| If an endpoint skips validation of a peer address as described above, | If an endpoint skips validation of a peer address as described above, | |||
| it does not need to limit its sending rate. | it does not need to limit its sending rate. | |||
| 9.3.2. On-Path Address Spoofing | 9.3.2. On-Path Address Spoofing | |||
| An on-path attacker could cause a spurious connection migration by | An on-path attacker could cause a spurious connection migration by | |||
| copying and forwarding a packet with a spoofed address such that it | copying and forwarding a packet with a spoofed address such that it | |||
| arrives before the original packet. The packet with the spoofed | arrives before the original packet. The packet with the spoofed | |||
| skipping to change at page 61, line 32 ¶ | skipping to change at page 60, line 34 ¶ | |||
| address when validation of a new peer address fails. Additionally, | address when validation of a new peer address fails. Additionally, | |||
| receipt of packets with higher packet numbers from the legitimate | receipt of packets with higher packet numbers from the legitimate | |||
| peer address will trigger another connection migration. This will | peer address will trigger another connection migration. This will | |||
| cause the validation of the address of the spurious migration to be | cause the validation of the address of the spurious migration to be | |||
| abandoned, thus containing migrations initiated by the attacker | abandoned, thus containing migrations initiated by the attacker | |||
| injecting a single packet. | injecting a single packet. | |||
| If an endpoint has no state about the last validated peer address, it | If an endpoint has no state about the last validated peer address, it | |||
| MUST close the connection silently by discarding all connection | MUST close the connection silently by discarding all connection | |||
| state. This results in new packets on the connection being handled | state. This results in new packets on the connection being handled | |||
| generically. For instance, an endpoint MAY send a stateless reset in | generically. For instance, an endpoint MAY send a Stateless Reset in | |||
| response to any further incoming packets. | response to any further incoming packets. | |||
| 9.3.3. Off-Path Packet Forwarding | 9.3.3. Off-Path Packet Forwarding | |||
| An off-path attacker that can observe packets might forward copies of | An off-path attacker that can observe packets might forward copies of | |||
| genuine packets to endpoints. If the copied packet arrives before | genuine packets to endpoints. If the copied packet arrives before | |||
| the genuine packet, this will appear as a NAT rebinding. Any genuine | the genuine packet, this will appear as a NAT rebinding. Any genuine | |||
| packet will be discarded as a duplicate. If the attacker is able to | packet will be discarded as a duplicate. If the attacker is able to | |||
| continue forwarding packets, it might be able to cause migration to a | continue forwarding packets, it might be able to cause migration to a | |||
| path via the attacker. This places the attacker on path, giving it | path via the attacker. This places the attacker on-path, giving it | |||
| the ability to observe or drop all subsequent packets. | the ability to observe or drop all subsequent packets. | |||
| This style of attack relies on the attacker using a path that has | This style of attack relies on the attacker using a path that has | |||
| approximately the same characteristics as the direct path between | approximately the same characteristics as the direct path between | |||
| endpoints. The attack is more reliable if relatively few packets are | endpoints. The attack is more reliable if relatively few packets are | |||
| sent or if packet loss coincides with the attempted attack. | sent or if packet loss coincides with the attempted attack. | |||
| A non-probing packet received on the original path that increases the | A non-probing packet received on the original path that increases the | |||
| maximum received packet number will cause the endpoint to move back | maximum received packet number will cause the endpoint to move back | |||
| to that path. Eliciting packets on this path increases the | to that path. Eliciting packets on this path increases the | |||
| likelihood that the attack is unsuccessful. Therefore, mitigation of | likelihood that the attack is unsuccessful. Therefore, mitigation of | |||
| this attack relies on triggering the exchange of packets. | this attack relies on triggering the exchange of packets. | |||
| In response to an apparent migration, endpoints MUST validate the | In response to an apparent migration, endpoints MUST validate the | |||
| previously active path using a PATH_CHALLENGE frame. This induces | previously active path using a PATH_CHALLENGE frame. This induces | |||
| the sending of new packets on that path. If the path is no longer | the sending of new packets on that path. If the path is no longer | |||
| viable, the validation attempt will time out and fail; if the path is | viable, the validation attempt will time out and fail; if the path is | |||
| viable, but no longer desired, the validation will succeed, but only | viable but no longer desired, the validation will succeed but only | |||
| results in probing packets being sent on the path. | results in probing packets being sent on the path. | |||
| An endpoint that receives a PATH_CHALLENGE on an active path SHOULD | An endpoint that receives a PATH_CHALLENGE on an active path SHOULD | |||
| send a non-probing packet in response. If the non-probing packet | send a non-probing packet in response. If the non-probing packet | |||
| arrives before any copy made by an attacker, this results in the | arrives before any copy made by an attacker, this results in the | |||
| connection being migrated back to the original path. Any subsequent | connection being migrated back to the original path. Any subsequent | |||
| migration to another path restarts this entire process. | migration to another path restarts this entire process. | |||
| This defense is imperfect, but this is not considered a serious | This defense is imperfect, but this is not considered a serious | |||
| problem. If the path via the attack is reliably faster than the | problem. If the path via the attack is reliably faster than the | |||
| original path despite multiple attempts to use that original path, it | original path despite multiple attempts to use that original path, it | |||
| is not possible to distinguish between attack and an improvement in | is not possible to distinguish between an attack and an improvement | |||
| routing. | in routing. | |||
| An endpoint could also use heuristics to improve detection of this | An endpoint could also use heuristics to improve detection of this | |||
| style of attack. For instance, NAT rebinding is improbable if | style of attack. For instance, NAT rebinding is improbable if | |||
| packets were recently received on the old path; similarly, rebinding | packets were recently received on the old path; similarly, rebinding | |||
| is rare on IPv6 paths. Endpoints can also look for duplicated | is rare on IPv6 paths. Endpoints can also look for duplicated | |||
| packets. Conversely, a change in connection ID is more likely to | packets. Conversely, a change in connection ID is more likely to | |||
| indicate an intentional migration rather than an attack. | indicate an intentional migration rather than an attack. | |||
| 9.4. Loss Detection and Congestion Control | 9.4. Loss Detection and Congestion Control | |||
| The capacity available on the new path might not be the same as the | The capacity available on the new path might not be the same as the | |||
| old path. Packets sent on the old path MUST NOT contribute to | old path. Packets sent on the old path MUST NOT contribute to | |||
| congestion control or RTT estimation for the new path. | congestion control or RTT estimation for the new path. | |||
| On confirming a peer's ownership of its new address, an endpoint MUST | On confirming a peer's ownership of its new address, an endpoint MUST | |||
| immediately reset the congestion controller and round-trip time | immediately reset the congestion controller and round-trip time | |||
| estimator for the new path to initial values (see Appendices A.3 and | estimator for the new path to initial values (see Appendices A.3 and | |||
| B.3 in [QUIC-RECOVERY]) unless the only change in the peer's address | B.3 of [QUIC-RECOVERY]) unless the only change in the peer's address | |||
| is its port number. Because port-only changes are commonly the | is its port number. Because port-only changes are commonly the | |||
| result of NAT rebinding or other middlebox activity, the endpoint MAY | result of NAT rebinding or other middlebox activity, the endpoint MAY | |||
| instead retain its congestion control state and round-trip estimate | instead retain its congestion control state and round-trip estimate | |||
| in those cases instead of reverting to initial values. In cases | in those cases instead of reverting to initial values. In cases | |||
| where congestion control state retained from an old path is used on a | where congestion control state retained from an old path is used on a | |||
| new path with substantially different characteristics, a sender could | new path with substantially different characteristics, a sender could | |||
| transmit too aggressively until the congestion controller and the RTT | transmit too aggressively until the congestion controller and the RTT | |||
| estimator have adapted. Generally, implementations are advised to be | estimator have adapted. Generally, implementations are advised to be | |||
| cautious when using previous values on a new path. | cautious when using previous values on a new path. | |||
| skipping to change at page 63, line 16 ¶ | skipping to change at page 62, line 19 ¶ | |||
| sends data and probes from/to multiple addresses during the migration | sends data and probes from/to multiple addresses during the migration | |||
| period, since the two resulting paths could have different round-trip | period, since the two resulting paths could have different round-trip | |||
| times. A receiver of packets on multiple paths will still send ACK | times. A receiver of packets on multiple paths will still send ACK | |||
| frames covering all received packets. | frames covering all received packets. | |||
| While multiple paths might be used during connection migration, a | While multiple paths might be used during connection migration, a | |||
| single congestion control context and a single loss recovery context | single congestion control context and a single loss recovery context | |||
| (as described in [QUIC-RECOVERY]) could be adequate. For instance, | (as described in [QUIC-RECOVERY]) could be adequate. For instance, | |||
| an endpoint might delay switching to a new congestion control context | an endpoint might delay switching to a new congestion control context | |||
| until it is confirmed that an old path is no longer needed (such as | until it is confirmed that an old path is no longer needed (such as | |||
| the case in Section 9.3.3). | the case described in Section 9.3.3). | |||
| A sender can make exceptions for probe packets so that their loss | A sender can make exceptions for probe packets so that their loss | |||
| detection is independent and does not unduly cause the congestion | detection is independent and does not unduly cause the congestion | |||
| controller to reduce its sending rate. An endpoint might set a | controller to reduce its sending rate. An endpoint might set a | |||
| separate timer when a PATH_CHALLENGE is sent, which is cancelled if | separate timer when a PATH_CHALLENGE is sent, which is canceled if | |||
| the corresponding PATH_RESPONSE is received. If the timer fires | the corresponding PATH_RESPONSE is received. If the timer fires | |||
| before the PATH_RESPONSE is received, the endpoint might send a new | before the PATH_RESPONSE is received, the endpoint might send a new | |||
| PATH_CHALLENGE, and restart the timer for a longer period of time. | PATH_CHALLENGE and restart the timer for a longer period of time. | |||
| This timer SHOULD be set as described in Section 6.2.1 of | This timer SHOULD be set as described in Section 6.2.1 of | |||
| [QUIC-RECOVERY] and MUST NOT be more aggressive. | [QUIC-RECOVERY] and MUST NOT be more aggressive. | |||
| 9.5. Privacy Implications of Connection Migration | 9.5. Privacy Implications of Connection Migration | |||
| Using a stable connection ID on multiple network paths would allow a | Using a stable connection ID on multiple network paths would allow a | |||
| passive observer to correlate activity between those paths. An | passive observer to correlate activity between those paths. An | |||
| endpoint that moves between networks might not wish to have their | endpoint that moves between networks might not wish to have their | |||
| activity correlated by any entity other than their peer, so different | activity correlated by any entity other than their peer, so different | |||
| connection IDs are used when sending from different local addresses, | connection IDs are used when sending from different local addresses, | |||
| as discussed in Section 5.1. For this to be effective, endpoints | as discussed in Section 5.1. For this to be effective, endpoints | |||
| need to ensure that connection IDs they provide cannot be linked by | need to ensure that connection IDs they provide cannot be linked by | |||
| any other entity. | any other entity. | |||
| At any time, endpoints MAY change the Destination Connection ID they | At any time, endpoints MAY change the Destination Connection ID they | |||
| transmit with to a value that has not been used on another path. | transmit with to a value that has not been used on another path. | |||
| An endpoint MUST NOT reuse a connection ID when sending from more | An endpoint MUST NOT reuse a connection ID when sending from more | |||
| than one local address, for example when initiating connection | than one local address -- for example, when initiating connection | |||
| migration as described in Section 9.2 or when probing a new network | migration as described in Section 9.2 or when probing a new network | |||
| path as described in Section 9.1. | path as described in Section 9.1. | |||
| Similarly, an endpoint MUST NOT reuse a connection ID when sending to | Similarly, an endpoint MUST NOT reuse a connection ID when sending to | |||
| more than one destination address. Due to network changes outside | more than one destination address. Due to network changes outside | |||
| the control of its peer, an endpoint might receive packets from a new | the control of its peer, an endpoint might receive packets from a new | |||
| source address with the same destination connection ID, in which case | source address with the same Destination Connection ID field value, | |||
| it MAY continue to use the current connection ID with the new remote | in which case it MAY continue to use the current connection ID with | |||
| address while still sending from the same local address. | the new remote address while still sending from the same local | |||
| address. | ||||
| These requirements regarding connection ID reuse apply only to the | These requirements regarding connection ID reuse apply only to the | |||
| sending of packets, as unintentional changes in path without a change | sending of packets, as unintentional changes in path without a change | |||
| in connection ID are possible. For example, after a period of | in connection ID are possible. For example, after a period of | |||
| network inactivity, NAT rebinding might cause packets to be sent on a | network inactivity, NAT rebinding might cause packets to be sent on a | |||
| new path when the client resumes sending. An endpoint responds to | new path when the client resumes sending. An endpoint responds to | |||
| such an event as described in Section 9.3. | such an event as described in Section 9.3. | |||
| Using different connection IDs for packets sent in both directions on | Using different connection IDs for packets sent in both directions on | |||
| each new network path eliminates the use of the connection ID for | each new network path eliminates the use of the connection ID for | |||
| skipping to change at page 64, line 26 ¶ | skipping to change at page 63, line 31 ¶ | |||
| to correlate activity. This does not prevent other properties of | to correlate activity. This does not prevent other properties of | |||
| packets, such as timing and size, from being used to correlate | packets, such as timing and size, from being used to correlate | |||
| activity. | activity. | |||
| An endpoint SHOULD NOT initiate migration with a peer that has | An endpoint SHOULD NOT initiate migration with a peer that has | |||
| requested a zero-length connection ID, because traffic over the new | requested a zero-length connection ID, because traffic over the new | |||
| path might be trivially linkable to traffic over the old one. If the | path might be trivially linkable to traffic over the old one. If the | |||
| server is able to associate packets with a zero-length connection ID | server is able to associate packets with a zero-length connection ID | |||
| to the right connection, it means that the server is using other | to the right connection, it means that the server is using other | |||
| information to demultiplex packets. For example, a server might | information to demultiplex packets. For example, a server might | |||
| provide a unique address to every client, for instance using HTTP | provide a unique address to every client -- for instance, using HTTP | |||
| alternative services [ALTSVC]. Information that might allow correct | alternative services [ALTSVC]. Information that might allow correct | |||
| routing of packets across multiple network paths will also allow | routing of packets across multiple network paths will also allow | |||
| activity on those paths to be linked by entities other than the peer. | activity on those paths to be linked by entities other than the peer. | |||
| A client might wish to reduce linkability by switching to a new | A client might wish to reduce linkability by switching to a new | |||
| connection ID, source UDP port, or IP address (see [RFC4941]) when | connection ID, source UDP port, or IP address (see [RFC8981]) when | |||
| sending traffic after a period of inactivity. Changing the address | sending traffic after a period of inactivity. Changing the address | |||
| from which it sends packets at the same time might cause the server | from which it sends packets at the same time might cause the server | |||
| to detect a connection migration. This ensures that the mechanisms | to detect a connection migration. This ensures that the mechanisms | |||
| that support migration are exercised even for clients that do not | that support migration are exercised even for clients that do not | |||
| experience NAT rebindings or genuine migrations. Changing address | experience NAT rebindings or genuine migrations. Changing address | |||
| can cause a peer to reset its congestion control state (see | can cause a peer to reset its congestion control state (see | |||
| Section 9.4), so addresses SHOULD only be changed infrequently. | Section 9.4), so addresses SHOULD only be changed infrequently. | |||
| An endpoint that exhausts available connection IDs cannot probe new | An endpoint that exhausts available connection IDs cannot probe new | |||
| paths or initiate migration, nor can it respond to probes or attempts | paths or initiate migration, nor can it respond to probes or attempts | |||
| skipping to change at page 66, line 41 ¶ | skipping to change at page 65, line 43 ¶ | |||
| If path validation of the server's preferred address succeeds, the | If path validation of the server's preferred address succeeds, the | |||
| client MUST abandon validation of the original address and migrate to | client MUST abandon validation of the original address and migrate to | |||
| using the server's preferred address. If path validation of the | using the server's preferred address. If path validation of the | |||
| server's preferred address fails but validation of the server's | server's preferred address fails but validation of the server's | |||
| original address succeeds, the client MAY migrate to its new address | original address succeeds, the client MAY migrate to its new address | |||
| and continue sending to the server's original address. | and continue sending to the server's original address. | |||
| If packets received at the server's preferred address have a | If packets received at the server's preferred address have a | |||
| different source address than observed from the client during the | different source address than observed from the client during the | |||
| handshake, the server MUST protect against potential attacks as | handshake, the server MUST protect against potential attacks as | |||
| described in Section 9.3.1 and Section 9.3.2. In addition to | described in Sections 9.3.1 and 9.3.2. In addition to intentional | |||
| intentional simultaneous migration, this might also occur because the | simultaneous migration, this might also occur because the client's | |||
| client's access network used a different NAT binding for the server's | access network used a different NAT binding for the server's | |||
| preferred address. | preferred address. | |||
| Servers SHOULD initiate path validation to the client's new address | Servers SHOULD initiate path validation to the client's new address | |||
| upon receiving a probe packet from a different address; see | upon receiving a probe packet from a different address; see | |||
| Section 8. | Section 8. | |||
| A client that migrates to a new address SHOULD use a preferred | A client that migrates to a new address SHOULD use a preferred | |||
| address from the same address family for the server. | address from the same address family for the server. | |||
| The connection ID provided in the preferred_address transport | The connection ID provided in the preferred_address transport | |||
| parameter is not specific to the addresses that are provided. This | parameter is not specific to the addresses that are provided. This | |||
| connection ID is provided to ensure that the client has a connection | connection ID is provided to ensure that the client has a connection | |||
| ID available for migration, but the client MAY use this connection ID | ID available for migration, but the client MAY use this connection ID | |||
| on any path. | on any path. | |||
| 9.7. Use of IPv6 Flow-Label and Migration | 9.7. Use of IPv6 Flow Label and Migration | |||
| Endpoints that send data using IPv6 SHOULD apply an IPv6 flow label | Endpoints that send data using IPv6 SHOULD apply an IPv6 flow label | |||
| in compliance with [RFC6437], unless the local API does not allow | in compliance with [RFC6437], unless the local API does not allow | |||
| setting IPv6 flow labels. | setting IPv6 flow labels. | |||
| The flow label generation MUST be designed to minimize the chances of | The flow label generation MUST be designed to minimize the chances of | |||
| linkability with a previously used flow label, as a stable flow label | linkability with a previously used flow label, as a stable flow label | |||
| would enable correlating activity on multiple paths; see Section 9.5. | would enable correlating activity on multiple paths; see Section 9.5. | |||
| [RFC6437] suggests deriving values using a pseudorandom function to | [RFC6437] suggests deriving values using a pseudorandom function to | |||
| skipping to change at page 67, line 45 ¶ | skipping to change at page 66, line 48 ¶ | |||
| o immediate close (Section 10.2) | o immediate close (Section 10.2) | |||
| o stateless reset (Section 10.3) | o stateless reset (Section 10.3) | |||
| An endpoint MAY discard connection state if it does not have a | An endpoint MAY discard connection state if it does not have a | |||
| validated path on which it can send packets; see Section 8.2. | validated path on which it can send packets; see Section 8.2. | |||
| 10.1. Idle Timeout | 10.1. Idle Timeout | |||
| If a max_idle_timeout is specified by either peer in its transport | If a max_idle_timeout is specified by either endpoint in its | |||
| parameters (Section 18.2), the connection is silently closed and its | transport parameters (Section 18.2), the connection is silently | |||
| state is discarded when it remains idle for longer than the minimum | closed and its state is discarded when it remains idle for longer | |||
| of both peers max_idle_timeout values. | than the minimum of the max_idle_timeout value advertised by both | |||
| endpoints. | ||||
| Each endpoint advertises a max_idle_timeout, but the effective value | Each endpoint advertises a max_idle_timeout, but the effective value | |||
| at an endpoint is computed as the minimum of the two advertised | at an endpoint is computed as the minimum of the two advertised | |||
| values (or the sole advertised value, if only one endpoint advertises | values (or the sole advertised value, if only one endpoint advertises | |||
| a nonzero value). By announcing a max_idle_timeout, an endpoint | a non-zero value). By announcing a max_idle_timeout, an endpoint | |||
| commits to initiating an immediate close (Section 10.2) if it | commits to initiating an immediate close (Section 10.2) if it | |||
| abandons the connection prior to the effective value. | abandons the connection prior to the effective value. | |||
| An endpoint restarts its idle timer when a packet from its peer is | An endpoint restarts its idle timer when a packet from its peer is | |||
| received and processed successfully. An endpoint also restarts its | received and processed successfully. An endpoint also restarts its | |||
| idle timer when sending an ack-eliciting packet if no other ack- | idle timer when sending an ack-eliciting packet if no other ack- | |||
| eliciting packets have been sent since last receiving and processing | eliciting packets have been sent since last receiving and processing | |||
| a packet. Restarting this timer when sending a packet ensures that | a packet. Restarting this timer when sending a packet ensures that | |||
| connections are not closed after new activity is initiated. | connections are not closed after new activity is initiated. | |||
| skipping to change at page 68, line 36 ¶ | skipping to change at page 67, line 40 ¶ | |||
| An endpoint can send a PING or another ack-eliciting frame to test | An endpoint can send a PING or another ack-eliciting frame to test | |||
| the connection for liveness if the peer could time out soon, such as | the connection for liveness if the peer could time out soon, such as | |||
| within a PTO; see Section 6.2 of [QUIC-RECOVERY]. This is especially | within a PTO; see Section 6.2 of [QUIC-RECOVERY]. This is especially | |||
| useful if any available application data cannot be safely retried. | useful if any available application data cannot be safely retried. | |||
| Note that the application determines what data is safe to retry. | Note that the application determines what data is safe to retry. | |||
| 10.1.2. Deferring Idle Timeout | 10.1.2. Deferring Idle Timeout | |||
| An endpoint might need to send ack-eliciting packets to avoid an idle | An endpoint might need to send ack-eliciting packets to avoid an idle | |||
| timeout if it is expecting response data, but does not have or is | timeout if it is expecting response data but does not have or is | |||
| unable to send application data. | unable to send application data. | |||
| An implementation of QUIC might provide applications with an option | An implementation of QUIC might provide applications with an option | |||
| to defer an idle timeout. This facility could be used when the | to defer an idle timeout. This facility could be used when the | |||
| application wishes to avoid losing state that has been associated | application wishes to avoid losing state that has been associated | |||
| with an open connection, but does not expect to exchange application | with an open connection but does not expect to exchange application | |||
| data for some time. With this option, an endpoint could send a PING | data for some time. With this option, an endpoint could send a PING | |||
| frame (Section 19.2) periodically, which will cause the peer to | frame (Section 19.2) periodically, which will cause the peer to | |||
| restart its idle timeout period. Sending a packet containing a PING | restart its idle timeout period. Sending a packet containing a PING | |||
| frame restarts the idle timeout for this endpoint also if this is the | frame restarts the idle timeout for this endpoint also if this is the | |||
| first ack-eliciting packet sent since receiving a packet. Sending a | first ack-eliciting packet sent since receiving a packet. Sending a | |||
| PING frame causes the peer to respond with an acknowledgment, which | PING frame causes the peer to respond with an acknowledgment, which | |||
| also restarts the idle timeout for the endpoint. | also restarts the idle timeout for the endpoint. | |||
| Application protocols that use QUIC SHOULD provide guidance on when | Application protocols that use QUIC SHOULD provide guidance on when | |||
| deferring an idle timeout is appropriate. Unnecessary sending of | deferring an idle timeout is appropriate. Unnecessary sending of | |||
| PING frames could have a detrimental effect on performance. | PING frames could have a detrimental effect on 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 negotiated using the max_idle_timeout | period longer than the time negotiated using the max_idle_timeout | |||
| transport parameter; see Section 10. However, state in middleboxes | transport parameter; see Section 10. However, state in middleboxes | |||
| might time out earlier than that. Though REQ-5 in [RFC4787] | might time out earlier than that. Though REQ-5 in [RFC4787] | |||
| recommends a 2 minute timeout interval, experience shows that sending | recommends a 2-minute timeout interval, experience shows that sending | |||
| packets every 30 seconds is necessary to prevent the majority of | packets every 30 seconds is necessary to prevent the majority of | |||
| middleboxes from losing state for UDP flows [GATEWAY]. | middleboxes from losing state for UDP flows [GATEWAY]. | |||
| 10.2. Immediate Close | 10.2. Immediate Close | |||
| An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) to | An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) to | |||
| terminate the connection immediately. A CONNECTION_CLOSE frame | terminate the connection immediately. A CONNECTION_CLOSE frame | |||
| causes all streams to immediately become closed; open streams can be | causes all streams to immediately become closed; open streams can be | |||
| assumed to be implicitly reset. | assumed to be implicitly reset. | |||
| skipping to change at page 69, line 44 ¶ | skipping to change at page 68, line 46 ¶ | |||
| can exchange messages that are needed for both application endpoints | can exchange messages that are needed for both application endpoints | |||
| to agree that the connection can be closed, after which the | to agree that the connection can be closed, after which the | |||
| application requests that QUIC close the connection. When QUIC | application requests that QUIC close the connection. When QUIC | |||
| consequently closes the connection, a CONNECTION_CLOSE frame with an | consequently closes the connection, a CONNECTION_CLOSE frame with an | |||
| application-supplied error code will be used to signal closure to the | application-supplied error code will be used to signal closure to the | |||
| peer. | peer. | |||
| 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 at least three | properly discarded. These states SHOULD persist for at least three | |||
| times the current Probe Timeout (PTO) interval as defined in | times the current PTO interval as defined in [QUIC-RECOVERY]. | |||
| [QUIC-RECOVERY]. | ||||
| Disposing of connection state prior to exiting the closing or | Disposing of connection state prior to exiting the closing or | |||
| draining state could result in an endpoint generating a stateless | draining state could result in an endpoint generating a Stateless | |||
| reset unnecessarily when it receives a late-arriving packet. | Reset unnecessarily when it receives a late-arriving packet. | |||
| Endpoints that have some alternative means to ensure that late- | Endpoints that have some alternative means to ensure that late- | |||
| arriving packets do not induce a response, such as those that are | arriving packets do not induce a response, such as those that are | |||
| able to close the UDP socket, MAY end these states earlier to allow | able to close the UDP socket, MAY end these states earlier to allow | |||
| for faster resource recovery. Servers that retain an open socket for | for faster resource recovery. Servers that retain an open socket for | |||
| accepting new connections SHOULD NOT end the closing or draining | accepting new connections SHOULD NOT end the closing or draining | |||
| states early. | state early. | |||
| Once its closing or draining state ends, an endpoint SHOULD discard | Once its closing or draining state ends, an endpoint SHOULD discard | |||
| all connection state. The endpoint MAY send a stateless reset in | all connection state. The endpoint MAY send a Stateless Reset in | |||
| response to any further incoming packets belonging to this | response to any further incoming packets belonging to this | |||
| connection. | connection. | |||
| 10.2.1. Closing Connection State | 10.2.1. Closing Connection State | |||
| An endpoint enters the closing state after initiating an immediate | An endpoint enters the closing state after initiating an immediate | |||
| close. | close. | |||
| In the closing state, an endpoint retains only enough information to | In the closing state, an endpoint retains only enough information to | |||
| generate a packet containing a CONNECTION_CLOSE frame and to identify | generate a packet containing a CONNECTION_CLOSE frame and to identify | |||
| skipping to change at page 70, line 47 ¶ | skipping to change at page 69, line 49 ¶ | |||
| state and send a packet containing a CONNECTION_CLOSE frame in | state and send a packet containing a CONNECTION_CLOSE frame in | |||
| response to any UDP datagram that is received. However, an endpoint | response to any UDP datagram that is received. However, an endpoint | |||
| that discards packet protection keys cannot identify and discard | that discards packet protection keys cannot identify and discard | |||
| invalid packets. To avoid being used for an amplification attack, | invalid packets. To avoid being used for an amplification attack, | |||
| such endpoints MUST limit the cumulative size of packets it sends to | such endpoints MUST limit the cumulative size of packets it sends to | |||
| three times the cumulative size of the packets that are received and | three times the cumulative size of the packets that are received and | |||
| attributed to the connection. To minimize the state that an endpoint | attributed to the connection. To minimize the state that an endpoint | |||
| maintains for a closing connection, endpoints MAY send the exact same | maintains for a closing connection, endpoints MAY send the exact same | |||
| packet in response to any received packet. | packet in response to any received packet. | |||
| Note: Allowing retransmission of a closing packet is an exception to | Note: Allowing retransmission of a closing packet is an exception | |||
| the requirement that a new packet number be used for each packet | to the requirement that a new packet number be used for each | |||
| in Section 12.3. Sending new packet numbers is primarily of | packet; see Section 12.3. Sending new packet numbers is primarily | |||
| advantage to loss recovery and congestion control, which are not | of advantage to loss recovery and congestion control, which are | |||
| expected to be relevant for a closed connection. Retransmitting | not expected to be relevant for a closed connection. | |||
| the final packet requires less state. | Retransmitting the final packet requires less state. | |||
| While in the closing state, an endpoint could receive packets from a | While in the closing state, an endpoint could receive packets from a | |||
| new source address, possibly indicating a connection migration; see | new source address, possibly indicating a connection migration; see | |||
| Section 9. An endpoint in the closing state MUST either discard | Section 9. An endpoint in the closing state MUST either discard | |||
| packets received from an unvalidated address or limit the cumulative | packets received from an unvalidated address or limit the cumulative | |||
| size of packets it sends to an unvalidated address to three times the | size of packets it sends to an unvalidated address to three times the | |||
| size of packets it receives from that address. | size of packets it receives from that address. | |||
| 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 | |||
| (Section 6 of [QUIC-TLS]). A key update might prevent the endpoint | (Section 6 of [QUIC-TLS]). A key update might prevent the endpoint | |||
| skipping to change at page 71, line 40 ¶ | skipping to change at page 70, line 41 ¶ | |||
| packet containing a CONNECTION_CLOSE frame before entering the | packet containing a CONNECTION_CLOSE frame before entering the | |||
| draining state, using a NO_ERROR code if appropriate. An endpoint | draining state, using a NO_ERROR code if appropriate. An endpoint | |||
| MUST NOT send further packets. Doing so could result in a constant | MUST NOT send further packets. Doing so could result in a constant | |||
| exchange of CONNECTION_CLOSE frames until one of the endpoints exits | exchange of CONNECTION_CLOSE frames until one of the endpoints exits | |||
| the closing state. | the closing state. | |||
| An endpoint MAY enter the draining state from the closing state if it | An endpoint MAY enter the draining state from the closing state if it | |||
| receives a CONNECTION_CLOSE frame, which indicates that the peer is | receives a CONNECTION_CLOSE frame, which indicates that the peer is | |||
| also closing or draining. In this case, the draining state ends when | also closing or draining. In this case, the draining state ends when | |||
| the closing state would have ended. In other words, the endpoint | the closing state would have ended. In other words, the endpoint | |||
| uses the same end time, but ceases transmission of any packets on | uses the same end time but ceases transmission of any packets on this | |||
| this connection. | connection. | |||
| 10.2.3. Immediate Close During the Handshake | 10.2.3. Immediate Close during the Handshake | |||
| When sending CONNECTION_CLOSE, the goal is to ensure that the peer | When sending a CONNECTION_CLOSE frame, the goal is to ensure that the | |||
| will process the frame. Generally, this means sending the frame in a | peer will process the frame. Generally, this means sending the frame | |||
| packet with the highest level of packet protection to avoid the | in a packet with the highest level of packet protection to avoid the | |||
| packet being discarded. After the handshake is confirmed (see | packet being discarded. After the handshake is confirmed (see | |||
| Section 4.1.2 of [QUIC-TLS]), an endpoint MUST send any | Section 4.1.2 of [QUIC-TLS]), an endpoint MUST send any | |||
| CONNECTION_CLOSE frames in a 1-RTT packet. However, prior to | CONNECTION_CLOSE frames in a 1-RTT packet. However, prior to | |||
| confirming the handshake, it is possible that more advanced packet | confirming the handshake, it is possible that more advanced packet | |||
| protection keys are not available to the peer, so another | protection keys are not available to the peer, so another | |||
| CONNECTION_CLOSE frame MAY be sent in a packet that uses a lower | CONNECTION_CLOSE frame MAY be sent in a packet that uses a lower | |||
| packet protection level. More specifically: | packet protection level. More specifically: | |||
| o A client will always know whether the server has Handshake keys | o A client will always know whether the server has Handshake keys | |||
| (see Section 17.2.2.1), but it is possible that a server does not | (see Section 17.2.2.1), but it is possible that a server does not | |||
| know whether the client has Handshake keys. Under these | know whether the client has Handshake keys. Under these | |||
| circumstances, a server SHOULD send a CONNECTION_CLOSE frame in | circumstances, a server SHOULD send a CONNECTION_CLOSE frame in | |||
| both Handshake and Initial packets to ensure that at least one of | both Handshake and Initial packets to ensure that at least one of | |||
| them is processable by the client. | them is processable by the client. | |||
| o A client that sends CONNECTION_CLOSE in a 0-RTT packet cannot be | o A client that sends a CONNECTION_CLOSE frame in a 0-RTT packet | |||
| assured that the server has accepted 0-RTT. Sending a | cannot be assured that the server has accepted 0-RTT. Sending a | |||
| CONNECTION_CLOSE frame in an Initial packet makes it more likely | CONNECTION_CLOSE frame in an Initial packet makes it more likely | |||
| that the server can receive the close signal, even if the | that the server can receive the close signal, even if the | |||
| application error code might not be received. | application error code might not be received. | |||
| o Prior to confirming the handshake, a peer might be unable to | o Prior to confirming the handshake, a peer might be unable to | |||
| process 1-RTT packets, so an endpoint SHOULD send CONNECTION_CLOSE | process 1-RTT packets, so an endpoint SHOULD send a | |||
| in both Handshake and 1-RTT packets. A server SHOULD also send | CONNECTION_CLOSE frame in both Handshake and 1-RTT packets. A | |||
| CONNECTION_CLOSE in an Initial packet. | server SHOULD also send a CONNECTION_CLOSE frame in an Initial | |||
| packet. | ||||
| Sending a CONNECTION_CLOSE of type 0x1d in an Initial or Handshake | Sending a CONNECTION_CLOSE of type 0x1d in an Initial or Handshake | |||
| packet could expose application state or be used to alter application | packet could expose application state or be used to alter application | |||
| state. A CONNECTION_CLOSE of type 0x1d MUST be replaced by a | state. A CONNECTION_CLOSE of type 0x1d MUST be replaced by a | |||
| CONNECTION_CLOSE of type 0x1c when sending the frame in Initial or | CONNECTION_CLOSE of type 0x1c when sending the frame in Initial or | |||
| Handshake packets. Otherwise, information about the application | Handshake packets. Otherwise, information about the application | |||
| state might be revealed. Endpoints MUST clear the value of the | state might be revealed. Endpoints MUST clear the value of the | |||
| Reason Phrase field and SHOULD use the APPLICATION_ERROR code when | Reason Phrase field and SHOULD use the APPLICATION_ERROR code when | |||
| converting to a CONNECTION_CLOSE of type 0x1c. | converting to a CONNECTION_CLOSE of type 0x1c. | |||
| skipping to change at page 73, line 14 ¶ | skipping to change at page 72, line 17 ¶ | |||
| state. An endpoint that has no state for the connection does not | state. An endpoint that has no state for the connection does not | |||
| enter a closing or draining period on sending a CONNECTION_CLOSE | enter a closing or draining period on sending a CONNECTION_CLOSE | |||
| frame. | frame. | |||
| 10.3. Stateless Reset | 10.3. Stateless Reset | |||
| A stateless reset is provided as an option of last resort for an | A stateless reset is provided as an option of last resort for an | |||
| endpoint that does not have access to the state of a connection. A | endpoint that does not have access to the state of a connection. A | |||
| crash or outage might result in peers continuing to send data to an | crash or outage might result in peers continuing to send data to an | |||
| endpoint that is unable to properly continue the connection. An | endpoint that is unable to properly continue the connection. An | |||
| endpoint MAY send a stateless reset in response to receiving a packet | endpoint MAY send a Stateless Reset in response to receiving a packet | |||
| that it cannot associate with an active connection. | that it cannot associate with an active connection. | |||
| A stateless reset is not appropriate for indicating errors in active | A stateless reset is not appropriate for indicating errors in active | |||
| connections. An endpoint that wishes to communicate a fatal | connections. An endpoint that wishes to communicate a fatal | |||
| connection error MUST use a CONNECTION_CLOSE frame if it is able. | connection error MUST use a CONNECTION_CLOSE frame if it is able. | |||
| To support this process, an endpoint issues a stateless reset token, | To support this process, an endpoint issues a stateless reset token, | |||
| which is a 16-byte value that is hard to guess. If the peer | which is a 16-byte value that is hard to guess. If the peer | |||
| subsequently receives a stateless reset, which is a UDP datagram that | subsequently receives a Stateless Reset, which is a UDP datagram that | |||
| ends in that stateless reset token, the peer will immediately end the | ends in that stateless reset token, the peer will immediately end the | |||
| connection. | connection. | |||
| A stateless reset token is specific to a connection ID. An endpoint | A stateless reset token is specific to a connection ID. An endpoint | |||
| issues a stateless reset token by including the value in the | issues a stateless reset token by including the value in the | |||
| Stateless Reset Token field of a NEW_CONNECTION_ID frame. Servers | Stateless Reset Token field of a NEW_CONNECTION_ID frame. Servers | |||
| can also issue a stateless_reset_token transport parameter during the | can also issue a stateless_reset_token transport parameter during the | |||
| handshake that applies to the connection ID that it selected during | handshake that applies to the connection ID that it selected during | |||
| the handshake. These exchanges are protected by encryption, so only | the handshake. These exchanges are protected by encryption, so only | |||
| client and server know their value. Note that clients cannot use the | client and server know their value. Note that clients cannot use the | |||
| skipping to change at page 73, line 49 ¶ | skipping to change at page 72, line 52 ¶ | |||
| An endpoint that receives packets that it cannot process sends a | An endpoint that receives packets that it cannot process sends a | |||
| packet in the following layout (see Section 1.3): | packet in the following layout (see Section 1.3): | |||
| Stateless Reset { | Stateless Reset { | |||
| Fixed Bits (2) = 1, | Fixed Bits (2) = 1, | |||
| Unpredictable Bits (38..), | Unpredictable Bits (38..), | |||
| Stateless Reset Token (128), | Stateless Reset Token (128), | |||
| } | } | |||
| Figure 10: Stateless Reset Packet | Figure 10: Stateless Reset | |||
| This design ensures that a stateless reset packet is - to the extent | This design ensures that a Stateless Reset is -- to the extent | |||
| possible - indistinguishable from a regular packet with a short | possible -- indistinguishable from a regular packet with a short | |||
| header. | header. | |||
| A stateless reset uses an entire UDP datagram, starting with the | A Stateless Reset uses an entire UDP datagram, starting with the | |||
| first two bits of the packet header. The remainder of the first byte | first two bits of the packet header. The remainder of the first byte | |||
| and an arbitrary number of bytes following it are set to values that | and an arbitrary number of bytes following it are set to values that | |||
| SHOULD be indistinguishable from random. The last 16 bytes of the | SHOULD be indistinguishable from random. The last 16 bytes of the | |||
| datagram contain a Stateless Reset Token. | datagram contain a stateless reset token. | |||
| To entities other than its intended recipient, a stateless reset will | To entities other than its intended recipient, a Stateless Reset will | |||
| appear to be a packet with a short header. For the stateless reset | appear to be a packet with a short header. For the Stateless Reset | |||
| to appear as a valid QUIC packet, the Unpredictable Bits field needs | to appear as a valid QUIC packet, the Unpredictable Bits field needs | |||
| to include at least 38 bits of data (or 5 bytes, less the two fixed | to include at least 38 bits of data (or 5 bytes, less the two fixed | |||
| bits). | bits). | |||
| The resulting minimum size of 21 bytes does not guarantee that a | The resulting minimum size of 21 bytes does not guarantee that a | |||
| stateless reset is difficult to distinguish from other packets if the | Stateless Reset is difficult to distinguish from other packets if the | |||
| recipient requires the use of a connection ID. To achieve that end, | recipient requires the use of a connection ID. To achieve that end, | |||
| the endpoint SHOULD ensure that all packets it sends are at least 22 | the endpoint SHOULD ensure that all packets it sends are at least 22 | |||
| bytes longer than the minimum connection ID length that it requests | bytes longer than the minimum connection ID length that it requests | |||
| the peer to include in its packets, adding PADDING frames as | the peer to include in its packets, adding PADDING frames as | |||
| necessary. This ensures that any stateless reset sent by the peer is | necessary. This ensures that any Stateless Reset sent by the peer is | |||
| indistinguishable from a valid packet sent to the endpoint. An | indistinguishable from a valid packet sent to the endpoint. An | |||
| endpoint that sends a stateless reset in response to a packet that is | endpoint that sends a Stateless Reset in response to a packet that is | |||
| 43 bytes or shorter SHOULD send a stateless reset that is one byte | 43 bytes or shorter SHOULD send a Stateless Reset that is one byte | |||
| shorter than the packet it responds to. | shorter than the packet it responds to. | |||
| These values assume that the Stateless Reset Token is the same length | These values assume that the stateless reset token is the same length | |||
| as the minimum expansion of the packet protection AEAD. Additional | as the minimum expansion of the packet protection AEAD. Additional | |||
| unpredictable bytes are necessary if the endpoint could have | unpredictable bytes are necessary if the endpoint could have | |||
| negotiated a packet protection scheme with a larger minimum | negotiated a packet protection scheme with a larger minimum | |||
| expansion. | expansion. | |||
| An endpoint MUST NOT send a stateless reset that is three times or | An endpoint MUST NOT send a Stateless Reset that is three times or | |||
| more larger than the packet it receives to avoid being used for | more larger than the packet it receives to avoid being used for | |||
| amplification. Section 10.3.3 describes additional limits on | amplification. Section 10.3.3 describes additional limits on | |||
| stateless reset size. | Stateless Reset size. | |||
| Endpoints MUST discard packets that are too small to be valid QUIC | Endpoints MUST discard packets that are too small to be valid QUIC | |||
| packets. To give an example, with the set of AEAD functions defined | packets. To give an example, with the set of AEAD functions defined | |||
| in [QUIC-TLS], short header packets that are smaller than 21 bytes | in [QUIC-TLS], short header packets that are smaller than 21 bytes | |||
| are never valid. | are never valid. | |||
| Endpoints MUST send stateless reset packets formatted as a packet | Endpoints MUST send Stateless Resets formatted as a packet with a | |||
| with a short header. However, endpoints MUST treat any packet ending | short header. However, endpoints MUST treat any packet ending in a | |||
| in a valid stateless reset token as a stateless reset, as other QUIC | valid stateless reset token as a Stateless Reset, as other QUIC | |||
| versions might allow the use of a long header. | versions might allow the use of a long header. | |||
| An endpoint MAY send a stateless reset in response to a packet with a | An endpoint MAY send a Stateless Reset in response to a packet with a | |||
| long header. Sending a stateless reset is not effective prior to the | long header. Sending a Stateless Reset is not effective prior to the | |||
| stateless reset token being available to a peer. In this QUIC | stateless reset token being available to a peer. In this QUIC | |||
| version, packets with a long header are only used during connection | version, packets with a long header are only used during connection | |||
| establishment. Because the stateless reset token is not available | establishment. Because the stateless reset token is not available | |||
| until connection establishment is complete or near completion, | until connection establishment is complete or near completion, | |||
| ignoring an unknown packet with a long header might be as effective | ignoring an unknown packet with a long header might be as effective | |||
| as sending a stateless reset. | as sending a Stateless Reset. | |||
| An endpoint cannot determine the Source Connection ID from a packet | An endpoint cannot determine the Source Connection ID from a packet | |||
| with a short header, therefore it cannot set the Destination | with a short header; therefore, it cannot set the Destination | |||
| Connection ID in the stateless reset packet. The Destination | Connection ID in the Stateless Reset. The Destination Connection ID | |||
| Connection ID will therefore differ from the value used in previous | will therefore differ from the value used in previous packets. A | |||
| packets. A random Destination Connection ID makes the connection ID | random Destination Connection ID makes the connection ID appear to be | |||
| appear to be the result of moving to a new connection ID that was | the result of moving to a new connection ID that was provided using a | |||
| provided using a NEW_CONNECTION_ID frame (Section 19.15). | NEW_CONNECTION_ID frame; see Section 19.15. | |||
| Using a randomized connection ID results in two problems: | Using a randomized connection ID results in two problems: | |||
| o The packet might not reach the peer. If the Destination | o The packet might not reach the peer. If the Destination | |||
| Connection ID is critical for routing toward the peer, then this | Connection ID is critical for routing toward the peer, then this | |||
| packet could be incorrectly routed. This might also trigger | packet could be incorrectly routed. This might also trigger | |||
| another Stateless Reset in response; see Section 10.3.3. A | another Stateless Reset in response; see Section 10.3.3. A | |||
| Stateless Reset that is not correctly routed is an ineffective | Stateless Reset that is not correctly routed is an ineffective | |||
| error detection and recovery mechanism. In this case, endpoints | error detection and recovery mechanism. In this case, endpoints | |||
| will need to rely on other methods - such as timers - to detect | will need to rely on other methods -- such as timers -- to detect | |||
| that the connection has failed. | that the connection has failed. | |||
| o The randomly generated connection ID can be used by entities other | o The randomly generated connection ID can be used by entities other | |||
| than the peer to identify this as a potential stateless reset. An | than the peer to identify this as a potential Stateless Reset. An | |||
| endpoint that occasionally uses different connection IDs might | endpoint that occasionally uses different connection IDs might | |||
| introduce some uncertainty about this. | introduce some uncertainty about this. | |||
| This stateless reset design is specific to QUIC version 1. An | This stateless reset design is specific to QUIC version 1. An | |||
| endpoint that supports multiple versions of QUIC needs to generate a | endpoint that supports multiple versions of QUIC needs to generate a | |||
| stateless reset that will be accepted by peers that support any | Stateless Reset that will be accepted by peers that support any | |||
| version that the endpoint might support (or might have supported | version that the endpoint might support (or might have supported | |||
| prior to losing state). Designers of new versions of QUIC need to be | prior to losing state). Designers of new versions of QUIC need to be | |||
| aware of this and either reuse this design, or use a portion of the | aware of this and either (1) reuse this design or (2) use a portion | |||
| packet other than the last 16 bytes for carrying data. | of the packet other than the last 16 bytes for carrying data. | |||
| 10.3.1. Detecting a Stateless Reset | 10.3.1. Detecting a Stateless Reset | |||
| An endpoint detects a potential stateless reset using the trailing 16 | An endpoint detects a potential Stateless Reset using the trailing 16 | |||
| bytes of the UDP datagram. An endpoint remembers all Stateless Reset | bytes of the UDP datagram. An endpoint remembers all stateless reset | |||
| Tokens associated with the connection IDs and remote addresses for | tokens associated with the connection IDs and remote addresses for | |||
| datagrams it has recently sent. This includes Stateless Reset Tokens | datagrams it has recently sent. This includes Stateless Reset Token | |||
| from NEW_CONNECTION_ID frames and the server's transport parameters | field values from NEW_CONNECTION_ID frames and the server's transport | |||
| but excludes Stateless Reset Tokens associated with connection IDs | parameters but excludes stateless reset tokens associated with | |||
| that are either unused or retired. The endpoint identifies a | connection IDs that are either unused or retired. The endpoint | |||
| received datagram as a stateless reset by comparing the last 16 bytes | identifies a received datagram as a Stateless Reset by comparing the | |||
| of the datagram with all Stateless Reset Tokens associated with the | last 16 bytes of the datagram with all stateless reset tokens | |||
| remote address on which the datagram was received. | associated with the remote address on which the datagram was | |||
| received. | ||||
| This comparison can be performed for every inbound datagram. | This comparison can be performed for every inbound datagram. | |||
| Endpoints MAY skip this check if any packet from a datagram is | Endpoints MAY skip this check if any packet from a datagram is | |||
| successfully processed. However, the comparison MUST be performed | successfully processed. However, the comparison MUST be performed | |||
| when the first packet in an incoming datagram either cannot be | when the first packet in an incoming datagram either cannot be | |||
| associated with a connection, or cannot be decrypted. | associated with a connection or cannot be decrypted. | |||
| An endpoint MUST NOT check for any Stateless Reset Tokens associated | An endpoint MUST NOT check for any stateless reset tokens associated | |||
| with connection IDs it has not used or for connection IDs that have | with connection IDs it has not used or for connection IDs that have | |||
| been retired. | been retired. | |||
| When comparing a datagram to Stateless Reset Token values, endpoints | When comparing a datagram to stateless reset token values, endpoints | |||
| MUST perform the comparison without leaking information about the | MUST perform the comparison without leaking information about the | |||
| value of the token. For example, performing this comparison in | value of the token. For example, performing this comparison in | |||
| constant time protects the value of individual Stateless Reset Tokens | constant time protects the value of individual stateless reset tokens | |||
| from information leakage through timing side channels. Another | from information leakage through timing side channels. Another | |||
| approach would be to store and compare the transformed values of | approach would be to store and compare the transformed values of | |||
| Stateless Reset Tokens instead of the raw token values, where the | stateless reset tokens instead of the raw token values, where the | |||
| transformation is defined as a cryptographically-secure pseudo-random | transformation is defined as a cryptographically secure pseudorandom | |||
| function using a secret key (e.g., block cipher, HMAC [RFC2104]). An | function using a secret key (e.g., block cipher, Hashed Message | |||
| endpoint is not expected to protect information about whether a | Authentication Code (HMAC) [RFC2104]). An endpoint is not expected | |||
| packet was successfully decrypted, or the number of valid Stateless | to protect information about whether a packet was successfully | |||
| Reset Tokens. | decrypted or the number of valid stateless reset tokens. | |||
| If the last 16 bytes of the datagram are identical in value to a | If the last 16 bytes of the datagram are identical in value to a | |||
| Stateless Reset Token, the endpoint MUST enter the draining period | stateless reset token, the endpoint MUST enter the draining period | |||
| and not send any further packets on this connection. | and not send any further packets on this connection. | |||
| 10.3.2. Calculating a Stateless Reset Token | 10.3.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, an endpoint could randomly generate | create a stateless reset token, an endpoint could randomly generate | |||
| ([RANDOM]) a secret for every connection that it creates. However, | [RANDOM] a secret for every connection that it creates. However, | |||
| this presents a coordination problem when there are multiple | this presents a coordination problem when there are multiple | |||
| instances in a cluster or a storage problem for an endpoint that | instances in a cluster or a storage problem for an endpoint that | |||
| might lose state. Stateless reset specifically exists to handle the | might lose state. Stateless reset specifically exists to handle the | |||
| case where state is lost, so this approach is suboptimal. | case where state is lost, so this approach is suboptimal. | |||
| A single static key can be used across all connections to the same | A single static key can be used across all connections to the same | |||
| endpoint by generating the proof using a pseudorandom function that | endpoint by generating the proof using a pseudorandom function that | |||
| takes a static key and the connection ID chosen by the endpoint (see | takes a static key and the connection ID chosen by the endpoint (see | |||
| Section 5.1) as input. An endpoint could use HMAC [RFC2104] (for | Section 5.1) as input. An endpoint could use HMAC [RFC2104] (for | |||
| example, HMAC(static_key, connection_id)) or HKDF [RFC5869] (for | example, HMAC(static_key, connection_id)) or the HMAC-based Key | |||
| example, using the static key as input keying material, with the | Derivation Function (HKDF) [RFC5869] (for example, using the static | |||
| connection ID as salt). The output of this function is truncated to | key as input keying material, with the connection ID as salt). The | |||
| 16 bytes to produce the Stateless Reset Token for that connection. | output of this function is truncated to 16 bytes to produce the | |||
| stateless reset token for that connection. | ||||
| An endpoint that loses state can use the same method to generate a | An endpoint that loses state can use the same method to generate a | |||
| valid Stateless Reset Token. The connection ID comes from the packet | valid stateless reset token. The connection ID comes from the packet | |||
| that the endpoint receives. | that the endpoint receives. | |||
| This design relies on the peer always sending a connection ID in its | This design relies on the peer always sending a connection ID in its | |||
| packets so that the endpoint can use the connection ID from a packet | packets so that the endpoint can use the connection ID from a packet | |||
| to reset the connection. An endpoint that uses this design MUST | to reset the connection. An endpoint that uses this design MUST | |||
| either use the same connection ID length for all connections or | either use the same connection ID length for all connections or | |||
| encode the length of the connection ID such that it can be recovered | encode the length of the connection ID such that it can be recovered | |||
| without state. In addition, it cannot provide a zero-length | without state. In addition, it cannot provide a zero-length | |||
| connection ID. | connection ID. | |||
| Revealing the Stateless Reset Token allows any entity to terminate | Revealing the stateless reset token allows any entity to terminate | |||
| the connection, so a value can only be used once. This method for | the connection, so a value can only be used once. This method for | |||
| choosing the Stateless Reset Token means that the combination of | choosing the stateless reset token means that the combination of | |||
| connection ID and static key MUST NOT be used for another connection. | connection ID and static key MUST NOT be used for another connection. | |||
| A denial of service attack is possible if the same connection ID is | A denial-of-service attack is possible if the same connection ID is | |||
| used by instances that share a static key, or if an attacker can | used by instances that share a static key or if an attacker can cause | |||
| cause a packet to be routed to an instance that has no state but the | a packet to be routed to an instance that has no state but the same | |||
| same static key; see Section 21.11. A connection ID from a | static key; see Section 21.11. A connection ID from a connection | |||
| connection that is reset by revealing the Stateless Reset Token MUST | that is reset by revealing the stateless reset token MUST NOT be | |||
| NOT be reused for new connections at nodes that share a static key. | reused for new connections at nodes that share a static key. | |||
| The same Stateless Reset Token MUST NOT be used for multiple | The same stateless reset token MUST NOT be used for multiple | |||
| connection IDs. Endpoints are not required to compare new values | connection IDs. Endpoints are not required to compare new values | |||
| against all previous values, but a duplicate value MAY be treated as | against all previous values, but a duplicate value MAY be treated as | |||
| a connection error of type PROTOCOL_VIOLATION. | a connection error of type PROTOCOL_VIOLATION. | |||
| Note that Stateless Reset packets do not have any cryptographic | Note that Stateless Resets do not have any cryptographic protection. | |||
| protection. | ||||
| 10.3.3. Looping | 10.3.3. Looping | |||
| The design of a Stateless Reset is such that without knowing the | The design of a Stateless Reset is such that without knowing the | |||
| stateless reset token it is indistinguishable from a valid packet. | stateless reset token it is indistinguishable from a valid packet. | |||
| For instance, if a server sends a Stateless Reset to another server | For instance, if a server sends a Stateless Reset to another server, | |||
| it might receive another Stateless Reset in response, which could | it might receive another Stateless Reset in response, which could | |||
| lead to an infinite exchange. | lead to an infinite exchange. | |||
| An endpoint MUST ensure that every Stateless Reset that it sends is | An endpoint MUST ensure that every Stateless Reset that it sends is | |||
| smaller than the packet that triggered it, unless it maintains state | smaller than the packet that triggered it, unless it maintains state | |||
| sufficient to prevent looping. In the event of a loop, this results | sufficient to prevent looping. In the event of a loop, this results | |||
| in packets eventually being too small to trigger a response. | in packets eventually being too small to trigger a response. | |||
| An endpoint can remember the number of Stateless Reset packets that | An endpoint can remember the number of Stateless Resets that it has | |||
| it has sent and stop generating new Stateless Reset packets once a | sent and stop generating new Stateless Resets once a limit is | |||
| limit is reached. Using separate limits for different remote | reached. Using separate limits for different remote addresses will | |||
| addresses will ensure that Stateless Reset packets can be used to | ensure that Stateless Resets can be used to close connections when | |||
| close connections when other peers or connections have exhausted | other peers or connections have exhausted limits. | |||
| limits. | ||||
| Reducing the size of a Stateless Reset below 41 bytes means that the | A Stateless Reset that is smaller than 41 bytes might be identifiable | |||
| packet could reveal to an observer that it is a Stateless Reset, | as a Stateless Reset by an observer, depending upon the length of the | |||
| depending upon the length of the peer's connection IDs. Conversely, | peer's connection IDs. Conversely, not sending a Stateless Reset in | |||
| refusing to send a Stateless Reset in response to a small packet | response to a small packet might result in Stateless Resets not being | |||
| might result in Stateless Reset not being useful in detecting cases | useful in detecting cases of broken connections where only very small | |||
| of broken connections where only very small packets are sent; such | packets are sent; such failures might only be detected by other | |||
| failures might only be detected by other means, such as timers. | means, such as timers. | |||
| 11. Error Handling | 11. Error Handling | |||
| An endpoint that detects an error SHOULD signal the existence of that | An endpoint that detects an error SHOULD signal the existence of that | |||
| error to its peer. Both transport-level and application-level errors | error to its peer. Both transport-level and application-level errors | |||
| can affect an entire connection; see Section 11.1. Only application- | can affect an entire connection; see Section 11.1. Only application- | |||
| level errors can be isolated to a single stream; see Section 11.2. | level errors can be isolated to a single stream; see Section 11.2. | |||
| The most appropriate error code (Section 20) SHOULD be included in | The most appropriate error code (Section 20) SHOULD be included in | |||
| the frame that signals the error. Where this specification | the frame that signals the error. Where this specification | |||
| skipping to change at page 79, line 20 ¶ | skipping to change at page 78, line 18 ¶ | |||
| connection. Limiting the number of retransmissions and the time over | connection. Limiting the number of retransmissions and the time over | |||
| which this final packet is sent limits the effort expended on | which this final packet is sent limits the effort expended on | |||
| terminated connections. | terminated connections. | |||
| An endpoint that chooses not to retransmit packets containing a | An endpoint that chooses not to retransmit packets containing a | |||
| CONNECTION_CLOSE frame risks a peer missing the first such packet. | CONNECTION_CLOSE frame risks a peer missing the first such packet. | |||
| The only mechanism available to an endpoint that continues to receive | The only mechanism available to an endpoint that continues to receive | |||
| data for a terminated connection is to attempt the stateless reset | data for a terminated connection is to attempt the stateless reset | |||
| process (Section 10.3). | process (Section 10.3). | |||
| As the AEAD on Initial packets does not provide strong | As the AEAD for Initial packets does not provide strong | |||
| authentication, an endpoint MAY discard an invalid Initial packet. | authentication, an endpoint MAY discard an invalid Initial packet. | |||
| Discarding an Initial packet is permitted even where this | Discarding an Initial packet is permitted even where this | |||
| specification otherwise mandates a connection error. An endpoint can | specification otherwise mandates a connection error. An endpoint can | |||
| only discard a packet if it does not process the frames in the packet | only discard a packet if it does not process the frames in the packet | |||
| or reverts the effects of any processing. Discarding invalid Initial | or reverts the effects of any processing. Discarding invalid Initial | |||
| packets might be used to reduce exposure to denial of service; see | packets might be used to reduce exposure to denial of service; see | |||
| Section 21.2. | Section 21.2. | |||
| 11.2. Stream Errors | 11.2. Stream Errors | |||
| If an application-level error affects a single stream, but otherwise | If an application-level error affects a single stream but otherwise | |||
| leaves the connection in a recoverable state, the endpoint can send a | leaves the connection in a recoverable state, the endpoint can send a | |||
| RESET_STREAM frame (Section 19.4) with an appropriate error code to | RESET_STREAM frame (Section 19.4) with an appropriate error code to | |||
| terminate just the affected stream. | terminate just the affected stream. | |||
| Resetting a stream without the involvement of the application | Resetting a stream without the involvement of the application | |||
| protocol could cause the application protocol to enter an | protocol could cause the application protocol to enter an | |||
| unrecoverable state. RESET_STREAM MUST only be instigated by the | unrecoverable state. RESET_STREAM MUST only be instigated by the | |||
| application protocol that uses QUIC. | application protocol that uses QUIC. | |||
| The semantics of the application error code carried in RESET_STREAM | The semantics of the application error code carried in RESET_STREAM | |||
| are defined by the application protocol. Only the application | are defined by the application protocol. Only the application | |||
| protocol is able to cause a stream to be terminated. A local | protocol is able to cause a stream to be terminated. A local | |||
| instance of the application protocol uses a direct API call and a | instance of the application protocol uses a direct API call, and a | |||
| remote instance uses the STOP_SENDING frame, which triggers an | remote instance uses the STOP_SENDING frame, which triggers an | |||
| automatic RESET_STREAM. | automatic RESET_STREAM. | |||
| Application protocols SHOULD define rules for handling streams that | Application protocols SHOULD define rules for handling streams that | |||
| are prematurely cancelled by either endpoint. | are prematurely canceled by either endpoint. | |||
| 12. Packets and Frames | 12. Packets and Frames | |||
| QUIC endpoints communicate by exchanging packets. Packets have | QUIC endpoints communicate by exchanging packets. Packets have | |||
| confidentiality and integrity protection; see Section 12.1. Packets | confidentiality and integrity protection; see Section 12.1. Packets | |||
| are carried in UDP datagrams; see Section 12.2. | are carried in UDP datagrams; see Section 12.2. | |||
| This version of QUIC uses the long packet header during connection | This version of QUIC uses the long packet header during connection | |||
| establishment; see Section 17.2. Packets with the long header are | establishment; see Section 17.2. Packets with the long header are | |||
| Initial (Section 17.2.2), 0-RTT (Section 17.2.3), Handshake | Initial (Section 17.2.2), 0-RTT (Section 17.2.3), Handshake | |||
| skipping to change at page 80, line 32 ¶ | skipping to change at page 79, line 32 ¶ | |||
| 12.1. Protected Packets | 12.1. Protected Packets | |||
| QUIC packets have different levels of cryptographic protection based | QUIC packets have different levels of cryptographic protection based | |||
| on the type of packet. Details of packet protection are found in | on the type of packet. Details of packet protection are found in | |||
| [QUIC-TLS]; this section includes an overview of the protections that | [QUIC-TLS]; this section includes an overview of the protections that | |||
| are provided. | are provided. | |||
| Version Negotiation packets have no cryptographic protection; see | Version Negotiation packets have no cryptographic protection; see | |||
| [QUIC-INVARIANTS]. | [QUIC-INVARIANTS]. | |||
| Retry packets use an authenticated encryption with associated data | Retry packets use an AEAD function [AEAD] to protect against | |||
| function (AEAD; [AEAD]) to protect against accidental modification. | ||||
| Initial packets use an AEAD, the keys for which are derived using a | ||||
| value that is visible on the wire. Initial packets therefore do not | ||||
| have effective confidentiality protection. Initial protection exists | ||||
| to ensure that the sender of the packet is on the network path. Any | ||||
| entity that receives an Initial packet from a client can recover the | ||||
| keys that will allow them to both read the contents of the packet and | ||||
| generate Initial packets that will be successfully authenticated at | ||||
| either endpoint. The AEAD also protects Initial packets against | ||||
| accidental modification. | accidental modification. | |||
| Initial packets use an AEAD function, the keys for which are derived | ||||
| using a value that is visible on the wire. Initial packets therefore | ||||
| do not have effective confidentiality protection. Initial protection | ||||
| exists to ensure that the sender of the packet is on the network | ||||
| path. Any entity that receives an Initial packet from a client can | ||||
| recover the keys that will allow them to both read the contents of | ||||
| the packet and generate Initial packets that will be successfully | ||||
| authenticated at either endpoint. The AEAD also protects Initial | ||||
| packets against accidental modification. | ||||
| All other packets are protected with keys derived from the | All other packets are protected with keys derived from the | |||
| cryptographic handshake. The cryptographic handshake ensures that | cryptographic handshake. The cryptographic handshake ensures that | |||
| only the communicating endpoints receive the corresponding keys for | only the communicating endpoints receive the corresponding keys for | |||
| Handshake, 0-RTT, and 1-RTT packets. Packets protected with 0-RTT | Handshake, 0-RTT, and 1-RTT packets. Packets protected with 0-RTT | |||
| and 1-RTT keys have strong confidentiality and integrity protection. | and 1-RTT keys have strong confidentiality and integrity protection. | |||
| The Packet Number field that appears in some packet types has | The Packet Number field that appears in some packet types has | |||
| alternative confidentiality protection that is applied as part of | alternative confidentiality protection that is applied as part of | |||
| header protection; see Section 5.4 of [QUIC-TLS] for details. The | header protection; see Section 5.4 of [QUIC-TLS] for details. The | |||
| underlying packet number increases with each packet sent in a given | underlying packet number increases with each packet sent in a given | |||
| skipping to change at page 81, line 20 ¶ | skipping to change at page 80, line 20 ¶ | |||
| Initial (Section 17.2.2), 0-RTT (Section 17.2.3), and Handshake | Initial (Section 17.2.2), 0-RTT (Section 17.2.3), and Handshake | |||
| (Section 17.2.4) packets contain a Length field that determines the | (Section 17.2.4) packets contain a Length field that determines the | |||
| end of the packet. The length includes both the Packet Number and | end of the packet. The length includes both the Packet Number and | |||
| Payload fields, both of which are confidentiality protected and | Payload fields, both of which are confidentiality protected and | |||
| initially of unknown length. The length of the Payload field is | initially of unknown length. The length of the Payload field is | |||
| learned once header protection is removed. | learned once header protection is removed. | |||
| Using the Length field, a sender can coalesce multiple QUIC packets | Using the Length field, a sender can coalesce multiple QUIC packets | |||
| into one UDP datagram. This can reduce the number of UDP datagrams | into one UDP datagram. This can reduce the number of UDP datagrams | |||
| needed to complete the cryptographic handshake and start sending | needed to complete the cryptographic handshake and start sending | |||
| data. This can also be used to construct PMTU probes; see | data. This can also be used to construct Path Maximum Transmission | |||
| Section 14.4.1. Receivers MUST be able to process coalesced packets. | Unit (PMTU) probes; see Section 14.4.1. Receivers MUST be able to | |||
| process coalesced packets. | ||||
| Coalescing packets in order of increasing encryption levels (Initial, | Coalescing packets in order of increasing encryption levels (Initial, | |||
| 0-RTT, Handshake, 1-RTT; see Section 4.1.4 of [QUIC-TLS]) makes it | 0-RTT, Handshake, 1-RTT; see Section 4.1.4 of [QUIC-TLS]) makes it | |||
| more likely the receiver will be able to process all the packets in a | more likely that the receiver will be able to process all the packets | |||
| single pass. A packet with a short header does not include a length, | in a single pass. A packet with a short header does not include a | |||
| so it can only be the last packet included in a UDP datagram. An | length, so it can only be the last packet included in a UDP datagram. | |||
| endpoint SHOULD include multiple frames in a single packet if they | An endpoint SHOULD include multiple frames in a single packet if they | |||
| are to be sent at the same encryption level, instead of coalescing | are to be sent at the same encryption level, instead of coalescing | |||
| multiple packets at the same encryption level. | multiple packets at the same encryption level. | |||
| Receivers MAY route based on the information in the first packet | Receivers MAY route based on the information in the first packet | |||
| contained in a UDP datagram. Senders MUST NOT coalesce QUIC packets | contained in a UDP datagram. Senders MUST NOT coalesce QUIC packets | |||
| with different connection IDs into a single UDP datagram. Receivers | with different connection IDs into a single UDP datagram. Receivers | |||
| SHOULD ignore any subsequent packets with a different Destination | SHOULD ignore any subsequent packets with a different Destination | |||
| Connection ID than the first packet in the datagram. | Connection ID than the first packet in the datagram. | |||
| Every QUIC packet that is coalesced into a single UDP datagram is | Every QUIC packet that is coalesced into a single UDP datagram is | |||
| separate and complete. The receiver of coalesced QUIC packets MUST | separate and complete. The receiver of coalesced QUIC packets MUST | |||
| individually process each QUIC packet and separately acknowledge | individually process each QUIC packet and separately acknowledge | |||
| them, as if they were received as the payload of different UDP | them, as if they were received as the payload of different UDP | |||
| datagrams. For example, if decryption fails (because the keys are | datagrams. For example, if decryption fails (because the keys are | |||
| not available or any other reason), the receiver MAY either discard | not available or for any other reason), the receiver MAY either | |||
| or buffer the packet for later processing and MUST attempt to process | discard or buffer the packet for later processing and MUST attempt to | |||
| the remaining packets. | process the remaining packets. | |||
| Retry packets (Section 17.2.5), Version Negotiation packets | Retry packets (Section 17.2.5), Version Negotiation packets | |||
| (Section 17.2.1), and packets with a short header (Section 17.3) do | (Section 17.2.1), and packets with a short header (Section 17.3) do | |||
| not contain a Length field and so cannot be followed by other packets | not contain a Length field and so cannot be followed by other packets | |||
| in the same UDP datagram. Note also that there is no situation where | in the same UDP datagram. Note also that there is no situation where | |||
| a Retry or Version Negotiation packet is coalesced with another | a Retry or Version Negotiation packet is coalesced with another | |||
| packet. | packet. | |||
| 12.3. Packet Numbers | 12.3. Packet Numbers | |||
| The packet number is an integer in the range 0 to 2^62-1. This | The packet number is an integer in the range 0 to 2^62-1. This | |||
| number is used in determining the cryptographic nonce for packet | number is used in determining the cryptographic nonce for packet | |||
| protection. Each endpoint maintains a separate packet number for | protection. Each endpoint maintains a separate packet number for | |||
| sending and receiving. | sending and receiving. | |||
| Packet numbers are limited to this range because they need to be | Packet numbers are limited to this range because they need to be | |||
| representable in whole in the Largest Acknowledged field of an ACK | representable in whole in the Largest Acknowledged field of an ACK | |||
| frame (Section 19.3). When present in a long or short header | frame (Section 19.3). When present in a long or short header, | |||
| however, packet numbers are reduced and encoded in 1 to 4 bytes; see | however, packet numbers are reduced and encoded in 1 to 4 bytes; see | |||
| Section 17.1. | Section 17.1. | |||
| Version Negotiation (Section 17.2.1) and Retry (Section 17.2.5) | Version Negotiation (Section 17.2.1) and Retry (Section 17.2.5) | |||
| packets do not include a packet number. | packets do not include a packet number. | |||
| Packet numbers are divided into 3 spaces in QUIC: | Packet numbers are divided into three spaces in QUIC: | |||
| o Initial space: All Initial packets (Section 17.2.2) are in this | Initial space: All Initial packets (Section 17.2.2) are in this | |||
| space. | space. | |||
| o Handshake space: All Handshake packets (Section 17.2.4) are in | Handshake space: All Handshake packets (Section 17.2.4) are in this | |||
| this space. | space. | |||
| o Application data space: All 0-RTT (Section 17.2.3) and 1-RTT | Application data space: All 0-RTT (Section 17.2.3) and 1-RTT | |||
| (Section 17.3.1) packets are in this space. | (Section 17.3.1) packets are in this space. | |||
| As described in [QUIC-TLS], each packet type uses different | As described in [QUIC-TLS], each packet type uses different | |||
| protection keys. | protection keys. | |||
| Conceptually, a packet number space is the context in which a packet | Conceptually, a packet number space is the context in which a packet | |||
| can be processed and acknowledged. Initial packets can only be sent | can be processed and acknowledged. Initial packets can only be sent | |||
| with Initial packet protection keys and acknowledged in packets that | with Initial packet protection keys and acknowledged in packets that | |||
| are also Initial packets. Similarly, Handshake packets are sent at | are also Initial packets. Similarly, Handshake packets are sent at | |||
| the Handshake encryption level and can only be acknowledged in | the Handshake encryption level and can only be acknowledged in | |||
| skipping to change at page 83, line 7 ¶ | skipping to change at page 82, line 7 ¶ | |||
| different packet number spaces. Packet numbers in each space start | different packet number spaces. Packet numbers in each space start | |||
| at packet number 0. Subsequent packets sent in the same packet | at packet number 0. Subsequent packets sent in the same packet | |||
| number space MUST increase the packet number by at least one. | number space MUST increase the packet number by at least one. | |||
| 0-RTT and 1-RTT data exist in the same packet number space to make | 0-RTT and 1-RTT data exist in the same packet number space to make | |||
| loss recovery algorithms easier to implement between the two packet | loss recovery algorithms easier to implement between the two packet | |||
| types. | types. | |||
| A QUIC endpoint MUST NOT reuse a packet number within the same packet | A QUIC endpoint MUST NOT reuse a packet number within the same packet | |||
| number space in one connection. If the packet number for sending | number space in one connection. If the packet number for sending | |||
| reaches 2^62 - 1, the sender MUST close the connection without | reaches 2^62-1, the sender MUST close the connection without sending | |||
| sending a CONNECTION_CLOSE frame or any further packets; an endpoint | a CONNECTION_CLOSE frame or any further packets; an endpoint MAY send | |||
| MAY send a Stateless Reset (Section 10.3) in response to further | a Stateless Reset (Section 10.3) in response to further packets that | |||
| packets that it receives. | it receives. | |||
| A receiver MUST discard a newly unprotected packet unless it is | A receiver MUST discard a newly unprotected packet unless it is | |||
| certain that it has not processed another packet with the same packet | certain that it has not processed another packet with the same packet | |||
| number from the same packet number space. Duplicate suppression MUST | number from the same packet number space. Duplicate suppression MUST | |||
| happen after removing packet protection for the reasons described in | happen after removing packet protection for the reasons described in | |||
| Section 9.5 of [QUIC-TLS]. | Section 9.5 of [QUIC-TLS]. | |||
| Endpoints that track all individual packets for the purposes of | Endpoints that track all individual packets for the purposes of | |||
| detecting duplicates are at risk of accumulating excessive state. | detecting duplicates are at risk of accumulating excessive state. | |||
| The data required for detecting duplicates can be limited by | The data required for detecting duplicates can be limited by | |||
| maintaining a minimum packet number below which all packets are | maintaining a minimum packet number below which all packets are | |||
| immediately dropped. Any minimum needs to account for large | immediately dropped. Any minimum needs to account for large | |||
| variations in round trip time, which includes the possibility that a | variations in round-trip time, which includes the possibility that a | |||
| peer might probe network paths with much larger round trip times; see | peer might probe network paths with much larger round-trip times; see | |||
| Section 9. | Section 9. | |||
| Packet number encoding at a sender and decoding at a receiver are | Packet number encoding at a sender and decoding at a receiver are | |||
| described in Section 17.1. | described in Section 17.1. | |||
| 12.4. Frames and Frame Types | 12.4. Frames and Frame Types | |||
| The payload of QUIC packets, after removing packet protection, | The payload of QUIC packets, after removing packet protection, | |||
| consists of a sequence of complete frames, as shown in Figure 11. | consists of a sequence of complete frames, as shown in Figure 11. | |||
| Version Negotiation, Stateless Reset, and Retry packets do not | Version Negotiation, Stateless Reset, and Retry packets do not | |||
| skipping to change at page 85, line 5 ¶ | skipping to change at page 84, line 5 ¶ | |||
| Frame Type (i), | Frame Type (i), | |||
| Type-Dependent Fields (..), | Type-Dependent Fields (..), | |||
| } | } | |||
| Figure 12: Generic Frame Layout | Figure 12: Generic Frame Layout | |||
| Table 3 lists and summarizes information about each frame type that | Table 3 lists and summarizes information about each frame type that | |||
| is defined in this specification. A description of this summary is | is defined in this specification. A description of this summary is | |||
| included after the table. | included after the table. | |||
| +-------------+----------------------+----------------+------+------+ | +------------+----------------------+----------------+------+------+ | |||
| | Type Value | Frame Type Name | Definition | Pkts | Spec | | | Type Value | Frame Type Name | Definition | Pkts | Spec | | |||
| +-------------+----------------------+----------------+------+------+ | +------------+----------------------+----------------+------+------+ | |||
| | 0x00 | PADDING | Section 19.1 | IH01 | NP | | | 0x00 | PADDING | Section 19.1 | IH01 | NP | | |||
| | | | | | | | | | | | | | | |||
| | 0x01 | PING | Section 19.2 | IH01 | | | | 0x01 | PING | Section 19.2 | IH01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x02 - 0x03 | ACK | Section 19.3 | IH_1 | NC | | | 0x02-0x03 | ACK | Section 19.3 | IH_1 | NC | | |||
| | | | | | | | | | | | | | | |||
| | 0x04 | RESET_STREAM | Section 19.4 | __01 | | | | 0x04 | RESET_STREAM | Section 19.4 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x05 | STOP_SENDING | Section 19.5 | __01 | | | | 0x05 | STOP_SENDING | Section 19.5 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x06 | CRYPTO | Section 19.6 | IH_1 | | | | 0x06 | CRYPTO | Section 19.6 | IH_1 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x07 | NEW_TOKEN | Section 19.7 | ___1 | | | | 0x07 | NEW_TOKEN | Section 19.7 | ___1 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x08 - 0x0f | STREAM | Section 19.8 | __01 | F | | | 0x08-0x0f | STREAM | Section 19.8 | __01 | F | | |||
| | | | | | | | | | | | | | | |||
| | 0x10 | MAX_DATA | Section 19.9 | __01 | | | | 0x10 | MAX_DATA | Section 19.9 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x11 | MAX_STREAM_DATA | Section 19.10 | __01 | | | | 0x11 | MAX_STREAM_DATA | Section 19.10 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x12 - 0x13 | MAX_STREAMS | Section 19.11 | __01 | | | | 0x12-0x13 | MAX_STREAMS | Section 19.11 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x14 | DATA_BLOCKED | Section 19.12 | __01 | | | | 0x14 | DATA_BLOCKED | Section 19.12 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x15 | STREAM_DATA_BLOCKED | Section 19.13 | __01 | | | | 0x15 | STREAM_DATA_BLOCKED | Section 19.13 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x16 - 0x17 | STREAMS_BLOCKED | Section 19.14 | __01 | | | | 0x16-0x17 | STREAMS_BLOCKED | Section 19.14 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x18 | NEW_CONNECTION_ID | Section 19.15 | __01 | P | | | 0x18 | NEW_CONNECTION_ID | Section 19.15 | __01 | P | | |||
| | | | | | | | | | | | | | | |||
| | 0x19 | RETIRE_CONNECTION_ID | Section 19.16 | __01 | | | | 0x19 | RETIRE_CONNECTION_ID | Section 19.16 | __01 | | | |||
| | | | | | | | | | | | | | | |||
| | 0x1a | PATH_CHALLENGE | Section 19.17 | __01 | P | | | 0x1a | PATH_CHALLENGE | Section 19.17 | __01 | P | | |||
| | | | | | | | | | | | | | | |||
| | 0x1b | PATH_RESPONSE | Section 19.18 | ___1 | P | | | 0x1b | PATH_RESPONSE | Section 19.18 | ___1 | P | | |||
| | | | | | | | | | | | | | | |||
| | 0x1c - 0x1d | CONNECTION_CLOSE | Section 19.19 | ih01 | N | | | 0x1c-0x1d | CONNECTION_CLOSE | Section 19.19 | ih01 | N | | |||
| | | | | | | | | | | | | | | |||
| | 0x1e | HANDSHAKE_DONE | Section 19.20 | ___1 | | | | 0x1e | HANDSHAKE_DONE | Section 19.20 | ___1 | | | |||
| +-------------+----------------------+----------------+------+------+ | +------------+----------------------+----------------+------+------+ | |||
| Table 3: Frame Types | Table 3: Frame Types | |||
| The format and semantics of each frame type are explained in more | The format and semantics of each frame type are explained in more | |||
| detail in Section 19. The remainder of this section provides a | detail in Section 19. The remainder of this section provides a | |||
| summary of important and general information. | summary of important and general information. | |||
| The Frame Type in ACK, STREAM, MAX_STREAMS, STREAMS_BLOCKED, and | The Frame Type in ACK, STREAM, MAX_STREAMS, STREAMS_BLOCKED, and | |||
| CONNECTION_CLOSE frames is used to carry other frame-specific flags. | CONNECTION_CLOSE frames is used to carry other frame-specific flags. | |||
| For all other frames, the Frame Type field simply identifies the | For all other frames, the Frame Type field simply identifies the | |||
| frame. | frame. | |||
| The "Pkts" column in Table 3 lists the types of packets that each | The "Pkts" column in Table 3 lists the types of packets that each | |||
| frame type could appear in, indicated by the following characters: | frame type could appear in, indicated by the following characters: | |||
| I: Initial (Section 17.2.2) | I: Initial (Section 17.2.2) | |||
| H: Handshake (Section 17.2.4) | H: Handshake (Section 17.2.4) | |||
| 0: 0-RTT (Section 17.2.3) | 0: 0-RTT (Section 17.2.3) | |||
| 1: 1-RTT (Section 17.3.1) | 1: 1-RTT (Section 17.3.1) | |||
| ih: Only a CONNECTION_CLOSE frame of type 0x1c can appear in Initial | ih: Only a CONNECTION_CLOSE frame of type 0x1c can appear in Initial | |||
| or Handshake packets. | or Handshake packets. | |||
| For more detail about these restrictions, see Section 12.5. Note | For more details about these restrictions, see Section 12.5. Note | |||
| that all frames can appear in 1-RTT packets. An endpoint MUST treat | that all frames can appear in 1-RTT packets. An endpoint MUST treat | |||
| receipt of a frame in a packet type that is not permitted as a | receipt of a frame in a packet type that is not permitted as a | |||
| connection error of type PROTOCOL_VIOLATION. | connection error of type PROTOCOL_VIOLATION. | |||
| The "Spec" column in Table 3 summarizes any special rules governing | The "Spec" column in Table 3 summarizes any special rules governing | |||
| the processing or generation of the frame type, as indicated by the | the processing or generation of the frame type, as indicated by the | |||
| following characters: | following characters: | |||
| N: Packets containing only frames with this marking are not ack- | N: Packets containing only frames with this marking are not ack- | |||
| eliciting; see Section 13.2. | eliciting; see Section 13.2. | |||
| C: Packets containing only frames with this marking do not count | C: Packets containing only frames with this marking do not count | |||
| toward bytes in flight for congestion control purposes; see | toward bytes in flight for congestion control purposes; see | |||
| [QUIC-RECOVERY]. | [QUIC-RECOVERY]. | |||
| P: Packets containing only frames with this marking can be used to | P: Packets containing only frames with this marking can be used to | |||
| probe new network paths during connection migration; see | probe new network paths during connection migration; see | |||
| Section 9.1. | Section 9.1. | |||
| F: The content of frames with this marking are flow controlled; see | F: The contents of frames with this marking are flow controlled; | |||
| Section 4. | see Section 4. | |||
| The "Pkts" and "Spec" columns in Table 3 do not form part of the IANA | The "Pkts" and "Spec" columns in Table 3 do not form part of the IANA | |||
| registry; see Section 22.4. | registry; see Section 22.4. | |||
| An endpoint MUST treat the receipt of a frame of unknown type as a | An endpoint MUST treat the receipt of a frame of unknown type as a | |||
| connection error of type FRAME_ENCODING_ERROR. | connection error of type FRAME_ENCODING_ERROR. | |||
| All frames are idempotent in this version of QUIC. That is, a valid | All frames are idempotent in this version of QUIC. That is, a valid | |||
| frame does not cause undesirable side effects or errors when received | frame does not cause undesirable side effects or errors when received | |||
| more than once. | more than once. | |||
| The Frame Type field uses a variable-length integer encoding (see | The Frame Type field uses a variable-length integer encoding (see | |||
| Section 16) with one exception. To ensure simple and efficient | Section 16), with one exception. To ensure simple and efficient | |||
| implementations of frame parsing, a frame type MUST use the shortest | implementations of frame parsing, a frame type MUST use the shortest | |||
| possible encoding. For frame types defined in this document, this | possible encoding. For frame types defined in this document, this | |||
| means a single-byte encoding, even though it is possible to encode | means a single-byte encoding, even though it is possible to encode | |||
| these values as a two-, four- or eight-byte variable-length integer. | these values as a two-, four-, or eight-byte variable-length integer. | |||
| For instance, though 0x4001 is a legitimate two-byte encoding for a | For instance, though 0x4001 is a legitimate two-byte encoding for a | |||
| variable-length integer with a value of 1, PING frames are always | variable-length integer with a value of 1, PING frames are always | |||
| encoded as a single byte with the value 0x01. This rule applies to | encoded as a single byte with the value 0x01. This rule applies to | |||
| all current and future QUIC frame types. An endpoint MAY treat the | all current and future QUIC frame types. An endpoint MAY treat the | |||
| receipt of a frame type that uses a longer encoding than necessary as | receipt of a frame type that uses a longer encoding than necessary as | |||
| a connection error of type PROTOCOL_VIOLATION. | a connection error of type PROTOCOL_VIOLATION. | |||
| 12.5. Frames and Number Spaces | 12.5. Frames and Number Spaces | |||
| Some frames are prohibited in different packet number spaces. The | Some frames are prohibited in different packet number spaces. The | |||
| skipping to change at page 87, line 41 ¶ | skipping to change at page 86, line 41 ¶ | |||
| can only appear in the application data packet number space: | can only appear in the application data packet number space: | |||
| o PADDING, PING, and CRYPTO frames MAY appear in any packet number | o PADDING, PING, and CRYPTO frames MAY appear in any packet number | |||
| space. | space. | |||
| o CONNECTION_CLOSE frames signaling errors at the QUIC layer (type | o CONNECTION_CLOSE frames signaling errors at the QUIC layer (type | |||
| 0x1c) MAY appear in any packet number space. CONNECTION_CLOSE | 0x1c) MAY appear in any packet number space. CONNECTION_CLOSE | |||
| frames signaling application errors (type 0x1d) MUST only appear | frames signaling application errors (type 0x1d) MUST only appear | |||
| in the application data packet number space. | in the application data packet number space. | |||
| o ACK frames MAY appear in any packet number space, but can only | o ACK frames MAY appear in any packet number space but can only | |||
| acknowledge packets that appeared in that packet number space. | acknowledge packets that appeared in that packet number space. | |||
| However, as noted below, 0-RTT packets cannot contain ACK frames. | However, as noted below, 0-RTT packets cannot contain ACK frames. | |||
| o All other frame types MUST only be sent in the application data | o All other frame types MUST only be sent in the application data | |||
| packet number space. | packet number space. | |||
| Note that it is not possible to send the following frames in 0-RTT | Note that it is not possible to send the following frames in 0-RTT | |||
| packets for various reasons: ACK, CRYPTO, HANDSHAKE_DONE, NEW_TOKEN, | packets for various reasons: ACK, CRYPTO, HANDSHAKE_DONE, NEW_TOKEN, | |||
| PATH_RESPONSE, and RETIRE_CONNECTION_ID. A server MAY treat receipt | PATH_RESPONSE, and RETIRE_CONNECTION_ID. A server MAY treat receipt | |||
| of these frames in 0-RTT packets as a connection error of type | of these frames in 0-RTT packets as a connection error of type | |||
| skipping to change at page 88, line 40 ¶ | skipping to change at page 87, line 40 ¶ | |||
| progress. Implementations are advised to include as few streams as | progress. Implementations are advised to include as few streams as | |||
| necessary in outgoing packets without losing transmission efficiency | necessary in outgoing packets without losing transmission efficiency | |||
| to underfilled packets. | to underfilled packets. | |||
| 13.1. Packet Processing | 13.1. Packet Processing | |||
| A packet MUST NOT be acknowledged until packet protection has been | A packet MUST NOT be acknowledged until packet protection has been | |||
| successfully removed and all frames contained in the packet have been | successfully removed and all frames contained in the packet have been | |||
| processed. For STREAM frames, this means the data has been enqueued | processed. For STREAM frames, this means the data has been enqueued | |||
| in preparation to be received by the application protocol, but it | in preparation to be received by the application protocol, but it | |||
| does not require that data is delivered and consumed. | does not require that data be 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. | number of the received packet. | |||
| An endpoint SHOULD treat receipt of an acknowledgment for a packet it | An endpoint SHOULD treat receipt of an acknowledgment for a packet it | |||
| did not send as a connection error of type PROTOCOL_VIOLATION, if it | did not send as a connection error of type PROTOCOL_VIOLATION, if it | |||
| is able to detect the condition. Further discussion of how this | is able to detect the condition. For further discussion of how this | |||
| might be achieved is in Section 21.4. | might be achieved, see Section 21.4. | |||
| 13.2. Generating Acknowledgments | 13.2. Generating Acknowledgments | |||
| Endpoints acknowledge all packets they receive and process. However, | Endpoints acknowledge all packets they receive and process. However, | |||
| only ack-eliciting packets cause an ACK frame to be sent within the | only ack-eliciting packets cause an ACK frame to be sent within the | |||
| maximum ack delay. Packets that are not ack-eliciting are only | maximum ack delay. Packets that are not ack-eliciting are only | |||
| acknowledged when an ACK frame is sent for other reasons. | acknowledged when an ACK frame is sent for other reasons. | |||
| When sending a packet for any reason, an endpoint SHOULD attempt to | When sending a packet for any reason, an endpoint SHOULD attempt to | |||
| include an ACK frame if one has not been sent recently. Doing so | include an ACK frame if one has not been sent recently. Doing so | |||
| skipping to change at page 90, line 5 ¶ | skipping to change at page 89, line 5 ¶ | |||
| controlled, an endpoint MUST NOT send more than one such packet in | controlled, an endpoint MUST NOT send more than one such packet in | |||
| response to receiving an ack-eliciting packet. | response to receiving an ack-eliciting packet. | |||
| An endpoint MUST NOT send a non-ack-eliciting packet in response to a | An endpoint MUST NOT send a non-ack-eliciting packet in response to a | |||
| non-ack-eliciting packet, even if there are packet gaps that precede | non-ack-eliciting packet, even if there are packet gaps that precede | |||
| the received packet. This avoids an infinite feedback loop of | the received packet. This avoids an infinite feedback loop of | |||
| acknowledgments, which could prevent the connection from ever | acknowledgments, which could prevent the connection from ever | |||
| becoming idle. Non-ack-eliciting packets are eventually acknowledged | becoming idle. Non-ack-eliciting packets are eventually acknowledged | |||
| when the endpoint sends an ACK frame in response to other events. | when the endpoint sends an ACK frame in response to other events. | |||
| An endpoint that is only sending ACK frames will not receive | ||||
| acknowledgments from its peer unless those acknowledgments are | ||||
| included in packets with ack-eliciting frames. An endpoint SHOULD | ||||
| send an ACK frame with other frames when there are new ack-eliciting | ||||
| packets to acknowledge. When only non-ack-eliciting packets need to | ||||
| be acknowledged, an endpoint MAY choose not to send an ACK frame with | ||||
| outgoing frames until an ack-eliciting packet has been received. | ||||
| An endpoint that is only sending non-ack-eliciting packets might | ||||
| choose to occasionally add an ack-eliciting frame to those packets to | ||||
| ensure that it receives an acknowledgment; see Section 13.2.4. In | ||||
| that case, an endpoint MUST NOT send an ack-eliciting frame in all | ||||
| packets that would otherwise be non-ack-eliciting, to avoid an | ||||
| infinite feedback loop of acknowledgments. | ||||
| In order to assist loss detection at the sender, an endpoint SHOULD | In order to assist loss detection at the sender, an endpoint SHOULD | |||
| generate and send an ACK frame without delay when it receives an ack- | generate and send an ACK frame without delay when it receives an ack- | |||
| eliciting packet either: | eliciting packet either: | |||
| o when the received packet has a packet number less than another | o when the received packet has a packet number less than another | |||
| ack-eliciting packet that has been received, or | ack-eliciting packet that has been received, or | |||
| o when the packet has a packet number larger than the highest- | o when the packet has a packet number larger than the highest- | |||
| numbered ack-eliciting packet that has been received and there are | numbered ack-eliciting packet that has been received and there are | |||
| missing packets between that packet and this packet. | missing packets between that packet and this packet. | |||
| skipping to change at page 90, line 27 ¶ | skipping to change at page 89, line 42 ¶ | |||
| codepoint in the IP header SHOULD be acknowledged immediately, to | codepoint in the IP header SHOULD be acknowledged immediately, to | |||
| reduce the peer's response time to congestion events. | reduce the peer's response time to congestion events. | |||
| The algorithms in [QUIC-RECOVERY] are expected to be resilient to | The algorithms in [QUIC-RECOVERY] are expected to be resilient to | |||
| receivers that do not follow the guidance offered above. However, an | receivers that do not follow the guidance offered above. However, an | |||
| implementation should only deviate from these requirements after | implementation should only deviate from these requirements after | |||
| careful consideration of the performance implications of a change, | careful consideration of the performance implications of a change, | |||
| for connections made by the endpoint and for other users of the | for connections made by the endpoint and for other users of the | |||
| network. | network. | |||
| An endpoint that is only sending ACK frames will not receive | ||||
| acknowledgments from its peer unless those acknowledgments are | ||||
| included in packets with ack-eliciting frames. An endpoint SHOULD | ||||
| send an ACK frame with other frames when there are new ack-eliciting | ||||
| packets to acknowledge. When only non-ack-eliciting packets need to | ||||
| be acknowledged, an endpoint MAY wait until an ack-eliciting packet | ||||
| has been received to include an ACK frame with outgoing frames. | ||||
| A receiver MUST NOT send an ack-eliciting frame in all packets that | ||||
| would otherwise be non-ack-eliciting, to avoid an infinite feedback | ||||
| loop of acknowledgments. | ||||
| 13.2.2. Acknowledgment Frequency | 13.2.2. Acknowledgment Frequency | |||
| A receiver determines how frequently to send acknowledgments in | A receiver determines how frequently to send acknowledgments in | |||
| response to ack-eliciting packets. This determination involves a | response to ack-eliciting packets. This determination involves a | |||
| trade-off. | trade-off. | |||
| Endpoints rely on timely acknowledgment to detect loss; see Section 6 | Endpoints rely on timely acknowledgment to detect loss; see Section 6 | |||
| of [QUIC-RECOVERY]. Window-based congestion controllers, such as the | of [QUIC-RECOVERY]. Window-based congestion controllers, such as the | |||
| one in Section 7 of [QUIC-RECOVERY], rely on acknowledgments to | one described in Section 7 of [QUIC-RECOVERY], rely on | |||
| manage their congestion window. In both cases, delaying | acknowledgments to manage their congestion window. In both cases, | |||
| acknowledgments can adversely affect performance. | delaying acknowledgments can adversely affect performance. | |||
| On the other hand, reducing the frequency of packets that carry only | On the other hand, reducing the frequency of packets that carry only | |||
| acknowledgments reduces packet transmission and processing cost at | acknowledgments reduces packet transmission and processing cost at | |||
| both endpoints. It can improve connection throughput on severely | both endpoints. It can improve connection throughput on severely | |||
| asymmetric links and reduce the volume of acknowledgment traffic | asymmetric links and reduce the volume of acknowledgment traffic | |||
| using return path capacity; see Section 3 of [RFC3449]. | using return path capacity; see Section 3 of [RFC3449]. | |||
| A receiver SHOULD send an ACK frame after receiving at least two ack- | A receiver SHOULD send an ACK frame after receiving at least two ack- | |||
| eliciting packets. This recommendation is general in nature and | eliciting packets. This recommendation is general in nature and | |||
| consistent with recommendations for TCP endpoint behavior [RFC5681]. | consistent with recommendations for TCP endpoint behavior [RFC5681]. | |||
| skipping to change at page 91, line 27 ¶ | skipping to change at page 90, line 30 ¶ | |||
| whether to send an ACK frame in response. | whether to send an ACK frame in response. | |||
| 13.2.3. Managing ACK Ranges | 13.2.3. Managing ACK Ranges | |||
| When an ACK frame is sent, one or more ranges of acknowledged packets | When an ACK frame is sent, one or more ranges of acknowledged packets | |||
| are included. Including acknowledgments for older packets reduces | are included. Including acknowledgments for older packets reduces | |||
| the chance of spurious retransmissions caused by losing previously | the chance of spurious retransmissions caused by losing previously | |||
| sent ACK frames, at the cost of larger ACK frames. | sent ACK frames, at the cost of larger ACK frames. | |||
| ACK frames SHOULD always acknowledge the most recently received | ACK frames SHOULD always acknowledge the most recently received | |||
| packets, and the more out-of-order the packets are, the more | packets, and the more out of order the packets are, the more | |||
| important it is to send an updated ACK frame quickly, to prevent the | important it is to send an updated ACK frame quickly, to prevent the | |||
| peer from declaring a packet as lost and spuriously retransmitting | peer from declaring a packet as lost and spuriously retransmitting | |||
| the frames it contains. An ACK frame is expected to fit within a | the frames it contains. An ACK frame is expected to fit within a | |||
| single QUIC packet. If it does not, then older ranges (those with | single QUIC packet. If it does not, then older ranges (those with | |||
| the smallest packet numbers) are omitted. | the smallest packet numbers) are omitted. | |||
| A receiver limits the number of ACK Ranges (Section 19.3.1) it | A receiver limits the number of ACK Ranges (Section 19.3.1) it | |||
| remembers and sends in ACK frames, both to limit the size of ACK | remembers and sends in ACK frames, both to limit the size of ACK | |||
| frames and to avoid resource exhaustion. After receiving | frames and to avoid resource exhaustion. After receiving | |||
| acknowledgments for an ACK frame, the receiver SHOULD stop tracking | acknowledgments for an ACK frame, the receiver SHOULD stop tracking | |||
| skipping to change at page 92, line 4 ¶ | skipping to change at page 91, line 7 ¶ | |||
| It is possible that retaining many ACK Ranges could cause an ACK | It is possible that retaining many ACK Ranges could cause an ACK | |||
| frame to become too large. A receiver can discard unacknowledged ACK | frame to become too large. A receiver can discard unacknowledged ACK | |||
| Ranges to limit ACK frame size, at the cost of increased | Ranges to limit ACK frame size, at the cost of increased | |||
| retransmissions from the sender. This is necessary if an ACK frame | retransmissions from the sender. This is necessary if an ACK frame | |||
| would be too large to fit in a packet. Receivers MAY also limit ACK | would be too large to fit in a packet. Receivers MAY also limit ACK | |||
| frame size further to preserve space for other frames or to limit the | frame size further to preserve space for other frames or to limit the | |||
| capacity that acknowledgments consume. | capacity that acknowledgments consume. | |||
| A receiver MUST retain an ACK Range unless it can ensure that it will | A receiver MUST retain an ACK Range unless it can ensure that it will | |||
| not subsequently accept packets with numbers in that range. | not subsequently accept packets with numbers in that range. | |||
| Maintaining a minimum packet number that increases as ranges are | Maintaining a minimum packet number that increases as ranges are | |||
| discarded is one way to achieve this with minimal state. | discarded is one way to achieve this with minimal state. | |||
| Receivers can discard all ACK Ranges, but they MUST retain the | Receivers can discard all ACK Ranges, but they MUST retain the | |||
| largest packet number that has been successfully processed as that is | largest packet number that has been successfully processed, as that | |||
| used to recover packet numbers from subsequent packets; see | is used to recover packet numbers from subsequent packets; see | |||
| Section 17.1. | Section 17.1. | |||
| A receiver SHOULD include an ACK Range containing the largest | A receiver SHOULD include an ACK Range containing the largest | |||
| received packet number in every ACK frame. The Largest Acknowledged | received packet number in every ACK frame. The Largest Acknowledged | |||
| field is used in ECN validation at a sender and including a lower | field is used in ECN validation at a sender, and including a lower | |||
| value than what was included in a previous ACK frame could cause ECN | value than what was included in a previous ACK frame could cause ECN | |||
| to be unnecessarily disabled; see Section 13.4.2. | to be unnecessarily disabled; see Section 13.4.2. | |||
| Section 13.2.4 describes an exemplary approach for determining what | Section 13.2.4 describes an exemplary approach for determining what | |||
| packets to acknowledge in each ACK frame. Though the goal of this | packets to acknowledge in each ACK frame. Though the goal of this | |||
| algorithm is to generate an acknowledgment for every packet that is | algorithm is to generate an acknowledgment for every packet that is | |||
| processed, it is still possible for acknowledgments to be lost. | processed, it is still possible for acknowledgments to be lost. | |||
| 13.2.4. Limiting Ranges by Tracking ACK Frames | 13.2.4. Limiting Ranges by Tracking ACK Frames | |||
| When a packet containing an ACK frame is sent, the largest | When a packet containing an ACK frame is sent, the Largest | |||
| acknowledged in that frame can be saved. When a packet containing an | Acknowledged field in that frame can be saved. When a packet | |||
| ACK frame is acknowledged, the receiver can stop acknowledging | containing an ACK frame is acknowledged, the receiver can stop | |||
| packets less than or equal to the largest acknowledged in the sent | acknowledging packets less than or equal to the Largest Acknowledged | |||
| ACK frame. | field in the sent ACK frame. | |||
| A receiver that sends only non-ack-eliciting packets, such as ACK | A receiver that sends only non-ack-eliciting packets, such as ACK | |||
| frames, might not receive an acknowledgment for a long period of | frames, might not receive an acknowledgment for a long period of | |||
| time. This could cause the receiver to maintain state for a large | time. This could cause the receiver to maintain state for a large | |||
| number of ACK frames for a long period of time, and ACK frames it | number of ACK frames for a long period of time, and ACK frames it | |||
| sends could be unnecessarily large. In such a case, a receiver could | sends could be unnecessarily large. In such a case, a receiver could | |||
| send a PING or other small ack-eliciting frame occasionally, such as | send a PING or other small ack-eliciting frame occasionally, such as | |||
| once per round trip, to elicit an ACK from the peer. | once per round trip, to elicit an ACK from the peer. | |||
| In cases without ACK frame loss, this algorithm allows for a minimum | In cases without ACK frame loss, this algorithm allows for a minimum | |||
| of 1 RTT of reordering. In cases with ACK frame loss and reordering, | of 1 RTT of reordering. In cases with ACK frame loss and reordering, | |||
| this approach does not guarantee that every acknowledgment is seen by | this approach does not guarantee that every acknowledgment is seen by | |||
| the sender before it is no longer included in the ACK frame. Packets | the sender before it is no longer included in the ACK frame. Packets | |||
| could be received out of order and all subsequent ACK frames | could be received out of order, and all subsequent ACK frames | |||
| containing them could be lost. In this case, the loss recovery | containing them could be lost. In this case, the loss recovery | |||
| algorithm could cause spurious retransmissions, but the sender will | algorithm could cause spurious retransmissions, but the sender will | |||
| continue making forward progress. | continue making forward progress. | |||
| 13.2.5. Measuring and Reporting Host Delay | 13.2.5. Measuring and Reporting Host Delay | |||
| An endpoint measures the delays intentionally introduced between the | An endpoint measures the delays intentionally introduced between the | |||
| time the packet with the largest packet number is received and the | time the packet with the largest packet number is received and the | |||
| time an acknowledgment is sent. The endpoint encodes this | time an acknowledgment is sent. The endpoint encodes this | |||
| acknowledgment delay in the ACK Delay field of an ACK frame; see | acknowledgment delay in the ACK Delay field of an ACK frame; see | |||
| skipping to change at page 94, line 14 ¶ | skipping to change at page 93, line 14 ¶ | |||
| 13.3. Retransmission of Information | 13.3. 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 Data sent in CRYPTO frames is retransmitted according to the rules | o Data sent in CRYPTO frames is retransmitted according to the rules | |||
| in [QUIC-RECOVERY], until all data has been acknowledged. Data in | in [QUIC-RECOVERY], until all data has been acknowledged. Data in | |||
| CRYPTO frames for Initial and Handshake packets is discarded when | CRYPTO frames for Initial and Handshake packets is discarded when | |||
| keys for the corresponding packet number space are discarded. | keys for the corresponding packet number space are discarded. | |||
| 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 RESET_STREAM for that | STREAM frames unless the endpoint has sent a RESET_STREAM for that | |||
| skipping to change at page 94, line 49 ¶ | skipping to change at page 93, line 49 ¶ | |||
| The content of a RESET_STREAM frame MUST NOT change when it is | The content of a RESET_STREAM frame MUST NOT change when it is | |||
| sent again. | 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 receiving part of the | a STOP_SENDING frame, is sent until the receiving part of the | |||
| stream enters either a "Data Recvd" or "Reset Recvd" state; see | stream enters either a "Data Recvd" or "Reset Recvd" state; see | |||
| Section 3.5. | Section 3.5. | |||
| o Connection close signals, including packets that contain | o Connection close signals, including packets that contain | |||
| CONNECTION_CLOSE frames, are not sent again when packet loss is | CONNECTION_CLOSE frames, are not sent again when packet loss is | |||
| detected, but as described in Section 10. | detected. Resending these signals is described in Section 10. | |||
| 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; see Section 4.2. | MAX_DATA frames to be sent; see Section 4.2. | |||
| 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 | |||
| frames. Like MAX_DATA, an updated value is sent when the packet | frames. Like MAX_DATA, an updated value is sent when the packet | |||
| containing the most recent MAX_STREAM_DATA frame for a stream is | containing the most recent MAX_STREAM_DATA frame for a stream is | |||
| lost or when the limit is updated, with care taken to prevent the | lost or when the limit is updated, with care taken to prevent the | |||
| frame from being sent too often. An endpoint SHOULD stop sending | frame from being sent too often. An endpoint SHOULD stop sending | |||
| MAX_STREAM_DATA frames when the receiving part of the stream | MAX_STREAM_DATA frames when the receiving part of the stream | |||
| enters a "Size Known" or "Reset Recvd" state. | enters a "Size Known" or "Reset Recvd" state. | |||
| o The limit on streams of a given type is sent in MAX_STREAMS | o The limit on streams of a given type is sent in MAX_STREAMS | |||
| frames. Like MAX_DATA, an updated value is sent when a packet | frames. Like MAX_DATA, an updated value is sent when a packet | |||
| containing the most recent MAX_STREAMS for a stream type frame is | containing the most recent MAX_STREAMS for a stream type frame is | |||
| declared lost or when the limit is updated, with care taken to | declared lost or when the limit is updated, with care taken to | |||
| prevent the frame from being sent too often. | prevent the frame from being sent too often. | |||
| o Blocked signals are carried in DATA_BLOCKED, STREAM_DATA_BLOCKED, | o Blocked signals are carried in DATA_BLOCKED, STREAM_DATA_BLOCKED, | |||
| and STREAMS_BLOCKED frames. DATA_BLOCKED frames have connection | and STREAMS_BLOCKED frames. DATA_BLOCKED frames have connection | |||
| scope, STREAM_DATA_BLOCKED frames have stream scope, and | scope, STREAM_DATA_BLOCKED frames have stream scope, and | |||
| STREAMS_BLOCKED frames are scoped to a specific stream type. New | STREAMS_BLOCKED frames are scoped to a specific stream type. A | |||
| frames are sent if packets containing the most recent frame for a | new frame is sent if a packet containing the most recent frame for | |||
| scope is lost, but only while the endpoint is blocked on the | a scope is lost, but only while the endpoint is blocked on the | |||
| corresponding limit. These frames always include the limit that | corresponding limit. These frames always include the limit that | |||
| is causing blocking at the time that they are transmitted. | is causing blocking at the time that they are transmitted. | |||
| o A liveness or path validation check using PATH_CHALLENGE frames is | o A liveness or path validation check using PATH_CHALLENGE frames is | |||
| sent periodically until a matching PATH_RESPONSE frame is received | sent periodically until a matching PATH_RESPONSE frame is received | |||
| or until there is no remaining need for liveness or path | or until there is no remaining need for liveness or path | |||
| validation checking. PATH_CHALLENGE frames include a different | validation checking. PATH_CHALLENGE frames include a different | |||
| payload each time they are sent. | payload each time they are sent. | |||
| o Responses to path validation using PATH_RESPONSE frames are sent | o Responses to path validation using PATH_RESPONSE frames are sent | |||
| skipping to change at page 96, line 21 ¶ | skipping to change at page 95, line 21 ¶ | |||
| acknowledged. | acknowledged. | |||
| Endpoints SHOULD prioritize retransmission of data over sending new | Endpoints SHOULD prioritize retransmission of data over sending new | |||
| data, unless priorities specified by the application indicate | data, unless priorities specified by the application indicate | |||
| otherwise; see Section 2.3. | otherwise; see Section 2.3. | |||
| Even though a sender is encouraged to assemble frames containing up- | Even though a sender is encouraged to assemble frames containing up- | |||
| to-date information every time it sends a packet, it is not forbidden | to-date information every time it sends a packet, it is not forbidden | |||
| to retransmit copies of frames from lost packets. A sender that | to retransmit copies of frames from lost packets. A sender that | |||
| retransmits copies of frames needs to handle decreases in available | retransmits copies of frames needs to handle decreases in available | |||
| payload size due to change in packet number length, connection ID | payload size due to changes in packet number length, connection ID | |||
| length, and path MTU. A receiver MUST accept packets containing an | length, and path MTU. A receiver MUST accept packets containing an | |||
| outdated frame, such as a MAX_DATA frame carrying a smaller maximum | outdated frame, such as a MAX_DATA frame carrying a smaller maximum | |||
| data than one found in an older packet. | data value than one found in an older packet. | |||
| A sender SHOULD avoid retransmitting information from packets once | A sender SHOULD avoid retransmitting information from packets once | |||
| they are acknowledged. This includes packets that are acknowledged | they are acknowledged. This includes packets that are acknowledged | |||
| after being declared lost, which can happen in the presence of | after being declared lost, which can happen in the presence of | |||
| network reordering. Doing so requires senders to retain information | network reordering. Doing so requires senders to retain information | |||
| about packets after they are declared lost. A sender can discard | about packets after they are declared lost. A sender can discard | |||
| this information after a period of time elapses that adequately | this information after a period of time elapses that adequately | |||
| allows for reordering, such as a PTO (Section 6.2 of | allows for reordering, such as a PTO (Section 6.2 of | |||
| [QUIC-RECOVERY]), or on other events, such as reaching a memory | [QUIC-RECOVERY]), or based on other events, such as reaching a memory | |||
| limit. | limit. | |||
| 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]. | |||
| 13.4. Explicit Congestion Notification | 13.4. Explicit Congestion Notification | |||
| QUIC endpoints can use Explicit Congestion Notification (ECN) | QUIC endpoints can use ECN [RFC3168] to detect and respond to network | |||
| [RFC3168] to detect and respond to network congestion. ECN allows an | congestion. ECN allows an endpoint to set an ECN-Capable Transport | |||
| endpoint to set an ECT codepoint in the ECN field of an IP packet. A | (ECT) codepoint in the ECN field of an IP packet. A network node can | |||
| network node can then indicate congestion by setting the CE codepoint | then indicate congestion by setting the ECN-CE codepoint in the ECN | |||
| in the ECN field instead of dropping the packet [RFC8087]. Endpoints | field instead of dropping the packet [RFC8087]. Endpoints react to | |||
| react to reported congestion by reducing their sending rate in | reported congestion by reducing their sending rate in response, as | |||
| response, as described in [QUIC-RECOVERY]. | described in [QUIC-RECOVERY]. | |||
| To enable ECN, a sending QUIC endpoint first determines whether a | To enable ECN, a sending QUIC endpoint first determines whether a | |||
| path supports ECN marking and whether the peer reports the ECN values | path supports ECN marking and whether the peer reports the ECN values | |||
| in received IP headers; see Section 13.4.2. | in received IP headers; see Section 13.4.2. | |||
| 13.4.1. Reporting ECN Counts | 13.4.1. Reporting ECN Counts | |||
| Use of ECN requires the receiving endpoint to read the ECN field from | The use of ECN requires the receiving endpoint to read the ECN field | |||
| an IP packet, which is not possible on all platforms. If an endpoint | from an IP packet, which is not possible on all platforms. If an | |||
| does not implement ECN support or does not have access to received | endpoint does not implement ECN support or does not have access to | |||
| ECN fields, it does not report ECN counts for packets it receives. | received ECN fields, it does not report ECN counts for packets it | |||
| receives. | ||||
| Even if an endpoint does not set an ECT field on packets it sends, | Even if an endpoint does not set an ECT field in packets it sends, | |||
| the endpoint MUST provide feedback about ECN markings it receives, if | the endpoint MUST provide feedback about ECN markings it receives, if | |||
| these are accessible. Failing to report the ECN counts will cause | these are accessible. Failing to report the ECN counts will cause | |||
| the sender to disable use of ECN for this connection. | the sender to disable the use of ECN for this connection. | |||
| On receiving an IP packet with an ECT(0), ECT(1) or CE codepoint, an | On receiving an IP packet with an ECT(0), ECT(1), or ECN-CE | |||
| ECN-enabled endpoint accesses the ECN field and increases the | codepoint, an ECN-enabled endpoint accesses the ECN field and | |||
| corresponding ECT(0), ECT(1), or CE count. These ECN counts are | increases the corresponding ECT(0), ECT(1), or ECN-CE count. These | |||
| included in subsequent ACK frames; see Section 13.2 and Section 19.3. | ECN counts are included in subsequent ACK frames; see Sections 13.2 | |||
| and 19.3. | ||||
| Each packet number space maintains separate acknowledgment state and | Each packet number space maintains separate acknowledgment state and | |||
| separate ECN counts. Coalesced QUIC packets (see Section 12.2) share | separate ECN counts. Coalesced QUIC packets (see Section 12.2) share | |||
| the same IP header so the ECN counts are incremented once for each | the same IP header so the ECN counts are incremented once for each | |||
| coalesced QUIC packet. | coalesced QUIC packet. | |||
| For example, if one each of an Initial, Handshake, and 1-RTT QUIC | For example, if one each of an Initial, Handshake, and 1-RTT QUIC | |||
| packet are coalesced into a single UDP datagram, the ECN counts for | packet are coalesced into a single UDP datagram, the ECN counts for | |||
| all three packet number spaces will be incremented by one each, based | all three packet number spaces will be incremented by one each, based | |||
| on the ECN field of the single IP header. | on the ECN field of the single IP header. | |||
| skipping to change at page 97, line 46 ¶ | skipping to change at page 96, line 48 ¶ | |||
| ECN counts are only incremented when QUIC packets from the received | ECN counts are only incremented when QUIC packets from the received | |||
| IP packet are processed. As such, duplicate QUIC packets are not | IP packet are processed. As such, duplicate QUIC packets are not | |||
| processed and do not increase ECN counts; see Section 21.10 for | processed and do not increase ECN counts; see Section 21.10 for | |||
| relevant security concerns. | relevant security concerns. | |||
| 13.4.2. ECN Validation | 13.4.2. ECN Validation | |||
| It is possible for faulty network devices to corrupt or erroneously | It is possible for faulty network devices to corrupt or erroneously | |||
| drop packets that carry a non-zero ECN codepoint. To ensure | drop packets that carry a non-zero ECN codepoint. To ensure | |||
| connectivity in the presence of such devices, an endpoint validates | connectivity in the presence of such devices, an endpoint validates | |||
| the ECN counts for each network path and disables use of ECN on that | the ECN counts for each network path and disables the use of ECN on | |||
| path if errors are detected. | that path if errors are detected. | |||
| To perform ECN validation for a new path: | To perform ECN validation for a new path: | |||
| o The endpoint sets an ECT(0) codepoint in the IP header of early | o The endpoint sets an ECT(0) codepoint in the IP header of early | |||
| outgoing packets sent on a new path to the peer ([RFC8311]). | outgoing packets sent on a new path to the peer [RFC8311]. | |||
| o The endpoint monitors whether all packets sent with an ECT | o The endpoint monitors whether all packets sent with an ECT | |||
| codepoint are eventually deemed lost (Section 6 of | codepoint are eventually deemed lost (Section 6 of | |||
| [QUIC-RECOVERY]), indicating that ECN validation has failed. | [QUIC-RECOVERY]), indicating that ECN validation has failed. | |||
| If an endpoint has cause to expect that IP packets with an ECT | If an endpoint has cause to expect that IP packets with an ECT | |||
| codepoint might be dropped by a faulty network element, the endpoint | codepoint might be dropped by a faulty network element, the endpoint | |||
| could set an ECT codepoint for only the first ten outgoing packets on | could set an ECT codepoint for only the first ten outgoing packets on | |||
| a path, or for a period of three PTOs (see Section 6.2 of | a path, or for a period of three PTOs (see Section 6.2 of | |||
| [QUIC-RECOVERY]). If all packets marked with non-zero ECN codepoints | [QUIC-RECOVERY]). If all packets marked with non-zero ECN codepoints | |||
| skipping to change at page 98, line 30 ¶ | skipping to change at page 97, line 33 ¶ | |||
| one possible algorithm. | one possible algorithm. | |||
| Other methods of probing paths for ECN support are possible, as are | Other methods of probing paths for ECN support are possible, as are | |||
| different marking strategies. Implementations MAY use other methods | different marking strategies. Implementations MAY use other methods | |||
| defined in RFCs; see [RFC8311]. Implementations that use the ECT(1) | defined in RFCs; see [RFC8311]. Implementations that use the ECT(1) | |||
| codepoint need to perform ECN validation using the reported ECT(1) | codepoint need to perform ECN validation using the reported ECT(1) | |||
| counts. | counts. | |||
| 13.4.2.1. Receiving ACK Frames with ECN Counts | 13.4.2.1. Receiving ACK Frames with ECN Counts | |||
| Erroneous application of CE markings by the network can result in | Erroneous application of ECN-CE markings by the network can result in | |||
| degraded connection performance. An endpoint that receives an ACK | degraded connection performance. An endpoint that receives an ACK | |||
| frame with ECN counts therefore validates the counts before using | frame with ECN counts therefore validates the counts before using | |||
| them. It performs this validation by comparing newly received counts | them. It performs this validation by comparing newly received counts | |||
| against those from the last successfully processed ACK frame. Any | against those from the last successfully processed ACK frame. Any | |||
| increase in the ECN counts is validated based on the ECN markings | increase in the ECN counts is validated based on the ECN markings | |||
| that were applied to packets that are newly acknowledged in the ACK | that were applied to packets that are newly acknowledged in the ACK | |||
| frame. | frame. | |||
| If an ACK frame newly acknowledges a packet that the endpoint sent | If an ACK frame newly acknowledges a packet that the endpoint sent | |||
| with either the ECT(0) or ECT(1) codepoint set, ECN validation fails | with either the ECT(0) or ECT(1) codepoint set, ECN validation fails | |||
| skipping to change at page 99, line 36 ¶ | skipping to change at page 98, line 38 ¶ | |||
| If validation fails, then the endpoint MUST disable ECN. It stops | If validation fails, then the endpoint MUST disable ECN. It stops | |||
| setting the ECT codepoint in IP packets that it sends, assuming that | setting the ECT codepoint in IP packets that it sends, assuming that | |||
| either the network path or the peer does not support ECN. | either the network path or the peer does not support ECN. | |||
| Even if validation fails, an endpoint MAY revalidate ECN for the same | Even if validation fails, an endpoint MAY revalidate ECN for the same | |||
| path at any later time in the connection. An endpoint could continue | path at any later time in the connection. An endpoint could continue | |||
| to periodically attempt validation. | to periodically attempt validation. | |||
| Upon successful validation, an endpoint MAY continue to set an ECT | Upon successful validation, an endpoint MAY continue to set an ECT | |||
| codepoint in subsequent packets it sends, with the expectation that | codepoint in subsequent packets it sends, with the expectation that | |||
| the path is ECN-capable. Network routing and path elements can | the path is ECN capable. Network routing and path elements can | |||
| however change mid-connection; an endpoint MUST disable ECN if | change mid-connection; an endpoint MUST disable ECN if validation | |||
| validation later fails. | later fails. | |||
| 14. Datagram Size | 14. Datagram Size | |||
| A UDP datagram can include one or more QUIC packets. The datagram | A UDP datagram can include one or more QUIC packets. The datagram | |||
| size refers to the total UDP payload size of a single UDP datagram | size refers to the total UDP payload size of a single UDP datagram | |||
| carrying QUIC packets. The datagram size includes one or more QUIC | carrying QUIC packets. The datagram size includes one or more QUIC | |||
| packet headers and protected payloads, but not the UDP or IP headers. | packet headers and protected payloads, but not the UDP or IP headers. | |||
| The maximum datagram size is defined as the largest size of UDP | The maximum datagram size is defined as the largest size of UDP | |||
| payload that can be sent across a network path using a single UDP | payload that can be sent across a network path using a single UDP | |||
| datagram. QUIC MUST NOT be used if the network path cannot support a | datagram. QUIC MUST NOT be used if the network path cannot support a | |||
| maximum datagram size of at least 1200 bytes. | maximum datagram size of at least 1200 bytes. | |||
| QUIC assumes a minimum IP packet size of at least 1280 bytes. This | QUIC assumes a minimum IP packet size of at least 1280 bytes. This | |||
| is the IPv6 minimum size ([IPv6]) and is also supported by most | is the IPv6 minimum size [IPv6] and is also supported by most modern | |||
| modern IPv4 networks. Assuming the minimum IP header size of 40 | IPv4 networks. Assuming the minimum IP header size of 40 bytes for | |||
| bytes for IPv6 and 20 bytes for IPv4 and a UDP header size of 8 | IPv6 and 20 bytes for IPv4 and a UDP header size of 8 bytes, this | |||
| bytes, this results in a maximum datagram size of 1232 bytes for IPv6 | results in a maximum datagram size of 1232 bytes for IPv6 and 1252 | |||
| and 1252 bytes for IPv4. Thus, modern IPv4 and all IPv6 network | bytes for IPv4. Thus, modern IPv4 and all IPv6 network paths are | |||
| paths are expected to be able to support QUIC. | expected to be able to support QUIC. | |||
| Note: This requirement to support a UDP payload of 1200 bytes limits | Note: This requirement to support a UDP payload of 1200 bytes | |||
| the space available for IPv6 extension headers to 32 bytes or IPv4 | limits the space available for IPv6 extension headers to 32 bytes | |||
| options to 52 bytes if the path only supports the IPv6 minimum MTU | or IPv4 options to 52 bytes if the path only supports the IPv6 | |||
| of 1280 bytes. This affects Initial packets and path validation. | minimum MTU of 1280 bytes. This affects Initial packets and path | |||
| validation. | ||||
| Any maximum datagram size larger than 1200 bytes can be discovered | Any maximum datagram size larger than 1200 bytes can be discovered | |||
| using Path Maximum Transmission Unit Discovery (PMTUD; see | using Path Maximum Transmission Unit Discovery (PMTUD) (see | |||
| Section 14.2.1) or Datagram Packetization Layer PMTU Discovery | Section 14.2.1) or Datagram Packetization Layer PMTU Discovery | |||
| (DPLPMTUD; see Section 14.3). | (DPLPMTUD) (see Section 14.3). | |||
| Enforcement of the max_udp_payload_size transport parameter | Enforcement of the max_udp_payload_size transport parameter | |||
| (Section 18.2) might act as an additional limit on the maximum | (Section 18.2) might act as an additional limit on the maximum | |||
| datagram size. A sender can avoid exceeding this limit, once the | datagram size. A sender can avoid exceeding this limit, once the | |||
| value is known. However, prior to learning the value of the | value is known. However, prior to learning the value of the | |||
| transport parameter, endpoints risk datagrams being lost if they send | transport parameter, endpoints risk datagrams being lost if they send | |||
| datagrams larger than the smallest allowed maximum datagram size of | datagrams larger than the smallest allowed maximum datagram size of | |||
| 1200 bytes. | 1200 bytes. | |||
| UDP datagrams MUST NOT be fragmented at the IP layer. In IPv4 | UDP datagrams MUST NOT be fragmented at the IP layer. In IPv4 | |||
| ([IPv4]), the DF bit MUST be set if possible, to prevent | [IPv4], the Don't Fragment (DF) bit MUST be set if possible, to | |||
| fragmentation on the path. | prevent fragmentation on the path. | |||
| QUIC sometimes requires datagrams to be no smaller than a certain | QUIC sometimes requires datagrams to be no smaller than a certain | |||
| size; see Section 8.1 as an example. However, the size of a datagram | size; see Section 8.1 as an example. However, the size of a datagram | |||
| is not authenticated. That is, if an endpoint receives a datagram of | is not authenticated. That is, if an endpoint receives a datagram of | |||
| a certain size, it cannot know that the sender sent the datagram at | a certain size, it cannot know that the sender sent the datagram at | |||
| the same size. Therefore, an endpoint MUST NOT close a connection | the same size. Therefore, an endpoint MUST NOT close a connection | |||
| when it receives a datagram that does not meet size constraints; the | when it receives a datagram that does not meet size constraints; the | |||
| endpoint MAY however discard such datagrams. | endpoint MAY discard such datagrams. | |||
| 14.1. Initial Datagram Size | 14.1. Initial Datagram Size | |||
| A client MUST expand the payload of all UDP datagrams carrying | A client MUST expand the payload of all UDP datagrams carrying | |||
| Initial packets to at least the smallest allowed maximum datagram | Initial packets to at least the smallest allowed maximum datagram | |||
| size of 1200 bytes by adding PADDING frames to the Initial packet or | size of 1200 bytes by adding PADDING frames to the Initial packet or | |||
| by coalescing the Initial packet; see Section 12.2. Initial packets | by coalescing the Initial packet; see Section 12.2. Initial packets | |||
| can even be coalesced with invalid packets, which a receiver will | can even be coalesced with invalid packets, which a receiver will | |||
| discard. Similarly, a server MUST expand the payload of all UDP | discard. Similarly, a server MUST expand the payload of all UDP | |||
| datagrams carrying ack-eliciting Initial packets to at least the | datagrams carrying ack-eliciting Initial packets to at least the | |||
| skipping to change at page 101, line 26 ¶ | skipping to change at page 100, line 30 ¶ | |||
| datagram with a payload that is smaller than the smallest allowed | datagram with a payload that is smaller than the smallest allowed | |||
| maximum datagram size of 1200 bytes. A server MAY also immediately | maximum datagram size of 1200 bytes. A server MAY also immediately | |||
| close the connection by sending a CONNECTION_CLOSE frame with an | close the connection by sending a CONNECTION_CLOSE frame with an | |||
| error code of PROTOCOL_VIOLATION; see Section 10.2.3. | error code of PROTOCOL_VIOLATION; see Section 10.2.3. | |||
| The server MUST also limit the number of bytes it sends before | The server MUST also limit the number of bytes it sends before | |||
| validating the address of the client; see Section 8. | validating the address of the client; see Section 8. | |||
| 14.2. Path Maximum Transmission Unit | 14.2. Path Maximum Transmission Unit | |||
| The Path Maximum Transmission Unit (PMTU) is the maximum size of the | The PMTU is the maximum size of the entire IP packet, including the | |||
| entire IP packet including the IP header, UDP header, and UDP | IP header, UDP header, and UDP payload. The UDP payload includes one | |||
| payload. The UDP payload includes one or more QUIC packet headers | or more QUIC packet headers and protected payloads. The PMTU can | |||
| and protected payloads. The PMTU can depend on path characteristics, | depend on path characteristics and can therefore change over time. | |||
| and can therefore change over time. The largest UDP payload an | The largest UDP payload an endpoint sends at any given time is | |||
| endpoint sends at any given time is referred to as the endpoint's | referred to as the endpoint's maximum datagram size. | |||
| maximum datagram size. | ||||
| An endpoint SHOULD use DPLPMTUD (Section 14.3) or PMTUD | An endpoint SHOULD use DPLPMTUD (Section 14.3) or PMTUD | |||
| (Section 14.2.1) to determine whether the path to a destination will | (Section 14.2.1) to determine whether the path to a destination will | |||
| support a desired maximum datagram size without fragmentation. In | support a desired maximum datagram size without fragmentation. In | |||
| the absence of these mechanisms, QUIC endpoints SHOULD NOT send | the absence of these mechanisms, QUIC endpoints SHOULD NOT send | |||
| datagrams larger than the smallest allowed maximum datagram size. | datagrams larger than the smallest allowed maximum datagram size. | |||
| Both DPLPMTUD and PMTUD send datagrams that are larger than the | Both DPLPMTUD and PMTUD send datagrams that are larger than the | |||
| current maximum datagram size, referred to as PMTU probes. All QUIC | current maximum datagram size, referred to as PMTU probes. All QUIC | |||
| packets that are not sent in a PMTU probe SHOULD be sized to fit | packets that are not sent in a PMTU probe SHOULD be sized to fit | |||
| within the maximum datagram size to avoid the datagram being | within the maximum datagram size to avoid the datagram being | |||
| fragmented or dropped ([RFC8085]). | fragmented or dropped [RFC8085]. | |||
| 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 cannot support the smallest allowed maximum | and remote IP addresses cannot support the smallest allowed maximum | |||
| datagram size of 1200 bytes, it MUST immediately cease sending QUIC | datagram size of 1200 bytes, it MUST immediately cease sending QUIC | |||
| packets, except for those in PMTU probes or those containing | packets, except for those in PMTU probes or those containing | |||
| CONNECTION_CLOSE frames, on the affected path. An endpoint MAY | CONNECTION_CLOSE frames, on the affected path. An endpoint MAY | |||
| terminate the connection if an alternative path cannot be found. | terminate the connection if an alternative path cannot be found. | |||
| Each pair of local and remote addresses could have a different PMTU. | Each pair of local and remote addresses could have a different PMTU. | |||
| QUIC implementations that implement any kind of PMTU discovery | QUIC implementations that implement any kind of PMTU discovery | |||
| therefore SHOULD maintain a maximum datagram size for each | therefore SHOULD maintain a maximum datagram size for each | |||
| combination of local and remote IP addresses. | combination of local and remote IP addresses. | |||
| A QUIC implementation MAY be more conservative in computing the | A QUIC implementation MAY be more conservative in computing the | |||
| maximum datagram size to allow for unknown tunnel overheads or IP | maximum datagram size to allow for unknown tunnel overheads or IP | |||
| header options/extensions. | header options/extensions. | |||
| 14.2.1. Handling of ICMP Messages by PMTUD | 14.2.1. Handling of ICMP Messages by PMTUD | |||
| Path Maximum Transmission Unit Discovery (PMTUD; [RFC1191], | PMTUD [RFC1191] [RFC8201] relies on reception of ICMP messages (that | |||
| [RFC8201]) relies on reception of ICMP messages (e.g., IPv6 Packet | is, IPv6 Packet Too Big (PTB) messages) that indicate when an IP | |||
| Too Big messages) that indicate when an IP packet is dropped because | packet is dropped because it is larger than the local router MTU. | |||
| it is larger than the local router MTU. DPLPMTUD can also optionally | DPLPMTUD can also optionally use these messages. This use of ICMP | |||
| use these messages. This use of ICMP messages is potentially | messages is potentially vulnerable to attacks by entities that cannot | |||
| vulnerable to attacks by entities that cannot observe packets but | observe packets but might successfully guess the addresses used on | |||
| might successfully guess the addresses used on the path. These | the path. These attacks could reduce the PMTU to a bandwidth- | |||
| attacks could reduce the PMTU to a bandwidth-inefficient value. | inefficient value. | |||
| An endpoint MUST ignore an ICMP message that claims the PMTU has | An endpoint MUST ignore an ICMP message that claims the PMTU has | |||
| decreased below QUIC's smallest allowed maximum datagram size. | decreased below QUIC's smallest allowed maximum datagram size. | |||
| The requirements for generating ICMP ([RFC1812], [RFC4443]) state | The requirements for generating ICMP [RFC1812] [RFC4443] state that | |||
| that the quoted packet should contain as much of the original packet | the quoted packet should contain as much of the original packet as | |||
| as possible without exceeding the minimum MTU for the IP version. | possible without exceeding the minimum MTU for the IP version. The | |||
| The size of the quoted packet can actually be smaller, or the | size of the quoted packet can actually be smaller, or the information | |||
| information unintelligible, as described in Section 1.1 of | unintelligible, as described in Section 1.1 of [DPLPMTUD]. | |||
| [DPLPMTUD]. | ||||
| QUIC endpoints using PMTUD SHOULD validate ICMP messages to protect | QUIC endpoints using PMTUD SHOULD validate ICMP messages to protect | |||
| from packet injection as specified in [RFC8201] and Section 5.2 of | from packet injection as specified in [RFC8201] and Section 5.2 of | |||
| [RFC8085]. This validation SHOULD use the quoted packet supplied in | [RFC8085]. This validation SHOULD use the quoted packet supplied in | |||
| the payload of an ICMP message to associate the message with a | the payload of an ICMP message to associate the message with a | |||
| corresponding transport connection (see Section 4.6.1 of [DPLPMTUD]). | corresponding transport connection (see Section 4.6.1 of [DPLPMTUD]). | |||
| ICMP message validation MUST include matching IP addresses and UDP | ICMP message validation MUST include matching IP addresses and UDP | |||
| ports ([RFC8085]) and, when possible, connection IDs to an active | ports [RFC8085] and, when possible, connection IDs to an active QUIC | |||
| QUIC session. The endpoint SHOULD ignore all ICMP messages that fail | session. The endpoint SHOULD ignore all ICMP messages that fail | |||
| validation. | validation. | |||
| An endpoint MUST NOT increase PMTU based on ICMP messages; see | An endpoint MUST NOT increase the PMTU based on ICMP messages; see | |||
| Section 3, clause 6 of [DPLPMTUD]. Any reduction in QUIC's maximum | Item 6 in Section 3 of [DPLPMTUD]. Any reduction in QUIC's maximum | |||
| datagram size in response to ICMP messages MAY be provisional until | datagram size in response to ICMP messages MAY be provisional until | |||
| QUIC's loss detection algorithm determines that the quoted packet has | QUIC's loss detection algorithm determines that the quoted packet has | |||
| actually been lost. | actually been lost. | |||
| 14.3. Datagram Packetization Layer PMTU Discovery | 14.3. Datagram Packetization Layer PMTU Discovery | |||
| Datagram Packetization Layer PMTU Discovery (DPLPMTUD; [DPLPMTUD]) | DPLPMTUD [DPLPMTUD] relies on tracking loss or acknowledgment of QUIC | |||
| relies on tracking loss or acknowledgment of QUIC packets that are | packets that are carried in PMTU probes. PMTU probes for DPLPMTUD | |||
| carried in PMTU probes. PMTU probes for DPLPMTUD that use the | that use the PADDING frame implement "Probing using padding data", as | |||
| PADDING frame implement "Probing using padding data", as defined in | defined in Section 4.1 of [DPLPMTUD]. | |||
| Section 4.1 of [DPLPMTUD]. | ||||
| Endpoints SHOULD set the initial value of BASE_PLPMTU (Section 5.1 of | Endpoints SHOULD set the initial value of BASE_PLPMTU (Section 5.1 of | |||
| [DPLPMTUD]) to be consistent with QUIC's smallest allowed maximum | [DPLPMTUD]) to be consistent with QUIC's smallest allowed maximum | |||
| datagram size. The MIN_PLPMTU is the same as the BASE_PLPMTU. | datagram size. The MIN_PLPMTU is the same as the BASE_PLPMTU. | |||
| QUIC endpoints implementing DPLPMTUD maintain a DPLPMTUD Maximum | QUIC endpoints implementing DPLPMTUD maintain a DPLPMTUD Maximum | |||
| Packet Size (MPS, Section 4.4 of [DPLPMTUD]) for each combination of | Packet Size (MPS) (Section 4.4 of [DPLPMTUD]) for each combination of | |||
| local and remote IP addresses. This corresponds to the maximum | local and remote IP addresses. This corresponds to the maximum | |||
| datagram size. | datagram size. | |||
| 14.3.1. DPLPMTUD and Initial Connectivity | 14.3.1. DPLPMTUD and Initial Connectivity | |||
| From the perspective of DPLPMTUD, QUIC is an acknowledged | From the perspective of DPLPMTUD, QUIC is an acknowledged | |||
| Packetization Layer (PL). A QUIC sender can therefore enter the | Packetization Layer (PL). A QUIC sender can therefore enter the | |||
| DPLPMTUD BASE state (Section 5.2 of [DPLPMTUD]) when the QUIC | DPLPMTUD BASE state (Section 5.2 of [DPLPMTUD]) when the QUIC | |||
| connection handshake has been completed. | connection handshake has been completed. | |||
| 14.3.2. Validating the Network Path with DPLPMTUD | 14.3.2. Validating the Network Path with DPLPMTUD | |||
| QUIC is an acknowledged PL, therefore a QUIC sender does not | QUIC is an acknowledged PL; therefore, a QUIC sender does not | |||
| implement a DPLPMTUD CONFIRMATION_TIMER while in the SEARCH_COMPLETE | implement a DPLPMTUD CONFIRMATION_TIMER while in the SEARCH_COMPLETE | |||
| state; see Section 5.2 of [DPLPMTUD]. | state; see Section 5.2 of [DPLPMTUD]. | |||
| 14.3.3. Handling of ICMP Messages by DPLPMTUD | 14.3.3. Handling of ICMP Messages by DPLPMTUD | |||
| An endpoint using DPLPMTUD requires the validation of any received | An endpoint using DPLPMTUD requires the validation of any received | |||
| ICMP Packet Too Big (PTB) message before using the PTB information, | ICMP PTB message before using the PTB information, as defined in | |||
| as defined in Section 4.6 of [DPLPMTUD]. In addition to UDP port | Section 4.6 of [DPLPMTUD]. In addition to UDP port validation, QUIC | |||
| validation, QUIC validates an ICMP message by using other PL | validates an ICMP message by using other PL information (e.g., | |||
| information (e.g., validation of connection IDs in the quoted packet | validation of connection IDs in the quoted packet of any received | |||
| of any received ICMP message). | ICMP message). | |||
| The considerations for processing ICMP messages described in | The considerations for processing ICMP messages described in | |||
| Section 14.2.1 also apply if these messages are used by DPLPMTUD. | Section 14.2.1 also apply if these messages are used by DPLPMTUD. | |||
| 14.4. Sending QUIC PMTU Probes | 14.4. Sending QUIC PMTU Probes | |||
| PMTU probes are ack-eliciting packets. | PMTU probes are ack-eliciting packets. | |||
| Endpoints could limit the content of PMTU probes to PING and PADDING | Endpoints could limit the content of PMTU probes to PING and PADDING | |||
| frames, since packets that are larger than the current maximum | frames, since packets that are larger than the current maximum | |||
| datagram size are more likely to be dropped by the network. Loss of | datagram size are more likely to be dropped by the network. Loss of | |||
| a QUIC packet that is carried in a PMTU probe is therefore not a | a QUIC packet that is carried in a PMTU probe is therefore not a | |||
| reliable indication of congestion and SHOULD NOT trigger a congestion | reliable indication of congestion and SHOULD NOT trigger a congestion | |||
| control reaction; see Section 3, Bullet 7 of [DPLPMTUD]. However, | control reaction; see Item 7 in Section 3 of [DPLPMTUD]. However, | |||
| PMTU probes consume congestion window, which could delay subsequent | PMTU probes consume congestion window, which could delay subsequent | |||
| transmission by an application. | transmission by an application. | |||
| 14.4.1. PMTU Probes Containing Source Connection ID | 14.4.1. PMTU Probes Containing Source Connection ID | |||
| Endpoints that rely on the destination connection ID for routing | Endpoints that rely on the Destination Connection ID field for | |||
| incoming QUIC packets are likely to require that the connection ID be | routing incoming QUIC packets are likely to require that the | |||
| included in PMTU probes to route any resulting ICMP messages | connection ID be included in PMTU probes to route any resulting ICMP | |||
| (Section 14.2.1) back to the correct endpoint. However, only long | messages (Section 14.2.1) back to the correct endpoint. However, | |||
| header packets (Section 17.2) contain the Source Connection ID field, | only long header packets (Section 17.2) contain the Source Connection | |||
| and long header packets are not decrypted or acknowledged by the peer | ID field, and long header packets are not decrypted or acknowledged | |||
| once the handshake is complete. | by the peer once the handshake is complete. | |||
| One way to construct a PMTU probe is to coalesce (see Section 12.2) a | One way to construct a PMTU probe is to coalesce (see Section 12.2) a | |||
| packet with a long header, such as a Handshake or 0-RTT packet | packet with a long header, such as a Handshake or 0-RTT packet | |||
| (Section 17.2), with a short header packet in a single UDP datagram. | (Section 17.2), with a short header packet in a single UDP datagram. | |||
| If the resulting PMTU probe reaches the endpoint, the packet with the | If the resulting PMTU probe reaches the endpoint, the packet with the | |||
| long header will be ignored, but the short header packet will be | long header will be ignored, but the short header packet will be | |||
| acknowledged. If the PMTU probe causes an ICMP message to be sent, | acknowledged. If the PMTU probe causes an ICMP message to be sent, | |||
| the first part of the probe will be quoted in that message. If the | the first part of the probe will be quoted in that message. If the | |||
| Source Connection ID field is within the quoted portion of the probe, | Source Connection ID field is within the quoted portion of the probe, | |||
| that could be used for routing or validation of the ICMP message. | that could be used for routing or validation of the ICMP message. | |||
| Note: The purpose of using a packet with a long header is only to | Note: The purpose of using a packet with a long header is only to | |||
| ensure that the quoted packet contained in the ICMP message | ensure that the quoted packet contained in the ICMP message | |||
| contains a Source Connection ID field. This packet does not need | contains a Source Connection ID field. This packet does not need | |||
| to be a valid packet and it can be sent even if there is no | to be a valid packet, and it can be sent even if there is no | |||
| current use for packets of that type. | current use for packets of that type. | |||
| 15. Versions | 15. 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. | |||
| skipping to change at page 105, line 9 ¶ | skipping to change at page 104, line 9 ¶ | |||
| across all versions of the protocol are described in | across all versions of the protocol are described in | |||
| [QUIC-INVARIANTS]. | [QUIC-INVARIANTS]. | |||
| Version 0x00000001 of QUIC uses TLS as a cryptographic handshake | Version 0x00000001 of QUIC uses TLS as a cryptographic handshake | |||
| protocol, as described in [QUIC-TLS]. | protocol, as described in [QUIC-TLS]. | |||
| Versions with the most significant 16 bits of the version number | Versions with the most significant 16 bits of the version number | |||
| cleared are reserved for use in future IETF consensus documents. | cleared are reserved for use in future IETF consensus documents. | |||
| Versions that follow the pattern 0x?a?a?a?a are reserved for use in | Versions that follow the pattern 0x?a?a?a?a are reserved for use in | |||
| forcing version negotiation to be exercised. That is, any version | forcing version negotiation to be exercised -- that is, any version | |||
| number where the low four bits of all bytes is 1010 (in binary). A | number where the low four bits of all bytes is 1010 (in binary). A | |||
| client or server MAY advertise support for any of these reserved | client or server MAY advertise support for any of these reserved | |||
| versions. | versions. | |||
| Reserved version numbers will never represent a real protocol; a | Reserved version numbers will never represent a real protocol; a | |||
| client MAY use one of these version numbers with the expectation that | client MAY use one of these version numbers with the expectation that | |||
| the server will initiate version negotiation; a server MAY advertise | the server will initiate version negotiation; a server MAY advertise | |||
| support for one of these versions and can expect that clients ignore | support for one of these versions and can expect that clients ignore | |||
| the value. | the value. | |||
| 16. Variable-Length Integer Encoding | 16. Variable-Length Integer Encoding | |||
| QUIC packets and frames commonly use a variable-length encoding for | QUIC packets and frames commonly use a variable-length encoding for | |||
| non-negative integer values. This encoding ensures that smaller | non-negative integer values. This encoding ensures that smaller | |||
| integer values need fewer bytes to encode. | integer values need fewer bytes 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 byte to encode the base 2 logarithm of | significant bits of the first byte to encode the base-2 logarithm of | |||
| the integer encoding length in bytes. The integer value is encoded | the integer encoding length in bytes. The integer value is encoded | |||
| on the remaining bits, in network byte order. | on the remaining bits, in network byte order. | |||
| This means that integers are encoded on 1, 2, 4, or 8 bytes and can | This means that integers are encoded on 1, 2, 4, or 8 bytes and can | |||
| encode 6-, 14-, 30-, or 62-bit values respectively. Table 4 | encode 6-, 14-, 30-, or 62-bit values, respectively. Table 4 | |||
| summarizes the encoding properties. | summarizes the encoding properties. | |||
| +------+--------+-------------+-----------------------+ | +------+--------+-------------+-----------------------+ | |||
| | 2Bit | Length | Usable Bits | Range | | | 2MSB | Length | Usable Bits | Range | | |||
| +------+--------+-------------+-----------------------+ | +------+--------+-------------+-----------------------+ | |||
| | 00 | 1 | 6 | 0-63 | | | 00 | 1 | 6 | 0-63 | | |||
| | | | | | | | | | | | | |||
| | 01 | 2 | 14 | 0-16383 | | | 01 | 2 | 14 | 0-16383 | | |||
| | | | | | | | | | | | | |||
| | 10 | 4 | 30 | 0-1073741823 | | | 10 | 4 | 30 | 0-1073741823 | | |||
| | | | | | | | | | | | | |||
| | 11 | 8 | 62 | 0-4611686018427387903 | | | 11 | 8 | 62 | 0-4611686018427387903 | | |||
| +------+--------+-------------+-----------------------+ | +------+--------+-------------+-----------------------+ | |||
| Table 4: Summary of Integer Encodings | Table 4: Summary of Integer Encodings | |||
| Examples and a sample decoding algorithm are shown in Appendix A.1. | An example of a decoding algorithm and sample encodings are shown in | |||
| Appendix A.1. | ||||
| Values do not need to be encoded on the minimum number of bytes | Values do not need to be encoded on the minimum number of bytes | |||
| necessary, with the sole exception of the Frame Type field; see | necessary, with the sole exception of the Frame Type field; see | |||
| Section 12.4. | Section 12.4. | |||
| Versions (Section 15), packet numbers sent in the header | Versions (Section 15), packet numbers sent in the header | |||
| (Section 17.1), and the length of connection IDs in long header | (Section 17.1), and the length of connection IDs in long header | |||
| packets (Section 17.2) are described using integers, but do not use | packets (Section 17.2) are described using integers but do not use | |||
| this encoding. | this encoding. | |||
| 17. Packet Formats | 17. Packet Formats | |||
| 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. Hexadecimal notation is | endian), and all field sizes are in bits. Hexadecimal notation is | |||
| used for describing the value of fields. | used for describing the value of fields. | |||
| 17.1. Packet Number Encoding and Decoding | 17.1. Packet Number Encoding and Decoding | |||
| Packet numbers are integers in the range 0 to 2^62-1 (Section 12.3). | Packet numbers are integers in the range 0 to 2^62-1 (Section 12.3). | |||
| When present in long or short packet headers, they are encoded in 1 | When present in long or short packet headers, they are encoded in 1 | |||
| to 4 bytes. The number of bits required to represent the packet | to 4 bytes. The number of bits required to represent the packet | |||
| number is reduced by including only the least significant bits of the | number is reduced by including only the least significant bits of the | |||
| packet number. | packet number. | |||
| The encoded packet number is protected as described in Section 5.4 of | The encoded packet number is protected as described in Section 5.4 of | |||
| [QUIC-TLS]. | [QUIC-TLS]. | |||
| Prior to receiving an acknowledgment for a packet number space, the | Prior to receiving an acknowledgment for a packet number space, the | |||
| full packet number MUST be included; it is not to be truncated as | full packet number MUST be included; it is not to be truncated, as | |||
| described below. | described below. | |||
| After an acknowledgment is received for a packet number space, the | After an acknowledgment is received for a packet number space, the | |||
| sender MUST use a packet number size able to represent more than | sender MUST use a packet number size able to represent more than | |||
| twice as large a range than the difference between the largest | twice as large a range as the difference between the largest | |||
| acknowledged packet and packet number being sent. A peer receiving | acknowledged packet number and the packet number being sent. A peer | |||
| the packet will then correctly decode the packet number, unless the | receiving the packet will then correctly decode the packet number, | |||
| packet is delayed in transit such that it arrives after many higher- | unless the packet is delayed in transit such that it arrives after | |||
| numbered packets have been received. An endpoint SHOULD use a large | many higher-numbered packets have been received. An endpoint SHOULD | |||
| enough packet number encoding to allow the packet number to be | use a large enough packet number encoding to allow the packet number | |||
| recovered even if the packet arrives after packets that are sent | to be recovered even if the packet arrives after packets that are | |||
| afterwards. | sent afterwards. | |||
| 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 | |||
| bit more than the base-2 logarithm of the number of contiguous | bit more than the base-2 logarithm of the number of contiguous | |||
| unacknowledged packet numbers, including the new packet. Pseudocode | unacknowledged packet numbers, including the new packet. Pseudocode | |||
| and examples for packet number encoding can be found in Appendix A.2. | and an example for packet number encoding can be found in | |||
| Appendix A.2. | ||||
| At a receiver, protection of the packet number is removed prior to | At a receiver, protection of the packet number is removed prior to | |||
| recovering the full packet number. The full packet number is then | recovering the full packet number. The full packet number is then | |||
| reconstructed based on the number of significant bits present, the | reconstructed based on the number of significant bits present, the | |||
| value of those bits, and the largest packet number received in a | value of those bits, and the largest packet number received in a | |||
| successfully authenticated packet. Recovering the full packet number | successfully authenticated packet. Recovering the full packet number | |||
| is necessary to successfully remove packet protection. | is necessary to successfully complete the removal of packet | |||
| protection. | ||||
| Once header protection is removed, the packet number is decoded by | Once header protection is removed, the packet number is decoded by | |||
| finding the packet number value that is closest to the next expected | finding the packet number value that is closest to the next expected | |||
| packet. The next expected packet is the highest received packet | packet. The next expected packet is the highest received packet | |||
| number plus one. Pseudocode and an example for packet number | number plus one. Pseudocode and an example for packet number | |||
| decoding can be found in Appendix A.3. | decoding can be found in Appendix A.3. | |||
| 17.2. Long Header Packets | 17.2. Long Header Packets | |||
| Long Header Packet { | Long Header Packet { | |||
| skipping to change at page 107, line 35 ¶ | skipping to change at page 106, line 39 ¶ | |||
| Source Connection ID Length (8), | Source Connection ID Length (8), | |||
| Source Connection ID (0..160), | Source Connection ID (0..160), | |||
| Type-Specific Payload (..), | Type-Specific Payload (..), | |||
| } | } | |||
| Figure 13: Long Header Packet Format | Figure 13: Long Header Packet 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 | |||
| establishment of 1-RTT keys. Once 1-RTT keys are available, a sender | establishment of 1-RTT keys. Once 1-RTT keys are available, a sender | |||
| switches to sending packets using the short header (Section 17.3). | switches to sending packets using the short header (Section 17.3). | |||
| The long form allows for special packets - such as the Version | The long form allows for special packets -- such as the Version | |||
| Negotiation packet - to be represented in this uniform fixed-length | Negotiation packet -- to be represented in this uniform fixed-length | |||
| packet format. Packets that use the long header contain the | packet format. Packets that use the long header contain the | |||
| following fields: | following fields: | |||
| Header Form: The most significant bit (0x80) of byte 0 (the first | Header Form: The most significant bit (0x80) of byte 0 (the first | |||
| byte) is set to 1 for long headers. | byte) is set to 1 for long headers. | |||
| Fixed Bit: The next bit (0x40) of byte 0 is set to 1, unless the | Fixed Bit: The next bit (0x40) of byte 0 is set to 1, unless the | |||
| packet is a Version Negotiation packet. Packets containing a zero | packet is a Version Negotiation packet. Packets containing a zero | |||
| value for this bit are not valid packets in this version and MUST | value for this bit are not valid packets in this version and MUST | |||
| be discarded. A value of 1 for this bit allows QUIC to coexist | be discarded. A value of 1 for this bit allows QUIC to coexist | |||
| skipping to change at page 108, line 16 ¶ | skipping to change at page 107, line 19 ¶ | |||
| a mask of 0x0f) of byte 0 are determined by the packet type. | a mask of 0x0f) of byte 0 are determined by the packet type. | |||
| Version: The QUIC Version is a 32-bit field that follows the first | Version: The QUIC Version is a 32-bit field that follows the first | |||
| byte. This field indicates the version of QUIC that is in use and | byte. This field indicates the version of QUIC that is in use and | |||
| determines how the rest of the protocol fields are interpreted. | determines how the rest of the protocol fields are interpreted. | |||
| Destination Connection ID Length: The byte following the version | Destination Connection ID Length: The byte following the version | |||
| contains the length in bytes of the Destination Connection ID | contains the length in bytes of the Destination Connection ID | |||
| field that follows it. This length is encoded as an 8-bit | field that follows it. This length is encoded as an 8-bit | |||
| unsigned integer. In QUIC version 1, this value MUST NOT exceed | unsigned integer. In QUIC version 1, this value MUST NOT exceed | |||
| 20. Endpoints that receive a version 1 long header with a value | 20 bytes. Endpoints that receive a version 1 long header with a | |||
| larger than 20 MUST drop the packet. In order to properly form a | value larger than 20 MUST drop the packet. In order to properly | |||
| Version Negotiation packet, servers SHOULD be able to read longer | form a Version Negotiation packet, servers SHOULD be able to read | |||
| connection IDs from other QUIC versions. | longer connection IDs from other QUIC versions. | |||
| Destination Connection ID: The Destination Connection ID field | Destination Connection ID: The Destination Connection ID field | |||
| follows the Destination Connection ID Length field, which | follows the Destination Connection ID Length field, which | |||
| indicates the length of this field. Section 7.2 describes the use | indicates the length of this field. Section 7.2 describes the use | |||
| of this field in more detail. | of this field in more detail. | |||
| Source Connection ID Length: The byte following the Destination | Source Connection ID Length: The byte following the Destination | |||
| Connection ID contains the length in bytes of the Source | Connection ID contains the length in bytes of the Source | |||
| Connection ID field that follows it. This length is encoded as a | Connection ID field that follows it. This length is encoded as an | |||
| 8-bit unsigned integer. In QUIC version 1, this value MUST NOT | 8-bit unsigned integer. In QUIC version 1, this value MUST NOT | |||
| exceed 20 bytes. Endpoints that receive a version 1 long header | exceed 20 bytes. Endpoints that receive a version 1 long header | |||
| with a value larger than 20 MUST drop the packet. In order to | with a value larger than 20 MUST drop the packet. In order to | |||
| properly form a Version Negotiation packet, servers SHOULD be able | properly form a Version Negotiation packet, servers SHOULD be able | |||
| to read longer connection IDs from other QUIC versions. | to read longer connection IDs from other QUIC versions. | |||
| Source Connection ID: The Source Connection ID field follows the | Source Connection ID: The Source Connection ID field follows the | |||
| Source Connection ID Length field, which indicates the length of | Source Connection ID Length field, which indicates the length of | |||
| this field. Section 7.2 describes the use of this field in more | this field. Section 7.2 describes the use of this field in more | |||
| detail. | detail. | |||
| Type-Specific Payload: The remainder of the packet, if any, is type- | Type-Specific Payload: The remainder of the packet, if any, is type | |||
| specific. | specific. | |||
| In this version of QUIC, the following packet types with the long | In this version of QUIC, the following packet types with the long | |||
| header are defined: | header are defined: | |||
| +------+-----------+-----------------+ | +------+-----------+-----------------+ | |||
| | Type | Name | Section | | | Type | Name | Section | | |||
| +------+-----------+-----------------+ | +------+-----------+-----------------+ | |||
| | 0x0 | Initial | Section 17.2.2 | | | 0x00 | Initial | Section 17.2.2 | | |||
| | | | | | | | | | | |||
| | 0x1 | 0-RTT | Section 17.2.3 | | | 0x01 | 0-RTT | Section 17.2.3 | | |||
| | | | | | | | | | | |||
| | 0x2 | Handshake | Section 17.2.4 | | | 0x02 | Handshake | Section 17.2.4 | | |||
| | | | | | | | | | | |||
| | 0x3 | Retry | Section 17.2.5 | | | 0x03 | Retry | Section 17.2.5 | | |||
| +------+-----------+-----------------+ | +------+-----------+-----------------+ | |||
| Table 5: Long Header Packet Types | Table 5: Long Header Packet Types | |||
| The header form bit, Destination and Source Connection ID lengths, | The header form bit, Destination and Source Connection ID lengths, | |||
| Destination and Source Connection ID fields, and Version fields of a | Destination and Source Connection ID fields, and Version fields of a | |||
| long header packet are version-independent. The other fields in the | long header packet are version independent. The other fields in the | |||
| first byte are version-specific. See [QUIC-INVARIANTS] for details | first byte are version specific. See [QUIC-INVARIANTS] for details | |||
| on how packets from different versions of QUIC are interpreted. | 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. While type-specific semantics for this | version and packet type. While type-specific semantics for this | |||
| version are described in the following sections, several long-header | version are described in the following sections, several long header | |||
| packets in this version of QUIC contain these additional fields: | packets in this version of QUIC contain these additional fields: | |||
| Reserved Bits: Two bits (those with a mask of 0x0c) of byte 0 are | Reserved Bits: Two bits (those with a mask of 0x0c) of byte 0 are | |||
| reserved across multiple packet types. These bits are protected | reserved across multiple packet types. These bits are protected | |||
| using header protection; see Section 5.4 of [QUIC-TLS]. The value | using header protection; see Section 5.4 of [QUIC-TLS]. The value | |||
| included prior to protection MUST be set to 0. An endpoint MUST | included prior to protection MUST be set to 0. An endpoint MUST | |||
| treat receipt of a packet that has a non-zero value for these bits | treat receipt of a packet that has a non-zero value for these bits | |||
| after removing both packet and header protection as a connection | after removing both packet and header protection as a connection | |||
| error of type PROTOCOL_VIOLATION. Discarding such a packet after | error of type PROTOCOL_VIOLATION. Discarding such a packet after | |||
| only removing header protection can expose the endpoint to | only removing header protection can expose the endpoint to | |||
| attacks; see Section 9.5 of [QUIC-TLS]. | attacks; see Section 9.5 of [QUIC-TLS]. | |||
| Packet Number Length: In packet types that contain a Packet Number | Packet Number Length: In packet types that contain a Packet Number | |||
| field, the least significant two bits (those with a mask of 0x03) | field, the least significant two bits (those with a mask of 0x03) | |||
| of byte 0 contain the length of the packet number, encoded as an | of byte 0 contain the length of the Packet Number field, encoded | |||
| unsigned, two-bit integer that is one less than the length of the | as an unsigned two-bit integer that is one less than the length of | |||
| packet number field in bytes. That is, the length of the packet | the Packet Number field in bytes. That is, the length of the | |||
| number field is the value of this field, plus one. These bits are | Packet Number field is the value of this field plus one. These | |||
| protected using header protection; see Section 5.4 of [QUIC-TLS]. | bits are protected using header protection; see Section 5.4 of | |||
| [QUIC-TLS]. | ||||
| Length: The length of the remainder of the packet (that is, the | Length: This is the length of the remainder of the packet (that is, | |||
| Packet Number and Payload fields) in bytes, encoded as a variable- | the Packet Number and Payload fields) in bytes, encoded as a | |||
| length integer (Section 16). | variable-length integer (Section 16). | |||
| Packet Number: The packet number field is 1 to 4 bytes long. The | Packet Number: This field is 1 to 4 bytes long. The packet number | |||
| packet number is protected using header protection; see | is protected using header protection; see Section 5.4 of | |||
| Section 5.4 of [QUIC-TLS]. The length of the packet number field | [QUIC-TLS]. The length of the Packet Number field is encoded in | |||
| is encoded in the Packet Number Length bits of byte 0; see above. | the Packet Number Length bits of byte 0; see above. | |||
| Packet Payload: This is the payload of the packet -- containing a | ||||
| sequence of frames -- that is protected using packet protection. | ||||
| 17.2.1. Version Negotiation Packet | 17.2.1. Version Negotiation Packet | |||
| A Version Negotiation packet is inherently not version-specific. | A Version Negotiation packet is inherently not version specific. | |||
| Upon receipt by a client, it will be identified as a Version | Upon receipt by a client, it will be identified as a Version | |||
| Negotiation packet based on the Version field having a value of 0. | Negotiation packet based on the 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. It is only | |||
| sent by servers. | sent by servers. | |||
| The layout of a Version Negotiation packet is: | The layout of a Version Negotiation packet is: | |||
| Version Negotiation Packet { | Version Negotiation Packet { | |||
| Header Form (1) = 1, | Header Form (1) = 1, | |||
| Unused (7), | Unused (7), | |||
| Version (32) = 0, | Version (32) = 0, | |||
| Destination Connection ID Length (8), | Destination Connection ID Length (8), | |||
| Destination Connection ID (0..2040), | Destination Connection ID (0..2040), | |||
| skipping to change at page 111, line 9 ¶ | skipping to change at page 110, line 12 ¶ | |||
| Destination Connection ID of the received packet, which is initially | Destination Connection ID of the received packet, which is initially | |||
| randomly selected by a client. Echoing both connection IDs gives | randomly selected by a client. Echoing both connection IDs gives | |||
| clients some assurance that the server received the packet and that | clients some assurance that the server received the packet and that | |||
| the Version Negotiation packet was not generated by an entity that | the Version Negotiation packet was not generated by an entity that | |||
| did not observe the Initial packet. | did not observe the Initial packet. | |||
| Future versions of QUIC could have different requirements for the | Future versions of QUIC could have different requirements for the | |||
| lengths of connection IDs. In particular, connection IDs might have | lengths of connection IDs. In particular, connection IDs might have | |||
| a smaller minimum length or a greater maximum length. Version- | a smaller minimum length or a greater maximum length. Version- | |||
| specific rules for the connection ID therefore MUST NOT influence a | specific rules for the connection ID therefore MUST NOT influence a | |||
| server decision about whether to send a Version Negotiation packet. | decision about whether to send a Version Negotiation packet. | |||
| The remainder of the Version Negotiation packet is a list of 32-bit | The remainder of the Version Negotiation packet is a list of 32-bit | |||
| versions that the server supports. | versions that the server supports. | |||
| A Version Negotiation packet is not acknowledged. It is only sent in | A Version Negotiation packet is not acknowledged. It is only sent in | |||
| response to a packet that indicates an unsupported version; see | response to a packet that indicates an unsupported version; see | |||
| Section 5.2.2. | Section 5.2.2. | |||
| The Version Negotiation packet does not include the Packet Number and | The Version Negotiation packet does not include the Packet Number and | |||
| Length fields present in other packets that use the long header form. | Length fields present in other packets that use the long header form. | |||
| Consequently, a Version Negotiation packet consumes an entire UDP | Consequently, a Version Negotiation packet consumes an entire UDP | |||
| datagram. | datagram. | |||
| A server MUST NOT send more than one Version Negotiation packet in | A server MUST NOT send more than one Version Negotiation packet in | |||
| response to a single UDP datagram. | response to a single UDP datagram. | |||
| See Section 6 for a description of the version negotiation process. | See Section 6 for a description of the version negotiation process. | |||
| 17.2.2. Initial Packet | 17.2.2. Initial Packet | |||
| An Initial packet uses long headers with a type value of 0x0. It | An Initial packet uses long headers with a type value of 0x00. It | |||
| carries the first CRYPTO frames sent by the client and server to | carries the first CRYPTO frames sent by the client and server to | |||
| perform key exchange, and carries ACKs in either direction. | perform key exchange, and it carries ACK frames in either direction. | |||
| Initial Packet { | Initial Packet { | |||
| Header Form (1) = 1, | Header Form (1) = 1, | |||
| Fixed Bit (1) = 1, | Fixed Bit (1) = 1, | |||
| Long Packet Type (2) = 0, | Long Packet Type (2) = 0, | |||
| Reserved Bits (2), | Reserved Bits (2), | |||
| Packet Number Length (2), | Packet Number Length (2), | |||
| Version (32), | Version (32), | |||
| Destination Connection ID Length (8), | Destination Connection ID Length (8), | |||
| Destination Connection ID (0..160), | Destination Connection ID (0..160), | |||
| skipping to change at page 112, line 12 ¶ | skipping to change at page 111, line 32 ¶ | |||
| Figure 15: Initial Packet | Figure 15: Initial Packet | |||
| The Initial packet contains a long header as well as the Length and | The Initial packet contains a long header as well as the Length and | |||
| Packet Number fields; see Section 17.2. The first byte contains the | Packet Number fields; see Section 17.2. The first byte contains the | |||
| Reserved and Packet Number Length bits; see also Section 17.2. | Reserved and Packet Number Length bits; see also Section 17.2. | |||
| Between the Source Connection ID and Length fields, there are two | Between the Source Connection ID and Length fields, there are two | |||
| additional fields specific to the Initial packet. | additional fields specific to the Initial packet. | |||
| Token Length: A variable-length integer specifying the length of the | Token Length: A variable-length integer specifying the length of the | |||
| Token field, in bytes. This value is zero if no token is present. | Token field, in bytes. This value is 0 if no token is present. | |||
| Initial packets sent by the server MUST set the Token Length field | Initial packets sent by the server MUST set the Token Length field | |||
| to zero; clients that receive an Initial packet with a non-zero | to 0; clients that receive an Initial packet with a non-zero Token | |||
| Token Length field MUST either discard the packet or generate a | Length field MUST either discard the packet or generate a | |||
| connection error of type PROTOCOL_VIOLATION. | connection error of type PROTOCOL_VIOLATION. | |||
| Token: The value of the token that was previously provided in a | Token: The value of the token that was previously provided in a | |||
| Retry packet or NEW_TOKEN frame; see Section 8.1. | Retry packet or NEW_TOKEN frame; see Section 8.1. | |||
| Packet Payload: The payload of the packet. | ||||
| In order to prevent tampering by version-unaware middleboxes, Initial | In order to prevent tampering by version-unaware middleboxes, Initial | |||
| packets are protected with connection- and version-specific keys | packets are protected with connection- and version-specific keys | |||
| (Initial keys) as described in [QUIC-TLS]. This protection does not | (Initial keys) as described in [QUIC-TLS]. This protection does not | |||
| provide confidentiality or integrity against attackers that can | provide confidentiality or integrity against attackers that can | |||
| observe packets, but provides some level of protection against | observe packets, but it does prevent attackers that cannot observe | |||
| attackers that cannot observe packets. | packets from spoofing Initial packets. | |||
| The client and server use the Initial packet type for any packet that | The client and server use the Initial packet type for any packet that | |||
| contains an initial cryptographic handshake message. This includes | contains an initial cryptographic handshake message. This includes | |||
| all cases where a new packet containing the initial cryptographic | all cases where a new packet containing the initial cryptographic | |||
| message needs to be created, such as the packets sent after receiving | message needs to be created, such as the packets sent after receiving | |||
| a Retry packet (Section 17.2.5). | a Retry packet; see Section 17.2.5. | |||
| A server sends its first Initial packet in response to a client | A server sends its first Initial packet in response to a client | |||
| Initial. A server MAY send multiple Initial packets. The | Initial. A server MAY send multiple Initial packets. The | |||
| cryptographic key exchange could require multiple round trips or | cryptographic key exchange could require multiple round trips or | |||
| retransmissions of this data. | retransmissions of this data. | |||
| The payload of an Initial packet includes a CRYPTO frame (or frames) | The payload of an Initial packet includes a CRYPTO frame (or frames) | |||
| containing a cryptographic handshake message, ACK frames, or both. | containing a cryptographic handshake message, ACK frames, or both. | |||
| PING, PADDING, and CONNECTION_CLOSE frames of type 0x1c are also | PING, PADDING, and CONNECTION_CLOSE frames of type 0x1c are also | |||
| permitted. An endpoint that receives an Initial packet containing | permitted. An endpoint that receives an Initial packet containing | |||
| skipping to change at page 113, line 23 ¶ | skipping to change at page 112, line 40 ¶ | |||
| A client stops both sending and processing Initial packets when it | A client stops both sending and processing Initial packets when it | |||
| sends its first Handshake packet. A server stops sending and | sends its first Handshake packet. A server stops sending and | |||
| processing Initial packets when it receives its first Handshake | processing Initial packets when it receives its first Handshake | |||
| packet. Though packets might still be in flight or awaiting | packet. Though packets might still be in flight or awaiting | |||
| acknowledgment, no further Initial packets need to be exchanged | acknowledgment, no further Initial packets need to be exchanged | |||
| beyond this point. Initial packet protection keys are discarded (see | beyond this point. Initial packet protection keys are discarded (see | |||
| Section 4.9.1 of [QUIC-TLS]) along with any loss recovery and | Section 4.9.1 of [QUIC-TLS]) along with any loss recovery and | |||
| congestion control state; see Section 6.4 of [QUIC-RECOVERY]. | congestion control state; see Section 6.4 of [QUIC-RECOVERY]. | |||
| Any data in CRYPTO frames is discarded - and no longer retransmitted | Any data in CRYPTO frames is discarded -- and no longer retransmitted | |||
| - when Initial keys are discarded. | -- when Initial keys are discarded. | |||
| 17.2.3. 0-RTT | 17.2.3. 0-RTT | |||
| A 0-RTT packet uses long headers with a type value of 0x1, followed | A 0-RTT packet uses long headers with a type value of 0x01, followed | |||
| by the Length and Packet Number fields; see Section 17.2. The first | by the Length and Packet Number fields; see Section 17.2. The first | |||
| byte contains the Reserved and Packet Number Length bits; see | byte contains the Reserved and Packet Number Length bits; see | |||
| Section 17.2. A 0-RTT packet is used to carry "early" data from the | Section 17.2. A 0-RTT packet is used to carry "early" data from the | |||
| client to the server as part of the first flight, prior to handshake | client to the server as part of the first flight, prior to handshake | |||
| completion. As part of the TLS handshake, the server can accept or | completion. As part of the TLS handshake, the server can accept or | |||
| reject this early data. | reject this early data. | |||
| See Section 2.3 of [TLS13] for a discussion of 0-RTT data and its | See Section 2.3 of [TLS13] for a discussion of 0-RTT data and its | |||
| limitations. | limitations. | |||
| skipping to change at page 114, line 49 ¶ | skipping to change at page 114, line 7 ¶ | |||
| client cannot send an ACK frame in a 0-RTT packet, because that can | client cannot send an ACK frame in a 0-RTT packet, because that can | |||
| only acknowledge a 1-RTT packet. An acknowledgment for a 1-RTT | only acknowledge a 1-RTT packet. An acknowledgment for a 1-RTT | |||
| packet MUST be carried in a 1-RTT packet. | packet MUST be carried in a 1-RTT packet. | |||
| A server SHOULD treat a violation of remembered limits | A server SHOULD treat a violation of remembered limits | |||
| (Section 7.4.1) as a connection error of an appropriate type (for | (Section 7.4.1) as a connection error of an appropriate type (for | |||
| instance, a FLOW_CONTROL_ERROR for exceeding stream data limits). | instance, a FLOW_CONTROL_ERROR for exceeding stream data limits). | |||
| 17.2.4. Handshake Packet | 17.2.4. Handshake Packet | |||
| A Handshake packet uses long headers with a type value of 0x2, | A Handshake packet uses long headers with a type value of 0x02, | |||
| followed by the Length and Packet Number fields; see Section 17.2. | followed by the Length and Packet Number fields; see Section 17.2. | |||
| The first byte contains the Reserved and Packet Number Length bits; | The first byte contains the Reserved and Packet Number Length bits; | |||
| see Section 17.2. It is used to carry cryptographic handshake | see Section 17.2. It is used to carry cryptographic handshake | |||
| messages and acknowledgments from the server and client. | messages and acknowledgments from the server and client. | |||
| Handshake Packet { | Handshake Packet { | |||
| Header Form (1) = 1, | Header Form (1) = 1, | |||
| Fixed Bit (1) = 1, | Fixed Bit (1) = 1, | |||
| Long Packet Type (2) = 2, | Long Packet Type (2) = 2, | |||
| Reserved Bits (2), | Reserved Bits (2), | |||
| skipping to change at page 115, line 45 ¶ | skipping to change at page 114, line 51 ¶ | |||
| first Handshake packet sent by a server contains a packet number of | first Handshake packet sent by a server contains a packet number of | |||
| 0. | 0. | |||
| The payload of this packet contains CRYPTO frames and could contain | The payload of this packet contains CRYPTO frames and could contain | |||
| PING, PADDING, or ACK frames. Handshake packets MAY contain | PING, PADDING, or ACK frames. Handshake packets MAY contain | |||
| CONNECTION_CLOSE frames of type 0x1c. Endpoints MUST treat receipt | CONNECTION_CLOSE frames of type 0x1c. Endpoints MUST treat receipt | |||
| of Handshake packets with other frames as a connection error of type | of Handshake packets with other frames as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| Like Initial packets (see Section 17.2.2.1), data in CRYPTO frames | Like Initial packets (see Section 17.2.2.1), data in CRYPTO frames | |||
| for Handshake packets is discarded - and no longer retransmitted - | for Handshake packets is discarded -- and no longer retransmitted -- | |||
| when Handshake protection keys are discarded. | when Handshake protection keys are discarded. | |||
| 17.2.5. Retry Packet | 17.2.5. Retry Packet | |||
| A Retry packet uses a long packet header with a type value of 0x3. | As shown in Figure 17, a Retry packet uses a long packet header with | |||
| It carries an address validation token created by the server. It is | a type value of 0x03. It carries an address validation token created | |||
| used by a server that wishes to perform a retry; see Section 8.1. | by the server. It is used by a server that wishes to perform a | |||
| retry; see Section 8.1. | ||||
| Retry Packet { | Retry Packet { | |||
| Header Form (1) = 1, | Header Form (1) = 1, | |||
| Fixed Bit (1) = 1, | Fixed Bit (1) = 1, | |||
| Long Packet Type (2) = 3, | Long Packet Type (2) = 3, | |||
| Unused (4), | Unused (4), | |||
| Version (32), | Version (32), | |||
| Destination Connection ID Length (8), | Destination Connection ID Length (8), | |||
| Destination Connection ID (0..160), | Destination Connection ID (0..160), | |||
| Source Connection ID Length (8), | Source Connection ID Length (8), | |||
| Source Connection ID (0..160), | Source Connection ID (0..160), | |||
| Retry Token (..), | Retry Token (..), | |||
| Retry Integrity Tag (128), | Retry Integrity Tag (128), | |||
| } | } | |||
| Figure 17: Retry Packet | Figure 17: Retry Packet | |||
| A Retry packet (shown in Figure 17) does not contain any protected | A Retry packet does not contain any protected fields. The value in | |||
| fields. The value in the Unused field is set to an arbitrary value | the Unused field is set to an arbitrary value by the server; a client | |||
| by the server; a client MUST ignore these bits. In addition to the | MUST ignore these bits. In addition to the fields from the long | |||
| fields from the long header, it contains these additional fields: | header, it contains these additional fields: | |||
| Retry Token: An opaque token that the server can use to validate the | Retry Token: An opaque token that the server can use to validate the | |||
| client's address. | client's address. | |||
| Retry Integrity Tag: See the Retry Packet Integrity section of | Retry Integrity Tag: Defined in Section "Retry Packet Integrity" | |||
| [QUIC-TLS]. | [QUIC-TLS] of [QUIC-TLS]. | |||
| 17.2.5.1. Sending a Retry Packet | 17.2.5.1. Sending a Retry Packet | |||
| The server populates the Destination Connection ID with the | The server populates the Destination Connection ID with the | |||
| connection ID that the client included in the Source Connection ID of | connection ID that the client included in the Source Connection ID of | |||
| the Initial packet. | the Initial packet. | |||
| The server includes a connection ID of its choice in the Source | The server includes a connection ID of its choice in the Source | |||
| Connection ID field. This value MUST NOT be equal to the Destination | Connection ID field. This value MUST NOT be equal to the Destination | |||
| Connection ID field of the packet sent by the client. A client MUST | Connection ID field of the packet sent by the client. A client MUST | |||
| skipping to change at page 117, line 19 ¶ | skipping to change at page 116, line 19 ¶ | |||
| packet in response to a single UDP datagram. | packet in response to a single UDP datagram. | |||
| 17.2.5.2. Handling a Retry Packet | 17.2.5.2. Handling a Retry Packet | |||
| A client MUST accept and process at most one Retry packet for each | A client MUST accept and process at most one Retry packet for each | |||
| connection attempt. After the client has received and processed an | connection attempt. After the client has received and processed an | |||
| Initial or Retry packet from the server, it MUST discard any | Initial or Retry packet from the server, it MUST discard any | |||
| subsequent Retry packets that it receives. | subsequent Retry packets that it receives. | |||
| Clients MUST discard Retry packets that have a Retry Integrity Tag | Clients MUST discard Retry packets that have a Retry Integrity Tag | |||
| that cannot be validated; see the Retry Packet Integrity section of | that cannot be validated; see Section 5.8 of [QUIC-TLS]. This | |||
| [QUIC-TLS]. This diminishes an attacker's ability to inject a Retry | diminishes an attacker's ability to inject a Retry packet and | |||
| packet and protects against accidental corruption of Retry packets. | protects against accidental corruption of Retry packets. A client | |||
| A client MUST discard a Retry packet with a zero-length Retry Token | MUST discard a Retry packet with a zero-length Retry Token field. | |||
| field. | ||||
| The client responds to a Retry packet with an Initial packet that | The client responds to a Retry packet with an Initial packet that | |||
| includes the provided Retry Token to continue connection | includes the provided Retry token to continue connection | |||
| establishment. | establishment. | |||
| A client sets the Destination Connection ID field of this Initial | A client sets the Destination Connection ID field of this Initial | |||
| packet to the value from the Source Connection ID in the Retry | packet to the value from the Source Connection ID field in the Retry | |||
| packet. Changing Destination Connection ID also results in a change | packet. Changing the Destination Connection ID field also results in | |||
| to the keys used to protect the Initial packet. It also sets the | a change to the keys used to protect the Initial packet. It also | |||
| Token field to the token provided in the Retry. The client MUST NOT | sets the Token field to the token provided in the Retry packet. The | |||
| change the Source Connection ID because the server could include the | client MUST NOT change the Source Connection ID because the server | |||
| connection ID as part of its token validation logic; see | could include the connection ID as part of its token validation | |||
| Section 8.1.4. | logic; see Section 8.1.4. | |||
| A Retry packet does not include a packet number and cannot be | A Retry packet does not include a packet number and cannot be | |||
| explicitly acknowledged by a client. | explicitly acknowledged by a client. | |||
| 17.2.5.3. Continuing a Handshake After Retry | 17.2.5.3. Continuing a Handshake after Retry | |||
| Subsequent Initial packets from the client include the connection ID | Subsequent Initial packets from the client include the connection ID | |||
| and token values from the Retry packet. The client copies the Source | and token values from the Retry packet. The client copies the Source | |||
| Connection ID field from the Retry packet to the Destination | Connection ID field from the Retry packet to the Destination | |||
| Connection ID field and uses this value until an Initial packet with | Connection ID field and uses this value until an Initial packet with | |||
| an updated value is received; see Section 7.2. The value of the | an updated value is received; see Section 7.2. The value of the | |||
| Token field is copied to all subsequent Initial packets; see | Token field is copied to all subsequent Initial packets; see | |||
| Section 8.1.2. | Section 8.1.2. | |||
| Other than updating the Destination Connection ID and Token fields, | Other than updating the Destination Connection ID and Token fields, | |||
| skipping to change at page 118, line 27 ¶ | skipping to change at page 117, line 26 ¶ | |||
| contain confidential information that will most likely be | contain confidential information that will most likely be | |||
| retransmitted on receiving a Retry packet. The keys used to protect | retransmitted on receiving a Retry packet. The keys used to protect | |||
| these new 0-RTT packets will not change as a result of responding to | these new 0-RTT packets will not change as a result of responding to | |||
| a Retry packet. However, the data sent in these packets could be | a Retry packet. However, the data sent in these packets could be | |||
| different than what was sent earlier. Sending these new packets with | different than what was sent earlier. Sending these new packets with | |||
| the same packet number is likely to compromise the packet protection | the same packet number is likely to compromise the packet protection | |||
| for those packets because the same key and nonce could be used to | for those packets because the same key and nonce could be used to | |||
| protect different content. A server MAY abort the connection if it | protect different content. A server MAY abort the connection if it | |||
| detects that the client reset the packet number. | detects that the client reset the packet number. | |||
| The connection IDs used on Initial and Retry packets exchanged | The connection IDs used in Initial and Retry packets exchanged | |||
| between client and server are copied to the transport parameters and | between client and server are copied to the transport parameters and | |||
| validated as described in Section 7.3. | validated as described in Section 7.3. | |||
| 17.3. Short Header Packets | 17.3. Short Header Packets | |||
| This version of QUIC defines a single packet type that uses the short | This version of QUIC defines a single packet type that uses the short | |||
| packet header. | packet header. | |||
| 17.3.1. 1-RTT Packet | 17.3.1. 1-RTT Packet | |||
| skipping to change at page 119, line 49 ¶ | skipping to change at page 118, line 49 ¶ | |||
| header protection can expose the endpoint to attacks; see | header protection can expose the endpoint to attacks; see | |||
| Section 9.5 of [QUIC-TLS]. | Section 9.5 of [QUIC-TLS]. | |||
| Key Phase: The next bit (0x04) of byte 0 indicates the key phase, | Key Phase: The next bit (0x04) of byte 0 indicates the key phase, | |||
| which allows a recipient of a packet to identify the packet | 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. This bit is protected using header | [QUIC-TLS] for details. This bit is protected using header | |||
| protection; see Section 5.4 of [QUIC-TLS]. | protection; see Section 5.4 of [QUIC-TLS]. | |||
| Packet Number Length: The least significant two bits (those with a | Packet Number Length: The least significant two bits (those with a | |||
| mask of 0x03) of byte 0 contain the length of the packet number, | mask of 0x03) of byte 0 contain the length of the Packet Number | |||
| encoded as an unsigned, two-bit integer that is one less than the | field, encoded as an unsigned two-bit integer that is one less | |||
| length of the packet number field in bytes. That is, the length | than the length of the Packet Number field in bytes. That is, the | |||
| of the packet number field is the value of this field, plus one. | length of the Packet Number field is the value of this field plus | |||
| one. These bits are protected using header protection; see | ||||
| These bits are protected using header protection; see Section 5.4 | Section 5.4 of [QUIC-TLS]. | |||
| of [QUIC-TLS]. | ||||
| Destination Connection ID: The Destination Connection ID is a | Destination Connection ID: The Destination Connection ID is a | |||
| connection ID that is chosen by the intended recipient of the | connection ID that is chosen by the intended recipient of the | |||
| packet. See Section 5.1 for more details. | packet. See Section 5.1 for more details. | |||
| Packet Number: The packet number field is 1 to 4 bytes long. The | Packet Number: The Packet Number field is 1 to 4 bytes long. The | |||
| packet number is protected using header protection; see | packet number is protected using header protection; see | |||
| Section 5.4 of [QUIC-TLS]. The length of the packet number field | Section 5.4 of [QUIC-TLS]. The length of the Packet Number field | |||
| is encoded in Packet Number Length field. See Section 17.1 for | is encoded in Packet Number Length field. See Section 17.1 for | |||
| details. | details. | |||
| Packet Payload: 1-RTT packets always include a 1-RTT protected | Packet Payload: 1-RTT packets always include a 1-RTT protected | |||
| payload. | payload. | |||
| The header form bit and the connection ID field of a short header | The header form bit and the Destination Connection ID field of a | |||
| packet are version-independent. The remaining fields are specific to | short header packet are version independent. The remaining fields | |||
| the selected QUIC version. See [QUIC-INVARIANTS] for details on how | are specific to the selected QUIC version. See [QUIC-INVARIANTS] for | |||
| packets from different versions of QUIC are interpreted. | details on how packets from different versions of QUIC are | |||
| interpreted. | ||||
| 17.4. Latency Spin Bit | 17.4. Latency Spin Bit | |||
| The latency spin bit, which is defined for 1-RTT packets | The latency spin bit, which is defined for 1-RTT packets | |||
| (Section 17.3.1), enables passive latency monitoring from observation | (Section 17.3.1), enables passive latency monitoring from observation | |||
| points on the network path throughout the duration of a connection. | points on the network path throughout the duration of a connection. | |||
| The server reflects the spin value received, while the client 'spins' | The server reflects the spin value received, while the client "spins" | |||
| it after one RTT. On-path observers can measure the time between two | it after one RTT. On-path observers can measure the time between two | |||
| spin bit toggle events to estimate the end-to-end RTT of a | spin bit toggle events to estimate the end-to-end RTT of a | |||
| connection. | connection. | |||
| The spin bit is only present in 1-RTT packets, since it is possible | The spin bit is only present in 1-RTT packets, since it is possible | |||
| to measure the initial RTT of a connection by observing the | to measure the initial RTT of a connection by observing the | |||
| handshake. Therefore, the spin bit is available after version | handshake. Therefore, the spin bit is available after version | |||
| negotiation and connection establishment are completed. On-path | negotiation and connection establishment are completed. On-path | |||
| measurement and use of the latency spin bit is further discussed in | measurement and use of the latency spin bit are further discussed in | |||
| [QUIC-MANAGEABILITY]. | [QUIC-MANAGEABILITY]. | |||
| The spin bit is an OPTIONAL feature of this version of QUIC. An | The spin bit is an OPTIONAL feature of this version of QUIC. An | |||
| endpoint that does not support this feature MUST disable it, as | endpoint that does not support this feature MUST disable it, as | |||
| defined below. | defined below. | |||
| Each endpoint unilaterally decides if the spin bit is enabled or | Each endpoint unilaterally decides if the spin bit is enabled or | |||
| disabled for a connection. Implementations MUST allow administrators | disabled for a connection. Implementations MUST allow administrators | |||
| of clients and servers to disable the spin bit either globally or on | of clients and servers to disable the spin bit either globally or on | |||
| a per-connection basis. Even when the spin bit is not disabled by | a per-connection basis. Even when the spin bit is not disabled by | |||
| the administrator, endpoints MUST disable their use of the spin bit | the administrator, endpoints MUST disable their use of the spin bit | |||
| for a random selection of at least one in every 16 network paths, or | for a random selection of at least one in every 16 network paths, or | |||
| for one in every 16 connection IDs, in order to ensure that QUIC | for one in every 16 connection IDs, in order to ensure that QUIC | |||
| connections that disable the spin bit are commonly observed on the | connections that disable the spin bit are commonly observed on the | |||
| network. As each endpoint disables the spin bit independently, this | network. As each endpoint disables the spin bit independently, this | |||
| ensures that the spin bit signal is disabled on approximately one in | ensures that the spin bit signal is disabled on approximately one in | |||
| eight network paths. | eight network paths. | |||
| When the spin bit is disabled, endpoints MAY set the spin bit to any | When the spin bit is disabled, endpoints MAY set the spin bit to any | |||
| value, and MUST ignore any incoming value. It is RECOMMENDED that | value and MUST ignore any incoming value. It is RECOMMENDED that | |||
| endpoints set the spin bit to a random value either chosen | endpoints set the spin bit to a random value either chosen | |||
| independently for each packet or chosen independently for each | independently for each packet or chosen independently for each | |||
| connection ID. | connection ID. | |||
| If the spin bit is enabled for the connection, the endpoint maintains | If the spin bit is enabled for the connection, the endpoint maintains | |||
| a spin value for each network path and sets the spin bit in the | a spin value for each network path and sets the spin bit in the | |||
| packet header to the currently stored value when a 1-RTT packet is | packet header to the currently stored value when a 1-RTT packet is | |||
| sent on that path. The spin value is initialized to 0 in the | sent on that path. The spin value is initialized to 0 in the | |||
| endpoint for each network path. Each endpoint also remembers the | endpoint for each network path. Each endpoint also remembers the | |||
| highest packet number seen from its peer on each path. | highest packet number seen from its peer on each path. | |||
| skipping to change at page 121, line 33 ¶ | skipping to change at page 120, line 34 ¶ | |||
| When a server receives a 1-RTT packet that increases the highest | When a server receives a 1-RTT packet that increases the highest | |||
| packet number seen by the server from the client on a given network | packet number seen by the server from the client on a given network | |||
| path, it sets the spin value for that path to be equal to the spin | path, it sets the spin value for that path to be equal to the spin | |||
| bit in the received packet. | bit in the received packet. | |||
| When a client receives a 1-RTT packet that increases the highest | When a client receives a 1-RTT packet that increases the highest | |||
| packet number seen by the client from the server on a given network | packet number seen by the client from the server on a given network | |||
| path, it sets the spin value for that path to the inverse of the spin | path, it sets the spin value for that path to the inverse of the spin | |||
| bit in the received packet. | bit in the received packet. | |||
| An endpoint resets the spin value for a network path to zero when | An endpoint resets the spin value for a network path to 0 when | |||
| changing the connection ID being used on that network path. | changing the connection ID being used on that network path. | |||
| 18. Transport Parameter Encoding | 18. Transport Parameter Encoding | |||
| 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 the QUIC transport parameters. They | defined in [QUIC-TLS] contains the QUIC transport parameters. They | |||
| are encoded as a sequence of transport parameters, as shown in | are encoded as a sequence of transport parameters, as shown in | |||
| Figure 18: | Figure 18: | |||
| Transport Parameters { | Transport Parameters { | |||
| skipping to change at page 122, line 24 ¶ | skipping to change at page 121, line 24 ¶ | |||
| Transport Parameter Value field in bytes. | Transport Parameter Value field in bytes. | |||
| QUIC encodes transport parameters into a sequence of bytes, which is | QUIC encodes transport parameters into a sequence of bytes, which is | |||
| then included in the cryptographic handshake. | then included in the cryptographic handshake. | |||
| 18.1. Reserved Transport Parameters | 18.1. Reserved Transport Parameters | |||
| Transport parameters with an identifier of the form "31 * N + 27" for | Transport parameters with an identifier of the form "31 * N + 27" for | |||
| integer values of N are reserved to exercise the requirement that | integer values of N are reserved to exercise the requirement that | |||
| unknown transport parameters be ignored. These transport parameters | unknown transport parameters be ignored. These transport parameters | |||
| have no semantics, and can carry arbitrary values. | have no semantics and can carry arbitrary values. | |||
| 18.2. Transport Parameter Definitions | 18.2. Transport Parameter Definitions | |||
| This section details the transport parameters defined in this | This section details the transport parameters defined in this | |||
| document. | document. | |||
| Many transport parameters listed here have integer values. Those | Many transport parameters listed here have integer values. Those | |||
| transport parameters that are identified as integers use a variable- | transport parameters that are identified as integers use a variable- | |||
| length integer encoding; see Section 16. Transport parameters have a | length integer encoding; see Section 16. Transport parameters have a | |||
| default value of 0 if the transport parameter is absent unless | default value of 0 if the transport parameter is absent, unless | |||
| otherwise stated. | otherwise stated. | |||
| The following transport parameters are defined: | The following transport parameters are defined: | |||
| original_destination_connection_id (0x00): The value of the | original_destination_connection_id (0x00): This parameter is the | |||
| Destination Connection ID field from the first Initial packet sent | value of the Destination Connection ID field from the first | |||
| by the client; see Section 7.3. This transport parameter is only | Initial packet sent by the client; see Section 7.3. This | |||
| sent by a server. | transport parameter is only sent by a server. | |||
| max_idle_timeout (0x01): The max idle timeout is a value in | max_idle_timeout (0x01): The maximum idle timeout is a value in | |||
| milliseconds that is encoded as an integer; see (Section 10.1). | milliseconds that is encoded as an integer; see (Section 10.1). | |||
| Idle timeout is disabled when both endpoints omit this transport | Idle timeout is disabled when both endpoints omit this transport | |||
| parameter or specify a value of 0. | parameter or specify a value of 0. | |||
| stateless_reset_token (0x02): A stateless reset token is used in | stateless_reset_token (0x02): A stateless reset token is used in | |||
| verifying a stateless reset; see Section 10.3. This parameter is | verifying a stateless reset; see Section 10.3. This parameter is | |||
| a sequence of 16 bytes. This transport parameter MUST NOT be sent | a sequence of 16 bytes. This transport parameter MUST NOT be sent | |||
| by a client, but MAY be sent by a server. A server that does not | by a client but MAY be sent by a server. A server that does not | |||
| send this transport parameter cannot use stateless reset | send this transport parameter cannot use stateless reset | |||
| (Section 10.3) for the connection ID negotiated during the | (Section 10.3) for the connection ID negotiated during the | |||
| handshake. | handshake. | |||
| max_udp_payload_size (0x03): The maximum UDP payload size parameter | max_udp_payload_size (0x03): The maximum UDP payload size parameter | |||
| is an integer value that limits the size of UDP payloads that the | is an integer value that limits the size of UDP payloads that the | |||
| endpoint is willing to receive. UDP datagrams with payloads | endpoint is willing to receive. UDP datagrams with payloads | |||
| larger than this limit are not likely to be processed by the | larger than this limit are not likely to be processed by the | |||
| receiver. | receiver. | |||
| skipping to change at page 123, line 31 ¶ | skipping to change at page 122, line 31 ¶ | |||
| packets. | packets. | |||
| initial_max_data (0x04): The initial maximum data parameter is an | initial_max_data (0x04): The initial maximum data parameter is an | |||
| integer value that contains the initial value for the maximum | integer value that contains the initial value for the maximum | |||
| amount of data that can be sent on the connection. This is | amount of data that can be sent on the connection. This is | |||
| equivalent to sending a MAX_DATA (Section 19.9) for the connection | equivalent to sending a MAX_DATA (Section 19.9) for the connection | |||
| immediately after completing the handshake. | immediately after completing the handshake. | |||
| initial_max_stream_data_bidi_local (0x05): This parameter is an | initial_max_stream_data_bidi_local (0x05): This parameter is an | |||
| integer value specifying the initial flow control limit for | integer value specifying the initial flow control limit for | |||
| locally-initiated bidirectional streams. This limit applies to | locally initiated bidirectional streams. This limit applies to | |||
| newly created bidirectional streams opened by the endpoint that | newly created bidirectional streams opened by the endpoint that | |||
| sends the transport parameter. In client transport parameters, | sends the transport parameter. In client transport parameters, | |||
| this applies to streams with an identifier with the least | this applies to streams with an identifier with the least | |||
| significant two bits set to 0x0; in server transport parameters, | significant two bits set to 0x00; in server transport parameters, | |||
| this applies to streams with the least significant two bits set to | this applies to streams with the least significant two bits set to | |||
| 0x1. | 0x01. | |||
| initial_max_stream_data_bidi_remote (0x06): This parameter is an | initial_max_stream_data_bidi_remote (0x06): This parameter is an | |||
| integer value specifying the initial flow control limit for peer- | integer value specifying the initial flow control limit for peer- | |||
| initiated bidirectional streams. This limit applies to newly | initiated bidirectional streams. This limit applies to newly | |||
| created bidirectional streams opened by the endpoint that receives | created bidirectional streams opened by the endpoint that receives | |||
| the transport parameter. In client transport parameters, this | the transport parameter. In client transport parameters, this | |||
| applies to streams with an identifier with the least significant | applies to streams with an identifier with the least significant | |||
| two bits set to 0x1; in server transport parameters, this applies | two bits set to 0x01; in server transport parameters, this applies | |||
| to streams with the least significant two bits set to 0x0. | to streams with the least significant two bits set to 0x00. | |||
| initial_max_stream_data_uni (0x07): This parameter is an integer | initial_max_stream_data_uni (0x07): This parameter is an integer | |||
| value specifying the initial flow control limit for unidirectional | value specifying the initial flow control limit for unidirectional | |||
| streams. This limit applies to newly created unidirectional | streams. This limit applies to newly created unidirectional | |||
| streams opened by the endpoint that receives the transport | streams opened by the endpoint that receives the transport | |||
| parameter. In client transport parameters, this applies to | parameter. In client transport parameters, this applies to | |||
| streams with an identifier with the least significant two bits set | streams with an identifier with the least significant two bits set | |||
| to 0x3; in server transport parameters, this applies to streams | to 0x03; in server transport parameters, this applies to streams | |||
| with the least significant two bits set to 0x2. | with the least significant two bits set to 0x02. | |||
| initial_max_streams_bidi (0x08): The initial maximum bidirectional | initial_max_streams_bidi (0x08): The initial maximum bidirectional | |||
| streams parameter is an integer value that contains the initial | streams parameter is an integer value that contains the initial | |||
| maximum number of bidirectional streams the endpoint that receives | maximum number of bidirectional streams the endpoint that receives | |||
| this transport parameter is permitted to initiate. If this | this transport parameter is permitted to initiate. If this | |||
| parameter is absent or zero, the peer cannot open bidirectional | parameter is absent or zero, the peer cannot open bidirectional | |||
| streams until a MAX_STREAMS frame is sent. Setting this parameter | streams until a MAX_STREAMS frame is sent. Setting this parameter | |||
| is equivalent to sending a MAX_STREAMS (Section 19.11) of the | is equivalent to sending a MAX_STREAMS (Section 19.11) of the | |||
| corresponding type with the same value. | corresponding type with the same value. | |||
| skipping to change at page 125, line 14 ¶ | skipping to change at page 124, line 14 ¶ | |||
| preferred_address (0x0d): The server's preferred address is used to | preferred_address (0x0d): The server's preferred address is used to | |||
| effect a change in server address at the end of the handshake, as | effect a change in server address at the end of the handshake, as | |||
| described in Section 9.6. This transport parameter is only sent | described in Section 9.6. This transport parameter is only sent | |||
| by a server. Servers MAY choose to only send a preferred address | by a server. Servers MAY choose to only send a preferred address | |||
| of one address family by sending an all-zero address and port | of one address family by sending an all-zero address and port | |||
| (0.0.0.0:0 or [::]:0) for the other family. IP addresses are | (0.0.0.0:0 or [::]:0) for the other family. IP addresses are | |||
| encoded in network byte order. | encoded in network byte order. | |||
| The preferred_address transport parameter contains an address and | The preferred_address transport parameter contains an address and | |||
| port for both IP version 4 and 6. The four-byte IPv4 Address | port for both IPv4 and IPv6. The four-byte IPv4 Address field is | |||
| field is followed by the associated two-byte IPv4 Port field. | followed by the associated two-byte IPv4 Port field. This is | |||
| This is followed by a 16-byte IPv6 Address field and two-byte IPv6 | followed by a 16-byte IPv6 Address field and two-byte IPv6 Port | |||
| Port field. After address and port pairs, a Connection ID Length | field. After address and port pairs, a Connection ID Length field | |||
| field describes the length of the following Connection ID field. | describes the length of the following Connection ID field. | |||
| Finally, a 16-byte Stateless Reset Token field includes the | Finally, a 16-byte Stateless Reset Token field includes the | |||
| stateless reset token associated with the connection ID. The | stateless reset token associated with the connection ID. The | |||
| format of this transport parameter is shown in Figure 20. | format of this transport parameter is shown in Figure 20 below. | |||
| The Connection ID field and the Stateless Reset Token field | The Connection ID field and the Stateless Reset Token field | |||
| contain an alternative connection ID that has a sequence number of | contain an alternative connection ID that has a sequence number of | |||
| 1; see Section 5.1.1. Having these values sent alongside the | 1; see Section 5.1.1. Having these values sent alongside the | |||
| preferred address ensures that there will be at least one unused | preferred address ensures that there will be at least one unused | |||
| active connection ID when the client initiates migration to the | active connection ID when the client initiates migration to the | |||
| preferred address. | preferred address. | |||
| The Connection ID and Stateless Reset Token fields of a preferred | The Connection ID and Stateless Reset Token fields of a preferred | |||
| address are identical in syntax and semantics to the corresponding | address are identical in syntax and semantics to the corresponding | |||
| fields of a NEW_CONNECTION_ID frame (Section 19.15). A server | fields of a NEW_CONNECTION_ID frame (Section 19.15). A server | |||
| that chooses a zero-length connection ID MUST NOT provide a | that chooses a zero-length connection ID MUST NOT provide a | |||
| preferred address. Similarly, a server MUST NOT include a zero- | preferred address. Similarly, a server MUST NOT include a zero- | |||
| length connection ID in this transport parameter. A client MUST | length connection ID in this transport parameter. A client MUST | |||
| treat violation of these requirements as a connection error of | treat a violation of these requirements as a connection error of | |||
| type TRANSPORT_PARAMETER_ERROR. | type TRANSPORT_PARAMETER_ERROR. | |||
| Preferred Address { | Preferred Address { | |||
| IPv4 Address (32), | IPv4 Address (32), | |||
| IPv4 Port (16), | IPv4 Port (16), | |||
| IPv6 Address (128), | IPv6 Address (128), | |||
| IPv6 Port (16), | IPv6 Port (16), | |||
| Connection ID Length (8), | Connection ID Length (8), | |||
| Connection ID (..), | Connection ID (..), | |||
| Stateless Reset Token (128), | Stateless Reset Token (128), | |||
| } | } | |||
| Figure 20: Preferred Address format | Figure 20: Preferred Address Format | |||
| active_connection_id_limit (0x0e): The active connection ID limit is | active_connection_id_limit (0x0e): This is an integer value | |||
| an integer value specifying the maximum number of connection IDs | specifying the maximum number of connection IDs from the peer that | |||
| from the peer that an endpoint is willing to store. This value | an endpoint is willing to store. This value includes the | |||
| includes the connection ID received during the handshake, that | connection ID received during the handshake, that received in the | |||
| received in the preferred_address transport parameter, and those | preferred_address transport parameter, and those received in | |||
| received in NEW_CONNECTION_ID frames. The value of the | NEW_CONNECTION_ID frames. The value of the | |||
| active_connection_id_limit parameter MUST be at least 2. An | active_connection_id_limit parameter MUST be at least 2. An | |||
| endpoint that receives a value less than 2 MUST close the | endpoint that receives a value less than 2 MUST close the | |||
| connection with an error of type TRANSPORT_PARAMETER_ERROR. If | connection with an error of type TRANSPORT_PARAMETER_ERROR. If | |||
| this transport parameter is absent, a default of 2 is assumed. If | this transport parameter is absent, a default of 2 is assumed. If | |||
| an endpoint issues a zero-length connection ID, it will never send | an endpoint issues a zero-length connection ID, it will never send | |||
| a NEW_CONNECTION_ID frame and therefore ignores the | a NEW_CONNECTION_ID frame and therefore ignores the | |||
| active_connection_id_limit value received from its peer. | active_connection_id_limit value received from its peer. | |||
| initial_source_connection_id (0x0f): The value that the endpoint | initial_source_connection_id (0x0f): This is the value that the | |||
| included in the Source Connection ID field of the first Initial | endpoint included in the Source Connection ID field of the first | |||
| packet it sends for the connection; see Section 7.3. | Initial packet it sends for the connection; see Section 7.3. | |||
| retry_source_connection_id (0x10): The value that the server | retry_source_connection_id (0x10): This is the value that the server | |||
| included in the Source Connection ID field of a Retry packet; see | included in the Source Connection ID field of a Retry packet; see | |||
| Section 7.3. This transport parameter is only sent by a server. | Section 7.3. This transport parameter is only sent by a server. | |||
| If present, transport parameters that set initial per-stream flow | If present, transport parameters that set initial per-stream flow | |||
| control limits (initial_max_stream_data_bidi_local, | control limits (initial_max_stream_data_bidi_local, | |||
| initial_max_stream_data_bidi_remote, and initial_max_stream_data_uni) | initial_max_stream_data_bidi_remote, and initial_max_stream_data_uni) | |||
| are equivalent to sending a MAX_STREAM_DATA frame (Section 19.10) on | are equivalent to sending a MAX_STREAM_DATA frame (Section 19.10) on | |||
| every stream of the corresponding type immediately after opening. If | every stream of the corresponding type immediately after opening. If | |||
| the transport parameter is absent, streams of that type start with a | the transport parameter is absent, streams of that type start with a | |||
| flow control limit of 0. | flow control limit of 0. | |||
| skipping to change at page 126, line 48 ¶ | skipping to change at page 125, line 48 ¶ | |||
| 19. Frame Types and Formats | 19. Frame Types and Formats | |||
| As described in Section 12.4, packets contain one or more frames. | As described in Section 12.4, packets contain one or more frames. | |||
| This section describes the format and semantics of the core QUIC | This section describes the format and semantics of the core QUIC | |||
| frame types. | frame types. | |||
| 19.1. PADDING Frames | 19.1. PADDING Frames | |||
| A PADDING frame (type=0x00) has no semantic value. PADDING frames | A 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 packet to the minimum required size or to provide | |||
| provide protection against traffic analysis for protected packets. | protection against traffic analysis for protected packets. | |||
| PADDING frames are formatted as shown in Figure 21, which shows that | PADDING frames are formatted as shown in Figure 21, which shows that | |||
| PADDING frames have no content. That is, a PADDING frame consists of | PADDING frames have no content. That is, a PADDING frame consists of | |||
| the single byte that identifies the frame as a PADDING frame. | the single byte that identifies the frame as a PADDING frame. | |||
| PADDING Frame { | PADDING Frame { | |||
| Type (i) = 0x00, | Type (i) = 0x00, | |||
| } | } | |||
| Figure 21: PADDING Frame Format | Figure 21: PADDING Frame Format | |||
| skipping to change at page 127, line 44 ¶ | skipping to change at page 126, line 44 ¶ | |||
| from timing out; see Section 10.1.2. | from timing out; see Section 10.1.2. | |||
| 19.3. ACK Frames | 19.3. ACK Frames | |||
| Receivers send ACK frames (types 0x02 and 0x03) to inform senders of | Receivers send ACK frames (types 0x02 and 0x03) to inform senders of | |||
| packets they have received and processed. The ACK frame contains one | packets they have received and processed. The ACK frame contains one | |||
| or more ACK Ranges. ACK Ranges identify acknowledged packets. If | or more ACK Ranges. ACK Ranges identify acknowledged packets. If | |||
| the frame type is 0x03, ACK frames also contain the cumulative count | the frame type is 0x03, ACK frames also contain the cumulative count | |||
| of QUIC packets with associated ECN marks received on the connection | of QUIC packets with associated ECN marks received on the connection | |||
| up until this point. QUIC implementations MUST properly handle both | up until this point. QUIC implementations MUST properly handle both | |||
| types and, if they have enabled ECN for packets they send, they | types, and, if they have enabled ECN for packets they send, they | |||
| SHOULD use the information in the ECN section to manage their | SHOULD use the information in the ECN section to manage their | |||
| congestion state. | congestion state. | |||
| QUIC acknowledgments are irrevocable. Once acknowledged, a packet | QUIC acknowledgments are irrevocable. Once acknowledged, a packet | |||
| remains acknowledged, even if it does not appear in a future ACK | remains acknowledged, even if it does not appear in a future ACK | |||
| frame. This is unlike reneging for TCP SACKs ([RFC2018]). | frame. This is unlike reneging for TCP Selective Acknowledgments | |||
| (SACKs) [RFC2018]. | ||||
| Packets from different packet number spaces can be identified using | Packets from different packet number spaces can be identified using | |||
| the same numeric value. An acknowledgment for a packet needs to | the same numeric value. An acknowledgment for a packet needs to | |||
| indicate both a packet number and a packet number space. This is | indicate both a packet number and a packet number space. This is | |||
| accomplished by having each ACK frame only acknowledge packet numbers | accomplished by having each ACK frame only acknowledge packet numbers | |||
| in the same space as the packet in which the ACK frame is contained. | in the same space as the packet in which the ACK frame is contained. | |||
| Version Negotiation and Retry packets cannot be acknowledged because | Version Negotiation and Retry packets cannot be acknowledged because | |||
| they do not contain a packet number. Rather than relying on ACK | they do not contain a packet number. Rather than relying on ACK | |||
| frames, these packets are implicitly acknowledged by the next Initial | frames, these packets are implicitly acknowledged by the next Initial | |||
| skipping to change at page 129, line 5 ¶ | skipping to change at page 128, line 5 ¶ | |||
| values within the same number of bytes, at the cost of lower | values within the same number of bytes, at the cost of lower | |||
| resolution. | resolution. | |||
| ACK Range Count: A variable-length integer specifying the number of | ACK Range Count: A variable-length integer specifying the number of | |||
| ACK Range fields in the frame. | ACK Range fields in the frame. | |||
| First ACK Range: A variable-length integer indicating the number of | First ACK Range: A variable-length integer indicating the number of | |||
| contiguous packets preceding the Largest Acknowledged that are | contiguous packets preceding the Largest Acknowledged that are | |||
| being acknowledged. That is, the smallest packet acknowledged in | being acknowledged. That is, the smallest packet acknowledged in | |||
| the range is determined by subtracting the First ACK Range value | the range is determined by subtracting the First ACK Range value | |||
| from the Largest Acknowledged. | from the Largest Acknowledged field. | |||
| ACK Ranges: Contains additional ranges of packets that are | ACK Ranges: Contains additional ranges of packets that are | |||
| alternately not acknowledged (Gap) and acknowledged (ACK Range); | alternately not acknowledged (Gap) and acknowledged (ACK Range); | |||
| see Section 19.3.1. | see Section 19.3.1. | |||
| ECN Counts: The three ECN Counts; see Section 19.3.2. | ECN Counts: The three ECN counts; see Section 19.3.2. | |||
| 19.3.1. ACK Ranges | 19.3.1. ACK Ranges | |||
| Each ACK Range consists of alternating Gap and ACK Range Length | Each ACK Range consists of alternating Gap and ACK Range Length | |||
| values in descending packet number order. ACK Ranges can be | values in descending packet number order. ACK Ranges can be | |||
| repeated. The number of Gap and ACK Range Length values is | repeated. The number of Gap and ACK Range Length values is | |||
| determined by the ACK Range Count field; one of each value is present | determined by the ACK Range Count field; one of each value is present | |||
| for each value in the ACK Range Count field. | for each value in the ACK Range Count field. | |||
| ACK Ranges are structured as shown in Figure 24. | ACK Ranges are structured as shown in Figure 24. | |||
| skipping to change at page 129, line 47 ¶ | skipping to change at page 128, line 47 ¶ | |||
| contiguous acknowledged packets preceding the largest packet | contiguous acknowledged packets preceding the largest packet | |||
| number, as determined by the preceding Gap. | number, as determined by the preceding Gap. | |||
| Gap and ACK Range Length values use a relative integer encoding for | Gap and ACK Range Length values 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 Range describes progressively lower- | subtracted, so that each ACK Range describes progressively lower- | |||
| numbered packets. | numbered packets. | |||
| Each ACK Range acknowledges a contiguous range of packets by | Each ACK Range acknowledges a contiguous range of packets by | |||
| indicating the number of acknowledged packets that precede the | indicating the number of acknowledged packets that precede the | |||
| largest packet number in that range. A value of zero indicates that | largest packet number in that range. A value of 0 indicates that | |||
| only the largest packet number is acknowledged. Larger ACK Range | only the largest packet number is acknowledged. Larger ACK Range | |||
| values indicate a larger range, with corresponding lower values for | values indicate a larger range, with corresponding lower values for | |||
| the smallest packet number in the range. Thus, given a largest | the smallest packet number in the range. Thus, given a largest | |||
| packet number for the range, the smallest value is determined by the | packet number for the range, the smallest value is determined by the | |||
| formula: | following formula: | |||
| smallest = largest - ack_range | smallest = largest - ack_range | |||
| An ACK Range acknowledges all packets between the smallest packet | An ACK Range acknowledges all packets between the smallest packet | |||
| number and the largest, inclusive. | number and the largest, inclusive. | |||
| The largest value for an ACK Range is determined by cumulatively | The largest value for an ACK Range is determined by cumulatively | |||
| subtracting the size of all preceding ACK Range Lengths and Gaps. | subtracting the size of all preceding ACK Range Lengths and Gaps. | |||
| Each Gap indicates a range of packets that are not being | Each Gap indicates a range of packets that are not being | |||
| skipping to change at page 130, line 31 ¶ | skipping to change at page 129, line 31 ¶ | |||
| largest = previous_smallest - gap - 2 | largest = previous_smallest - gap - 2 | |||
| If any computed packet number is negative, an endpoint MUST generate | If any computed packet number is negative, an endpoint MUST generate | |||
| a connection error of type FRAME_ENCODING_ERROR. | a connection error of type FRAME_ENCODING_ERROR. | |||
| 19.3.2. ECN Counts | 19.3.2. ECN Counts | |||
| The ACK frame uses the least significant bit of the type value (that | The ACK frame uses the least significant bit of the type value (that | |||
| is, type 0x03) to indicate ECN feedback and report receipt of QUIC | is, type 0x03) to indicate ECN feedback and report receipt of QUIC | |||
| packets with associated ECN codepoints of ECT(0), ECT(1), or CE in | packets with associated ECN codepoints of ECT(0), ECT(1), or ECN-CE | |||
| the packet's IP header. ECN Counts are only present when the ACK | in the packet's IP header. ECN counts are only present when the ACK | |||
| frame type is 0x03. | frame type is 0x03. | |||
| When present, there are 3 ECN counts, as shown in Figure 25. | When present, there are three ECN counts, as shown in Figure 25. | |||
| ECN Counts { | ECN Counts { | |||
| ECT0 Count (i), | ECT0 Count (i), | |||
| ECT1 Count (i), | ECT1 Count (i), | |||
| ECN-CE Count (i), | ECN-CE Count (i), | |||
| } | } | |||
| Figure 25: ECN Count Format | Figure 25: ECN Count Format | |||
| The three ECN Counts are: | The ECN count fields are: | |||
| ECT0 Count: A variable-length integer representing the total number | ECT0 Count: A variable-length integer representing the total number | |||
| of packets received with the ECT(0) codepoint in the packet number | of packets received with the ECT(0) codepoint in the packet number | |||
| space of the ACK frame. | space of the ACK frame. | |||
| ECT1 Count: A variable-length integer representing the total number | ECT1 Count: A variable-length integer representing the total number | |||
| of packets received with the ECT(1) codepoint in the packet number | of packets received with the ECT(1) codepoint in the packet number | |||
| space of the ACK frame. | space of the ACK frame. | |||
| CE Count: A variable-length integer representing the total number of | ECN-CE Count: A variable-length integer representing the total | |||
| packets received with the CE codepoint in the packet number space | number of packets received with the ECN-CE codepoint in the packet | |||
| of the ACK frame. | number space of the ACK frame. | |||
| ECN counts are maintained separately for each packet number space. | ECN counts are maintained separately for each packet number space. | |||
| 19.4. RESET_STREAM Frames | 19.4. RESET_STREAM Frames | |||
| An endpoint uses a RESET_STREAM frame (type=0x04) to abruptly | An endpoint uses a RESET_STREAM frame (type=0x04) to abruptly | |||
| terminate the sending part of a stream. | terminate the sending part of a stream. | |||
| After sending a RESET_STREAM, an endpoint ceases transmission and | After sending a RESET_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 | |||
| skipping to change at page 131, line 41 ¶ | skipping to change at page 130, line 41 ¶ | |||
| Type (i) = 0x04, | Type (i) = 0x04, | |||
| Stream ID (i), | Stream ID (i), | |||
| Application Protocol Error Code (i), | Application Protocol Error Code (i), | |||
| Final Size (i), | Final Size (i), | |||
| } | } | |||
| Figure 26: RESET_STREAM Frame Format | Figure 26: RESET_STREAM Frame Format | |||
| RESET_STREAM frames contain the following fields: | RESET_STREAM frames contain the following fields: | |||
| 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 variable-length integer | Application Protocol Error Code: A variable-length integer | |||
| containing the application protocol error code (see Section 20.2) | containing the application protocol error code (see Section 20.2) | |||
| that indicates why the stream is being closed. | that indicates why the stream is being closed. | |||
| Final Size: A variable-length integer indicating the final size of | Final Size: A variable-length integer indicating the final size of | |||
| the stream by the RESET_STREAM sender, in unit of bytes; see | the stream by the RESET_STREAM sender, in units of bytes; see | |||
| Section 4.5. | Section 4.5. | |||
| 19.5. STOP_SENDING Frames | 19.5. STOP_SENDING Frames | |||
| An endpoint uses a STOP_SENDING frame (type=0x05) to communicate that | An endpoint uses a STOP_SENDING frame (type=0x05) to communicate that | |||
| incoming data is being discarded on receipt at application request. | incoming data is being discarded on receipt per application request. | |||
| STOP_SENDING requests that a peer cease transmission on a stream. | STOP_SENDING requests that a peer cease transmission on a stream. | |||
| A STOP_SENDING frame can be sent for streams in the Recv or Size | A STOP_SENDING frame can be sent for streams in the "Recv" or "Size | |||
| Known states; see Section 3.1. Receiving a STOP_SENDING frame for a | Known" states; see Section 3.2. Receiving a STOP_SENDING frame for a | |||
| locally-initiated stream that has not yet been created MUST be | locally initiated stream that has not yet been created MUST be | |||
| treated as a connection error of type STREAM_STATE_ERROR. An | treated as a connection error of type STREAM_STATE_ERROR. An | |||
| endpoint that receives a STOP_SENDING frame for a receive-only stream | endpoint that receives a STOP_SENDING frame for a receive-only stream | |||
| MUST terminate the connection with error STREAM_STATE_ERROR. | MUST terminate the connection with error STREAM_STATE_ERROR. | |||
| STOP_SENDING frames are formatted as shown in Figure 27. | STOP_SENDING frames are formatted as shown in Figure 27. | |||
| STOP_SENDING Frame { | STOP_SENDING Frame { | |||
| Type (i) = 0x05, | Type (i) = 0x05, | |||
| Stream ID (i), | Stream ID (i), | |||
| Application Protocol Error Code (i), | Application Protocol Error Code (i), | |||
| } | } | |||
| Figure 27: STOP_SENDING Frame Format | Figure 27: STOP_SENDING Frame Format | |||
| STOP_SENDING frames contain the following fields: | STOP_SENDING frames contain the following fields: | |||
| 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 Protocol Error Code: A variable-length integer | Application Protocol Error Code: A variable-length integer | |||
| containing the application-specified reason the sender is ignoring | containing the application-specified reason the sender is ignoring | |||
| the stream; see Section 20.2. | the stream; see Section 20.2. | |||
| 19.6. CRYPTO Frames | 19.6. CRYPTO Frames | |||
| A CRYPTO frame (type=0x06) is used to transmit cryptographic | A CRYPTO frame (type=0x06) is used to transmit cryptographic | |||
| handshake messages. It can be sent in all packet types except 0-RTT. | handshake messages. It can be sent in all packet types except 0-RTT. | |||
| skipping to change at page 133, line 29 ¶ | skipping to change at page 132, line 29 ¶ | |||
| Length: A variable-length integer specifying the length of the | Length: A variable-length integer specifying the length of the | |||
| Crypto Data field in this CRYPTO frame. | Crypto Data field in this CRYPTO frame. | |||
| Crypto Data: The cryptographic message data. | Crypto Data: The cryptographic message data. | |||
| There is a separate flow of cryptographic handshake data in each | There is a separate flow of cryptographic handshake data in each | |||
| encryption level, each of which starts at an offset of 0. This | encryption level, each of which starts at an offset of 0. This | |||
| implies that each encryption level is treated as a separate CRYPTO | implies that each encryption level is treated as a separate CRYPTO | |||
| stream of data. | stream of data. | |||
| The largest offset delivered on a stream - the sum of the offset and | The largest offset delivered on a stream -- the sum of the offset and | |||
| data length - cannot exceed 2^62-1. Receipt of a frame that exceeds | data length -- cannot exceed 2^62-1. Receipt of a frame that exceeds | |||
| this limit MUST be treated as a connection error of type | this limit MUST be treated as a connection error of type | |||
| FRAME_ENCODING_ERROR or CRYPTO_BUFFER_EXCEEDED. | FRAME_ENCODING_ERROR or CRYPTO_BUFFER_EXCEEDED. | |||
| Unlike STREAM frames, which include a Stream ID indicating to which | Unlike STREAM frames, which include a stream ID indicating to which | |||
| stream the data belongs, the CRYPTO frame carries data for a single | stream the data belongs, the CRYPTO frame carries data for a single | |||
| stream per encryption level. The stream does not have an explicit | stream per encryption level. The stream does not have an explicit | |||
| end, so CRYPTO frames do not have a FIN bit. | end, so CRYPTO frames do not have a FIN bit. | |||
| 19.7. NEW_TOKEN Frames | 19.7. NEW_TOKEN Frames | |||
| A server sends a NEW_TOKEN frame (type=0x07) to provide the client | A server sends a NEW_TOKEN frame (type=0x07) to provide the client | |||
| with a token to send in the header of an Initial packet for a future | with a token to send in the header of an Initial packet for a future | |||
| connection. | connection. | |||
| skipping to change at page 134, line 36 ¶ | skipping to change at page 133, line 36 ¶ | |||
| duplicate values, which might be used to link connection attempts; | duplicate values, which might be used to link connection attempts; | |||
| see Section 8.1.3. | see Section 8.1.3. | |||
| Clients MUST NOT send NEW_TOKEN frames. A server MUST treat receipt | Clients MUST NOT send NEW_TOKEN frames. A server MUST treat receipt | |||
| of a NEW_TOKEN frame as a connection error of type | of a NEW_TOKEN frame as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| 19.8. STREAM Frames | 19.8. 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 Type field takes the form 0b00001XXX (or the set of | Type field in the STREAM frame takes the form 0b00001XXX (or the set | |||
| values from 0x08 to 0x0f). The three low-order bits of the frame | of values from 0x08 to 0x0f). 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 | |||
| first bytes of the stream, or the end of a stream that includes no | first bytes of the stream, or the end of a stream that includes no | |||
| data). | data). | |||
| o The LEN bit (0x02) in the frame type is set to indicate that there | o The LEN bit (0x02) in the frame type is set to indicate that there | |||
| is a Length field present. If this bit is set to 0, the Length | is a Length field present. If this bit is set to 0, the Length | |||
| field is absent and the Stream Data field extends to the end of | field is absent and the Stream Data field extends to the end of | |||
| the packet. If this bit is set to 1, the Length field is present. | the packet. If this bit is set to 1, the Length field is present. | |||
| o The FIN bit (0x01) indicates that the frame marks the end of the | o The FIN bit (0x01) indicates that the frame marks the end of the | |||
| stream. The final size of the stream is the sum of the offset and | stream. The final size of the stream is the sum of the offset and | |||
| the length of this frame. | the length of this frame. | |||
| An endpoint MUST terminate the connection with error | An endpoint MUST terminate the connection with error | |||
| STREAM_STATE_ERROR if it receives a STREAM frame for a locally- | STREAM_STATE_ERROR if it receives a STREAM frame for a locally | |||
| initiated stream that has not yet been created, or for a send-only | initiated stream that has not yet been created, or for a send-only | |||
| stream. | stream. | |||
| STREAM frames are formatted as shown in Figure 30. | STREAM frames are formatted as shown in Figure 30. | |||
| STREAM Frame { | STREAM Frame { | |||
| Type (i) = 0x08..0x0f, | Type (i) = 0x08..0x0f, | |||
| Stream ID (i), | Stream ID (i), | |||
| [Offset (i)], | [Offset (i)], | |||
| [Length (i)], | [Length (i)], | |||
| skipping to change at page 135, line 47 ¶ | skipping to change at page 134, line 47 ¶ | |||
| 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 bytes in the packet. | Stream Data field consumes all the remaining bytes 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. | |||
| When a Stream Data field has a length of 0, the offset in the STREAM | When a Stream Data field has a length of 0, the offset in the STREAM | |||
| frame is the offset of the next byte that would be sent. | frame is the offset of the 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 offset and data length - | delivered on a stream -- the sum of the offset and data length -- | |||
| cannot exceed 2^62-1, as it is not possible to provide flow control | cannot exceed 2^62-1, as it is not possible to provide flow control | |||
| credit for that data. Receipt of a frame that exceeds this limit | credit for that data. Receipt of a frame that exceeds this limit | |||
| MUST be treated as a connection error of type FRAME_ENCODING_ERROR or | MUST be treated as a connection error of type FRAME_ENCODING_ERROR or | |||
| FLOW_CONTROL_ERROR. | FLOW_CONTROL_ERROR. | |||
| 19.9. MAX_DATA Frames | 19.9. MAX_DATA Frames | |||
| A MAX_DATA frame (type=0x10) is used in flow control to inform the | A MAX_DATA frame (type=0x10) 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. | |||
| skipping to change at page 136, line 27 ¶ | skipping to change at page 135, line 27 ¶ | |||
| Figure 31: MAX_DATA Frame Format | Figure 31: MAX_DATA Frame Format | |||
| MAX_DATA frames contain the following field: | MAX_DATA frames contain the following field: | |||
| Maximum Data: A variable-length integer indicating the maximum | Maximum Data: A variable-length integer indicating the maximum | |||
| amount of data that can be sent on the entire connection, in units | amount of data that can be sent on the entire connection, in units | |||
| of bytes. | of bytes. | |||
| All data sent in STREAM frames counts toward this limit. The sum of | All data sent in STREAM frames counts toward this limit. The sum of | |||
| the final sizes on all streams - including streams in terminal states | the final sizes on all streams -- including streams in terminal | |||
| - MUST NOT exceed the value advertised by a receiver. An endpoint | states -- MUST NOT exceed the value advertised by a receiver. An | |||
| MUST terminate a connection with a FLOW_CONTROL_ERROR error if it | endpoint MUST terminate a connection with an error of type | |||
| receives more data than the maximum data value that it has sent. | FLOW_CONTROL_ERROR if it receives more data than the maximum data | |||
| This includes violations of remembered limits in Early Data; see | value that it has sent. This includes violations of remembered | |||
| Section 7.4.1. | limits in Early Data; see Section 7.4.1. | |||
| 19.10. MAX_STREAM_DATA Frames | 19.10. MAX_STREAM_DATA Frames | |||
| A MAX_STREAM_DATA frame (type=0x11) is used in flow control to inform | A MAX_STREAM_DATA frame (type=0x11) is used in flow control to inform | |||
| a peer of the maximum amount of data that can be sent on a stream. | a peer of the maximum amount of data that can be sent on a stream. | |||
| A MAX_STREAM_DATA frame can be sent for streams in the Recv state; | A MAX_STREAM_DATA frame can be sent for streams in the "Recv" state; | |||
| see Section 3.1. Receiving a MAX_STREAM_DATA frame for a locally- | see Section 3.2. Receiving a MAX_STREAM_DATA frame for a locally | |||
| initiated stream that has not yet been created MUST be treated as a | initiated stream that has not yet been created MUST be treated as a | |||
| connection error of type STREAM_STATE_ERROR. An endpoint that | connection error of type STREAM_STATE_ERROR. An endpoint that | |||
| receives a MAX_STREAM_DATA frame for a receive-only stream MUST | receives a MAX_STREAM_DATA frame for a receive-only stream MUST | |||
| terminate the connection with error STREAM_STATE_ERROR. | terminate the connection with error STREAM_STATE_ERROR. | |||
| MAX_STREAM_DATA frames are formatted as shown in Figure 32. | MAX_STREAM_DATA frames are formatted as shown in Figure 32. | |||
| MAX_STREAM_DATA Frame { | MAX_STREAM_DATA Frame { | |||
| Type (i) = 0x11, | Type (i) = 0x11, | |||
| Stream ID (i), | Stream ID (i), | |||
| Maximum Stream Data (i), | Maximum Stream Data (i), | |||
| } | } | |||
| Figure 32: MAX_STREAM_DATA Frame Format | Figure 32: MAX_STREAM_DATA Frame Format | |||
| MAX_STREAM_DATA frames contain the following fields: | MAX_STREAM_DATA frames contain the following fields: | |||
| Stream ID: The stream ID of the stream that is affected encoded as a | Stream ID: The stream ID of the affected stream, encoded as a | |||
| variable-length integer. | variable-length integer. | |||
| Maximum Stream Data: A variable-length integer indicating the | Maximum Stream Data: A variable-length integer indicating the | |||
| maximum amount of data that can be sent on the identified stream, | maximum amount of data that can be sent on the identified stream, | |||
| in units of bytes. | in units of bytes. | |||
| When counting data toward this limit, an endpoint accounts for the | When counting data toward this limit, an endpoint accounts for the | |||
| largest received offset of data that is sent or received on the | largest received offset of data that is sent or received on the | |||
| stream. Loss or reordering can mean that the largest received offset | stream. Loss or reordering can mean that the largest received offset | |||
| on a stream can be greater than the total size of data received on | on a stream can be greater than the total size of data received on | |||
| that stream. Receiving STREAM frames might not increase the largest | that stream. Receiving STREAM frames might not increase the largest | |||
| received offset. | received offset. | |||
| The data sent on a stream MUST NOT exceed the largest maximum stream | The data sent on a stream MUST NOT exceed the largest maximum stream | |||
| data value advertised by the receiver. An endpoint MUST terminate a | data value advertised by the receiver. An endpoint MUST terminate a | |||
| connection with a FLOW_CONTROL_ERROR error if it receives more data | connection with an error of type FLOW_CONTROL_ERROR if it receives | |||
| than the largest maximum stream data that it has sent for the | more data than the largest maximum stream data that it has sent for | |||
| affected stream. This includes violations of remembered limits in | the affected stream. This includes violations of remembered limits | |||
| Early Data; see Section 7.4.1. | in Early Data; see Section 7.4.1. | |||
| 19.11. MAX_STREAMS Frames | 19.11. MAX_STREAMS Frames | |||
| A MAX_STREAMS frame (type=0x12 or 0x13) inform the peer of the | A MAX_STREAMS frame (type=0x12 or 0x13) informs the peer of the | |||
| cumulative number of streams of a given type it is permitted to open. | cumulative number of streams of a given type it is permitted to open. | |||
| A MAX_STREAMS frame with a type of 0x12 applies to bidirectional | A MAX_STREAMS frame with a type of 0x12 applies to bidirectional | |||
| streams, and a MAX_STREAMS frame with a type of 0x13 applies to | streams, and a MAX_STREAMS frame with a type of 0x13 applies to | |||
| unidirectional streams. | unidirectional streams. | |||
| MAX_STREAMS frames are formatted as shown in Figure 33; | MAX_STREAMS frames are formatted as shown in Figure 33. | |||
| MAX_STREAMS Frame { | MAX_STREAMS Frame { | |||
| Type (i) = 0x12..0x13, | Type (i) = 0x12..0x13, | |||
| Maximum Streams (i), | Maximum Streams (i), | |||
| } | } | |||
| Figure 33: MAX_STREAMS Frame Format | Figure 33: MAX_STREAMS Frame Format | |||
| MAX_STREAMS frames contain the following field: | MAX_STREAMS frames contain the following field: | |||
| Maximum Streams: A count of the cumulative number of streams of the | Maximum Streams: A count of the cumulative number of streams of the | |||
| corresponding type that can be opened over the lifetime of the | corresponding type that can be opened over the lifetime of the | |||
| connection. This value cannot exceed 2^60, as it is not possible | connection. This value cannot exceed 2^60, as it is not possible | |||
| to encode stream IDs larger than 2^62-1. Receipt of a frame that | to encode stream IDs larger than 2^62-1. Receipt of a frame that | |||
| permits opening of a stream larger than this limit MUST be treated | permits opening of a stream larger than this limit MUST be treated | |||
| as a FRAME_ENCODING_ERROR. | as a connection error of type FRAME_ENCODING_ERROR. | |||
| Loss or reordering can cause a MAX_STREAMS frame to be received that | Loss or reordering can cause an endpoint to receive a MAX_STREAMS | |||
| state a lower stream limit than an endpoint has previously received. | frame with a lower stream limit than was previously received. | |||
| MAX_STREAMS frames that do not increase the stream limit MUST be | MAX_STREAMS frames that do not increase the stream limit MUST be | |||
| ignored. | ignored. | |||
| An endpoint MUST NOT open more streams than permitted by the current | An endpoint MUST NOT open more streams than permitted by the current | |||
| stream limit set by its peer. For instance, a server that receives a | stream limit set by its peer. For instance, a server that receives a | |||
| unidirectional stream limit of 3 is permitted to open stream 3, 7, | unidirectional stream limit of 3 is permitted to open streams 3, 7, | |||
| and 11, but not stream 15. An endpoint MUST terminate a connection | and 11, but not stream 15. An endpoint MUST terminate a connection | |||
| with a STREAM_LIMIT_ERROR error if a peer opens more streams than was | with an error of type STREAM_LIMIT_ERROR if a peer opens more streams | |||
| permitted. This includes violations of remembered limits in Early | than was permitted. This includes violations of remembered limits in | |||
| Data; see Section 7.4.1. | Early Data; see Section 7.4.1. | |||
| Note that these frames (and the corresponding transport parameters) | Note that these frames (and the corresponding transport parameters) | |||
| do not describe the number of streams that can be opened | do not describe the number of streams that can be opened | |||
| concurrently. The limit includes streams that have been closed as | concurrently. The limit includes streams that have been closed as | |||
| well as those that are open. | well as those that are open. | |||
| 19.12. DATA_BLOCKED Frames | 19.12. DATA_BLOCKED Frames | |||
| A sender SHOULD send a DATA_BLOCKED frame (type=0x14) when it wishes | A sender SHOULD send a DATA_BLOCKED frame (type=0x14) when it wishes | |||
| to send data, but is unable to do so due to connection-level flow | to send data but is unable to do so due to connection-level flow | |||
| control; see Section 4. DATA_BLOCKED frames can be used as input to | control; see Section 4. DATA_BLOCKED frames can be used as input to | |||
| tuning of flow control algorithms; see Section 4.2. | tuning of flow control algorithms; see Section 4.2. | |||
| DATA_BLOCKED frames are formatted as shown in Figure 34. | DATA_BLOCKED frames are formatted as shown in Figure 34. | |||
| DATA_BLOCKED Frame { | DATA_BLOCKED Frame { | |||
| Type (i) = 0x14, | Type (i) = 0x14, | |||
| Maximum Data (i), | Maximum Data (i), | |||
| } | } | |||
| Figure 34: DATA_BLOCKED Frame Format | Figure 34: DATA_BLOCKED Frame Format | |||
| DATA_BLOCKED frames contain the following field: | DATA_BLOCKED frames contain the following field: | |||
| Maximum Data: A variable-length integer indicating the connection- | Maximum Data: A variable-length integer indicating the connection- | |||
| level limit at which blocking occurred. | level limit at which blocking occurred. | |||
| 19.13. STREAM_DATA_BLOCKED Frames | 19.13. STREAM_DATA_BLOCKED Frames | |||
| A sender SHOULD send a STREAM_DATA_BLOCKED frame (type=0x15) when it | A sender SHOULD send a STREAM_DATA_BLOCKED frame (type=0x15) when it | |||
| wishes to send data, but is unable to do so due to stream-level flow | wishes to send data but is unable to do so due to stream-level flow | |||
| control. This frame is analogous to DATA_BLOCKED (Section 19.12). | control. This frame is analogous to DATA_BLOCKED (Section 19.12). | |||
| An endpoint that receives a STREAM_DATA_BLOCKED frame for a send-only | An endpoint that receives a STREAM_DATA_BLOCKED frame for a send-only | |||
| stream MUST terminate the connection with error STREAM_STATE_ERROR. | stream MUST terminate the connection with error STREAM_STATE_ERROR. | |||
| STREAM_DATA_BLOCKED frames are formatted as shown in Figure 35. | STREAM_DATA_BLOCKED frames are formatted as shown in Figure 35. | |||
| STREAM_DATA_BLOCKED Frame { | STREAM_DATA_BLOCKED Frame { | |||
| Type (i) = 0x15, | Type (i) = 0x15, | |||
| Stream ID (i), | Stream ID (i), | |||
| skipping to change at page 139, line 35 ¶ | skipping to change at page 138, line 35 ¶ | |||
| Stream ID: A variable-length integer indicating the stream that is | Stream ID: A variable-length integer indicating the stream that is | |||
| blocked due to flow control. | blocked due to flow control. | |||
| Maximum Stream Data: A variable-length integer indicating the offset | Maximum Stream Data: A variable-length integer indicating the offset | |||
| of the stream at which the blocking occurred. | of the stream at which the blocking occurred. | |||
| 19.14. STREAMS_BLOCKED Frames | 19.14. STREAMS_BLOCKED Frames | |||
| A sender SHOULD send a STREAMS_BLOCKED frame (type=0x16 or 0x17) when | A sender SHOULD send a STREAMS_BLOCKED frame (type=0x16 or 0x17) when | |||
| it wishes to open a stream, but is unable to due to the maximum | it wishes to open a stream but is unable to do so due to the maximum | |||
| stream limit set by its peer; see Section 19.11. A STREAMS_BLOCKED | stream limit set by its peer; see Section 19.11. A STREAMS_BLOCKED | |||
| frame of type 0x16 is used to indicate reaching the bidirectional | frame of type 0x16 is used to indicate reaching the bidirectional | |||
| stream limit, and a STREAMS_BLOCKED frame of type 0x17 is used to | stream limit, and a STREAMS_BLOCKED frame of type 0x17 is used to | |||
| indicate reaching the unidirectional stream limit. | indicate reaching the unidirectional stream limit. | |||
| A STREAMS_BLOCKED frame does not open the stream, but informs the | A STREAMS_BLOCKED frame does not open the stream, but informs the | |||
| peer that a new stream was needed and the stream limit prevented the | peer that a new stream was needed and the stream limit prevented the | |||
| creation of the stream. | creation of the stream. | |||
| STREAMS_BLOCKED frames are formatted as shown in Figure 36. | STREAMS_BLOCKED frames are formatted as shown in Figure 36. | |||
| skipping to change at page 140, line 11 ¶ | skipping to change at page 139, line 11 ¶ | |||
| } | } | |||
| Figure 36: STREAMS_BLOCKED Frame Format | Figure 36: STREAMS_BLOCKED Frame Format | |||
| STREAMS_BLOCKED frames contain the following field: | STREAMS_BLOCKED frames contain the following field: | |||
| Maximum Streams: A variable-length integer indicating the maximum | Maximum Streams: A variable-length integer indicating the maximum | |||
| number of streams allowed at the time the frame was sent. This | number of streams allowed at the time the frame was sent. This | |||
| value cannot exceed 2^60, as it is not possible to encode stream | value cannot exceed 2^60, as it is not possible to encode stream | |||
| IDs larger than 2^62-1. Receipt of a frame that encodes a larger | IDs larger than 2^62-1. Receipt of a frame that encodes a larger | |||
| stream ID MUST be treated as a STREAM_LIMIT_ERROR or a | stream ID MUST be treated as a connection error of type | |||
| FRAME_ENCODING_ERROR. | STREAM_LIMIT_ERROR or FRAME_ENCODING_ERROR. | |||
| 19.15. NEW_CONNECTION_ID Frames | 19.15. NEW_CONNECTION_ID Frames | |||
| An endpoint sends a NEW_CONNECTION_ID frame (type=0x18) to provide | An endpoint sends a NEW_CONNECTION_ID frame (type=0x18) to provide | |||
| its peer with alternative connection IDs that can be used to break | its peer with alternative connection IDs that can be used to break | |||
| linkability when migrating connections; see Section 9.5. | linkability when migrating connections; see Section 9.5. | |||
| NEW_CONNECTION_ID frames are formatted as shown in Figure 37. | NEW_CONNECTION_ID frames are formatted as shown in Figure 37. | |||
| NEW_CONNECTION_ID Frame { | NEW_CONNECTION_ID Frame { | |||
| skipping to change at page 141, line 7 ¶ | skipping to change at page 140, line 7 ¶ | |||
| FRAME_ENCODING_ERROR. | FRAME_ENCODING_ERROR. | |||
| Connection ID: A connection ID of the specified length. | Connection ID: A connection ID of the specified length. | |||
| Stateless Reset Token: A 128-bit value that will be used for a | Stateless Reset Token: A 128-bit value that will be used for a | |||
| stateless reset when the associated connection ID is used; see | stateless reset when the associated connection ID is used; see | |||
| Section 10.3. | Section 10.3. | |||
| An endpoint MUST NOT send this frame if it currently requires that | An endpoint MUST NOT send this frame if it currently requires that | |||
| its peer send packets with a zero-length Destination Connection ID. | its peer send packets with a zero-length Destination Connection ID. | |||
| Changing the length of a connection ID to or from zero-length makes | Changing the length of a connection ID to or from zero length makes | |||
| it difficult to identify when the value of the connection ID changed. | it difficult to identify when the value of the connection ID changed. | |||
| An endpoint that is sending packets with a zero-length Destination | An endpoint that is sending packets with a zero-length Destination | |||
| Connection ID MUST treat receipt of a NEW_CONNECTION_ID frame as a | Connection ID MUST treat receipt of a NEW_CONNECTION_ID frame as a | |||
| connection error of type PROTOCOL_VIOLATION. | connection error of type PROTOCOL_VIOLATION. | |||
| Transmission errors, timeouts and retransmissions might cause the | Transmission errors, timeouts, and retransmissions might cause the | |||
| same NEW_CONNECTION_ID frame to be received multiple times. Receipt | same NEW_CONNECTION_ID frame to be received multiple times. Receipt | |||
| of the same frame multiple times MUST NOT be treated as a connection | of the same frame multiple times MUST NOT be treated as a connection | |||
| error. A receiver can use the sequence number supplied in the | error. A receiver can use the sequence number supplied in the | |||
| NEW_CONNECTION_ID frame to handle receiving the same | NEW_CONNECTION_ID frame to handle receiving the same | |||
| NEW_CONNECTION_ID frame multiple times. | NEW_CONNECTION_ID frame multiple times. | |||
| If an endpoint receives a NEW_CONNECTION_ID frame that repeats a | If an endpoint receives a NEW_CONNECTION_ID frame that repeats a | |||
| previously issued connection ID with a different Stateless Reset | previously issued connection ID with a different Stateless Reset | |||
| Token or a different sequence number, or if a sequence number is used | Token field value or a different Sequence Number field value, or if a | |||
| for different connection IDs, the endpoint MAY treat that receipt as | sequence number is used for different connection IDs, the endpoint | |||
| a connection error of type PROTOCOL_VIOLATION. | MAY treat that receipt as a connection error of type | |||
| PROTOCOL_VIOLATION. | ||||
| The Retire Prior To field applies to connection IDs established | The Retire Prior To field applies to connection IDs established | |||
| during connection setup and the preferred_address transport | during connection setup and the preferred_address transport | |||
| parameter; see Section 5.1.2. The Retire Prior To field MUST be less | parameter; see Section 5.1.2. The value in the Retire Prior To field | |||
| than or equal to the Sequence Number field. Receiving a value | MUST be less than or equal to the value in the Sequence Number field. | |||
| greater than the Sequence Number MUST be treated as a connection | Receiving a value in the Retire Prior To field that is greater than | |||
| that in the Sequence Number field MUST be treated as a connection | ||||
| error of type FRAME_ENCODING_ERROR. | error of type FRAME_ENCODING_ERROR. | |||
| Once a sender indicates a Retire Prior To value, smaller values sent | Once a sender indicates a Retire Prior To value, smaller values sent | |||
| in subsequent NEW_CONNECTION_ID frames have no effect. A receiver | in subsequent NEW_CONNECTION_ID frames have no effect. A receiver | |||
| MUST ignore any Retire Prior To fields that do not increase the | MUST ignore any Retire Prior To fields that do not increase the | |||
| largest received Retire Prior To value. | largest received Retire Prior To value. | |||
| An endpoint that receives a NEW_CONNECTION_ID frame with a sequence | An endpoint that receives a NEW_CONNECTION_ID frame with a sequence | |||
| number smaller than the Retire Prior To field of a previously | number smaller than the Retire Prior To field of a previously | |||
| received NEW_CONNECTION_ID frame MUST send a corresponding | received NEW_CONNECTION_ID frame MUST send a corresponding | |||
| skipping to change at page 143, line 12 ¶ | skipping to change at page 142, line 14 ¶ | |||
| PATH_CHALLENGE frames contain the following field: | PATH_CHALLENGE frames contain the following field: | |||
| Data: This 8-byte field contains arbitrary data. | Data: This 8-byte field contains arbitrary data. | |||
| Including 64 bits of entropy in a PATH_CHALLENGE frame ensures that | Including 64 bits of entropy in a PATH_CHALLENGE frame ensures that | |||
| it is easier to receive the packet than it is to guess the value | it is easier to receive the packet than it is to guess the value | |||
| correctly. | correctly. | |||
| The recipient of this frame MUST generate a PATH_RESPONSE frame | The recipient of this frame MUST generate a PATH_RESPONSE frame | |||
| (Section 19.18) containing the same Data. | (Section 19.18) containing the same Data value. | |||
| 19.18. PATH_RESPONSE Frames | 19.18. PATH_RESPONSE Frames | |||
| A PATH_RESPONSE frame (type=0x1b) is sent in response to a | A PATH_RESPONSE frame (type=0x1b) is sent in response to a | |||
| PATH_CHALLENGE frame. | PATH_CHALLENGE frame. | |||
| PATH_RESPONSE frames are formatted as shown in Figure 40, which is | PATH_RESPONSE frames are formatted as shown in Figure 40. The format | |||
| identical to the PATH_CHALLENGE frame (Section 19.17). | of a PATH_RESPONSE frame is identical to that of the PATH_CHALLENGE | |||
| frame; see Section 19.17. | ||||
| PATH_RESPONSE Frame { | PATH_RESPONSE Frame { | |||
| Type (i) = 0x1b, | Type (i) = 0x1b, | |||
| Data (64), | Data (64), | |||
| } | } | |||
| Figure 40: PATH_RESPONSE Frame Format | Figure 40: PATH_RESPONSE Frame Format | |||
| 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 PROTOCOL_VIOLATION. | MAY generate a connection error of type PROTOCOL_VIOLATION. | |||
| 19.19. CONNECTION_CLOSE Frames | 19.19. CONNECTION_CLOSE Frames | |||
| An endpoint sends a CONNECTION_CLOSE frame (type=0x1c or 0x1d) to | An endpoint sends a CONNECTION_CLOSE frame (type=0x1c or 0x1d) to | |||
| notify its peer that the connection is being closed. The | notify its peer that the connection is being closed. The | |||
| CONNECTION_CLOSE with a frame type of 0x1c is used to signal errors | CONNECTION_CLOSE frame with a type of 0x1c is used to signal errors | |||
| at only the QUIC layer, or the absence of errors (with the NO_ERROR | at only the QUIC layer, or the absence of errors (with the NO_ERROR | |||
| code). The CONNECTION_CLOSE frame with a type of 0x1d is used to | code). The CONNECTION_CLOSE frame with a type of 0x1d is used to | |||
| signal an error with the application that uses QUIC. | signal an error with the application that uses QUIC. | |||
| If there are open streams that have not been explicitly closed, they | If there are open streams that have not been explicitly closed, they | |||
| are implicitly closed when the connection is closed. | are implicitly closed when the connection is closed. | |||
| CONNECTION_CLOSE frames are formatted as shown in Figure 41. | CONNECTION_CLOSE frames are formatted as shown in Figure 41. | |||
| CONNECTION_CLOSE Frame { | CONNECTION_CLOSE Frame { | |||
| skipping to change at page 144, line 17 ¶ | skipping to change at page 143, line 17 ¶ | |||
| Error Code (i), | Error Code (i), | |||
| [Frame Type (i)], | [Frame Type (i)], | |||
| Reason Phrase Length (i), | Reason Phrase Length (i), | |||
| Reason Phrase (..), | Reason Phrase (..), | |||
| } | } | |||
| Figure 41: CONNECTION_CLOSE Frame Format | Figure 41: CONNECTION_CLOSE Frame Format | |||
| CONNECTION_CLOSE frames contain the following fields: | CONNECTION_CLOSE frames contain the following fields: | |||
| Error Code: A variable-length integer error code that indicates the | Error Code: A variable-length integer that indicates the reason for | |||
| reason for closing this connection. A CONNECTION_CLOSE frame of | closing this connection. A CONNECTION_CLOSE frame of type 0x1c | |||
| type 0x1c uses codes from the space defined in Section 20.1. A | uses codes from the space defined in Section 20.1. A | |||
| CONNECTION_CLOSE frame of type 0x1d uses codes from the | CONNECTION_CLOSE frame of type 0x1d uses codes defined by the | |||
| application protocol error code space; see Section 20.2. | application protocol; see Section 20.2. | |||
| Frame Type: A variable-length integer encoding the type of frame | Frame Type: A variable-length integer encoding the type of frame | |||
| that triggered the error. A value of 0 (equivalent to the mention | that triggered the error. A value of 0 (equivalent to the mention | |||
| of the PADDING frame) is used when the frame type is unknown. The | of the PADDING frame) is used when the frame type is unknown. The | |||
| application-specific variant of CONNECTION_CLOSE (type 0x1d) does | application-specific variant of CONNECTION_CLOSE (type 0x1d) does | |||
| not include this field. | not include this field. | |||
| 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. Because a CONNECTION_CLOSE | length of the reason phrase in bytes. Because a CONNECTION_CLOSE | |||
| frame cannot be split between packets, any limits on packet size | frame cannot be split between packets, any limits on packet size | |||
| will also limit the space available for a reason phrase. | will also limit the space available for a reason phrase. | |||
| Reason Phrase: Additional diagnostic information for the closure. | Reason Phrase: Additional diagnostic information for the closure. | |||
| This can be zero length if the sender chooses not to give details | This can be zero length if the sender chooses not to give details | |||
| beyond the Error Code. This SHOULD be a UTF-8 encoded string | beyond the Error Code value. This SHOULD be a UTF-8 encoded | |||
| [RFC3629], though the frame does not carry information, such as | string [RFC3629], though the frame does not carry information, | |||
| language tags, that would aid comprehension by any entity other | such as language tags, that would aid comprehension by any entity | |||
| than the one that created the text. | other than the one that created the text. | |||
| The application-specific variant of CONNECTION_CLOSE (type 0x1d) can | The application-specific variant of CONNECTION_CLOSE (type 0x1d) can | |||
| only be sent using 0-RTT or 1-RTT packets; see Section 12.5. When an | only be sent using 0-RTT or 1-RTT packets; see Section 12.5. When an | |||
| application wishes to abandon a connection during the handshake, an | application wishes to abandon a connection during the handshake, an | |||
| endpoint can send a CONNECTION_CLOSE frame (type 0x1c) with an error | endpoint can send a CONNECTION_CLOSE frame (type 0x1c) with an error | |||
| code of APPLICATION_ERROR in an Initial or a Handshake packet. | code of APPLICATION_ERROR in an Initial or Handshake packet. | |||
| 19.20. HANDSHAKE_DONE Frames | 19.20. HANDSHAKE_DONE Frames | |||
| The server uses a HANDSHAKE_DONE frame (type=0x1e) to signal | The server uses a HANDSHAKE_DONE frame (type=0x1e) to signal | |||
| confirmation of the handshake to the client. | confirmation of the handshake to the client. | |||
| HANDSHAKE_DONE frames are formatted as shown in Figure 42, which | HANDSHAKE_DONE frames are formatted as shown in Figure 42, which | |||
| shows that HANDSHAKE_DONE frames have no content. | shows that HANDSHAKE_DONE frames have no content. | |||
| HANDSHAKE_DONE Frame { | HANDSHAKE_DONE Frame { | |||
| skipping to change at page 145, line 37 ¶ | skipping to change at page 144, line 37 ¶ | |||
| An extension to QUIC that wishes to use a new type of frame MUST | An extension to QUIC that wishes to use a new type of frame MUST | |||
| first ensure that a peer is able to understand the frame. An | first ensure that a peer is able to understand the frame. An | |||
| endpoint can use a transport parameter to signal its willingness to | endpoint can use a transport parameter to signal its willingness to | |||
| receive extension frame types. One transport parameter can indicate | receive extension frame types. One transport parameter can indicate | |||
| support for one or more extension frame types. | support for one or more extension frame types. | |||
| Extensions that modify or replace core protocol functionality | Extensions that modify or replace core protocol functionality | |||
| (including frame types) will be difficult to combine with other | (including frame types) will be difficult to combine with other | |||
| extensions that modify or replace the same functionality unless the | extensions that modify or replace the same functionality unless the | |||
| behavior of the combination is explicitly defined. Such extensions | behavior of the combination is explicitly defined. Such extensions | |||
| SHOULD define their interaction with previously-defined extensions | SHOULD define their interaction with previously defined extensions | |||
| modifying the same protocol components. | modifying the same protocol components. | |||
| Extension frames MUST be congestion controlled and MUST cause an ACK | Extension frames MUST be congestion controlled and MUST cause an ACK | |||
| frame to be sent. The exception is extension frames that replace or | frame to be sent. The exception is extension frames that replace or | |||
| supplement the ACK frame. Extension frames are not included in flow | supplement the ACK frame. Extension frames are not included in flow | |||
| control unless specified in the extension. | control unless specified in the extension. | |||
| An IANA registry is used to manage the assignment of frame types; see | An IANA registry is used to manage the assignment of frame types; see | |||
| Section 22.4. | Section 22.4. | |||
| skipping to change at page 146, line 11 ¶ | skipping to change at page 145, line 11 ¶ | |||
| QUIC transport error codes and application error codes are 62-bit | QUIC transport error codes and application error codes are 62-bit | |||
| unsigned integers. | unsigned integers. | |||
| 20.1. Transport Error Codes | 20.1. Transport Error Codes | |||
| This section lists the defined QUIC transport error codes that can be | This section lists the defined QUIC transport error codes that can be | |||
| used in a CONNECTION_CLOSE frame with a type of 0x1c. These errors | used in a CONNECTION_CLOSE frame with a type of 0x1c. These errors | |||
| apply to the entire connection. | apply to the entire connection. | |||
| NO_ERROR (0x0): An endpoint uses this with CONNECTION_CLOSE to | NO_ERROR (0x00): 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 (0x01): The endpoint encountered an internal error | |||
| cannot continue with the connection. | and cannot continue with the connection. | |||
| CONNECTION_REFUSED (0x2): The server refused to accept a new | CONNECTION_REFUSED (0x02): The server refused to accept a new | |||
| connection. | connection. | |||
| FLOW_CONTROL_ERROR (0x3): An endpoint received more data than it | FLOW_CONTROL_ERROR (0x03): An endpoint received more data than it | |||
| permitted in its advertised data limits; see Section 4. | permitted in its advertised data limits; see Section 4. | |||
| STREAM_LIMIT_ERROR (0x4): An endpoint received a frame for a stream | STREAM_LIMIT_ERROR (0x04): An endpoint received a frame for a stream | |||
| identifier that exceeded its advertised stream limit for the | identifier that exceeded its advertised stream limit for the | |||
| corresponding stream type. | corresponding stream type. | |||
| STREAM_STATE_ERROR (0x5): An endpoint received a frame for a stream | STREAM_STATE_ERROR (0x05): An endpoint received a frame for a stream | |||
| that was not in a state that permitted that frame; see Section 3. | that was not in a state that permitted that frame; see Section 3. | |||
| FINAL_SIZE_ERROR (0x6): An endpoint received a STREAM frame | FINAL_SIZE_ERROR (0x06): (1) An endpoint received a STREAM frame | |||
| containing data that exceeded the previously established final | containing data that exceeded the previously established final | |||
| size. Or an endpoint received a STREAM frame or a RESET_STREAM | size, (2) an endpoint received a STREAM frame or a RESET_STREAM | |||
| frame containing a final size that was lower than the size of | frame containing a final size that was lower than the size of | |||
| stream data that was already received. Or an endpoint received a | stream data that was already received, or (3) an endpoint received | |||
| STREAM frame or a RESET_STREAM frame containing a different final | a STREAM frame or a RESET_STREAM frame containing a different | |||
| size to the one already established. | final size to the one already established. | |||
| FRAME_ENCODING_ERROR (0x7): An endpoint received a frame that was | FRAME_ENCODING_ERROR (0x07): An endpoint received a frame that was | |||
| badly formatted. For instance, a frame of an unknown type, or an | badly formatted -- for instance, a frame of an unknown type or an | |||
| ACK frame that has more acknowledgment ranges than the remainder | ACK frame that has more acknowledgment ranges than the remainder | |||
| of the packet could carry. | of the packet could carry. | |||
| TRANSPORT_PARAMETER_ERROR (0x8): An endpoint received transport | TRANSPORT_PARAMETER_ERROR (0x08): An endpoint received transport | |||
| parameters that were badly formatted, included an invalid value, | parameters that were badly formatted, included an invalid value, | |||
| omitted a mandatory transport parameter, included a forbidden | omitted a mandatory transport parameter, included a forbidden | |||
| transport parameter, or were otherwise in error. | transport parameter, or were otherwise in error. | |||
| CONNECTION_ID_LIMIT_ERROR (0x9): The number of connection IDs | CONNECTION_ID_LIMIT_ERROR (0x09): The number of connection IDs | |||
| provided by the peer exceeds the advertised | provided by the peer exceeds the advertised | |||
| active_connection_id_limit. | active_connection_id_limit. | |||
| PROTOCOL_VIOLATION (0xa): An endpoint detected an error with | PROTOCOL_VIOLATION (0x0a): An endpoint detected an error with | |||
| protocol compliance that was not covered by more specific error | protocol compliance that was not covered by more specific error | |||
| codes. | codes. | |||
| INVALID_TOKEN (0xb): A server received a client Initial that | INVALID_TOKEN (0x0b): A server received a client Initial that | |||
| contained an invalid Token field. | contained an invalid Token field. | |||
| APPLICATION_ERROR (0xc): The application or application protocol | APPLICATION_ERROR (0x0c): The application or application protocol | |||
| caused the connection to be closed. | caused the connection to be closed. | |||
| CRYPTO_BUFFER_EXCEEDED (0xd): An endpoint has received more data in | CRYPTO_BUFFER_EXCEEDED (0x0d): An endpoint has received more data in | |||
| CRYPTO frames than it can buffer. | CRYPTO frames than it can buffer. | |||
| KEY_UPDATE_ERROR (0xe): An endpoint detected errors in performing | KEY_UPDATE_ERROR (0x0e): An endpoint detected errors in performing | |||
| key updates; see Section 6 of [QUIC-TLS]. | key updates; see Section 6 of [QUIC-TLS]. | |||
| AEAD_LIMIT_REACHED (0xf): An endpoint has reached the | AEAD_LIMIT_REACHED (0x0f): An endpoint has reached the | |||
| confidentiality or integrity limit for the AEAD algorithm used by | confidentiality or integrity limit for the AEAD algorithm used by | |||
| the given connection. | the given connection. | |||
| NO_VIABLE_PATH (0x10): An endpoint has determined that the network | NO_VIABLE_PATH (0x10): An endpoint has determined that the network | |||
| path is incapable of supporting QUIC. An endpoint is unlikely to | path is incapable of supporting QUIC. An endpoint is unlikely to | |||
| receive CONNECTION_CLOSE carrying this code except when the path | receive a CONNECTION_CLOSE frame carrying this code except when | |||
| does not support a large enough MTU. | the path does not support a large enough MTU. | |||
| CRYPTO_ERROR (0x1XX): The cryptographic handshake failed. A range | CRYPTO_ERROR (0x0100-0x01ff): The cryptographic handshake failed. A | |||
| of 256 values is reserved for carrying error codes specific to the | range of 256 values is reserved for carrying error codes specific | |||
| cryptographic handshake that is used. Codes for errors occurring | to the cryptographic handshake that is used. Codes for errors | |||
| when TLS is used for the crypto handshake are described in | occurring when TLS is used for the cryptographic handshake are | |||
| Section 4.8 of [QUIC-TLS]. | described in Section 4.8 of [QUIC-TLS]. | |||
| See Section 22.5 for details of registering new error codes. | See Section 22.5 for details on registering new error codes. | |||
| In defining these error codes, several principles are applied. Error | In defining these error codes, several principles are applied. Error | |||
| conditions that might require specific action on the part of a | conditions that might require specific action on the part of a | |||
| recipient are given unique codes. Errors that represent common | recipient are given unique codes. Errors that represent common | |||
| conditions are given specific codes. Absent either of these | conditions are given specific codes. Absent either of these | |||
| conditions, error codes are used to identify a general function of | conditions, error codes are used to identify a general function of | |||
| the stack, like flow control or transport parameter handling. | the stack, like flow control or transport parameter handling. | |||
| Finally, generic errors are provided for conditions where | Finally, generic errors are provided for conditions where | |||
| implementations are unable or unwilling to use more specific codes. | implementations are unable or unwilling to use more specific codes. | |||
| skipping to change at page 148, line 18 ¶ | skipping to change at page 147, line 18 ¶ | |||
| The goal of QUIC is to provide a secure transport connection. | The goal of QUIC is to provide a secure transport connection. | |||
| Section 21.1 provides an overview of those properties; subsequent | Section 21.1 provides an overview of those properties; subsequent | |||
| sections discuss constraints and caveats regarding these properties, | sections discuss constraints and caveats regarding these properties, | |||
| including descriptions of known attacks and countermeasures. | including descriptions of known attacks and countermeasures. | |||
| 21.1. Overview of Security Properties | 21.1. Overview of Security Properties | |||
| A complete security analysis of QUIC is outside the scope of this | A complete security analysis of QUIC is outside the scope of this | |||
| document. This section provides an informal description of the | document. This section provides an informal description of the | |||
| desired security properties as an aid to implementors and to help | desired security properties as an aid to implementers and to help | |||
| guide protocol analysis. | guide protocol analysis. | |||
| QUIC assumes the threat model described in [SEC-CONS] and provides | QUIC assumes the threat model described in [SEC-CONS] and provides | |||
| protections against many of the attacks that arise from that model. | protections against many of the attacks that arise from that model. | |||
| For this purpose, attacks are divided into passive and active | For this purpose, attacks are divided into passive and active | |||
| attacks. Passive attackers have the capability to read packets from | attacks. Passive attackers have the ability to read packets from the | |||
| the network, while active attackers also have the capability to write | network, while active attackers also have the ability to write | |||
| packets into the network. However, a passive attack could involve an | packets into the network. However, a passive attack could involve an | |||
| attacker with the ability to cause a routing change or other | attacker with the ability to cause a routing change or other | |||
| modification in the path taken by packets that comprise a connection. | modification in the path taken by packets that comprise a connection. | |||
| Attackers are additionally categorized as either on-path attackers or | Attackers are additionally categorized as either on-path attackers or | |||
| off-path attackers. An on-path attacker can read, modify, or remove | off-path attackers. An on-path attacker can read, modify, or remove | |||
| any packet it observes such that it no longer reaches its | any packet it observes such that the packet no longer reaches its | |||
| destination, while an off-path attacker observes the packets, but | destination, while an off-path attacker observes the packets but | |||
| cannot prevent the original packet from reaching its intended | cannot prevent the original packet from reaching its intended | |||
| destination. Both types of attackers can also transmit arbitrary | destination. Both types of attackers can also transmit arbitrary | |||
| packets. This definition differs from that of Section 3.5 of | packets. This definition differs from that of Section 3.5 of | |||
| [SEC-CONS] in that an off-path attacker is able to observe packets. | [SEC-CONS] in that an off-path attacker is able to observe packets. | |||
| Properties of the handshake, protected packets, and connection | Properties of the handshake, protected packets, and connection | |||
| migration are considered separately. | migration are considered separately. | |||
| 21.1.1. Handshake | 21.1.1. Handshake | |||
| skipping to change at page 149, line 31 ¶ | skipping to change at page 148, line 31 ¶ | |||
| Address validation (Section 8) is used to verify that an entity that | Address validation (Section 8) is used to verify that an entity that | |||
| claims a given address is able to receive packets at that address. | claims a given address is able to receive packets at that address. | |||
| Address validation limits amplification attack targets to addresses | Address validation limits amplification attack targets to addresses | |||
| for which an attacker can observe packets. | for which an attacker can observe packets. | |||
| Prior to address validation, endpoints are limited in what they are | Prior to address validation, endpoints are limited in what they are | |||
| able to send. Endpoints cannot send data toward an unvalidated | able to send. Endpoints cannot send data toward an unvalidated | |||
| address in excess of three times the data received from that address. | address in excess of three times the data received from that address. | |||
| Note: The anti-amplification limit only applies when an endpoint | Note: The anti-amplification limit only applies when an endpoint | |||
| responds to packets received from an unvalidated address. The | responds to packets received from an unvalidated address. The | |||
| anti-amplification limit does not apply to clients when | anti-amplification limit does not apply to clients when | |||
| establishing a new connection or when initiating connection | establishing a new connection or when initiating connection | |||
| migration. | migration. | |||
| 21.1.1.2. Server-Side DoS | 21.1.1.2. Server-Side DoS | |||
| Computing the server's first flight for a full handshake is | Computing the server's first flight for a full handshake is | |||
| potentially expensive, requiring both a signature and a key exchange | potentially expensive, requiring both a signature and a key exchange | |||
| computation. In order to prevent computational DoS attacks, the | computation. In order to prevent computational DoS attacks, the | |||
| skipping to change at page 150, line 4 ¶ | skipping to change at page 149, line 4 ¶ | |||
| servers to validate a client's IP address prior to doing any | servers to validate a client's IP address prior to doing any | |||
| expensive computations at the cost of a single round trip. After a | expensive computations at the cost of a single round trip. After a | |||
| successful handshake, servers can issue new tokens to a client, which | successful handshake, servers can issue new tokens to a client, which | |||
| will allow new connection establishment without incurring this cost. | will allow new connection establishment without incurring this cost. | |||
| 21.1.1.3. On-Path Handshake Termination | 21.1.1.3. On-Path Handshake Termination | |||
| An on-path or off-path attacker can force a handshake to fail by | An on-path or off-path attacker can force a handshake to fail by | |||
| replacing or racing Initial packets. Once valid Initial packets have | replacing or racing Initial packets. Once valid Initial packets have | |||
| been exchanged, subsequent Handshake packets are protected with the | been exchanged, subsequent Handshake packets are protected with the | |||
| handshake keys and an on-path attacker cannot force handshake failure | Handshake keys, and an on-path attacker cannot force handshake | |||
| other than by dropping packets to cause endpoints to abandon the | failure other than by dropping packets to cause endpoints to abandon | |||
| attempt. | the attempt. | |||
| An on-path attacker can also replace the addresses of packets on | An on-path attacker can also replace the addresses of packets on | |||
| either side and therefore cause the client or server to have an | either side and therefore cause the client or server to have an | |||
| incorrect view of the remote addresses. Such an attack is | incorrect view of the remote addresses. Such an attack is | |||
| indistinguishable from the functions performed by a NAT. | indistinguishable from the functions performed by a NAT. | |||
| 21.1.1.4. Parameter Negotiation | 21.1.1.4. Parameter Negotiation | |||
| The entire handshake is cryptographically protected, with the Initial | The entire handshake is cryptographically protected, with the Initial | |||
| packets being encrypted with per-version keys and the Handshake and | packets being encrypted with per-version keys and the Handshake and | |||
| skipping to change at page 150, line 46 ¶ | skipping to change at page 149, line 46 ¶ | |||
| Retry packets have limited protection due to the use of version- | Retry packets have limited protection due to the use of version- | |||
| specific keying material; see [QUIC-TLS] for more details. This | specific keying material; see [QUIC-TLS] for more details. This | |||
| section considers passive and active attacks against protected | section considers passive and active attacks against protected | |||
| packets. | packets. | |||
| Both on-path and off-path attackers can mount a passive attack in | Both on-path and off-path attackers can mount a passive attack in | |||
| which they save observed packets for an offline attack against packet | which they save observed packets for an offline attack against packet | |||
| protection at a future time; this is true for any observer of any | protection at a future time; this is true for any observer of any | |||
| packet on any network. | packet on any network. | |||
| A blind attacker, one who injects packets without being able to | An attacker that injects packets without being able to observe valid | |||
| observe valid packets for a connection, is unlikely to be successful, | packets for a connection is unlikely to be successful, since packet | |||
| since packet protection ensures that valid packets are only generated | protection ensures that valid packets are only generated by endpoints | |||
| by endpoints that possess the key material established during the | that possess the key material established during the handshake; see | |||
| handshake; see Section 7 and Section 21.1.1. Similarly, any active | Sections 7 and 21.1.1. Similarly, any active attacker that observes | |||
| attacker that observes packets and attempts to insert new data or | packets and attempts to insert new data or modify existing data in | |||
| modify existing data in those packets should not be able to generate | those packets should not be able to generate packets deemed valid by | |||
| packets deemed valid by the receiving endpoint, other than Initial | the receiving endpoint, other than Initial packets. | |||
| packets. | ||||
| A spoofing attack, in which an active attacker rewrites unprotected | A spoofing attack, in which an active attacker rewrites unprotected | |||
| parts of a packet that it forwards or injects, such as the source or | parts of a packet that it forwards or injects, such as the source or | |||
| destination address, is only effective if the attacker can forward | destination address, is only effective if the attacker can forward | |||
| packets to the original endpoint. Packet protection ensures that the | packets to the original endpoint. Packet protection ensures that the | |||
| packet payloads can only be processed by the endpoints that completed | packet payloads can only be processed by the endpoints that completed | |||
| the handshake, and invalid packets are ignored by those endpoints. | the handshake, and invalid packets are ignored by those endpoints. | |||
| An attacker can also modify the boundaries between packets and UDP | An attacker can also modify the boundaries between packets and UDP | |||
| datagrams, causing multiple packets to be coalesced into a single | datagrams, causing multiple packets to be coalesced into a single | |||
| datagram, or splitting coalesced packets into multiple datagrams. | datagram or splitting coalesced packets into multiple datagrams. | |||
| Aside from datagrams containing Initial packets, which require | Aside from datagrams containing Initial packets, which require | |||
| padding, modification of how packets are arranged in datagrams has no | padding, modification of how packets are arranged in datagrams has no | |||
| functional effect on a connection, although it might change some | functional effect on a connection, although it might change some | |||
| performance characteristics. | performance characteristics. | |||
| 21.1.3. Connection Migration | 21.1.3. Connection Migration | |||
| Connection Migration (Section 9) provides endpoints with the ability | Connection migration (Section 9) provides endpoints with the ability | |||
| to transition between IP addresses and ports on multiple paths, using | to transition between IP addresses and ports on multiple paths, using | |||
| one path at a time for transmission and receipt of non-probing | one path at a time for transmission and receipt of non-probing | |||
| frames. Path validation (Section 8.2) establishes that a peer is | frames. Path validation (Section 8.2) establishes that a peer is | |||
| both willing and able to receive packets sent on a particular path. | both willing and able to receive packets sent on a particular path. | |||
| This helps reduce the effects of address spoofing by limiting the | This helps reduce the effects of address spoofing by limiting the | |||
| number of packets sent to a spoofed address. | number of packets sent to a spoofed address. | |||
| This section describes the intended security properties of connection | This section describes the intended security properties of connection | |||
| migration under various types of DoS attacks. | migration under various types of DoS attacks. | |||
| skipping to change at page 152, line 4 ¶ | skipping to change at page 150, line 50 ¶ | |||
| required to send packets through the attacker to establish | required to send packets through the attacker to establish | |||
| connectivity on a given path. | connectivity on a given path. | |||
| An on-path attacker can: | An on-path attacker can: | |||
| o Inspect packets | o Inspect packets | |||
| o Modify IP and UDP packet headers | o Modify IP and UDP packet headers | |||
| o Inject new packets | o Inject new packets | |||
| o Delay packets | ||||
| o Delay packets | ||||
| o Reorder packets | o Reorder packets | |||
| o Drop packets | o Drop packets | |||
| o Split and merge datagrams along packet boundaries | o Split and merge datagrams along packet boundaries | |||
| An on-path attacker cannot: | An on-path attacker cannot: | |||
| o Modify an authenticated portion of a packet and cause the | o Modify an authenticated portion of a packet and cause the | |||
| recipient to accept that packet | recipient to accept that packet | |||
| An on-path attacker has the opportunity to modify the packets that it | An on-path attacker has the opportunity to modify the packets that it | |||
| observes, however any modifications to an authenticated portion of a | observes; however, any modifications to an authenticated portion of a | |||
| packet will cause it to be dropped by the receiving endpoint as | packet will cause it to be dropped by the receiving endpoint as | |||
| invalid, as packet payloads are both authenticated and encrypted. | invalid, as packet payloads are both authenticated and encrypted. | |||
| In the presence of an on-path attacker, QUIC aims to provide the | QUIC aims to constrain the capabilities of an on-path attacker as | |||
| following properties: | follows: | |||
| 1. An on-path attacker can prevent use of a path for a connection, | 1. An on-path attacker can prevent the use of a path for a | |||
| causing the connection to fail if it cannot use a different path | connection, causing the connection to fail if it cannot use a | |||
| that does not contain the attacker. This can be achieved by | different path that does not contain the attacker. This can be | |||
| dropping all packets, modifying them so that they fail to | achieved by dropping all packets, modifying them so that they | |||
| decrypt, or other methods. | fail to decrypt, or other methods. | |||
| 2. An on-path attacker can prevent migration to a new path for which | 2. An on-path attacker can prevent migration to a new path for which | |||
| the attacker is also on-path by causing path validation to fail | the attacker is also on-path by causing path validation to fail | |||
| on the new path. | on the new path. | |||
| 3. An on-path attacker cannot prevent a client from migrating to a | 3. An on-path attacker cannot prevent a client from migrating to a | |||
| path for which the attacker is not on-path. | path for which the attacker is not on-path. | |||
| 4. An on-path attacker can reduce the throughput of a connection by | 4. An on-path attacker can reduce the throughput of a connection by | |||
| delaying packets or dropping them. | delaying packets or dropping them. | |||
| 5. An on-path attacker cannot cause an endpoint to accept a packet | 5. An on-path attacker cannot cause an endpoint to accept a packet | |||
| for which it has modified an authenticated portion of that | for which it has modified an authenticated portion of that | |||
| packet. | packet. | |||
| 21.1.3.2. Off-Path Active Attacks | 21.1.3.2. Off-Path Active Attacks | |||
| An off-path attacker is not directly on the path between a client and | An off-path attacker is not directly on the path between a client and | |||
| server, but could be able to obtain copies of some or all packets | server but could be able to obtain copies of some or all packets sent | |||
| sent between the client and the server. It is also able to send | between the client and the server. It is also able to send copies of | |||
| copies of those packets to either endpoint. | those packets to either endpoint. | |||
| An off-path attacker can: | An off-path attacker can: | |||
| o Inspect packets | o Inspect packets | |||
| o Inject new packets | o Inject new packets | |||
| o Reorder injected packets | o Reorder injected packets | |||
| An off-path attacker cannot: | An off-path attacker cannot: | |||
| skipping to change at page 153, line 36 ¶ | skipping to change at page 152, line 34 ¶ | |||
| For the purposes of this discussion, it is assumed that an off-path | For the purposes of this discussion, it is assumed that an off-path | |||
| attacker has the ability to inject a modified copy of a packet into | attacker has the ability to inject a modified copy of a packet into | |||
| the network that will reach the destination endpoint prior to the | the network that will reach the destination endpoint prior to the | |||
| arrival of the original packet observed by the attacker. In other | arrival of the original packet observed by the attacker. In other | |||
| words, an attacker has the ability to consistently "win" a race with | words, an attacker has the ability to consistently "win" a race with | |||
| the legitimate packets between the endpoints, potentially causing the | the legitimate packets between the endpoints, potentially causing the | |||
| original packet to be ignored by the recipient. | original packet to be ignored by the recipient. | |||
| It is also assumed that an attacker has the resources necessary to | It is also assumed that an attacker has the resources necessary to | |||
| affect NAT state, potentially both causing an endpoint to lose its | affect NAT state. In particular, an attacker can cause an endpoint | |||
| NAT binding, and an attacker to obtain the same port for use with its | to lose its NAT binding and then obtain the same port for use with | |||
| traffic. | its own traffic. | |||
| In the presence of an off-path attacker, QUIC aims to provide the | QUIC aims to constrain the capabilities of an off-path attacker as | |||
| following properties: | follows: | |||
| 1. An off-path attacker can race packets and attempt to become a | 1. An off-path attacker can race packets and attempt to become a | |||
| "limited" on-path attacker. | "limited" on-path attacker. | |||
| 2. An off-path attacker can cause path validation to succeed for | 2. An off-path attacker can cause path validation to succeed for | |||
| forwarded packets with the source address listed as the off-path | forwarded packets with the source address listed as the off-path | |||
| attacker as long as it can provide improved connectivity between | attacker as long as it can provide improved connectivity between | |||
| the client and the server. | the client and the server. | |||
| 3. An off-path attacker cannot cause a connection to close once the | 3. An off-path attacker cannot cause a connection to close once the | |||
| skipping to change at page 155, line 11 ¶ | skipping to change at page 154, line 11 ¶ | |||
| o Modify the authenticated and encrypted portion of a packet and | o Modify the authenticated and encrypted portion of a packet and | |||
| cause the recipient to accept that packet | cause the recipient to accept that packet | |||
| A limited on-path attacker can only delay packets up to the point | A limited on-path attacker can only delay packets up to the point | |||
| that the original packets arrive before the duplicate packets, | that the original packets arrive before the duplicate packets, | |||
| meaning that it cannot offer routing with worse latency than the | meaning that it cannot offer routing with worse latency than the | |||
| original path. If a limited on-path attacker drops packets, the | original path. If a limited on-path attacker drops packets, the | |||
| original copy will still arrive at the destination endpoint. | original copy will still arrive at the destination endpoint. | |||
| In the presence of a limited on-path attacker, QUIC aims to provide | QUIC aims to constrain the capabilities of a limited off-path | |||
| the following properties: | attacker as follows: | |||
| 1. A limited on-path attacker cannot cause a connection to close | 1. A limited on-path attacker cannot cause a connection to close | |||
| once the handshake has completed. | once the handshake has completed. | |||
| 2. A limited on-path attacker cannot cause an idle connection to | 2. A limited on-path attacker cannot cause an idle connection to | |||
| close if the client is first to resume activity. | close if the client is first to resume activity. | |||
| 3. A limited on-path attacker can cause an idle connection to be | 3. A limited on-path attacker can cause an idle connection to be | |||
| deemed lost if the server is the first to resume activity. | deemed lost if the server is the first to resume activity. | |||
| Note that these guarantees are the same guarantees provided for any | Note that these guarantees are the same guarantees provided for any | |||
| NAT, for the same reasons. | NAT, for the same reasons. | |||
| 21.2. Handshake Denial of Service | 21.2. Handshake Denial of Service | |||
| As an encrypted and authenticated transport QUIC provides a range of | As an encrypted and authenticated transport, QUIC provides a range of | |||
| protections against denial of service. Once the cryptographic | protections against denial of service. Once the cryptographic | |||
| handshake is complete, QUIC endpoints discard most packets that are | handshake is complete, QUIC endpoints discard most packets that are | |||
| not authenticated, greatly limiting the ability of an attacker to | not authenticated, greatly limiting the ability of an attacker to | |||
| interfere with existing connections. | interfere with existing connections. | |||
| Once a connection is established QUIC endpoints might accept some | Once a connection is established, QUIC endpoints might accept some | |||
| unauthenticated ICMP packets (see Section 14.2.1), but the use of | unauthenticated ICMP packets (see Section 14.2.1), but the use of | |||
| these packets is extremely limited. The only other type of packet | these packets is extremely limited. The only other type of packet | |||
| that an endpoint might accept is a stateless reset (Section 10.3), | that an endpoint might accept is a stateless reset (Section 10.3), | |||
| which relies on the token being kept secret until it is used. | which relies on the token being kept secret until it is used. | |||
| During the creation of a connection, QUIC only provides protection | During the creation of a connection, QUIC only provides protection | |||
| against attack from off the network path. All QUIC packets contain | against attacks from off the network path. All QUIC packets contain | |||
| proof that the recipient saw a preceding packet from its peer. | proof that the recipient saw a preceding packet from its peer. | |||
| Addresses cannot change during the handshake, so endpoints can | Addresses cannot change during the handshake, so endpoints can | |||
| discard packets that are received on a different network path. | discard packets that are received on a different network path. | |||
| The Source and Destination Connection ID fields are the primary means | The Source and Destination Connection ID fields are the primary means | |||
| of protection against off-path attack during the handshake; see | of protection against an off-path attack during the handshake; see | |||
| Section 8.1. These are required to match those set by a peer. | Section 8.1. These are required to match those set by a peer. | |||
| Except for an Initial and stateless reset packets, an endpoint only | Except for Initial packets and Stateless Resets, an endpoint only | |||
| accepts packets that include a Destination Connection ID field that | accepts packets that include a Destination Connection ID field that | |||
| matches a value the endpoint previously chose. This is the only | matches a value the endpoint previously chose. This is the only | |||
| protection offered for Version Negotiation packets. | protection offered for Version Negotiation packets. | |||
| The Destination Connection ID field in an Initial packet is selected | The Destination Connection ID field in an Initial packet is selected | |||
| by a client to be unpredictable, which serves an additional purpose. | by a client to be unpredictable, which serves an additional purpose. | |||
| The packets that carry the cryptographic handshake are protected with | The packets that carry the cryptographic handshake are protected with | |||
| a key that is derived from this connection ID and a salt specific to | a key that is derived from this connection ID and a salt specific to | |||
| the QUIC version. This allows endpoints to use the same process for | the QUIC version. This allows endpoints to use the same process for | |||
| authenticating packets that they receive as they use after the | authenticating packets that they receive as they use after the | |||
| skipping to change at page 157, line 22 ¶ | skipping to change at page 156, line 22 ¶ | |||
| access to capabilities of its peer that might otherwise be | access to capabilities of its peer that might otherwise be | |||
| unavailable to the attacker. For a networking protocol, a request | unavailable to the attacker. For a networking protocol, a request | |||
| forgery attack is often used to exploit any implicit authorization | forgery attack is often used to exploit any implicit authorization | |||
| conferred on the peer by the victim due to the peer's location in the | conferred on the peer by the victim due to the peer's location in the | |||
| network. | network. | |||
| For request forgery to be effective, an attacker needs to be able to | For request forgery to be effective, an attacker needs to be able to | |||
| influence what packets the peer sends and where these packets are | influence what packets the peer sends and where these packets are | |||
| sent. If an attacker can target a vulnerable service with a | sent. If an attacker can target a vulnerable service with a | |||
| controlled payload, that service might perform actions that are | controlled payload, that service might perform actions that are | |||
| attributed to the attacker's peer, but decided by the attacker. | attributed to the attacker's peer but are decided by the attacker. | |||
| For example, cross-site request forgery [CSRF] exploits on the Web | For example, cross-site request forgery [CSRF] exploits on the Web | |||
| cause a client to issue requests that include authorization cookies | cause a client to issue requests that include authorization cookies | |||
| [COOKIE], allowing one site access to information and actions that | [COOKIE], allowing one site access to information and actions that | |||
| are intended to be restricted to a different site. | are intended to be restricted to a different site. | |||
| As QUIC runs over UDP, the primary attack modality of concern is one | As QUIC runs over UDP, the primary attack modality of concern is one | |||
| where an attacker can select the address to which its peer sends UDP | where an attacker can select the address to which its peer sends UDP | |||
| datagrams and can control some of the unprotected content of those | datagrams and can control some of the unprotected content of those | |||
| packets. As much of the data sent by QUIC endpoints is protected, | packets. As much of the data sent by QUIC endpoints is protected, | |||
| this includes control over ciphertext. An attack is successful if an | this includes control over ciphertext. An attack is successful if an | |||
| attacker can cause a peer to send a UDP datagram to a host that will | attacker can cause a peer to send a UDP datagram to a host that will | |||
| perform some action based on content in the datagram. | perform some action based on content in the datagram. | |||
| This section discusses ways in which QUIC might be used for request | This section discusses ways in which QUIC might be used for request | |||
| forgery attacks. | forgery attacks. | |||
| This section also describes limited countermeasures that can be | This section also describes limited countermeasures that can be | |||
| implemented by QUIC endpoints. These mitigations can be employed | implemented by QUIC endpoints. These mitigations can be employed | |||
| unilaterally by a QUIC implementation or deployment, without | unilaterally by a QUIC implementation or deployment, without | |||
| potential targets for request forgery attacks taking action. However | potential targets for request forgery attacks taking action. | |||
| these countermeasures could be insufficient if UDP-based services do | However, these countermeasures could be insufficient if UDP-based | |||
| not properly authorize requests. | services do not properly authorize requests. | |||
| Because the migration attack described in Section 21.5.4 is quite | Because the migration attack described in Section 21.5.4 is quite | |||
| powerful and does not have adequate countermeasures, QUIC server | powerful and does not have adequate countermeasures, QUIC server | |||
| implementations should assume that attackers can cause them to | implementations should assume that attackers can cause them to | |||
| generate arbitrary UDP payloads to arbitrary destinations. QUIC | generate arbitrary UDP payloads to arbitrary destinations. QUIC | |||
| servers SHOULD NOT be deployed in networks that do not deploy ingress | servers SHOULD NOT be deployed in networks that do not deploy ingress | |||
| filtering [BCP38] and also have inadequately secured UDP endpoints. | filtering [BCP38] and also have inadequately secured UDP endpoints. | |||
| Although it is not generally possible to ensure that clients are not | Although it is not generally possible to ensure that clients are not | |||
| co-located with vulnerable endpoints, this version of QUIC does not | co-located with vulnerable endpoints, this version of QUIC does not | |||
| allow servers to migrate, thus preventing spoofed migration attacks | allow servers to migrate, thus preventing spoofed migration attacks | |||
| on clients. Any future extension which allows server migration MUST | on clients. Any future extension that allows server migration MUST | |||
| also define countermeasures for forgery attacks. | also define countermeasures for forgery attacks. | |||
| 21.5.1. Control Options for Endpoints | 21.5.1. Control Options for Endpoints | |||
| QUIC offers some opportunities for an attacker to influence or | QUIC offers some opportunities for an attacker to influence or | |||
| control where its peer sends UDP datagrams: | control where its peer sends UDP datagrams: | |||
| o initial connection establishment (Section 7), where a server is | o initial connection establishment (Section 7), where a server is | |||
| able to choose where a client sends datagrams, for example by | able to choose where a client sends datagrams -- for example, by | |||
| populating DNS records; | populating DNS records; | |||
| o preferred addresses (Section 9.6), where a server is able to | o preferred addresses (Section 9.6), where a server is able to | |||
| choose where a client sends datagrams; | choose where a client sends datagrams; | |||
| o spoofed connection migrations (Section 9.3.1), where a client is | o spoofed connection migrations (Section 9.3.1), where a client is | |||
| able to use source address spoofing to select where a server sends | able to use source address spoofing to select where a server sends | |||
| subsequent datagrams; and | subsequent datagrams; and | |||
| o spoofed packets that cause a server to send a Version Negotiation | o spoofed packets that cause a server to send a Version Negotiation | |||
| packet Section 21.5.5. | packet (Section 21.5.5). | |||
| In all cases, the attacker can cause its peer to send datagrams to a | In all cases, the attacker can cause its peer to send datagrams to a | |||
| victim that might not understand QUIC. That is, these packets are | victim that might not understand QUIC. That is, these packets are | |||
| sent by the peer prior to address validation; see Section 8. | sent by the peer prior to address validation; see Section 8. | |||
| Outside of the encrypted portion of packets, QUIC offers an endpoint | Outside of the encrypted portion of packets, QUIC offers an endpoint | |||
| several options for controlling the content of UDP datagrams that its | several options for controlling the content of UDP datagrams that its | |||
| peer sends. The Destination Connection ID field offers direct | peer sends. The Destination Connection ID field offers direct | |||
| control over bytes that appear early in packets sent by the peer; see | control over bytes that appear early in packets sent by the peer; see | |||
| Section 5.1. The Token field in Initial packets offers a server | Section 5.1. The Token field in Initial packets offers a server | |||
| skipping to change at page 159, line 18 ¶ | skipping to change at page 158, line 18 ¶ | |||
| This section assumes that limiting control over datagram content is | This section assumes that limiting control over datagram content is | |||
| not feasible. The focus of the mitigations in subsequent sections is | not feasible. The focus of the mitigations in subsequent sections is | |||
| on limiting the ways in which datagrams that are sent prior to | on limiting the ways in which datagrams that are sent prior to | |||
| address validation can be used for request forgery. | address validation can be used for request forgery. | |||
| 21.5.2. Request Forgery with Client Initial Packets | 21.5.2. Request Forgery with Client Initial Packets | |||
| An attacker acting as a server can choose the IP address and port on | An attacker acting as a server can choose the IP address and port on | |||
| which it advertises its availability, so Initial packets from clients | which it advertises its availability, so Initial packets from clients | |||
| are assumed to be available for use in this sort of attack. The | are assumed to be available for use in this sort of attack. The | |||
| address validation implicit in the handshake ensures that - for a new | address validation implicit in the handshake ensures that -- for a | |||
| connection - a client will not send other types of packet to a | new connection -- a client will not send other types of packets to a | |||
| destination that does not understand QUIC or is not willing to accept | destination that does not understand QUIC or is not willing to accept | |||
| a QUIC connection. | a QUIC connection. | |||
| Initial packet protection (Section 5.2 of [QUIC-TLS]) makes it | Initial packet protection (Section 5.2 of [QUIC-TLS]) makes it | |||
| difficult for servers to control the content of Initial packets sent | difficult for servers to control the content of Initial packets sent | |||
| by clients. A client choosing an unpredictable Destination | by clients. A client choosing an unpredictable Destination | |||
| Connection ID ensures that servers are unable to control any of the | Connection ID ensures that servers are unable to control any of the | |||
| encrypted portion of Initial packets from clients. | encrypted portion of Initial packets from clients. | |||
| However, the Token field is open to server control and does allow a | However, the Token field is open to server control and does allow a | |||
| server to use clients to mount request forgery attacks. Use of | server to use clients to mount request forgery attacks. The use of | |||
| tokens provided with the NEW_TOKEN frame (Section 8.1.3) offers the | tokens provided with the NEW_TOKEN frame (Section 8.1.3) offers the | |||
| only option for request forgery during connection establishment. | only option for request forgery during connection establishment. | |||
| Clients however are not obligated to use the NEW_TOKEN frame. | Clients, however, are not obligated to use the NEW_TOKEN frame. | |||
| Request forgery attacks that rely on the Token field can be avoided | Request forgery attacks that rely on the Token field can be avoided | |||
| if clients send an empty Token field when the server address has | if clients send an empty Token field when the server address has | |||
| changed from when the NEW_TOKEN frame was received. | changed from when the NEW_TOKEN frame was received. | |||
| Clients could avoid using NEW_TOKEN if the server address changes. | Clients could avoid using NEW_TOKEN if the server address changes. | |||
| However, not including a Token field could adversely affect | However, not including a Token field could adversely affect | |||
| performance. Servers could rely on NEW_TOKEN to enable sending of | performance. Servers could rely on NEW_TOKEN to enable the sending | |||
| data in excess of the three times limit on sending data; see | of data in excess of the three-times limit on sending data; see | |||
| Section 8.1. In particular, this affects cases where clients use | Section 8.1. In particular, this affects cases where clients use | |||
| 0-RTT to request data from servers. | 0-RTT to request data from servers. | |||
| Sending a Retry packet (Section 17.2.5) offers a server the option to | Sending a Retry packet (Section 17.2.5) offers a server the option to | |||
| change the Token field. After sending a Retry, the server can also | change the Token field. After sending a Retry, the server can also | |||
| control the Destination Connection ID field of subsequent Initial | control the Destination Connection ID field of subsequent Initial | |||
| packets from the client. This also might allow indirect control over | packets from the client. This also might allow indirect control over | |||
| the encrypted content of Initial packets. However, the exchange of a | the encrypted content of Initial packets. However, the exchange of a | |||
| Retry packet validates the server's address, thereby preventing the | Retry packet validates the server's address, thereby preventing the | |||
| use of subsequent Initial packets for request forgery. | use of subsequent Initial packets for request forgery. | |||
| skipping to change at page 160, line 20 ¶ | skipping to change at page 159, line 20 ¶ | |||
| to after confirming the handshake; see Section 9.6. The Destination | to after confirming the handshake; see Section 9.6. The Destination | |||
| Connection ID field of packets that the client sends to a preferred | Connection ID field of packets that the client sends to a preferred | |||
| address can be used for request forgery. | address can be used for request forgery. | |||
| A client MUST NOT send non-probing frames to a preferred address | A client MUST NOT send non-probing frames to a preferred address | |||
| prior to validating that address; see Section 8. This greatly | prior to validating that address; see Section 8. This greatly | |||
| reduces the options that a server has to control the encrypted | reduces the options that a server has to control the encrypted | |||
| portion of datagrams. | portion of datagrams. | |||
| This document does not offer any additional countermeasures that are | This document does not offer any additional countermeasures that are | |||
| specific to use of preferred addresses and can be implemented by | specific to the use of preferred addresses and can be implemented by | |||
| endpoints. The generic measures described in Section 21.5.6 could be | endpoints. The generic measures described in Section 21.5.6 could be | |||
| used as further mitigation. | used as further mitigation. | |||
| 21.5.4. Request Forgery with Spoofed Migration | 21.5.4. Request Forgery with Spoofed Migration | |||
| Clients are able to present a spoofed source address as part of an | Clients are able to present a spoofed source address as part of an | |||
| apparent connection migration to cause a server to send datagrams to | apparent connection migration to cause a server to send datagrams to | |||
| that address. | that address. | |||
| The Destination Connection ID field in any packets that a server | The Destination Connection ID field in any packets that a server | |||
| skipping to change at page 160, line 43 ¶ | skipping to change at page 159, line 43 ¶ | |||
| A server that only sends probing packets (Section 9.1) to an address | A server that only sends probing packets (Section 9.1) to an address | |||
| prior to address validation provides an attacker with only limited | prior to address validation provides an attacker with only limited | |||
| control over the encrypted portion of datagrams. However, | control over the encrypted portion of datagrams. However, | |||
| particularly for NAT rebinding, this can adversely affect | particularly for NAT rebinding, this can adversely affect | |||
| performance. If the server sends frames carrying application data, | performance. If the server sends frames carrying application data, | |||
| an attacker might be able to control most of the content of | an attacker might be able to control most of the content of | |||
| datagrams. | datagrams. | |||
| This document does not offer specific countermeasures that can be | This document does not offer specific countermeasures that can be | |||
| implemented by endpoints aside from the generic measures described in | implemented by endpoints, aside from the generic measures described | |||
| Section 21.5.6. However, countermeasures for address spoofing at the | in Section 21.5.6. However, countermeasures for address spoofing at | |||
| network level, in particular ingress filtering [BCP38], are | the network level -- in particular, ingress filtering [BCP38] -- are | |||
| especially effective against attacks that use spoofing and originate | especially effective against attacks that use spoofing and originate | |||
| from an external network. | from an external network. | |||
| 21.5.5. Request Forgery with Version Negotiation | 21.5.5. Request Forgery with Version Negotiation | |||
| Clients that are able to present a spoofed source address on a packet | Clients that are able to present a spoofed source address on a packet | |||
| can cause a server to send a Version Negotiation packet | can cause a server to send a Version Negotiation packet | |||
| Section 17.2.1 to that address. | (Section 17.2.1) to that address. | |||
| The absence of size restrictions on the connection ID fields for | The absence of size restrictions on the connection ID fields for | |||
| packets of an unknown version increases the amount of data that the | packets of an unknown version increases the amount of data that the | |||
| client controls from the resulting datagram. The first byte of this | client controls from the resulting datagram. The first byte of this | |||
| packet is not under client control and the next four bytes are zero, | packet is not under client control and the next four bytes are zero, | |||
| but the client is able to control up to 512 bytes starting from the | but the client is able to control up to 512 bytes starting from the | |||
| fifth byte. | fifth byte. | |||
| No specific countermeasures are provided for this attack, though | No specific countermeasures are provided for this attack, though | |||
| generic protections Section 21.5.6 could apply. In this case, | generic protections (Section 21.5.6) could apply. In this case, | |||
| ingress filtering [BCP38] is also effective. | ingress filtering [BCP38] is also effective. | |||
| 21.5.6. Generic Request Forgery Countermeasures | 21.5.6. Generic Request Forgery Countermeasures | |||
| The most effective defense against request forgery attacks is to | The most effective defense against request forgery attacks is to | |||
| modify vulnerable services to use strong authentication. However, | modify vulnerable services to use strong authentication. However, | |||
| this is not always something that is within the control of a QUIC | this is not always something that is within the control of a QUIC | |||
| deployment. This section outlines some others steps that QUIC | deployment. This section outlines some other steps that QUIC | |||
| endpoints could take unilaterally. These additional steps are all | endpoints could take unilaterally. These additional steps are all | |||
| discretionary as, depending on circumstances, they could interfere | discretionary because, depending on circumstances, they could | |||
| with or prevent legitimate uses. | interfere with or prevent legitimate uses. | |||
| Services offered over loopback interfaces often lack proper | Services offered over loopback interfaces often lack proper | |||
| authentication. Endpoints MAY prevent connection attempts or | authentication. Endpoints MAY prevent connection attempts or | |||
| migration to a loopback address. Endpoints SHOULD NOT allow | migration to a loopback address. Endpoints SHOULD NOT allow | |||
| connections or migration to a loopback address if the same service | connections or migration to a loopback address if the same service | |||
| was previously available at a different interface or if the address | was previously available at a different interface or if the address | |||
| was provided by a service at a non-loopback address. Endpoints that | was provided by a service at a non-loopback address. Endpoints that | |||
| depend on these capabilities could offer an option to disable these | depend on these capabilities could offer an option to disable these | |||
| protections. | protections. | |||
| Similarly, endpoints could regard a change in address to link-local | Similarly, endpoints could regard a change in address to a link-local | |||
| address [RFC4291] or an address in a private use range [RFC1918] from | address [RFC4291] or an address in a private-use range [RFC1918] from | |||
| a global, unique-local [RFC4193], or non-private address as a | a global, unique-local [RFC4193], or non-private address as a | |||
| potential attempt at request forgery. Endpoints could refuse to use | potential attempt at request forgery. Endpoints could refuse to use | |||
| these addresses entirely, but that carries a significant risk of | these addresses entirely, but that carries a significant risk of | |||
| interfering with legitimate uses. Endpoints SHOULD NOT refuse to use | interfering with legitimate uses. Endpoints SHOULD NOT refuse to use | |||
| an address unless they have specific knowledge about the network | an address unless they have specific knowledge about the network | |||
| indicating that sending datagrams to unvalidated addresses in a given | indicating that sending datagrams to unvalidated addresses in a given | |||
| range is not safe. | range is not safe. | |||
| Endpoints MAY choose to reduce the risk of request forgery by not | Endpoints MAY choose to reduce the risk of request forgery by not | |||
| including values from NEW_TOKEN frames in Initial packets or by only | including values from NEW_TOKEN frames in Initial packets or by only | |||
| skipping to change at page 162, line 18 ¶ | skipping to change at page 161, line 18 ¶ | |||
| Endpoints are not expected to have specific information about the | Endpoints are not expected to have specific information about the | |||
| location of servers that could be vulnerable targets of a request | location of servers that could be vulnerable targets of a request | |||
| forgery attack. However, it might be possible over time to identify | forgery attack. However, it might be possible over time to identify | |||
| specific UDP ports that are common targets of attacks or particular | specific UDP ports that are common targets of attacks or particular | |||
| patterns in datagrams that are used for attacks. Endpoints MAY | patterns in datagrams that are used for attacks. Endpoints MAY | |||
| choose to avoid sending datagrams to these ports or not send | choose to avoid sending datagrams to these ports or not send | |||
| datagrams that match these patterns prior to validating the | datagrams that match these patterns prior to validating the | |||
| destination address. Endpoints MAY retire connection IDs containing | destination address. Endpoints MAY retire connection IDs containing | |||
| patterns known to be problematic without using them. | patterns known to be problematic without using them. | |||
| Note: Modifying endpoints to apply these protections is more | Note: Modifying endpoints to apply these protections is more | |||
| efficient than deploying network-based protections, as endpoints | efficient than deploying network-based protections, as endpoints | |||
| do not need to perform any additional processing when sending to | do not need to perform any additional processing when sending to | |||
| an address that has been validated. | an address that has been validated. | |||
| 21.6. Slowloris Attacks | 21.6. Slowloris Attacks | |||
| The attacks commonly known as Slowloris ([SLOWLORIS]) try to keep | The attacks commonly known as Slowloris [SLOWLORIS] try to keep many | |||
| many connections to the target endpoint open and hold them open as | connections to the target endpoint open and hold them open as long as | |||
| long as possible. These attacks can be executed against a QUIC | possible. These attacks can be executed against a QUIC endpoint by | |||
| endpoint by generating the minimum amount of activity necessary to | generating the minimum amount of activity necessary to avoid being | |||
| avoid being closed for inactivity. This might involve sending small | closed for inactivity. This might involve sending small amounts of | |||
| amounts of data, gradually opening flow control windows in order to | data, gradually opening flow control windows in order to control the | |||
| control the sender rate, or manufacturing ACK frames that simulate a | sender rate, or manufacturing ACK frames that simulate a high loss | |||
| 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. | |||
| 21.7. Stream Fragmentation and Reassembly Attacks | 21.7. Stream Fragmentation and Reassembly Attacks | |||
| skipping to change at page 163, line 6 ¶ | skipping to change at page 162, line 6 ¶ | |||
| stream data, causing the receiver to commit resources for the unsent | stream data, causing the receiver to commit resources for the unsent | |||
| data. This could cause a disproportionate receive buffer memory | data. This could cause a disproportionate receive buffer memory | |||
| commitment and/or the creation of a large and inefficient data | commitment and/or the creation of a large and inefficient data | |||
| structure at the receiver. | structure at the receiver. | |||
| An adversarial receiver might intentionally not acknowledge packets | An adversarial receiver might intentionally not acknowledge packets | |||
| containing stream data in an attempt to force the sender to store the | containing stream data in an attempt to force the sender to store the | |||
| unacknowledged stream data for retransmission. | unacknowledged stream data for retransmission. | |||
| The attack on receivers is mitigated if flow control windows | The attack on receivers is mitigated if flow control windows | |||
| correspond to available memory. However, some receivers will over- | correspond to available memory. However, some receivers will | |||
| commit memory and advertise flow control offsets in the aggregate | overcommit memory and advertise flow control offsets in the aggregate | |||
| that exceed actual available memory. The over-commitment strategy | that exceed actual available memory. The overcommitment strategy can | |||
| can lead to better performance when endpoints are well behaved, but | lead to better performance when endpoints are well behaved, but | |||
| renders endpoints vulnerable to the stream fragmentation attack. | renders endpoints vulnerable to the stream fragmentation attack. | |||
| QUIC deployments SHOULD provide mitigations against stream | QUIC deployments SHOULD provide mitigations for stream fragmentation | |||
| fragmentation attacks. Mitigations could consist of avoiding over- | attacks. Mitigations could consist of avoiding overcommitting | |||
| committing memory, limiting the size of tracking data structures, | memory, limiting the size of tracking data structures, delaying | |||
| delaying reassembly of STREAM frames, implementing heuristics based | reassembly of STREAM frames, implementing heuristics based on the age | |||
| on the age and duration of reassembly holes, or some combination. | and duration of reassembly holes, or some combination of these. | |||
| 21.8. Stream Commitment Attack | 21.8. Stream Commitment Attack | |||
| An adversarial endpoint can open a large number of streams, | An adversarial endpoint can open a large number of streams, | |||
| exhausting state on an endpoint. The adversarial endpoint could | exhausting state on an endpoint. The adversarial endpoint could | |||
| repeat the process on a large number of connections, in a manner | repeat the process on a large number of connections, in a manner | |||
| similar to SYN flooding attacks in TCP. | similar to SYN flooding attacks in TCP. | |||
| Normally, clients will open streams sequentially, as explained in | Normally, clients will open streams sequentially, as explained in | |||
| Section 2.1. However, when several streams are initiated at short | Section 2.1. However, when several streams are initiated at short | |||
| skipping to change at page 163, line 40 ¶ | skipping to change at page 162, line 40 ¶ | |||
| streams of the same type; see Section 3.2. Thus, on a new | streams of the same type; see Section 3.2. Thus, on a new | |||
| connection, opening stream 4000000 opens 1 million and 1 client- | connection, opening stream 4000000 opens 1 million and 1 client- | |||
| initiated bidirectional streams. | initiated bidirectional streams. | |||
| The number of active streams is limited by the | The number of active streams is limited by the | |||
| initial_max_streams_bidi and initial_max_streams_uni transport | initial_max_streams_bidi and initial_max_streams_uni transport | |||
| parameters as updated by any received MAX_STREAMS frames, as | parameters as updated by any received MAX_STREAMS frames, as | |||
| explained in Section 4.6. If chosen judiciously, these limits | explained in Section 4.6. If chosen judiciously, these limits | |||
| mitigate the effect of the stream commitment attack. However, | mitigate the effect of the stream commitment attack. However, | |||
| setting the limit too low could affect performance when applications | setting the limit too low could affect performance when applications | |||
| expect to open large number of streams. | expect to open a large number of streams. | |||
| 21.9. Peer Denial of Service | 21.9. Peer Denial of Service | |||
| QUIC and TLS both contain frames or messages that have legitimate | QUIC and TLS both contain frames or messages that have legitimate | |||
| uses in some contexts, but that can be abused to cause a peer to | uses in some contexts, but these frames or messages can be abused to | |||
| expend processing resources without having any observable impact on | cause a peer to expend processing resources without having any | |||
| the state of the connection. | observable impact on the state of the connection. | |||
| Messages can also be used to change and revert state in small or | Messages can also be used to change and revert state in small or | |||
| inconsequential ways, such as by sending small increments to flow | inconsequential ways, such as by sending small increments to flow | |||
| control limits. | control limits. | |||
| If processing costs are disproportionately large in comparison to | If processing costs are disproportionately large in comparison to | |||
| bandwidth consumption or effect on state, then this could allow a | bandwidth consumption or effect on state, then this could allow a | |||
| malicious peer to exhaust processing capacity. | malicious peer to exhaust processing capacity. | |||
| While there are legitimate uses for all messages, implementations | While there are legitimate uses for all messages, implementations | |||
| SHOULD track cost of processing relative to progress and treat | SHOULD track cost of processing relative to progress and treat | |||
| excessive quantities of any non-productive packets as indicative of | excessive quantities of any non-productive packets as indicative of | |||
| an attack. Endpoints MAY respond to this condition with a connection | an attack. Endpoints MAY respond to this condition with a connection | |||
| error, or by dropping packets. | error or by dropping packets. | |||
| 21.10. Explicit Congestion Notification Attacks | 21.10. Explicit Congestion Notification Attacks | |||
| An on-path attacker could manipulate the value of ECN fields in the | An on-path attacker could manipulate the value of ECN fields in the | |||
| IP header to influence the sender's rate. [RFC3168] discusses | IP header to influence the sender's rate. [RFC3168] discusses | |||
| manipulations and their effects in more detail. | manipulations and their effects in more detail. | |||
| A limited on-path attacker can duplicate and send packets with | A limited on-path attacker can duplicate and send packets with | |||
| modified ECN fields to affect the sender's rate. If duplicate | modified ECN fields to affect the sender's rate. If duplicate | |||
| packets are discarded by a receiver, an attacker will need to race | packets are discarded by a receiver, an attacker will need to race | |||
| the duplicate packet against the original to be successful in this | the duplicate packet against the original to be successful in this | |||
| attack. Therefore, QUIC endpoints ignore the ECN field on an IP | attack. Therefore, QUIC endpoints ignore the ECN field in an IP | |||
| packet unless at least one QUIC packet in that IP packet is | packet unless at least one QUIC packet in that IP packet is | |||
| successfully processed; see Section 13.4. | successfully processed; see Section 13.4. | |||
| 21.11. Stateless Reset Oracle | 21.11. Stateless Reset Oracle | |||
| Stateless resets create a possible denial of service attack analogous | Stateless resets create a possible denial-of-service attack analogous | |||
| to a TCP reset injection. This attack is possible if an attacker is | to a TCP reset injection. This attack is possible if an attacker is | |||
| able to cause a stateless reset token to be generated for a | able to cause a stateless reset token to be generated for a | |||
| connection with a selected connection ID. An attacker that can cause | connection with a selected connection ID. An attacker that can cause | |||
| this token to be generated can reset an active connection with the | this token to be generated can reset an active connection with the | |||
| same connection ID. | same connection ID. | |||
| If a packet can be routed to different instances that share a static | If a packet can be routed to different instances that share a static | |||
| key, for example by changing an IP address or port, then an attacker | key -- for example, by changing an IP address or port -- then an | |||
| can cause the server to send a stateless reset. To defend against | attacker can cause the server to send a stateless reset. To defend | |||
| this style of denial of service, endpoints that share a static key | against this style of denial of service, endpoints that share a | |||
| for stateless reset (see Section 10.3.2) MUST be arranged so that | static key for stateless resets (see Section 10.3.2) MUST be arranged | |||
| packets with a given connection ID always arrive at an instance that | so that packets with a given connection ID always arrive at an | |||
| has connection state, unless that connection is no longer active. | instance that has connection state, unless that connection is no | |||
| longer active. | ||||
| More generally, servers MUST NOT generate a stateless reset if a | More generally, servers MUST NOT generate a stateless reset if a | |||
| connection with the corresponding connection ID could be active on | connection with the corresponding connection ID could be active on | |||
| any endpoint using the same static key. | any endpoint using the same static key. | |||
| In the case of a cluster that uses dynamic load balancing, it is | In the case of a cluster that uses dynamic load balancing, it is | |||
| possible that a change in load balancer configuration could occur | possible that a change in load-balancer configuration could occur | |||
| while an active instance retains connection state. Even if an | while an active instance retains connection state. Even if an | |||
| instance retains connection state, the change in routing and | instance retains connection state, the change in routing and | |||
| resulting stateless reset will result in the connection being | resulting stateless reset will result in the connection being | |||
| terminated. If there is no chance of the packet being routed to the | terminated. If there is no chance of the packet being routed to the | |||
| correct instance, it is better to send a stateless reset than wait | correct instance, it is better to send a stateless reset than wait | |||
| for the connection to time out. However, this is acceptable only if | for the connection to time out. However, this is acceptable only if | |||
| the routing cannot be influenced by an attacker. | the routing cannot be influenced by an attacker. | |||
| 21.12. Version Downgrade | 21.12. Version Downgrade | |||
| This document defines QUIC Version Negotiation packets in Section 6 | This document defines QUIC Version Negotiation packets (Section 6), | |||
| that can be used to negotiate the QUIC version used between two | which can be used to negotiate the QUIC version used between two | |||
| endpoints. However, this document does not specify how this | endpoints. However, this document does not specify how this | |||
| negotiation will be performed between this version and subsequent | negotiation will be performed between this version and subsequent | |||
| future versions. In particular, Version Negotiation packets do not | future versions. In particular, Version Negotiation packets do not | |||
| contain any mechanism to prevent version downgrade attacks. Future | contain any mechanism to prevent version downgrade attacks. Future | |||
| versions of QUIC that use Version Negotiation packets MUST define a | versions of QUIC that use Version Negotiation packets MUST define a | |||
| mechanism that is robust against version downgrade attacks. | mechanism that is robust against version downgrade attacks. | |||
| 21.13. Targeted Attacks by Routing | 21.13. Targeted Attacks by Routing | |||
| Deployments should limit the ability of an attacker to target a new | Deployments should limit the ability of an attacker to target a new | |||
| skipping to change at page 165, line 37 ¶ | skipping to change at page 164, line 38 ¶ | |||
| addresses. Once an instance is selected, a connection ID can be | addresses. Once an instance is selected, a connection ID can be | |||
| selected so that later packets are routed to the same instance. | selected so that later packets are routed to the same instance. | |||
| 21.14. Traffic Analysis | 21.14. Traffic Analysis | |||
| The length of QUIC packets can reveal information about the length of | The length of QUIC packets can reveal information about the length of | |||
| the content of those packets. The PADDING frame is provided so that | the content of those packets. The PADDING frame is provided so that | |||
| endpoints have some ability to obscure the length of packet content; | endpoints have some ability to obscure the length of packet content; | |||
| see Section 19.1. | see Section 19.1. | |||
| Note however that defeating traffic analysis is challenging and the | Defeating traffic analysis is challenging and the subject of active | |||
| subject of active research. Length is not the only way that | research. Length is not the only way that information might leak. | |||
| information might leak. Endpoints might also reveal sensitive | Endpoints might also reveal sensitive information through other side | |||
| information through other side channels, such as the timing of | channels, such as the timing of packets. | |||
| packets. | ||||
| 22. IANA Considerations | 22. IANA Considerations | |||
| This document establishes several registries for the management of | This document establishes several registries for the management of | |||
| codepoints in QUIC. These registries operate on a common set of | codepoints in QUIC. These registries operate on a common set of | |||
| policies as defined in Section 22.1. | policies as defined in Section 22.1. | |||
| 22.1. Registration Policies for QUIC Registries | 22.1. Registration Policies for QUIC Registries | |||
| All QUIC registries allow for both provisional and permanent | All QUIC registries allow for both provisional and permanent | |||
| registration of codepoints. This section documents policies that are | registration of codepoints. This section documents policies that are | |||
| common to these registries. | common to these registries. | |||
| 22.1.1. Provisional Registrations | 22.1.1. Provisional Registrations | |||
| Provisional registration of codepoints are intended to allow for | Provisional registrations of codepoints are intended to allow for | |||
| private use and experimentation with extensions to QUIC. Provisional | private use and experimentation with extensions to QUIC. Provisional | |||
| registrations only require the inclusion of the codepoint value and | registrations only require the inclusion of the codepoint value and | |||
| contact information. However, provisional registrations could be | contact information. However, provisional registrations could be | |||
| reclaimed and reassigned for another purpose. | reclaimed and reassigned for another purpose. | |||
| Provisional registrations require Expert Review, as defined in | Provisional registrations require Expert Review, as defined in | |||
| Section 4.5 of [RFC8126]. Designated expert(s) are advised that only | Section 4.5 of [RFC8126]. The designated expert or experts are | |||
| registrations for an excessive proportion of remaining codepoint | advised that only registrations for an excessive proportion of | |||
| space or the very first unassigned value (see Section 22.1.2) can be | remaining codepoint space or the very first unassigned value (see | |||
| rejected. | Section 22.1.2) can be rejected. | |||
| Provisional registrations will include a date field that indicates | Provisional registrations will include a Date field that indicates | |||
| when the registration was last updated. A request to update the date | when the registration was last updated. A request to update the date | |||
| on any provisional registration can be made without review from the | on any provisional registration can be made without review from the | |||
| designated expert(s). | designated expert(s). | |||
| All QUIC registries include the following fields to support | All QUIC registries include the following fields to support | |||
| provisional registration: | provisional registration: | |||
| Value: The assigned codepoint. | Value: The assigned codepoint. | |||
| Status: "permanent" or "provisional". | ||||
| Status: "Permanent" or "Provisional". | ||||
| Specification: A reference to a publicly available specification for | Specification: A reference to a publicly available specification for | |||
| the value. | the value. | |||
| Date: The date of the last update to the registration. | ||||
| Date: The date of last update to the registration. | ||||
| Change Controller: The entity that is responsible for the definition | Change Controller: The entity that is responsible for the definition | |||
| of the registration. | of the registration. | |||
| Contact: Contact details for the registrant. | Contact: Contact details for the registrant. | |||
| Notes: Supplementary notes about the registration. | Notes: Supplementary notes about the registration. | |||
| Provisional registrations MAY omit the Specification and Notes | Provisional registrations MAY omit the Specification and Notes | |||
| fields, plus any additional fields that might be required for a | fields, plus any additional fields that might be required for a | |||
| permanent registration. The Date field is not required as part of | permanent registration. The Date field is not required as part of | |||
| requesting a registration as it is set to the date the registration | requesting a registration, as it is set to the date the registration | |||
| is created or updated. | is created or updated. | |||
| 22.1.2. Selecting Codepoints | 22.1.2. Selecting Codepoints | |||
| New uses of codepoints from QUIC registries SHOULD use a randomly | New requests for codepoints from QUIC registries SHOULD use a | |||
| selected codepoint that excludes both existing allocations and the | randomly selected codepoint that excludes both existing allocations | |||
| first unallocated codepoint in the selected space. Requests for | and the first unallocated codepoint in the selected space. Requests | |||
| multiple codepoints MAY use a contiguous range. This minimizes the | for multiple codepoints MAY use a contiguous range. This minimizes | |||
| risk that differing semantics are attributed to the same codepoint by | the risk that differing semantics are attributed to the same | |||
| different implementations. | codepoint by different implementations. | |||
| Use of the first unassigned codepoint is reserved for allocation | The use of the first unassigned codepoint is reserved for allocation | |||
| using the Standards Action policy; see Section 4.9 of [RFC8126]. The | using the Standards Action policy; see Section 4.9 of [RFC8126]. The | |||
| early codepoint assignment process [EARLY-ASSIGN] can be used for | early codepoint assignment process [EARLY-ASSIGN] can be used for | |||
| these values. | these values. | |||
| For codepoints that are encoded in variable-length integers | For codepoints that are encoded in variable-length integers | |||
| (Section 16), such as frame types, codepoints that encode to four or | (Section 16), such as frame types, codepoints that encode to four or | |||
| eight bytes (that is, values 2^14 and above) SHOULD be used unless | eight bytes (that is, values 2^14 and above) SHOULD be used unless | |||
| the usage is especially sensitive to having a longer encoding. | the usage is especially sensitive to having a longer encoding. | |||
| Applications to register codepoints in QUIC registries MAY include a | Applications to register codepoints in QUIC registries MAY include a | |||
| requested codepoint as part of the registration. IANA MUST allocate | requested codepoint as part of the registration. IANA MUST allocate | |||
| the selected codepoint if the codepoint is unassigned and the | the selected codepoint if the codepoint is unassigned and the | |||
| requirements of the registration policy are met. | requirements of the registration policy are met. | |||
| 22.1.3. Reclaiming Provisional Codepoints | 22.1.3. Reclaiming Provisional Codepoints | |||
| A request might be made to remove an unused provisional registration | A request might be made to remove an unused provisional registration | |||
| from the registry to reclaim space in a registry, or portion of the | from the registry to reclaim space in a registry, or a portion of the | |||
| registry (such as the 64-16383 range for codepoints that use | registry (such as the 64-16383 range for codepoints that use | |||
| variable-length encodings). This SHOULD be done only for the | variable-length encodings). This SHOULD be done only for the | |||
| codepoints with the earliest recorded date and entries that have been | codepoints with the earliest recorded date, and entries that have | |||
| updated less than a year prior SHOULD NOT be reclaimed. | been updated less than a year prior SHOULD NOT be reclaimed. | |||
| A request to remove a codepoint MUST be reviewed by the designated | A request to remove a codepoint MUST be reviewed by the designated | |||
| expert(s). The expert(s) MUST attempt to determine whether the | experts. The experts MUST attempt to determine whether the codepoint | |||
| codepoint is still in use. Experts are advised to contact the listed | is still in use. Experts are advised to contact the listed contacts | |||
| contacts for the registration, plus as wide a set of protocol | for the registration, plus as wide a set of protocol implementers as | |||
| implementers as possible in order to determine whether any use of the | possible in order to determine whether any use of the codepoint is | |||
| codepoint is known. The expert(s) are advised to allow at least four | known. The experts are also advised to allow at least four weeks for | |||
| weeks for responses. | responses. | |||
| If any use of the codepoints is identified by this search or a | If any use of the codepoints is identified by this search or a | |||
| request to update the registration is made, the codepoint MUST NOT be | request to update the registration is made, the codepoint MUST NOT be | |||
| reclaimed. Instead, the date on the registration is updated. A note | reclaimed. Instead, the date on the registration is updated. A note | |||
| might be added for the registration recording relevant information | might be added for the registration recording relevant information | |||
| that was learned. | that was learned. | |||
| If no use of the codepoint was identified and no request was made to | If no use of the codepoint was identified and no request was made to | |||
| update the registration, the codepoint MAY be removed from the | update the registration, the codepoint MAY be removed from the | |||
| registry. | registry. | |||
| This review and consultation process also applies to requests to | This review and consultation process also applies to requests to | |||
| change a provisional registration into a permanent registration, | change a provisional registration into a permanent registration, | |||
| except that the goal is not to determine whether there is no use of | except that the goal is not to determine whether there is no use of | |||
| the codepoint, but to determine that the registration is an accurate | the codepoint but to determine that the registration is an accurate | |||
| representation of any deployed usage. | representation of any deployed usage. | |||
| 22.1.4. Permanent Registrations | 22.1.4. Permanent Registrations | |||
| Permanent registrations in QUIC registries use the Specification | Permanent registrations in QUIC registries use the Specification | |||
| Required policy ([RFC8126]), unless otherwise specified. The | Required policy (Section 4.6 of [RFC8126]), unless otherwise | |||
| designated expert(s) verify that a specification exists and is | specified. The designated expert or experts verify that a | |||
| readily accessible. Expert(s) are encouraged to be biased towards | specification exists and is readily accessible. Experts are | |||
| approving registrations unless they are abusive, frivolous, or | encouraged to be biased towards approving registrations unless they | |||
| actively harmful (not merely aesthetically displeasing, or | are abusive, frivolous, or actively harmful (not merely aesthetically | |||
| architecturally dubious). The creation of a registry MAY specify | displeasing or architecturally dubious). The creation of a registry | |||
| additional constraints on permanent registrations. | MAY specify additional constraints on permanent registrations. | |||
| The creation of a registry MAY identify a range of codepoints where | The creation of a registry MAY identify a range of codepoints where | |||
| registrations are governed by a different registration policy. For | registrations are governed by a different registration policy. For | |||
| instance, the frame type registry in Section 22.4 has a stricter | instance, the "QUIC Frame Types" registry (Section 22.4) has a | |||
| policy for codepoints in the range from 0 to 63. | stricter policy for codepoints in the range from 0 to 63. | |||
| Any stricter requirements for permanent registrations do not prevent | Any stricter requirements for permanent registrations do not prevent | |||
| provisional registrations for affected codepoints. For instance, a | provisional registrations for affected codepoints. For instance, a | |||
| provisional registration for a frame type of 61 could be requested. | provisional registration for a frame type of 61 could be requested. | |||
| All registrations made by Standards Track publications MUST be | All registrations made by Standards Track publications MUST be | |||
| permanent. | permanent. | |||
| All registrations in this document are assigned a permanent status | All registrations in this document are assigned a permanent status | |||
| and list a change controller of the IETF and a contact of the QUIC | and list a change controller of the IETF and a contact of the QUIC | |||
| working group (quic@ietf.org). | Working Group (quic@ietf.org). | |||
| 22.2. QUIC Versions Registry | 22.2. QUIC Versions Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Versions" under a | IANA has added a registry for "QUIC Versions" under a "QUIC" heading. | |||
| "QUIC" heading. | ||||
| The "QUIC Versions" registry governs a 32-bit space; see Section 15. | The "QUIC Versions" registry governs a 32-bit space; see Section 15. | |||
| This registry follows the registration policy from Section 22.1. | This registry follows the registration policy from Section 22.1. | |||
| Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
| Specification Required policy ([RFC8126]). | Specification Required policy (Section 4.6 of [RFC8126]). | |||
| The codepoint of 0x00000001 to the protocol is assigned with | The codepoint of 0x00000001 for the protocol is assigned with | |||
| permanent status to the protocol defined in this document. The | permanent status to the protocol defined in this document. The | |||
| codepoint of 0x00000000 is permanently reserved; the note for this | codepoint of 0x00000000 is permanently reserved; the note for this | |||
| codepoint [shall] indicate[s] that this version is reserved for | codepoint indicates that this version is reserved for version | |||
| Version Negotiation. | negotiation. | |||
| All codepoints that follow the pattern 0x?a?a?a?a are reserved and | All codepoints that follow the pattern 0x?a?a?a?a are reserved, MUST | |||
| MUST NOT be assigned by IANA and MUST NOT appear in the listing of | NOT be assigned by IANA, and MUST NOT appear in the listing of | |||
| assigned values. | assigned values. | |||
| [[RFC editor: please remove the following note before publication.]] | 22.3. QUIC Transport Parameters Registry | |||
| IANA note: Several pre-standardization versions will likely be in | ||||
| use at the time of publication. There is no need to document | ||||
| these in an RFC, but recording information about these version | ||||
| will ensure that the information in the registry is accurate. The | ||||
| document editors or working group chairs can facilitate getting | ||||
| the necessary information. | ||||
| 22.3. QUIC Transport Parameter Registry | ||||
| IANA [SHALL add/has added] a registry for "QUIC Transport Parameters" | IANA has added a registry for "QUIC Transport Parameters" under a | |||
| under a "QUIC" heading. | "QUIC" heading. | |||
| The "QUIC Transport Parameters" registry governs a 62-bit space. | The "QUIC Transport Parameters" registry governs a 62-bit space. | |||
| This registry follows the registration policy from Section 22.1. | This registry follows the registration policy from Section 22.1. | |||
| Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
| Specification Required policy ([RFC8126]). | Specification Required policy (Section 4.6 of [RFC8126]), except for | |||
| values between 0x00 and 0x3f (in hexadecimal), inclusive, which are | ||||
| assigned using Standards Action or IESG Approval as defined in | ||||
| Sections 4.9 and 4.10 of [RFC8126]. | ||||
| In addition to the fields in Section 22.1.1, permanent registrations | In addition to the fields listed in Section 22.1.1, permanent | |||
| in this registry MUST include the following field: | registrations in this registry MUST include the following field: | |||
| Parameter Name: A short mnemonic for the parameter. | Parameter Name: A short mnemonic for the parameter. | |||
| The initial contents of this registry are shown in Table 6. | The initial contents of this registry are shown in Table 6. | |||
| +-------+-------------------------------------+---------------+ | +-------+-------------------------------------+---------------+ | |||
| | Value | Parameter Name | Specification | | | Value | Parameter Name | Specification | | |||
| +-------+-------------------------------------+---------------+ | +-------+-------------------------------------+---------------+ | |||
| | 0x00 | original_destination_connection_id | Section 18.2 | | | 0x00 | original_destination_connection_id | Section 18.2 | | |||
| | | | | | | | | | | |||
| skipping to change at page 170, line 43 ¶ | skipping to change at page 169, line 43 ¶ | |||
| | | | | | | | | | | |||
| | 0x0d | preferred_address | Section 18.2 | | | 0x0d | preferred_address | Section 18.2 | | |||
| | | | | | | | | | | |||
| | 0x0e | active_connection_id_limit | Section 18.2 | | | 0x0e | active_connection_id_limit | Section 18.2 | | |||
| | | | | | | | | | | |||
| | 0x0f | initial_source_connection_id | Section 18.2 | | | 0x0f | initial_source_connection_id | Section 18.2 | | |||
| | | | | | | | | | | |||
| | 0x10 | retry_source_connection_id | Section 18.2 | | | 0x10 | retry_source_connection_id | Section 18.2 | | |||
| +-------+-------------------------------------+---------------+ | +-------+-------------------------------------+---------------+ | |||
| Table 6: Initial QUIC Transport Parameters Entries | Table 6: Initial QUIC Transport Parameters Registry Entries | |||
| Each value of the format "31 * N + 27" for integer values of N (that | Each value of the form "31 * N + 27" for integer values of N (that | |||
| is, 27, 58, 89, ...) are reserved; these values MUST NOT be assigned | is, 27, 58, 89, ...) are reserved; these values MUST NOT be assigned | |||
| by IANA and MUST NOT appear in the listing of assigned values. | by IANA and MUST NOT appear in the listing of assigned values. | |||
| 22.4. QUIC Frame Types Registry | 22.4. QUIC Frame Types Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a | IANA has added a registry for "QUIC Frame Types" under a "QUIC" | |||
| "QUIC" heading. | heading. | |||
| The "QUIC Frame Types" registry governs a 62-bit space. This | The "QUIC Frame Types" registry governs a 62-bit space. This | |||
| registry follows the registration policy from Section 22.1. | registry follows the registration policy from Section 22.1. | |||
| Permanent registrations in this registry are assigned using the | Permanent registrations in this registry are assigned using the | |||
| Specification Required policy ([RFC8126]), except for values between | Specification Required policy (Section 4.6 of [RFC8126]), except for | |||
| 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned using | values between 0x00 and 0x3f (in hexadecimal), inclusive, which are | |||
| Standards Action or IESG Approval as defined in Section 4.9 and 4.10 | assigned using Standards Action or IESG Approval as defined in | |||
| of [RFC8126]. | Sections 4.9 and 4.10 of [RFC8126]. | |||
| In addition to the fields in Section 22.1.1, permanent registrations | In addition to the fields listed in Section 22.1.1, permanent | |||
| in this registry MUST include the following field: | registrations in this registry MUST include the following field: | |||
| Frame Name: A short mnemonic for the frame type. | Frame Type Name: A short mnemonic for the frame type. | |||
| In addition to the advice in Section 22.1, specifications for new | In addition to the advice in Section 22.1, specifications for new | |||
| permanent registrations SHOULD describe the means by which an | permanent registrations SHOULD describe the means by which an | |||
| endpoint might determine that it can send the identified type of | endpoint might determine that it can send the identified type of | |||
| frame. An accompanying transport parameter registration is expected | frame. An accompanying transport parameter registration is expected | |||
| for most registrations; see Section 22.3. Specifications for | for most registrations; see Section 22.3. Specifications for | |||
| permanent registrations also need to describe the format and assigned | permanent registrations also need to describe the format and assigned | |||
| semantics of any fields in the frame. | semantics of any fields in the frame. | |||
| The initial contents of this registry are tabulated in Table 3. Note | The initial contents of this registry are tabulated in Table 3. Note | |||
| that the registry does not include the "Pkts" and "Spec" columns from | that the registry does not include the "Pkts" and "Spec" columns from | |||
| Table 3. | Table 3. | |||
| 22.5. QUIC Transport Error Codes Registry | 22.5. QUIC Transport Error Codes Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Transport Error | IANA has added a registry for "QUIC Transport Error Codes" under a | |||
| Codes" under a "QUIC" heading. | "QUIC" heading. | |||
| The "QUIC Transport Error Codes" registry governs a 62-bit space. | The "QUIC Transport Error Codes" registry governs a 62-bit space. | |||
| This space is split into three regions that are governed by different | This space is split into three ranges that are governed by different | |||
| policies. Permanent registrations in this registry are assigned | policies. Permanent registrations in this registry are assigned | |||
| using the Specification Required policy ([RFC8126]), except for | using the Specification Required policy (Section 4.6 of [RFC8126]), | |||
| values between 0x00 and 0x3f (in hexadecimal; inclusive), which are | except for values between 0x00 and 0x3f (in hexadecimal), inclusive, | |||
| assigned using Standards Action or IESG Approval as defined in | which are assigned using Standards Action or IESG Approval as defined | |||
| Section 4.9 and 4.10 of [RFC8126]. | in Sections 4.9 and 4.10 of [RFC8126]. | |||
| In addition to the fields in Section 22.1.1, permanent registrations | In addition to the fields listed in Section 22.1.1, permanent | |||
| in this registry MUST include the following fields: | registrations in this registry MUST include the following fields: | |||
| Code: A short mnemonic for the parameter. | Code: A short mnemonic for the parameter. | |||
| Description: A brief description of the error code semantics, which | Description: A brief description of the error code semantics, which | |||
| MAY be a summary if a specification reference is provided. | MAY be a summary if a specification reference is provided. | |||
| The initial contents of this registry are shown in Table 7. | The initial contents of this registry are shown in Table 7. | |||
| +------+---------------------------+----------------+---------------+ | +-------------+-----------------------+--------------+--------------+ | |||
| | Valu | Code | Description | Specification | | | Value | Code | Description | Specificatio | | |||
| | e | | | | | | | | | n | | |||
| +------+---------------------------+----------------+---------------+ | +-------------+-----------------------+--------------+--------------+ | |||
| | 0x0 | NO_ERROR | No error | Section 20 | | | 0x00 | NO_ERROR | No error | Section 20 | | |||
| | | | | | | | | | | | | |||
| | 0x1 | INTERNAL_ERROR | Implementation | Section 20 | | | 0x01 | INTERNAL_ERROR | Implementati | Section 20 | | |||
| | | | error | | | | | | on error | | | |||
| | | | | | | | | | | | | |||
| | 0x2 | CONNECTION_REFUSED | Server refuses | Section 20 | | | 0x02 | CONNECTION_REFUSED | Server | Section 20 | | |||
| | | | a connection | | | | | | refuses a | | | |||
| | | | | | | | | | connection | | | |||
| | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 20 | | | | | | | | |||
| | | | error | | | | 0x03 | FLOW_CONTROL_ERROR | Flow control | Section 20 | | |||
| | | | | | | | | | error | | | |||
| | 0x4 | STREAM_LIMIT_ERROR | Too many | Section 20 | | | | | | | | |||
| | | | streams opened | | | | 0x04 | STREAM_LIMIT_ERROR | Too many | Section 20 | | |||
| | | | | | | | | | streams | | | |||
| | 0x5 | STREAM_STATE_ERROR | Frame received | Section 20 | | | | | opened | | | |||
| | | | in invalid | | | | | | | | | |||
| | | | stream state | | | | 0x05 | STREAM_STATE_ERROR | Frame | Section 20 | | |||
| | | | | | | | | | received in | | | |||
| | 0x6 | FINAL_SIZE_ERROR | Change to | Section 20 | | | | | invalid | | | |||
| | | | final size | | | | | | stream state | | | |||
| | | | | | | | | | | | | |||
| | 0x7 | FRAME_ENCODING_ERROR | Frame encoding | Section 20 | | | 0x06 | FINAL_SIZE_ERROR | Change to | Section 20 | | |||
| | | | error | | | | | | final size | | | |||
| | | | | | | | | | | | | |||
| | 0x8 | TRANSPORT_PARAMETER_ERROR | Error in | Section 20 | | | 0x07 | FRAME_ENCODING_ERROR | Frame | Section 20 | | |||
| | | | transport | | | | | | encoding | | | |||
| | | | parameters | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | 0x9 | CONNECTION_ID_LIMIT_ERROR | Too many | Section 20 | | | 0x08 | TRANSPORT_PARAMETER_E | Error in | Section 20 | | |||
| | | | connection IDs | | | | | RROR | transport | | | |||
| | | | received | | | | | | parameters | | | |||
| | | | | | | | | | | | | |||
| | 0xa | PROTOCOL_VIOLATION | Generic | Section 20 | | | 0x09 | CONNECTION_ID_LIMIT_E | Too many | Section 20 | | |||
| | | | protocol | | | | | RROR | connection | | | |||
| | | | violation | | | | | | IDs received | | | |||
| | | | | | | | | | | | | |||
| | 0xb | INVALID_TOKEN | Invalid Token | Section 20 | | | 0x0a | PROTOCOL_VIOLATION | Generic | Section 20 | | |||
| | | | Received | | | | | | protocol | | | |||
| | | | | | | | | | violation | | | |||
| | 0xc | APPLICATION_ERROR | Application | Section 20 | | | | | | | | |||
| | | | error | | | | 0x0b | INVALID_TOKEN | Invalid | Section 20 | | |||
| | | | | | | | | | Token | | | |||
| | 0xd | CRYPTO_BUFFER_EXCEEDED | CRYPTO data | Section 20 | | | | | received | | | |||
| | | | buffer | | | | | | | | | |||
| | | | overflowed | | | | 0x0c | APPLICATION_ERROR | Application | Section 20 | | |||
| | | | | | | | | | error | | | |||
| | 0xe | KEY_UPDATE_ERROR | Invalid packet | Section 20 | | | | | | | | |||
| | | | protection | | | | 0x0d | CRYPTO_BUFFER_EXCEEDE | CRYPTO data | Section 20 | | |||
| | | | update | | | | | D | buffer | | | |||
| | | | | | | | | | overflowed | | | |||
| | 0xf | AEAD_LIMIT_REACHED | Excessive use | Section 20 | | | | | | | | |||
| | | | of packet | | | | 0x0e | KEY_UPDATE_ERROR | Invalid | Section 20 | | |||
| | | | protection | | | | | | packet | | | |||
| | | | keys | | | | | | protection | | | |||
| | | | | | | | | | update | | | |||
| | 0x10 | NO_VIABLE_PATH | No viable | Section 20 | | | | | | | | |||
| | | | network path | | | | 0x0f | AEAD_LIMIT_REACHED | Excessive | Section 20 | | |||
| | | | exists | | | | | | use of | | | |||
| +------+---------------------------+----------------+---------------+ | | | | packet | | | |||
| | | | protection | | | ||||
| | | | keys | | | ||||
| | | | | | | ||||
| | 0x10 | NO_VIABLE_PATH | No viable | Section 20 | | ||||
| | | | network path | | | ||||
| | | | exists | | | ||||
| | | | | | | ||||
| | 0x0100-0x0 | CRYPTO_ERROR | TLS alert | Section 20 | | ||||
| | 1ff | | code | | | ||||
| +-------------+-----------------------+--------------+--------------+ | ||||
| Table 7: Initial QUIC Transport Error Codes Entries | Table 7: Initial QUIC Transport Error Codes Registry Entries | |||
| 23. References | 23. References | |||
| 23.1. Normative References | 23.1. Normative References | |||
| [BCP38] Ferguson, P. and D. Senie, "Network Ingress Filtering: | [BCP38] Consisting of: [RFC2827], | |||
| Defeating Denial of Service Attacks which employ IP Source | <https://www.rfc-editor.org/info/bcp38>. | |||
| Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, | ||||
| May 2000, <https://www.rfc-editor.org/info/bcp38>. | ||||
| [DPLPMTUD] | [DPLPMTUD] | |||
| Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and | |||
| T. Voelker, "Packetization Layer Path MTU Discovery for | T. Voelker, "Packetization Layer Path MTU Discovery for | |||
| Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | |||
| September 2020, <https://www.rfc-editor.org/info/rfc8899>. | September 2020, <https://www.rfc-editor.org/info/rfc8899>. | |||
| [EARLY-ASSIGN] | [EARLY-ASSIGN] | |||
| Cotton, M., "Early IANA Allocation of Standards Track Code | Cotton, M., "Early IANA Allocation of Standards Track Code | |||
| Points", BCP 100, RFC 7120, DOI 10.17487/RFC7120, January | Points", BCP 100, RFC 7120, DOI 10.17487/RFC7120, January | |||
| 2014, <https://www.rfc-editor.org/info/rfc7120>. | 2014, <https://www.rfc-editor.org/info/rfc7120>. | |||
| [IPv4] Postel, J., "Internet Protocol", STD 5, RFC 791, | [IPv4] Postel, J., "Internet Protocol", STD 5, RFC 791, | |||
| DOI 10.17487/RFC0791, September 1981, | DOI 10.17487/RFC0791, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc791>. | <https://www.rfc-editor.org/info/rfc791>. | |||
| [QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
| Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
| draft-ietf-quic-invariants-13 (work in progress), January | RFC 8999, DOI 10.17487/RFC8999, May 2021, | |||
| 2021. | <https://www.rfc-editor.org/info/rfc8999>. | |||
| [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-34 (work | and Congestion Control", RFC 9002, DOI 10.17487/RFC9002, | |||
| in progress), January 2021. | May 2021, <https://www.rfc-editor.org/info/rfc9002>. | |||
| [QUIC-TLS] | [QUIC-TLS] | |||
| Thomson, M., Ed. and S. Turner, Ed., "Using Transport | Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | |||
| Layer Security (TLS) to Secure QUIC", draft-ietf-quic- | QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | |||
| tls-34 (work in progress), January 2021. | <https://www.rfc-editor.org/info/rfc9001>. | |||
| [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>. | |||
| [RFC2827] Ferguson, P. and D. Senie, "Network Ingress Filtering: | ||||
| Defeating Denial of Service Attacks which employ IP Source | ||||
| Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, | ||||
| May 2000, <https://www.rfc-editor.org/info/rfc2827>. | ||||
| [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | |||
| of Explicit Congestion Notification (ECN) to IP", | of Explicit Congestion Notification (ECN) to IP", | |||
| RFC 3168, DOI 10.17487/RFC3168, September 2001, | RFC 3168, DOI 10.17487/RFC3168, September 2001, | |||
| <https://www.rfc-editor.org/info/rfc3168>. | <https://www.rfc-editor.org/info/rfc3168>. | |||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
| 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | |||
| 2003, <https://www.rfc-editor.org/info/rfc3629>. | 2003, <https://www.rfc-editor.org/info/rfc3629>. | |||
| [RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme, | [RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme, | |||
| skipping to change at page 175, line 48 ¶ | skipping to change at page 175, line 15 ¶ | |||
| [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/info/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
| <https://www.rfc-editor.org/info/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
| [CSRF] Barth, A., Jackson, C., and J. Mitchell, "Robust defenses | [CSRF] Barth, A., Jackson, C., and J. Mitchell, "Robust defenses | |||
| for cross-site request forgery", Proceedings of the 15th | for cross-site request forgery", Proceedings of the 15th | |||
| ACM conference on Computer and communications security - | ACM conference on Computer and communications security, | |||
| CCS '08, DOI 10.1145/1455770.1455782, 2008. | DOI 10.1145/1455770.1455782, ACM, October 2008. | |||
| [EARLY-DESIGN] | [EARLY-DESIGN] | |||
| Roskind, J., "QUIC: Multiplexed Transport Over UDP", | Roskind, J., "QUIC: Multiplexed Stream Transport Over | |||
| December 2013, <https://goo.gl/dMVtFi>. | UDP", December 2013, <https://docs.google.com/document/ | |||
| d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/ | ||||
| edit?usp=sharing>. | ||||
| [GATEWAY] Haetoenen, S., Nyrhinen, A., Eggert, L., Strowes, S., | [GATEWAY] Haetoenen, S., Nyrhinen, A., Eggert, L., Strowes, S., | |||
| Sarolahti, P., and M. Kojo, "An experimental study of home | Sarolahti, P., and M. Kojo, "An experimental study of home | |||
| gateway characteristics", Proceedings of the 10th annual | gateway characteristics", DOI 10.1145/1879141.1879174, | |||
| conference on Internet measurement - IMC '10, | Proceedings of the 10th ACM SIGCOMM conference on Internet | |||
| DOI 10.1145/1879141.1879174, 2010. | measurement - IMC '10, November 2010. | |||
| [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>. | |||
| [IPv6] Deering, S. and R. Hinden, "Internet Protocol, Version 6 | [IPv6] Deering, S. and R. Hinden, "Internet Protocol, Version 6 | |||
| (IPv6) Specification", STD 86, RFC 8200, | (IPv6) Specification", STD 86, RFC 8200, | |||
| DOI 10.17487/RFC8200, July 2017, | DOI 10.17487/RFC8200, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8200>. | <https://www.rfc-editor.org/info/rfc8200>. | |||
| [QUIC-MANAGEABILITY] | [QUIC-MANAGEABILITY] | |||
| Kuehlewind, M. and B. Trammell, "Manageability of the QUIC | Kuehlewind, M. and B. Trammell, "Manageability of the QUIC | |||
| Transport Protocol", draft-ietf-quic-manageability-08 | Transport Protocol", draft-ietf-quic-manageability-18 | |||
| (work in progress), November 2020. | (work in progress), July 2022. | |||
| [RANDOM] Eastlake 3rd, D., Schiller, J., and S. Crocker, | [RANDOM] Eastlake 3rd, D., Schiller, J., and S. Crocker, | |||
| "Randomness Requirements for Security", BCP 106, RFC 4086, | "Randomness Requirements for Security", BCP 106, RFC 4086, | |||
| DOI 10.17487/RFC4086, June 2005, | DOI 10.17487/RFC4086, June 2005, | |||
| <https://www.rfc-editor.org/info/rfc4086>. | <https://www.rfc-editor.org/info/rfc4086>. | |||
| [RFC1812] Baker, F., Ed., "Requirements for IP Version 4 Routers", | [RFC1812] Baker, F., Ed., "Requirements for IP Version 4 Routers", | |||
| RFC 1812, DOI 10.17487/RFC1812, June 1995, | RFC 1812, DOI 10.17487/RFC1812, June 1995, | |||
| <https://www.rfc-editor.org/info/rfc1812>. | <https://www.rfc-editor.org/info/rfc1812>. | |||
| skipping to change at page 177, line 29 ¶ | skipping to change at page 176, line 44 ¶ | |||
| Control Message Protocol (ICMPv6) for the Internet | Control Message Protocol (ICMPv6) for the Internet | |||
| Protocol Version 6 (IPv6) Specification", STD 89, | Protocol Version 6 (IPv6) Specification", STD 89, | |||
| RFC 4443, DOI 10.17487/RFC4443, March 2006, | RFC 4443, DOI 10.17487/RFC4443, March 2006, | |||
| <https://www.rfc-editor.org/info/rfc4443>. | <https://www.rfc-editor.org/info/rfc4443>. | |||
| [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>. | |||
| [RFC4941] Narten, T., Draves, R., and S. Krishnan, "Privacy | ||||
| Extensions for Stateless Address Autoconfiguration in | ||||
| IPv6", RFC 4941, DOI 10.17487/RFC4941, September 2007, | ||||
| <https://www.rfc-editor.org/info/rfc4941>. | ||||
| [RFC5681] Allman, M., Paxson, V., and E. Blanton, "TCP Congestion | [RFC5681] Allman, M., Paxson, V., and E. Blanton, "TCP Congestion | |||
| Control", RFC 5681, DOI 10.17487/RFC5681, September 2009, | Control", RFC 5681, DOI 10.17487/RFC5681, September 2009, | |||
| <https://www.rfc-editor.org/info/rfc5681>. | <https://www.rfc-editor.org/info/rfc5681>. | |||
| [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>. | |||
| [RFC7983] Petit-Huguenin, M. and G. Salgueiro, "Multiplexing Scheme | [RFC7983] Petit-Huguenin, M. and G. Salgueiro, "Multiplexing Scheme | |||
| Updates for Secure Real-time Transport Protocol (SRTP) | Updates for Secure Real-time Transport Protocol (SRTP) | |||
| Extension for Datagram Transport Layer Security (DTLS)", | Extension for Datagram Transport Layer Security (DTLS)", | |||
| RFC 7983, DOI 10.17487/RFC7983, September 2016, | RFC 7983, DOI 10.17487/RFC7983, September 2016, | |||
| <https://www.rfc-editor.org/info/rfc7983>. | <https://www.rfc-editor.org/info/rfc7983>. | |||
| [RFC8087] Fairhurst, G. and M. Welzl, "The Benefits of Using | [RFC8087] Fairhurst, G. and M. Welzl, "The Benefits of Using | |||
| Explicit Congestion Notification (ECN)", RFC 8087, | Explicit Congestion Notification (ECN)", RFC 8087, | |||
| DOI 10.17487/RFC8087, March 2017, | DOI 10.17487/RFC8087, March 2017, | |||
| <https://www.rfc-editor.org/info/rfc8087>. | <https://www.rfc-editor.org/info/rfc8087>. | |||
| [RFC8981] Gont, F., Krishnan, S., Narten, T., and R. Draves, | ||||
| "Temporary Address Extensions for Stateless Address | ||||
| Autoconfiguration in IPv6", RFC 8981, | ||||
| DOI 10.17487/RFC8981, February 2021, | ||||
| <https://www.rfc-editor.org/info/rfc8981>. | ||||
| [SEC-CONS] | [SEC-CONS] | |||
| Rescorla, E. and B. Korver, "Guidelines for Writing RFC | Rescorla, E. and B. Korver, "Guidelines for Writing RFC | |||
| Text on Security Considerations", BCP 72, RFC 3552, | Text on Security Considerations", BCP 72, RFC 3552, | |||
| DOI 10.17487/RFC3552, July 2003, | DOI 10.17487/RFC3552, July 2003, | |||
| <https://www.rfc-editor.org/info/rfc3552>. | <https://www.rfc-editor.org/info/rfc3552>. | |||
| [SLOWLORIS] | [SLOWLORIS] | |||
| RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | "RSnake" Hansen, R., "Welcome to Slowloris - the low | |||
| <https://web.archive.org/web/20150315054838/ | bandwidth, yet greedy and poisonous HTTP client!", June | |||
| 2009, <https://web.archive.org/web/20150315054838/ | ||||
| http://ha.ckers.org/slowloris/>. | http://ha.ckers.org/slowloris/>. | |||
| 23.3. URIs | ||||
| [1] mailto:quic@ietf.org | ||||
| Appendix A. Pseudocode | Appendix A. Pseudocode | |||
| The pseudocode in this section describes sample algorithms. These | The pseudocode in this section describes sample algorithms. These | |||
| algorithms are intended to be correct and clear, rather than being | algorithms are intended to be correct and clear, rather than being | |||
| optimally performant. | optimally performant. | |||
| The pseudocode segments in this section are licensed as Code | The pseudocode segments in this section are licensed as Code | |||
| Components; see the copyright notice. | Components; see the Copyright Notice. | |||
| A.1. Sample Variable-Length Integer Decoding | A.1. Sample Variable-Length Integer Decoding | |||
| The pseudocode in Figure 43 shows how a variable-length integer can | The pseudocode in Figure 43 shows how a variable-length integer can | |||
| be read from a stream of bytes. The function ReadVarint takes a | be read from a stream of bytes. The function ReadVarint takes a | |||
| single argument, a sequence of bytes which can be read in network | single argument -- a sequence of bytes, which can be read in network | |||
| byte order. | byte order. | |||
| ReadVarint(data): | ReadVarint(data): | |||
| // The length of variable-length integers is encoded in the | // The length of variable-length integers is encoded in the | |||
| // first two bits of the first byte. | // first two bits of the first byte. | |||
| v = data.next_byte() | v = data.next_byte() | |||
| prefix = v >> 6 | prefix = v >> 6 | |||
| length = 1 << prefix | length = 1 << prefix | |||
| // Once the length is known, remove these bits and read any | // Once the length is known, remove these bits and read any | |||
| skipping to change at page 179, line 20 ¶ | skipping to change at page 178, line 36 ¶ | |||
| A.2. Sample Packet Number Encoding Algorithm | A.2. Sample Packet Number Encoding Algorithm | |||
| The pseudocode in Figure 44 shows how an implementation can select an | The pseudocode in Figure 44 shows how an implementation can select an | |||
| appropriate size for packet number encodings. | appropriate size for packet number encodings. | |||
| The EncodePacketNumber function takes two arguments: | The EncodePacketNumber function takes two arguments: | |||
| o full_pn is the full packet number of the packet being sent. | o full_pn is the full packet number of the packet being sent. | |||
| o largest_acked is the largest packet number which has been | o largest_acked is the largest packet number that has been | |||
| acknowledged by the peer in the current packet number space, if | acknowledged by the peer in the current packet number space, if | |||
| any. | any. | |||
| EncodePacketNumber(full_pn, largest_acked): | EncodePacketNumber(full_pn, largest_acked): | |||
| // The number of bits must be at least one more | // The number of bits must be at least one more | |||
| // than the base-2 logarithm of the number of contiguous | // than the base-2 logarithm of the number of contiguous | |||
| // unacknowledged packet numbers, including the new packet. | // unacknowledged packet numbers, including the new packet. | |||
| if largest_acked is None: | if largest_acked is None: | |||
| num_unacked = full_pn + 1 | num_unacked = full_pn + 1 | |||
| else: | else: | |||
| num_unacked = full_pn - largest_acked | num_unacked = full_pn - largest_acked | |||
| min_bits = log(num_unacked, 2) + 1 | min_bits = log(num_unacked, 2) + 1 | |||
| num_bytes = ceil(min_bits / 8) | num_bytes = ceil(min_bits / 8) | |||
| // Encode the integer value and truncate to | // Encode the integer value and truncate to | |||
| // the num_bytes least-significant bytes. | // the num_bytes least significant bytes. | |||
| return encode(full_pn, num_bytes) | return encode(full_pn, num_bytes) | |||
| Figure 44: Sample Packet Number Encoding Algorithm | Figure 44: Sample Packet Number Encoding Algorithm | |||
| For example, if an endpoint has received an acknowledgment for packet | For example, if an endpoint has received an acknowledgment for packet | |||
| 0xabe8bc and is sending a packet with a number of 0xac5c02, there are | 0xabe8b3 and is sending a packet with a number of 0xac5c02, there are | |||
| 29,519 (0x734f) outstanding packets. In order to represent at least | 29,519 (0x734f) outstanding packet numbers. In order to represent at | |||
| twice this range (59,038 packets, or 0xe69e), 16 bits are required. | least twice this range (59,038 packets, or 0xe69e), 16 bits are | |||
| required. | ||||
| In the same state, sending a packet with a number of 0xace8fe uses | In the same state, sending a packet with a number of 0xace8fe uses | |||
| the 24-bit encoding, because at least 18 bits are required to | the 24-bit encoding, because at least 18 bits are required to | |||
| represent twice the range (131,182 packets, or 0x2006e). | represent twice the range (131,222 packets, or 0x020096). | |||
| A.3. Sample Packet Number Decoding Algorithm | A.3. Sample Packet Number Decoding Algorithm | |||
| The pseudocode in Figure 45 includes an example algorithm for | The pseudocode in Figure 45 includes an example algorithm for | |||
| decoding packet numbers after header protection has been removed. | decoding packet numbers after header protection has been removed. | |||
| The DecodePacketNumber function takes three arguments: | The DecodePacketNumber function takes three arguments: | |||
| o largest_pn is the largest packet number that has been successfully | o largest_pn is the largest packet number that has been successfully | |||
| processed in the current packet number space. | processed in the current packet number space. | |||
| skipping to change at page 181, line 18 ¶ | skipping to change at page 180, line 49 ¶ | |||
| determines whether the path supports ECN; see Section 13.4. If the | determines whether the path supports ECN; see Section 13.4. If the | |||
| path supports ECN, the goal is to use ECN. Endpoints might also | path supports ECN, the goal is to use ECN. Endpoints might also | |||
| periodically reassess a path that was determined to not support ECN. | periodically reassess a path that was determined to not support ECN. | |||
| This section describes one method for testing new paths. This | This section describes one method for testing new paths. This | |||
| algorithm is intended to show how a path might be tested for ECN | algorithm is intended to show how a path might be tested for ECN | |||
| support. Endpoints can implement different methods. | support. Endpoints can implement different methods. | |||
| The path is assigned an ECN state that is one of "testing", | The path is assigned an ECN state that is one of "testing", | |||
| "unknown", "failed", or "capable". On paths with a "testing" or | "unknown", "failed", or "capable". On paths with a "testing" or | |||
| "capable" state the endpoint sends packets with an ECT marking, by | "capable" state, the endpoint sends packets with an ECT marking -- | |||
| default ECT(0); otherwise, the endpoint sends unmarked packets. | ECT(0) by default; otherwise, the endpoint sends unmarked packets. | |||
| To start testing a path, the ECN state is set to "testing" and | To start testing a path, the ECN state is set to "testing", and | |||
| existing ECN counts are remembered as a baseline. | existing ECN counts are remembered as a baseline. | |||
| The testing period runs for a number of packets or a limited time, as | The testing period runs for a number of packets or a limited time, as | |||
| determined by the endpoint. The goal is not to limit the duration of | determined by the endpoint. The goal is not to limit the duration of | |||
| the testing period, but to ensure that enough marked packets are sent | the testing period but to ensure that enough marked packets are sent | |||
| for received ECN counts to provide a clear indication of how the path | for received ECN counts to provide a clear indication of how the path | |||
| treats marked packets. Section 13.4.2 suggests limiting this to 10 | treats marked packets. Section 13.4.2 suggests limiting this to ten | |||
| packets or 3 times the probe timeout. | packets or three times the PTO. | |||
| After the testing period ends, the ECN state for the path becomes | After the testing period ends, the ECN state for the path becomes | |||
| "unknown". From the "unknown" state, successful validation of the | "unknown". From the "unknown" state, successful validation of the | |||
| ECN counts an ACK frame (see Section 13.4.2.1) causes the ECN state | ECN counts in an ACK frame (see Section 13.4.2.1) causes the ECN | |||
| for the path to become "capable", unless no marked packet has been | state for the path to become "capable", unless no marked packet has | |||
| acknowledged. | been acknowledged. | |||
| If validation of ECN counts fails at any time, the ECN state for the | If validation of ECN counts fails at any time, the ECN state for the | |||
| affected path becomes "failed". An endpoint can also mark the ECN | affected path becomes "failed". An endpoint can also mark the ECN | |||
| state for a path as "failed" if marked packets are all declared lost | state for a path as "failed" if marked packets are all declared lost | |||
| or if they are all CE marked. | or if they are all ECN-CE marked. | |||
| Following this algorithm ensures that ECN is rarely disabled for | Following this algorithm ensures that ECN is rarely disabled for | |||
| paths that properly support ECN. Any path that incorrectly modifies | paths that properly support ECN. Any path that incorrectly modifies | |||
| markings will cause ECN to be disabled. For those rare cases where | markings will cause ECN to be disabled. For those rare cases where | |||
| marked packets are discarded by the path, the short duration of the | marked packets are discarded by the path, the short duration of the | |||
| testing period limits the number of losses incurred. | testing period limits the number of losses incurred. | |||
| Appendix B. Change Log | ||||
| *RFC Editor's Note:* Please remove this section prior to | ||||
| publication of a final version of this document. | ||||
| Issue and pull request numbers are listed with a leading octothorp. | ||||
| B.1. Since draft-ietf-quic-transport-32 | ||||
| o Endpoints are required to limit the total data they send in | ||||
| response to an apparent connection migration to three times what | ||||
| was received (#4257, #4264) | ||||
| o Added an error code for path validation failures (#4257, #4331) | ||||
| o Defined DoS protections for clients during the handshake (#4259, | ||||
| #4330, #4344) | ||||
| o Prohibited connection errors when datagrams are not the required | ||||
| size (#4273, #4342) | ||||
| o Stop using initial timeout for path validation (#4261, #4262, | ||||
| #4263). | ||||
| o A number of improvements to IANA considerations: | ||||
| * Added a registry for versions (#4345, #4280) | ||||
| * Clarified rules for first reserved value (#4378, #4389) | ||||
| * Reserved values are not added to the registry (#4372, #4428) | ||||
| o Added final version numbers (#4430) | ||||
| B.2. Since draft-ietf-quic-transport-31 | ||||
| o Require expansion of datagrams to ensure that a path supports at | ||||
| least 1200 bytes in both directions: | ||||
| * During the handshake ack-eliciting Initial packets from the | ||||
| server need to be expanded (#4183, #4188) | ||||
| * Path validation now requires packets containing PATH_CHALLENGE | ||||
| and PATH_RESPONSE to be expanded and PATH_RESPONSE is sent on | ||||
| the same network path (#4216, #4226) | ||||
| o Though senders need to expand datagrams in some cases, receivers | ||||
| cannot enforce this requirement (#4253, #4254) | ||||
| o Split contact into contact and change controller for IANA | ||||
| registrations (#4230, #4239) | ||||
| B.3. Since draft-ietf-quic-transport-30 | ||||
| o Use TRANSPORT_PARAMETER_ERROR for an invalid transport parameter | ||||
| (#4099, #4100) | ||||
| o Add a new error code for AEAD_LIMIT_REACHED code to avoid conflict | ||||
| (#4087, #4088) | ||||
| o Allow use of address validation token when server address changes | ||||
| (#4076, #4089) | ||||
| B.4. Since draft-ietf-quic-transport-29 | ||||
| o Require the same connection ID on coalesced packets (#3800, #3930) | ||||
| o Allow caching of packets that can't be decrypted, by allowing the | ||||
| reported acknowledgment delay to exceed max_ack_delay prior to | ||||
| confirming the handshake (#3821, #3980, #4035, #3874) | ||||
| o Allow connection ID to be used for address validation (#3834, | ||||
| #3924) | ||||
| o Required protocol operations are no longer directed at | ||||
| implementations, but are features provided to application | ||||
| protocols (#3838, #3935) | ||||
| o Narrow requirements for reset of congestion state on path change | ||||
| (#3842, #3945) | ||||
| o Add a three times amplification limit for sending of | ||||
| CONNECTION_CLOSE with reduced state (#3845, #3864) | ||||
| o Change error code for invalid RETIRE_CONNECTION_ID frames (#3860, | ||||
| #3861) | ||||
| o Recommend retention of state for lost packets to allow for late | ||||
| arrival and avoid unnecessary retransmission (#3956, #3957) | ||||
| o Allow a server to reject connections if a client reuses packet | ||||
| numbers after Retry (#3989, #3990) | ||||
| o Limit recommendation for immediate acknowledgment to when ack- | ||||
| eliciting packets are reordered (#4001, #4000) | ||||
| B.5. Since draft-ietf-quic-transport-28 | ||||
| o Made SERVER_BUSY error (0x2) more generic, now CONNECTION_REFUSED | ||||
| (#3709, #3690, #3694) | ||||
| o Allow TRANSPORT_PARAMETER_ERROR when validating connection IDs | ||||
| (#3703, #3691) | ||||
| o Integrate QUIC-specific language from draft-ietf-tsvwg-datagram- | ||||
| plpmtud (#3695, #3702) | ||||
| o disable_active_migration does not apply to the addresses offered | ||||
| in server_preferred_address (#3608, #3670) | ||||
| B.6. Since draft-ietf-quic-transport-27 | ||||
| o Allowed CONNECTION_CLOSE in any packet number space, with a | ||||
| requirement to use a new transport-level error for application- | ||||
| specific errors in Initial and Handshake packets (#3430, #3435, | ||||
| #3440) | ||||
| o Clearer requirements for address validation (#2125, #3327) | ||||
| o Security analysis of handshake and migration (#2143, #2387, #2925) | ||||
| o The entire payload of a datagram is used when counting bytes for | ||||
| mitigating amplification attacks (#3333, #3470) | ||||
| o Connection IDs can be used at any time, including in the handshake | ||||
| (#3348, #3560, #3438, #3565) | ||||
| o Only one ACK should be sent for each instance of reordering | ||||
| (#3357, #3361) | ||||
| o Remove text allowing a server to proceed with a bad Retry token | ||||
| (#3396, #3398) | ||||
| o Ignore active_connection_id_limit with a zero-length connection ID | ||||
| (#3427, #3426) | ||||
| o Require active_connection_id_limit be remembered for 0-RTT (#3423, | ||||
| #3425) | ||||
| o Require ack_delay not be remembered for 0-RTT (#3433, #3545) | ||||
| o Redefined max_packet_size to max_udp_datagram_size (#3471, #3473) | ||||
| o Guidance on limiting outstanding attempts to retire connection IDs | ||||
| (#3489, #3509, #3557, #3547) | ||||
| o Restored text on dropping bogus Version Negotiation packets | ||||
| (#3532, #3533) | ||||
| o Clarified that largest acknowledged needs to be saved, but not | ||||
| necessarily signaled in all cases (#3541, #3581) | ||||
| o Addressed linkability risk with the use of preferred_address | ||||
| (#3559, #3563) | ||||
| o Added authentication of handshake connection IDs (#3439, #3499) | ||||
| o Opening a stream in the wrong direction is an error (#3527) | ||||
| B.7. Since draft-ietf-quic-transport-26 | ||||
| o Change format of transport parameters to use varints (#3294, | ||||
| #3169) | ||||
| B.8. Since draft-ietf-quic-transport-25 | ||||
| o Define the use of CONNECTION_CLOSE prior to establishing | ||||
| connection state (#3269, #3297, #3292) | ||||
| o Allow use of address validation tokens after client address | ||||
| changes (#3307, #3308) | ||||
| o Define the timer for address validation (#2910, #3339) | ||||
| B.9. Since draft-ietf-quic-transport-24 | ||||
| o Added HANDSHAKE_DONE to signal handshake confirmation (#2863, | ||||
| #3142, #3145) | ||||
| o Add integrity check to Retry packets (#3014, #3274, #3120) | ||||
| o Specify handling of reordered NEW_CONNECTION_ID frames (#3194, | ||||
| #3202) | ||||
| o Require checking of sequence numbers in RETIRE_CONNECTION_ID | ||||
| (#3037, #3036) | ||||
| o active_connection_id_limit is enforced (#3193, #3197, #3200, | ||||
| #3201) | ||||
| o Correct overflow in packet number decode algorithm (#3187, #3188) | ||||
| o Allow use of CRYPTO_BUFFER_EXCEEDED for CRYPTO frame errors | ||||
| (#3258, #3186) | ||||
| o Define applicability and scope of NEW_TOKEN (#3150, #3152, #3155, | ||||
| #3156) | ||||
| o Tokens from Retry and NEW_TOKEN must be differentiated (#3127, | ||||
| #3128) | ||||
| o Allow CONNECTION_CLOSE in response to invalid token (#3168, #3107) | ||||
| o Treat an invalid CONNECTION_CLOSE as an invalid frame (#2475, | ||||
| #3230, #3231) | ||||
| o Throttle when sending CONNECTION_CLOSE after discarding state | ||||
| (#3095, #3157) | ||||
| o Application-variant of CONNECTION_CLOSE can only be sent in 0-RTT | ||||
| or 1-RTT packets (#3158, #3164) | ||||
| o Advise sending while blocked to avoid idle timeout (#2744, #3266) | ||||
| o Define error codes for invalid frames (#3027, #3042) | ||||
| o Idle timeout is symmetric (#2602, #3099) | ||||
| o Prohibit IP fragmentation (#3243, #3280) | ||||
| o Define the use of provisional registration for all registries | ||||
| (#3109, #3020, #3102, #3170) | ||||
| o Packets on one path must not adjust values for a different path | ||||
| (#2909, #3139) | ||||
| B.10. Since draft-ietf-quic-transport-23 | ||||
| o Allow ClientHello to span multiple packets (#2928, #3045) | ||||
| o Client Initial size constraints apply to UDP datagram payload | ||||
| (#3053, #3051) | ||||
| o Stateless reset changes (#2152, #2993) | ||||
| * tokens need to be compared in constant time | ||||
| * detection uses UDP datagrams, not packets | ||||
| * tokens cannot be reused (#2785, #2968) | ||||
| o Clearer rules for sharing of UDP ports and use of connection IDs | ||||
| when doing so (#2844, #2851) | ||||
| o A new connection ID is necessary when responding to migration | ||||
| (#2778, #2969) | ||||
| o Stronger requirements for connection ID retirement (#3046, #3096) | ||||
| o NEW_TOKEN cannot be empty (#2978, #2977) | ||||
| o PING can be sent at any encryption level (#3034, #3035) | ||||
| o CONNECTION_CLOSE is not ack-eliciting (#3097, #3098) | ||||
| o Frame encoding error conditions updated (#3027, #3042) | ||||
| o Non-ack-eliciting packets cannot be sent in response to non-ack- | ||||
| eliciting packets (#3100, #3104) | ||||
| o Servers have to change connection IDs in Retry (#2837, #3147) | ||||
| B.11. Since draft-ietf-quic-transport-22 | ||||
| o Rules for preventing correlation by connection ID tightened | ||||
| (#2084, #2929) | ||||
| o Clarified use of CONNECTION_CLOSE in Handshake packets (#2151, | ||||
| #2541, #2688) | ||||
| o Discourage regressions of largest acknowledged in ACK (#2205, | ||||
| #2752) | ||||
| o Improved robustness of validation process for ECN counts (#2534, | ||||
| #2752) | ||||
| o Require endpoints to ignore spurious migration attempts (#2342, | ||||
| #2893) | ||||
| o Transport parameter for disabling migration clarified to allow NAT | ||||
| rebinding (#2389, #2893) | ||||
| o Document principles for defining new error codes (#2388, #2880) | ||||
| o Reserve transport parameters for greasing (#2550, #2873) | ||||
| o A maximum ACK delay of 0 is used for handshake packet number | ||||
| spaces (#2646, #2638) | ||||
| o Improved rules for use of congestion control state on new paths | ||||
| (#2685, #2918) | ||||
| o Removed recommendation to coordinate spin for multiple connections | ||||
| that share a path (#2763, #2882) | ||||
| o Allow smaller stateless resets and recommend a smaller minimum on | ||||
| packets that might trigger a stateless reset (#2770, #2869, #2927, | ||||
| #3007). | ||||
| o Provide guidance around the interface to QUIC as used by | ||||
| application protocols (#2805, #2857) | ||||
| o Frames other than STREAM can cause STREAM_LIMIT_ERROR (#2825, | ||||
| #2826) | ||||
| o Tighter rules about processing of rejected 0-RTT packets (#2829, | ||||
| #2840, #2841) | ||||
| o Explanation of the effect of Retry on 0-RTT packets (#2842, #2852) | ||||
| o Cryptographic handshake needs to provide server transport | ||||
| parameter encryption (#2920, #2921) | ||||
| o Moved ACK generation guidance from recovery draft to transport | ||||
| draft (#1860, #2916). | ||||
| B.12. Since draft-ietf-quic-transport-21 | ||||
| o Connection ID lengths are now one octet, but limited in version 1 | ||||
| to 20 octets of length (#2736, #2749) | ||||
| B.13. Since draft-ietf-quic-transport-20 | ||||
| o Error codes are encoded as variable-length integers (#2672, #2680) | ||||
| o NEW_CONNECTION_ID includes a request to retire old connection IDs | ||||
| (#2645, #2769) | ||||
| o Tighter rules for generating and explicitly eliciting ACK frames | ||||
| (#2546, #2794) | ||||
| o Recommend having only one packet per encryption level in a | ||||
| datagram (#2308, #2747) | ||||
| o More normative language about use of stateless reset (#2471, | ||||
| #2574) | ||||
| o Allow reuse of stateless reset tokens (#2732, #2733) | ||||
| o Allow, but not require, enforcing non-duplicate transport | ||||
| parameters (#2689, #2691) | ||||
| o Added an active_connection_id_limit transport parameter (#1994, | ||||
| #1998) | ||||
| o max_ack_delay transport parameter defaults to 0 (#2638, #2646) | ||||
| o When sending 0-RTT, only remembered transport parameters apply | ||||
| (#2458, #2360, #2466, #2461) | ||||
| o Define handshake completion and confirmation; define clearer rules | ||||
| when it encryption keys should be discarded (#2214, #2267, #2673) | ||||
| o Prohibit path migration prior to handshake confirmation (#2309, | ||||
| #2370) | ||||
| o PATH_RESPONSE no longer needs to be received on the validated path | ||||
| (#2582, #2580, #2579, #2637) | ||||
| o PATH_RESPONSE frames are not stored and retransmitted (#2724, | ||||
| #2729) | ||||
| o Document hack for enabling routing of ICMP when doing PMTU probing | ||||
| (#1243, #2402) | ||||
| B.14. Since draft-ietf-quic-transport-19 | ||||
| o Refine discussion of 0-RTT transport parameters (#2467, #2464) | ||||
| o Fewer transport parameters need to be remembered for 0-RTT (#2624, | ||||
| #2467) | ||||
| o Spin bit text incorporated (#2564) | ||||
| o Close the connection when maximum stream ID in MAX_STREAMS exceeds | ||||
| 2^62 - 1 (#2499, #2487) | ||||
| o New connection ID required for intentional migration (#2414, | ||||
| #2413) | ||||
| o Connection ID issuance can be rate-limited (#2436, #2428) | ||||
| o The "QUIC bit" is ignored in Version Negotiation (#2400, #2561) | ||||
| o Initial packets from clients need to be padded to 1200 unless a | ||||
| Handshake packet is sent as well (#2522, #2523) | ||||
| o CRYPTO frames can be discarded if too much data is buffered | ||||
| (#1834, #2524) | ||||
| o Stateless reset uses a short header packet (#2599, #2600) | ||||
| B.15. Since draft-ietf-quic-transport-18 | ||||
| o Removed version negotiation; version negotiation, including | ||||
| authentication of the result, will be addressed in the next | ||||
| version of QUIC (#1773, #2313) | ||||
| o Added discussion of the use of IPv6 flow labels (#2348, #2399) | ||||
| o A connection ID can't be retired in a packet that uses that | ||||
| connection ID (#2101, #2420) | ||||
| o Idle timeout transport parameter is in milliseconds (from seconds) | ||||
| (#2453, #2454) | ||||
| o Endpoints are required to use new connection IDs when they use new | ||||
| network paths (#2413, #2414) | ||||
| o Increased the set of permissible frames in 0-RTT (#2344, #2355) | ||||
| B.16. Since draft-ietf-quic-transport-17 | ||||
| o Stream-related errors now use STREAM_STATE_ERROR (#2305) | ||||
| o Endpoints discard initial keys as soon as handshake keys are | ||||
| available (#1951, #2045) | ||||
| o Expanded conditions for ignoring ICMP packet too big messages | ||||
| (#2108, #2161) | ||||
| o Remove rate control from PATH_CHALLENGE/PATH_RESPONSE (#2129, | ||||
| #2241) | ||||
| o Endpoints are permitted to discard malformed initial packets | ||||
| (#2141) | ||||
| o Clarified ECN implementation and usage requirements (#2156, #2201) | ||||
| o Disable ECN count verification for packets that arrive out of | ||||
| order (#2198, #2215) | ||||
| o Use Probe Timeout (PTO) instead of RTO (#2206, #2238) | ||||
| o Loosen constraints on retransmission of ACK ranges (#2199, #2245) | ||||
| o Limit Retry and Version Negotiation to once per datagram (#2259, | ||||
| #2303) | ||||
| o Set a maximum value for max_ack_delay transport parameter (#2282, | ||||
| #2301) | ||||
| o Allow server preferred address for both IPv4 and IPv6 (#2122, | ||||
| #2296) | ||||
| o Corrected requirements for migration to a preferred address | ||||
| (#2146, #2349) | ||||
| o ACK of non-existent packet is illegal (#2298, #2302) | ||||
| B.17. Since draft-ietf-quic-transport-16 | ||||
| o Stream limits are defined as counts, not maximums (#1850, #1906) | ||||
| o Require amplification attack defense after closing (#1905, #1911) | ||||
| o Remove reservation of application error code 0 for STOPPING | ||||
| (#1804, #1922) | ||||
| o Renumbered frames (#1945) | ||||
| o Renumbered transport parameters (#1946) | ||||
| o Numeric transport parameters are expressed as varints (#1608, | ||||
| #1947, #1955) | ||||
| o Reorder the NEW_CONNECTION_ID frame (#1952, #1963) | ||||
| o Rework the first byte (#2006) | ||||
| * Fix the 0x40 bit | ||||
| * Change type values for long header | ||||
| * Add spin bit to short header (#631, #1988) | ||||
| * Encrypt the remainder of the first byte (#1322) | ||||
| * Move packet number length to first byte | ||||
| * Move ODCIL to first byte of retry packets | ||||
| * Simplify packet number protection (#1575) | ||||
| o Allow STOP_SENDING to open a remote bidirectional stream (#1797, | ||||
| #2013) | ||||
| o Added mitigation for off-path migration attacks (#1278, #1749, | ||||
| #2033) | ||||
| o Don't let the PMTU to drop below 1280 (#2063, #2069) | ||||
| o Require peers to replace retired connection IDs (#2085) | ||||
| o Servers are required to ignore Version Negotiation packets (#2088) | ||||
| o Tokens are repeated in all Initial packets (#2089) | ||||
| o Clarified how PING frames are sent after loss (#2094) | ||||
| o Initial keys are discarded once Handshake are available (#1951, | ||||
| #2045) | ||||
| o ICMP PTB validation clarifications (#2161, #2109, #2108) | ||||
| B.18. Since draft-ietf-quic-transport-15 | ||||
| Substantial editorial reorganization; no technical changes. | ||||
| B.19. Since draft-ietf-quic-transport-14 | ||||
| o Merge ACK and ACK_ECN (#1778, #1801) | ||||
| o Explicitly communicate max_ack_delay (#981, #1781) | ||||
| o Validate original connection ID after Retry packets (#1710, #1486, | ||||
| #1793) | ||||
| o Idle timeout is optional and has no specified maximum (#1765) | ||||
| o Update connection ID handling; add RETIRE_CONNECTION_ID type | ||||
| (#1464, #1468, #1483, #1484, #1486, #1495, #1729, #1742, #1799, | ||||
| #1821) | ||||
| o Include a Token in all Initial packets (#1649, #1794) | ||||
| o Prevent handshake deadlock (#1764, #1824) | ||||
| B.20. Since draft-ietf-quic-transport-13 | ||||
| o Streams open when higher-numbered streams of the same type open | ||||
| (#1342, #1549) | ||||
| o Split initial stream flow control limit into 3 transport | ||||
| parameters (#1016, #1542) | ||||
| o All flow control transport parameters are optional (#1610) | ||||
| o Removed UNSOLICITED_PATH_RESPONSE error code (#1265, #1539) | ||||
| o Permit stateless reset in response to any packet (#1348, #1553) | ||||
| o Recommended defense against stateless reset spoofing (#1386, | ||||
| #1554) | ||||
| o Prevent infinite stateless reset exchanges (#1443, #1627) | ||||
| o Forbid processing of the same packet number twice (#1405, #1624) | ||||
| o Added a packet number decoding example (#1493) | ||||
| o More precisely define idle timeout (#1429, #1614, #1652) | ||||
| o Corrected format of Retry packet and prevented looping (#1492, | ||||
| #1451, #1448, #1498) | ||||
| o Permit 0-RTT after receiving Version Negotiation or Retry (#1507, | ||||
| #1514, #1621) | ||||
| o Permit Retry in response to 0-RTT (#1547, #1552) | ||||
| o Looser verification of ECN counters to account for ACK loss | ||||
| (#1555, #1481, #1565) | ||||
| o Remove frame type field from APPLICATION_CLOSE (#1508, #1528) | ||||
| B.21. Since draft-ietf-quic-transport-12 | ||||
| o Changes to integration of the TLS handshake (#829, #1018, #1094, | ||||
| #1165, #1190, #1233, #1242, #1252, #1450, #1458) | ||||
| * The cryptographic handshake uses CRYPTO frames, not stream 0 | ||||
| * QUIC packet protection is used in place of TLS record | ||||
| protection | ||||
| * Separate QUIC packet number spaces are used for the handshake | ||||
| * Changed Retry to be independent of the cryptographic handshake | ||||
| * Added NEW_TOKEN frame and Token fields to Initial packet | ||||
| * Limit the use of HelloRetryRequest to address TLS needs (like | ||||
| key shares) | ||||
| o Enable server to transition connections to a preferred address | ||||
| (#560, #1251, #1373) | ||||
| o Added ECN feedback mechanisms and handling; new ACK_ECN frame | ||||
| (#804, #805, #1372) | ||||
| o Changed rules and recommendations for use of new connection IDs | ||||
| (#1258, #1264, #1276, #1280, #1419, #1452, #1453, #1465) | ||||
| o Added a transport parameter to disable intentional connection | ||||
| migration (#1271, #1447) | ||||
| o Packets from different connection ID can't be coalesced (#1287, | ||||
| #1423) | ||||
| o Fixed sampling method for packet number encryption; the length | ||||
| field in long headers includes the packet number field in addition | ||||
| to the packet payload (#1387, #1389) | ||||
| o Stateless Reset is now symmetric and subject to size constraints | ||||
| (#466, #1346) | ||||
| o Added frame type extension mechanism (#58, #1473) | ||||
| B.22. Since draft-ietf-quic-transport-11 | ||||
| o Enable server to transition connections to a preferred address | ||||
| (#560, #1251) | ||||
| o Packet numbers are encrypted (#1174, #1043, #1048, #1034, #850, | ||||
| #990, #734, #1317, #1267, #1079) | ||||
| o Packet numbers use a variable-length encoding (#989, #1334) | ||||
| o STREAM frames can now be empty (#1350) | ||||
| B.23. 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) | ||||
| B.24. Since draft-ietf-quic-transport-09 | ||||
| o Added PATH_CHALLENGE and PATH_RESPONSE frames to replace PING with | ||||
| Data and PONG frame. Changed ACK frame type from 0x0e to 0x0d. | ||||
| (#1091, #725, #1086) | ||||
| o A server can now only send 3 packets without validating the client | ||||
| address (#38, #1090) | ||||
| o Delivery order of stream data is no longer strongly specified | ||||
| (#252, #1070) | ||||
| o Rework of packet handling and version negotiation (#1038) | ||||
| o Stream 0 is now exempt from flow control until the handshake | ||||
| completes (#1074, #725, #825, #1082) | ||||
| o Improved retransmission rules for all frame types: information is | ||||
| retransmitted, not packets or frames (#463, #765, #1095, #1053) | ||||
| o Added an error code for server busy signals (#1137) | ||||
| 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) | ||||
| B.25. Since draft-ietf-quic-transport-08 | ||||
| o Clarified requirements for BLOCKED usage (#65, #924) | ||||
| o BLOCKED frame now includes reason for blocking (#452, #924, #927, | ||||
| #928) | ||||
| o GAP limitation in ACK Frame (#613) | ||||
| o Improved PMTUD description (#614, #1036) | ||||
| o Clarified stream state machine (#634, #662, #743, #894) | ||||
| o Reserved versions don't need to be generated deterministically | ||||
| (#831, #931) | ||||
| o You don't always need the draining period (#871) | ||||
| o Stateless reset clarified as version-specific (#930, #986) | ||||
| o initial_max_stream_id_x transport parameters are optional (#970, | ||||
| #971) | ||||
| o ACK delay assumes a default value during the handshake (#1007, | ||||
| #1009) | ||||
| o Removed transport parameters from NewSessionTicket (#1015) | ||||
| B.26. Since draft-ietf-quic-transport-07 | ||||
| o The long header now has version before packet number (#926, #939) | ||||
| o Rename and consolidate packet types (#846, #822, #847) | ||||
| o Packet types are assigned new codepoints and the Connection ID | ||||
| Flag is inverted (#426, #956) | ||||
| o Removed type for Version Negotiation and use Version 0 (#963, | ||||
| #968) | ||||
| o Streams are split into unidirectional and bidirectional (#643, | ||||
| #656, #720, #872, #175, #885) | ||||
| * Stream limits now have separate uni- and bi-directional | ||||
| transport parameters (#909, #958) | ||||
| * Stream limit transport parameters are now optional and default | ||||
| to 0 (#970, #971) | ||||
| o The stream state machine has been split into read and write (#634, | ||||
| #894) | ||||
| o Employ variable-length integer encodings throughout (#595) | ||||
| o Improvements to connection close | ||||
| * Added distinct closing and draining states (#899, #871) | ||||
| * Draining period can terminate early (#869, #870) | ||||
| * Clarifications about stateless reset (#889, #890) | ||||
| o Address validation for connection migration (#161, #732, #878) | ||||
| o Clearly defined retransmission rules for BLOCKED (#452, #65, #924) | ||||
| o negotiated_version is sent in server transport parameters (#710, | ||||
| #959) | ||||
| o Increased the range over which packet numbers are randomized | ||||
| (#864, #850, #964) | ||||
| B.27. Since draft-ietf-quic-transport-06 | ||||
| o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | ||||
| o Split error code space between application and transport (#485) | ||||
| o Stateless reset token moved to end (#820) | ||||
| o 1-RTT-protected long header types removed (#848) | ||||
| o No acknowledgments during draining period (#852) | ||||
| o Remove "application close" as a separate close type (#854) | ||||
| o Remove timestamps from the ACK frame (#841) | ||||
| o Require transport parameters to only appear once (#792) | ||||
| B.28. Since draft-ietf-quic-transport-05 | ||||
| o Stateless token is server-only (#726) | ||||
| o Refactor section on connection termination (#733, #748, #328, | ||||
| #177) | ||||
| o Limit size of Version Negotiation packet (#585) | ||||
| o Clarify when and what to ack (#736) | ||||
| o Renamed STREAM_ID_NEEDED to STREAM_ID_BLOCKED | ||||
| o Clarify Keep-alive requirements (#729) | ||||
| B.29. Since draft-ietf-quic-transport-04 | ||||
| o Introduce STOP_SENDING frame, RESET_STREAM only resets in one | ||||
| direction (#165) | ||||
| o Removed GOAWAY; application protocols are responsible for graceful | ||||
| shutdown (#696) | ||||
| o Reduced the number of error codes (#96, #177, #184, #211) | ||||
| o Version validation fields can't move or change (#121) | ||||
| o Removed versions from the transport parameters in a | ||||
| NewSessionTicket message (#547) | ||||
| o Clarify the meaning of "bytes in flight" (#550) | ||||
| o Public reset is now stateless reset and not visible to the path | ||||
| (#215) | ||||
| o Reordered bits and fields in STREAM frame (#620) | ||||
| o Clarifications to the stream state machine (#572, #571) | ||||
| o Increased the maximum length of the Largest Acknowledged field in | ||||
| ACK frames to 64 bits (#629) | ||||
| o truncate_connection_id is renamed to omit_connection_id (#659) | ||||
| o CONNECTION_CLOSE terminates the connection like TCP RST (#330, | ||||
| #328) | ||||
| o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | ||||
| B.30. Since draft-ietf-quic-transport-03 | ||||
| o Change STREAM and RESET_STREAM layout | ||||
| o Add MAX_STREAM_ID settings | ||||
| B.31. Since draft-ietf-quic-transport-02 | ||||
| o The size of the initial packet payload has a fixed minimum (#267, | ||||
| #472) | ||||
| o Define when Version Negotiation packets are ignored (#284, #294, | ||||
| #241, #143, #474) | ||||
| o The 64-bit FNV-1a algorithm is used for integrity protection of | ||||
| unprotected packets (#167, #480, #481, #517) | ||||
| o Rework initial packet types to change how the connection ID is | ||||
| chosen (#482, #442, #493) | ||||
| o No timestamps are forbidden in unprotected packets (#542, #429) | ||||
| o Cryptographic handshake is now on stream 0 (#456) | ||||
| o Remove congestion control exemption for cryptographic handshake | ||||
| (#248, #476) | ||||
| o Version 1 of QUIC uses TLS; a new version is needed to use a | ||||
| different handshake protocol (#516) | ||||
| o STREAM frames have a reduced number of offset lengths (#543, #430) | ||||
| o Split some frames into separate connection- and stream- level | ||||
| frames (#443) | ||||
| * WINDOW_UPDATE split into MAX_DATA and MAX_STREAM_DATA (#450) | ||||
| * BLOCKED split to match WINDOW_UPDATE split (#454) | ||||
| * Define STREAM_ID_NEEDED frame (#455) | ||||
| o A NEW_CONNECTION_ID frame supports connection migration without | ||||
| linkability (#232, #491, #496) | ||||
| o Transport parameters for 0-RTT are retained from a previous | ||||
| connection (#405, #513, #512) | ||||
| * A client in 0-RTT no longer required to reset excess streams | ||||
| (#425, #479) | ||||
| o Expanded security considerations (#440, #444, #445, #448) | ||||
| B.32. Since draft-ietf-quic-transport-01 | ||||
| o Defined short and long packet headers (#40, #148, #361) | ||||
| o Defined a versioning scheme and stable fields (#51, #361) | ||||
| o Define reserved version values for "greasing" negotiation (#112, | ||||
| #278) | ||||
| o The initial packet number is randomized (#35, #283) | ||||
| o Narrow the packet number encoding range requirement (#67, #286, | ||||
| #299, #323, #356) | ||||
| o Defined client address validation (#52, #118, #120, #275) | ||||
| o Define transport parameters as a TLS extension (#49, #122) | ||||
| o SCUP and COPT parameters are no longer valid (#116, #117) | ||||
| o Transport parameters for 0-RTT are either remembered from before, | ||||
| or assume default values (#126) | ||||
| o The server chooses connection IDs in its final flight (#119, #349, | ||||
| #361) | ||||
| o The server echoes the Connection ID and packet number fields when | ||||
| sending a Version Negotiation packet (#133, #295, #244) | ||||
| o Defined a minimum packet size for the initial handshake packet | ||||
| from the client (#69, #136, #139, #164) | ||||
| o Path MTU Discovery (#64, #106) | ||||
| o The initial handshake packet from the client needs to fit in a | ||||
| single packet (#338) | ||||
| o Forbid acknowledgment of packets containing only ACK and PADDING | ||||
| (#291) | ||||
| o Require that frames are processed when packets are acknowledged | ||||
| (#381, #341) | ||||
| o Removed the STOP_WAITING frame (#66) | ||||
| o Don't require retransmission of old timestamps for lost ACK frames | ||||
| (#308) | ||||
| o Clarified that frames are not retransmitted, but the information | ||||
| in them can be (#157, #298) | ||||
| o Error handling definitions (#335) | ||||
| o Split error codes into four sections (#74) | ||||
| o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | ||||
| (#289) | ||||
| o Define packet protection rules (#336) | ||||
| o Require that stream be entirely delivered or reset, including | ||||
| acknowledgment of all STREAM frames or the RESET_STREAM, before it | ||||
| closes (#381) | ||||
| o Remove stream reservation from state machine (#174, #280) | ||||
| o Only stream 1 does not contribute to connection-level flow control | ||||
| (#204) | ||||
| o Stream 1 counts towards the maximum concurrent stream limit (#201, | ||||
| #282) | ||||
| o Remove connection-level flow control exclusion for some streams | ||||
| (except 1) (#246) | ||||
| o RESET_STREAM affects connection-level flow control (#162, #163) | ||||
| o Flow control accounting uses the maximum data offset on each | ||||
| stream, rather than bytes received (#378) | ||||
| o Moved length-determining fields to the start of STREAM and ACK | ||||
| (#168, #277) | ||||
| o Added the ability to pad between frames (#158, #276) | ||||
| o Remove error code and reason phrase from GOAWAY (#352, #355) | ||||
| o GOAWAY includes a final stream number for both directions (#347) | ||||
| o Error codes for RESET_STREAM and CONNECTION_CLOSE are now at a | ||||
| consistent offset (#249) | ||||
| o Defined priority as the responsibility of the application protocol | ||||
| (#104, #303) | ||||
| B.33. Since draft-ietf-quic-transport-00 | ||||
| o Replaced DIVERSIFICATION_NONCE flag with KEY_PHASE flag | ||||
| o Defined versioning | ||||
| o Reworked description of packet and frame layout | ||||
| o Error code space is divided into regions for each component | ||||
| o Use big endian for all numeric values | ||||
| B.34. Since draft-hamilton-quic-transport-protocol-01 | ||||
| o Adopted as base for draft-ietf-quic-tls | ||||
| o Updated authors/editors list | ||||
| o Added IANA Considerations section | ||||
| o Moved Contributors and Acknowledgments to appendices | ||||
| Contributors | Contributors | |||
| The original design and rationale behind this protocol draw | The original design and rationale behind this protocol draw | |||
| significantly from work by Jim Roskind [EARLY-DESIGN]. | significantly from work by Jim Roskind [EARLY-DESIGN]. | |||
| The IETF QUIC Working Group received an enormous amount of support | The IETF QUIC Working Group received an enormous amount of support | |||
| from many people. The following people provided substantive | from many people. The following people provided substantive | |||
| contributions to this document: | contributions to this document: | |||
| o Alessandro Ghedini | o Alessandro Ghedini | |||
| End of changes. 554 change blocks. | ||||
| 2481 lines changed or deleted | 1447 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||