| draft-ietf-quic-transport-16.txt | draft-ietf-quic-transport-17.txt | |||
|---|---|---|---|---|
| QUIC J. Iyengar, Ed. | QUIC J. Iyengar, Ed. | |||
| Internet-Draft Fastly | Internet-Draft Fastly | |||
| Intended status: Standards Track M. Thomson, Ed. | Intended status: Standards Track M. Thomson, Ed. | |||
| Expires: April 26, 2019 Mozilla | Expires: June 21, 2019 Mozilla | |||
| October 23, 2018 | December 18, 2018 | |||
| QUIC: A UDP-Based Multiplexed and Secure Transport | QUIC: A UDP-Based Multiplexed and Secure Transport | |||
| draft-ietf-quic-transport-16 | draft-ietf-quic-transport-17 | |||
| Abstract | Abstract | |||
| This document defines the core of the QUIC transport protocol. This | This document defines the core of the QUIC transport protocol. | |||
| document describes connection establishment, packet format, | Accompanying documents describe QUIC's loss detection and congestion | |||
| multiplexing, and reliability. Accompanying documents describe the | control [QUIC-RECOVERY] and the use of TLS for key negotiation | |||
| cryptographic handshake and loss detection. | [QUIC-TLS]. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the QUIC working group | Discussion of this draft takes place on the QUIC working group | |||
| mailing list (quic@ietf.org), which is archived at | mailing list (quic@ietf.org), which is archived at | |||
| <https://mailarchive.ietf.org/arch/search/?email_list=quic>. | <https://mailarchive.ietf.org/arch/search/?email_list=quic>. | |||
| Working Group information can be found at <https://github.com/ | Working Group information can be found at <https://github.com/ | |||
| quicwg>; source code and issues list for this draft can be found at | quicwg>; source code and issues list for this draft can be found at | |||
| <https://github.com/quicwg/base-drafts/labels/-transport>. | <https://github.com/quicwg/base-drafts/labels/-transport>. | |||
| skipping to change at page 1, line 44 ¶ | skipping to change at page 1, line 44 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on April 26, 2019. | This Internet-Draft will expire on June 21, 2019. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.1. Document Structure . . . . . . . . . . . . . . . . . . . 6 | 1.1. Document Structure . . . . . . . . . . . . . . . . . . . 6 | |||
| 1.2. Conventions and Definitions . . . . . . . . . . . . . . . 7 | 1.2. Terms and Definitions . . . . . . . . . . . . . . . . . . 7 | |||
| 1.3. Notational Conventions . . . . . . . . . . . . . . . . . 8 | 1.3. Notational Conventions . . . . . . . . . . . . . . . . . 8 | |||
| 2. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 2. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 2.1. Stream Identifiers . . . . . . . . . . . . . . . . . . . 9 | 2.1. Stream Types and Identifiers . . . . . . . . . . . . . . 9 | |||
| 2.2. Stream Concurrency . . . . . . . . . . . . . . . . . . . 10 | 2.2. Sending and Receiving Data . . . . . . . . . . . . . . . 10 | |||
| 2.3. Sending and Receiving Data . . . . . . . . . . . . . . . 11 | 2.3. Stream Prioritization . . . . . . . . . . . . . . . . . . 10 | |||
| 2.4. Stream Prioritization . . . . . . . . . . . . . . . . . . 11 | 3. Stream States . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3. Stream States: Life of a Stream . . . . . . . . . . . . . . . 12 | 3.1. Send Stream States . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.1. Send Stream States . . . . . . . . . . . . . . . . . . . 13 | 3.2. Receive Stream States . . . . . . . . . . . . . . . . . . 13 | |||
| 3.2. Receive Stream States . . . . . . . . . . . . . . . . . . 15 | 3.3. Permitted Frame Types . . . . . . . . . . . . . . . . . . 16 | |||
| 3.3. Permitted Frame Types . . . . . . . . . . . . . . . . . . 18 | 3.4. Bidirectional Stream States . . . . . . . . . . . . . . . 16 | |||
| 3.4. Bidirectional Stream States . . . . . . . . . . . . . . . 18 | 3.5. Solicited State Transitions . . . . . . . . . . . . . . . 17 | |||
| 3.5. Solicited State Transitions . . . . . . . . . . . . . . . 19 | 4. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . 20 | 4.1. Data Flow Control . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.1. Handling of Stream Cancellation . . . . . . . . . . . . . 21 | 4.2. Flow Credit Increments . . . . . . . . . . . . . . . . . 20 | |||
| 4.2. Data Limit Increments . . . . . . . . . . . . . . . . . . 22 | 4.3. Handling Stream Cancellation . . . . . . . . . . . . . . 21 | |||
| 4.3. Stream Final Offset . . . . . . . . . . . . . . . . . . . 23 | 4.4. Stream Final Offset . . . . . . . . . . . . . . . . . . . 21 | |||
| 4.4. Flow Control for Cryptographic Handshake . . . . . . . . 24 | 4.5. Controlling Concurrency . . . . . . . . . . . . . . . . . 22 | |||
| 4.5. Stream Limit Increment . . . . . . . . . . . . . . . . . 24 | 5. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 5. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 5.1. Connection ID . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 5.1. Connection ID . . . . . . . . . . . . . . . . . . . . . . 24 | 5.1.1. Issuing Connection IDs . . . . . . . . . . . . . . . 24 | |||
| 5.1.1. Issuing Connection IDs . . . . . . . . . . . . . . . 25 | 5.1.2. Consuming and Retiring Connection IDs . . . . . . . . 25 | |||
| 5.1.2. Consuming and Retiring Connection IDs . . . . . . . . 26 | 5.2. Matching Packets to Connections . . . . . . . . . . . . . 25 | |||
| 5.2. Matching Packets to Connections . . . . . . . . . . . . . 27 | 5.2.1. Client Packet Handling . . . . . . . . . . . . . . . 26 | |||
| 5.2.1. Client Packet Handling . . . . . . . . . . . . . . . 27 | 5.2.2. Server Packet Handling . . . . . . . . . . . . . . . 26 | |||
| 5.2.2. Server Packet Handling . . . . . . . . . . . . . . . 27 | 5.3. Life of a QUIC Connection . . . . . . . . . . . . . . . . 27 | |||
| 5.3. Life of a QUIC Connection . . . . . . . . . . . . . . . . 28 | 6. Version Negotiation . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 6. Version Negotiation . . . . . . . . . . . . . . . . . . . . . 28 | 6.1. Sending Version Negotiation Packets . . . . . . . . . . . 28 | |||
| 6.1. Sending Version Negotiation Packets . . . . . . . . . . . 29 | 6.2. Handling Version Negotiation Packets . . . . . . . . . . 28 | |||
| 6.2. Handling Version Negotiation Packets . . . . . . . . . . 29 | 6.3. Using Reserved Versions . . . . . . . . . . . . . . . . . 29 | |||
| 6.3. Using Reserved Versions . . . . . . . . . . . . . . . . . 30 | 7. Cryptographic and Transport Handshake . . . . . . . . . . . . 29 | |||
| 7. Cryptographic and Transport Handshake . . . . . . . . . . . . 31 | 7.1. Example Handshake Flows . . . . . . . . . . . . . . . . . 30 | |||
| 7.1. Example Handshake Flows . . . . . . . . . . . . . . . . . 32 | 7.2. Negotiating Connection IDs . . . . . . . . . . . . . . . 32 | |||
| 7.2. Negotiating Connection IDs . . . . . . . . . . . . . . . 33 | 7.3. Transport Parameters . . . . . . . . . . . . . . . . . . 33 | |||
| 7.3. Transport Parameters . . . . . . . . . . . . . . . . . . 34 | 7.3.1. Values of Transport Parameters for 0-RTT . . . . . . 34 | |||
| 7.3.1. Values of Transport Parameters for 0-RTT . . . . . . 35 | 7.3.2. New Transport Parameters . . . . . . . . . . . . . . 35 | |||
| 7.3.2. New Transport Parameters . . . . . . . . . . . . . . 36 | 7.3.3. Version Negotiation Validation . . . . . . . . . . . 35 | |||
| 7.3.3. Version Negotiation Validation . . . . . . . . . . . 36 | ||||
| 8. Address Validation . . . . . . . . . . . . . . . . . . . . . 37 | 8. Address Validation . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 8.1. Address Validation During Connection Establishment . . . 38 | 8.1. Address Validation During Connection Establishment . . . 37 | |||
| 8.1.1. Address Validation using Retry Packets . . . . . . . 38 | 8.1.1. Address Validation using Retry Packets . . . . . . . 38 | |||
| 8.1.2. Address Validation for Future Connections . . . . . . 39 | 8.1.2. Address Validation for Future Connections . . . . . . 38 | |||
| 8.1.3. Address Validation Token Integrity . . . . . . . . . 41 | 8.1.3. Address Validation Token Integrity . . . . . . . . . 40 | |||
| 8.2. Path Validation . . . . . . . . . . . . . . . . . . . . . 41 | 8.2. Path Validation . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 8.3. Initiating Path Validation . . . . . . . . . . . . . . . 42 | 8.3. Initiating Path Validation . . . . . . . . . . . . . . . 41 | |||
| 8.4. Path Validation Responses . . . . . . . . . . . . . . . . 42 | 8.4. Path Validation Responses . . . . . . . . . . . . . . . . 42 | |||
| 8.5. Successful Path Validation . . . . . . . . . . . . . . . 42 | 8.5. Successful Path Validation . . . . . . . . . . . . . . . 42 | |||
| 8.6. Failed Path Validation . . . . . . . . . . . . . . . . . 43 | 8.6. Failed Path Validation . . . . . . . . . . . . . . . . . 43 | |||
| 9. Connection Migration . . . . . . . . . . . . . . . . . . . . 43 | 9. Connection Migration . . . . . . . . . . . . . . . . . . . . 43 | |||
| 9.1. Probing a New Path . . . . . . . . . . . . . . . . . . . 44 | 9.1. Probing a New Path . . . . . . . . . . . . . . . . . . . 44 | |||
| 9.2. Initiating Connection Migration . . . . . . . . . . . . . 45 | 9.2. Initiating Connection Migration . . . . . . . . . . . . . 44 | |||
| 9.3. Responding to Connection Migration . . . . . . . . . . . 45 | 9.3. Responding to Connection Migration . . . . . . . . . . . 45 | |||
| 9.3.1. Handling Address Spoofing by a Peer . . . . . . . . . 46 | 9.3.1. Peer Address Spoofing . . . . . . . . . . . . . . . . 45 | |||
| 9.3.2. Handling Address Spoofing by an On-path Attacker . . 46 | 9.3.2. On-Path Address Spoofing . . . . . . . . . . . . . . 46 | |||
| 9.4. Loss Detection and Congestion Control . . . . . . . . . . 47 | 9.3.3. Off-Path Packet Forwarding . . . . . . . . . . . . . 47 | |||
| 9.5. Privacy Implications of Connection Migration . . . . . . 48 | 9.4. Loss Detection and Congestion Control . . . . . . . . . . 48 | |||
| 9.6. Server's Preferred Address . . . . . . . . . . . . . . . 49 | 9.5. Privacy Implications of Connection Migration . . . . . . 49 | |||
| 9.6.1. Communicating A Preferred Address . . . . . . . . . . 49 | 9.6. Server's Preferred Address . . . . . . . . . . . . . . . 50 | |||
| 9.6.2. Responding to Connection Migration . . . . . . . . . 49 | 9.6.1. Communicating A Preferred Address . . . . . . . . . . 50 | |||
| 9.6.3. Interaction of Client Migration and Preferred Address 50 | 9.6.2. Responding to Connection Migration . . . . . . . . . 50 | |||
| 10. Connection Termination . . . . . . . . . . . . . . . . . . . 50 | 9.6.3. Interaction of Client Migration and Preferred Address 51 | |||
| 10. Connection Termination . . . . . . . . . . . . . . . . . . . 51 | ||||
| 10.1. Closing and Draining Connection States . . . . . . . . . 51 | 10.1. Closing and Draining Connection States . . . . . . . . . 51 | |||
| 10.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . . . 52 | 10.2. Idle Timeout . . . . . . . . . . . . . . . . . . . . . . 53 | |||
| 10.3. Immediate Close . . . . . . . . . . . . . . . . . . . . 52 | 10.3. Immediate Close . . . . . . . . . . . . . . . . . . . . 53 | |||
| 10.4. Stateless Reset . . . . . . . . . . . . . . . . . . . . 53 | 10.4. Stateless Reset . . . . . . . . . . . . . . . . . . . . 55 | |||
| 10.4.1. Detecting a Stateless Reset . . . . . . . . . . . . 56 | 10.4.1. Detecting a Stateless Reset . . . . . . . . . . . . 57 | |||
| 10.4.2. Calculating a Stateless Reset Token . . . . . . . . 56 | 10.4.2. Calculating a Stateless Reset Token . . . . . . . . 57 | |||
| 10.4.3. Looping . . . . . . . . . . . . . . . . . . . . . . 57 | 10.4.3. Looping . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 58 | 11. Error Handling . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 58 | 11.1. Connection Errors . . . . . . . . . . . . . . . . . . . 59 | |||
| 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 59 | 11.2. Stream Errors . . . . . . . . . . . . . . . . . . . . . 60 | |||
| 12. Packets and Frames . . . . . . . . . . . . . . . . . . . . . 59 | 12. Packets and Frames . . . . . . . . . . . . . . . . . . . . . 60 | |||
| 12.1. Protected Packets . . . . . . . . . . . . . . . . . . . 59 | 12.1. Protected Packets . . . . . . . . . . . . . . . . . . . 60 | |||
| 12.2. Coalescing Packets . . . . . . . . . . . . . . . . . . . 60 | 12.2. Coalescing Packets . . . . . . . . . . . . . . . . . . . 61 | |||
| 12.3. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 61 | 12.3. Packet Numbers . . . . . . . . . . . . . . . . . . . . . 62 | |||
| 12.4. Frames and Frame Types . . . . . . . . . . . . . . . . . 62 | 12.4. Frames and Frame Types . . . . . . . . . . . . . . . . . 63 | |||
| 13. Packetization and Reliability . . . . . . . . . . . . . . . . 65 | 13. Packetization and Reliability . . . . . . . . . . . . . . . . 66 | |||
| 13.1. Packet Processing and Acknowledgment . . . . . . . . . . 66 | 13.1. Packet Processing and Acknowledgment . . . . . . . . . . 66 | |||
| 13.1.1. Sending ACK Frames . . . . . . . . . . . . . . . . . 66 | 13.1.1. Sending ACK Frames . . . . . . . . . . . . . . . . . 67 | |||
| 13.1.2. ACK Frames and Packet Protection . . . . . . . . . . 67 | 13.1.2. ACK Frames and Packet Protection . . . . . . . . . . 68 | |||
| 13.2. Retransmission of Information . . . . . . . . . . . . . 67 | 13.2. Retransmission of Information . . . . . . . . . . . . . 68 | |||
| 13.3. Explicit Congestion Notification . . . . . . . . . . . . 69 | 13.3. Explicit Congestion Notification . . . . . . . . . . . . 70 | |||
| 13.3.1. ECN Counters . . . . . . . . . . . . . . . . . . . . 70 | 13.3.1. ECN Counts . . . . . . . . . . . . . . . . . . . . . 71 | |||
| 13.3.2. ECN Verification . . . . . . . . . . . . . . . . . . 70 | 13.3.2. ECN Verification . . . . . . . . . . . . . . . . . . 71 | |||
| 14. Packet Size . . . . . . . . . . . . . . . . . . . . . . . . . 71 | 14. Packet Size . . . . . . . . . . . . . . . . . . . . . . . . . 73 | |||
| 14.1. Path Maximum Transmission Unit . . . . . . . . . . . . . 72 | 14.1. Path Maximum Transmission Unit (PMTU) . . . . . . . . . 73 | |||
| 14.1.1. IPv4 PMTU Discovery . . . . . . . . . . . . . . . . 73 | 14.2. ICMP Packet Too Big Messages . . . . . . . . . . . . . . 74 | |||
| 14.2. Special Considerations for Packetization Layer PMTU | 14.3. Datagram Packetization Layer PMTU Discovery . . . . . . 75 | |||
| Discovery . . . . . . . . . . . . . . . . . . . . . . . 73 | 15. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 76 | |||
| 15. Versions . . . . . . . . . . . . . . . . . . . . . . . . . . 74 | 16. Variable-Length Integer Encoding . . . . . . . . . . . . . . 77 | |||
| 16. Variable-Length Integer Encoding . . . . . . . . . . . . . . 75 | 17. Packet Formats . . . . . . . . . . . . . . . . . . . . . . . 77 | |||
| 17. Packet Formats . . . . . . . . . . . . . . . . . . . . . . . 75 | 17.1. Packet Number Encoding and Decoding . . . . . . . . . . 78 | |||
| 17.1. Packet Number Encoding and Decoding . . . . . . . . . . 76 | 17.2. Long Header Packet . . . . . . . . . . . . . . . . . . . 79 | |||
| 17.2. Long Header Packet . . . . . . . . . . . . . . . . . . . 77 | 17.3. Short Header Packet . . . . . . . . . . . . . . . . . . 81 | |||
| 17.3. Short Header Packet . . . . . . . . . . . . . . . . . . 79 | 17.4. Version Negotiation Packet . . . . . . . . . . . . . . . 83 | |||
| 17.4. Version Negotiation Packet . . . . . . . . . . . . . . . 81 | 17.5. Initial Packet . . . . . . . . . . . . . . . . . . . . . 84 | |||
| 17.5. Initial Packet . . . . . . . . . . . . . . . . . . . . . 82 | 17.5.1. Abandoning Initial Packets . . . . . . . . . . . . . 86 | |||
| 17.5.1. Starting Packet Numbers . . . . . . . . . . . . . . 84 | 17.5.2. Starting Packet Numbers . . . . . . . . . . . . . . 86 | |||
| 17.5.2. 0-RTT Packet Numbers . . . . . . . . . . . . . . . . 84 | 17.5.3. 0-RTT Packet Numbers . . . . . . . . . . . . . . . . 86 | |||
| 17.6. Handshake Packet . . . . . . . . . . . . . . . . . . . . 85 | 17.6. Handshake Packet . . . . . . . . . . . . . . . . . . . . 87 | |||
| 17.7. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 85 | 17.7. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 88 | |||
| 18. Transport Parameter Encoding . . . . . . . . . . . . . . . . 88 | 18. Transport Parameter Encoding . . . . . . . . . . . . . . . . 90 | |||
| 18.1. Transport Parameter Definitions . . . . . . . . . . . . 90 | 18.1. Transport Parameter Definitions . . . . . . . . . . . . 92 | |||
| 19. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 92 | 19. Frame Types and Formats . . . . . . . . . . . . . . . . . . . 94 | |||
| 19.1. PADDING Frame . . . . . . . . . . . . . . . . . . . . . 93 | 19.1. PADDING Frame . . . . . . . . . . . . . . . . . . . . . 95 | |||
| 19.2. RST_STREAM Frame . . . . . . . . . . . . . . . . . . . . 93 | 19.2. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 95 | |||
| 19.3. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 94 | 19.3. ACK Frames . . . . . . . . . . . . . . . . . . . . . . . 95 | |||
| 19.4. APPLICATION_CLOSE frame . . . . . . . . . . . . . . . . 95 | 19.3.1. ACK Block Section . . . . . . . . . . . . . . . . . 97 | |||
| 19.5. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 95 | 19.3.2. ECN section . . . . . . . . . . . . . . . . . . . . 99 | |||
| 19.6. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . 96 | 19.4. RESET_STREAM Frame . . . . . . . . . . . . . . . . . . . 100 | |||
| 19.7. MAX_STREAM_ID Frame . . . . . . . . . . . . . . . . . . 97 | 19.5. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 100 | |||
| 19.8. PING Frame . . . . . . . . . . . . . . . . . . . . . . . 98 | 19.6. CRYPTO Frame . . . . . . . . . . . . . . . . . . . . . . 101 | |||
| 19.9. BLOCKED Frame . . . . . . . . . . . . . . . . . . . . . 98 | 19.7. NEW_TOKEN Frame . . . . . . . . . . . . . . . . . . . . 102 | |||
| 19.10. STREAM_BLOCKED Frame . . . . . . . . . . . . . . . . . . 99 | 19.8. STREAM Frames . . . . . . . . . . . . . . . . . . . . . 102 | |||
| 19.11. STREAM_ID_BLOCKED Frame . . . . . . . . . . . . . . . . 99 | 19.9. MAX_DATA Frame . . . . . . . . . . . . . . . . . . . . . 104 | |||
| 19.12. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . 100 | 19.10. MAX_STREAM_DATA Frame . . . . . . . . . . . . . . . . . 104 | |||
| 19.13. RETIRE_CONNECTION_ID Frame . . . . . . . . . . . . . . . 101 | 19.11. MAX_STREAMS Frames . . . . . . . . . . . . . . . . . . . 105 | |||
| 19.14. STOP_SENDING Frame . . . . . . . . . . . . . . . . . . . 102 | 19.12. DATA_BLOCKED Frame . . . . . . . . . . . . . . . . . . . 106 | |||
| 19.15. ACK Frame . . . . . . . . . . . . . . . . . . . . . . . 102 | 19.13. STREAM_DATA_BLOCKED Frame . . . . . . . . . . . . . . . 107 | |||
| 19.15.1. ACK Block Section . . . . . . . . . . . . . . . . . 104 | 19.14. STREAMS_BLOCKED Frames . . . . . . . . . . . . . . . . . 107 | |||
| 19.15.2. ECN section . . . . . . . . . . . . . . . . . . . . 105 | 19.15. NEW_CONNECTION_ID Frame . . . . . . . . . . . . . . . . 108 | |||
| 19.16. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 106 | 19.16. RETIRE_CONNECTION_ID Frame . . . . . . . . . . . . . . . 109 | |||
| 19.17. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . 107 | 19.17. PATH_CHALLENGE Frame . . . . . . . . . . . . . . . . . . 110 | |||
| 19.18. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . 107 | 19.18. PATH_RESPONSE Frame . . . . . . . . . . . . . . . . . . 110 | |||
| 19.19. STREAM Frames . . . . . . . . . . . . . . . . . . . . . 107 | 19.19. CONNECTION_CLOSE Frames . . . . . . . . . . . . . . . . 111 | |||
| 19.20. CRYPTO Frame . . . . . . . . . . . . . . . . . . . . . . 109 | 19.20. Extension Frames . . . . . . . . . . . . . . . . . . . . 112 | |||
| 19.21. Extension Frames . . . . . . . . . . . . . . . . . . . . 110 | 20. Transport Error Codes . . . . . . . . . . . . . . . . . . . . 112 | |||
| 20. Transport Error Codes . . . . . . . . . . . . . . . . . . . . 110 | 20.1. Application Protocol Error Codes . . . . . . . . . . . . 113 | |||
| 20.1. Application Protocol Error Codes . . . . . . . . . . . . 111 | 21. Security Considerations . . . . . . . . . . . . . . . . . . . 114 | |||
| 21. Security Considerations . . . . . . . . . . . . . . . . . . . 112 | 21.1. Handshake Denial of Service . . . . . . . . . . . . . . 114 | |||
| 21.1. Handshake Denial of Service . . . . . . . . . . . . . . 112 | 21.2. Amplification Attack . . . . . . . . . . . . . . . . . . 115 | |||
| 21.2. Spoofed ACK Attack . . . . . . . . . . . . . . . . . . . 113 | 21.3. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 115 | |||
| 21.3. Optimistic ACK Attack . . . . . . . . . . . . . . . . . 113 | 21.4. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 115 | |||
| 21.4. Slowloris Attacks . . . . . . . . . . . . . . . . . . . 114 | 21.5. Stream Fragmentation and Reassembly Attacks . . . . . . 116 | |||
| 21.5. Stream Fragmentation and Reassembly Attacks . . . . . . 114 | 21.6. Stream Commitment Attack . . . . . . . . . . . . . . . . 116 | |||
| 21.6. Stream Commitment Attack . . . . . . . . . . . . . . . . 114 | 21.7. Explicit Congestion Notification Attacks . . . . . . . . 117 | |||
| 21.7. Explicit Congestion Notification Attacks . . . . . . . . 115 | 21.8. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 117 | |||
| 21.8. Stateless Reset Oracle . . . . . . . . . . . . . . . . . 115 | 22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 117 | |||
| 22. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 116 | 22.1. QUIC Transport Parameter Registry . . . . . . . . . . . 117 | |||
| 22.1. QUIC Transport Parameter Registry . . . . . . . . . . . 116 | 22.2. QUIC Frame Type Registry . . . . . . . . . . . . . . . . 119 | |||
| 22.2. QUIC Frame Type Registry . . . . . . . . . . . . . . . . 117 | 22.3. QUIC Transport Error Codes Registry . . . . . . . . . . 120 | |||
| 22.3. QUIC Transport Error Codes Registry . . . . . . . . . . 118 | 23. References . . . . . . . . . . . . . . . . . . . . . . . . . 123 | |||
| 23. References . . . . . . . . . . . . . . . . . . . . . . . . . 121 | 23.1. Normative References . . . . . . . . . . . . . . . . . . 123 | |||
| 23.1. Normative References . . . . . . . . . . . . . . . . . . 121 | 23.2. Informative References . . . . . . . . . . . . . . . . . 124 | |||
| 23.2. Informative References . . . . . . . . . . . . . . . . . 122 | Appendix A. Sample Packet Number Decoding Algorithm . . . . . . 126 | |||
| Appendix A. Sample Packet Number Decoding Algorithm . . . . . . 123 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 126 | |||
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 124 | B.1. Since draft-ietf-quic-transport-16 . . . . . . . . . . . 126 | |||
| B.1. Since draft-ietf-quic-transport-15 . . . . . . . . . . . 124 | B.2. Since draft-ietf-quic-transport-15 . . . . . . . . . . . 128 | |||
| B.2. Since draft-ietf-quic-transport-14 . . . . . . . . . . . 124 | B.3. Since draft-ietf-quic-transport-14 . . . . . . . . . . . 128 | |||
| B.3. Since draft-ietf-quic-transport-13 . . . . . . . . . . . 125 | B.4. Since draft-ietf-quic-transport-13 . . . . . . . . . . . 128 | |||
| B.4. Since draft-ietf-quic-transport-12 . . . . . . . . . . . 126 | B.5. Since draft-ietf-quic-transport-12 . . . . . . . . . . . 129 | |||
| B.5. Since draft-ietf-quic-transport-11 . . . . . . . . . . . 126 | B.6. Since draft-ietf-quic-transport-11 . . . . . . . . . . . 130 | |||
| B.6. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 127 | B.7. Since draft-ietf-quic-transport-10 . . . . . . . . . . . 130 | |||
| B.7. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 127 | B.8. Since draft-ietf-quic-transport-09 . . . . . . . . . . . 131 | |||
| B.8. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 128 | B.9. Since draft-ietf-quic-transport-08 . . . . . . . . . . . 131 | |||
| B.9. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 129 | B.10. Since draft-ietf-quic-transport-07 . . . . . . . . . . . 132 | |||
| B.10. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 130 | B.11. Since draft-ietf-quic-transport-06 . . . . . . . . . . . 133 | |||
| B.11. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 130 | B.12. Since draft-ietf-quic-transport-05 . . . . . . . . . . . 133 | |||
| B.12. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 130 | B.13. Since draft-ietf-quic-transport-04 . . . . . . . . . . . 133 | |||
| B.13. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 131 | B.14. Since draft-ietf-quic-transport-03 . . . . . . . . . . . 134 | |||
| B.14. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 131 | B.15. Since draft-ietf-quic-transport-02 . . . . . . . . . . . 134 | |||
| B.15. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 132 | B.16. Since draft-ietf-quic-transport-01 . . . . . . . . . . . 135 | |||
| B.16. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 134 | B.17. Since draft-ietf-quic-transport-00 . . . . . . . . . . . 137 | |||
| B.17. Since draft-hamilton-quic-transport-protocol-01 . . . . . 134 | B.18. Since draft-hamilton-quic-transport-protocol-01 . . . . . 137 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 134 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 138 | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 135 | Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 138 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 135 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 138 | |||
| 1. Introduction | 1. Introduction | |||
| QUIC is a multiplexed and secure transport protocol that runs on top | QUIC is a multiplexed and secure general-purpose transport protocol | |||
| of UDP. QUIC aims to provide a flexible set of features that allow | that provides: | |||
| it to be a general-purpose secure transport for multiple | ||||
| applications. | ||||
| o Version negotiation | ||||
| o Low-latency connection establishment | ||||
| o Authenticated and encrypted header and payload | ||||
| o Stream multiplexing | o Stream multiplexing | |||
| o Stream and connection-level flow control | o Stream and connection-level flow control | |||
| o Low-latency connection establishment | ||||
| o Connection migration and resilience to NAT rebinding | o Connection migration and resilience to NAT rebinding | |||
| QUIC uses UDP as a substrate to avoid requiring changes in legacy | o Authenticated and encrypted header and payload | |||
| QUIC uses UDP as a substrate to avoid requiring changes to legacy | ||||
| client operating systems and middleboxes. QUIC authenticates all of | client operating systems and middleboxes. QUIC authenticates all of | |||
| its headers and encrypts most of the data it exchanges, including its | its headers and encrypts most of the data it exchanges, including its | |||
| signaling. This allows the protocol to evolve without incurring a | signaling, to avoid incurring a dependency on middleboxes. | |||
| dependency on upgrades to middleboxes. | ||||
| 1.1. Document Structure | 1.1. Document Structure | |||
| This document describes the core QUIC protocol, and is structured as | This document describes the core QUIC protocol and is structured as | |||
| follows: | follows. | |||
| o Streams are the basic service abstraction that QUIC provides. | o Streams are the basic service abstraction that QUIC provides. | |||
| * Section 2 describes core concepts related to streams, | * Section 2 describes core concepts related to streams, | |||
| * Section 3 provides a reference model for stream states, and | * Section 3 provides a reference model for stream states, and | |||
| * 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 specifies critical denial of service mitigation | * Section 8 specifies critical denial of service mitigation | |||
| mechanisms, | mechanisms, | |||
| * Section 9 describes how endpoints migrate a connection to use a | * Section 9 describes how endpoints migrate a connection to a new | |||
| new network paths, and | network path, | |||
| * Section 10 lists the options for terminating an open | * Section 10 lists the options for terminating an open | |||
| connection. | connection, and | |||
| * Section 11 provides general guidance for error handling. | ||||
| o Packets and frames are the basic unit used by QUIC to communicate. | o Packets and frames are the basic unit used by QUIC to communicate. | |||
| * Section 12 describes concepts related to packets and frames, | * Section 12 describes concepts related to packets and frames, | |||
| * Section 13 defines models for the transmission, retransmission, | * Section 13 defines models for the transmission, retransmission, | |||
| and acknowledgement of information, and | and acknowledgement of data, and | |||
| * Section 14 contains a rules for managing the size of packets. | * Section 14 specifies rules for managing the size of packets. | |||
| o Details of encoding of QUIC protocol elements is described in: | o Finally, encoding details of QUIC protocol elements are described | |||
| in: | ||||
| * Section 15 (Versions), | * Section 15 (Versions), | |||
| * 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 1.3 for key negotiation | control [QUIC-RECOVERY], and the use of TLS for key negotiation | |||
| [QUIC-TLS]. | [QUIC-TLS]. | |||
| QUIC version 1 conforms to the protocol invariants in | This document defines QUIC version 1, which conforms to the protocol | |||
| [QUIC-INVARIANTS]. | invariants in [QUIC-INVARIANTS]. | |||
| 1.2. Conventions and Definitions | 1.2. Terms and Definitions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The keywords "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 BCP | "OPTIONAL" in this document are to be interpreted as described in 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. | |||
| Definitions of terms that are used in this document: | Commonly used terms in the document are described below. | |||
| Client: The endpoint initiating a QUIC connection. | QUIC: The transport protocol described by this document. QUIC is a | |||
| name, not an acronym. | ||||
| Server: The endpoint accepting incoming QUIC connections. | QUIC packet: The smallest unit of QUIC that can be encapsulated in a | |||
| UDP datagram. Multiple QUIC packets can be encapsulated in a | ||||
| single UDP datagram. | ||||
| Endpoint: The client or server end of a connection. | Endpoint: An entity that can participate in a QUIC connection by | |||
| generating, receiving, and processing QUIC packets. There are | ||||
| only two types of endpoint in QUIC: client and server. | ||||
| Stream: A logical unidirectional or bidirectional channel of ordered | Client: The endpoint initiating a QUIC connection. | |||
| bytes within a QUIC connection. | ||||
| Connection: A conversation between two QUIC endpoints with a single | Server: The endpoint accepting incoming QUIC connections. | |||
| encryption context that multiplexes streams within it. | ||||
| Connection ID: An opaque identifier that is used to identify a QUIC | Connection ID: An opaque identifier that is used to identify a QUIC | |||
| connection at an endpoint. Each endpoint sets a value that its | connection at an endpoint. Each endpoint sets a value for its | |||
| peer includes in packets. | peer to include in packets sent towards the endpoint. | |||
| QUIC packet: The smallest unit of data that can be exchanged by QUIC | Stream: A unidirectional or bidirectional channel of ordered bytes | |||
| endpoints. | within a QUIC connection. A QUIC connection can carry multiple | |||
| simultaneous streams. | ||||
| QUIC is a name, not an acronym. | Application: An entity that uses QUIC to send and receive data. | |||
| 1.3. Notational Conventions | 1.3. Notational Conventions | |||
| Packet and frame diagrams use the format described in Section 3.1 of | Packet and frame diagrams in this document use the format described | |||
| [RFC2360], with the following additional conventions: | in Section 3.1 of [RFC2360], with the following additional | |||
| conventions: | ||||
| [x] Indicates that x is optional | [x]: Indicates that x is optional | |||
| x (A) Indicates that x is A bits long | x (A): Indicates that x is A bits long | |||
| x (A/B/C) ... Indicates that x is one of A, B, or C bits long | x (A/B/C) ...: Indicates that x is one of A, B, or C bits long | |||
| x (i) ... Indicates that x uses the variable-length encoding in | x (i) ...: Indicates that x uses the variable-length encoding in | |||
| Section 16 | Section 16 | |||
| x (*) ... Indicates that x is variable-length | x (*) ...: Indicates that x is variable-length | |||
| 2. Streams | 2. Streams | |||
| Streams in QUIC provide a lightweight, ordered byte-stream | Streams in QUIC provide a lightweight, ordered byte-stream | |||
| abstraction. | abstraction to an application. An alternative view of QUIC streams | |||
| is as an elastic "message" abstraction. | ||||
| There are two basic types of stream in QUIC. Unidirectional 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 | ||||
| directions. Different stream identifiers are used to distinguish | ||||
| between unidirectional and bidirectional streams, as well as to | ||||
| create a separation between streams that are initiated by the client | ||||
| and server (see Section 2.1). | ||||
| Either type of stream can be created by either endpoint, can | ||||
| concurrently send data interleaved with other streams, and can be | ||||
| cancelled. | ||||
| 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, cancelling, 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.19) 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. | |||
| Stream offsets allow for the octets on a stream to be placed in | Streams can be created by either endpoint, can concurrently send data | |||
| order. An endpoint MUST be capable of delivering data received on a | interleaved with other streams, and can be cancelled. Any stream can | |||
| stream in order. Implementations MAY choose to offer the ability to | be initiated by either endpoint. QUIC does not provide any means of | |||
| deliver data out of order. There is no means of ensuring ordering | ensuring ordering between bytes on different streams. | |||
| between octets on different streams. | ||||
| Streams are individually flow controlled, allowing an endpoint to | ||||
| limit memory commitment and to apply back pressure. The creation of | ||||
| streams is also flow controlled, with each peer declaring the maximum | ||||
| stream ID it is willing to accept at a given time. | ||||
| An alternative view of QUIC streams is as an elastic "message" | QUIC allows for an arbitrary number of streams to operate | |||
| abstraction, similar to the way ephemeral streams are used in SST | concurrently and for an arbitrary amount of data to be sent on any | |||
| [SST], which may be a more appealing description for some | stream, subject to flow control constraints (see Section 4) and | |||
| applications. | stream limits. | |||
| 2.1. Stream Identifiers | 2.1. Stream Types and Identifiers | |||
| Streams are identified by an unsigned 62-bit integer, referred to as | Streams can be unidirectional or bidirectional. Unidirectional | |||
| the Stream ID. Stream IDs are encoded as a variable-length integer | streams carry data in one direction: from the initiator of the stream | |||
| (see Section 16). The least significant two bits of the Stream ID | to its peer. Bidirectional streams allow for data to be sent in both | |||
| are used to identify the type of stream (unidirectional or | directions. | |||
| bidirectional) and the initiator of the stream. | ||||
| The least significant bit (0x1) of the Stream ID identifies the | Streams are identified within a connection by a numeric value, | |||
| initiator of the stream. Clients initiate even-numbered streams | referred to as the stream ID. Stream IDs are unique to a stream. A | |||
| (those with the least significant bit set to 0); servers initiate | QUIC endpoint MUST NOT reuse a stream ID within a connection. Stream | |||
| odd-numbered streams (with the bit set to 1). Separation of the | IDs are encoded as variable-length integers (see Section 16). | |||
| stream identifiers ensures that client and server are able to open | ||||
| streams without the latency imposed by negotiating for an identifier. | ||||
| If an endpoint receives a frame for a stream that it expects to | The least significant bit (0x1) of the stream ID identifies the | |||
| initiate (i.e., odd-numbered for the client or even-numbered for the | initiator of the stream. Client-initiated streams have even-numbered | |||
| server), but which it has not yet opened, it MUST close the | stream IDs (with the bit set to 0), and server-initiated streams have | |||
| connection with error code STREAM_STATE_ERROR. | odd-numbered stream IDs (with the bit set to 1). | |||
| The second least significant bit (0x2) of the Stream ID | The second least significant bit (0x2) of the stream ID distinguishes | |||
| differentiates between unidirectional streams and bidirectional | between bidirectional streams (with the bit set to 0) and | |||
| streams. Unidirectional streams always have this bit set to 1 and | unidirectional streams (with the bit set to 1). | |||
| bidirectional streams have this bit set to 0. | ||||
| The two type bits from a Stream ID therefore identify streams as | The least significant two bits from a stream ID therefore identify a | |||
| summarized in Table 1. | stream as one of four types, as summarized in Table 1. | |||
| +----------+----------------------------------+ | +------+----------------------------------+ | |||
| | Low Bits | Stream Type | | | Bits | Stream Type | | |||
| +----------+----------------------------------+ | +------+----------------------------------+ | |||
| | 0x0 | Client-Initiated, Bidirectional | | | 0x0 | Client-Initiated, Bidirectional | | |||
| | | | | | | | | |||
| | 0x1 | Server-Initiated, Bidirectional | | | 0x1 | Server-Initiated, Bidirectional | | |||
| | | | | | | | | |||
| | 0x2 | Client-Initiated, Unidirectional | | | 0x2 | Client-Initiated, Unidirectional | | |||
| | | | | | | | | |||
| | 0x3 | Server-Initiated, Unidirectional | | | 0x3 | Server-Initiated, Unidirectional | | |||
| +----------+----------------------------------+ | +------+----------------------------------+ | |||
| Table 1: Stream ID Types | Table 1: Stream ID Types | |||
| The first bidirectional stream opened by the client is stream 0. | Within each type, streams are created with numerically increasing | |||
| stream IDs. A stream ID that is used out of order results in all | ||||
| A QUIC endpoint MUST NOT reuse a Stream ID. Streams of each type are | streams of that type with lower-numbered stream IDs also being | |||
| created in numeric order. Streams that are used out of order result | opened. | |||
| in opening all lower-numbered streams of the same type in the same | ||||
| direction. | ||||
| 2.2. Stream Concurrency | ||||
| QUIC allows for an arbitrary number of streams to operate | The first bidirectional stream opened by the client has a stream ID | |||
| concurrently. An endpoint limits the number of concurrently active | of 0. | |||
| incoming streams by limiting the maximum stream ID (see Section 4.5). | ||||
| The maximum stream ID is specific to each endpoint and applies only | 2.2. Sending and Receiving Data | |||
| to the peer that receives the setting. That is, clients specify the | ||||
| maximum stream ID the server can initiate, and servers specify the | ||||
| maximum stream ID the client can initiate. Each endpoint may respond | ||||
| on streams initiated by the other peer, regardless of whether it is | ||||
| permitted to initiate new streams. | ||||
| Endpoints MUST NOT exceed the limit set by their peer. An endpoint | STREAM frames (Section 19.8) encapsulate data sent by an application. | |||
| that receives a STREAM frame with an ID greater than the limit it has | An endpoint uses the Stream ID and Offset fields in STREAM frames to | |||
| sent MUST treat this as a stream error of type STREAM_ID_ERROR | place data in order. | |||
| (Section 11), unless this is a result of a change in the initial | ||||
| limits (see Section 7.3.1). | ||||
| A receiver cannot renege on an advertisement; that is, once a | Endpoints MUST be able to deliver stream data to an application as an | |||
| receiver advertises a stream ID via a MAX_STREAM_ID frame, | ordered byte-stream. Delivering an ordered byte-stream requires that | |||
| advertising a smaller maximum ID has no effect. A receiver MUST | an endpoint buffer any data that is received out of order, up to the | |||
| ignore any MAX_STREAM_ID frame that does not increase the maximum | advertised flow control limit. | |||
| stream ID. | ||||
| 2.3. Sending and Receiving Data | QUIC makes no specific allowances for delivery of stream data out of | |||
| order. However, implementations MAY choose to offer the ability to | ||||
| deliver data out of order to a receiving application. | ||||
| Endpoints uses streams to send and receive data. Endpoints send | An endpoint could receive data for a stream at the same stream offset | |||
| STREAM frames, which encapsulate data for a stream. STREAM frames | multiple times. Data that has already been received can be | |||
| carry a flag that can be used to signal the end of a stream. | discarded. The data at a given offset MUST NOT change if it is sent | |||
| multiple times; an endpoint MAY treat receipt of different data at | ||||
| the same offset within a stream as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| Streams are an ordered byte-stream abstraction with no other | Streams are an ordered byte-stream abstraction with no other | |||
| structure that is visible to QUIC. STREAM frame boundaries are not | structure that is visible to QUIC. STREAM frame boundaries are not | |||
| expected to preserved when data is transmitted, when data is | expected to be preserved when data is transmitted, when data is | |||
| retransmitted after packet loss, or when data is delivered to the | retransmitted after packet loss, or when data is delivered to the | |||
| application at the receiver. | application at a receiver. | |||
| When new data is to be sent on a stream, a sender MUST set the | ||||
| encapsulating STREAM frame's offset field to the stream offset of the | ||||
| first octet of this new data. The first octet of data on a stream | ||||
| has an offset of 0. An endpoint is expected to send every stream | ||||
| octet. The largest offset delivered on a stream MUST be less than | ||||
| 2^62. | ||||
| QUIC makes no specific allowances for partial reliability or delivery | ||||
| of stream data out of order. Endpoints MUST be able to deliver | ||||
| stream data to an application as an ordered byte-stream. Delivering | ||||
| an ordered byte-stream requires that an endpoint buffer any data that | ||||
| is received out of order, up to the advertised flow control limit. | ||||
| An endpoint could receive the same octets multiple times; octets that | ||||
| have already been received can be discarded. The value for a given | ||||
| octet MUST NOT change if it is sent multiple times; an endpoint MAY | ||||
| treat receipt of a changed octet as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| An endpoint MUST NOT send data on any stream without ensuring that it | An endpoint MUST NOT send data on any stream without ensuring that it | |||
| is within the data limits set by its peer. Flow control is described | is within the flow control limits set by its peer. Flow control is | |||
| in detail in Section 4. | described in detail in Section 4. | |||
| 2.4. Stream Prioritization | 2.3. Stream Prioritization | |||
| Stream multiplexing has a significant effect on application | Stream multiplexing can have a significant effect on application | |||
| performance if resources allocated to streams are correctly | performance if resources allocated to streams are correctly | |||
| prioritized. Experience with other multiplexed protocols, such as | prioritized. | |||
| HTTP/2 [HTTP2], shows that effective prioritization strategies have a | ||||
| significant positive impact on performance. | ||||
| QUIC does not provide frames for exchanging prioritization | QUIC does not provide frames for exchanging prioritization | |||
| information. Instead it relies on receiving priority information | information. Instead it relies on receiving priority information | |||
| from the application that uses QUIC. Protocols that use QUIC are | from the application that uses QUIC. | |||
| able to define any prioritization scheme that suits their application | ||||
| semantics. A protocol might define explicit messages for signaling | ||||
| priority, such as those defined in HTTP/2; it could define rules that | ||||
| allow an endpoint to determine priority based on context; or it could | ||||
| leave the determination to the application. | ||||
| A QUIC implementation SHOULD provide ways in which an application can | A QUIC implementation SHOULD provide ways in which an application can | |||
| indicate the relative priority of streams. When deciding which | indicate the relative priority of streams. When deciding which | |||
| streams to dedicate resources to, QUIC SHOULD use the information | streams to dedicate resources to, the implementation SHOULD use the | |||
| provided by the application. Failure to account for priority of | information provided by the application. | |||
| streams can result in suboptimal performance. | ||||
| Stream priority is most relevant when deciding which stream data will | ||||
| be transmitted. Often, there will be limits on what can be | ||||
| transmitted as a result of connection flow control or the current | ||||
| congestion controller state. | ||||
| Giving preference to the transmission of its own management frames | ||||
| ensures that the protocol functions efficiently. That is, | ||||
| prioritizing frames other than STREAM frames ensures that loss | ||||
| recovery, congestion control, and flow control operate effectively. | ||||
| CRYPTO frames SHOULD be prioritized over other streams prior to the | ||||
| completion of the cryptographic handshake. This includes the | ||||
| retransmission of the second flight of client handshake messages, | ||||
| that is, the TLS Finished and any client authentication messages. | ||||
| STREAM data in frames determined to be lost SHOULD be retransmitted | ||||
| before sending new data, unless application priorities indicate | ||||
| otherwise. Retransmitting lost stream data can fill in gaps, which | ||||
| allows the peer to consume already received data and free up the flow | ||||
| control window. | ||||
| 3. Stream States: Life of a Stream | 3. Stream States | |||
| This section describes the two types of QUIC stream in terms of the | This section describes streams in terms of their send or receive | |||
| states of their send or receive components. Two state machines are | components. Two state machines are described: one for the streams on | |||
| described: one for streams on which an endpoint transmits data | which an endpoint transmits data (Section 3.1), and another for | |||
| (Section 3.1); another for streams from which an endpoint receives | streams on which an endpoint receives data (Section 3.2). | |||
| data (Section 3.2). | ||||
| Unidirectional streams use the applicable state machine directly. | Unidirectional streams use the applicable state machine directly. | |||
| Bidirectional streams use both state machines. For the most part, | Bidirectional streams use both state machines. For the most part, | |||
| the use of these state machines is the same whether the stream is | the use of these state machines is the same whether the stream is | |||
| unidirectional or bidirectional. The conditions for opening a stream | unidirectional or bidirectional. The conditions for opening a stream | |||
| are slightly more complex for a bidirectional stream because the | are slightly more complex for a bidirectional stream because the | |||
| opening of either send or receive sides causes the stream to open in | opening of either send or receive sides causes the stream to open in | |||
| both directions. | both directions. | |||
| An endpoint can open streams up to its maximum stream limit in any | An endpoint MUST open streams of the same type in increasing order of | |||
| order, however endpoints SHOULD open the send side of streams for | stream ID. | |||
| each type in order. | ||||
| Note: These states are largely informative. This document uses | Note: These states are largely informative. This document uses | |||
| stream states to describe rules for when and how different types | stream states to describe rules for when and how different types | |||
| of frames can be sent and the reactions that are expected when | of frames can be sent and the reactions that are expected when | |||
| different types of frames are received. Though these state | different types of frames are received. Though these state | |||
| machines are intended to be useful in implementing QUIC, these | machines are intended to be useful in implementing QUIC, these | |||
| states aren't intended to constrain implementations. An | states aren't intended to constrain implementations. An | |||
| implementation can define a different state machine as long as its | implementation can define a different state machine as long as its | |||
| behavior is consistent with an implementation that implements | behavior is consistent with an implementation that implements | |||
| these states. | these states. | |||
| 3.1. Send Stream States | 3.1. Send Stream States | |||
| Figure 1 shows the states for the part of a stream that sends data to | Figure 1 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) | |||
| | Create Bidirectional Stream (Receiving) | | Peer Creates Bidirectional Stream | |||
| v | v | |||
| +-------+ | +-------+ | |||
| | Ready | Send RST_STREAM | | Ready | Send RESET_STREAM | |||
| | |-----------------------. | | |-----------------------. | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Send STREAM / | | | Send STREAM / | | |||
| | STREAM_BLOCKED | | | STREAM_DATA_BLOCKED | | |||
| | | | | | | |||
| | Create Bidirectional | | | Peer Creates | | |||
| | Stream (Receiving) | | | Bidirectional Stream | | |||
| v | | v | | |||
| +-------+ | | +-------+ | | |||
| | Send | Send RST_STREAM | | | Send | Send RESET_STREAM | | |||
| | |---------------------->| | | |---------------------->| | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Send STREAM + FIN | | | Send STREAM + FIN | | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | Send RST_STREAM | Reset | | | Data | Send RESET_STREAM | Reset | | |||
| | Sent |------------------>| Sent | | | Sent |------------------>| Sent | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | | | | | | |||
| | Recv All ACKs | Recv ACK | | Recv All ACKs | Recv ACK | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | | Reset | | | Data | | Reset | | |||
| | Recvd | | Recvd | | | Recvd | | Recvd | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| Figure 1: States for Send Streams | Figure 1: States for Send Streams | |||
| The sending part of stream that the endpoint initiates (types 0 and 2 | The sending part of stream that the endpoint initiates (types 0 and 2 | |||
| for clients, 1 and 3 for servers) is opened by the application or | for clients, 1 and 3 for servers) is opened by the application. The | |||
| application protocol. The "Ready" state represents a newly created | "Ready" state represents a newly created stream that is able to | |||
| stream that is able to accept data from the application. Stream data | accept data from the application. Stream data might be buffered in | |||
| might be buffered in this state in preparation for sending. | this state in preparation for sending. | |||
| Sending the first STREAM or STREAM_BLOCKED frame causes a send stream | Sending the first STREAM or STREAM_DATA_BLOCKED frame causes a send | |||
| to enter the "Send" state. An implementation might choose to defer | stream to enter the "Send" state. An implementation might choose to | |||
| allocating a Stream ID to a send stream until it sends the first | defer allocating a stream ID to a send stream until it sends the | |||
| frame and enters this state, which can allow for better stream | first frame and enters this state, which can allow for better stream | |||
| prioritization. | 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) enters the "Ready" state then | 0 for a server, type 1 for a client) enters the "Ready" state then | |||
| immediately transitions to the "Send" state if the receiving part | immediately transitions to the "Send" state if the receiving part | |||
| enters the "Recv" state. | enters the "Recv" state (Section 3.2). | |||
| In the "Send" state, an endpoint transmits - and retransmits as | In the "Send" state, an endpoint transmits - and retransmits as | |||
| necessary - data in STREAM frames. The endpoint respects the flow | necessary - stream data in STREAM frames. The endpoint respects the | |||
| control limits of its peer, accepting MAX_STREAM_DATA frames. An | flow control limits set by its peer, and continues to accept and | |||
| endpoint in the "Send" state generates STREAM_BLOCKED frames if it | process MAX_STREAM_DATA frames. An endpoint in the "Send" state | |||
| encounters flow control limits. | generates STREAM_DATA_BLOCKED frames if it is blocked from sending by | |||
| stream or connection flow control limits Section 4.1. | ||||
| After the application indicates that stream data is complete and a | After the application indicates that all stream data has been sent | |||
| STREAM frame containing the FIN bit is sent, the send stream enters | and a STREAM frame containing the FIN bit is sent, the send stream | |||
| the "Data Sent" state. From this state, the endpoint only | enters the "Data Sent" state. From this state, the endpoint only | |||
| retransmits stream data as necessary. The endpoint no longer needs | retransmits stream data as necessary. The endpoint does not need to | |||
| to track flow control limits or send STREAM_BLOCKED frames for a send | check flow control limits or send STREAM_DATA_BLOCKED frames for a | |||
| stream in this state. The endpoint can ignore any MAX_STREAM_DATA | send stream in this state. MAX_STREAM_DATA frames might be received | |||
| frames it receives from its peer in this state; MAX_STREAM_DATA | until the peer receives the final stream offset. The endpoint can | |||
| frames might be received until the peer receives the final stream | safely ignore any MAX_STREAM_DATA frames it receives from its peer | |||
| offset. | for a stream in this state. | |||
| Once all stream data has been successfully acknowledged, the send | Once all stream data has been successfully acknowledged, the send | |||
| stream enters the "Data Recvd" state, which is a terminal state. | stream enters the "Data Recvd" state, which is a terminal state. | |||
| From any of the "Ready", "Send", or "Data Sent" states, an | From any of the "Ready", "Send", or "Data Sent" states, an | |||
| application can signal that it wishes to abandon transmission of | application can signal that it wishes to abandon transmission of | |||
| stream data. Similarly, the 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 RST_STREAM | frame from its peer. In either case, the endpoint sends a | |||
| frame, which causes the stream to enter the "Reset Sent" state. | RESET_STREAM frame, which causes the stream to enter the "Reset Sent" | |||
| state. | ||||
| An endpoint MAY send a RST_STREAM as the first frame on a send | An endpoint MAY send a RESET_STREAM as the first frame on a send | |||
| stream; this causes the send stream to open and then immediately | stream; this causes the send stream to open and then immediately | |||
| transition to the "Reset Sent" state. | transition to the "Reset Sent" state. | |||
| Once a packet containing a RST_STREAM has been acknowledged, the send | Once a packet containing a RESET_STREAM has been acknowledged, the | |||
| stream enters the "Reset Recvd" state, which is a terminal state. | send stream enters the "Reset Recvd" state, which is a terminal | |||
| state. | ||||
| 3.2. Receive Stream States | 3.2. Receive Stream States | |||
| Figure 2 shows the states for the part of a stream that receives data | Figure 2 shows the states for the part of a stream that receives data | |||
| from a peer. The states for a receive stream mirror only some of the | from a peer. The states for a receive stream mirror only some of the | |||
| states of the send stream at the peer. A receive stream doesn't | states of the send stream at the peer. A receive stream does not | |||
| track states on the send stream that cannot be observed, such as the | track states on the send stream that cannot be observed, such as the | |||
| "Ready" state; instead, receive streams track the delivery of data to | "Ready" state. Instead, receive streams track the delivery of data | |||
| the application or application protocol some of which cannot be | to the application, some of which cannot be observed by the sender. | |||
| observed by the sender. | ||||
| o | o | |||
| | Recv STREAM / STREAM_BLOCKED / RST_STREAM | | Recv STREAM / STREAM_DATA_BLOCKED / RESET_STREAM | |||
| | Create Bidirectional Stream (Sending) | | Create Bidirectional Stream (Sending) | |||
| | Recv MAX_STREAM_DATA | | Recv MAX_STREAM_DATA / STOP_SENDING (Bidirectional) | |||
| | Create Higher-Numbered Stream | | Create Higher-Numbered Stream | |||
| v | v | |||
| +-------+ | +-------+ | |||
| | Recv | Recv RST_STREAM | | Recv | Recv RESET_STREAM | |||
| | |-----------------------. | | |-----------------------. | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Recv STREAM + FIN | | | Recv STREAM + FIN | | |||
| v | | v | | |||
| +-------+ | | +-------+ | | |||
| | Size | Recv RST_STREAM | | | Size | Recv RESET_STREAM | | |||
| | Known |---------------------->| | | Known |---------------------->| | |||
| +-------+ | | +-------+ | | |||
| | | | | | | |||
| | Recv All Data | | | Recv All Data | | |||
| v v | v v | |||
| +-------+ Recv RST_STREAM +-------+ | +-------+ Recv RESET_STREAM +-------+ | |||
| | Data |--- (optional) --->| Reset | | | Data |--- (optional) --->| Reset | | |||
| | Recvd | Recv All Data | Recvd | | | Recvd | Recv All Data | Recvd | | |||
| +-------+<-- (optional) ----+-------+ | +-------+<-- (optional) ----+-------+ | |||
| | | | | | | |||
| | App Read All Data | App Read RST | | App Read All Data | App Read RST | |||
| v v | v v | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| | Data | | Reset | | | Data | | Reset | | |||
| | Read | | Read | | | Read | | Read | | |||
| +-------+ +-------+ | +-------+ +-------+ | |||
| Figure 2: States for Receive Streams | Figure 2: States for Receive Streams | |||
| The receiving part of a stream initiated by a peer (types 1 and 3 for | The receiving part of a stream initiated by a peer (types 1 and 3 for | |||
| a client, or 0 and 2 for a server) are created when the first STREAM, | a client, or 0 and 2 for a server) is created when the first STREAM, | |||
| STREAM_BLOCKED, RST_STREAM, or MAX_STREAM_DATA (bidirectional only, | STREAM_DATA_BLOCKED, or RESET_STREAM is received for that stream. | |||
| see below) is received for that stream. The initial state for a | For bidirectional streams initiated by a peer, receipt of a | |||
| receive stream is "Recv". Receiving a RST_STREAM frame causes the | MAX_STREAM_DATA or STOP_SENDING frame for the sending part of the | |||
| receive stream to immediately transition to the "Reset Recvd". | stream also creates the receiving part. The initial state for a | |||
| receive stream is "Recv". | ||||
| The receive stream enters the "Recv" state when the sending part of a | The receive stream enters the "Recv" state when the sending part of a | |||
| bidirectional stream initiated by the endpoint (type 0 for a client, | bidirectional stream initiated by the endpoint (type 0 for a client, | |||
| type 1 for a server) enters the "Ready" state. | type 1 for a server) enters the "Ready" state. | |||
| A bidirectional stream also opens when a MAX_STREAM_DATA frame is | An endpoint opens a bidirectional stream when a MAX_STREAM_DATA or | |||
| received. Receiving a MAX_STREAM_DATA frame implies that the remote | STOP_SENDING frame is received from the peer for that stream. | |||
| peer has opened the stream and is providing flow control credit. A | ||||
| MAX_STREAM_DATA frame might arrive before a STREAM or STREAM_BLOCKED | ||||
| frame if packets are lost or reordered. | ||||
| Before creating a stream, all lower-numbered streams of the same type | Receiving a MAX_STREAM_DATA frame for an unopened stream indicates | |||
| MUST be created. That means that receipt of a frame that would open | that the remote peer has opened the stream and is providing flow | |||
| a stream causes all lower-numbered streams of the same type to be | control credit. Receiving a STOP_SENDING frame for an unopened | |||
| opened in numeric order. This ensures that the creation order for | stream indicates that the remote peer no longer wishes to receive | |||
| streams is consistent on both endpoints. | data on this stream. Either frame might arrive before a STREAM or | |||
| STREAM_DATA_BLOCKED frame if packets are lost or reordered. | ||||
| In the "Recv" state, the endpoint receives STREAM and STREAM_BLOCKED | Before creating a stream, all streams of the same type with lower- | |||
| frames. Incoming data is buffered and can be reassembled into the | numbered stream IDs MUST be created. This ensures that the creation | |||
| correct order for delivery to the application. As data is consumed | order for streams is consistent on both endpoints. | |||
| by the application and buffer space becomes available, the endpoint | ||||
| sends MAX_STREAM_DATA frames to allow the peer to send more data. | ||||
| When a STREAM frame with a FIN bit is received, the final offset (see | In the "Recv" state, the endpoint receives STREAM and | |||
| Section 4.3) is known. The receive stream enters the "Size Known" | STREAM_DATA_BLOCKED frames. Incoming data is buffered and can be | |||
| reassembled into the correct order for delivery to the application. | ||||
| As data is consumed by the application and buffer space becomes | ||||
| available, the endpoint sends MAX_STREAM_DATA frames to allow the | ||||
| peer to send more data. | ||||
| When a STREAM frame with a FIN bit is received, the final offset is | ||||
| known (see Section 4.4). The receive stream enters the "Size Known" | ||||
| state. In this state, the endpoint no longer needs to send | state. In this state, the endpoint no longer needs to send | |||
| MAX_STREAM_DATA frames, it only receives any retransmissions of | MAX_STREAM_DATA frames, it only receives any retransmissions of | |||
| stream data. | stream data. | |||
| Once all data for the stream has been received, the receive stream | Once all data for the stream has been received, the receive stream | |||
| enters the "Data Recvd" state. This might happen as a result of | enters the "Data Recvd" state. This might happen as a result of | |||
| receiving the same STREAM frame that causes the transition to "Size | receiving the same STREAM frame that causes the transition to "Size | |||
| Known". In this state, the endpoint has all stream data. Any STREAM | Known". In this state, the endpoint has all stream data. Any STREAM | |||
| or STREAM_BLOCKED frames it receives for the stream can be discarded. | or STREAM_DATA_BLOCKED frames it receives 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 or application protocol. Once stream data has | to the application. Once stream data has been delivered, the stream | |||
| been delivered, the stream enters the "Data Read" state, which is a | enters the "Data Read" state, which is a terminal state. | |||
| terminal state. | ||||
| Receiving a RST_STREAM frame in the "Recv" or "Size Known" states | Receiving a RESET_STREAM frame in the "Recv" or "Size Known" states | |||
| 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 is received when a RST_STREAM is | It is possible that all stream data is received when a RESET_STREAM | |||
| received (that is, from the "Data Recvd" state). Similarly, it is | is received (that is, from the "Data Recvd" state). Similarly, it is | |||
| possible for remaining stream data to arrive after receiving a | possible for remaining stream data to arrive after receiving a | |||
| RST_STREAM frame (the "Reset Recvd" state). An implementation is | RESET_STREAM frame (the "Reset Recvd" state). An implementation is | |||
| able to manage this situation as they choose. Sending RST_STREAM | free to manage this situation as it chooses. Sending RESET_STREAM | |||
| means that an endpoint cannot guarantee delivery of stream data; | means that an endpoint cannot guarantee delivery of stream data; | |||
| however there is no requirement that stream data not be delivered if | however there is no requirement that stream data not be delivered if | |||
| a RST_STREAM is received. An implementation MAY interrupt delivery | a RESET_STREAM is received. An implementation MAY interrupt delivery | |||
| of stream data, discard any data that was not consumed, and signal | of stream data, discard any data that was not consumed, and signal | |||
| the existence of the RST_STREAM immediately. Alternatively, the | the receipt of the RESET_STREAM immediately. Alternatively, the | |||
| RST_STREAM signal might be suppressed or withheld if stream data is | RESET_STREAM signal might be suppressed or withheld if stream data is | |||
| completely received. In the latter case, the receive stream | completely received and is buffered to be read by the application. | |||
| effectively transitions to "Data Recvd" from "Reset Recvd". | In the latter case, the receive stream transitions from "Reset Recvd" | |||
| to "Data Recvd". | ||||
| Once the application has been delivered the signal indicating that | Once the application has been delivered the signal indicating that | |||
| the receive stream was reset, the receive stream transitions to the | the receive stream was reset, the receive stream transitions to the | |||
| "Reset Read" state, which is a terminal state. | "Reset Read" state, which is a terminal state. | |||
| 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 sender or receiver: STREAM | |||
| (Section 19.19), STREAM_BLOCKED (Section 19.10), and RST_STREAM | (Section 19.8), STREAM_DATA_BLOCKED (Section 19.13), and RESET_STREAM | |||
| (Section 19.2). | (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 STREAM or | ("Data Recvd" or "Reset Recvd"). A sender MUST NOT send STREAM or | |||
| STREAM_BLOCKED after sending a RST_STREAM; that is, in the "Reset | STREAM_DATA_BLOCKED after sending a RESET_STREAM; that is, in the | |||
| Sent" state in addition to the terminal states. A receiver could | terminal states and in the "Reset Sent" state. A receiver could | |||
| receive any of these frames in any state, but only due to the | receive any of these three frames in any state, due to the | |||
| possibility of delayed delivery of packets carrying them. | possibility of delayed delivery of packets carrying them. | |||
| The receiver of a stream sends MAX_STREAM_DATA (Section 19.6) and | The receiver of a stream sends MAX_STREAM_DATA (Section 19.10) and | |||
| STOP_SENDING frames (Section 19.14). | 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 in the "Recv" state. A | |||
| receiver can send STOP_SENDING in any state where it has not received | receiver can send STOP_SENDING in any state where it has not received | |||
| a RST_STREAM frame; that is states other than "Reset Recvd" or "Reset | a RESET_STREAM frame; that is states other than "Reset Recvd" or | |||
| Read". However there is little value in sending a STOP_SENDING frame | "Reset Read". However there is little value in sending a | |||
| after all stream data has been received in the "Data Recvd" state. A | STOP_SENDING frame in the "Data Recvd" state, since all stream data | |||
| sender could receive these frames in any state as a result of delayed | has been received. A sender could receive either of these two frames | |||
| delivery of packets. | 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 a send stream and a receive | A bidirectional stream is composed of a send stream and a receive | |||
| stream. Implementations may represent states of the bidirectional | stream. Implementations may represent states of the bidirectional | |||
| stream as composites of send and receive stream states. The simplest | stream as composites of send and receive stream states. The simplest | |||
| model presents the stream as "open" when either send or receive | model presents the stream as "open" when either send or receive | |||
| stream is in a non-terminal state and "closed" when both send and | stream is in a non-terminal state and "closed" when both send and | |||
| receive streams are in a terminal state. | receive streams are in a terminal state. | |||
| skipping to change at page 19, line 50 ¶ | skipping to change at page 18, line 4 ¶ | |||
| Note (*1): A stream is considered "idle" if it has not yet been | Note (*1): A stream is considered "idle" if it has not yet been | |||
| created, or if the receive stream is in the "Recv" state without | created, or if the receive stream is in the "Recv" state without | |||
| yet having received any frames. | yet having received any frames. | |||
| 3.5. Solicited State Transitions | 3.5. Solicited State Transitions | |||
| If an endpoint is no longer interested in the data it is receiving on | If an endpoint is no longer interested in the data it is receiving on | |||
| a stream, it MAY send a STOP_SENDING frame identifying that stream to | a stream, it MAY send a STOP_SENDING frame identifying that stream to | |||
| prompt closure of the stream in the opposite direction. This | prompt closure of the stream in the opposite direction. This | |||
| typically indicates that the receiving application is no longer | typically indicates that the receiving application is no longer | |||
| reading data it receives from the stream, but is not a guarantee that | reading data it receives from the stream, but it is not a guarantee | |||
| incoming data will be ignored. | that incoming data will be ignored. | |||
| STREAM frames received after sending STOP_SENDING are still counted | STREAM frames received after sending STOP_SENDING are still counted | |||
| toward the connection and stream flow-control windows, even though | toward connection and stream flow control, even though these frames | |||
| these frames will be discarded upon receipt. This avoids potential | will be discarded upon receipt. | |||
| ambiguity about which STREAM frames count toward flow control. | ||||
| A STOP_SENDING frame requests that the receiving endpoint send a | A STOP_SENDING frame requests that the receiving endpoint send a | |||
| RST_STREAM frame. An endpoint that receives a STOP_SENDING frame | RESET_STREAM frame. An endpoint that receives a STOP_SENDING frame | |||
| MUST send a RST_STREAM frame for that stream, and can use an error | MUST send a RESET_STREAM frame for that stream. An endpoint SHOULD | |||
| code of STOPPING. If the STOP_SENDING frame is received on a send | copy the error code from the STOP_SENDING frame, but MAY use any | |||
| stream that is already in the "Data Sent" state, a RST_STREAM frame | application error code. The endpoint that sends a STOP_SENDING frame | |||
| MAY still be sent in order to cancel retransmission of previously- | can ignore the error code carried in any RESET_STREAM frame it | |||
| sent STREAM frames. | receives. | |||
| If the STOP_SENDING frame is received on a send stream that is | ||||
| already in the "Data Sent" state, an endpoint that wishes to cease | ||||
| retransmission of previously-sent STREAM frames on that stream MUST | ||||
| first send a RESET_STREAM frame. | ||||
| STOP_SENDING SHOULD only be sent for a receive stream that has not | STOP_SENDING SHOULD only be sent for a receive stream that has not | |||
| been reset. STOP_SENDING is most useful for streams in the "Recv" or | been reset. STOP_SENDING is most useful for streams in the "Recv" or | |||
| "Size Known" states. | "Size Known" states. | |||
| An endpoint is expected to send another STOP_SENDING frame if a | An endpoint is expected to send another STOP_SENDING frame if a | |||
| packet containing a previous STOP_SENDING is lost. However, once | packet containing a previous STOP_SENDING is lost. However, once | |||
| either all stream data or a RST_STREAM frame has been received for | either all stream data or a 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" or | |||
| "Size Known" - sending a STOP_SENDING frame is unnecessary. | "Size Known" - sending a STOP_SENDING frame is unnecessary. | |||
| An endpoint that wishes to terminate both directions of a | ||||
| bidirectional stream can terminate one direction by sending a | ||||
| RESET_STREAM, and it can encourage prompt termination in the opposite | ||||
| direction by sending a STOP_SENDING frame. | ||||
| 4. Flow Control | 4. Flow Control | |||
| It is necessary to limit the amount of data that a sender may have | It is necessary to limit the amount of data that a receiver could | |||
| outstanding at any time, so as to prevent a fast sender from | buffer, to prevent a fast sender from overwhelming a slow receiver, | |||
| overwhelming a slow receiver, or to prevent a malicious sender from | or to prevent a malicious sender from consuming a large amount of | |||
| consuming significant resources at a receiver. To this end, QUIC | memory at a receiver. To enable a receiver to limit memory | |||
| employs a credit-based flow-control scheme similar to that in HTTP/2 | commitment to a connection and to apply back pressure on the sender, | |||
| [HTTP2]. A receiver advertises the number of octets it is prepared | streams are flow controlled both individually and as an aggregate. A | |||
| to receive on a given stream and for the entire connection. This | QUIC receiver controls the maximum amount of data the sender can send | |||
| leads to two levels of flow control in QUIC: | on a stream at any time, as described in Section 4.1 and Section 4.2 | |||
| Similarly, to limit concurrency within a connection, a QUIC endpoint | ||||
| controls the maximum cumulative number of streams that its peer can | ||||
| initiate, as described in Section 4.5. | ||||
| Data sent in CRYPTO frames is not flow controlled in the same way as | ||||
| stream data. QUIC relies on the cryptographic protocol | ||||
| implementation to avoid excessive buffering of data, see [QUIC-TLS]. | ||||
| The implementation SHOULD provide an interface to QUIC to tell it | ||||
| about its buffering limits so that there is not excessive buffering | ||||
| at multiple layers. | ||||
| 4.1. Data Flow Control | ||||
| QUIC employs a credit-based flow-control scheme similar to that in | ||||
| HTTP/2 [HTTP2], where a receiver advertises the number of bytes it is | ||||
| prepared to receive on a given stream and for the entire connection. | ||||
| This leads to two levels 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. | the entire receive buffer for a connection by limiting the amount | |||
| of data that can be sent on any 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, and | receiver's buffer capacity for the connection, by limiting the | |||
| total bytes of stream data sent in STREAM frames on all streams. | ||||
| A data receiver sets initial credits for all streams by sending | ||||
| transport parameters during the handshake (Section 7.3). | ||||
| A data receiver sends MAX_STREAM_DATA or MAX_DATA frames to the | A receiver sets initial credits for all streams by sending transport | |||
| sender to advertise additional credit. MAX_STREAM_DATA frames send | parameters during the handshake (Section 7.3). A receiver sends | |||
| the maximum absolute byte offset of a stream, while MAX_DATA frames | MAX_STREAM_DATA (Section 19.10) or MAX_DATA (Section 19.9) frames to | |||
| send the maximum of the sum of the absolute byte offsets of all | the sender to advertise additional credit. | |||
| streams. | ||||
| A receiver advertises credit for a stream by sending a | A receiver advertises credit for a stream by sending a | |||
| MAX_STREAM_DATA frame with the Stream ID set appropriately. A | MAX_STREAM_DATA frame with the Stream ID field set appropriately. A | |||
| receiver could use the current offset of data consumed to determine | MAX_STREAM_DATA frame indicates the maximum absolute byte offset of a | |||
| the flow control offset to be advertised. A receiver MAY send | stream. A receiver could use the current offset of data consumed to | |||
| MAX_STREAM_DATA frames in multiple packets in order to make sure that | determine the flow control offset to be advertised. A receiver MAY | |||
| the sender receives an update before running out of flow control | send MAX_STREAM_DATA frames in multiple packets in order to make sure | |||
| that the sender receives an update before running out of flow control | ||||
| credit, even if one of the packets is lost. | credit, even if one of the packets is lost. | |||
| Connection flow control is a limit to the total bytes of stream data | A receiver advertises credit for a connection by sending a MAX_DATA | |||
| sent in STREAM frames on all streams. A receiver advertises credit | frame, which indicates the maximum of the sum of the absolute byte | |||
| for a connection by sending a MAX_DATA frame. A receiver maintains a | offsets of all streams. A receiver maintains a cumulative sum of | |||
| cumulative sum of bytes received on all contributing streams, which | bytes received on all streams, which is used to check for flow | |||
| are used to check for flow control violations. A receiver might use | control violations. A receiver might use a sum of bytes consumed on | |||
| a sum of bytes consumed on all streams to determine the maximum data | all streams to determine the maximum data limit to be advertised. | |||
| limit to be advertised. | ||||
| A receiver MAY advertise a larger offset at any point by sending | A receiver can advertise a larger offset by sending MAX_STREAM_DATA | |||
| MAX_STREAM_DATA or MAX_DATA frames. A receiver cannot renege on an | or MAX_DATA frames at any time during the connection. A receiver | |||
| advertisement; that is, once a receiver advertises an offset, | cannot renege on an advertisement however. That is, once a receiver | |||
| advertising a smaller offset has no effect. A sender MUST therefore | advertises an offset, it MAY advertise a smaller offset, but this has | |||
| ignore any MAX_STREAM_DATA or MAX_DATA frames that do not increase | no effect. | |||
| flow control limits. | ||||
| A receiver MUST close the connection with a FLOW_CONTROL_ERROR error | A receiver MUST close the connection with a FLOW_CONTROL_ERROR error | |||
| (Section 11) if the peer violates the advertised connection or stream | (Section 11) if the sender violates the advertised connection or | |||
| data limits. | stream data limits. | |||
| A sender SHOULD send STREAM_BLOCKED or BLOCKED frames to indicate it | ||||
| has data to write but is blocked by flow control limits. These | ||||
| frames are expected to be sent infrequently in common cases, but they | ||||
| are considered useful for debugging and monitoring purposes. | ||||
| A similar method is used to control the number of open streams (see | ||||
| Section 4.5 for details). | ||||
| 4.1. Handling of Stream Cancellation | ||||
| There are some edge cases which must be considered when dealing with | ||||
| stream and connection level flow control. Given enough time, both | ||||
| endpoints must agree on flow control state. If one end believes it | ||||
| can send more than the other end is willing to receive, the | ||||
| connection will be torn down when too much data arrives. Conversely | ||||
| if a sender believes it is blocked, while endpoint B expects more | ||||
| data can be received, then the connection can be in a deadlock, with | ||||
| the sender waiting for a MAX_STREAM_DATA or MAX_DATA frame which will | ||||
| never come. | ||||
| On receipt of a RST_STREAM frame, an endpoint will tear down state | ||||
| for the matching stream and ignore further data arriving on that | ||||
| stream. This could result in the endpoints getting out of sync, | ||||
| since the RST_STREAM frame may have arrived out of order and there | ||||
| may be further bytes in flight. The data sender would have counted | ||||
| the data against its connection level flow control budget, but a | ||||
| receiver that has not received these bytes would not know to include | ||||
| them as well. The receiver must learn the number of bytes that were | ||||
| sent on the stream to make the same adjustment in its connection flow | ||||
| controller. | ||||
| To ensure that endpoints maintain a consistent connection-level flow | A sender MUST ignore any MAX_STREAM_DATA or MAX_DATA frames that do | |||
| control state, the RST_STREAM frame (Section 19.2) includes the | not increase flow control limits. | |||
| largest offset of data sent on the stream. On receiving a RST_STREAM | ||||
| frame, a receiver definitively knows how many bytes were sent on that | ||||
| stream before the RST_STREAM frame, and the receiver MUST use the | ||||
| final offset to account for all bytes sent on the stream in its | ||||
| connection level flow controller. | ||||
| RST_STREAM terminates one direction of a stream abruptly. Whether | If a sender runs out of flow control credit, it will be unable to | |||
| any action or response can or should be taken on the data already | send new data and is considered blocked. A sender SHOULD send | |||
| received is application specific. | STREAM_DATA_BLOCKED or DATA_BLOCKED frames to indicate it has data to | |||
| write but is blocked by flow control limits. These frames are | ||||
| expected to be sent infrequently in common cases, but they are | ||||
| considered useful for debugging and monitoring purposes. | ||||
| For a bidirectional stream, RST_STREAM has no effect on data flow in | A sender sends a single STREAM_DATA_BLOCKED or DATA_BLOCKED frame | |||
| the opposite direction. The RST_STREAM sender can send a | only once when it reaches a data limit. A sender SHOULD NOT send | |||
| STOP_SENDING frame to encourage prompt termination. Both endpoints | multiple STREAM_DATA_BLOCKED or DATA_BLOCKED frames for the same data | |||
| MUST maintain state for the stream in the unterminated direction | limit, unless the original frame is determined to be lost. Another | |||
| until that direction enters a terminal state, or either side sends | STREAM_DATA_BLOCKED or DATA_BLOCKED frame can be sent after the data | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE. | limit is increased. | |||
| 4.2. Data Limit Increments | 4.2. Flow Credit Increments | |||
| This document leaves when and how many bytes to advertise in a | This document leaves when and how many bytes to advertise in a | |||
| MAX_DATA or MAX_STREAM_DATA to implementations, but offers a few | MAX_STREAM_DATA or MAX_DATA frame to implementations, but offers a | |||
| considerations. These frames contribute to connection overhead. | few considerations. These frames contribute to connection overhead. | |||
| Therefore frequently sending frames with small changes is | Therefore frequently sending frames with small changes is | |||
| undesirable. At the same time, larger increments to limits are | undesirable. At the same time, larger increments to limits are | |||
| necessary to avoid blocking if updates are less frequent, requiring | necessary to avoid blocking if updates are less frequent, requiring | |||
| larger resource commitments at the receiver. Thus there is a trade- | larger resource commitments at the receiver. Thus there is a trade- | |||
| off between resource commitment and overhead when determining how | off between resource commitment and overhead when determining how | |||
| large a limit is advertised. | large a limit is advertised. | |||
| A receiver MAY use an autotuning mechanism to tune the frequency and | A receiver MAY use an autotuning mechanism to tune the frequency and | |||
| amount that it increases data limits based on a round-trip time | amount of advertised additional credit based on a round-trip time | |||
| estimate and the rate at which the receiving application consumes | estimate and the rate at which the receiving application consumes | |||
| data, similar to common TCP implementations. | data, similar to common TCP implementations. | |||
| If a sender runs out of flow control credit, it will be unable to | If a sender runs out of flow control credit, it will be unable to | |||
| send new data. That is, the sender is blocked. A blocked sender | send new data and is considered blocked. It is generally considered | |||
| SHOULD send a STREAM_BLOCKED or BLOCKED frame. A receiver uses these | best to not let the sender become blocked. To avoid blocking a | |||
| frames for debugging purposes. A receiver MUST NOT wait for a | sender, and to reasonably account for the possibility of loss, a | |||
| STREAM_BLOCKED or BLOCKED frame before sending MAX_STREAM_DATA or | receiver should send a MAX_DATA or MAX_STREAM_DATA frame at least two | |||
| MAX_DATA, since doing so will mean that a sender will be blocked for | round trips before it expects the sender to get blocked. | |||
| an entire round trip and the peer may never send a STREAM_BLOCKED or | ||||
| BLOCKED frame. | ||||
| It is generally considered best to not let the sender go into | A receiver MUST NOT wait for a STREAM_DATA_BLOCKED or DATA_BLOCKED | |||
| quiescence if avoidable. To avoid blocking a sender, and to | frame before sending MAX_STREAM_DATA or MAX_DATA, since doing so will | |||
| reasonably account for the possibility of loss, a receiver should | mean that a sender will be blocked for at least an entire round trip, | |||
| send a MAX_DATA or MAX_STREAM_DATA frame at least two round trips | and potentially for longer if the peer chooses to not send | |||
| before it expects the sender to get blocked. | STREAM_DATA_BLOCKED or DATA_BLOCKED frames. | |||
| A sender sends a single BLOCKED or STREAM_BLOCKED frame only once | 4.3. Handling Stream Cancellation | |||
| when it reaches a data limit. A sender SHOULD NOT send multiple | ||||
| BLOCKED or STREAM_BLOCKED frames for the same data limit, unless the | ||||
| original frame is determined to be lost. Another BLOCKED or | ||||
| STREAM_BLOCKED frame can be sent after the data limit is increased. | ||||
| 4.3. Stream Final Offset | Endpoints need to eventually agree on the amount of flow control | |||
| credit that has been consumed, to avoid either exceeding flow control | ||||
| limits or deadlocking. | ||||
| The final offset is the count of the number of octets that are | On receipt of a RESET_STREAM frame, an endpoint will tear down state | |||
| for the matching stream and ignore further data arriving on that | ||||
| stream. If a RESET_STREAM frame is reordered with stream data for | ||||
| the same stream, the receiver's estimate of the number of bytes | ||||
| received on that stream can be lower than the sender's estimate of | ||||
| the number sent. As a result, the two endpoints could disagree on | ||||
| the number of bytes that count towards connection flow control. | ||||
| To remedy this issue, a RESET_STREAM frame (Section 19.4) includes | ||||
| the final offset of data sent on the stream. On receiving a | ||||
| RESET_STREAM frame, a receiver definitively knows how many bytes were | ||||
| sent on that stream before the RESET_STREAM frame, and the receiver | ||||
| MUST use the final offset to account for all bytes sent on the stream | ||||
| in its connection level flow controller. | ||||
| RESET_STREAM terminates one direction of a stream abruptly. For a | ||||
| bidirectional stream, RESET_STREAM has no effect on data flow in the | ||||
| opposite direction. Both endpoints MUST maintain flow control state | ||||
| for the stream in the unterminated direction until that direction | ||||
| enters a terminal state, or until one of the endpoints sends | ||||
| CONNECTION_CLOSE. | ||||
| 4.4. Stream Final Offset | ||||
| The final offset is the count of the number of bytes that are | ||||
| transmitted on a stream. For a stream that is reset, the final | transmitted on a stream. For a stream that is reset, the final | |||
| offset is carried explicitly in a RST_STREAM frame. Otherwise, the | offset is carried explicitly in a RESET_STREAM frame. Otherwise, the | |||
| final offset is the offset of the end of the data carried in a STREAM | final offset is the offset of the end of the data carried in a STREAM | |||
| frame marked with a FIN flag, or 0 in the case of incoming | frame marked with a FIN flag, or 0 in the case of incoming | |||
| unidirectional streams. | unidirectional streams. | |||
| An endpoint will know the final offset for a stream when the receive | An endpoint will know the final offset for a stream when the receive | |||
| stream enters the "Size Known" or "Reset Recvd" state. | stream enters the "Size Known" or "Reset Recvd" state (Section 3). | |||
| An endpoint MUST NOT send data on a stream at or beyond the final | An endpoint MUST NOT send data on a stream at or beyond the final | |||
| offset. | offset. | |||
| Once a final offset for a stream is known, it cannot change. If a | Once a final offset for a stream is known, it cannot change. If a | |||
| RST_STREAM or STREAM frame causes the final offset to change for a | RESET_STREAM or STREAM frame is received indicating a change in the | |||
| stream, an endpoint SHOULD respond with a FINAL_OFFSET_ERROR error | final offset for the stream, an endpoint SHOULD respond with a | |||
| (see Section 11). A receiver SHOULD treat receipt of data at or | FINAL_OFFSET_ERROR error (see Section 11). A receiver SHOULD treat | |||
| beyond the final offset as a FINAL_OFFSET_ERROR error, even after a | receipt of data at or beyond the final offset as a FINAL_OFFSET_ERROR | |||
| stream is closed. Generating these errors is not mandatory, but only | error, even after a stream is closed. Generating these errors is not | |||
| because requiring that an endpoint generate these errors also means | mandatory, but only because requiring that an endpoint generate these | |||
| that the endpoint needs to maintain the final offset state for closed | errors also means that the endpoint needs to maintain the final | |||
| streams, which could mean a significant state commitment. | offset state for closed streams, which could mean a significant state | |||
| commitment. | ||||
| 4.4. Flow Control for Cryptographic Handshake | 4.5. Controlling Concurrency | |||
| Data sent in CRYPTO frames is not flow controlled in the same way as | An endpoint limits the cumulative number of incoming streams a peer | |||
| STREAM frames. QUIC relies on the cryptographic protocol | can open. Only streams with a stream ID less than (max_stream * 4 + | |||
| implementation to avoid excessive buffering of data, see [QUIC-TLS]. | initial_stream_id_for_type) can be opened (see Table 5). Initial | |||
| The implementation SHOULD provide an interface to QUIC to tell it | limits are set in the transport parameters (see Section 18.1) and | |||
| about its buffering limits so that there is not excessive buffering | subsequently limits are advertised using MAX_STREAMS frames | |||
| at multiple layers. | (Section 19.11). Separate limits apply to unidirectional and | |||
| bidirectional streams. | ||||
| 4.5. Stream Limit Increment | Endpoints MUST NOT exceed the limit set by their peer. An endpoint | |||
| that receives a STREAM frame with a stream ID exceeding the limit it | ||||
| has sent MUST treat this as a stream error of type STREAM_LIMIT_ERROR | ||||
| (Section 11). | ||||
| An endpoint limits the number of concurrently active incoming streams | A receiver cannot renege on an advertisement. That is, once a | |||
| by limiting the maximum stream ID. An initial value is set in the | receiver advertises a stream limit using the MAX_STREAMS frame, | |||
| transport parameters (see Section 18.1) and is subsequently increased | advertising a smaller limit has no effect. A receiver MUST ignore | |||
| by MAX_STREAM_ID frames (see Section 19.7). | any MAX_STREAMS frame that does not increase the stream limit. | |||
| As with stream and connection flow control, this document leaves when | As with stream and connection flow control, this document leaves when | |||
| and how many streams to make available to a peer via MAX_STREAM_ID to | and how many streams to advertise to a peer via MAX_STREAMS to | |||
| implementations, but offers a few considerations. MAX_STREAM_ID | implementations. Implementations might choose to increase limits as | |||
| frames constitute minimal overhead, while withholding MAX_STREAM_ID | streams close to keep the number of streams available to peers | |||
| frames can prevent the peer from using the available parallelism. | roughly consistent. | |||
| The STREAM_ID_BLOCKED frame (Section 19.11) can be used to signal a | An endpoint that is unable to open a new stream due to the peer's | |||
| shortage of available streams. Implementations will likely want to | limits SHOULD send a STREAMS_BLOCKED frame (Section 19.14). This | |||
| increase the maximum stream ID as peer-initiated streams close. | signal is considered useful for debugging. An endpoint MUST NOT wait | |||
| to receive this signal before advertising additional credit, since | ||||
| doing so will mean that the peer will be blocked for at least an | ||||
| entire round trip, and potentially for longer if the peer chooses to | ||||
| not send STREAMS_BLOCKED frames. | ||||
| 5. Connections | 5. Connections | |||
| A QUIC connection is a single conversation between two QUIC | QUIC's connection establishment combines version negotiation with the | |||
| endpoints. QUIC's connection establishment combines version | cryptographic and transport handshakes to reduce connection | |||
| negotiation with the cryptographic and transport handshakes to reduce | establishment latency, as described in Section 7. Once established, | |||
| connection establishment latency, as described in Section 7. Once | a connection may migrate to a different IP or port at either endpoint | |||
| established, a connection may migrate to a different IP or port at | as described in Section 9. Finally, a connection may be terminated | |||
| either endpoint as described in Section 9. Finally, a connection may | by either endpoint, as described in Section 10. | |||
| be terminated by either endpoint, as described in Section 10. | ||||
| 5.1. Connection ID | 5.1. Connection ID | |||
| Each connection possesses a set of connection identifiers, or | Each connection possesses a set of connection identifiers, or | |||
| connection IDs, each of which can be identify the connection. | connection IDs, each of which can identify the connection. | |||
| Connection IDs are independently selected by endpoints; each endpoint | Connection IDs are independently selected by endpoints; each endpoint | |||
| selects the connection IDs that its peer uses. | selects the connection IDs that its peer uses. | |||
| The primary function of a connection ID is to ensure that changes in | The primary function of a connection ID is to ensure that changes in | |||
| addressing at lower protocol layers (UDP, IP, and below) don't cause | addressing at lower protocol layers (UDP, IP) don't cause packets for | |||
| packets for a QUIC connection to be delivered to the wrong endpoint. | a QUIC connection to be delivered to the wrong endpoint. Each | |||
| Each endpoint selects connection IDs using an implementation-specific | endpoint selects connection IDs using an implementation-specific (and | |||
| (and perhaps deployment-specific) method which will allow packets | perhaps deployment-specific) method which will allow packets with | |||
| with that connection ID to be routed back to the endpoint and | that connection ID to be routed back to the endpoint and identified | |||
| identified by the endpoint upon receipt. | by the endpoint upon receipt. | |||
| Connection IDs MUST NOT contain any information that can be used to | Connection IDs MUST NOT contain any information that can be used by | |||
| correlate them with other connection IDs for the same connection. As | an external observer to correlate them with other connection IDs for | |||
| a trivial example, this means the same connection ID MUST NOT be | the same connection. As a trivial example, this means the same | |||
| issued more than once on the same connection. | connection ID MUST NOT be issued more than once on the same | |||
| connection. | ||||
| 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 | |||
| skipping to change at page 25, line 41 ¶ | skipping to change at page 24, line 16 ¶ | |||
| needed for routing and the address/port tuple of packets is | needed for routing and the address/port tuple of packets is | |||
| sufficient to identify a connection. An endpoint whose peer has | sufficient to identify a connection. An endpoint whose peer has | |||
| selected a zero-length connection ID MUST continue to use a zero- | selected a zero-length connection ID MUST continue to use a zero- | |||
| length connection ID for the lifetime of the connection and MUST NOT | length connection ID for the lifetime of the connection and MUST NOT | |||
| send packets from any other local address. | send packets from any other local address. | |||
| When an endpoint has requested a non-zero-length connection ID, it | When an endpoint has requested a non-zero-length connection ID, it | |||
| needs to ensure that the peer has a supply of connection IDs from | needs to ensure that the peer has a supply of connection IDs from | |||
| which to choose for packets sent to the endpoint. These connection | which to choose for packets sent to the endpoint. These connection | |||
| IDs are supplied by the endpoint using the NEW_CONNECTION_ID frame | IDs are supplied by the endpoint using the NEW_CONNECTION_ID frame | |||
| (Section 19.12). | (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 | |||
| deduplicating messages. The initial connection ID issued by an | deduplicating messages. The initial connection ID issued by an | |||
| endpoint is sent in the Source Connection ID field of the long packet | endpoint is sent in the Source Connection ID field of the long packet | |||
| header (Section 17.2) during the handshake. The sequence number of | header (Section 17.2) during the handshake. The sequence number of | |||
| the initial connection ID is 0. If the preferred_address transport | the 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.12). The sequence number on | NEW_CONNECTION_ID frames (Section 19.15). The sequence number on | |||
| each newly-issued connection ID MUST increase by 1. The connection | each newly-issued connection ID MUST increase by 1. The connection | |||
| ID randomly selected by the client in the Initial packet and any | ID randomly selected by the client in the Initial packet and any | |||
| connection ID provided by a Reset packet are not assigned sequence | connection ID provided by a Retry packet are not assigned sequence | |||
| numbers unless a server opts to retain them as its initial connection | numbers unless a server opts to retain them as its initial connection | |||
| ID. | ID. | |||
| When an endpoint issues a connection ID, it MUST accept packets that | When an endpoint issues a connection ID, it MUST accept packets that | |||
| carry this connection ID for the duration of the connection or until | carry this connection ID for the duration of the connection or until | |||
| its peer invalidates the connection ID via a RETIRE_CONNECTION_ID | its peer invalidates the connection ID via a RETIRE_CONNECTION_ID | |||
| frame (Section 19.13). | frame (Section 19.16). | |||
| Endpoints store received connection IDs for future use. An endpoint | ||||
| that receives excessive connection IDs MAY discard those it cannot | ||||
| store without sending a RETIRE_CONNECTION_ID frame. An endpoint that | ||||
| issues connection IDs cannot expect its peer to store and use all | ||||
| issued connection IDs. | ||||
| An endpoint SHOULD ensure that its peer has a sufficient number of | An endpoint SHOULD ensure that its peer has a sufficient number of | |||
| available and unused connection IDs. While each endpoint | available and unused connection IDs. While each endpoint | |||
| independently chooses how many connection IDs to issue, endpoints | independently chooses how many connection IDs to issue, endpoints | |||
| SHOULD provide and maintain at least eight connection IDs. The | SHOULD provide and maintain at least eight connection IDs. The | |||
| endpoint can do this by always supplying a new connection ID when a | endpoint SHOULD do this by always supplying a new connection ID when | |||
| connection ID is retired by its peer or when the endpoint receives a | a connection ID is retired by its peer or when the endpoint receives | |||
| packet with a previously unused connection ID. Endpoints that | a packet with a previously unused connection ID. Endpoints that | |||
| initiate migration and require non-zero-length connection IDs SHOULD | initiate migration and require non-zero-length connection IDs SHOULD | |||
| provide their peers with new connection IDs before migration, or risk | provide their peers with new connection IDs before migration, or risk | |||
| the peer closing the connection. | the peer closing the connection. | |||
| 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. | |||
| 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, indicating that the peer | RETIRE_CONNECTION_ID frame to its peer. Sending a | |||
| might bring a new connection ID into circulation using the | RETIRE_CONNECTION_ID frame indicates that the connection ID won't be | |||
| NEW_CONNECTION_ID frame. | used again and requests that the peer replace it with a new | |||
| connection ID using a NEW_CONNECTION_ID frame. | ||||
| An endpoint that retires a connection ID can retain knowledge of that | ||||
| connection ID for a period of time after sending the | ||||
| RETIRE_CONNECTION_ID frame, or until that frame is acknowledged. | ||||
| As discussed in Section 9.5, each connection ID MUST be used on | As discussed in Section 9.5, each connection ID MUST be used on | |||
| packets sent from only one local address. An endpoint that migrates | packets sent from only one local address. An endpoint that migrates | |||
| away from a local address SHOULD retire all connection IDs used on | away from a local address SHOULD retire all connection IDs used on | |||
| that address once it no longer plans to use that address. | that address once it no longer plans to use that address. | |||
| 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 - | |||
| skipping to change at page 27, line 24 ¶ | skipping to change at page 25, line 48 ¶ | |||
| than one connection ID can be associated with a connection; see | than one connection ID can be associated with a connection; see | |||
| Section 5.1. | Section 5.1. | |||
| If the Destination Connection ID is zero length and the packet | If the Destination Connection ID is zero length and the packet | |||
| matches the address/port tuple of a connection where the host did not | matches the address/port tuple of a connection where the host did not | |||
| require connection IDs, QUIC processes the packet as part of that | require connection IDs, QUIC processes the packet as part of that | |||
| connection. Endpoints MUST drop packets with zero-length Destination | connection. Endpoints MUST drop packets with zero-length Destination | |||
| Connection ID fields if they do not correspond to a single | Connection ID fields if they do not correspond to a single | |||
| connection. | connection. | |||
| Endpoints SHOULD send a Stateless Reset (Section 10.4) for any | Endpoints can send a Stateless Reset (Section 10.4) for any packets | |||
| packets that cannot be attributed to an existing connection. | that cannot be attributed to an existing connection. A stateless | |||
| reset allows a peer to more quickly identify when a connection | ||||
| becomes unusable. | ||||
| Packets that are matched to an existing connection, but for which the | Packets that are matched to an existing connection, but for which the | |||
| endpoint cannot remove packet protection, are discarded. | endpoint cannot remove packet protection, are discarded. | |||
| 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 address/port tuple to | receive zero-length connection IDs can use the address/port tuple to | |||
| identify a connection. Packets that don't match an existing | identify a connection. Packets that don't match an existing | |||
| skipping to change at page 29, line 29 ¶ | skipping to change at page 28, line 10 ¶ | |||
| multiple QUIC versions SHOULD pad the first packet they send to the | multiple QUIC versions SHOULD pad the first packet they send to the | |||
| largest of the minimum packet sizes across all versions they support. | largest of the minimum packet sizes across all versions they support. | |||
| This ensures that the server responds if there is a mutually | This ensures that the server responds if there is a mutually | |||
| supported version. | supported version. | |||
| 6.1. Sending Version Negotiation Packets | 6.1. Sending Version Negotiation Packets | |||
| If the version selected by the client is not acceptable to the | If the version selected by the client is not acceptable to the | |||
| server, the server responds with a Version Negotiation packet (see | server, the server responds with a Version Negotiation packet (see | |||
| Section 17.4). This includes a list of versions that the server will | Section 17.4). This includes a list of versions that the server will | |||
| accept. | accept. An endpoint MUST NOT send a Version Negotiation packet in | |||
| response to receiving a Version Negotiation packet. | ||||
| This system allows a server to process packets with unsupported | This system allows a server to process packets with unsupported | |||
| versions without retaining state. Though either the Initial packet | versions without retaining state. Though either the Initial packet | |||
| or the Version Negotiation packet that is sent in response could be | or the Version Negotiation packet that is sent in response could be | |||
| lost, the client will send new packets until it successfully receives | lost, the client will send new packets until it successfully receives | |||
| a response or it abandons the connection attempt. | a response or it abandons the connection attempt. | |||
| 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 | |||
| skipping to change at page 30, line 27 ¶ | skipping to change at page 29, line 10 ¶ | |||
| packet, it MUST discard other Version Negotiation packets on the same | packet, it MUST discard other Version Negotiation packets on the same | |||
| connection. Similarly, a client MUST ignore a Version Negotiation | connection. Similarly, a client MUST ignore a Version Negotiation | |||
| packet if it has already received and acted on a Version Negotiation | packet if it has already received and acted on a Version Negotiation | |||
| packet. | packet. | |||
| A client MUST ignore a Version Negotiation packet that lists the | A client MUST ignore a Version Negotiation packet that lists the | |||
| client's chosen version. | client's chosen version. | |||
| A client MAY attempt 0-RTT after receiving a Version Negotiation | A client MAY attempt 0-RTT after receiving a Version Negotiation | |||
| packet. A client that sends additional 0-RTT packets MUST NOT reset | packet. A client that sends additional 0-RTT packets MUST NOT reset | |||
| the packet number to 0 as a result, see Section 17.5.2. | the packet number to 0 as a result, see Section 17.5.3. | |||
| Version negotiation packets have no cryptographic protection. The | Version negotiation packets have no cryptographic protection. The | |||
| result of the negotiation MUST be revalidated as part of the | result of the negotiation MUST be revalidated as part of the | |||
| cryptographic handshake (see Section 7.3.3). | cryptographic handshake (see Section 7.3.3). | |||
| 6.3. Using Reserved Versions | 6.3. Using Reserved Versions | |||
| For a server to use a new version in the future, clients must | For a server to use a new version in the future, clients must | |||
| correctly handle unsupported versions. To help ensure this, a server | correctly handle unsupported versions. To help ensure this, a server | |||
| SHOULD include a reserved version (see Section 15) while generating a | SHOULD include a reserved version (see Section 15) while generating a | |||
| skipping to change at page 31, line 9 ¶ | skipping to change at page 29, line 38 ¶ | |||
| reserved version numbers in the Version Negotiation Packet and in its | reserved version numbers in the Version Negotiation Packet and in its | |||
| transport parameters. | transport parameters. | |||
| A client MAY send a packet using a reserved version number. This can | A client MAY send a packet using a reserved version number. This can | |||
| be used to solicit a list of supported versions from a server. | be used to solicit a list of supported versions from a server. | |||
| 7. Cryptographic and Transport Handshake | 7. Cryptographic and Transport Handshake | |||
| QUIC relies on a combined cryptographic and transport handshake to | QUIC relies on a combined cryptographic and transport handshake to | |||
| minimize connection establishment latency. QUIC uses the CRYPTO | minimize connection establishment latency. QUIC uses the CRYPTO | |||
| frame Section 19.20 to transmit the cryptographic handshake. Version | frame Section 19.6 to transmit the cryptographic handshake. Version | |||
| 0x00000001 of QUIC uses TLS 1.3 as described in [QUIC-TLS]; a | 0x00000001 of QUIC uses TLS as described in [QUIC-TLS]; a different | |||
| different QUIC version number could indicate that a different | QUIC version number could indicate that a different cryptographic | |||
| cryptographic handshake protocol is in use. | handshake protocol is in use. | |||
| QUIC provides reliable, ordered delivery of the cryptographic | QUIC provides reliable, ordered delivery of the cryptographic | |||
| handshake data. QUIC packet protection ensures confidentiality and | handshake data. QUIC packet protection is used to encrypt as much of | |||
| integrity protection that meets the requirements of the cryptographic | the handshake protocol as possible. The cryptographic handshake MUST | |||
| handshake protocol: | 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, | * every connection produces distinct and unrelated keys, | |||
| * keying material is usable for packet protection for both 0-RTT | * keying material is usable for packet protection for both 0-RTT | |||
| and 1-RTT packets, and | and 1-RTT packets, and | |||
| * 1-RTT keys have forward secrecy | * 1-RTT keys have forward secrecy | |||
| o authenticated values for the transport parameters of the peer (see | o authenticated values for the transport parameters of the peer (see | |||
| Section 7.3) | Section 7.3) | |||
| skipping to change at page 31, line 47 ¶ | skipping to change at page 30, line 26 ¶ | |||
| o authenticated negotiation of an application protocol (TLS uses | o authenticated negotiation of an application protocol (TLS uses | |||
| ALPN [RFC7301] for this purpose) | ALPN [RFC7301] for this purpose) | |||
| The first CRYPTO frame from a client MUST be sent in a single packet. | The first CRYPTO frame from a client MUST be sent in a single packet. | |||
| Any second attempt that is triggered by address validation (see | Any second attempt that is triggered by address validation (see | |||
| Section 8.1) MUST also be sent within a single packet. This avoids | Section 8.1) MUST also be sent within a single packet. This avoids | |||
| having to reassemble a message from multiple packets. | having to reassemble a message from multiple packets. | |||
| The first client packet of the cryptographic handshake protocol MUST | The first client packet of the cryptographic handshake protocol MUST | |||
| fit within a 1232 octet QUIC packet payload. This includes overheads | fit within a 1232 byte QUIC packet payload. This includes overheads | |||
| that reduce the space available to the cryptographic handshake | that reduce the space available to the cryptographic handshake | |||
| protocol. | protocol. | |||
| An endpoint can verify support for Explicit Congestion Notification | ||||
| (ECN) in the first packets it sends, as described in Section 13.3.2. | ||||
| The CRYPTO frame can be sent in different packet number spaces. The | The CRYPTO frame can be sent in different packet number spaces. The | |||
| sequence numbers used by CRYPTO frames to ensure ordered delivery of | sequence numbers used by CRYPTO frames to ensure ordered delivery of | |||
| cryptographic handshake data start from zero in each packet number | cryptographic handshake data start from zero in each packet number | |||
| space. | space. | |||
| 7.1. Example Handshake Flows | 7.1. Example Handshake Flows | |||
| Details of how TLS is integrated with QUIC are provided in | Details of how TLS is integrated with QUIC are provided in | |||
| [QUIC-TLS], but some examples are provided here. An extension of | [QUIC-TLS], but some examples are provided here. An extension of | |||
| this exchange to support client address validation is shown in | this exchange to support client address validation is shown in | |||
| skipping to change at page 33, line 49 ¶ | skipping to change at page 32, line 43 ¶ | |||
| used to establish the connection ID that each endpoint uses. Each | used to establish the connection ID that each endpoint uses. Each | |||
| endpoint uses the Source Connection ID field to specify the | endpoint uses the Source Connection ID field to specify the | |||
| connection ID that is used in the Destination Connection ID field of | connection ID that is used in the Destination Connection ID field of | |||
| packets being sent to them. Upon receiving a packet, each endpoint | packets being sent to them. Upon receiving a packet, each endpoint | |||
| sets the Destination Connection ID it sends to match the value of the | sets the Destination Connection ID it sends to match the value of the | |||
| Source Connection ID that they receive. | Source Connection ID that they receive. | |||
| When an Initial packet is sent by a client which has not previously | When an Initial packet is sent by a client which has not previously | |||
| received a Retry packet from the server, it populates the Destination | received a Retry packet from the server, it populates the Destination | |||
| Connection ID field with an unpredictable value. This MUST be at | Connection ID field with an unpredictable value. This MUST be at | |||
| least 8 octets in length. Until a packet is received from the | least 8 bytes in length. Until a packet is received from the server, | |||
| server, the client MUST use the same value unless it abandons the | the client MUST use the same value unless it abandons the connection | |||
| connection attempt and starts a new one. The initial Destination | attempt and starts a new one. The initial Destination Connection ID | |||
| Connection ID is used to determine packet protection keys for Initial | is used to determine packet protection keys for Initial packets. | |||
| packets. | ||||
| The final version used for a connection might be different from the | ||||
| version of the first Initial from the client. To enable consistent | ||||
| routing through the handshake, a client SHOULD select an initial | ||||
| Destination Connection ID length long enough to fulfill the minimum | ||||
| size for every QUIC version it supports. | ||||
| The client populates the Source Connection ID field with a value of | The client populates the Source Connection ID field with a value of | |||
| its choosing and sets the SCIL field to match. | its choosing and sets the SCIL field to match. | |||
| The Destination Connection ID field in the server's Initial packet | The Destination Connection ID field in the server's Initial packet | |||
| contains a connection ID that is chosen by the recipient of the | contains a connection ID that is chosen by the recipient of the | |||
| packet (i.e., the client); the Source Connection ID includes the | packet (i.e., the client); the Source Connection ID includes the | |||
| connection ID that the sender of the packet wishes to use (see | connection ID that the sender of the packet wishes to use (see | |||
| Section 5.1). The server MUST use consistent Source Connection IDs | Section 5.1). The server MUST use consistent Source Connection IDs | |||
| during the handshake. | during the handshake. | |||
| On first receiving an Initial or Retry packet from the server, the | On 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. That means that a | Destination Connection ID for subsequent packets. That means that a | |||
| client might change the Destination Connection ID twice during | client might change the Destination Connection ID twice during | |||
| connection establishment. Once a client has received an Initial | connection establishment, once in response to a Retry and once in | |||
| packet from the server, it MUST discard any packet it receives with a | response to the first Initial packet from the server. Once a client | |||
| different Source Connection ID. | has received an Initial packet from the server, it MUST discard any | |||
| packet it receives with a different Source Connection ID. | ||||
| A client MUST only change the value it sends in the Destination | A client MUST only change the value it sends in the Destination | |||
| Connection ID in response to the first packet of each type it | Connection ID in response to the first packet of each type it | |||
| receives from the server (Retry or Initial); a server MUST set its | receives from the server (Retry or Initial); a server MUST set its | |||
| value based on the Initial packet. Any additional changes are not | value based on the Initial packet. Any additional changes are not | |||
| permitted; if subsequent packets of those types include a different | permitted; if subsequent packets of those types include a different | |||
| Source Connection ID, they MUST be discarded. This avoids problems | Source Connection ID, they MUST be discarded. This avoids problems | |||
| that might arise from stateless processing of multiple Initial | that might arise from stateless processing of multiple Initial | |||
| packets producing different connection IDs. | packets producing different connection IDs. | |||
| skipping to change at page 35, line 14 ¶ | skipping to change at page 34, line 12 ¶ | |||
| be validated (see Section 7.3.3) before the connection establishment | be validated (see Section 7.3.3) before the connection establishment | |||
| is considered properly complete. | is considered properly complete. | |||
| Definitions for each of the defined transport parameters are included | Definitions for each of the defined transport parameters are included | |||
| in Section 18.1. Any given parameter MUST appear at most once in a | in Section 18.1. Any given parameter MUST appear at most once in a | |||
| given transport parameters extension. An endpoint MUST treat receipt | given transport parameters extension. An endpoint MUST treat receipt | |||
| of duplicate transport parameters as a connection error of type | of duplicate transport parameters as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR. | TRANSPORT_PARAMETER_ERROR. | |||
| A server MUST include the original_connection_id transport parameter | A server MUST include the original_connection_id transport parameter | |||
| (Section 18.1) if it sent a Retry packet. | (Section 18.1) if it sent a Retry packet to enable validation of the | |||
| Retry, as described in Section 17.7. | ||||
| 7.3.1. Values of Transport Parameters for 0-RTT | 7.3.1. Values of Transport Parameters for 0-RTT | |||
| A client that attempts to send 0-RTT data MUST remember the transport | A client that attempts to send 0-RTT data MUST remember the transport | |||
| parameters used by the server. The transport parameters that the | parameters used by the server. The transport parameters that the | |||
| server advertises during connection establishment apply to all | server advertises during connection establishment apply to all | |||
| connections that are resumed using the keying material established | connections that are resumed using the keying material established | |||
| during that handshake. Remembered transport parameters apply to the | during that handshake. Remembered transport parameters apply to the | |||
| new connection until the handshake completes and new transport | new connection until the handshake completes and new transport | |||
| parameters from the server can be provided. | parameters from the server can be provided. | |||
| skipping to change at page 35, line 36 ¶ | skipping to change at page 34, line 35 ¶ | |||
| A server can remember the transport parameters that it advertised, or | A server can remember the transport parameters that it advertised, or | |||
| store an integrity-protected copy of the values in the ticket and | store an integrity-protected copy of the values in the ticket and | |||
| recover the information when accepting 0-RTT data. A server uses the | recover the information when accepting 0-RTT data. A server uses the | |||
| transport parameters in determining whether to accept 0-RTT data. | transport parameters in determining whether to accept 0-RTT data. | |||
| A server MAY accept 0-RTT and subsequently provide different values | A server MAY accept 0-RTT and subsequently provide different values | |||
| for transport parameters for use in the new connection. If 0-RTT | for transport parameters for use in the new connection. If 0-RTT | |||
| data is accepted by the server, the server MUST NOT reduce any limits | data is accepted by the server, the server MUST NOT reduce any limits | |||
| or alter any values that might be violated by the client with its | or alter any values that might be violated by the client with its | |||
| 0-RTT data. In particular, a server that accepts 0-RTT data MUST NOT | 0-RTT data. In particular, a server that accepts 0-RTT data MUST NOT | |||
| set values for initial_max_data, initial_max_stream_data_bidi_local, | set values for the following parameters (Section 18.1) that are | |||
| initial_max_stream_data_bidi_remote, initial_max_stream_data_uni, | smaller than the remembered value of those parameters. | |||
| initial_max_bidi_streams, or initial_max_uni_streams (Section 18.1) | ||||
| that are smaller than the remembered value of those parameters. | o initial_max_data | |||
| o initial_max_stream_data_bidi_local | ||||
| o initial_max_stream_data_bidi_remote | ||||
| o initial_max_stream_data_uni | ||||
| o initial_max_streams_bidi | ||||
| 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 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_bidi_streams and | initial_max_data and either initial_max_streams_bidi and | |||
| initial_max_stream_data_bidi_remote, or initial_max_uni_streams and | initial_max_stream_data_bidi_remote, or initial_max_streams_uni and | |||
| initial_max_stream_data_uni. | initial_max_stream_data_uni. | |||
| The value of the server's previous preferred_address MUST NOT be used | The value of the server's previous preferred_address MUST NOT be used | |||
| when establishing a new connection; rather, the client should wait to | when establishing a new connection; rather, the client should wait to | |||
| observe the server's new preferred_address value in the handshake. | observe the server's new preferred_address value in the handshake. | |||
| A server MUST reject 0-RTT data or even abort a handshake if the | A server MUST either reject 0-RTT data or abort a handshake if the | |||
| implied values for transport parameters cannot be supported. | implied values for transport parameters cannot be supported. | |||
| 7.3.2. New Transport Parameters | 7.3.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. Absence of a transport parameter therefore disables any | |||
| optional protocol feature that is negotiated using the parameter. | optional protocol feature that is negotiated using the parameter. | |||
| New transport parameters can be registered according to the rules in | New transport parameters can be registered according to the rules in | |||
| skipping to change at page 38, line 23 ¶ | skipping to change at page 37, line 32 ¶ | |||
| 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 client received the Initial packet | Handshake keys confirms that the client received the Initial packet | |||
| from the server. Once the server has successfully processed a | from the server. Once the server has successfully processed a | |||
| Handshake packet from the client, it can consider the client address | Handshake packet from the client, it can consider the client address | |||
| to have been validated. | to have been validated. | |||
| Prior to validating the client address, servers MUST NOT send more | Prior to validating the client address, servers MUST NOT send more | |||
| than three times as many bytes as the number of bytes they have | than three times as many bytes as the number of bytes they have | |||
| received. This limits the magnitude of any amplification attack that | received. This limits the magnitude of any amplification attack that | |||
| can be mounted using spoofed source addresses. | can be mounted using spoofed source addresses. In determining this | |||
| limit, servers only count the size of successfully processed packets. | ||||
| To ensure that the server is not overly constrained by this | Clients MUST pad UDP datagrams that contain only Initial packets to | |||
| restriction, clients MUST send UDP datagrams with at least 1200 | at least 1200 bytes. Once a client has received an acknowledgment | |||
| octets of payload until the server has completed address validation, | for a Handshake packet it MAY send smaller datagrams. Sending padded | |||
| see Section 14. | datagrams ensures that the server is not overly constrained by the | |||
| amplification restriction. | ||||
| In order to prevent a handshake deadlock as a result of the server | In order to prevent a handshake deadlock as a result of the server | |||
| being unable to send, clients SHOULD send a packet upon a handshake | being unable to send, clients SHOULD send a packet upon a handshake | |||
| timeout, as described in [QUIC-RECOVERY]. If the client has no data | timeout, as described in [QUIC-RECOVERY]. If the client has no data | |||
| to retransmit and does not have Handshake keys, it SHOULD send an | to retransmit and does not have Handshake keys, it SHOULD send an | |||
| Initial packet in a UDP datagram of at least 1200 octets. If the | Initial packet in a UDP datagram of at least 1200 bytes. If the | |||
| client has Handshake keys, it SHOULD send a Handshake packet. | client has Handshake keys, it SHOULD send a 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. Client addresses can be verified using | the cryptographic handshake. QUIC uses a token in the Initial packet | |||
| an address validation token. This token is delivered during | to provide address validation prior to completing the handshake. | |||
| connection establishment with a Retry packet (see Section 8.1.1) or | This token is delivered to the client during connection establishment | |||
| in a previous connection using the NEW_TOKEN frame (see | with a Retry packet (see Section 8.1.1) or in a previous connection | |||
| Section 8.1.2). | using the NEW_TOKEN frame (see Section 8.1.2). | |||
| 8.1.1. Address Validation using Retry Packets | 8.1.1. Address Validation using Retry Packets | |||
| QUIC uses token-based address validation during connection | ||||
| establishment. Any time the server wishes to validate a client | ||||
| address, it provides the client with a token. As long as it is not | ||||
| possible for an attacker to generate a valid token for its own | ||||
| address (see Section 8.1.3) and the client is able to return that | ||||
| token, it proves to the server that it received the token. | ||||
| 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.7) | address validation by sending a Retry packet (Section 17.7) | |||
| containing a token. This token is repeated by the client in an | containing a token. This token MUST be repeated by the client in all | |||
| Initial packet after it receives the Retry packet. In response to | Initial packets it sends after it receives the Retry packet. In | |||
| receiving a token in an Initial packet, a server can either abort the | response to processing an Initial containing a token, a server can | |||
| connection or permit it to proceed. | either abort the connection or permit it to proceed. | |||
| As long as it is not possible for an attacker to generate a valid | ||||
| token for its own address (see Section 8.1.3) and the client is able | ||||
| to return that token, it proves to the server that it received the | ||||
| 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. By giving the client a | processing costs of connection establishment. By giving the client a | |||
| different connection ID to use, a server can cause the connection to | different connection ID to use, a server can cause the connection to | |||
| be routed to a server instance with more resources available for new | be routed to a server instance with more resources available for new | |||
| connections. | connections. | |||
| A flow showing the use of a Retry packet is shown in Figure 6. | A flow showing the use of a Retry packet is shown in Figure 6. | |||
| Client Server | Client Server | |||
| skipping to change at page 39, line 42 ¶ | skipping to change at page 39, line 5 ¶ | |||
| Figure 6: Example Handshake with Retry | Figure 6: Example Handshake with Retry | |||
| 8.1.2. Address Validation for Future Connections | 8.1.2. Address Validation for Future Connections | |||
| A server MAY provide clients with an address validation token during | A server MAY provide clients with an address validation token during | |||
| one connection that can be used on a subsequent connection. Address | one connection that can be used on a subsequent connection. Address | |||
| validation is especially important with 0-RTT because a server | validation is especially important with 0-RTT because a server | |||
| potentially sends a significant amount of data to a client in | potentially sends a significant amount of data to a client in | |||
| response to 0-RTT data. | response to 0-RTT data. | |||
| The server uses the NEW_TOKEN frame Section 19.18 to provide the | The server uses the NEW_TOKEN frame Section 19.7 to provide the | |||
| client with an address validation token that can be used to validate | client with an address validation token that can be used to validate | |||
| future connections. The client may then use this token to validate | future connections. The client includes this token in Initial | |||
| future connections by including it in the Initial packet's header. | packets to provide address validation in a future connection. The | |||
| The client MUST NOT use the token provided in a Retry for future | client MUST include the token in all Initial packets it sends, unless | |||
| connections. | a Retry replaces the token with a newer token. The client MUST NOT | |||
| use the token provided in a Retry for future connections. Servers | ||||
| MAY discard any Initial packet that does not carry the expected | ||||
| token. | ||||
| Unlike the token that is created for a Retry packet, there might be | Unlike the token that is created for a Retry packet, there might be | |||
| some time between when the token is created and when the token is | some time between when the token is created and when the token is | |||
| subsequently used. Thus, a resumption token SHOULD include an | subsequently used. Thus, a resumption token SHOULD include an | |||
| expiration time. The server MAY include either an explicit | expiration time. The server MAY include either an explicit | |||
| expiration time or an issued timestamp and dynamically calculate the | expiration time or an issued timestamp and dynamically calculate the | |||
| expiration time. It is also unlikely that the client port number is | expiration time. It is also unlikely that the client port number is | |||
| the same on two different connections; validating the port is | the same on two different connections; validating the port is | |||
| therefore unlikely to be successful. | therefore unlikely to be successful. | |||
| skipping to change at page 40, line 23 ¶ | skipping to change at page 39, line 38 ¶ | |||
| If the client has a token received in a NEW_TOKEN frame on a previous | If the client has a token received in a NEW_TOKEN frame on a previous | |||
| connection to what it believes to be the same server, it can include | connection to what it believes to be the same server, it can include | |||
| that value in the Token field of its Initial packet. | that value in the Token field of its Initial packet. | |||
| 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 MAY | Clients that want to break continuity of identity with a server MAY | |||
| discard tokens provided using the NEW_TOKEN frame. Tokens obtained | discard tokens provided using the NEW_TOKEN frame. Tokens obtained | |||
| in Retry packets MUST NOT be discarded. | in Retry packets MUST NOT be discarded. | |||
| A client SHOULD NOT reuse a token. Reusing a token allows | A client SHOULD NOT reuse a token in different connections. Reusing | |||
| connections to be linked by entities on the network path (see | a token allows connections to be linked by entities on the network | |||
| Section 9.5). A client MUST NOT reuse a token if it believes that | path (see Section 9.5). A client MUST NOT reuse a token if it | |||
| its point of network attachment has changed since the token was last | believes that its point of network attachment has changed since the | |||
| used; that is, if there is a change in its local IP address or | token was last used; that is, if there is a change in its local IP | |||
| network interface. A client needs to start the connection process | address or network interface. A client needs to start the connection | |||
| over if it migrates prior to completing the handshake. | process over if it migrates prior to completing the handshake. | |||
| When a server receives an Initial packet with an address validation | When a server receives an Initial packet with an address validation | |||
| token, it SHOULD attempt to validate it. If the token is invalid | token, it SHOULD attempt to validate it, unless it has already | |||
| then the server SHOULD proceed as if the client did not have a | completed address validation. If the token is invalid then the | |||
| validated address, including potentially sending a Retry. If the | server SHOULD proceed as if the client did not have a validated | |||
| validation succeeds, the server SHOULD then allow the handshake to | address, including potentially sending a Retry. If the validation | |||
| proceed. | succeeds, the server SHOULD then allow 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. A server MAY encode tokens provided with NEW_TOKEN | discarded. A server MAY encode tokens provided with NEW_TOKEN | |||
| frames and Retry packets differently, and validate the latter more | frames and Retry packets differently, and validate the latter more | |||
| strictly. | strictly. | |||
| 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 validate | limit its use of tokens to only the information needed validate | |||
| client addresses. | client addresses. | |||
| Attackers could replay tokens to use servers as amplifiers in DDoS | ||||
| attacks. To protect against such attacks, servers SHOULD ensure that | ||||
| tokens sent in Retry packets are only accepted for a short time. | ||||
| Tokens that are provided in NEW_TOKEN frames (see Section 19.7) need | ||||
| to be valid for longer, but SHOULD NOT be accepted multiple times in | ||||
| a short period. Servers are encouraged to allow tokens to be used | ||||
| only once, if possible. | ||||
| 8.1.3. Address Validation Token Integrity | 8.1.3. Address Validation Token Integrity | |||
| An address validation token MUST be difficult to guess. Including a | An address validation token MUST be difficult to guess. Including a | |||
| large enough random value in the token would be sufficient, but this | large enough random value in the token would be sufficient, but this | |||
| depends on the server remembering the value it sends to clients. | depends on the server remembering the value it sends to clients. | |||
| A token-based scheme allows the server to offload any state | A token-based scheme allows the server to offload any state | |||
| associated with validation to the client. For this design to work, | associated with validation to the client. For this design to work, | |||
| the token MUST be covered by integrity protection against | the token MUST be covered by integrity protection against | |||
| modification or falsification by clients. Without integrity | modification or falsification by clients. Without integrity | |||
| skipping to change at page 43, line 16 ¶ | skipping to change at page 42, line 41 ¶ | |||
| For path validation to be successful, a PATH_RESPONSE frame MUST be | For path validation to be successful, a PATH_RESPONSE frame MUST be | |||
| received from the same remote address to which the corresponding | received from the same remote address to which the corresponding | |||
| PATH_CHALLENGE was sent. If a PATH_RESPONSE frame is received from a | PATH_CHALLENGE was sent. If a PATH_RESPONSE frame is received from a | |||
| different remote address than the one to which the PATH_CHALLENGE was | different remote address than the one to which the PATH_CHALLENGE was | |||
| sent, path validation is considered to have failed, even if the data | sent, path validation is considered to have failed, even if the data | |||
| matches that sent in the PATH_CHALLENGE. | matches that sent in the PATH_CHALLENGE. | |||
| Additionally, the PATH_RESPONSE frame MUST be received on the same | Additionally, the PATH_RESPONSE frame MUST be received on the same | |||
| local address from which the corresponding PATH_CHALLENGE was sent. | local address from which the corresponding PATH_CHALLENGE was sent. | |||
| An endpoint considers the path to be valid when a PATH_RESPONSE frame | ||||
| is received on the same path with the same payload as the | ||||
| PATH_CHALLENGE frame. | ||||
| If a PATH_RESPONSE frame is received on a different local address | If a PATH_RESPONSE frame is received on a different local address | |||
| than the one from which the PATH_CHALLENGE was sent, path validation | than the one from which the PATH_CHALLENGE was sent, path validation | |||
| is considered to have failed, even if the data matches that sent in | is not considered to be successful, even if the data matches the | |||
| the PATH_CHALLENGE. Thus, the endpoint considers the path to be | PATH_CHALLENGE. This doesn't result in path validation failure, as | |||
| valid when a PATH_RESPONSE frame is received on the same path with | it might be a result of a forwarded packet (see Section 9.3.3) or | |||
| the same payload as the PATH_CHALLENGE frame. | misrouting. | |||
| 8.6. Failed Path Validation | 8.6. 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. | could have a longer round-trip time than the original. A value of | |||
| three times the current Retransmittion Timeout (RTO) as defined in | ||||
| [QUIC-RECOVERY] is RECOMMENDED. | ||||
| 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. | a new path to become available or close the connection. | |||
| skipping to change at page 44, line 31 ¶ | skipping to change at page 44, line 13 ¶ | |||
| new outgoing IP address for a flow. NAT rebinding is not connection | new outgoing IP address for a flow. NAT rebinding is not connection | |||
| migration as defined in this section, though an endpoint SHOULD | migration as defined in this section, though an endpoint SHOULD | |||
| perform path validation (Section 8.2) if it detects a change in the | perform path validation (Section 8.2) if it detects a change in the | |||
| IP address of its peer. | IP address of its peer. | |||
| This document limits migration of connections to new client | This document limits migration of connections to new client | |||
| addresses, except as described in Section 9.6. Clients are | addresses, except as described in Section 9.6. Clients are | |||
| responsible for initiating all migrations. Servers do not send non- | responsible for initiating all migrations. Servers do not send non- | |||
| probing packets (see Section 9.1) toward a client address until they | probing packets (see Section 9.1) toward a client address until they | |||
| see a non-probing packet from that address. If a client receives | see a non-probing packet from that address. If a client receives | |||
| packets from an unknown server address, the client MAY discard these | packets from an unknown server address, the client MUST discard these | |||
| packets. | packets. | |||
| 9.1. Probing a New Path | 9.1. Probing a New Path | |||
| An endpoint MAY probe for peer reachability from a new local address | An endpoint MAY probe for peer reachability from a new local address | |||
| using path validation Section 8.2 prior to migrating the connection | using path validation Section 8.2 prior to migrating the connection | |||
| to the new local address. Failure of path validation simply means | to the new local address. Failure of path validation simply means | |||
| that the new path is not usable for this connection. Failure to | that the new path is not usable for this connection. Failure to | |||
| validate a path does not cause the connection to end unless there are | validate a path does not cause the connection to end unless there are | |||
| no valid alternative paths available. | no valid alternative paths available. | |||
| skipping to change at page 46, line 16 ¶ | skipping to change at page 45, line 48 ¶ | |||
| After changing the address to which it sends non-probing packets, an | After changing the address to which it sends non-probing packets, an | |||
| endpoint could abandon any path validation for other addresses. | endpoint could abandon any path validation for other addresses. | |||
| Receiving a packet from a new peer address might be the result of a | Receiving a packet from a new peer address might be the result of a | |||
| NAT rebinding at the peer. | NAT rebinding at the peer. | |||
| After verifying a new client address, the server SHOULD send new | After verifying a new client address, the server SHOULD send new | |||
| address validation tokens (Section 8) to the client. | address validation tokens (Section 8) to the client. | |||
| 9.3.1. Handling Address Spoofing by a Peer | 9.3.1. Peer Address Spoofing | |||
| 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 MUST | address. Until a peer's address is deemed valid, an endpoint MUST | |||
| skipping to change at page 46, line 39 ¶ | skipping to change at page 46, line 22 ¶ | |||
| per estimated round-trip time (kMinimumWindow, as defined in | per estimated round-trip time (kMinimumWindow, as defined in | |||
| [QUIC-RECOVERY]). In the absence of this limit, an endpoint risks | [QUIC-RECOVERY]). In the absence of this limit, an endpoint risks | |||
| being used for a denial of service attack against an unsuspecting | being used for a denial of service attack against an unsuspecting | |||
| victim. Note that since the endpoint will not have any round-trip | victim. Note that since the endpoint will not have any round-trip | |||
| time measurements to this address, the estimate SHOULD be the default | time measurements to this address, the estimate SHOULD be the default | |||
| initial value (see [QUIC-RECOVERY]). | initial value (see [QUIC-RECOVERY]). | |||
| If an endpoint skips validation of a peer address as described in | If an endpoint skips validation of a peer address as described in | |||
| Section 9.3, it does not need to limit its sending rate. | Section 9.3, it does not need to limit its sending rate. | |||
| 9.3.2. Handling Address Spoofing by an On-path Attacker | 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 | |||
| address will be seen to come from a migrating connection, and the | address will be seen to come from a migrating connection, and the | |||
| original packet will be seen as a duplicate and dropped. After a | original packet will be seen as a duplicate and dropped. After a | |||
| spurious migration, validation of the source address will fail | spurious migration, validation of the source address will fail | |||
| because the entity at the source address does not have the necessary | because the entity at the source address does not have the necessary | |||
| cryptographic keys to read or respond to the PATH_CHALLENGE frame | cryptographic keys to read or respond to the PATH_CHALLENGE frame | |||
| that is sent to it even if it wanted to. | that is sent to it even if it wanted to. | |||
| skipping to change at page 47, line 20 ¶ | skipping to change at page 47, line 5 ¶ | |||
| MUST close the connection silently by discarding all connection | MUST close the connection silently by discarding all connection | |||
| state. This results in new packets on the connection being handled | state. This results in new packets on the connection being handled | |||
| generically. For instance, an endpoint MAY send a stateless reset in | generically. For instance, an endpoint MAY send a stateless reset in | |||
| response to any further incoming packets. | response to any further incoming packets. | |||
| Note that receipt of packets with higher packet numbers from the | Note that receipt of packets with higher packet numbers from the | |||
| legitimate peer address will trigger another connection migration. | legitimate peer address will trigger another connection migration. | |||
| This will cause the validation of the address of the spurious | This will cause the validation of the address of the spurious | |||
| migration to be abandoned. | migration to be abandoned. | |||
| 9.3.3. Off-Path Packet Forwarding | ||||
| An off-path attacker that can observe packets might forward copies of | ||||
| genuine packets to endpoints. If the copied packet arrives before | ||||
| 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 | ||||
| continue forwarding packets, it might be able to cause migration to a | ||||
| path via the attacker. This places the attacker on path, giving it | ||||
| the ability to observe or drop all subsequent packets. | ||||
| Unlike the attack described in Section 9.3.2, the attacker can ensure | ||||
| that the new path is successfully validated. | ||||
| This style of attack relies on the attacker using a path that is | ||||
| approximately as fast as the direct path between endpoints. The | ||||
| attack is more reliable if relatively few packets are sent or if | ||||
| packet loss coincides with the attempted attack. | ||||
| A non-probing packet received on the original path that increases the | ||||
| maximum received packet number will cause the endpoint to move back | ||||
| to that path. Eliciting packets on this path increases the | ||||
| likelihood that the attack is unsuccessful. Therefore, mitigation of | ||||
| this attack relies on triggering the exchange of packets. | ||||
| In response to an apparent migration, endpoints MUST validate the | ||||
| previously active path using a PATH_CHALLENGE frame. This induces | ||||
| 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, but no longer desired, the validation will succeed, but only | ||||
| results in probing packets being sent on the path. | ||||
| An endpoint that receives a PATH_CHALLENGE on an active path SHOULD | ||||
| send a non-probing packet in response. If the non-probing packet | ||||
| arrives before any copy made by an attacker, this results in the | ||||
| connection being migrated back to the original path. Any subsequent | ||||
| migration to another path restarts this entire process. | ||||
| This defense is imperfect, but this is not considered a serious | ||||
| problem. If the path via the attack is reliably faster than the | ||||
| original path despite multiple attempts to use that original path, it | ||||
| is not possible to distinguish between attack and an improvement in | ||||
| routing. | ||||
| An endpoint could also use heuristics to improve detection of this | ||||
| style of attack. For instance, NAT rebinding is improbable if | ||||
| packets were recently received on the old path, similarly rebinding | ||||
| is rare on IPv6 paths. Endpoints can also look for duplicated | ||||
| packets. Conversely, a change in connection ID is more likely to | ||||
| 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 SHOULD NOT contribute to | old path. Packets sent on the old path SHOULD NOT contribute to | |||
| congestion control or RTT estimation for the new path. | congestion control or RTT estimation for the new path. | |||
| On confirming a peer's ownership of its new address, an endpoint | On confirming a peer's ownership of its new address, an endpoint | |||
| SHOULD immediately reset the congestion controller and round-trip | SHOULD immediately reset the congestion controller and round-trip | |||
| time estimator for the new path. | time estimator for the new path. | |||
| skipping to change at page 47, line 48 ¶ | skipping to change at page 48, line 35 ¶ | |||
| appropriately. | appropriately. | |||
| There may be apparent reordering at the receiver when an endpoint | There may be apparent reordering at the receiver when an endpoint | |||
| 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 may have different round-trip | period, since the two resulting paths may 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]) may be adequate. A sender can make | (as described in [QUIC-RECOVERY]) may be adequate. For instance, an | |||
| exceptions for probe packets so that their loss detection is | endpoint might delay switching to a new congestion control context | |||
| independent and does not unduly cause the congestion controller to | until it is confirmed that an old path is no longer needed (such as | |||
| reduce its sending rate. An endpoint might set a separate timer when | the case in Section 9.3.3). | |||
| a PATH_CHALLENGE is sent, which is cancelled when the corresponding | ||||
| PATH_RESPONSE is received. If the timer fires before the | A sender can make exceptions for probe packets so that their loss | |||
| PATH_RESPONSE is received, the endpoint might send a new | detection is independent and does not unduly cause the congestion | |||
| controller to reduce its sending rate. An endpoint might set a | ||||
| separate timer when a PATH_CHALLENGE is sent, which is cancelled when | ||||
| the corresponding PATH_RESPONSE is received. If the timer fires | ||||
| 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. | |||
| 9.5. Privacy Implications of Connection Migration | 9.5. Privacy Implications of Connection Migration | |||
| Using a stable connection ID on multiple network paths allows a | Using a stable connection ID on multiple network paths allows a | |||
| passive observer to correlate activity between those paths. An | passive observer to correlate activity between those paths. An | |||
| endpoint that moves between networks might not wish to have their | endpoint that moves between networks might not wish to have their | |||
| activity correlated by any entity other than their peer, 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 need | as discussed in Section 5.1. For this to be effective endpoints need | |||
| skipping to change at page 51, line 15 ¶ | skipping to change at page 52, line 9 ¶ | |||
| 10.1. Closing and Draining Connection States | 10.1. Closing and Draining Connection States | |||
| The closing and draining connection states exist to ensure that | The closing and draining connection states exist to ensure that | |||
| connections close cleanly and that delayed or reordered packets are | connections close cleanly and that delayed or reordered packets are | |||
| properly discarded. These states SHOULD persist for three times the | properly discarded. These states SHOULD persist for three times the | |||
| current Retransmission Timeout (RTO) interval as defined in | current Retransmission Timeout (RTO) interval as defined in | |||
| [QUIC-RECOVERY]. | [QUIC-RECOVERY]. | |||
| An endpoint enters a closing period after initiating an immediate | An endpoint enters a closing period after initiating an immediate | |||
| close (Section 10.3). While closing, an endpoint MUST NOT send | close (Section 10.3). While closing, an endpoint MUST NOT send | |||
| packets unless they contain a CONNECTION_CLOSE or APPLICATION_CLOSE | packets unless they contain a CONNECTION_CLOSE frame (see | |||
| frame (see Section 10.3 for details). An endpoint retains only | Section 10.3 for details). An endpoint retains only enough | |||
| enough information to generate a packet containing a closing frame | information to generate a packet containing a CONNECTION_CLOSE frame | |||
| and to identify packets as belonging to the connection. The | and to identify packets as belonging to the connection. The | |||
| connection ID and QUIC version is sufficient information to identify | connection ID and QUIC version is sufficient information to identify | |||
| packets for a closing connection; an endpoint can discard all other | packets for a closing connection; an endpoint can discard all other | |||
| connection state. An endpoint MAY retain packet protection keys for | connection state. An endpoint MAY retain packet protection keys for | |||
| incoming packets to allow it to read and process a closing frame. | incoming packets to allow it to read and process a CONNECTION_CLOSE | |||
| frame. | ||||
| The draining state is entered once an endpoint receives a signal that | The draining state is entered once an endpoint receives a signal that | |||
| its peer is closing or draining. While otherwise identical to the | its peer is closing or draining. While otherwise identical to the | |||
| closing state, an endpoint in the draining state MUST NOT send any | closing state, an endpoint in the draining state MUST NOT send any | |||
| packets. Retaining packet protection keys is unnecessary once a | packets. Retaining packet protection keys is unnecessary once a | |||
| connection is in the draining state. | connection is in the draining state. | |||
| An endpoint MAY transition from the closing period to the draining | An endpoint MAY transition from the closing period to the draining | |||
| period if it can confirm that its peer is also closing or draining. | period if it can confirm that its peer is also closing or draining. | |||
| Receiving a closing frame is sufficient confirmation, as is receiving | Receiving a CONNECTION_CLOSE frame is sufficient confirmation, as is | |||
| a stateless reset. The draining period SHOULD end when the closing | receiving a stateless reset. The draining period SHOULD end when the | |||
| period would have ended. In other words, the endpoint can use the | closing period would have ended. In other words, the endpoint can | |||
| same end time, but cease retransmission of the closing packet. | use the same end time, but cease retransmission of the closing | |||
| packet. | ||||
| Disposing of connection state prior to the end of the closing or | Disposing of connection state prior to the end of the closing or | |||
| draining period could cause delayed or reordered packets to be | draining period could cause delayed or reordered packets to be | |||
| handled poorly. Endpoints that have some alternative means to ensure | handled poorly. Endpoints that have some alternative means to ensure | |||
| that late-arriving packets on the connection do not create QUIC | that late-arriving packets on the connection do not create QUIC | |||
| state, such as those that are able to close the UDP socket, MAY use | state, such as those that are able to close the UDP socket, MAY use | |||
| an abbreviated draining period which can allow for faster resource | an abbreviated draining period which can allow for faster resource | |||
| recovery. Servers that retain an open socket for accepting new | recovery. Servers that retain an open socket for accepting new | |||
| connections SHOULD NOT exit the closing or draining period early. | connections SHOULD NOT exit the closing or draining period early. | |||
| skipping to change at page 52, line 39 ¶ | skipping to change at page 53, line 39 ¶ | |||
| PADDING frames are not acknowledged until an endpoint has other | PADDING frames are not acknowledged until an endpoint has other | |||
| frames to send, so they could prevent the timeout from being | frames to send, so they could prevent the timeout from being | |||
| refreshed. | refreshed. | |||
| The value for an idle timeout can be asymmetric. The value | The value for an idle timeout can be asymmetric. The value | |||
| advertised by an endpoint is only used to determine whether the | advertised by an endpoint is only used to determine whether the | |||
| connection is live at that endpoint. An endpoint that sends packets | connection is live at that endpoint. An endpoint that sends packets | |||
| near the end of the idle timeout period of a peer risks having those | near the end of the idle timeout period of a peer risks having those | |||
| packets discarded if its peer enters the draining state before the | packets discarded if its peer enters the draining state before the | |||
| packets arrive. If a peer could timeout within an RTO (see | packets arrive. If a peer could timeout within an RTO (see | |||
| Section 4.3.3 of [QUIC-RECOVERY]), it is advisable to test for | Section 5.3.3 of [QUIC-RECOVERY]), it is advisable to test for | |||
| liveness before sending any data that cannot be retried safely. | liveness before sending any data that cannot be retried safely. | |||
| 10.3. Immediate Close | 10.3. Immediate Close | |||
| An endpoint sends a closing frame (CONNECTION_CLOSE or | An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) to | |||
| APPLICATION_CLOSE) to terminate the connection immediately. Any | terminate the connection immediately. A CONNECTION_CLOSE frame | |||
| closing frame causes all streams to immediately become closed; open | causes all streams to immediately become closed; open streams can be | |||
| streams can be assumed to be implicitly reset. | assumed to be implicitly reset. | |||
| After sending a closing frame, endpoints immediately enter the | After sending a CONNECTION_CLOSE frame, endpoints immediately enter | |||
| closing state. During the closing period, an endpoint that sends a | the closing state. During the closing period, an endpoint that sends | |||
| closing frame SHOULD respond to any packet that it receives with | a CONNECTION_CLOSE frame SHOULD respond to any packet that it | |||
| another packet containing a closing frame. To minimize the state | receives with another packet containing a CONNECTION_CLOSE frame. To | |||
| that an endpoint maintains for a closing connection, endpoints MAY | minimize the state that an endpoint maintains for a closing | |||
| send the exact same packet. However, endpoints SHOULD limit the | connection, endpoints MAY send the exact same packet. However, | |||
| number of packets they generate containing a closing frame. For | endpoints SHOULD limit the number of packets they generate containing | |||
| instance, an endpoint could progressively increase the number of | a CONNECTION_CLOSE frame. For instance, an endpoint could | |||
| packets that it receives before sending additional packets or | progressively increase the number of packets that it receives before | |||
| increase the time between packets. | sending additional packets or increase the time between packets. | |||
| Note: Allowing retransmission of a packet contradicts other advice | Note: Allowing retransmission of a packet contradicts other advice | |||
| in this document that recommends the creation of new packet | in this document that recommends the creation of new packet | |||
| numbers for every packet. Sending new packet numbers is primarily | numbers for every packet. Sending new packet numbers is primarily | |||
| of advantage to loss recovery and congestion control, which are | of advantage to loss recovery and congestion control, which are | |||
| not expected to be relevant for a closed connection. | not expected to be relevant for a closed connection. | |||
| Retransmitting the final packet requires less state. | Retransmitting the final packet requires less state. | |||
| After receiving a closing frame, endpoints enter the draining state. | New packets from unverified addresses could be used to create an | |||
| An endpoint that receives a closing frame MAY send a single packet | amplification attack (see Section 8). To avoid this, endpoints MUST | |||
| containing a closing frame before entering the draining state, using | either limit transmission of CONNECTION_CLOSE frames to validated | |||
| a CONNECTION_CLOSE frame and a NO_ERROR code if appropriate. An | addresses or drop packets without response if the response would be | |||
| endpoint MUST NOT send further packets, which could result in a | more than three times larger than the received packet. | |||
| constant exchange of closing frames until the closing period on | ||||
| either peer ended. | After receiving a CONNECTION_CLOSE frame, endpoints enter the | |||
| draining state. An endpoint that receives a CONNECTION_CLOSE frame | ||||
| MAY send a single packet containing a CONNECTION_CLOSE frame before | ||||
| entering the draining state, using a CONNECTION_CLOSE frame and a | ||||
| NO_ERROR code if appropriate. An endpoint MUST NOT send further | ||||
| packets, which could result in a constant exchange of | ||||
| CONNECTION_CLOSE frames until the closing period on either peer | ||||
| ended. | ||||
| An immediate close can be used after an application protocol has | An immediate close can be used after an application protocol has | |||
| arranged to close a connection. This might be after the application | arranged to close a connection. This might be after the application | |||
| protocols negotiates a graceful shutdown. The application protocol | protocols negotiates a graceful shutdown. The application protocol | |||
| exchanges whatever messages that are needed to cause both endpoints | exchanges whatever messages that are needed to cause both endpoints | |||
| to agree to close the connection, after which the application | to agree to close the connection, after which the application | |||
| requests that the connection be closed. The application protocol can | requests that the connection be closed. The application protocol can | |||
| use an APPLICATION_CLOSE message with an appropriate error code to | use an CONNECTION_CLOSE frame with an appropriate error code to | |||
| signal closure. | signal closure. | |||
| If the connection has been successfully established, endpoints MUST | If the connection has been successfully established, endpoints MUST | |||
| send any closing frames in a 1-RTT packet. Prior to connection | send any CONNECTION_CLOSE frames in a 1-RTT packet. Prior to | |||
| establishment a peer might not have 1-RTT keys, so endpoints SHOULD | connection establishment a peer might not have 1-RTT keys, so | |||
| send closing frames in a Handshake packet. If the endpoint does not | endpoints SHOULD send CONNECTION_CLOSE frames in a Handshake packet. | |||
| have Handshake keys, or it is not certain that the peer has Handshake | If the endpoint does not have Handshake keys, or it is not certain | |||
| keys, it MAY send closing frames in an Initial packet. If multiple | that the peer has Handshake keys, it MAY send CONNECTION_CLOSE frames | |||
| packets are sent, they can be coalesced (see Section 12.2) to | in an Initial packet. If multiple packets are sent, they can be | |||
| facilitate retransmission. | coalesced (see Section 12.2) to facilitate retransmission. | |||
| 10.4. Stateless Reset | 10.4. 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. A | |||
| endpoint that wishes to communicate a fatal connection error MUST use | stateless reset is not appropriate for signaling error conditions. | |||
| a closing frame if it has sufficient state to do so. | An endpoint that wishes to communicate a fatal connection error MUST | |||
| use a CONNECTION_CLOSE frame if it has sufficient state to do so. | ||||
| To support this process, a token is sent by endpoints. The token is | To support this process, a token is sent by endpoints. The token is | |||
| carried in the NEW_CONNECTION_ID frame sent by either peer, and | carried in the NEW_CONNECTION_ID frame sent by either peer, and | |||
| servers can specify the stateless_reset_token transport parameter | servers can specify the stateless_reset_token transport parameter | |||
| during the handshake (clients cannot because their transport | during the handshake (clients cannot because their transport | |||
| parameters don't have confidentiality protection). This value is | parameters don't have confidentiality protection). This value is | |||
| protected by encryption, so only client and server know this value. | protected by encryption, so only client and server know this value. | |||
| Tokens sent via NEW_CONNECTION_ID frames are invalidated when their | Tokens are invalidated when their associated connection ID is retired | |||
| associated connection ID is retired via a RETIRE_CONNECTION_ID frame | via a RETIRE_CONNECTION_ID frame (Section 19.16). | |||
| (Section 19.13). | ||||
| 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: | packet in the following layout: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | ||||
| |0|K|1|1|0|0|0|0| | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Random Octets (160..) ... | |0|1| Random Bits (182..) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 7: Stateless Reset Packet | Figure 7: Stateless Reset Packet | |||
| This design ensures that a stateless reset packet is - to the extent | This design ensures that a stateless reset packet is - to the extent | |||
| possible - indistinguishable from a regular packet with a short | possible - indistinguishable from a regular packet with a short | |||
| header. | header. | |||
| The message consists of a header octet, followed by an arbitrary | A stateless reset uses an entire UDP datagram, starting with the | |||
| number of random octets, followed by a Stateless Reset Token. | first two bits of the packet header. The remainder of the first byte | |||
| and an arbitrary number of random bytes following it are set to | ||||
| unpredictable values. The last 16 bytes of the datagram contain a | ||||
| Stateless Reset Token. | ||||
| A stateless reset will be interpreted by a recipient as a packet with | A stateless reset will be interpreted by a recipient as a packet with | |||
| a short header. For the packet to appear as valid, the Random Octets | a short header. For the packet to appear as valid, the Random Bits | |||
| field needs to include at least 20 octets of random or unpredictable | field needs to include at least 182 bits of random or unpredictable | |||
| values. This is intended to allow for a destination connection ID of | values (or 24 bytes, less the two fixed bits). This is intended to | |||
| the maximum length permitted, a packet number, and minimal payload. | allow for a destination connection ID of the maximum length | |||
| The Stateless Reset Token corresponds to the minimum expansion of the | permitted, with a minimal packet number, and payload. The Stateless | |||
| packet protection AEAD. More random octets might be necessary if the | Reset Token corresponds to the minimum expansion of the packet | |||
| protection AEAD. More random bytes might be necessary if the | ||||
| endpoint could have negotiated a packet protection scheme with a | endpoint could have negotiated a packet protection scheme with a | |||
| larger minimum AEAD expansion. | larger minimum AEAD expansion. | |||
| An endpoint SHOULD NOT send a stateless reset that is significantly | An endpoint SHOULD NOT send a stateless reset that is significantly | |||
| larger than the packet it receives. Endpoints MUST discard packets | larger than the packet it receives. Endpoints MUST discard packets | |||
| that are too small to be valid QUIC packets. With the set of AEAD | that are too small to be valid QUIC packets. With the set of AEAD | |||
| functions defined in [QUIC-TLS], packets less than 19 octets long are | functions defined in [QUIC-TLS], packets that are smaller than 21 | |||
| never valid. | bytes are never valid. | |||
| 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. This would not be effective if the stateless reset | long header. This would not be effective if the stateless reset | |||
| token was not yet available to a peer. In this QUIC version, packets | token was not yet available to a peer. In this QUIC version, packets | |||
| with a long header are only used during connection establishment. | with a long header are only used during connection establishment. | |||
| Because the stateless reset token is not available until connection | Because the stateless reset token is not available until connection | |||
| establishment is complete or near completion, ignoring an unknown | establishment is complete or near completion, ignoring an unknown | |||
| packet with a long header might be more effective. | packet with a long header might be more effective. | |||
| 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 packet. The Destination | |||
| Connection ID will therefore differ from the value used in previous | Connection ID will therefore differ from the value used in previous | |||
| packets. A random Destination Connection ID makes the connection ID | packets. A random Destination Connection ID makes the connection ID | |||
| appear to be the result of moving to a new connection ID that was | appear to be the result of moving to a new connection ID that was | |||
| provided using a NEW_CONNECTION_ID frame (Section 19.12). | provided using a NEW_CONNECTION_ID frame (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.4.3. A | another Stateless Reset in response, see Section 10.4.3. A | |||
| Stateless Reset that is not correctly routed is ineffective in | Stateless Reset that is not correctly routed is an ineffective | |||
| causing errors to be quickly detected and recovered. In this | error detection and recovery mechanism. In this case, endpoints | |||
| case, endpoints will need to rely on other methods - such as | will need to rely on other methods - such as timers - to detect | |||
| 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. | |||
| Finally, the last 16 octets of the packet are set to the value of the | Finally, the last 16 bytes of the packet are set to the value of the | |||
| Stateless Reset Token. | Stateless Reset Token. | |||
| A stateless reset is not appropriate for signaling error conditions. | ||||
| An endpoint that wishes to communicate a fatal connection error MUST | ||||
| use a CONNECTION_CLOSE or APPLICATION_CLOSE frame if it has | ||||
| sufficient state to do so. | ||||
| 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 reuse this design, or use a portion of the | |||
| packet other than the last 16 octets for carrying data. | packet other than the last 16 bytes for carrying data. | |||
| 10.4.1. Detecting a Stateless Reset | 10.4.1. Detecting a Stateless Reset | |||
| An endpoint detects a potential stateless reset when a packet with a | An endpoint detects a potential stateless reset when a packet with a | |||
| short header either cannot be decrypted or is marked as a duplicate | short header either cannot be decrypted or is marked as a duplicate | |||
| packet. The endpoint then compares the last 16 octets of the packet | packet. The endpoint then compares the last 16 bytes of the packet | |||
| with the Stateless Reset Token provided by its peer, either in a | with the Stateless Reset Token provided by its peer, either in a | |||
| NEW_CONNECTION_ID frame or the server's transport parameters. If | NEW_CONNECTION_ID frame or the server's transport parameters. If | |||
| these values are identical, the endpoint MUST enter the draining | these values are identical, the endpoint MUST enter the draining | |||
| period and not send any further packets on this connection. If the | period and not send any further packets on this connection. If the | |||
| comparison fails, the packet can be discarded. | comparison fails, the packet can be discarded. | |||
| 10.4.2. Calculating a Stateless Reset Token | 10.4.2. Calculating a Stateless Reset Token | |||
| The stateless reset token MUST be difficult to guess. In order to | The stateless reset token MUST be difficult to guess. In order to | |||
| create a Stateless Reset Token, an endpoint could randomly generate | create a Stateless Reset Token, an endpoint could randomly generate | |||
| skipping to change at page 56, line 38 ¶ | skipping to change at page 57, line 44 ¶ | |||
| 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 second iteration of a | endpoint by generating the proof using a second iteration of a | |||
| preimage-resistant function that takes a static key and the | preimage-resistant function that takes a static key and the | |||
| connection ID chosen by the endpoint (see Section 5.1) as input. An | connection ID chosen by the endpoint (see Section 5.1) as input. An | |||
| endpoint could use HMAC [RFC2104] (for example, HMAC(static_key, | endpoint could use HMAC [RFC2104] (for example, HMAC(static_key, | |||
| connection_id)) or HKDF [RFC5869] (for example, using the static key | connection_id)) or HKDF [RFC5869] (for example, using the static key | |||
| as input keying material, with the connection ID as salt). The | as input keying material, with the connection ID as salt). The | |||
| output of this function is truncated to 16 octets to produce the | output of this function is truncated to 16 bytes to produce the | |||
| Stateless Reset Token for that connection. | 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 | |||
| skipping to change at page 57, line 40 ¶ | skipping to change at page 58, line 45 ¶ | |||
| 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 Reset packets that | |||
| it has sent and stop generating new Stateless Reset packets once a | it has sent and stop generating new Stateless Reset packets once a | |||
| limit is reached. Using separate limits for different remote | limit is reached. Using separate limits for different remote | |||
| addresses will ensure that Stateless Reset packets can be used to | addresses will ensure that Stateless Reset packets can be used to | |||
| close connections when other peers or connections have exhausted | close connections when other peers or connections have exhausted | |||
| limits. | limits. | |||
| Reducing the size of a Stateless Reset below the recommended minimum | Reducing the size of a Stateless Reset below the recommended minimum | |||
| size of 37 octets could mean that the packet could reveal to an | size of 37 bytes could mean that the packet could reveal to an | |||
| observer that it is a Stateless Reset. Conversely, refusing to send | observer that it is a Stateless Reset. Conversely, refusing to send | |||
| a Stateless Reset in response to a small packet might result in | a Stateless Reset in response to a small packet might result in | |||
| Stateless Reset not being useful in detecting cases of broken | Stateless Reset not being useful in detecting cases of broken | |||
| connections where only very small packets are sent; such failures | connections where only very small packets are sent; such failures | |||
| might only be detected by other means, such as timers. | might only be detected by other means, such as timers. | |||
| An endpoint can increase the odds that a packet will trigger a | An endpoint can increase the odds that a packet will trigger a | |||
| Stateless Reset if it cannot be processed by padding it to at least | Stateless Reset if it cannot be processed by padding it to at least | |||
| 38 octets. | 38 bytes. | |||
| 11. Error Handling | 11. Error Handling | |||
| An endpoint that detects an error SHOULD signal the existence of that | An endpoint that detects an error SHOULD signal the existence of that | |||
| error to its peer. Both transport-level and application-level errors | error to its peer. Both transport-level and application-level errors | |||
| can affect an entire connection (see Section 11.1), while only | can affect an entire connection (see Section 11.1), while only | |||
| application-level errors can be isolated to a single stream (see | application-level errors can be isolated to a single stream (see | |||
| Section 11.2). | Section 11.2). | |||
| The most appropriate error code (Section 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 | |||
| identifies error conditions, it also identifies the error code that | identifies error conditions, it also identifies the error code that | |||
| is used. | is used. | |||
| A stateless reset (Section 10.4) is not suitable for any error that | A stateless reset (Section 10.4) is not suitable for any error that | |||
| can be signaled with a CONNECTION_CLOSE, APPLICATION_CLOSE, or | can be signaled with a CONNECTION_CLOSE or RESET_STREAM frame. A | |||
| RST_STREAM frame. A stateless reset MUST NOT be used by an endpoint | stateless reset MUST NOT be used by an endpoint that has the state | |||
| that has the state necessary to send a frame on the connection. | necessary to send a frame on the connection. | |||
| 11.1. Connection Errors | 11.1. Connection Errors | |||
| Errors that result in the connection being unusable, such as an | Errors that result in the connection being unusable, such as an | |||
| obvious violation of protocol semantics or corruption of state that | obvious violation of protocol semantics or corruption of state that | |||
| affects an entire connection, MUST be signaled using a | affects an entire connection, MUST be signaled using a | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE frame (Section 19.3, | CONNECTION_CLOSE frame (Section 19.19). An endpoint MAY close the | |||
| Section 19.4). An endpoint MAY close the connection in this manner | connection in this manner even if the error only affects a single | |||
| even if the error only affects a single stream. | stream. | |||
| Application protocols can signal application-specific protocol errors | Application protocols can signal application-specific protocol errors | |||
| using the APPLICATION_CLOSE frame. Errors that are specific to the | using the application-specific variant of the CONNECTION_CLOSE frame. | |||
| transport, including all those described in this document, are | Errors that are specific to the transport, including all those | |||
| carried in a CONNECTION_CLOSE frame. Other than the type of error | described in this document, are carried the QUIC-specific variant of | |||
| code they carry, these frames are identical in format and semantics. | the CONNECTION_CLOSE frame. | |||
| A CONNECTION_CLOSE or APPLICATION_CLOSE frame could be sent in a | A CONNECTION_CLOSE frame could be sent in a packet that is lost. An | |||
| packet that is lost. An endpoint SHOULD be prepared to retransmit a | endpoint SHOULD be prepared to retransmit a packet containing | |||
| packet containing either frame type if it receives more packets on a | containing a CONNECTION_CLOSE frame if it receives more packets on a | |||
| terminated connection. Limiting the number of retransmissions and | terminated connection. Limiting the number of retransmissions and | |||
| the time over which this final packet is sent limits the effort | the time over which this final packet is sent limits the effort | |||
| expended on terminated connections. | expended on terminated connections. | |||
| An endpoint that chooses not to retransmit packets containing | An endpoint that chooses not to retransmit packets containing a | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE risks a peer missing the first | CONNECTION_CLOSE frame risks a peer missing the first such packet. | |||
| such packet. The only mechanism available to an endpoint that | The only mechanism available to an endpoint that continues to receive | |||
| continues to receive data for a terminated connection is to use the | data for a terminated connection is to use the stateless reset | |||
| stateless reset process (Section 10.4). | process (Section 10.4). | |||
| An endpoint that receives an invalid CONNECTION_CLOSE or | An endpoint that receives an invalid CONNECTION_CLOSE frame MUST NOT | |||
| APPLICATION_CLOSE frame MUST NOT signal the existence of the error to | signal the existence of the error to its peer. | |||
| its peer. | ||||
| 11.2. Stream Errors | 11.2. Stream Errors | |||
| If an application-level error affects a single stream, but otherwise | If an application-level error affects a single stream, but otherwise | |||
| leaves the connection in a recoverable state, the endpoint can send a | leaves the connection in a recoverable state, the endpoint can send a | |||
| RST_STREAM frame (Section 19.2) 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. | |||
| Other than STOPPING (Section 3.5), RST_STREAM MUST be instigated by | RESET_STREAM MUST be instigated by the protocol using QUIC, either | |||
| the application and MUST carry an application error code. Resetting | directly or through the receipt of a STOP_SENDING frame from a peer. | |||
| a stream without knowledge of the application protocol could cause | RESET_STREAM carries an application error code. Resetting a stream | |||
| the protocol to enter an unrecoverable state. Application protocols | without knowledge of the application protocol could cause the | |||
| protocol to enter an unrecoverable state. Application protocols | ||||
| might require certain streams to be reliably delivered in order to | might require certain streams to be reliably delivered in order to | |||
| guarantee consistent state between endpoints. | guarantee consistent state between endpoints. | |||
| 12. Packets and Frames | 12. Packets and Frames | |||
| QUIC endpoints communicate by exchanging packets. Packets are | QUIC endpoints communicate by exchanging packets. Packets are | |||
| carried in UDP datagrams (see Section 12.2) and have confidentiality | carried in UDP datagrams (see Section 12.2) and have confidentiality | |||
| and integrity protection (see Section 12.1). | and integrity protection (see Section 12.1). | |||
| This version of QUIC uses the long packet header (see Section 17.2) | This version of QUIC uses the long packet header (see Section 17.2) | |||
| skipping to change at page 62, line 12 ¶ | skipping to change at page 63, line 17 ¶ | |||
| keys). If the packet number for sending reaches 2^62 - 1, the sender | keys). If the packet number for sending reaches 2^62 - 1, the sender | |||
| MUST close the connection without sending a CONNECTION_CLOSE frame or | MUST close the connection without sending a CONNECTION_CLOSE frame or | |||
| any further packets; an endpoint MAY send a Stateless Reset | any further packets; an endpoint MAY send a Stateless Reset | |||
| (Section 10.4) in response to further packets that it receives. | (Section 10.4) in response to further packets that 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.3 of [QUIC-TLS]. An efficient algorithm for duplicate | Section 9.3 of [QUIC-TLS]. An efficient algorithm for duplicate | |||
| suppression can be found in Section 3.4.3 of [RFC2406]. | suppression can be found in Section 3.4.3 of [RFC4303]. | |||
| 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, | |||
| commonly consists of a sequence of frames, as shown in Figure 8. | commonly consists of a sequence of frames, as shown in Figure 8. | |||
| Version Negotiation, Stateless Reset, and Retry packets do not | Version Negotiation, Stateless Reset, and Retry packets do not | |||
| contain frames. | contain frames. | |||
| skipping to change at page 64, line 10 ¶ | skipping to change at page 65, line 10 ¶ | |||
| The frame types defined in this specification are listed in Table 3. | The frame types defined in this specification are listed in Table 3. | |||
| The Frame Type in STREAM frames is used to carry other frame-specific | The Frame Type in STREAM frames is used to carry other frame-specific | |||
| flags. For all other frames, the Frame Type field simply identifies | flags. For all other frames, the Frame Type field simply identifies | |||
| the frame. These frames are explained in more detail in Section 19. | the frame. These frames are explained in more detail in Section 19. | |||
| +-------------+----------------------+---------------+ | +-------------+----------------------+---------------+ | |||
| | Type Value | Frame Type Name | Definition | | | Type Value | Frame Type Name | Definition | | |||
| +-------------+----------------------+---------------+ | +-------------+----------------------+---------------+ | |||
| | 0x00 | PADDING | Section 19.1 | | | 0x00 | PADDING | Section 19.1 | | |||
| | | | | | | | | | | |||
| | 0x01 | RST_STREAM | Section 19.2 | | | 0x01 | PING | Section 19.2 | | |||
| | | | | | ||||
| | 0x02 | CONNECTION_CLOSE | Section 19.3 | | ||||
| | | | | | | | | | | |||
| | 0x03 | APPLICATION_CLOSE | Section 19.4 | | | 0x02 - 0x03 | ACK | Section 19.3 | | |||
| | | | | | | | | | | |||
| | 0x04 | MAX_DATA | Section 19.5 | | | 0x04 | RESET_STREAM | Section 19.4 | | |||
| | | | | | | | | | | |||
| | 0x05 | MAX_STREAM_DATA | Section 19.6 | | | 0x05 | STOP_SENDING | Section 19.5 | | |||
| | | | | | | | | | | |||
| | 0x06 | MAX_STREAM_ID | Section 19.7 | | | 0x06 | CRYPTO | Section 19.6 | | |||
| | | | | | | | | | | |||
| | 0x07 | PING | Section 19.8 | | | 0x07 | NEW_TOKEN | Section 19.7 | | |||
| | | | | | | | | | | |||
| | 0x08 | BLOCKED | Section 19.9 | | | 0x08 - 0x0f | STREAM | Section 19.8 | | |||
| | | | | | | | | | | |||
| | 0x09 | STREAM_BLOCKED | Section 19.10 | | | 0x10 | MAX_DATA | Section 19.9 | | |||
| | | | | | | | | | | |||
| | 0x0a | STREAM_ID_BLOCKED | Section 19.11 | | | 0x11 | MAX_STREAM_DATA | Section 19.10 | | |||
| | | | | | | | | | | |||
| | 0x0b | NEW_CONNECTION_ID | Section 19.12 | | | 0x12 - 0x13 | MAX_STREAMS | Section 19.11 | | |||
| | | | | | | | | | | |||
| | 0x0c | STOP_SENDING | Section 19.14 | | | 0x14 | DATA_BLOCKED | Section 19.12 | | |||
| | | | | | | | | | | |||
| | 0x0d | RETIRE_CONNECTION_ID | Section 19.13 | | | 0x15 | STREAM_DATA_BLOCKED | Section 19.13 | | |||
| | | | | | | | | | | |||
| | 0x0e | PATH_CHALLENGE | Section 19.16 | | | 0x16 - 0x17 | STREAMS_BLOCKED | Section 19.14 | | |||
| | | | | | | | | | | |||
| | 0x0f | PATH_RESPONSE | Section 19.17 | | | 0x18 | NEW_CONNECTION_ID | Section 19.15 | | |||
| | | | | | | | | | | |||
| | 0x10 - 0x17 | STREAM | Section 19.19 | | | 0x19 | RETIRE_CONNECTION_ID | Section 19.16 | | |||
| | | | | | | | | | | |||
| | 0x18 | CRYPTO | Section 19.20 | | | 0x1a | PATH_CHALLENGE | Section 19.17 | | |||
| | | | | | | | | | | |||
| | 0x19 | NEW_TOKEN | Section 19.18 | | | 0x1b | PATH_RESPONSE | Section 19.18 | | |||
| | | | | | | | | | | |||
| | 0x1a - 0x1b | ACK | Section 19.15 | | | 0x1c - 0x1d | CONNECTION_CLOSE | Section 19.19 | | |||
| +-------------+----------------------+---------------+ | +-------------+----------------------+---------------+ | |||
| Table 3: Frame Types | Table 3: Frame Types | |||
| All QUIC frames are idempotent. That is, a valid frame does not | All QUIC frames are idempotent. That is, a valid frame does not | |||
| cause undesirable side effects or errors when received more than | cause undesirable side effects or errors when received more than | |||
| once. | 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. Though a two-, four- or eight-octet encoding of | possible encoding. Though a two-, four- or eight-byte encoding of | |||
| the frame types defined in this document is possible, the Frame Type | the frame types defined in this document is possible, the Frame Type | |||
| field for these frames is encoded on a single octet. For instance, | field for these frames is encoded on a single byte. For instance, | |||
| though 0x4007 is a legitimate two-octet encoding for a variable- | though 0x4007 is a legitimate two-byte encoding for a variable-length | |||
| length integer with a value of 7, PING frames are always encoded as a | integer with a value of 7, PING frames are always encoded as a single | |||
| single octet with the value 0x07. An endpoint MUST treat the receipt | byte with the value 0x07. An endpoint MAY treat the receipt of a | |||
| of a frame type that uses a longer encoding than necessary as a | frame type that uses a longer encoding than necessary as a connection | |||
| connection error of type PROTOCOL_VIOLATION. | error of type PROTOCOL_VIOLATION. | |||
| 13. Packetization and Reliability | 13. Packetization and Reliability | |||
| A sender bundles one or more frames in a QUIC packet (see | A sender bundles one or more frames in a QUIC packet (see | |||
| Section 12.4). | Section 12.4). | |||
| A sender can minimize per-packet bandwidth and computational costs by | A sender can minimize per-packet bandwidth and computational costs by | |||
| bundling as many frames as possible within a QUIC packet. A sender | bundling as many frames as possible within a QUIC packet. A sender | |||
| MAY wait for a short period of time to bundle multiple frames before | MAY wait for a short period of time to bundle multiple frames before | |||
| sending a packet that is not maximally packed, to avoid sending out | sending a packet that is not maximally packed, to avoid sending out | |||
| skipping to change at page 66, line 26 ¶ | skipping to change at page 67, line 20 ¶ | |||
| 13.1.1. Sending ACK Frames | 13.1.1. Sending ACK Frames | |||
| To avoid creating an indefinite feedback loop, an endpoint MUST NOT | To avoid creating an indefinite feedback loop, an endpoint MUST NOT | |||
| send an ACK frame in response to a packet containing only ACK or | send an ACK frame in response to a packet containing only ACK or | |||
| PADDING frames, even if there are packet gaps which precede the | PADDING frames, even if there are packet gaps which precede the | |||
| received packet. The endpoint MUST however acknowledge packets | received packet. The endpoint MUST however acknowledge packets | |||
| containing only ACK or PADDING frames when sending ACK frames in | containing only ACK or PADDING frames when sending ACK frames in | |||
| response to other packets. | response to other packets. | |||
| While PADDING frames do not elicit an ACK frame from a receiver, they | Packets containing PADDING frames are considered to be in flight for | |||
| are considered to be in flight for congestion control purposes | congestion control purposes [QUIC-RECOVERY]. Sending only PADDING | |||
| [QUIC-RECOVERY]. Sending only PADDING frames might cause the sender | frames might cause the sender to become limited by the congestion | |||
| to become limited by the congestion controller (as described in | controller (as described in [QUIC-RECOVERY]) with no acknowledgments | |||
| [QUIC-RECOVERY]) with no acknowledgments forthcoming from the | forthcoming from the receiver. Therefore, a sender should ensure | |||
| receiver. Therefore, a sender should ensure that other frames are | that other frames are sent in addition to PADDING frames to elicit | |||
| sent in addition to PADDING frames to elicit acknowledgments from the | acknowledgments from the receiver. | |||
| receiver. | ||||
| An endpoint MUST NOT send more than one packet containing only an ACK | An endpoint MUST NOT send more than one packet containing only an ACK | |||
| frame per received packet that contains frames other than ACK and | frame per received packet that contains frames other than ACK and | |||
| PADDING frames. | PADDING frames. | |||
| The receiver's delayed acknowledgment timer SHOULD NOT exceed the | The receiver's delayed acknowledgment timer SHOULD NOT exceed the | |||
| current RTT estimate or the value it indicates in the "max_ack_delay" | current RTT estimate or the value it indicates in the "max_ack_delay" | |||
| transport parameter. This ensures an acknowledgment is sent at least | transport parameter. This ensures an acknowledgment is sent at least | |||
| once per RTT when packets needing acknowledgement are received. The | once per RTT when packets needing acknowledgement are received. The | |||
| sender can use the receiver's "max_ack_delay" value in determining | sender can use the receiver's "max_ack_delay" value in determining | |||
| skipping to change at page 67, line 35 ¶ | skipping to change at page 68, line 29 ¶ | |||
| acknowledged in packets that are also protected with 1-RTT keys. | acknowledged in packets that are also protected with 1-RTT keys. | |||
| Packets that a client sends with 0-RTT packet protection MUST be | Packets that a client sends with 0-RTT packet protection MUST be | |||
| acknowledged by the server in packets protected by 1-RTT keys. This | acknowledged by the server in packets protected by 1-RTT keys. This | |||
| can mean that the client is unable to use these acknowledgments if | can mean that the client is unable to use these acknowledgments if | |||
| the server cryptographic handshake messages are delayed or lost. | the server cryptographic handshake messages are delayed or lost. | |||
| Note that the same limitation applies to other data sent by the | Note that the same limitation applies to other data sent by the | |||
| server protected by the 1-RTT keys. | server protected by the 1-RTT keys. | |||
| Endpoints SHOULD send acknowledgments for packets containing CRYPTO | Endpoints SHOULD send acknowledgments for packets containing CRYPTO | |||
| frames with a reduced delay; see Section 4.3.1 of [QUIC-RECOVERY]. | frames with a reduced delay; see Section 5.3.1 of [QUIC-RECOVERY]. | |||
| 13.2. Retransmission of Information | 13.2. Retransmission of Information | |||
| QUIC packets that are determined to be lost are not retransmitted | QUIC packets that are determined to be lost are not retransmitted | |||
| whole. The same applies to the frames that are contained within lost | whole. The same applies to the frames that are contained within lost | |||
| packets. Instead, the information that might be carried in frames is | packets. Instead, the information that might be carried in frames is | |||
| sent again in new frames as needed. | sent again in new frames as needed. | |||
| New frames and packets are used to carry information that is | New frames and packets are used to carry information that is | |||
| determined to have been lost. In general, information is sent again | determined to have been lost. In general, information is sent again | |||
| when a packet containing that information is determined to be lost | when a packet containing that information is determined to be lost | |||
| and sending ceases when a packet containing that information is | and sending ceases when a packet containing that information is | |||
| acknowledged. | acknowledged. | |||
| o 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. | in [QUIC-RECOVERY], until all data has been acknowledged. Data in | |||
| CRYPTO frames for Initial and Handshake packets is discarded when | ||||
| keys for the corresponding encryption level 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 RST_STREAM for that | STREAM frames unless the endpoint has sent a RESET_STREAM for that | |||
| stream. Once an endpoint sends a RST_STREAM frame, no further | stream. Once an endpoint sends a RESET_STREAM frame, no further | |||
| STREAM frames are needed. | STREAM frames are needed. | |||
| o The most recent set of acknowledgments are sent in ACK frames. An | o The most recent set of acknowledgments are sent in ACK frames. An | |||
| ACK frame SHOULD contain all unacknowledged acknowledgments, as | ACK frame SHOULD contain all unacknowledged acknowledgments, as | |||
| described in Section 13.1.1. | described in Section 13.1.1. | |||
| o Cancellation of stream transmission, as carried in a RST_STREAM | o Cancellation of stream transmission, as carried in a RESET_STREAM | |||
| frame, is sent until acknowledged or until all stream data is | frame, is sent until acknowledged or until all stream data is | |||
| acknowledged by the peer (that is, either the "Reset Recvd" or | acknowledged by the peer (that is, either the "Reset Recvd" or | |||
| "Data Recvd" state is reached on the send stream). The content of | "Data Recvd" state is reached on the send stream). The content of | |||
| a RST_STREAM frame MUST NOT change when it is sent again. | a RESET_STREAM frame MUST NOT change when it is sent again. | |||
| o Similarly, a request to cancel stream transmission, as encoded in | o Similarly, a request to cancel stream transmission, as encoded in | |||
| a STOP_SENDING frame, is sent until the receive stream enters | a STOP_SENDING frame, is sent until the receive stream enters | |||
| either a "Data Recvd" or "Reset Recvd" state, see Section 3.5. | either a "Data Recvd" or "Reset Recvd" state, see Section 3.5. | |||
| o Connection close signals, including those that use | o Connection close signals, including packets that contain | |||
| CONNECTION_CLOSE and APPLICATION_CLOSE frames, are not sent again | CONNECTION_CLOSE frames, are not sent again when packet loss is | |||
| when packet loss is detected, but as described in Section 10. | detected, but as 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. | MAX_DATA frames to be sent. | |||
| o The current maximum stream data offset is sent in MAX_STREAM_DATA | o The current maximum stream data offset is sent in MAX_STREAM_DATA | |||
| 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 receive stream enters a "Size | MAX_STREAM_DATA frames when the receive stream enters a "Size | |||
| Known" state. | Known" state. | |||
| o The maximum stream ID for a stream of a given type is sent in | o The limit on streams of a given type is sent in MAX_STREAMS | |||
| MAX_STREAM_ID frames. Like MAX_DATA, an updated value is sent | frames. Like MAX_DATA, an updated value is sent when a packet | |||
| when a packet containing the most recent MAX_STREAM_ID for a | containing the most recent MAX_STREAMS for a stream type frame is | |||
| stream type frame is declared lost or when the limit is updated, | declared lost or when the limit is updated, with care taken to | |||
| 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 BLOCKED, STREAM_BLOCKED, and | o Blocked signals are carried in DATA_BLOCKED, STREAM_DATA_BLOCKED, | |||
| STREAM_ID_BLOCKED frames. BLOCKED streams have connection scope, | and STREAMS_BLOCKED frames. DATA_BLOCKED streams have connection | |||
| STREAM_BLOCKED frames have stream scope, and STREAM_ID_BLOCKED | scope, STREAM_DATA_BLOCKED frames have stream scope, and | |||
| frames are scoped to a specific stream type. New frames are sent | STREAMS_BLOCKED frames are scoped to a specific stream type. New | |||
| if packets containing the most recent frame for a scope is lost, | frames are sent if packets containing the most recent frame for a | |||
| but only while the endpoint is blocked on the corresponding limit. | scope is lost, but only while the endpoint is blocked on the | |||
| These frames always include the limit that is causing blocking at | corresponding limit. These frames always include the limit that | |||
| 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 | |||
| just once. A new PATH_CHALLENGE frame will be sent if another | just once. A new PATH_CHALLENGE frame will be sent if another | |||
| PATH_RESPONSE frame is needed. | PATH_RESPONSE frame is needed. | |||
| o New connection IDs are sent in NEW_CONNECTION_ID frames and | o New connection IDs are sent in NEW_CONNECTION_ID frames and | |||
| retransmitted if the packet containing them is lost. | retransmitted if the packet containing them is lost. | |||
| Retransmissions of this frame carry the same sequence number | Retransmissions of this frame carry the same sequence number | |||
| value. Likewise, retired connection IDs are sent in | value. Likewise, retired connection IDs are sent in | |||
| RETIRE_CONNECTION_ID frames and retransmitted if the packet | RETIRE_CONNECTION_ID frames and retransmitted if the packet | |||
| containing them is lost. | containing them is lost. | |||
| o PADDING frames contain no information, so lost PADDING frames do | o PING and PADDING frames contain no information, so lost PING or | |||
| not require repair. | PADDING frames do not require repair. | |||
| Endpoints SHOULD prioritize retransmission of data over sending new | ||||
| data, unless priorities specified by the application indicate | ||||
| otherwise (see Section 2.3). | ||||
| 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.3. Explicit Congestion Notification | 13.3. Explicit Congestion Notification | |||
| QUIC endpoints use Explicit Congestion Notification (ECN) [RFC3168] | QUIC endpoints can use Explicit Congestion Notification (ECN) | |||
| to detect and respond to network congestion. ECN allows a network | [RFC3168] to detect and respond to network congestion. ECN allows a | |||
| node to indicate congestion in the network by setting a codepoint in | network node to indicate congestion in the network by setting a | |||
| the IP header of a packet instead of dropping it. Endpoints react to | codepoint in the IP header of a packet instead of dropping it. | |||
| congestion by reducing their sending rate in response, as described | Endpoints react to congestion by reducing their sending rate in | |||
| in [QUIC-RECOVERY]. | response, as described in [QUIC-RECOVERY]. | |||
| To use ECN, QUIC endpoints first determine whether a path supports | To use ECN, QUIC endpoints first determine whether a path supports | |||
| ECN marking and the peer is able to access the ECN codepoint in the | ECN marking and the peer is able to access the ECN codepoint in the | |||
| IP header. A network path does not support ECN if ECN marked packets | IP header. A network path does not support ECN if ECN marked packets | |||
| get dropped or ECN markings are rewritten on the path. An endpoint | get dropped or ECN markings are rewritten on the path. An endpoint | |||
| verifies the path, both during connection establishment and when | verifies the path, both during connection establishment and when | |||
| migrating to a new path (see Section 9). | migrating to a new path (see Section 9). | |||
| 13.3.1. ECN Counters | 13.3.1. ECN Counts | |||
| On receiving a packet with an ECT or CE codepoint, an endpoint that | On receiving a QUIC packet with an ECT or CE codepoint, an ECN- | |||
| can access the IP ECN codepoints increases the corresponding ECT(0), | enabled endpoint that can access the ECN codepoints from the | |||
| ECT(1), or CE count, and includes these counters in subsequent (see | enclosing IP packet increases the corresponding ECT(0), ECT(1), or CE | |||
| Section 13.1) ACK frames (see Section 19.15). | count, and includes these counts in subsequent ACK frames (see | |||
| Section 13.1 and Section 19.3). Note that this requires being able | ||||
| to read the ECN codepoints from the enclosing IP packet, which is not | ||||
| possible on all platforms. | ||||
| A packet detected by a receiver as a duplicate does not affect the | A packet detected by a receiver as a duplicate does not affect the | |||
| receiver's local ECN codepoint counts; see (Section 21.7) for | receiver's local ECN codepoint counts; see (Section 21.7) for | |||
| relevant security concerns. | relevant security concerns. | |||
| If an endpoint receives a packet without an ECT or CE codepoint, it | If an endpoint receives a QUIC packet without an ECT or CE codepoint | |||
| responds per Section 13.1 with an ACK frame. If an endpoint does not | in the IP packet header, it responds per Section 13.1 with an ACK | |||
| have access to received ECN codepoints, it acknowledges received | frame without increasing any ECN counts. if an endpoint does not | |||
| packets per Section 13.1 with an ACK frame. | implement ECN support or does not have access to received ECN | |||
| codepoints, it does not increase ECN counts. | ||||
| Coalesced packets (see Section 12.2) mean that several packets can | ||||
| share the same IP header. The ECN counter for the ECN codepoint | ||||
| received in the associated IP header are incremented once for each | ||||
| QUIC packet, not per enclosing IP packet or UDP datagram. | ||||
| Each packet number space maintains separate acknowledgement state and | ||||
| separate ECN counts. For example, if one each of an Initial, 0-RTT, | ||||
| Handshake, and 1-RTT QUIC packet are coalesced, the corresponding | ||||
| counts for the Initial and Handshake packet number space will be | ||||
| incremented by one and the counts for the 1-RTT packet number space | ||||
| will be increased by two. | ||||
| 13.3.2. ECN Verification | 13.3.2. ECN Verification | |||
| Each endpoint independently verifies and enables use of ECN by | Each endpoint independently verifies and enables use of ECN by | |||
| setting the IP header ECN codepoint to ECN Capable Transport (ECT) | setting the IP header ECN codepoint to ECN Capable Transport (ECT) | |||
| for the path from it to the other peer. Even if ECN is not used on | for the path from it to the other peer. Even if not setting ECN | |||
| the path to the peer, the endpoint MUST provide feedback about ECN | codepoints on packets it transmits, the endpoint SHOULD provide | |||
| markings received (if accessible). | feedback about ECN markings received (if accessible). | |||
| To verify both that a path supports ECN and the peer can provide ECN | To verify both that a path supports ECN and the peer can provide ECN | |||
| feedback, an endpoint MUST set the ECT(0) codepoint in the IP header | feedback, an endpoint sets the ECT(0) codepoint in the IP header of | |||
| of all outgoing packets [RFC8311]. | all outgoing packets [RFC8311]. | |||
| If an ECT codepoint set in the IP header is not corrupted by a | If an ECT codepoint set in the IP header is not corrupted by a | |||
| network device, then a received packet contains either the codepoint | network device, then a received packet contains either the codepoint | |||
| sent by the peer or the Congestion Experienced (CE) codepoint set by | sent by the peer or the Congestion Experienced (CE) codepoint set by | |||
| a network device that is experiencing congestion. | a network device that is experiencing congestion. | |||
| If a packet sent with an ECT codepoint is newly acknowledged by the | If a QUIC packet sent with an ECT codepoint is newly acknowledged by | |||
| peer in an ACK frame without ECN feedback, the endpoint stops setting | the peer in an ACK frame without ECN feedback, the endpoint stops | |||
| ECT codepoints in subsequent packets, with the expectation that | setting ECT codepoints in subsequent IP packets, with the expectation | |||
| either the network or the peer no longer supports ECN. | that either the network path or the peer no longer supports ECN. | |||
| To protect the connection from arbitrary corruption of ECN codepoints | Network devices that corrupt or apply non-standard ECN markings might | |||
| by the network, an endpoint verifies the following when an ACK frame | result in reduced throughput or other undesirable side-effects. To | |||
| is received: | reduce this risk, an endpoint uses the following steps to verify the | |||
| counts it receives in an ACK frame. Counts MUST NOT be verified if | ||||
| the ACK frame does not increase the largest received packet number at | ||||
| the endpoint. | ||||
| o The increase in ECT(0) and ECT(1) counters MUST be at least the | o The total increase in ECT(0), ECT(1), and CE counts MUST be no | |||
| number of packets newly acknowledged that were sent with the | smaller than the total number of QUIC packets sent with an ECT | |||
| corresponding codepoint. | codepoint that are newly acknowledged in this ACK frame. This | |||
| step detects any network remarking from ECT(0), ECT(1), or CE | ||||
| codepoints to Not-ECT. | ||||
| o The total increase in ECT(0), ECT(1), and CE counters reported in | o Any increase in either ECT(0) or ECT(1) counts, plus any increase | |||
| the ACK frame MUST be at least the total number of packets newly | in the CE count, MUST be no smaller than the number of packets | |||
| acknowledged in this ACK frame. | sent with the corresponding ECT codepoint that are newly | |||
| acknowledged in this ACK frame. This step detects any erroneous | ||||
| network remarking from ECT(0) to ECT(1) (or vice versa). | ||||
| An endpoint could miss acknowledgements for a packet when ACK frames | An endpoint could miss acknowledgements for a packet when ACK frames | |||
| are lost. It is therefore possible for the total increase in ECT(0), | are lost. It is therefore possible for the total increase in ECT(0), | |||
| ECT(1), and CE counters to be greater than the number of packets | ECT(1), and CE counts to be greater than the number of packets | |||
| acknowledged in an ACK frame. When this happens, the local reference | acknowledged in an ACK frame. When this happens, and if verification | |||
| counts MUST be increased to match the counters in the ACK frame. | succeeds, the local reference counts MUST be increased to match the | |||
| counts in the ACK frame. | ||||
| Upon successful verification, an endpoint continues to set ECT | Upon successful verification, an endpoint continues to set ECT | |||
| codepoints in subsequent packets with the expectation that the path | codepoints in subsequent packets with the expectation that the path | |||
| is ECN-capable. | is ECN-capable. | |||
| If verification fails, then the endpoint ceases setting ECT | If verification fails, then the endpoint ceases setting ECT | |||
| codepoints in subsequent packets with the expectation that either the | codepoints in subsequent IP packets with the expectation that either | |||
| network or the peer does not support ECN. | the network path or the peer does not support ECN. | |||
| If an endpoint sets ECT codepoints on outgoing packets and encounters | If an endpoint sets ECT codepoints on outgoing IP packets and | |||
| a retransmission timeout due to the absence of acknowledgments from | encounters a retransmission timeout due to the absence of | |||
| the peer (see [QUIC-RECOVERY]), or if an endpoint has reason to | acknowledgments from the peer (see [QUIC-RECOVERY]), or if an | |||
| believe that a network element might be corrupting ECN codepoints, | endpoint has reason to believe that an element on the network path | |||
| the endpoint MAY cease setting ECT codepoints in subsequent packets. | might be corrupting ECN codepoints, the endpoint MAY cease setting | |||
| Doing so allows the connection to traverse network elements that drop | ECT codepoints in subsequent packets. Doing so allows the connection | |||
| or corrupt ECN codepoints in the IP header. | to be resilient to network elements that corrupt ECN codepoints in | |||
| the IP header or drop packets with ECT or CE codepoints in the IP | ||||
| header. | ||||
| 14. Packet Size | 14. Packet Size | |||
| The QUIC packet size includes the QUIC header and integrity check, | The QUIC packet size includes the QUIC header and protected payload, | |||
| but not the UDP or IP header. | but not the UDP or IP header. | |||
| Clients MUST ensure that the first Initial packet they send is sent | Clients MUST ensure they send the first Initial packet in single IP | |||
| in a UDP datagram that is at least 1200 octets. Padding the Initial | packet. Similarly, the first Initial packet sent after receiving a | |||
| packet or including a 0-RTT packet in the same datagram are ways to | Retry packet MUST be sent in a single IP packet. | |||
| meet this requirement. Sending a UDP datagram of this size ensures | ||||
| that the network path supports a reasonable Maximum Transmission Unit | ||||
| (MTU), and helps reduce the amplitude of amplification attacks caused | ||||
| by server responses toward an unverified client address, see | ||||
| Section 8. | ||||
| The payload of a UDP datagram carrying the Initial packet MUST be | The payload of a UDP datagram carrying the first Initial packet MUST | |||
| expanded to at least 1200 octets, by adding PADDING frames to the | be expanded to at least 1200 bytes, by adding PADDING frames to the | |||
| Initial packet and/or by combining the Initial packet with a 0-RTT | Initial packet and/or by combining the Initial packet with a 0-RTT | |||
| packet (see Section 12.2). | packet (see Section 12.2). Sending a UDP datagram of this size | |||
| ensures that the network path supports a reasonable Maximum | ||||
| Transmission Unit (MTU), and helps reduce the amplitude of | ||||
| amplification attacks caused by server responses toward an unverified | ||||
| client address, see Section 8. | ||||
| The datagram containing the first Initial packet from a client MAY | The datagram containing the first Initial packet from a client MAY | |||
| exceed 1200 octets if the client believes that the Path Maximum | exceed 1200 bytes if the client believes that the Path Maximum | |||
| Transmission Unit (PMTU) supports the size that it chooses. | Transmission Unit (PMTU) supports the size that it chooses. | |||
| A server MAY send a CONNECTION_CLOSE frame with error code | A server MAY send a CONNECTION_CLOSE frame with error code | |||
| PROTOCOL_VIOLATION in response to the first Initial packet it | PROTOCOL_VIOLATION in response to the first Initial packet it | |||
| receives from a client if the UDP datagram is smaller than 1200 | receives from a client if the UDP datagram is smaller than 1200 | |||
| octets. It MUST NOT send any other frame type in response, or | bytes. It MUST NOT send any other frame type in response, or | |||
| otherwise behave as if any part of the offending packet was processed | otherwise behave as if any part of the offending packet was processed | |||
| as valid. | as valid. | |||
| 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.1. Path Maximum Transmission Unit | 14.1. Path Maximum Transmission Unit (PMTU) | |||
| 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 IP | |||
| entire IP header, UDP header, and UDP payload. The UDP payload | header, UDP header, and UDP payload. The UDP payload includes the | |||
| includes the QUIC packet header, protected payload, and any | QUIC packet header, protected payload, and any authentication fields. | |||
| authentication fields. | The PMTU can depend upon the current path characteristics. | |||
| Therefore, the current largest UDP payload an implementation will | ||||
| send is referred to as the QUIC maximum packet size. | ||||
| All QUIC packets SHOULD be sized to fit within the estimated PMTU to | QUIC depends on a PMTU of at least 1280 bytes. This is the IPv6 | |||
| avoid IP fragmentation or packet drops. To optimize bandwidth | minimum size [RFC8200] and is also supported by most modern IPv4 | |||
| efficiency, endpoints SHOULD use Packetization Layer PMTU Discovery | networks. All QUIC packets (except for PMTU probe packets) SHOULD be | |||
| ([PLPMTUD]). Endpoints MAY use PMTU Discovery ([PMTUDv4], [PMTUDv6]) | sized to fit within the maximum packet size to avoid the packet being | |||
| for detecting the PMTU, setting the PMTU appropriately, and storing | fragmented or dropped [RFC8085]. | |||
| the result of previous PMTU determinations. | ||||
| In the absence of these mechanisms, QUIC endpoints SHOULD NOT send IP | An endpoint SHOULD use Datagram Packetization Layer PMTU Discovery | |||
| packets larger than 1280 octets. Assuming the minimum IP header | ([DPLPMTUD]) or implement Path MTU Discovery (PMTUD) [RFC1191] | |||
| size, this results in a QUIC packet size of 1232 octets for IPv6 and | [RFC8201] to determine whether the path to a destination will support | |||
| 1252 octets for IPv4. Some QUIC implementations MAY be more | a desired message size without fragmentation. | |||
| conservative in computing allowed QUIC packet size given unknown | ||||
| tunneling overheads or IP header options. | ||||
| QUIC endpoints that implement any kind of PMTU discovery SHOULD | In the absence of these mechanisms, QUIC endpoints SHOULD NOT send IP | |||
| maintain an estimate for each combination of local and remote IP | packets larger than 1280 bytes. Assuming the minimum IP header size, | |||
| addresses. Each pairing of local and remote addresses could have a | this results in a QUIC maximum packet size of 1232 bytes for IPv6 and | |||
| different maximum MTU in the path. | 1252 bytes for IPv4. A QUIC implementation MAY be more conservative | |||
| in computing the QUIC maximum packet size to allow for unknown tunnel | ||||
| overheads or IP header options/extensions. | ||||
| QUIC depends on the network path supporting an MTU of at least 1280 | Each pair of local and remote addresses could have a different PMTU. | |||
| octets. This is the IPv6 minimum MTU and therefore also supported by | QUIC implementations that implement any kind of PMTU discovery | |||
| most modern IPv4 networks. An endpoint MUST NOT reduce its MTU below | therefore SHOULD maintain a maximum packet size for each combination | |||
| this number, even if it receives signals that indicate a smaller | of local and remote IP addresses. | |||
| limit might exist. | ||||
| If a QUIC endpoint determines that the PMTU between any pair of local | If a QUIC endpoint determines that the PMTU between any pair of local | |||
| and remote IP addresses has fallen below 1280 octets, it MUST | and remote IP addresses has fallen below the size needed to support | |||
| immediately cease sending QUIC packets on the affected path. This | the smallest allowed maximum packet size, it MUST immediately cease | |||
| could result in termination of the connection if an alternative path | sending QUIC packets, except for PMTU probe packets, on the affected | |||
| cannot be found. | path. An endpoint MAY terminate the connection if an alternative | |||
| path cannot be found. | ||||
| 14.1.1. IPv4 PMTU Discovery | 14.2. ICMP Packet Too Big Messages | |||
| Traditional ICMP-based path MTU discovery in IPv4 [PMTUDv4] is | PMTU discovery [RFC1191] [RFC8201] relies on reception of ICMP | |||
| potentially vulnerable to off-path attacks that successfully guess | messages (e.g., IPv6 Packet Too Big messages) that indicate when a | |||
| the IP/port 4-tuple and reduce the MTU to a bandwidth-inefficient | packet is dropped because it is larger than the local router MTU. | |||
| value. TCP connections mitigate this risk by using the (at minimum) | DPLPMTUD can also optionally use these messages. This use of ICMP | |||
| 8 bytes of transport header echoed in the ICMP message to validate | messages is potentially vulnerable to off-path attacks that | |||
| the TCP sequence number as valid for the current connection. | successfully guess the addresses used on the path and reduce the PMTU | |||
| However, as QUIC operates over UDP, in IPv4 the echoed information | to a bandwidth-inefficient value. | |||
| could consist only of the IP and UDP headers, which usually has | ||||
| insufficient entropy to mitigate off-path attacks. | ||||
| As a result, endpoints that implement PMTUD in IPv4 SHOULD take steps | An endpoint MUST ignore an ICMP message that claims the PMTU has | |||
| to mitigate this risk. For instance, an application could: | decreased below 1280 bytes. | |||
| o Set the IPv4 Don't Fragment (DF) bit on a small proportion of | The requirements for generating ICMP ([RFC1812], [RFC4443]) state | |||
| packets, so that most invalid ICMP messages arrive when there are | that the quoted packet should contain as much of the original packet | |||
| no DF packets outstanding, and can therefore be identified as | as possible without exceeding the minimum MTU for the IP version. | |||
| spurious. | The size of the quoted packet can actually be smaller, or the | |||
| information unintelligible, as described in Section 1.1 of | ||||
| [DPLPMTUD]. | ||||
| o Store additional information from the IP or UDP headers from DF | QUIC endpoints SHOULD validate ICMP messages to protect from off-path | |||
| packets (for example, the IP ID or UDP checksum) to further | injection as specified in [RFC8201] and Section 5.2 of [RFC8085]. | |||
| authenticate incoming Datagram Too Big messages. | This validation SHOULD use the quoted packet supplied in the payload | |||
| of an ICMP message to associate the message with a corresponding | ||||
| transport connection [DPLPMTUD]. | ||||
| o Any reduction in PMTU due to a report contained in an ICMP packet | ICMP message validation MUST include matching IP addresses and UDP | |||
| is provisional until QUIC's loss detection algorithm determines | ports [RFC8085] and, when possible, connection IDs to an active QUIC | |||
| that the packet is actually lost. | session. | |||
| 14.2. Special Considerations for Packetization Layer PMTU Discovery | Further validation can also be provided: | |||
| The PADDING frame provides a useful option for PMTU probe packets. | o An IPv4 endpoint could set the Don't Fragment (DF) bit on a small | |||
| PADDING frames generate acknowledgements, but they need not be | proportion of packets, so that most invalid ICMP messages arrive | |||
| delivered reliably. As a result, the loss of PADDING frames in probe | when there are no DF packets outstanding, and can therefore be | |||
| packets does not require delay-inducing retransmission. However, | identified as spurious. | |||
| PADDING frames do consume congestion window, which may delay the | ||||
| transmission of subsequent application data. | ||||
| When implementing the algorithm in Section 7.2 of [PLPMTUD], the | o An endpoint could store additional information from the IP or UDP | |||
| initial value of search_low SHOULD be consistent with the IPv6 | headers to use for validation (for example, the IP ID or UDP | |||
| minimum packet size. Paths that do not support this size cannot | checksum). | |||
| deliver Initial packets, and therefore are not QUIC-compliant. | ||||
| Section 7.3 of [PLPMTUD] discusses trade-offs between small and large | The endpoint SHOULD ignore all ICMP messages that fail validation. | |||
| increases in the size of probe packets. As QUIC probe packets need | ||||
| not contain application data, aggressive increases in probe size | An endpoint MUST NOT increase PMTU based on ICMP messages. Any | |||
| carry fewer consequences. | reduction in the QUIC maximum packet size MAY be provisional until | |||
| QUIC's loss detection algorithm determines that the quoted packet has | ||||
| actually been lost. | ||||
| 14.3. Datagram Packetization Layer PMTU Discovery | ||||
| Section 6.4 of [DPLPMTUD] provides considerations for implementing | ||||
| Datagram Packetization Layer PMTUD (DPLPMTUD) with QUIC. | ||||
| When implementing the algorithm in Section 5.3 of [DPLPMTUD], the | ||||
| initial value of BASE_PMTU SHOULD be consistent with the minimum QUIC | ||||
| packet size (1232 bytes for IPv6 and 1252 bytes for IPv4). | ||||
| PING and PADDING frames can be used to generate PMTU probe packets. | ||||
| These frames might not be retransmitted if a probe packet containing | ||||
| them is lost. However, these frames do consume congestion window, | ||||
| which could delay the transmission of subsequent application data. | ||||
| A PING frame can be included in a PMTU probe to ensure that a valid | ||||
| probe is acknowledged. | ||||
| The considerations for processing ICMP messages in the previous | ||||
| section also apply if these messages are used by DPLPMTUD. | ||||
| 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. | |||
| Other versions of QUIC might have different properties to this | Other versions of QUIC might have different properties to this | |||
| skipping to change at page 74, line 26 ¶ | skipping to change at page 76, line 26 ¶ | |||
| [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 octets 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 probably never represent a real | Reserved version numbers will probably never represent a real | |||
| protocol; a client MAY use one of these version numbers with the | protocol; a client MAY use one of these version numbers with the | |||
| expectation that the server will initiate version negotiation; a | expectation that the server will initiate version negotiation; a | |||
| server MAY advertise support for one of these versions and can expect | server MAY advertise support for one of these versions and can expect | |||
| that clients ignore the value. | that clients ignore the value. | |||
| [[RFC editor: please remove the remainder of this section before | [[RFC editor: please remove the remainder of this section before | |||
| skipping to change at page 75, line 9 ¶ | skipping to change at page 77, line 9 ¶ | |||
| transport-13 would be identified as 0xff00000D. | transport-13 would be identified as 0xff00000D. | |||
| Implementors are encouraged to register version numbers of QUIC that | Implementors are encouraged to register version numbers of QUIC that | |||
| they are using for private experimentation on the GitHub wiki at | they are using for private experimentation on the GitHub wiki at | |||
| <https://github.com/quicwg/base-drafts/wiki/QUIC-Versions>. | <https://github.com/quicwg/base-drafts/wiki/QUIC-Versions>. | |||
| 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 octets 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 octet 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 octets. 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 octets 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 summarizes | encode 6, 14, 30, or 62 bit values respectively. Table 4 summarizes | |||
| the encoding properties. | the encoding properties. | |||
| +------+--------+-------------+-----------------------+ | +------+--------+-------------+-----------------------+ | |||
| | 2Bit | Length | Usable Bits | Range | | | 2Bit | 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 | |||
| For example, the eight octet sequence c2 19 7c 5e ff 14 e8 8c (in | For example, the eight byte sequence c2 19 7c 5e ff 14 e8 8c (in | |||
| hexadecimal) decodes to the decimal value 151288809941952652; the | hexadecimal) decodes to the decimal value 151288809941952652; the | |||
| four octet sequence 9d 7f 3e 7d decodes to 494878333; the two octet | four byte sequence 9d 7f 3e 7d decodes to 494878333; the two byte | |||
| sequence 7b bd decodes to 15293; and the single octet 25 decodes to | sequence 7b bd decodes to 15293; and the single byte 25 decodes to 37 | |||
| 37 (as does the two octet sequence 40 25). | (as does the two byte sequence 40 25). | |||
| Error codes (Section 20) and versions Section 15 are described using | Error codes (Section 20) and versions Section 15 are described using | |||
| integers, but do not use this encoding. | integers, but do not use 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 in long and short packet headers are encoded as | Packet numbers in long and short packet headers are encoded in 1 to 4 | |||
| follows. The number of bits required to represent the packet number | bytes. The number of bits required to represent the packet number is | |||
| is first reduced by including only a variable number of the least | reduced by including the least significant bits of the packet number. | |||
| significant bits of the packet number. One or two of the most | ||||
| significant bits of the first octet are then used to represent how | ||||
| many bits of the packet number are provided, as shown in Table 5. | ||||
| +---------------------+----------------+--------------+ | ||||
| | First octet pattern | Encoded Length | Bits Present | | ||||
| +---------------------+----------------+--------------+ | ||||
| | 0b0xxxxxxx | 1 octet | 7 | | ||||
| | | | | | ||||
| | 0b10xxxxxx | 2 | 14 | | ||||
| | | | | | ||||
| | 0b11xxxxxx | 4 | 30 | | ||||
| +---------------------+----------------+--------------+ | ||||
| Table 5: Packet Number Encodings for Packet Headers | ||||
| Note that these encodings are similar to those in Section 16, but use | ||||
| different values. | ||||
| Finally, the encoded packet number is protected as described in | The encoded packet number is protected as described in Section 5.4 of | |||
| Section 5.3 of [QUIC-TLS]. | [QUIC-TLS]. | |||
| The sender MUST use a packet number size able to represent more than | The sender MUST use a packet number size able to represent more than | |||
| twice as large a range than the difference between the largest | twice as large a range than the difference between the largest | |||
| acknowledged packet and packet number being sent. A peer receiving | acknowledged packet and packet number being sent. A peer receiving | |||
| the packet will then correctly decode the packet number, unless the | the packet will then correctly decode the packet number, unless the | |||
| packet is delayed in transit such that it arrives after many higher- | packet is delayed in transit such that it arrives after many higher- | |||
| numbered packets have been received. An endpoint SHOULD use a large | numbered packets have been received. An endpoint SHOULD use a large | |||
| enough packet number encoding to allow the packet number to be | enough packet number encoding to allow the packet number to be | |||
| recovered even if the packet arrives after packets that are sent | recovered even if the packet arrives after packets that are sent | |||
| afterwards. | afterwards. | |||
| As a result, the size of the packet number encoding is at least one | As a result, the size of the packet number encoding is at least one | |||
| more than the base 2 logarithm of the number of contiguous | bit more than the base-2 logarithm of the number of contiguous | |||
| unacknowledged packet numbers, including the new packet. | unacknowledged packet numbers, including the new packet. | |||
| For example, if an endpoint has received an acknowledgment for packet | For example, if an endpoint has received an acknowledgment for packet | |||
| 0x6afa2f, sending a packet with a number of 0x6b2d79 requires a | 0xabe8bc, sending a packet with a number of 0xac5c02 requires a | |||
| packet number encoding with 14 bits or more; whereas the 30-bit | packet number encoding with 16 bits or more; whereas the 24-bit | |||
| packet number encoding is needed to send a packet with a number of | packet number encoding is needed to send a packet with a number of | |||
| 0x6bc107. | 0xace8fe. | |||
| 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 on a | value of those bits, and the largest packet number received on 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 remove packet protection. | |||
| Once packet number protection is removed, the packet number is | Once header protection is removed, the packet number is decoded by | |||
| decoded by finding the packet number value that is closest to the | finding the packet number value that is closest to the next expected | |||
| next expected packet. The next expected packet is the highest | packet. The next expected packet is the highest received packet | |||
| received packet number plus one. For example, if the highest | number plus one. For example, if the highest successfully | |||
| successfully authenticated packet had a packet number of 0xaa82f30e, | authenticated packet had a packet number of 0xa82f30ea, then a packet | |||
| then a packet containing a 14-bit value of 0x9b3 will be decoded as | containing a 16-bit value of 0x9b32 will be decoded as 0xa82f9b32. | |||
| 0xaa8309b3. Example pseudo-code for packet number decoding can be | Example pseudo-code for packet number decoding can be found in | |||
| found in Appendix A. | Appendix A. | |||
| 17.2. Long Header Packet | 17.2. Long Header Packet | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1| Type (7) | | |1|1|T T|R R|P P| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | |DCIL(4)|SCIL(4)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0/32..144) ... | | Destination Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Source Connection ID (0/32..144) ... | | Source Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (i) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) | | | Packet Number (8/16/24/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 10: Long Header Packet Format | Figure 10: 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 | |||
| completion of version negotiation and establishment of 1-RTT keys. | completion of version negotiation and establishment of 1-RTT keys. | |||
| Once both conditions are met, a sender switches to sending packets | Once both conditions are met, a sender switches to sending packets | |||
| using the short header (Section 17.3). The long form allows for | using the short header (Section 17.3). The long form allows for | |||
| special packets - such as the Version Negotiation packet - to be | special packets - such as the Version Negotiation packet - to be | |||
| represented in this uniform fixed-length packet format. Packets that | represented in this uniform fixed-length packet format. Packets that | |||
| use the long header contain the following fields: | use the long header contain the following fields: | |||
| Header Form: The most significant bit (0x80) of octet 0 (the first | Header Form: The most significant bit (0x80) of byte 0 (the first | |||
| octet) is set to 1 for long headers. | byte) is set to 1 for long headers. | |||
| Long Packet Type: The remaining seven bits of octet 0 contain the | Fixed Bit: The next bit (0x40) of byte 0 is set to 1. Packets | |||
| packet type. This field can indicate one of 128 packet types. | containing a zero value for this bit are not valid packets in this | |||
| The types specified for this version are listed in Table 6. | version and MUST be discarded. | |||
| Version: The QUIC Version is a 32-bit field that follows the Type. | Long Packet Type (T): The next two bits (those with a mask of 0x30) | |||
| This field indicates which version of QUIC is in use and | of byte 0 contain a packet type. Packet types are listed in | |||
| Table 5. | ||||
| Reserved Bits (R): The next two bits (those with a mask of 0x0c) of | ||||
| byte 0 are reserved. These bits are protected using header | ||||
| protection (see Section 5.4 of [QUIC-TLS]). The value 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 after | ||||
| removing protection as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| Packet Number Length (P): The least significant two bits (those with | ||||
| a 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 | ||||
| length of the packet number field in bytes. That is, the length | ||||
| of the packet number field is the value of this field, plus one. | ||||
| These bits are protected using header protection (see Section 5.4 | ||||
| of [QUIC-TLS]). | ||||
| Version: The QUIC Version is a 32-bit field that follows the first | ||||
| byte. This field indicates which version of QUIC is in use and | ||||
| determines how the rest of the protocol fields are interpreted. | determines how the rest of the protocol fields are interpreted. | |||
| DCIL and SCIL: The octet following the version contains the lengths | DCIL and SCIL: The byte following the version contains the lengths | |||
| of the two connection ID fields that follow it. These lengths are | of the two connection ID fields that follow it. These lengths are | |||
| encoded as two 4-bit unsigned integers. The Destination | encoded as two 4-bit unsigned integers. The Destination | |||
| Connection ID Length (DCIL) field occupies the 4 high bits of the | Connection ID Length (DCIL) field occupies the 4 high bits of the | |||
| octet and the Source Connection ID Length (SCIL) field occupies | byte and the Source Connection ID Length (SCIL) field occupies the | |||
| the 4 low bits of the octet. An encoded length of 0 indicates | 4 low bits of the byte. An encoded length of 0 indicates that the | |||
| that the connection ID is also 0 octets in length. Non-zero | connection ID is also 0 bytes in length. Non-zero encoded lengths | |||
| encoded lengths are increased by 3 to get the full length of the | are increased by 3 to get the full length of the connection ID, | |||
| connection ID, producing a length between 4 and 18 octets | producing a length between 4 and 18 bytes inclusive. For example, | |||
| inclusive. For example, an octet with the value 0x50 describes an | an byte with the value 0x50 describes an 8-byte Destination | |||
| 8-octet Destination Connection ID and a zero-length Source | Connection ID and a zero-length Source Connection ID. | |||
| Connection ID. | ||||
| Destination Connection ID: The Destination Connection ID field | Destination Connection ID: The Destination Connection ID field | |||
| follows the connection ID lengths and is either 0 octets in length | follows the connection ID lengths and is either 0 bytes in length | |||
| or between 4 and 18 octets. Section 7.2 describes the use of this | or between 4 and 18 bytes. Section 7.2 describes the use of this | |||
| field in more detail. | field in more detail. | |||
| Source Connection ID: The Source Connection ID field follows the | Source Connection ID: The Source Connection ID field follows the | |||
| Destination Connection ID and is either 0 octets in length or | Destination Connection ID and is either 0 bytes in length or | |||
| between 4 and 18 octets. Section 7.2 describes the use of this | between 4 and 18 bytes. Section 7.2 describes the use of this | |||
| field in more detail. | field in more detail. | |||
| Length: The length of the remainder of the packet (that is, the | Length: The length of the remainder of the packet (that is, the | |||
| Packet Number and Payload fields) in octets, encoded as a | Packet Number and Payload fields) in bytes, encoded as a variable- | |||
| variable-length integer (Section 16). | length integer (Section 16). | |||
| Packet Number: The packet number field is 1, 2, or 4 octets long. | Packet Number: The packet number field is 1 to 4 bytes long. The | |||
| The packet number has confidentiality protection separate from | packet number has confidentiality protection separate from packet | |||
| packet protection, as described in Section 5.3 of [QUIC-TLS]. The | protection, as described in Section 5.4 of [QUIC-TLS]. The length | |||
| length of the packet number field is encoded in the plaintext | of the packet number field is encoded in the plaintext packet | |||
| packet number. See Section 17.1 for details. | number. See Section 17.1 for details. | |||
| Payload: The payload of the packet. | Payload: The payload of the packet. | |||
| The following packet types are defined: | The following packet types are defined: | |||
| +------+-----------------+--------------+ | +------+-----------------+--------------+ | |||
| | Type | Name | Section | | | Type | Name | Section | | |||
| +------+-----------------+--------------+ | +------+-----------------+--------------+ | |||
| | 0x7F | Initial | Section 17.5 | | | 0x0 | Initial | Section 17.5 | | |||
| | | | | | | | | | | |||
| | 0x7E | Retry | Section 17.7 | | | 0x1 | 0-RTT Protected | Section 12.1 | | |||
| | | | | | | | | | | |||
| | 0x7D | Handshake | Section 17.6 | | | 0x2 | Handshake | Section 17.6 | | |||
| | | | | | | | | | | |||
| | 0x7C | 0-RTT Protected | Section 12.1 | | | 0x3 | Retry | Section 17.7 | | |||
| +------+-----------------+--------------+ | +------+-----------------+--------------+ | |||
| Table 6: Long Header Packet Types | Table 5: Long Header Packet Types | |||
| The header form, type, connection ID lengths octet, destination and | The header form bit, connection ID lengths byte, Destination and | |||
| source connection IDs, and version fields of a long header packet are | Source Connection ID fields, and Version fields of a long header | |||
| version-independent. The packet number and values for packet types | packet are version-independent. The other fields in the first byte, | |||
| defined in Table 6 are version-specific. See [QUIC-INVARIANTS] for | plus the Length and Packet Number fields are version-specific. See | |||
| details on how packets from different versions of QUIC are | [QUIC-INVARIANTS] for details on how packets from different versions | |||
| interpreted. | of QUIC are interpreted. | |||
| The interpretation of the fields and the payload are specific to a | The interpretation of the fields and the payload are specific to a | |||
| version and packet type. Type-specific semantics for this version | version and packet type. Type-specific semantics for this version | |||
| are described in the following sections. | are described in the following sections. | |||
| The end of the packet is determined by the Length field. The Length | The end of the packet is determined by the Length field. The Length | |||
| field covers both the Packet Number and Payload fields, both of which | field covers both the Packet Number and Payload fields, both of which | |||
| are confidentiality protected and initially of unknown length. The | are confidentiality protected and initially of unknown length. The | |||
| size of the Payload field is learned once the packet number | length of the Payload field is learned once header protection is | |||
| protection is removed. The Length field enables packet coalescing | removed. The Length field enables packet coalescing (Section 12.2). | |||
| (Section 12.2). | ||||
| 17.3. Short Header Packet | 17.3. Short Header Packet | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |0|K|1|1|0|R R R| | |0|1|S|R|R|K|P P| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0..144) ... | | Destination Connection ID (0..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) ... | | Packet Number (8/16/24/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Protected Payload (*) ... | | Protected Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 11: Short Header Packet Format | Figure 11: Short Header Packet Format | |||
| The short header can be used after the version and 1-RTT keys are | The short header can be used after the version and 1-RTT keys are | |||
| negotiated. Packets that use the short header contain the following | negotiated. Packets that use the short header contain the following | |||
| fields: | fields: | |||
| Header Form: The most significant bit (0x80) of octet 0 is set to 0 | Header Form: The most significant bit (0x80) of byte 0 is set to 0 | |||
| for the short header. | for the short header. | |||
| Key Phase Bit: The second bit (0x40) of octet 0 indicates the key | Fixed Bit: The next bit (0x40) of byte 0 is set to 1. Packets | |||
| phase, which allows a recipient of a packet to identify the packet | containing a zero value for this bit are not valid packets in this | |||
| protection keys that are used to protect the packet. See | version and MUST be discarded. | |||
| [QUIC-TLS] for details. | ||||
| [[Editor's Note: this section should be removed and the bit | ||||
| definitions changed before this draft goes to the IESG.]] | ||||
| Third Bit: The third bit (0x20) of octet 0 is set to 1. | ||||
| [[Editor's Note: this section should be removed and the bit | ||||
| definitions changed before this draft goes to the IESG.]] | ||||
| Fourth Bit: The fourth bit (0x10) of octet 0 is set to 1. | Spin Bit (S): The sixth bit (0x20) of byte 0 is the Latency Spin | |||
| Bit, set as described in [SPIN]. | ||||
| [[Editor's Note: this section should be removed and the bit | Reserved Bits (R): The next two bits (those with a mask of 0x18) of | |||
| definitions changed before this draft goes to the IESG.]] | byte 0 are reserved. These bits are protected using header | |||
| protection (see Section 5.4 of [QUIC-TLS]). The value 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 after | ||||
| removing protection as a connection error of type | ||||
| PROTOCOL_VIOLATION. | ||||
| Google QUIC Demultiplexing Bit: The fifth bit (0x8) of octet 0 is | Key Phase (K): The next bit (0x04) of byte 0 indicates the key | |||
| set to 0. This allows implementations of Google QUIC to | phase, which allows a recipient of a packet to identify the packet | |||
| distinguish Google QUIC packets from short header packets sent by | protection keys that are used to protect the packet. See | |||
| a client because Google QUIC servers expect the connection ID to | [QUIC-TLS] for details. This bit is protected using header | |||
| always be present. The special interpretation of this bit SHOULD | protection (see Section 5.4 of [QUIC-TLS]). | |||
| be removed from this specification when Google QUIC has finished | ||||
| transitioning to the new header format. | ||||
| Reserved: The sixth, seventh, and eighth bits (0x7) of octet 0 are | Packet Number Length (P): The least significant two bits (those with | |||
| reserved for experimentation. Endpoints MUST ignore these bits on | a mask of 0x03) of byte 0 contain the length of the packet number, | |||
| packets they receive unless they are participating in an | encoded as an unsigned, two-bit integer that is one less than the | |||
| experiment that uses these bits. An endpoint not actively using | length of the packet number field in bytes. That is, the length | |||
| these bits SHOULD set the value randomly on packets they send to | of the packet number field is the value of this field, plus one. | |||
| protect against unwanted inference about particular values. | These bits are protected using header protection (see Section 5.4 | |||
| 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, 2, or 4 octets long. | Packet Number: The packet number field is 1 to 4 bytes long. The | |||
| The packet number has confidentiality protection separate from | packet number has confidentiality protection separate from packet | |||
| packet protection, as described in Section 5.3 of [QUIC-TLS]. The | protection, as described in Section 5.4 of [QUIC-TLS]. The length | |||
| length of the packet number field is encoded in the plaintext | of the packet number field is encoded in Packet Number Length | |||
| packet number. See Section 17.1 for details. | field. See Section 17.1 for details. | |||
| Protected Payload: Packets with a short header always include a | Protected Payload: Packets with a short header always include a | |||
| 1-RTT protected payload. | 1-RTT protected payload. | |||
| The header form and connection ID field of a short header packet are | The header form bit and the connection ID field of a short header | |||
| version-independent. The remaining fields are specific to the | packet are version-independent. The remaining fields are specific to | |||
| selected QUIC version. See [QUIC-INVARIANTS] for details on how | the selected QUIC version. See [QUIC-INVARIANTS] for details on how | |||
| packets from different versions of QUIC are interpreted. | packets from different versions of QUIC are interpreted. | |||
| 17.4. Version Negotiation Packet | 17.4. Version Negotiation Packet | |||
| A Version Negotiation packet is inherently not version-specific, and | A Version Negotiation packet is inherently not version-specific, and | |||
| does not use the long packet header (see Section 17.2). Upon receipt | does not use the long packet header (see Section 17.2). Upon receipt | |||
| by a client, it will appear to be a packet using the long header, but | by a client, it will appear to be a packet using the long header, but | |||
| will be identified as a Version Negotiation packet based on the | will be identified as a Version Negotiation packet based on the | |||
| Version field having a value of 0. | Version field having a value of 0. | |||
| skipping to change at page 82, line 35 ¶ | skipping to change at page 84, line 30 ¶ | |||
| The Version Negotiation packet does not include the Packet Number and | The Version Negotiation packet does not include the Packet Number and | |||
| Length fields present in other packets that use the long header form. | Length fields present in other packets that use the long header form. | |||
| Consequently, a Version Negotiation packet consumes an entire UDP | Consequently, a Version Negotiation packet consumes an entire UDP | |||
| datagram. | datagram. | |||
| See Section 6 for a description of the version negotiation process. | See Section 6 for a description of the version negotiation process. | |||
| 17.5. Initial Packet | 17.5. Initial Packet | |||
| An Initial packet uses long headers with a type value of 0x7F. It | An Initial packet uses long headers with a type value of 0x0. 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 carries ACKs in either direction. | |||
| 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 on-path attackers, but | provide confidentiality or integrity against on-path attackers, but | |||
| provides some level of protection against off-path attackers. | provides some level of protection against off-path attackers. | |||
| An Initial packet (shown in Figure 13) has two additional header | An Initial packet (shown in Figure 13) has two additional header | |||
| fields that are added to the Long Header before the Length field. | fields that are added to the Long Header before the Length field. | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1| 0x7f | | |1|1| 0 |R R|P P| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | |DCIL(4)|SCIL(4)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0/32..144) ... | | Destination Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Source Connection ID (0/32..144) ... | | Source Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Token Length (i) ... | | Token Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Token (*) ... | | Token (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (i) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Packet Number (8/16/32) | | | Packet Number (8/16/24/32) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Payload (*) ... | | Payload (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 13: Initial Packet | Figure 13: Initial Packet | |||
| These fields include the token that was previously provided in a | These fields include the token that was previously provided in a | |||
| Retry packet or NEW_TOKEN frame: | Retry packet or NEW_TOKEN frame: | |||
| Token Length: A variable-length integer specifying the length of the | Token Length: A variable-length integer specifying the length of the | |||
| skipping to change at page 84, line 24 ¶ | skipping to change at page 86, line 24 ¶ | |||
| single UDP datagram (see Section 7). The first CRYPTO frame sent | single UDP datagram (see Section 7). The first CRYPTO frame sent | |||
| always begins at an offset of 0 (see Section 7). | always begins at an offset of 0 (see Section 7). | |||
| Note that if the server sends a HelloRetryRequest, the client will | Note that if the server sends a HelloRetryRequest, the client will | |||
| send a second Initial packet. This Initial packet will continue the | send a second Initial packet. This Initial packet will continue the | |||
| cryptographic handshake and will contain a CRYPTO frame with an | cryptographic handshake and will contain a CRYPTO frame with an | |||
| offset matching the size of the CRYPTO frame sent in the first | offset matching the size of the CRYPTO frame sent in the first | |||
| Initial packet. Cryptographic handshake messages subsequent to the | Initial packet. Cryptographic handshake messages subsequent to the | |||
| first do not need to fit within a single UDP datagram. | first do not need to fit within a single UDP datagram. | |||
| 17.5.1. Starting Packet Numbers | 17.5.1. Abandoning Initial Packets | |||
| A client stops both sending and processing Initial packets when it | ||||
| sends its first Handshake packet. A server stops sending and | ||||
| processing Initial packets when it receives its first Handshake | ||||
| packet. Though packets might still be in flight or awaiting | ||||
| acknowledgment, no further Initial packets need to be exchanged | ||||
| beyond this point. Initial packet protection keys are discarded (see | ||||
| Section 4.10 of [QUIC-TLS]) along with any loss recovery and | ||||
| congestion control state (see Sections 5.3.1.2 and 6.9 of | ||||
| [QUIC-RECOVERY]). | ||||
| Any data in CRYPTO frames is discarded - and no longer retransmitted | ||||
| - when Initial keys are discarded. | ||||
| 17.5.2. Starting Packet Numbers | ||||
| The first Initial packet sent by either endpoint contains a packet | The first Initial packet sent by either endpoint contains a packet | |||
| number of 0. The packet number MUST increase monotonically | number of 0. The packet number MUST increase monotonically | |||
| thereafter. Initial packets are in a different packet number space | thereafter. Initial packets are in a different packet number space | |||
| to other packets (see Section 12.3). | to other packets (see Section 12.3). | |||
| 17.5.2. 0-RTT Packet Numbers | 17.5.3. 0-RTT Packet Numbers | |||
| Packet numbers for 0-RTT protected packets use the same space as | Packet numbers for 0-RTT protected packets use the same space as | |||
| 1-RTT protected packets. | 1-RTT protected packets. | |||
| After a client receives a Retry or Version Negotiation packet, 0-RTT | After a client receives a Retry or Version Negotiation packet, 0-RTT | |||
| packets are likely to have been lost or discarded by the server. A | packets are likely to have been lost or discarded by the server. A | |||
| client MAY attempt to resend data in 0-RTT packets after it sends a | client MAY attempt to resend data in 0-RTT packets after it sends a | |||
| new Initial packet. | new Initial packet. | |||
| A client MUST NOT reset the packet number it uses for 0-RTT packets. | A client MUST NOT reset the packet number it uses for 0-RTT packets. | |||
| skipping to change at page 85, line 19 ¶ | skipping to change at page 87, line 34 ¶ | |||
| to use a longer packet number encoding. | to use a longer packet number encoding. | |||
| A client SHOULD instead generate a fresh cryptographic handshake | A client SHOULD instead generate a fresh cryptographic handshake | |||
| message and start packet numbers from 0. This ensures that new 0-RTT | message and start packet numbers from 0. This ensures that new 0-RTT | |||
| packets will not use the same keys, avoiding any risk of key and | packets will not use the same keys, avoiding any risk of key and | |||
| nonce reuse; this also prevents 0-RTT packets from previous handshake | nonce reuse; this also prevents 0-RTT packets from previous handshake | |||
| attempts from being accepted as part of the connection. | attempts from being accepted as part of the connection. | |||
| 17.6. Handshake Packet | 17.6. Handshake Packet | |||
| A Handshake packet uses long headers with a type value of 0x7D. It | A Handshake packet uses long headers with a type value of 0x2. It is | |||
| is used to carry acknowledgments and cryptographic handshake messages | used to carry acknowledgments and cryptographic handshake messages | |||
| from the server and client. | from the server and client. | |||
| Once a client has received a Handshake packet from a server, it uses | Once a client has received a Handshake packet from a server, it uses | |||
| Handshake packets to send subsequent cryptographic handshake messages | Handshake packets to send subsequent cryptographic handshake messages | |||
| and acknowledgments to the server. | and acknowledgments to the server. | |||
| The Destination Connection ID field in a Handshake packet contains a | The Destination Connection ID field in a Handshake packet contains a | |||
| connection ID that is chosen by the recipient of the packet; the | connection ID that is chosen by the recipient of the packet; the | |||
| Source Connection ID includes the connection ID that the sender of | Source Connection ID includes the connection ID that the sender of | |||
| the packet wishes to use (see Section 7.2). | the packet wishes to use (see Section 7.2). | |||
| The first Handshake packet sent by a server contains a packet number | The first Handshake packet sent by a server contains a packet number | |||
| of 0. Handshake packets are their own packet number space. Packet | of 0. Handshake packets are their own packet number space. Packet | |||
| numbers are incremented normally for other Handshake packets. | numbers are incremented normally for other Handshake packets. | |||
| The payload of this packet contains CRYPTO frames and could contain | The payload of this packet contains CRYPTO frames and could contain | |||
| PADDING, or ACK frames. Handshake packets MAY contain | PADDING, or ACK frames. Handshake packets MAY contain | |||
| CONNECTION_CLOSE or APPLICATION_CLOSE frames. Endpoints MUST treat | CONNECTION_CLOSE frames. Endpoints MUST treat receipt of Handshake | |||
| receipt of Handshake packets with other frames as a connection error. | packets with other frames as a connection error. | |||
| Like Initial packets (see Section 17.5.1), data in CRYPTO frames at | ||||
| the Handshake encryption level is discarded - and no longer | ||||
| retransmitted - when Handshake protection keys are discarded. | ||||
| 17.7. Retry Packet | 17.7. Retry Packet | |||
| A Retry packet uses a long packet header with a type value of 0x7E. | A Retry packet uses a long packet header with a type value of 0x3. | |||
| It carries an address validation token created by the server. It is | It carries an address validation token created by the server. It is | |||
| used by a server that wishes to perform a stateless retry (see | used by a server that wishes to perform a stateless retry (see | |||
| Section 8.1). | Section 8.1). | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
| |1| 0x7e | | |1|1| 3 |ODCIL(4| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Version (32) | | | Version (32) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |DCIL(4)|SCIL(4)| | |DCIL(4)|SCIL(4)| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Destination Connection ID (0/32..144) ... | | Destination Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Source Connection ID (0/32..144) ... | | Source Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | ODCIL(8) | Original Destination Connection ID (*) | | | Original Destination Connection ID (0/32..144) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Retry Token (*) ... | | Retry Token (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 14: Retry Packet | Figure 14: Retry Packet | |||
| A Retry packet (shown in Figure 14) only uses the invariant portion | A Retry packet (shown in Figure 14) only uses the invariant portion | |||
| of the long packet header [QUIC-INVARIANTS]; that is, the fields up | of the long packet header [QUIC-INVARIANTS]; that is, the fields up | |||
| to and including the Destination and Source Connection ID fields. A | to and including the Destination and Source Connection ID fields. A | |||
| Retry packet does not contain any protected fields. Like Version | Retry packet does not contain any protected fields. Like Version | |||
| Negotiation, a Retry packet contains the long header including the | Negotiation, a Retry packet contains the long header including the | |||
| connection IDs, but omits the Length, Packet Number, and Payload | connection IDs, but omits the Length, Packet Number, and Payload | |||
| fields. These are replaced with: | fields. These are replaced with: | |||
| ODCIL: The length of the Original Destination Connection ID field. | ODCIL: The four least-significant bits of the first byte of a Retry | |||
| The length is encoded in the least significant 4 bits of the | packet are not protected as they are for other packets with the | |||
| octet, using the same encoding as the DCIL and SCIL fields. The | long header, because Retry packets don't contain a protected | |||
| most significant 4 bits of this octet are reserved. Unless a use | payload. These bits instead encode the length of the Original | |||
| for these bits has been negotiated, endpoints SHOULD send | Destination Connection ID field. The length uses the same | |||
| randomized values and MUST ignore any value that it receives. | encoding as the DCIL and SCIL fields. | |||
| Original Destination Connection ID: The Original Destination | Original Destination Connection ID: The Original Destination | |||
| Connection ID contains the value of the Destination Connection ID | Connection ID contains the value of the Destination Connection ID | |||
| from the Initial packet that this Retry is in response to. The | from the Initial packet that this Retry is in response to. The | |||
| length of this field is given in ODCIL. | length of this field is given in ODCIL. | |||
| 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. | |||
| The server populates the Destination Connection ID with the | The server populates the Destination Connection ID with the | |||
| skipping to change at page 87, line 39 ¶ | skipping to change at page 90, line 5 ¶ | |||
| 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 in the Retry | |||
| packet. Changing Destination Connection ID also results in a change | packet. Changing Destination Connection ID also results in a change | |||
| to the keys used to protect the Initial packet. It also sets the | to the keys used to protect the Initial packet. It also sets the | |||
| Token field to the token provided in the Retry. The client MUST NOT | Token field to the token provided in the Retry. The client MUST NOT | |||
| change the Source Connection ID because the server could include the | change the Source Connection ID because the server could include the | |||
| connection ID as part of its token validation logic (see | connection ID as part of its token validation logic (see | |||
| Section 8.1.2). | Section 8.1.2). | |||
| All subsequent Initial packets from the client MUST use the | The next Initial packet from the client uses the connection ID and | |||
| connection ID and token values from the Retry packet. Aside from | token values from the Retry packet (see Section 7.2). Aside from | |||
| this, the Initial packet sent by the client is subject to the same | this, the Initial packet sent by the client is subject to the same | |||
| restrictions as the first Initial packet. A client can either reuse | restrictions as the first Initial packet. A client can either reuse | |||
| the cryptographic handshake message or construct a new one at its | the cryptographic handshake message or construct a new one at its | |||
| discretion. | discretion. | |||
| A client MAY attempt 0-RTT after receiving a Retry packet by sending | A client MAY attempt 0-RTT after receiving a Retry packet by sending | |||
| 0-RTT packets to the connection ID provided by the server. A client | 0-RTT packets to the connection ID provided by the server. A client | |||
| that sends additional 0-RTT packets without constructing a new | that sends additional 0-RTT packets without constructing a new | |||
| cryptographic handshake message MUST NOT reset the packet number to 0 | cryptographic handshake message MUST NOT reset the packet number to 0 | |||
| after a Retry packet, see Section 17.5.2. | after a Retry packet, see Section 17.5.3. | |||
| A server acknowledges the use of a Retry packet for a connection | A server acknowledges the use of a Retry packet for a connection | |||
| using the original_connection_id transport parameter (see | using the original_connection_id transport parameter (see | |||
| Section 18.1). If the server sends a Retry packet, it MUST include | Section 18.1). If the server sends a Retry packet, it MUST include | |||
| the value of the Original Destination Connection ID field of the | the value of the Original Destination Connection ID field of the | |||
| Retry packet (that is, the Destination Connection ID field from the | Retry packet (that is, the Destination Connection ID field from the | |||
| client's first Initial packet) in the transport parameter. | client's first Initial packet) in the transport parameter. | |||
| If the client received and processed a Retry packet, it validates | If the client received and processed a Retry packet, it validates | |||
| that the original_connection_id transport parameter is present and | that the original_connection_id transport parameter is present and | |||
| skipping to change at page 89, line 8 ¶ | skipping to change at page 91, line 8 ¶ | |||
| 18. Transport Parameter Encoding | 18. Transport Parameter Encoding | |||
| The format of the transport parameters is the TransportParameters | The format of the transport parameters is the TransportParameters | |||
| struct from Figure 15. This is described using the presentation | struct from Figure 15. This is described using the presentation | |||
| language from Section 3 of [TLS13]. | language from Section 3 of [TLS13]. | |||
| uint32 QuicVersion; | uint32 QuicVersion; | |||
| enum { | enum { | |||
| initial_max_stream_data_bidi_local(0), | original_connection_id(0), | |||
| initial_max_data(1), | idle_timeout(1), | |||
| initial_max_bidi_streams(2), | stateless_reset_token(2), | |||
| idle_timeout(3), | max_packet_size(3), | |||
| preferred_address(4), | initial_max_data(4), | |||
| max_packet_size(5), | initial_max_stream_data_bidi_local(5), | |||
| stateless_reset_token(6), | initial_max_stream_data_bidi_remote(6), | |||
| ack_delay_exponent(7), | initial_max_stream_data_uni(7), | |||
| initial_max_uni_streams(8), | initial_max_streams_bidi(8), | |||
| disable_migration(9), | initial_max_streams_uni(9), | |||
| initial_max_stream_data_bidi_remote(10), | ack_delay_exponent(10), | |||
| initial_max_stream_data_uni(11), | max_ack_delay(11), | |||
| max_ack_delay(12), | disable_migration(12), | |||
| original_connection_id(13), | preferred_address(13), | |||
| (65535) | (65535) | |||
| } TransportParameterId; | } TransportParameterId; | |||
| struct { | struct { | |||
| TransportParameterId parameter; | TransportParameterId parameter; | |||
| opaque value<0..2^16-1>; | opaque value<0..2^16-1>; | |||
| } TransportParameter; | } TransportParameter; | |||
| struct { | struct { | |||
| select (Handshake.msg_type) { | select (Handshake.msg_type) { | |||
| case client_hello: | case client_hello: | |||
| QuicVersion initial_version; | QuicVersion initial_version; | |||
| case encrypted_extensions: | case encrypted_extensions: | |||
| QuicVersion negotiated_version; | QuicVersion negotiated_version; | |||
| QuicVersion supported_versions<4..2^8-4>; | QuicVersion supported_versions<4..2^8-4>; | |||
| }; | }; | |||
| TransportParameter parameters<0..2^16-1>; | TransportParameter parameters<0..2^16-1>; | |||
| } TransportParameters; | } TransportParameters; | |||
| struct { | ||||
| enum { IPv4(4), IPv6(6), (15) } ipVersion; | ||||
| opaque ipAddress<4..2^8-1>; | ||||
| uint16 port; | ||||
| opaque connectionId<0..18>; | ||||
| opaque statelessResetToken[16]; | ||||
| } PreferredAddress; | ||||
| Figure 15: Definition of TransportParameters | Figure 15: Definition of TransportParameters | |||
| The "extension_data" field of the quic_transport_parameters extension | The "extension_data" field of the quic_transport_parameters extension | |||
| defined in [QUIC-TLS] contains a TransportParameters value. TLS | defined in [QUIC-TLS] contains a TransportParameters value. TLS | |||
| encoding rules are therefore used to describe the encoding of | encoding rules are therefore used to describe the encoding of | |||
| transport parameters. | transport parameters. | |||
| QUIC encodes transport parameters into a sequence of octets, which | QUIC encodes transport parameters into a sequence of bytes, which are | |||
| are then included in the cryptographic handshake. | then included in the cryptographic handshake. | |||
| 18.1. Transport Parameter Definitions | 18.1. Transport Parameter Definitions | |||
| An endpoint MAY use the following transport parameters: | This section details the transport parameters defined in this | |||
| document. | ||||
| idle_timeout (0x0003): The idle timeout is a value in seconds that | Many transport parameters listed here have integer values. Those | |||
| is encoded as an unsigned 16-bit integer. If this parameter is | transport parameters that are identified as integers use a variable- | |||
| absent or zero then the idle timeout is disabled. | length integer encoding (see Section 16) and have a default value of | |||
| 0 if the transport parameter is absent, unless otherwise stated. | ||||
| max_packet_size (0x0005): The maximum packet size parameter places a | The following transport parameters are defined: | |||
| limit on the size of packets that the endpoint is willing to | ||||
| receive, encoded as an unsigned 16-bit integer. This indicates | ||||
| that packets larger than this limit will be dropped. The default | ||||
| for this parameter is the maximum permitted UDP payload of 65527. | ||||
| Values below 1200 are invalid. This limit only applies to | ||||
| protected packets (Section 12.1). | ||||
| ack_delay_exponent (0x0007): An 8-bit unsigned integer value | original_connection_id (0x0000): The value of the Destination | |||
| indicating an exponent used to decode the ACK Delay field in the | Connection ID field from the first Initial packet sent by the | |||
| ACK frame, see Section 19.15. If this value is absent, a default | client. This transport parameter is only sent by a server. A | |||
| value of 3 is assumed (indicating a multiplier of 8). The default | server MUST include the original_connection_id transport parameter | |||
| value is also used for ACK frames that are sent in Initial and | if it sent a Retry packet. | |||
| Handshake packets. Values above 20 are invalid. | ||||
| disable_migration (0x0009): The endpoint does not support connection | idle_timeout (0x0001): The idle timeout is a value in seconds that | |||
| migration (Section 9). Peers MUST NOT send any packets, including | is encoded as an integer. If this parameter is absent or zero | |||
| probing packets (Section 9.1), from a local address other than | then the idle timeout is disabled. | |||
| that used to perform the handshake. This parameter is a zero- | ||||
| length value. | ||||
| max_ack_delay (0x000c): An 8 bit unsigned integer value indicating | stateless_reset_token (0x0002): A stateless reset token is used in | |||
| the maximum amount of time in milliseconds by which the endpoint | verifying a stateless reset, see Section 10.4. This parameter is | |||
| will delay sending acknowledgments. If this value is absent, a | a sequence of 16 bytes. This transport parameter is only sent by | |||
| default of 25 milliseconds is assumed. | a server. | |||
| Either peer MAY advertise an initial value for flow control of each | max_packet_size (0x0003): The maximum packet size parameter is an | |||
| type of stream on which they might receive data. Each of the | integer value that limits the size of packets that the endpoint is | |||
| following transport parameters is encoded as an unsigned 32-bit | willing to receive. This indicates that packets larger than this | |||
| integer in units of octets: | limit will be dropped. The default for this parameter is the | |||
| maximum permitted UDP payload of 65527. Values below 1200 are | ||||
| invalid. This limit only applies to protected packets | ||||
| (Section 12.1). | ||||
| initial_max_stream_data_bidi_local (0x0000): The initial stream | initial_max_data (0x0004): The initial maximum data parameter is an | |||
| maximum data for bidirectional, locally-initiated streams | integer value that contains the initial value for the maximum | |||
| parameter contains the initial flow control limit for newly | amount of data that can be sent on the connection. This is | |||
| created bidirectional streams opened by the endpoint that sets the | equivalent to sending a MAX_DATA (Section 19.9) for the connection | |||
| transport parameter. In client transport parameters, this applies | immediately after completing the handshake. | |||
| to streams with an identifier ending in 0x0; in server transport | ||||
| parameters, this applies to streams ending in 0x1. | ||||
| initial_max_stream_data_bidi_remote (0x000a): The initial stream | initial_max_stream_data_bidi_local (0x0005): This parameter is an | |||
| maximum data for bidirectional, peer-initiated streams parameter | integer value specifying the initial flow control limit for | |||
| contains the initial flow control limit for newly created | locally-initiated bidirectional streams. This limit applies to | |||
| bidirectional streams opened by the endpoint that receives the | newly created bidirectional streams opened by the endpoint that | |||
| transport parameter. In client transport parameters, this applies | sends the transport parameter. In client transport parameters, | |||
| to streams with an identifier ending in 0x1; in server transport | this applies to streams with an identifier with the least | |||
| parameters, this applies to streams ending in 0x0. | significant two bits set to 0x0; in server transport parameters, | |||
| this applies to streams with the least significant two bits set to | ||||
| 0x1. | ||||
| initial_max_stream_data_uni (0x000b): The initial stream maximum | initial_max_stream_data_bidi_remote (0x0006): This parameter is an | |||
| data for unidirectional streams parameter contains the initial | integer value specifying the initial flow control limit for peer- | |||
| flow control limit for newly created unidirectional streams opened | initiated bidirectional streams. This limit applies to newly | |||
| by the endpoint that receives the transport parameter. In client | created bidirectional streams opened by the endpoint that receives | |||
| transport parameters, this applies to streams with an identifier | the transport parameter. In client transport parameters, this | |||
| ending in 0x3; in server transport parameters, this applies to | applies to streams with an identifier with the least significant | |||
| streams ending in 0x2. | two bits set to 0x1; in server transport parameters, this applies | |||
| to streams with the least significant two bits set to 0x0. | ||||
| If present, transport parameters that set initial flow control limits | initial_max_stream_data_uni (0x0007): This parameter is an integer | |||
| (initial_max_stream_data_bidi_local, | value specifying the initial flow control limit for unidirectional | |||
| initial_max_stream_data_bidi_remote, and initial_max_stream_data_uni) | streams. This limit applies to newly created bidirectional | |||
| are equivalent to sending a MAX_STREAM_DATA frame (Section 19.6) on | streams opened by the endpoint that receives the transport | |||
| every stream of the corresponding type immediately after opening. If | parameter. In client transport parameters, this applies to | |||
| the transport parameter is absent, streams of that type start with a | streams with an identifier with the least significant two bits set | |||
| flow control limit of 0. | to 0x3; in server transport parameters, this applies to streams | |||
| with the least significant two bits set to 0x2. | ||||
| initial_max_data (0x0001): The initial maximum data parameter | initial_max_streams_bidi (0x0008): The initial maximum bidirectional | |||
| contains the initial value for the maximum amount of data that can | streams parameter is an integer value that contains the initial | |||
| be sent on the connection. This parameter is encoded as an | maximum number of bidirectional streams the peer may initiate. If | |||
| unsigned 32-bit integer in units of octets. This is equivalent to | this parameter is absent or zero, the peer cannot open | |||
| sending a MAX_DATA (Section 19.5) for the connection immediately | bidirectional streams until a MAX_STREAMS frame is sent. Setting | |||
| after completing the handshake. If the transport parameter is | this parameter is equivalent to sending a MAX_STREAMS | |||
| absent, the connection starts with a flow control limit of 0. | (Section 19.11) of the corresponding type with the same value. | |||
| initial_max_bidi_streams (0x0002): The initial maximum bidirectional | initial_max_streams_uni (0x0009): The initial maximum unidirectional | |||
| streams parameter contains the initial maximum number of | streams parameter is an integer value that contains the initial | |||
| bidirectional streams the peer may initiate, encoded as an | maximum number of unidirectional streams the peer may initiate. | |||
| unsigned 16-bit integer. If this parameter is absent or zero, | If this parameter is absent or zero, the peer cannot open | |||
| bidirectional streams cannot be created until a MAX_STREAM_ID | unidirectional streams until a MAX_STREAMS frame is sent. Setting | |||
| frame is sent. Setting this parameter is equivalent to sending a | this parameter is equivalent to sending a MAX_STREAMS | |||
| MAX_STREAM_ID (Section 19.7) immediately after completing the | (Section 19.11) of the corresponding type with the same value. | |||
| handshake containing the corresponding Stream ID. For example, a | ||||
| value of 0x05 would be equivalent to receiving a MAX_STREAM_ID | ||||
| containing 16 when received by a client or 17 when received by a | ||||
| server. | ||||
| initial_max_uni_streams (0x0008): The initial maximum unidirectional | ack_delay_exponent (0x000a): The ACK delay exponent is an integer | |||
| streams parameter contains the initial maximum number of | value indicating an exponent used to decode the ACK Delay field in | |||
| unidirectional streams the peer may initiate, encoded as an | the ACK frame (Section 19.3). If this value is absent, a default | |||
| unsigned 16-bit integer. If this parameter is absent or zero, | value of 3 is assumed (indicating a multiplier of 8). The default | |||
| unidirectional streams cannot be created until a MAX_STREAM_ID | value is also used for ACK frames that are sent in Initial and | |||
| frame is sent. Setting this parameter is equivalent to sending a | Handshake packets. Values above 20 are invalid. | |||
| MAX_STREAM_ID (Section 19.7) immediately after completing the | ||||
| handshake containing the corresponding Stream ID. For example, a | ||||
| value of 0x05 would be equivalent to receiving a MAX_STREAM_ID | ||||
| containing 18 when received by a client or 19 when received by a | ||||
| server. | ||||
| A server MUST include the following transport parameter if it sent a | max_ack_delay (0x000b): The maximum ACK delay is an integer value | |||
| Retry packet: | indicating the maximum amount of time in milliseconds by which the | |||
| endpoint will delay sending acknowledgments. This value SHOULD | ||||
| include the receiver's expected delays in alarms firing. For | ||||
| example, if a receiver sets a timer for 5ms and alarms commonly | ||||
| fire up to 1ms late, then it should send a max_ack_delay of 6ms. | ||||
| If this value is absent, a default of 25 milliseconds is assumed. | ||||
| original_connection_id (0x000d): The value of the Destination | disable_migration (0x000c): The disable migration transport | |||
| Connection ID field from the first Initial packet sent by the | parameter is included if the endpoint does not support connection | |||
| client. This transport parameter is only sent by the server. | migration (Section 9). Peers of an endpoint that sets this | |||
| transport parameter MUST NOT send any packets, including probing | ||||
| packets (Section 9.1), from a local address other than that used | ||||
| to perform the handshake. This parameter is a zero-length value. | ||||
| A server MAY include the following transport parameters: | preferred_address (0x000d): The server's preferred address is used | |||
| to effect a change in server address at the end of the handshake, | ||||
| as described in Section 9.6. The format of this transport | ||||
| parameter is the PreferredAddress struct shown in Figure 16. This | ||||
| transport parameter is only sent by a server. | ||||
| stateless_reset_token (0x0006): The Stateless Reset Token is used in | struct { | |||
| verifying a stateless reset, see Section 10.4. This parameter is | enum { IPv4(4), IPv6(6), (15) } ipVersion; | |||
| a sequence of 16 octets. | opaque ipAddress<4..2^8-1>; | |||
| uint16 port; | ||||
| opaque connectionId<0..18>; | ||||
| opaque statelessResetToken[16]; | ||||
| } PreferredAddress; | ||||
| preferred_address (0x0004): The server's Preferred Address is used | Figure 16: Preferred Address format | |||
| to effect a change in server address at the end of the handshake, | ||||
| as described in Section 9.6. | If present, transport parameters that set initial flow control limits | |||
| (initial_max_stream_data_bidi_local, | ||||
| 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 | ||||
| every stream of the corresponding type immediately after opening. If | ||||
| the transport parameter is absent, streams of that type start with a | ||||
| flow control limit of 0. | ||||
| A client MUST NOT include an original connection ID, a stateless | A client MUST NOT include an original connection ID, a stateless | |||
| reset token, or a preferred address. A server MUST treat receipt of | reset token, or a preferred address. A server MUST treat receipt of | |||
| any of these transport parameters as a connection error of type | any of these transport parameters as a connection error of type | |||
| TRANSPORT_PARAMETER_ERROR. | TRANSPORT_PARAMETER_ERROR. | |||
| 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 Frame | 19.1. PADDING Frame | |||
| The PADDING frame (type=0x00) has no semantic value. PADDING frames | The PADDING frame (type=0x00) has no semantic value. PADDING frames | |||
| can be used to increase the size of a packet. Padding can be used to | can be used to increase the size of a packet. Padding can be used to | |||
| increase an initial client packet to the minimum required size, or to | increase an initial client packet to the minimum required size, or to | |||
| provide protection against traffic analysis for protected packets. | provide protection against traffic analysis for protected packets. | |||
| A PADDING frame has no content. That is, a PADDING frame consists of | A PADDING frame has no content. That is, a PADDING frame consists of | |||
| the single octet that identifies the frame as a PADDING frame. | the single byte that identifies the frame as a PADDING frame. | |||
| 19.2. RST_STREAM Frame | 19.2. PING Frame | |||
| An endpoint may use a RST_STREAM frame (type=0x01) to abruptly | Endpoints can use PING frames (type=0x01) to verify that their peers | |||
| are still alive or to check reachability to the peer. The PING frame | ||||
| contains no additional fields. | ||||
| The receiver of a PING frame simply needs to acknowledge the packet | ||||
| containing this frame. | ||||
| The PING frame can be used to keep a connection alive when an | ||||
| application or application protocol wishes to prevent the connection | ||||
| from timing out. An application protocol SHOULD provide guidance | ||||
| about the conditions under which generating a PING is recommended. | ||||
| This guidance SHOULD indicate whether it is the client or the server | ||||
| that is expected to send the PING. Having both endpoints send PING | ||||
| frames without coordination can produce an excessive number of | ||||
| packets and poor performance. | ||||
| A connection will time out if no packets are sent or received for a | ||||
| period longer than the time specified in the idle_timeout transport | ||||
| parameter (see Section 10). However, state in middleboxes might time | ||||
| out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | ||||
| minute timeout interval, experience shows that sending packets every | ||||
| 15 to 30 seconds is necessary to prevent the majority of middleboxes | ||||
| from losing state for UDP flows. | ||||
| 19.3. ACK Frames | ||||
| Receivers send ACK frames (types 0x02 and 0x03) to inform senders of | ||||
| packets they have received and processed. The ACK frame contains one | ||||
| or more ACK Blocks. ACK Blocks are ranges of acknowledged packets. | ||||
| If the frame type is 0x03, ACK frames also contain the sum of QUIC | ||||
| packets with associated ECN marks received on the connection up until | ||||
| this point. QUIC implementations MUST properly handle both types | ||||
| and, if they have enabled ECN for packets they send, they SHOULD use | ||||
| the information in the ECN section to manage their congestion state. | ||||
| QUIC acknowledgements are irrevocable. Once acknowledged, a packet | ||||
| remains acknowledged, even if it does not appear in a future ACK | ||||
| frame. This is unlike TCP SACKs ([RFC2018]). | ||||
| It is expected that a sender will reuse the same packet number across | ||||
| different packet number spaces. ACK frames only acknowledge the | ||||
| packet numbers that were transmitted by the sender in the same packet | ||||
| number space of the packet that the ACK was received in. | ||||
| Version Negotiation and Retry packets cannot be acknowledged because | ||||
| they do not contain a packet number. Rather than relying on ACK | ||||
| frames, these packets are implicitly acknowledged by the next Initial | ||||
| packet sent by the client. | ||||
| An ACK frame is as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Largest Acknowledged (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Delay (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Block Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Blocks (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [ECN Section] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 17: ACK Frame Format | ||||
| ACK frames contain the following fields: | ||||
| Largest Acknowledged: A variable-length integer representing the | ||||
| largest packet number the peer is acknowledging; this is usually | ||||
| the largest packet number that the peer has received prior to | ||||
| generating the ACK frame. Unlike the packet number in the QUIC | ||||
| long or short header, the value in an ACK frame is not truncated. | ||||
| ACK Delay: A variable-length integer including the time in | ||||
| microseconds that the largest acknowledged packet, as indicated in | ||||
| the Largest Acknowledged field, was received by this peer to when | ||||
| this ACK was sent. The value of the ACK Delay field is scaled by | ||||
| multiplying the encoded value by 2 to the power of the value of | ||||
| the "ack_delay_exponent" transport parameter set by the sender of | ||||
| the ACK frame. The "ack_delay_exponent" defaults to 3, or a | ||||
| multiplier of 8 (see Section 18.1). Scaling in this fashion | ||||
| allows for a larger range of values with a shorter encoding at the | ||||
| cost of lower resolution. | ||||
| ACK Block Count: A variable-length integer specifying the number of | ||||
| Additional ACK Block (and Gap) fields after the First ACK Block. | ||||
| ACK Blocks: Contains one or more blocks of packet numbers which have | ||||
| been successfully received, see Section 19.3.1. | ||||
| 19.3.1. ACK Block Section | ||||
| The ACK Block Section consists of alternating Gap and ACK Block | ||||
| fields in descending packet number order. A First Ack Block field is | ||||
| followed by a variable number of alternating Gap and Additional ACK | ||||
| Blocks. The number of Gap and Additional ACK Block fields is | ||||
| determined by the ACK Block Count field. | ||||
| Gap and ACK Block fields use a relative integer encoding for | ||||
| efficiency. Though each encoded value is positive, the values are | ||||
| subtracted, so that each ACK Block describes progressively lower- | ||||
| numbered packets. As long as contiguous ranges of packets are small, | ||||
| the variable-length integer encoding ensures that each range can be | ||||
| expressed in a small number of bytes. | ||||
| The ACK frame uses the least significant bit (that 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 the packet's IP | ||||
| header. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | First ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 18: ACK Block Section | ||||
| Each ACK Block acknowledges a contiguous range of packets by | ||||
| indicating the number of acknowledged packets that precede the | ||||
| largest packet number in that block. A value of zero indicates that | ||||
| only the largest packet number is acknowledged. Larger ACK Block | ||||
| values indicate a larger range, with corresponding lower values for | ||||
| the smallest packet number in the range. Thus, given a largest | ||||
| packet number for the ACK, the smallest value is determined by the | ||||
| formula: | ||||
| smallest = largest - ack_block | ||||
| The range of packets that are acknowledged by the ACK Block include | ||||
| the range from the smallest packet number to the largest, inclusive. | ||||
| The largest value for the First ACK Block is determined by the | ||||
| Largest Acknowledged field; the largest for Additional ACK Blocks is | ||||
| determined by cumulatively subtracting the size of all preceding ACK | ||||
| Blocks and Gaps. | ||||
| Each Gap indicates a range of packets that are not being | ||||
| acknowledged. The number of packets in the gap is one higher than | ||||
| the encoded value of the Gap Field. | ||||
| The value of the Gap field establishes the largest packet number | ||||
| value for the ACK Block that follows the gap using the following | ||||
| formula: | ||||
| largest = previous_smallest - gap - 2 | ||||
| If the calculated value for largest or smallest packet number for any | ||||
| ACK Block is negative, an endpoint MUST generate a connection error | ||||
| of type FRAME_ENCODING_ERROR indicating an error in an ACK frame. | ||||
| The fields in the ACK Block Section are: | ||||
| First ACK Block: A variable-length integer indicating the number of | ||||
| contiguous packets preceding the Largest Acknowledged that are | ||||
| being acknowledged. | ||||
| Gap (repeated): A variable-length integer indicating the number of | ||||
| contiguous unacknowledged packets preceding the packet number one | ||||
| lower than the smallest in the preceding ACK Block. | ||||
| Additional ACK Block (repeated): A variable-length integer | ||||
| indicating the number of contiguous acknowledged packets preceding | ||||
| the largest packet number, as determined by the preceding Gap. | ||||
| 19.3.2. ECN section | ||||
| The ECN section should only be parsed when the ACK frame type is | ||||
| 0x03. The ECN section consists of 3 ECN counts as shown below. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(0) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(1) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECN-CE Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ECT(0) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(0) codepoint. | ||||
| ECT(1) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(1) codepoint. | ||||
| CE Count: A variable-length integer representing the total number | ||||
| packets received with the CE codepoint. | ||||
| ECN counts are maintained separately for each packet number space. | ||||
| 19.4. RESET_STREAM Frame | ||||
| An endpoint uses a RESET_STREAM frame (type=0x04) to abruptly | ||||
| terminate a stream. | terminate a stream. | |||
| After sending a RST_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 | |||
| of RST_STREAM can discard any data that it already received on that | of RESET_STREAM can discard any data that it already received on that | |||
| stream. | stream. | |||
| An endpoint that receives a RST_STREAM frame for a send-only stream | An endpoint that receives a RESET_STREAM frame for a send-only stream | |||
| MUST terminate the connection with error PROTOCOL_VIOLATION. | MUST terminate the connection with error PROTOCOL_VIOLATION. | |||
| The RST_STREAM frame is as follows: | The RESET_STREAM frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Application Error Code (16) | | | Application Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Final Offset (i) ... | | Final Offset (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | 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 16-bit application protocol error | Application Protocol Error Code: A 16-bit application protocol error | |||
| code (see Section 20.1) which indicates why the stream is being | code (see Section 20.1) which indicates why the stream is being | |||
| closed. | closed. | |||
| Final Offset: A variable-length integer indicating the absolute byte | Final Offset: A variable-length integer indicating the absolute byte | |||
| offset of the end of data written on this stream by the RST_STREAM | offset of the end of data written on this stream by the | |||
| sender. | RESET_STREAM sender. | |||
| 19.3. CONNECTION_CLOSE frame | 19.5. STOP_SENDING Frame | |||
| An endpoint sends a CONNECTION_CLOSE frame (type=0x02) to notify its | An endpoint uses a STOP_SENDING frame (type=0x05) to communicate that | |||
| peer that the connection is being closed. CONNECTION_CLOSE is used | incoming data is being discarded on receipt at application request. | |||
| to signal errors at the QUIC layer, or the absence of errors (with | This signals a peer to abruptly terminate transmission on a stream. | |||
| the NO_ERROR code). | ||||
| If there are open streams that haven't been explicitly closed, they | Receipt of a STOP_SENDING frame is invalid for a locally-initiated | |||
| are implicitly closed when the connection is closed. | stream that has not yet been created or is in the "Ready" state (see | |||
| Section 3.1). Receiving a STOP_SENDING frame for a locally-initiated | ||||
| send stream that is "Ready" or not yet created MUST be treated as a | ||||
| connection error of type PROTOCOL_VIOLATION. An endpoint that | ||||
| receives a STOP_SENDING frame for a receive-only stream MUST | ||||
| terminate the connection with error PROTOCOL_VIOLATION. | ||||
| The CONNECTION_CLOSE frame is as follows: | The STOP_SENDING frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (16) | | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Frame Type (i) ... | | Application Error Code (16) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| STOP_SENDING frames contain the following fields: | ||||
| Stream ID: A variable-length integer carrying the Stream ID of the | ||||
| stream being ignored. | ||||
| Application Error Code: A 16-bit, application-specified reason the | ||||
| sender is ignoring the stream (see Section 20.1). | ||||
| 19.6. CRYPTO Frame | ||||
| The CRYPTO frame (type=0x06) is used to transmit cryptographic | ||||
| handshake messages. It can be sent in all packet types. The CRYPTO | ||||
| frame offers the cryptographic protocol an in-order stream of bytes. | ||||
| CRYPTO frames are functionally identical to STREAM frames, except | ||||
| that they do not bear a stream identifier; they are not flow | ||||
| controlled; and they do not carry markers for optional offset, | ||||
| optional length, and the end of the stream. | ||||
| The CRYPTO frame is as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase Length (i) ... | | Offset (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase (*) ... | | Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Crypto Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields of a CONNECTION_CLOSE frame are as follows: | Figure 19: CRYPTO Frame Format | |||
| Error Code: A 16-bit error code which indicates the reason for | CRYPTO frames contain the following fields: | |||
| closing this connection. CONNECTION_CLOSE uses codes from the | ||||
| space defined in Section 20. | ||||
| Frame Type: A variable-length integer encoding the type of frame | Offset: A variable-length integer specifying the byte offset in the | |||
| that triggered the error. A value of 0 (equivalent to the mention | stream for the data in this CRYPTO frame. | |||
| of the PADDING frame) is used when the frame type is unknown. | ||||
| Reason Phrase Length: A variable-length integer specifying the | Length: A variable-length integer specifying the length of the | |||
| length of the reason phrase in bytes. Note that a | Crypto Data field in this CRYPTO frame. | |||
| CONNECTION_CLOSE frame cannot be split between packets, so in | ||||
| practice any limits on packet size will also limit the space | ||||
| available for a reason phrase. | ||||
| Reason Phrase: A human-readable explanation for why the connection | Crypto Data: The cryptographic message data. | |||
| was closed. This can be zero length if the sender chooses to not | ||||
| give details beyond the Error Code. This SHOULD be a UTF-8 | ||||
| encoded string [RFC3629]. | ||||
| 19.4. APPLICATION_CLOSE frame | There is a separate flow of cryptographic handshake data in each | |||
| encryption level, each of which starts at an offset of 0. This | ||||
| implies that each encryption level is treated as a separate CRYPTO | ||||
| stream of data. | ||||
| An APPLICATION_CLOSE frame (type=0x03) is used to signal an error | Unlike STREAM frames, which include a Stream ID indicating to which | |||
| with the protocol that uses QUIC. | stream the data belongs, the CRYPTO frame carries data for a single | |||
| stream per encryption level. The stream does not have an explicit | ||||
| end, so CRYPTO frames do not have a FIN bit. | ||||
| The APPLICATION_CLOSE frame is as follows: | 19.7. NEW_TOKEN Frame | |||
| A server sends a NEW_TOKEN frame (type=0x07) to provide the client a | ||||
| token to send in the header of an Initial packet for a future | ||||
| connection. | ||||
| The NEW_TOKEN frame is as follows: | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Error Code (16) | | | Token Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase Length (i) ... | | Token (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Reason Phrase (*) ... | ||||
| NEW_TOKEN frames contain the following fields: | ||||
| Token Length: A variable-length integer specifying the length of the | ||||
| token in bytes. | ||||
| Token: An opaque blob that the client may use with a future Initial | ||||
| packet. | ||||
| 19.8. STREAM Frames | ||||
| STREAM frames implicitly create a stream and carry stream data. The | ||||
| STREAM frame takes the form 0b00001XXX (or the set of values from | ||||
| 0x08 to 0x0f). The value of the three low-order bits of 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 | ||||
| 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 | ||||
| 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 | ||||
| data). | ||||
| 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 | ||||
| field is absent and the Stream Data field extends to the end of | ||||
| the packet. If this bit is set to 1, the Length field is present. | ||||
| o The FIN bit (0x01) of the frame type is set only on frames that | ||||
| contain the final offset of the stream. Setting this bit | ||||
| indicates that the frame marks the end of the stream. | ||||
| An endpoint that receives a STREAM frame for a send-only stream MUST | ||||
| terminate the connection with error PROTOCOL_VIOLATION. | ||||
| The STREAM frames are as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Offset (i)] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Length (i)] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields of an APPLICATION_CLOSE frame are as follows: | Figure 20: STREAM Frame Format | |||
| Error Code: A 16-bit error code which indicates the reason for | STREAM frames contain the following fields: | |||
| closing this connection. APPLICATION_CLOSE uses codes from the | ||||
| application protocol error code space, see Section 20.1. | ||||
| Reason Phrase Length: This field is identical in format and | Stream ID: A variable-length integer indicating the stream ID of the | |||
| semantics to the Reason Phrase Length field from CONNECTION_CLOSE. | stream (see Section 2.1). | |||
| Reason Phrase: This field is identical in format and semantics to | Offset: A variable-length integer specifying the byte offset in the | |||
| the Reason Phrase field from CONNECTION_CLOSE. | stream for the data in this STREAM frame. This field is present | |||
| when the OFF bit is set to 1. When the Offset field is absent, | ||||
| the offset is 0. | ||||
| APPLICATION_CLOSE has similar format and semantics to the | Length: A variable-length integer specifying the length of the | |||
| CONNECTION_CLOSE frame (Section 19.3). Aside from the semantics of | Stream Data field in this STREAM frame. This field is present | |||
| the Error Code field and the omission of the Frame Type field, both | when the LEN bit is set to 1. When the LEN bit is set to 0, the | |||
| frames are used to close the connection. | Stream Data field consumes all the remaining bytes in the packet. | |||
| 19.5. MAX_DATA Frame | Stream Data: The bytes from the designated stream to be delivered. | |||
| The MAX_DATA frame (type=0x04) is used in flow control to inform the | 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. | ||||
| The first byte in the stream has an offset of 0. The largest offset | ||||
| delivered on a stream - the sum of the re-constructed offset and data | ||||
| length - MUST be less than 2^62. | ||||
| 19.9. MAX_DATA Frame | ||||
| The 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. | |||
| The frame is as follows: | The MAX_DATA frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Data (i) ... | | Maximum Data (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_DATA frame are as follows: | ||||
| MAX_DATA frames contain the following fields: | ||||
| Maximum Data: A variable-length integer indicating the maximum | Maximum Data: A variable-length integer indicating the maximum | |||
| amount of data that can be sent on the entire connection, in units | amount of data that can be sent on the entire connection, in units | |||
| of octets. | of 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 largest received offsets on all streams - including streams in | the largest received offsets on all streams - including streams in | |||
| terminal states - MUST NOT exceed the value advertised by a receiver. | terminal states - MUST NOT exceed the value advertised by a receiver. | |||
| An endpoint MUST terminate a connection with a FLOW_CONTROL_ERROR | An endpoint MUST terminate a connection with a FLOW_CONTROL_ERROR | |||
| error if it receives more data than the maximum data value that it | error if it receives more data than the maximum data value that it | |||
| has sent, unless this is a result of a change in the initial limits | has sent, unless this is a result of a change in the initial limits | |||
| (see Section 7.3.1). | (see Section 7.3.1). | |||
| 19.6. MAX_STREAM_DATA Frame | 19.10. MAX_STREAM_DATA Frame | |||
| The MAX_STREAM_DATA frame (type=0x05) is used in flow control to | The 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 | inform a peer of the maximum amount of data that can be sent on a | |||
| stream. | stream. | |||
| An endpoint that receives a MAX_STREAM_DATA frame for a receive-only | An endpoint that receives a MAX_STREAM_DATA frame for a receive-only | |||
| stream MUST terminate the connection with error PROTOCOL_VIOLATION. | stream MUST terminate the connection with error PROTOCOL_VIOLATION. | |||
| An endpoint that receives a MAX_STREAM_DATA frame for a send-only | An endpoint that receives a MAX_STREAM_DATA frame for a send-only | |||
| stream it has not opened MUST terminate the connection with error | stream it has not opened MUST terminate the connection with error | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| Note that an endpoint may legally receive a MAX_STREAM_DATA frame on | Note that an endpoint may legally receive a MAX_STREAM_DATA frame on | |||
| a bidirectional stream it has not opened. | a bidirectional stream it has not opened. | |||
| The frame is as follows: | The MAX_STREAM_DATA frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Stream Data (i) ... | | Maximum Stream Data (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_STREAM_DATA frame are as follows: | 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 stream that is affected 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 octets. | 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 a FLOW_CONTROL_ERROR error if it receives more data | |||
| than the largest maximum stream data that it has sent for the | than the largest maximum stream data that it has sent for the | |||
| affected stream, unless this is a result of a change in the initial | affected stream, unless this is a result of a change in the initial | |||
| limits (see Section 7.3.1). | limits (see Section 7.3.1). | |||
| 19.7. MAX_STREAM_ID Frame | 19.11. MAX_STREAMS Frames | |||
| The MAX_STREAM_ID frame (type=0x06) informs the peer of the maximum | The MAX_STREAMS frames (type=0x12 and 0x13) inform the peer of the | |||
| stream ID that they are 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 | ||||
| streams, and a MAX_STREAMS frame with a type of 0x13 applies to | ||||
| unidirectional streams. | ||||
| The frame is as follows: | The MAX_STREAMS frames are as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Maximum Stream ID (i) ... | | Maximum Streams (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields in the MAX_STREAM_ID frame are as follows: | MAX_STREAMS frames contain the following fields: | |||
| Maximum Stream ID: ID of the maximum unidirectional or bidirectional | ||||
| peer-initiated stream ID for the connection encoded as a variable- | ||||
| length integer. The limit applies to unidirectional steams if the | ||||
| second least signification bit of the stream ID is 1, and applies | ||||
| to bidirectional streams if it is 0. | ||||
| Loss or reordering can mean that a MAX_STREAM_ID frame can be | ||||
| received which states a lower stream limit than the client has | ||||
| previously received. MAX_STREAM_ID frames which do not increase the | ||||
| maximum stream ID MUST be ignored. | ||||
| A peer MUST NOT initiate a stream with a higher stream ID than the | ||||
| greatest maximum stream ID it has received. An endpoint MUST | ||||
| terminate a connection with a STREAM_ID_ERROR error if a peer | ||||
| initiates a stream with a higher stream ID than it has sent, unless | ||||
| this is a result of a change in the initial limits (see | ||||
| Section 7.3.1). | ||||
| 19.8. PING Frame | ||||
| Endpoints can use PING frames (type=0x07) to verify that their peers | Maximum Streams: A count of the cumulative number of streams of the | |||
| are still alive or to check reachability to the peer. The PING frame | corresponding type that can be opened over the lifetime of the | |||
| contains no additional fields. | connection. | |||
| The receiver of a PING frame simply needs to acknowledge the packet | Loss or reordering can cause a MAX_STREAMS frame to be received which | |||
| containing this frame. | states a lower stream limit than an endpoint has previously received. | |||
| MAX_STREAMS frames which do not increase the stream limit MUST be | ||||
| ignored. | ||||
| The PING frame can be used to keep a connection alive when an | An endpoint MUST NOT open more streams than permitted by the current | |||
| application or application protocol wishes to prevent the connection | stream limit set by its peer. For instance, a server that receives a | |||
| from timing out. An application protocol SHOULD provide guidance | unidirectional stream limit of 3 is permitted to open stream 3, 7, | |||
| about the conditions under which generating a PING is recommended. | and 11, but not stream 15. An endpoint MUST terminate a connection | |||
| This guidance SHOULD indicate whether it is the client or the server | with a STREAM_LIMIT_ERROR error if a peer opens more streams than was | |||
| that is expected to send the PING. Having both endpoints send PING | permitted. | |||
| frames without coordination can produce an excessive number of | ||||
| packets and poor performance. | ||||
| A connection will time out if no packets are sent or received for a | Note that these frames (and the corresponding transport parameters) | |||
| period longer than the time specified in the idle_timeout transport | do not describe the number of streams that can be opened | |||
| parameter (see Section 10). However, state in middleboxes might time | concurrently. The limit includes streams that have been closed as | |||
| out earlier than that. Though REQ-5 in [RFC4787] recommends a 2 | well as those that are open. | |||
| minute timeout interval, experience shows that sending packets every | ||||
| 15 to 30 seconds is necessary to prevent the majority of middleboxes | ||||
| from losing state for UDP flows. | ||||
| 19.9. BLOCKED Frame | 19.12. DATA_BLOCKED Frame | |||
| A sender SHOULD send a BLOCKED frame (type=0x08) when it wishes to | A sender SHOULD send a DATA_BLOCKED frame (type=0x14) when it wishes | |||
| send data, but is unable to due to connection-level flow control (see | to send data, but is unable to due to connection-level flow control | |||
| Section 4). BLOCKED frames can be used as input to tuning of flow | (see Section 4). DATA_BLOCKED frames can be used as input to tuning | |||
| control algorithms (see Section 4.2). | of flow control algorithms (see Section 4.2). | |||
| The BLOCKED frame is as follows: | The DATA_BLOCKED frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (i) ... | | Data Limit (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The BLOCKED frame contains a single field. | DATA_BLOCKED frames contain the following fields: | |||
| Offset: A variable-length integer indicating the connection-level | Data Limit: A variable-length integer indicating the connection- | |||
| offset at which the blocking occurred. | level limit at which blocking occurred. | |||
| 19.10. STREAM_BLOCKED Frame | 19.13. STREAM_DATA_BLOCKED Frame | |||
| A sender SHOULD send a STREAM_BLOCKED frame (type=0x09) when it | A sender SHOULD send a STREAM_DATA_BLOCKED frame (type=0x15) when it | |||
| wishes to send data, but is unable to due to stream-level flow | wishes to send data, but is unable to due to stream-level flow | |||
| control. This frame is analogous to BLOCKED (Section 19.9). | control. This frame is analogous to DATA_BLOCKED (Section 19.12). | |||
| An endpoint that receives a STREAM_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 PROTOCOL_VIOLATION. | stream MUST terminate the connection with error PROTOCOL_VIOLATION. | |||
| The STREAM_BLOCKED frame is as follows: | The STREAM_DATA_BLOCKED frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream ID (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (i) ... | | Stream Data Limit (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The STREAM_BLOCKED frame contains two fields: | STREAM_DATA_BLOCKED frames contain the following fields: | |||
| Stream ID: A variable-length integer indicating the stream which is | Stream ID: A variable-length integer indicating the stream which is | |||
| flow control blocked. | flow control blocked. | |||
| Offset: A variable-length integer indicating the offset of the | Stream Data Limit: A variable-length integer indicating the offset | |||
| stream at which the blocking occurred. | of the stream at which the blocking occurred. | |||
| 19.11. STREAM_ID_BLOCKED Frame | 19.14. STREAMS_BLOCKED Frames | |||
| A sender SHOULD send a STREAM_ID_BLOCKED frame (type=0x0a) when it | A sender SHOULD send a STREAMS_BLOCKED frame (type=0x16 or 0x17) when | |||
| wishes to open a stream, but is unable to due to the maximum stream | it wishes to open a stream, but is unable to due to the maximum | |||
| ID limit set by its peer (see Section 19.7). This does not open the | stream limit set by its peer (see Section 19.11). A STREAMS_BLOCKED | |||
| stream, but informs the peer that a new stream was needed, but the | frame of type 0x16 is used to indicate reaching the bidirectional | |||
| stream limit prevented the creation of the stream. | stream limit, and a STREAMS_BLOCKED frame of type 0x17 indicates | |||
| reaching the unidirectional stream limit. | ||||
| The STREAM_ID_BLOCKED frame is as follows: | 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 | ||||
| creation of the stream. | ||||
| The STREAMS_BLOCKED frames are as follows: | ||||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Stream ID (i) ... | | Stream Limit (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The STREAM_ID_BLOCKED frame contains a single field. | STREAMS_BLOCKED frames contain the following fields: | |||
| Stream ID: A variable-length integer indicating the highest stream | Stream Limit: A variable-length integer indicating the stream limit | |||
| ID that the sender was permitted to open. | at the time the frame was sent. | |||
| 19.12. NEW_CONNECTION_ID Frame | 19.15. NEW_CONNECTION_ID Frame | |||
| An endpoint sends a NEW_CONNECTION_ID frame (type=0x0b) to provide | An endpoint sends a NEW_CONNECTION_ID frame (type=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). | |||
| The NEW_CONNECTION_ID frame is as follows: | The NEW_CONNECTION_ID frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (8) | Sequence Number (i) ... | | Sequence Number (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Connection ID (32..144) ... | | Length (8) | | | |||
| +-+-+-+-+-+-+-+-+ Connection ID (32..144) + | ||||
| | ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| + Stateless Reset Token (128) + | + Stateless Reset Token (128) + | |||
| | | | | | | |||
| + + | + + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | NEW_CONNECTION_ID frames contain the following fields: | |||
| Sequence Number: The sequence number assigned to the connection ID | ||||
| by the sender. See Section 5.1.1. | ||||
| Length: An 8-bit unsigned integer containing the length of the | Length: An 8-bit unsigned integer containing the length of the | |||
| connection ID. Values less than 4 and greater than 18 are invalid | connection ID. Values less than 4 and greater than 18 are invalid | |||
| and MUST be treated as a connection error of type | and MUST be treated as a connection error of type | |||
| PROTOCOL_VIOLATION. | PROTOCOL_VIOLATION. | |||
| Sequence Number: The sequence number assigned to the connection ID | ||||
| by the sender. See Section 5.1.1. | ||||
| 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.4). | Section 10.4). | |||
| An endpoint MUST NOT send this frame if it currently requires that | An endpoint MUST NOT send this frame if it currently requires that | |||
| its peer send packets with a zero-length Destination Connection ID. | its peer send packets with a zero-length Destination Connection ID. | |||
| Changing the length of a connection ID to or from zero-length makes | Changing the length of a connection ID to or from zero-length makes | |||
| it difficult to identify when the value of the connection ID changed. | it difficult to identify when the value of the connection ID changed. | |||
| skipping to change at page 101, line 13 ¶ | skipping to change at page 109, line 25 ¶ | |||
| 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 identify new connection IDs from old ones. | NEW_CONNECTION_ID frame to identify new connection IDs from old ones. | |||
| 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, the endpoint MAY treat that | Token or a different sequence number, or if a sequence number is used | |||
| receipt as a connection error of type PROTOCOL_VIOLATION. | for different connection IDs, the endpoint MAY treat that receipt as | |||
| a connection error of type PROTOCOL_VIOLATION. | ||||
| 19.13. RETIRE_CONNECTION_ID Frame | 19.16. RETIRE_CONNECTION_ID Frame | |||
| An endpoint sends a RETIRE_CONNECTION_ID frame (type=0x1b) to | An endpoint sends a RETIRE_CONNECTION_ID frame (type=0x19) to | |||
| indicate that it will no longer use a connection ID that was issued | indicate that it will no longer use a connection ID that was issued | |||
| by its peer. This may include the connection ID provided during the | by its peer. This may include the connection ID provided during the | |||
| handshake. Sending a RETIRE_CONNECTION_ID frame also serves as a | handshake. Sending a RETIRE_CONNECTION_ID frame also serves as a | |||
| request to the peer to send additional connection IDs for future use | request to the peer to send additional connection IDs for future use | |||
| (see Section 5.1). New connection IDs can be delivered to a peer | (see Section 5.1). New connection IDs can be delivered to a peer | |||
| using the NEW_CONNECTION_ID frame (Section 19.12). | using the NEW_CONNECTION_ID frame (Section 19.15). | |||
| Retiring a connection ID invalidates the stateless reset token | Retiring a connection ID invalidates the stateless reset token | |||
| associated with that connection ID. | associated with that connection ID. | |||
| The RETIRE_CONNECTION_ID frame is as follows: | The RETIRE_CONNECTION_ID frame is as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Sequence Number (i) ... | | Sequence Number (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| The fields are: | RETIRE_CONNECTION_ID frames contain the following fields: | |||
| Sequence Number: The sequence number of the connection ID being | Sequence Number: The sequence number of the connection ID being | |||
| retired. See Section 5.1.2. | retired. See Section 5.1.2. | |||
| Receipt of a RETIRE_CONNECTION_ID frame containing a sequence number | Receipt of a RETIRE_CONNECTION_ID frame containing a sequence number | |||
| greater than any previously sent to the peer MAY be treated as a | greater than any previously sent to the peer MAY be treated as a | |||
| connection error of type PROTOCOL_VIOLATION. | connection error of type PROTOCOL_VIOLATION. | |||
| An endpoint cannot send this frame if it was provided with a zero- | An endpoint cannot send this frame if it was provided with a zero- | |||
| length connection ID by its peer. An endpoint that provides a zero- | length connection ID by its peer. An endpoint that provides a zero- | |||
| length connection ID MUST treat receipt of a RETIRE_CONNECTION_ID | length connection ID MUST treat receipt of a RETIRE_CONNECTION_ID | |||
| frame as a connection error of type PROTOCOL_VIOLATION. | frame as a connection error of type PROTOCOL_VIOLATION. | |||
| 19.14. STOP_SENDING Frame | 19.17. PATH_CHALLENGE Frame | |||
| An endpoint may use a STOP_SENDING frame (type=0x0c) to communicate | ||||
| that incoming data is being discarded on receipt at application | ||||
| request. This signals a peer to abruptly terminate transmission on a | ||||
| stream. | ||||
| Receipt of a STOP_SENDING frame is only valid for a send stream that | ||||
| exists and is not in the "Ready" state (see Section 3.1). Receiving | ||||
| a STOP_SENDING frame for a send stream that is "Ready" or non- | ||||
| existent MUST be treated as a connection error of type | ||||
| PROTOCOL_VIOLATION. An endpoint that receives a STOP_SENDING frame | ||||
| for a receive-only stream MUST terminate the connection with error | ||||
| PROTOCOL_VIOLATION. | ||||
| The STOP_SENDING frame is as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Application Error Code (16) | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields are: | ||||
| Stream ID: A variable-length integer carrying the Stream ID of the | ||||
| stream being ignored. | ||||
| Application Error Code: A 16-bit, application-specified reason the | ||||
| sender is ignoring the stream (see Section 20.1). | ||||
| 19.15. ACK Frame | ||||
| Receivers send ACK frames (types 0x1a and 0x1b) to inform senders of | ||||
| packets they have received and processed. The ACK frame contains one | ||||
| or more ACK Blocks. ACK Blocks are ranges of acknowledged packets. | ||||
| If the frame type is 0x1b, ACK frames also contain the sum of ECN | ||||
| marks received on the connection up until this point. | ||||
| QUIC acknowledgements are irrevocable. Once acknowledged, a packet | ||||
| remains acknowledged, even if it does not appear in a future ACK | ||||
| frame. This is unlike TCP SACKs ([RFC2018]). | ||||
| It is expected that a sender will reuse the same packet number across | ||||
| different packet number spaces. ACK frames only acknowledge the | ||||
| packet numbers that were transmitted by the sender in the same packet | ||||
| number space of the packet that the ACK was received in. | ||||
| Version Negotiation and Retry packets cannot be acknowledged because | ||||
| they do not contain a packet number. Rather than relying on ACK | ||||
| frames, these packets are implicitly acknowledged by the next Initial | ||||
| packet sent by the client. | ||||
| An ACK frame is shown below. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Largest Acknowledged (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Delay (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Block Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ACK Blocks (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [ECN Section] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 16: ACK Frame Format | ||||
| The fields in the ACK frame are as follows: | ||||
| Largest Acknowledged: A variable-length integer representing the | ||||
| largest packet number the peer is acknowledging; this is usually | ||||
| the largest packet number that the peer has received prior to | ||||
| generating the ACK frame. Unlike the packet number in the QUIC | ||||
| long or short header, the value in an ACK frame is not truncated. | ||||
| ACK Delay: A variable-length integer including the time in | ||||
| microseconds that the largest acknowledged packet, as indicated in | ||||
| the Largest Acknowledged field, was received by this peer to when | ||||
| this ACK was sent. The value of the ACK Delay field is scaled by | ||||
| multiplying the encoded value by 2 to the power of the value of | ||||
| the "ack_delay_exponent" transport parameter set by the sender of | ||||
| the ACK frame. The "ack_delay_exponent" defaults to 3, or a | ||||
| multiplier of 8 (see Section 18.1). Scaling in this fashion | ||||
| allows for a larger range of values with a shorter encoding at the | ||||
| cost of lower resolution. | ||||
| ACK Block Count: A variable-length integer specifying the number of | ||||
| Additional ACK Block (and Gap) fields after the First ACK Block. | ||||
| ACK Blocks: Contains one or more blocks of packet numbers which have | ||||
| been successfully received, see Section 19.15.1. | ||||
| 19.15.1. ACK Block Section | ||||
| The ACK Block Section consists of alternating Gap and ACK Block | ||||
| fields in descending packet number order. A First Ack Block field is | ||||
| followed by a variable number of alternating Gap and Additional ACK | ||||
| Blocks. The number of Gap and Additional ACK Block fields is | ||||
| determined by the ACK Block Count field. | ||||
| Gap and ACK Block fields use a relative integer encoding for | ||||
| efficiency. Though each encoded value is positive, the values are | ||||
| subtracted, so that each ACK Block describes progressively lower- | ||||
| numbered packets. As long as contiguous ranges of packets are small, | ||||
| the variable-length integer encoding ensures that each range can be | ||||
| expressed in a small number of octets. | ||||
| The ACK frame uses the least significant bit(bit (that is, type 0x1b) | ||||
| to indicate ECN feedback and report receipt of packets with ECN | ||||
| codepoints of ECT(0), ECT(1), or CE in the packet's IP header. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | First ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Gap (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Additional ACK Block (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 17: ACK Block Section | ||||
| Each ACK Block acknowledges a contiguous range of packets by | ||||
| indicating the number of acknowledged packets that precede the | ||||
| largest packet number in that block. A value of zero indicates that | ||||
| only the largest packet number is acknowledged. Larger ACK Block | ||||
| values indicate a larger range, with corresponding lower values for | ||||
| the smallest packet number in the range. Thus, given a largest | ||||
| packet number for the ACK, the smallest value is determined by the | ||||
| formula: | ||||
| smallest = largest - ack_block | ||||
| The range of packets that are acknowledged by the ACK Block include | ||||
| the range from the smallest packet number to the largest, inclusive. | ||||
| The largest value for the First ACK Block is determined by the | ||||
| Largest Acknowledged field; the largest for Additional ACK Blocks is | ||||
| determined by cumulatively subtracting the size of all preceding ACK | ||||
| Blocks and Gaps. | ||||
| Each Gap indicates a range of packets that are not being | ||||
| acknowledged. The number of packets in the gap is one higher than | ||||
| the encoded value of the Gap Field. | ||||
| The value of the Gap field establishes the largest packet number | ||||
| value for the ACK Block that follows the gap using the following | ||||
| formula: | ||||
| largest = previous_smallest - gap - 2 | ||||
| If the calculated value for largest or smallest packet number for any | ||||
| ACK Block is negative, an endpoint MUST generate a connection error | ||||
| of type FRAME_ENCODING_ERROR indicating an error in an ACK frame. | ||||
| The fields in the ACK Block Section are: | ||||
| First ACK Block: A variable-length integer indicating the number of | ||||
| contiguous packets preceding the Largest Acknowledged that are | ||||
| being acknowledged. | ||||
| Gap (repeated): A variable-length integer indicating the number of | ||||
| contiguous unacknowledged packets preceding the packet number one | ||||
| lower than the smallest in the preceding ACK Block. | ||||
| Additional ACK Block (repeated): A variable-length integer | ||||
| indicating the number of contiguous acknowledged packets preceding | ||||
| the largest packet number, as determined by the preceding Gap. | ||||
| 19.15.2. ECN section | ||||
| The ECN section should only be parsed when the ACK frame type byte is | ||||
| 0x1b. The ECN section consists of 3 ECN counters as shown below. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(0) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECT(1) Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | ECN-CE Count (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ECT(0) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(0) codepoint. | ||||
| ECT(1) Count: A variable-length integer representing the total | ||||
| number packets received with the ECT(1) codepoint. | ||||
| CE Count: A variable-length integer representing the total number | ||||
| packets received with the CE codepoint. | ||||
| 19.16. PATH_CHALLENGE Frame | ||||
| Endpoints can use PATH_CHALLENGE frames (type=0x0e) to check | Endpoints can use PATH_CHALLENGE frames (type=0x1a) to check | |||
| reachability to the peer and for path validation during connection | reachability to the peer and for path validation during connection | |||
| migration. | migration. | |||
| PATH_CHALLENGE frames contain an 8-byte payload. | The PATH_CHALLENGE frames are as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | | |||
| + Data (8) + | + Data (8) + | |||
| | | | | | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| PATH_CHALLENGE frames contain the following fields: | ||||
| Data: This 8-byte field contains arbitrary data. | Data: This 8-byte field contains arbitrary data. | |||
| A PATH_CHALLENGE frame containing 8 octets that are hard to guess is | A PATH_CHALLENGE frame containing 8 bytes that are hard to guess is | |||
| sufficient to ensure that it is easier to receive the packet than it | sufficient to ensure that it is easier to receive the packet than it | |||
| is to guess the value correctly. | is to guess the value correctly. | |||
| The recipient of this frame MUST generate a PATH_RESPONSE frame | The recipient of this frame MUST generate a PATH_RESPONSE frame | |||
| (Section 19.17) containing the same Data. | (Section 19.18) containing the same Data. | |||
| 19.17. PATH_RESPONSE Frame | 19.18. PATH_RESPONSE Frame | |||
| The PATH_RESPONSE frame (type=0x0f) is sent in response to a | The PATH_RESPONSE frame (type=0x1b) is sent in response to a | |||
| PATH_CHALLENGE frame. Its format is identical to the PATH_CHALLENGE | PATH_CHALLENGE frame. Its format is identical to the PATH_CHALLENGE | |||
| frame (Section 19.16). | frame (Section 19.17). | |||
| If the content of a PATH_RESPONSE frame does not match the content of | If the content of a PATH_RESPONSE frame does not match the content of | |||
| a PATH_CHALLENGE frame previously sent by the endpoint, the endpoint | a PATH_CHALLENGE frame previously sent by the endpoint, the endpoint | |||
| MAY generate a connection error of type PROTOCOL_VIOLATION. | MAY generate a connection error of type PROTOCOL_VIOLATION. | |||
| 19.18. NEW_TOKEN frame | 19.19. CONNECTION_CLOSE Frames | |||
| A server sends a NEW_TOKEN frame (type=0x19) to provide the client a | ||||
| token to send in the header of an Initial packet for a future | ||||
| connection. | ||||
| The NEW_TOKEN frame is as follows: | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Token Length (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Token (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| The fields of a NEW_TOKEN frame are as follows: | ||||
| Token Length: A variable-length integer specifying the length of the | ||||
| token in bytes. | ||||
| Token: An opaque blob that the client may use with a future Initial | ||||
| packet. | ||||
| 19.19. STREAM Frames | ||||
| STREAM frames implicitly create a stream and carry stream data. The | ||||
| STREAM frame takes the form 0b00010XXX (or the set of values from | ||||
| 0x10 to 0x17). The value of the three low-order bits of the frame | ||||
| 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 | ||||
| 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 | ||||
| Data starts at an offset of 0 (that is, the frame contains the | ||||
| first octets of the stream, or the end of a stream that includes | ||||
| no data). | ||||
| 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 | ||||
| field is absent and the Stream Data field extends to the end of | ||||
| the packet. If this bit is set to 1, the Length field is present. | ||||
| o The FIN bit (0x01) of the frame type is set only on frames that | ||||
| contain the final offset of the stream. Setting this bit | ||||
| indicates that the frame marks the end of the stream. | ||||
| An endpoint that receives a STREAM frame for a send-only stream MUST | ||||
| terminate the connection with error PROTOCOL_VIOLATION. | ||||
| A STREAM frame is shown below. | ||||
| 0 1 2 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream ID (i) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Offset (i)] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | [Length (i)] ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Stream Data (*) ... | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Figure 18: STREAM Frame Format | ||||
| The STREAM frame contains the following fields: | ||||
| Stream ID: A variable-length integer indicating the stream ID of the | ||||
| stream (see Section 2.1). | ||||
| Offset: A variable-length integer specifying the byte offset in the | ||||
| stream for the data in this STREAM frame. This field is present | ||||
| when the OFF bit is set to 1. When the Offset field is absent, | ||||
| the offset is 0. | ||||
| Length: A variable-length integer specifying the length of the | ||||
| 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 | ||||
| Stream Data field consumes all the remaining octets in the packet. | ||||
| 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 | ||||
| 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 | ||||
| delivered on a stream - the sum of the re-constructed offset and data | ||||
| length - MUST be less than 2^62. | ||||
| 19.20. CRYPTO Frame | An endpoint sends a CONNECTION_CLOSE frame (type=0x1c or 0x1d) to | |||
| notify its peer that the connection is being closed. The | ||||
| CONNECTION_CLOSE with a frame type of 0x1c is used to signal errors | ||||
| 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 | ||||
| signal an error with the application that uses QUIC. | ||||
| The CRYPTO frame (type=0x18) is used to transmit cryptographic | If there are open streams that haven't been explicitly closed, they | |||
| handshake messages. It can be sent in all packet types. The CRYPTO | are implicitly closed when the connection is closed. | |||
| frame offers the cryptographic protocol an in-order stream of bytes. | ||||
| CRYPTO frames are functionally identical to STREAM frames, except | ||||
| that they do not bear a stream identifier; they are not flow | ||||
| controlled; and they do not carry markers for optional offset, | ||||
| optional length, and the end of the stream. | ||||
| A CRYPTO frame is shown below. | The CONNECTION_CLOSE frames are as follows: | |||
| 0 1 2 3 | 0 1 2 3 | |||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Offset (i) ... | | Error Code (16) | [ Frame Type (i) ] ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Length (i) ... | | Reason Phrase Length (i) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Crypto Data (*) ... | | Reason Phrase (*) ... | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 19: CRYPTO Frame Format | CONNECTION_CLOSE frames contain the following fields: | |||
| The CRYPTO frame contains the following fields: | ||||
| Offset: A variable-length integer specifying the byte offset in the | ||||
| stream for the data in this CRYPTO frame. | ||||
| Length: A variable-length integer specifying the length of the | Error Code: A 16-bit error code which indicates the reason for | |||
| Crypto Data field in this CRYPTO frame. | closing this connection. A CONNECTION_CLOSE frame of type 0x1c | |||
| uses codes from the space defined in Section 20. A | ||||
| CONNECTION_CLOSE frame of type 0x1d uses codes from the | ||||
| application protocol error code space, see Section 20.1 | ||||
| Crypto Data: The cryptographic message data. | Frame Type: A variable-length integer encoding the type of frame | |||
| that triggered the error. A value of 0 (equivalent to the mention | ||||
| of the PADDING frame) is used when the frame type is unknown. The | ||||
| application-specific variant of CONNECTION_CLOSE (type 0x1d) does | ||||
| not include this field. | ||||
| There is a separate flow of cryptographic handshake data in each | Reason Phrase Length: A variable-length integer specifying the | |||
| encryption level, each of which starts at an offset of 0. This | length of the reason phrase in bytes. Note that a | |||
| implies that each encryption level is treated as a separate CRYPTO | CONNECTION_CLOSE frame cannot be split between packets, so in | |||
| stream of data. | practice any limits on packet size will also limit the space | |||
| available for a reason phrase. | ||||
| Unlike STREAM frames, which include a Stream ID indicating to which | Reason Phrase: A human-readable explanation for why the connection | |||
| stream the data belongs, the CRYPTO frame carries data for a single | was closed. This can be zero length if the sender chooses to not | |||
| stream per encryption level. The stream does not have an explicit | give details beyond the Error Code. This SHOULD be a UTF-8 | |||
| end, so CRYPTO frames do not have a FIN bit. | encoded string [RFC3629]. | |||
| 19.21. Extension Frames | 19.20. Extension Frames | |||
| QUIC frames do not use a self-describing encoding. An endpoint | QUIC frames do not use a self-describing encoding. An endpoint | |||
| therefore needs to understand the syntax of all frames before it can | therefore needs to understand the syntax of all frames before it can | |||
| successfully process a packet. This allows for efficient encoding of | successfully process a packet. This allows for efficient encoding of | |||
| frames, but it means that an endpoint cannot send a frame of a type | frames, but it means that an endpoint cannot send a frame of a type | |||
| that is unknown to its peer. | that is unknown to its peer. | |||
| 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 | |||
| skipping to change at page 110, line 48 ¶ | skipping to change at page 112, line 48 ¶ | |||
| INTERNAL_ERROR (0x1): The endpoint encountered an internal error and | INTERNAL_ERROR (0x1): The endpoint encountered an internal error and | |||
| cannot continue with the connection. | cannot continue with the connection. | |||
| SERVER_BUSY (0x2): The server is currently busy and does not accept | SERVER_BUSY (0x2): The server is currently busy and does not accept | |||
| any new connections. | any new connections. | |||
| FLOW_CONTROL_ERROR (0x3): An endpoint received more data than it | FLOW_CONTROL_ERROR (0x3): An endpoint received more data than it | |||
| permitted in its advertised data limits (see Section 4). | permitted in its advertised data limits (see Section 4). | |||
| STREAM_ID_ERROR (0x4): An endpoint received a frame for a stream | STREAM_LIMIT_ERROR (0x4): An endpoint received a frame for a stream | |||
| identifier that exceeded its advertised maximum stream ID. | identifier that exceeded its advertised stream limit for the | |||
| corresponding stream type. | ||||
| STREAM_STATE_ERROR (0x5): An endpoint received a frame for a stream | STREAM_STATE_ERROR (0x5): An endpoint received a frame for a stream | |||
| that was not in a state that permitted that frame (see Section 3). | that was not in a state that permitted that frame (see Section 3). | |||
| FINAL_OFFSET_ERROR (0x6): An endpoint received a STREAM frame | FINAL_OFFSET_ERROR (0x6): An endpoint received a STREAM frame | |||
| containing data that exceeded the previously established final | containing data that exceeded the previously established final | |||
| offset. Or an endpoint received a RST_STREAM frame containing a | offset. Or an endpoint received a RESET_STREAM frame containing a | |||
| final offset that was lower than the maximum offset of data that | final offset that was lower than the maximum offset of data that | |||
| was already received. Or an endpoint received a RST_STREAM frame | was already received. Or an endpoint received a RESET_STREAM | |||
| containing a different final offset to the one already | frame containing a different final offset to the one already | |||
| established. | established. | |||
| FRAME_ENCODING_ERROR (0x7): An endpoint received a frame that was | FRAME_ENCODING_ERROR (0x7): 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 (0x8): An endpoint received transport | |||
| parameters that were badly formatted, included an invalid value, | parameters that were badly formatted, included an invalid value, | |||
| was absent even though it is mandatory, was present though it is | was absent even though it is mandatory, was present though it is | |||
| skipping to change at page 111, line 48 ¶ | skipping to change at page 113, line 51 ¶ | |||
| when TLS is used for the crypto handshake are described in | when TLS is used for the crypto handshake are described in | |||
| Section 4.8 of [QUIC-TLS]. | Section 4.8 of [QUIC-TLS]. | |||
| See Section 22.3 for details of registering new error codes. | See Section 22.3 for details of registering new error codes. | |||
| 20.1. Application Protocol Error Codes | 20.1. Application Protocol Error Codes | |||
| Application protocol error codes are 16-bit unsigned integers, but | Application protocol error codes are 16-bit unsigned integers, but | |||
| the management of application error codes are left to application | the management of application error codes are left to application | |||
| protocols. Application protocol error codes are used for the | protocols. Application protocol error codes are used for the | |||
| RST_STREAM (Section 19.2) and APPLICATION_CLOSE (Section 19.4) | RESET_STREAM frame (Section 19.4) and the CONNECTION_CLOSE frame with | |||
| frames. | a type of 0x1d (Section 19.19). | |||
| There is no restriction on the use of the 16-bit error code space for | ||||
| application protocols. However, QUIC reserves the error code with a | ||||
| value of 0 to mean STOPPING. The application error code of STOPPING | ||||
| (0) is used by the transport to cancel a stream in response to | ||||
| receipt of a STOP_SENDING frame. | ||||
| 21. Security Considerations | 21. Security Considerations | |||
| 21.1. Handshake Denial of Service | 21.1. 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.1.1), but the use of | unauthenticated ICMP packets (see Section 14.2), but the use of these | |||
| these packets is extremely limited. The only other type of packet | packets is extremely limited. The only other type of packet that an | |||
| that an endpoint might accept is a stateless reset (Section 10.4) | endpoint might accept is a stateless reset (Section 10.4) which | |||
| which relies on the token being kept secret until it is used. | 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 attack 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. | |||
| The first mechanism used is the source and destination connection | The first mechanism used is the source and destination connection | |||
| IDs, which are required to match those set by a peer. Except for an | IDs, which are required to match those set by a peer. Except for an | |||
| Initial and stateless reset packets, an endpoint only accepts packets | Initial and stateless reset packets, an endpoint only accepts packets | |||
| that include a destination connection that matches a connection ID | that include a destination connection that matches a connection ID | |||
| the endpoint previously chose. This is the only protection offered | the endpoint previously chose. This is the only protection offered | |||
| skipping to change at page 113, line 14 ¶ | skipping to change at page 115, line 10 ¶ | |||
| most part, the cryptographic handshake protocol [QUIC-TLS] is | most part, the cryptographic handshake protocol [QUIC-TLS] is | |||
| responsible for detecting tampering during the handshake, though | responsible for detecting tampering during the handshake, though | |||
| additional validation is required for version negotiation (see | additional validation is required for version negotiation (see | |||
| Section 7.3.3). | Section 7.3.3). | |||
| Endpoints are permitted to use other methods to detect and attempt to | Endpoints are permitted to use other methods to detect and attempt to | |||
| recover from interference with the handshake. Invalid packets may be | recover from interference with the handshake. Invalid packets may be | |||
| identified and discarded using other methods, but no specific method | identified and discarded using other methods, but no specific method | |||
| is mandated in this document. | is mandated in this document. | |||
| 21.2. Spoofed ACK Attack | 21.2. Amplification Attack | |||
| An attacker might be able to receive an address validation token | An attacker might be able to receive an address validation token | |||
| (Section 8) from the server and then release the IP address it used | (Section 8) from a server and then release the IP address it used to | |||
| to acquire that token. The attacker may, in the future, spoof this | acquire that token. At a later time, the attacker may initiate a | |||
| same address (which now presumably addresses a different endpoint), | 0-RTT connection with a server by spoofing this same address, which | |||
| and initiate a 0-RTT connection with a server on the victim's behalf. | might now address a different (victim) endpoint. The attacker can | |||
| The attacker can then spoof ACK frames to the server which cause the | thus potentially cause the server to send an initial congestion | |||
| server to send excessive amounts of data toward the new owner of the | window's worth of data towards the victim. | |||
| IP address. | ||||
| There are two possible mitigations to this attack. The simplest one | ||||
| is that a server can unilaterally create a gap in packet-number | ||||
| space. In the non-attack scenario, the client will send an ACK frame | ||||
| with the larger value for largest acknowledged. In the attack | ||||
| scenario, the attacker could acknowledge a packet in the gap. If the | ||||
| server sees an acknowledgment for a packet that was never sent, the | ||||
| connection can be aborted. | ||||
| The second mitigation is that the server can require that | Servers SHOULD provide mitigations for this attack by limiting the | |||
| acknowledgments for sent packets match the encryption level of the | usage and lifetime of address validation tokens (see Section 8.1.2). | |||
| sent packet. This mitigation is useful if the connection has an | ||||
| ephemeral forward-secure key that is generated and used for every new | ||||
| connection. If a packet sent is protected with a forward-secure key, | ||||
| then any acknowledgments that are received for them MUST also be | ||||
| forward-secure protected. Since the attacker will not have the | ||||
| forward-secure key, the attacker will not be able to generate | ||||
| forward-secure protected packets with ACK frames. | ||||
| 21.3. Optimistic ACK Attack | 21.3. Optimistic ACK Attack | |||
| An endpoint that acknowledges packets it has not received might cause | An endpoint that acknowledges packets it has not received might cause | |||
| a congestion controller to permit sending at rates beyond what the | a congestion controller to permit sending at rates beyond what the | |||
| network supports. An endpoint MAY skip packet numbers when sending | network supports. An endpoint MAY skip packet numbers when sending | |||
| packets to detect this behavior. An endpoint can then immediately | packets to detect this behavior. An endpoint can then immediately | |||
| close the connection with a connection error of type | close the connection with a connection error of type | |||
| PROTOCOL_VIOLATION (see Section 10.3). | PROTOCOL_VIOLATION (see Section 10.3). | |||
| skipping to change at page 115, line 14 ¶ | skipping to change at page 116, line 44 ¶ | |||
| 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 | |||
| intervals, transmission error may cause STREAM DATA frames opening | intervals, transmission error may cause STREAM DATA frames opening | |||
| streams to be received out of sequence. A receiver is obligated to | streams to be received out of sequence. A receiver is obligated to | |||
| open intervening streams if a higher-numbered stream ID is received. | open intervening streams if a higher-numbered stream ID is received. | |||
| Thus, on a new connection, opening stream 2000001 opens 1 million | Thus, on a new connection, opening stream 2000001 opens 1 million | |||
| streams, as required by the specification. | streams, as required by the specification. | |||
| The number of active streams is limited by the concurrent stream | The number of active streams is limited by the concurrent stream | |||
| limit transport parameter, as explained in Section 2.2. If chosen | limit transport parameter, as explained in Section 4.5. If chosen | |||
| judiciously, this limit mitigates the effect of the stream commitment | judiciously, this limit mitigates the effect of the stream commitment | |||
| attack. However, setting the limit too low could affect performance | attack. However, setting the limit too low could affect performance | |||
| when applications expect to open large number of streams. | when applications expect to open large number of streams. | |||
| 21.7. Explicit Congestion Notification Attacks | 21.7. Explicit Congestion Notification Attacks | |||
| An on-path attacker could manipulate the value of ECN codepoints in | An on-path attacker could manipulate the value of ECN codepoints in | |||
| the IP header to influence the sender's rate. [RFC3168] discusses | the IP header to influence the sender's rate. [RFC3168] discusses | |||
| manipulations and their effects in more detail. | manipulations and their effects in more detail. | |||
| skipping to change at page 116, line 40 ¶ | skipping to change at page 118, line 28 ¶ | |||
| Specification: A reference to a publicly available specification for | Specification: A reference to a publicly available specification for | |||
| the value. | the value. | |||
| The nominated expert(s) verify that a specification exists and is | The nominated expert(s) verify that a specification exists and is | |||
| readily accessible. Expert(s) are encouraged to be biased towards | readily accessible. Expert(s) are encouraged to be biased towards | |||
| approving registrations unless they are abusive, frivolous, or | approving registrations unless they are abusive, frivolous, or | |||
| actively harmful (not merely aesthetically displeasing, or | actively harmful (not merely aesthetically displeasing, or | |||
| architecturally dubious). | architecturally dubious). | |||
| The initial contents of this registry are shown in Table 7. | The initial contents of this registry are shown in Table 6. | |||
| +--------+-------------------------------------+---------------+ | +--------+-------------------------------------+---------------+ | |||
| | Value | Parameter Name | Specification | | | Value | Parameter Name | Specification | | |||
| +--------+-------------------------------------+---------------+ | +--------+-------------------------------------+---------------+ | |||
| | 0x0000 | initial_max_stream_data_bidi_local | Section 18.1 | | | 0x0000 | original_connection_id | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0001 | initial_max_data | Section 18.1 | | | 0x0001 | idle_timeout | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0002 | initial_max_bidi_streams | Section 18.1 | | | 0x0002 | stateless_reset_token | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0003 | idle_timeout | Section 18.1 | | | 0x0003 | max_packet_size | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0004 | preferred_address | Section 18.1 | | | 0x0004 | initial_max_data | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0005 | max_packet_size | Section 18.1 | | | 0x0005 | initial_max_stream_data_bidi_local | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0006 | stateless_reset_token | Section 18.1 | | | 0x0006 | initial_max_stream_data_bidi_remote | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0007 | ack_delay_exponent | Section 18.1 | | | 0x0007 | initial_max_stream_data_uni | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0008 | initial_max_uni_streams | Section 18.1 | | | 0x0008 | initial_max_streams_bidi | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x0009 | disable_migration | Section 18.1 | | | 0x0009 | initial_max_streams_uni | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x000a | initial_max_stream_data_bidi_remote | Section 18.1 | | | 0x000a | ack_delay_exponent | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x000b | initial_max_stream_data_uni | Section 18.1 | | | 0x000b | max_ack_delay | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x000c | max_ack_delay | Section 18.1 | | | 0x000c | disable_migration | Section 18.1 | | |||
| | | | | | | | | | | |||
| | 0x000d | original_connection_id | Section 18.1 | | | 0x000d | preferred_address | Section 18.1 | | |||
| +--------+-------------------------------------+---------------+ | +--------+-------------------------------------+---------------+ | |||
| Table 7: Initial QUIC Transport Parameters Entries | Table 6: Initial QUIC Transport Parameters Entries | |||
| 22.2. QUIC Frame Type Registry | 22.2. QUIC Frame Type Registry | |||
| IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a | IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a | |||
| "QUIC Protocol" heading. | "QUIC Protocol" heading. | |||
| The "QUIC Frame Types" registry governs a 62-bit space. This space | The "QUIC Frame Types" registry governs a 62-bit space. This space | |||
| is split into three spaces that are governed by different policies. | is split into three spaces that are governed by different policies. | |||
| Values between 0x00 and 0x3f (in hexadecimal) are assigned via the | Values between 0x00 and 0x3f (in hexadecimal) are assigned via the | |||
| Standards Action or IESG Review policies [RFC8126]. Values from 0x40 | Standards Action or IESG Review policies [RFC8126]. Values from 0x40 | |||
| skipping to change at page 119, line 5 ¶ | skipping to change at page 121, line 5 ¶ | |||
| between 0x0000 and 0xfeff). | between 0x0000 and 0xfeff). | |||
| Code: A short mnemonic for the parameter. | Code: A short mnemonic for the parameter. | |||
| Description: A brief description of the error code semantics, which | Description: A brief description of the error code semantics, which | |||
| MAY be a summary if a specification reference is provided. | MAY be a summary if a specification reference is provided. | |||
| Specification: A reference to a publicly available specification for | Specification: A reference to a publicly available specification for | |||
| the value. | the value. | |||
| The initial contents of this registry are shown in Table 8. Values | The initial contents of this registry are shown in Table 7. Values | |||
| from 0xFF00 to 0xFFFF are reserved for Private Use [RFC8126]. | from 0xFF00 to 0xFFFF are reserved for Private Use [RFC8126]. | |||
| +------+---------------------------+----------------+---------------+ | +------+---------------------------+----------------+---------------+ | |||
| | Valu | Error | Description | Specification | | | Valu | Error | Description | Specification | | |||
| | e | | | | | | e | | | | | |||
| +------+---------------------------+----------------+---------------+ | +------+---------------------------+----------------+---------------+ | |||
| | 0x0 | NO_ERROR | No error | Section 20 | | | 0x0 | NO_ERROR | No error | Section 20 | | |||
| | | | | | | | | | | | | |||
| | 0x1 | INTERNAL_ERROR | Implementation | Section 20 | | | 0x1 | INTERNAL_ERROR | Implementation | Section 20 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | 0x2 | SERVER_BUSY | Server | Section 20 | | | 0x2 | SERVER_BUSY | Server | Section 20 | | |||
| | | | currently busy | | | | | | currently busy | | | |||
| | | | | | | | | | | | | |||
| | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 20 | | | 0x3 | FLOW_CONTROL_ERROR | Flow control | Section 20 | | |||
| | | | error | | | | | | error | | | |||
| | | | | | | | | | | | | |||
| | 0x4 | STREAM_ID_ERROR | Invalid stream | Section 20 | | | 0x4 | STREAM_LIMIT_ERROR | Too many | Section 20 | | |||
| | | | ID | | | | | | streams opened | | | |||
| | | | | | | | | | | | | |||
| | 0x5 | STREAM_STATE_ERROR | Frame received | Section 20 | | | 0x5 | STREAM_STATE_ERROR | Frame received | Section 20 | | |||
| | | | in invalid | | | | | | in invalid | | | |||
| | | | stream state | | | | | | stream state | | | |||
| | | | | | | | | | | | | |||
| | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 20 | | | 0x6 | FINAL_OFFSET_ERROR | Change to | Section 20 | | |||
| | | | final stream | | | | | | final stream | | | |||
| | | | offset | | | | | | offset | | | |||
| | | | | | | | | | | | | |||
| | 0x7 | FRAME_ENCODING_ERROR | Frame encoding | Section 20 | | | 0x7 | FRAME_ENCODING_ERROR | Frame encoding | Section 20 | | |||
| skipping to change at page 120, line 51 ¶ | skipping to change at page 122, line 51 ¶ | |||
| | | | | | | | | | | | | |||
| | 0xA | PROTOCOL_VIOLATION | Generic | Section 20 | | | 0xA | PROTOCOL_VIOLATION | Generic | Section 20 | | |||
| | | | protocol | | | | | | protocol | | | |||
| | | | violation | | | | | | violation | | | |||
| | | | | | | | | | | | | |||
| | 0xC | INVALID_MIGRATION | Violated | Section 20 | | | 0xC | INVALID_MIGRATION | Violated | Section 20 | | |||
| | | | disabled | | | | | | disabled | | | |||
| | | | migration | | | | | | migration | | | |||
| +------+---------------------------+----------------+---------------+ | +------+---------------------------+----------------+---------------+ | |||
| Table 8: Initial QUIC Transport Error Codes Entries | Table 7: Initial QUIC Transport Error Codes Entries | |||
| 23. References | 23. References | |||
| 23.1. Normative References | 23.1. Normative References | |||
| [PLPMTUD] Mathis, M. and J. Heffner, "Packetization Layer Path MTU | [DPLPMTUD] | |||
| Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007, | Fairhurst, G., Jones, T., Tuexen, M., and I. Ruengeler, | |||
| <https://www.rfc-editor.org/info/rfc4821>. | "Packetization Layer Path MTU Discovery for Datagram | |||
| Transports", draft-ietf-tsvwg-datagram-plpmtud-06 (work in | ||||
| [PMTUDv4] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | progress), November 2018. | |||
| DOI 10.17487/RFC1191, November 1990, | ||||
| <https://www.rfc-editor.org/info/rfc1191>. | ||||
| [PMTUDv6] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | ||||
| "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | ||||
| DOI 10.17487/RFC8201, July 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8201>. | ||||
| [QUIC-RECOVERY] | [QUIC-RECOVERY] | |||
| Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | Iyengar, J., Ed. and I. Swett, Ed., "QUIC Loss Detection | |||
| and Congestion Control", draft-ietf-quic-recovery-16 (work | and Congestion Control", draft-ietf-quic-recovery-17 (work | |||
| in progress), October 2018. | in progress), December 2018. | |||
| [QUIC-TLS] | [QUIC-TLS] | |||
| Thomson, M., Ed. and S. Turner, Ed., "Using Transport | Thomson, M., Ed. and S. Turner, Ed., "Using Transport | |||
| Layer Security (TLS) to Secure QUIC", draft-ietf-quic- | Layer Security (TLS) to Secure QUIC", draft-ietf-quic- | |||
| tls-16 (work in progress), October 2018. | tls-17 (work in progress), December 2018. | |||
| [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191, | ||||
| DOI 10.17487/RFC1191, November 1990, | ||||
| <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>. | |||
| [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>. | |||
| skipping to change at page 122, line 10 ¶ | skipping to change at page 124, line 5 ¶ | |||
| [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, | |||
| "Randomness Requirements for Security", BCP 106, RFC 4086, | "Randomness Requirements for Security", BCP 106, RFC 4086, | |||
| DOI 10.17487/RFC4086, June 2005, | DOI 10.17487/RFC4086, June 2005, | |||
| <https://www.rfc-editor.org/info/rfc4086>. | <https://www.rfc-editor.org/info/rfc4086>. | |||
| [RFC5119] Edwards, T., "A Uniform Resource Name (URN) Namespace for | [RFC5119] Edwards, T., "A Uniform Resource Name (URN) Namespace for | |||
| the Society of Motion Picture and Television Engineers | the Society of Motion Picture and Television Engineers | |||
| (SMPTE)", RFC 5119, DOI 10.17487/RFC5119, February 2008, | (SMPTE)", RFC 5119, DOI 10.17487/RFC5119, February 2008, | |||
| <https://www.rfc-editor.org/info/rfc5119>. | <https://www.rfc-editor.org/info/rfc5119>. | |||
| [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | ||||
| Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | ||||
| March 2017, <https://www.rfc-editor.org/info/rfc8085>. | ||||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | ||||
| "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | ||||
| DOI 10.17487/RFC8201, July 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8201>. | ||||
| [RFC8311] Black, D., "Relaxing Restrictions on Explicit Congestion | [RFC8311] Black, D., "Relaxing Restrictions on Explicit Congestion | |||
| Notification (ECN) Experimentation", RFC 8311, | Notification (ECN) Experimentation", RFC 8311, | |||
| DOI 10.17487/RFC8311, January 2018, | DOI 10.17487/RFC8311, January 2018, | |||
| <https://www.rfc-editor.org/info/rfc8311>. | <https://www.rfc-editor.org/info/rfc8311>. | |||
| [SPIN] Trammell, B. and M. Kuehlewind, "The QUIC Latency Spin | ||||
| Bit", draft-ietf-quic-spin-exp-01 (work in progress), | ||||
| October 2018. | ||||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| 23.2. Informative References | 23.2. Informative References | |||
| [EARLY-DESIGN] | [EARLY-DESIGN] | |||
| Roskind, J., "QUIC: Multiplexed Transport Over UDP", | Roskind, J., "QUIC: Multiplexed Transport Over UDP", | |||
| December 2013, <https://goo.gl/dMVtFi>. | December 2013, <https://goo.gl/dMVtFi>. | |||
| [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [HTTP2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| [QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
| Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
| draft-ietf-quic-invariants-03 (work in progress), October | draft-ietf-quic-invariants-03 (work in progress), December | |||
| 2018. | 2018. | |||
| [RFC1812] Baker, F., Ed., "Requirements for IP Version 4 Routers", | ||||
| RFC 1812, DOI 10.17487/RFC1812, June 1995, | ||||
| <https://www.rfc-editor.org/info/rfc1812>. | ||||
| [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | |||
| Selective Acknowledgment Options", RFC 2018, | Selective Acknowledgment Options", RFC 2018, | |||
| DOI 10.17487/RFC2018, October 1996, | DOI 10.17487/RFC2018, October 1996, | |||
| <https://www.rfc-editor.org/info/rfc2018>. | <https://www.rfc-editor.org/info/rfc2018>. | |||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | |||
| Hashing for Message Authentication", RFC 2104, | Hashing for Message Authentication", RFC 2104, | |||
| DOI 10.17487/RFC2104, February 1997, | DOI 10.17487/RFC2104, February 1997, | |||
| <https://www.rfc-editor.org/info/rfc2104>. | <https://www.rfc-editor.org/info/rfc2104>. | |||
| [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | [RFC2360] Scott, G., "Guide for Internet Standards Writers", BCP 22, | |||
| RFC 2360, DOI 10.17487/RFC2360, June 1998, | RFC 2360, DOI 10.17487/RFC2360, June 1998, | |||
| <https://www.rfc-editor.org/info/rfc2360>. | <https://www.rfc-editor.org/info/rfc2360>. | |||
| [RFC2406] Kent, S. and R. Atkinson, "IP Encapsulating Security | [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", | |||
| Payload (ESP)", RFC 2406, DOI 10.17487/RFC2406, November | RFC 4303, DOI 10.17487/RFC4303, December 2005, | |||
| 1998, <https://www.rfc-editor.org/info/rfc2406>. | <https://www.rfc-editor.org/info/rfc4303>. | |||
| [RFC4443] Conta, A., Deering, S., and M. Gupta, Ed., "Internet | ||||
| Control Message Protocol (ICMPv6) for the Internet | ||||
| Protocol Version 6 (IPv6) Specification", STD 89, | ||||
| RFC 4443, DOI 10.17487/RFC4443, March 2006, | ||||
| <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>. | |||
| [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>. | |||
| [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [RFC8200] Deering, S. and R. Hinden, "Internet Protocol, Version 6 | ||||
| (IPv6) Specification", STD 86, RFC 8200, | ||||
| DOI 10.17487/RFC8200, July 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8200>. | ||||
| [SLOWLORIS] | [SLOWLORIS] | |||
| RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | RSnake Hansen, R., "Welcome to Slowloris...", June 2009, | |||
| <https://web.archive.org/web/20150315054838/ | <https://web.archive.org/web/20150315054838/ | |||
| http://ha.ckers.org/slowloris/>. | http://ha.ckers.org/slowloris/>. | |||
| [SST] Ford, B., "Structured streams", ACM SIGCOMM Computer | ||||
| Communication Review Vol. 37, pp. 361, | ||||
| DOI 10.1145/1282427.1282421, October 2007. | ||||
| Appendix A. Sample Packet Number Decoding Algorithm | Appendix A. Sample Packet Number Decoding Algorithm | |||
| The following pseudo-code shows how an implementation can decode | The following pseudo-code shows how an implementation can decode | |||
| packet numbers after packet number protection has been removed. | packet numbers after header protection has been removed. | |||
| DecodePacketNumber(largest_pn, truncated_pn, pn_nbits): | DecodePacketNumber(largest_pn, truncated_pn, pn_nbits): | |||
| expected_pn = largest_pn + 1 | expected_pn = largest_pn + 1 | |||
| pn_win = 1 << pn_nbits | pn_win = 1 << pn_nbits | |||
| pn_hwin = pn_win / 2 | pn_hwin = pn_win / 2 | |||
| pn_mask = pn_win - 1 | pn_mask = pn_win - 1 | |||
| // The incoming packet number should be greater than | // The incoming packet number should be greater than | |||
| // expected_pn - pn_hwin and less than or equal to | // expected_pn - pn_hwin and less than or equal to | |||
| // expected_pn + pn_hwin | // expected_pn + pn_hwin | |||
| // | // | |||
| skipping to change at page 124, line 37 ¶ | skipping to change at page 126, line 47 ¶ | |||
| return candidate_pn - pn_win | return candidate_pn - pn_win | |||
| return candidate_pn | return candidate_pn | |||
| Appendix B. Change Log | Appendix B. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| B.1. Since draft-ietf-quic-transport-15 | B.1. 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 | ||||
| * 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 avaialble (#1951, | ||||
| #2045) | ||||
| o ICMP PTB validation clarifications (#2161, #2109, #2108) | ||||
| B.2. Since draft-ietf-quic-transport-15 | ||||
| Substantial editorial reorganization; no technical changes. | Substantial editorial reorganization; no technical changes. | |||
| B.2. Since draft-ietf-quic-transport-14 | B.3. Since draft-ietf-quic-transport-14 | |||
| o Merge ACK and ACK_ECN (#1778, #1801) | o Merge ACK and ACK_ECN (#1778, #1801) | |||
| o Explicitly communicate max_ack_delay (#981, #1781) | o Explicitly communicate max_ack_delay (#981, #1781) | |||
| o Validate original connection ID after Retry packets (#1710, #1486, | o Validate original connection ID after Retry packets (#1710, #1486, | |||
| #1793) | #1793) | |||
| o Idle timeout is optional and has no specified maximum (#1765) | o Idle timeout is optional and has no specified maximum (#1765) | |||
| o Update connection ID handling; add RETIRE_CONNECTION_ID type | o Update connection ID handling; add RETIRE_CONNECTION_ID type | |||
| (#1464, #1468, #1483, #1484, #1486, #1495, #1729, #1742, #1799, | (#1464, #1468, #1483, #1484, #1486, #1495, #1729, #1742, #1799, | |||
| #1821) | #1821) | |||
| o Include a Token in all Initial packets (#1649, #1794) | o Include a Token in all Initial packets (#1649, #1794) | |||
| o Prevent handshake deadlock (#1764, #1824) | o Prevent handshake deadlock (#1764, #1824) | |||
| B.3. Since draft-ietf-quic-transport-13 | B.4. Since draft-ietf-quic-transport-13 | |||
| o Streams open when higher-numbered streams of the same type open | o Streams open when higher-numbered streams of the same type open | |||
| (#1342, #1549) | (#1342, #1549) | |||
| o Split initial stream flow control limit into 3 transport | o Split initial stream flow control limit into 3 transport | |||
| parameters (#1016, #1542) | parameters (#1016, #1542) | |||
| o All flow control transport parameters are optional (#1610) | o All flow control transport parameters are optional (#1610) | |||
| o Removed UNSOLICITED_PATH_RESPONSE error code (#1265, #1539) | o Removed UNSOLICITED_PATH_RESPONSE error code (#1265, #1539) | |||
| skipping to change at page 125, line 36 ¶ | skipping to change at page 129, line 4 ¶ | |||
| o Recommended defense against stateless reset spoofing (#1386, | o Recommended defense against stateless reset spoofing (#1386, | |||
| #1554) | #1554) | |||
| o Prevent infinite stateless reset exchanges (#1443, #1627) | o Prevent infinite stateless reset exchanges (#1443, #1627) | |||
| o Forbid processing of the same packet number twice (#1405, #1624) | o Forbid processing of the same packet number twice (#1405, #1624) | |||
| o Added a packet number decoding example (#1493) | o Added a packet number decoding example (#1493) | |||
| o More precisely define idle timeout (#1429, #1614, #1652) | o More precisely define idle timeout (#1429, #1614, #1652) | |||
| o Corrected format of Retry packet and prevented looping (#1492, | o Corrected format of Retry packet and prevented looping (#1492, | |||
| #1451, #1448, #1498) | #1451, #1448, #1498) | |||
| o Permit 0-RTT after receiving Version Negotiation or Retry (#1507, | o Permit 0-RTT after receiving Version Negotiation or Retry (#1507, | |||
| #1514, #1621) | #1514, #1621) | |||
| o Permit Retry in response to 0-RTT (#1547, #1552) | o Permit Retry in response to 0-RTT (#1547, #1552) | |||
| o Looser verification of ECN counters to account for ACK loss | o Looser verification of ECN counters to account for ACK loss | |||
| (#1555, #1481, #1565) | (#1555, #1481, #1565) | |||
| o Remove frame type field from APPLICATION_CLOSE (#1508, #1528) | o Remove frame type field from APPLICATION_CLOSE (#1508, #1528) | |||
| B.4. Since draft-ietf-quic-transport-12 | B.5. Since draft-ietf-quic-transport-12 | |||
| o Changes to integration of the TLS handshake (#829, #1018, #1094, | o Changes to integration of the TLS handshake (#829, #1018, #1094, | |||
| #1165, #1190, #1233, #1242, #1252, #1450, #1458) | #1165, #1190, #1233, #1242, #1252, #1450, #1458) | |||
| * The cryptographic handshake uses CRYPTO frames, not stream 0 | * The cryptographic handshake uses CRYPTO frames, not stream 0 | |||
| * QUIC packet protection is used in place of TLS record | * QUIC packet protection is used in place of TLS record | |||
| protection | protection | |||
| * Separate QUIC packet number spaces are used for the handshake | * Separate QUIC packet number spaces are used for the handshake | |||
| skipping to change at page 126, line 48 ¶ | skipping to change at page 130, line 14 ¶ | |||
| o Fixed sampling method for packet number encryption; the length | o Fixed sampling method for packet number encryption; the length | |||
| field in long headers includes the packet number field in addition | field in long headers includes the packet number field in addition | |||
| to the packet payload (#1387, #1389) | to the packet payload (#1387, #1389) | |||
| o Stateless Reset is now symmetric and subject to size constraints | o Stateless Reset is now symmetric and subject to size constraints | |||
| (#466, #1346) | (#466, #1346) | |||
| o Added frame type extension mechanism (#58, #1473) | o Added frame type extension mechanism (#58, #1473) | |||
| B.5. Since draft-ietf-quic-transport-11 | B.6. Since draft-ietf-quic-transport-11 | |||
| o Enable server to transition connections to a preferred address | o Enable server to transition connections to a preferred address | |||
| (#560, #1251) | (#560, #1251) | |||
| o Packet numbers are encrypted (#1174, #1043, #1048, #1034, #850, | o Packet numbers are encrypted (#1174, #1043, #1048, #1034, #850, | |||
| #990, #734, #1317, #1267, #1079) | #990, #734, #1317, #1267, #1079) | |||
| o Packet numbers use a variable-length encoding (#989, #1334) | o Packet numbers use a variable-length encoding (#989, #1334) | |||
| o STREAM frames can now be empty (#1350) | o STREAM frames can now be empty (#1350) | |||
| B.6. Since draft-ietf-quic-transport-10 | B.7. Since draft-ietf-quic-transport-10 | |||
| o Swap payload length and packed number fields in long header | o Swap payload length and packed number fields in long header | |||
| (#1294) | (#1294) | |||
| o Clarified that CONNECTION_CLOSE is allowed in Handshake packet | o Clarified that CONNECTION_CLOSE is allowed in Handshake packet | |||
| (#1274) | (#1274) | |||
| o Spin bit reserved (#1283) | o Spin bit reserved (#1283) | |||
| o Coalescing multiple QUIC packets in a UDP datagram (#1262, #1285) | o Coalescing multiple QUIC packets in a UDP datagram (#1262, #1285) | |||
| skipping to change at page 127, line 39 ¶ | skipping to change at page 131, line 4 ¶ | |||
| o Removed implicit stream opening (#896, #1193) | o Removed implicit stream opening (#896, #1193) | |||
| o An empty STREAM frame can be used to open a stream without sending | o An empty STREAM frame can be used to open a stream without sending | |||
| data (#901, #1194) | data (#901, #1194) | |||
| o Define stream counts in transport parameters rather than a maximum | o Define stream counts in transport parameters rather than a maximum | |||
| stream ID (#1023, #1065) | stream ID (#1023, #1065) | |||
| o STOP_SENDING is now prohibited before streams are used (#1050) | o STOP_SENDING is now prohibited before streams are used (#1050) | |||
| o Recommend including ACK in Retry packets and allow PADDING (#1067, | o Recommend including ACK in Retry packets and allow PADDING (#1067, | |||
| #882) | #882) | |||
| o Endpoints now become closing after an idle timeout (#1178, #1179) | o Endpoints now become closing after an idle timeout (#1178, #1179) | |||
| o Remove implication that Version Negotiation is sent when a packet | o Remove implication that Version Negotiation is sent when a packet | |||
| of the wrong version is received (#1197) | of the wrong version is received (#1197) | |||
| B.7. Since draft-ietf-quic-transport-09 | B.8. Since draft-ietf-quic-transport-09 | |||
| o Added PATH_CHALLENGE and PATH_RESPONSE frames to replace PING with | o Added PATH_CHALLENGE and PATH_RESPONSE frames to replace PING with | |||
| Data and PONG frame. Changed ACK frame type from 0x0e to 0x0d. | Data and PONG frame. Changed ACK frame type from 0x0e to 0x0d. | |||
| (#1091, #725, #1086) | (#1091, #725, #1086) | |||
| o A server can now only send 3 packets without validating the client | o A server can now only send 3 packets without validating the client | |||
| address (#38, #1090) | address (#38, #1090) | |||
| o Delivery order of stream data is no longer strongly specified | o Delivery order of stream data is no longer strongly specified | |||
| (#252, #1070) | (#252, #1070) | |||
| skipping to change at page 128, line 26 ¶ | skipping to change at page 131, line 39 ¶ | |||
| o Improved retransmission rules for all frame types: information is | o Improved retransmission rules for all frame types: information is | |||
| retransmitted, not packets or frames (#463, #765, #1095, #1053) | retransmitted, not packets or frames (#463, #765, #1095, #1053) | |||
| o Added an error code for server busy signals (#1137) | o Added an error code for server busy signals (#1137) | |||
| o Endpoints now set the connection ID that their peer uses. | o Endpoints now set the connection ID that their peer uses. | |||
| Connection IDs are variable length. Removed the | Connection IDs are variable length. Removed the | |||
| omit_connection_id transport parameter and the corresponding short | omit_connection_id transport parameter and the corresponding short | |||
| header flag. (#1089, #1052, #1146, #821, #745, #821, #1166, #1151) | header flag. (#1089, #1052, #1146, #821, #745, #821, #1166, #1151) | |||
| B.8. Since draft-ietf-quic-transport-08 | B.9. Since draft-ietf-quic-transport-08 | |||
| o Clarified requirements for BLOCKED usage (#65, #924) | o Clarified requirements for BLOCKED usage (#65, #924) | |||
| o BLOCKED frame now includes reason for blocking (#452, #924, #927, | o BLOCKED frame now includes reason for blocking (#452, #924, #927, | |||
| #928) | #928) | |||
| o GAP limitation in ACK Frame (#613) | o GAP limitation in ACK Frame (#613) | |||
| o Improved PMTUD description (#614, #1036) | o Improved PMTUD description (#614, #1036) | |||
| skipping to change at page 128, line 38 ¶ | skipping to change at page 132, line 4 ¶ | |||
| o Clarified requirements for BLOCKED usage (#65, #924) | o Clarified requirements for BLOCKED usage (#65, #924) | |||
| o BLOCKED frame now includes reason for blocking (#452, #924, #927, | o BLOCKED frame now includes reason for blocking (#452, #924, #927, | |||
| #928) | #928) | |||
| o GAP limitation in ACK Frame (#613) | o GAP limitation in ACK Frame (#613) | |||
| o Improved PMTUD description (#614, #1036) | o Improved PMTUD description (#614, #1036) | |||
| o Clarified stream state machine (#634, #662, #743, #894) | o Clarified stream state machine (#634, #662, #743, #894) | |||
| o Reserved versions don't need to be generated deterministically | o Reserved versions don't need to be generated deterministically | |||
| (#831, #931) | (#831, #931) | |||
| o You don't always need the draining period (#871) | o You don't always need the draining period (#871) | |||
| o Stateless reset clarified as version-specific (#930, #986) | o Stateless reset clarified as version-specific (#930, #986) | |||
| o initial_max_stream_id_x transport parameters are optional (#970, | o initial_max_stream_id_x transport parameters are optional (#970, | |||
| #971) | #971) | |||
| o Ack Delay assumes a default value during the handshake (#1007, | o Ack Delay assumes a default value during the handshake (#1007, | |||
| #1009) | #1009) | |||
| o Removed transport parameters from NewSessionTicket (#1015) | o Removed transport parameters from NewSessionTicket (#1015) | |||
| B.9. Since draft-ietf-quic-transport-07 | B.10. Since draft-ietf-quic-transport-07 | |||
| o The long header now has version before packet number (#926, #939) | o The long header now has version before packet number (#926, #939) | |||
| o Rename and consolidate packet types (#846, #822, #847) | o Rename and consolidate packet types (#846, #822, #847) | |||
| o Packet types are assigned new codepoints and the Connection ID | o Packet types are assigned new codepoints and the Connection ID | |||
| Flag is inverted (#426, #956) | Flag is inverted (#426, #956) | |||
| o Removed type for Version Negotiation and use Version 0 (#963, | o Removed type for Version Negotiation and use Version 0 (#963, | |||
| #968) | #968) | |||
| skipping to change at page 130, line 5 ¶ | skipping to change at page 133, line 15 ¶ | |||
| o Address validation for connection migration (#161, #732, #878) | o Address validation for connection migration (#161, #732, #878) | |||
| o Clearly defined retransmission rules for BLOCKED (#452, #65, #924) | o Clearly defined retransmission rules for BLOCKED (#452, #65, #924) | |||
| o negotiated_version is sent in server transport parameters (#710, | o negotiated_version is sent in server transport parameters (#710, | |||
| #959) | #959) | |||
| o Increased the range over which packet numbers are randomized | o Increased the range over which packet numbers are randomized | |||
| (#864, #850, #964) | (#864, #850, #964) | |||
| B.10. Since draft-ietf-quic-transport-06 | B.11. Since draft-ietf-quic-transport-06 | |||
| o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | o Replaced FNV-1a with AES-GCM for all "Cleartext" packets (#554) | |||
| o Split error code space between application and transport (#485) | o Split error code space between application and transport (#485) | |||
| o Stateless reset token moved to end (#820) | o Stateless reset token moved to end (#820) | |||
| o 1-RTT-protected long header types removed (#848) | o 1-RTT-protected long header types removed (#848) | |||
| o No acknowledgments during draining period (#852) | o No acknowledgments during draining period (#852) | |||
| o Remove "application close" as a separate close type (#854) | o Remove "application close" as a separate close type (#854) | |||
| o Remove timestamps from the ACK frame (#841) | o Remove timestamps from the ACK frame (#841) | |||
| o Require transport parameters to only appear once (#792) | o Require transport parameters to only appear once (#792) | |||
| B.11. Since draft-ietf-quic-transport-05 | B.12. Since draft-ietf-quic-transport-05 | |||
| o Stateless token is server-only (#726) | o Stateless token is server-only (#726) | |||
| o Refactor section on connection termination (#733, #748, #328, | o Refactor section on connection termination (#733, #748, #328, | |||
| #177) | #177) | |||
| o Limit size of Version Negotiation packet (#585) | o Limit size of Version Negotiation packet (#585) | |||
| o Clarify when and what to ack (#736) | o Clarify when and what to ack (#736) | |||
| o Renamed STREAM_ID_NEEDED to STREAM_ID_BLOCKED | o Renamed STREAM_ID_NEEDED to STREAM_ID_BLOCKED | |||
| o Clarify Keep-alive requirements (#729) | o Clarify Keep-alive requirements (#729) | |||
| B.12. Since draft-ietf-quic-transport-04 | B.13. Since draft-ietf-quic-transport-04 | |||
| o Introduce STOP_SENDING frame, RST_STREAM only resets in one | o Introduce STOP_SENDING frame, RESET_STREAM only resets in one | |||
| direction (#165) | direction (#165) | |||
| o Removed GOAWAY; application protocols are responsible for graceful | o Removed GOAWAY; application protocols are responsible for graceful | |||
| shutdown (#696) | shutdown (#696) | |||
| o Reduced the number of error codes (#96, #177, #184, #211) | o Reduced the number of error codes (#96, #177, #184, #211) | |||
| o Version validation fields can't move or change (#121) | o Version validation fields can't move or change (#121) | |||
| o Removed versions from the transport parameters in a | o Removed versions from the transport parameters in a | |||
| skipping to change at page 131, line 24 ¶ | skipping to change at page 134, line 34 ¶ | |||
| o Increased the maximum length of the Largest Acknowledged field in | o Increased the maximum length of the Largest Acknowledged field in | |||
| ACK frames to 64 bits (#629) | ACK frames to 64 bits (#629) | |||
| o truncate_connection_id is renamed to omit_connection_id (#659) | o truncate_connection_id is renamed to omit_connection_id (#659) | |||
| o CONNECTION_CLOSE terminates the connection like TCP RST (#330, | o CONNECTION_CLOSE terminates the connection like TCP RST (#330, | |||
| #328) | #328) | |||
| o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | o Update labels used in HKDF-Expand-Label to match TLS 1.3 (#642) | |||
| B.13. Since draft-ietf-quic-transport-03 | B.14. Since draft-ietf-quic-transport-03 | |||
| o Change STREAM and RST_STREAM layout | o Change STREAM and RESET_STREAM layout | |||
| o Add MAX_STREAM_ID settings | o Add MAX_STREAM_ID settings | |||
| B.14. Since draft-ietf-quic-transport-02 | B.15. Since draft-ietf-quic-transport-02 | |||
| o The size of the initial packet payload has a fixed minimum (#267, | o The size of the initial packet payload has a fixed minimum (#267, | |||
| #472) | #472) | |||
| o Define when Version Negotiation packets are ignored (#284, #294, | o Define when Version Negotiation packets are ignored (#284, #294, | |||
| #241, #143, #474) | #241, #143, #474) | |||
| o The 64-bit FNV-1a algorithm is used for integrity protection of | o The 64-bit FNV-1a algorithm is used for integrity protection of | |||
| unprotected packets (#167, #480, #481, #517) | unprotected packets (#167, #480, #481, #517) | |||
| skipping to change at page 132, line 27 ¶ | skipping to change at page 135, line 37 ¶ | |||
| linkability (#232, #491, #496) | linkability (#232, #491, #496) | |||
| o Transport parameters for 0-RTT are retained from a previous | o Transport parameters for 0-RTT are retained from a previous | |||
| connection (#405, #513, #512) | connection (#405, #513, #512) | |||
| * A client in 0-RTT no longer required to reset excess streams | * A client in 0-RTT no longer required to reset excess streams | |||
| (#425, #479) | (#425, #479) | |||
| o Expanded security considerations (#440, #444, #445, #448) | o Expanded security considerations (#440, #444, #445, #448) | |||
| B.15. Since draft-ietf-quic-transport-01 | B.16. Since draft-ietf-quic-transport-01 | |||
| o Defined short and long packet headers (#40, #148, #361) | o Defined short and long packet headers (#40, #148, #361) | |||
| o Defined a versioning scheme and stable fields (#51, #361) | o Defined a versioning scheme and stable fields (#51, #361) | |||
| o Define reserved version values for "greasing" negotiation (#112, | o Define reserved version values for "greasing" negotiation (#112, | |||
| #278) | #278) | |||
| o The initial packet number is randomized (#35, #283) | o The initial packet number is randomized (#35, #283) | |||
| skipping to change at page 133, line 40 ¶ | skipping to change at page 136, line 49 ¶ | |||
| o Error handling definitions (#335) | o Error handling definitions (#335) | |||
| o Split error codes into four sections (#74) | o Split error codes into four sections (#74) | |||
| o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | o Forbid the use of Public Reset where CONNECTION_CLOSE is possible | |||
| (#289) | (#289) | |||
| o Define packet protection rules (#336) | o Define packet protection rules (#336) | |||
| o Require that stream be entirely delivered or reset, including | o Require that stream be entirely delivered or reset, including | |||
| acknowledgment of all STREAM frames or the RST_STREAM, before it | acknowledgment of all STREAM frames or the RESET_STREAM, before it | |||
| closes (#381) | closes (#381) | |||
| o Remove stream reservation from state machine (#174, #280) | o Remove stream reservation from state machine (#174, #280) | |||
| o Only stream 1 does not contribute to connection-level flow control | o Only stream 1 does not contribute to connection-level flow control | |||
| (#204) | (#204) | |||
| o Stream 1 counts towards the maximum concurrent stream limit (#201, | o Stream 1 counts towards the maximum concurrent stream limit (#201, | |||
| #282) | #282) | |||
| o Remove connection-level flow control exclusion for some streams | o Remove connection-level flow control exclusion for some streams | |||
| (except 1) (#246) | (except 1) (#246) | |||
| o RST_STREAM affects connection-level flow control (#162, #163) | o RESET_STREAM affects connection-level flow control (#162, #163) | |||
| o Flow control accounting uses the maximum data offset on each | o Flow control accounting uses the maximum data offset on each | |||
| stream, rather than bytes received (#378) | stream, rather than bytes received (#378) | |||
| o Moved length-determining fields to the start of STREAM and ACK | o Moved length-determining fields to the start of STREAM and ACK | |||
| (#168, #277) | (#168, #277) | |||
| o Added the ability to pad between frames (#158, #276) | o Added the ability to pad between frames (#158, #276) | |||
| o Remove error code and reason phrase from GOAWAY (#352, #355) | o Remove error code and reason phrase from GOAWAY (#352, #355) | |||
| o GOAWAY includes a final stream number for both directions (#347) | o GOAWAY includes a final stream number for both directions (#347) | |||
| o Error codes for RST_STREAM and CONNECTION_CLOSE are now at a | o Error codes for RESET_STREAM and CONNECTION_CLOSE are now at a | |||
| consistent offset (#249) | consistent offset (#249) | |||
| o Defined priority as the responsibility of the application protocol | o Defined priority as the responsibility of the application protocol | |||
| (#104, #303) | (#104, #303) | |||
| B.16. Since draft-ietf-quic-transport-00 | B.17. Since draft-ietf-quic-transport-00 | |||
| o Replaced DIVERSIFICATION_NONCE flag with KEY_PHASE flag | o Replaced DIVERSIFICATION_NONCE flag with KEY_PHASE flag | |||
| o Defined versioning | o Defined versioning | |||
| o Reworked description of packet and frame layout | o Reworked description of packet and frame layout | |||
| o Error code space is divided into regions for each component | o Error code space is divided into regions for each component | |||
| o Use big endian for all numeric values | o Use big endian for all numeric values | |||
| B.17. Since draft-hamilton-quic-transport-protocol-01 | B.18. Since draft-hamilton-quic-transport-protocol-01 | |||
| o Adopted as base for draft-ietf-quic-tls | o Adopted as base for draft-ietf-quic-tls | |||
| o Updated authors/editors list | o Updated authors/editors list | |||
| o Added IANA Considerations section | o Added IANA Considerations section | |||
| o Moved Contributors and Acknowledgments to appendices | o Moved Contributors and Acknowledgments to appendices | |||
| Acknowledgments | Acknowledgments | |||
| Special thanks are due to the following for helping shape pre-IETF | Special thanks are due to the following for helping shape pre-IETF | |||
| QUIC and its deployment: Chris Bentzel, Misha Efimov, Roberto Peon, | QUIC and its deployment: Chris Bentzel, Misha Efimov, Roberto Peon, | |||
| Alistair Riddoch, Siddharth Vijayakrishnan, and Assar Westerlund. | Alistair Riddoch, Siddharth Vijayakrishnan, and Assar Westerlund. | |||
| End of changes. 532 change blocks. | ||||
| 1885 lines changed or deleted | 2048 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||