| draft-ietf-quic-recovery-31.txt | draft-ietf-quic-recovery-32.txt | |||
|---|---|---|---|---|
| QUIC J. Iyengar, Ed. | QUIC J. Iyengar, Ed. | |||
| Internet-Draft Fastly | Internet-Draft Fastly | |||
| Intended status: Standards Track I. Swett, Ed. | Intended status: Standards Track I. Swett, Ed. | |||
| Expires: 29 March 2021 Google | Expires: 23 April 2021 Google | |||
| 25 September 2020 | 20 October 2020 | |||
| QUIC Loss Detection and Congestion Control | QUIC Loss Detection and Congestion Control | |||
| draft-ietf-quic-recovery-31 | draft-ietf-quic-recovery-32 | |||
| Abstract | Abstract | |||
| This document describes loss detection and congestion control | This document describes loss detection and congestion control | |||
| mechanisms for QUIC. | mechanisms for QUIC. | |||
| 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 (mailto:quic@ietf.org)), which is | mailing list (quic@ietf.org (mailto:quic@ietf.org)), which is | |||
| skipping to change at page 1, line 43 ¶ | skipping to change at page 1, line 43 ¶ | |||
| 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 29 March 2021. | This Internet-Draft will expire on 23 April 2021. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
| extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
| as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
| provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 | 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 | |||
| 3. Design of the QUIC Transmission Machinery . . . . . . . . . . 5 | 3. Design of the QUIC Transmission Machinery . . . . . . . . . . 5 | |||
| 4. Relevant Differences Between QUIC and TCP . . . . . . . . . . 5 | 4. Relevant Differences Between QUIC and TCP . . . . . . . . . . 6 | |||
| 4.1. Separate Packet Number Spaces . . . . . . . . . . . . . . 6 | 4.1. Separate Packet Number Spaces . . . . . . . . . . . . . . 6 | |||
| 4.2. Monotonically Increasing Packet Numbers . . . . . . . . . 6 | 4.2. Monotonically Increasing Packet Numbers . . . . . . . . . 6 | |||
| 4.3. Clearer Loss Epoch . . . . . . . . . . . . . . . . . . . 6 | 4.3. Clearer Loss Epoch . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.4. No Reneging . . . . . . . . . . . . . . . . . . . . . . . 7 | 4.4. No Reneging . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.5. More ACK Ranges . . . . . . . . . . . . . . . . . . . . . 7 | 4.5. More ACK Ranges . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.6. Explicit Correction For Delayed Acknowledgements . . . . 7 | 4.6. Explicit Correction For Delayed Acknowledgements . . . . 7 | |||
| 4.7. Probe Timeout Replaces RTO and TLP . . . . . . . . . . . 7 | 4.7. Probe Timeout Replaces RTO and TLP . . . . . . . . . . . 7 | |||
| 4.8. The Minimum Congestion Window is Two Packets . . . . . . 8 | 4.8. The Minimum Congestion Window is Two Packets . . . . . . 8 | |||
| 5. Estimating the Round-Trip Time . . . . . . . . . . . . . . . 8 | 5. Estimating the Round-Trip Time . . . . . . . . . . . . . . . 8 | |||
| 5.1. Generating RTT samples . . . . . . . . . . . . . . . . . 8 | 5.1. Generating RTT samples . . . . . . . . . . . . . . . . . 8 | |||
| 5.2. Estimating min_rtt . . . . . . . . . . . . . . . . . . . 9 | 5.2. Estimating min_rtt . . . . . . . . . . . . . . . . . . . 9 | |||
| 5.3. Estimating smoothed_rtt and rttvar . . . . . . . . . . . 10 | 5.3. Estimating smoothed_rtt and rttvar . . . . . . . . . . . 10 | |||
| 6. Loss Detection . . . . . . . . . . . . . . . . . . . . . . . 12 | 6. Loss Detection . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 6.1. Acknowledgement-Based Detection . . . . . . . . . . . . . 12 | 6.1. Acknowledgement-Based Detection . . . . . . . . . . . . . 12 | |||
| 6.1.1. Packet Threshold . . . . . . . . . . . . . . . . . . 13 | 6.1.1. Packet Threshold . . . . . . . . . . . . . . . . . . 13 | |||
| 6.1.2. Time Threshold . . . . . . . . . . . . . . . . . . . 13 | 6.1.2. Time Threshold . . . . . . . . . . . . . . . . . . . 13 | |||
| 6.2. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 14 | 6.2. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 6.2.1. Computing PTO . . . . . . . . . . . . . . . . . . . . 14 | 6.2.1. Computing PTO . . . . . . . . . . . . . . . . . . . . 15 | |||
| 6.2.2. Handshakes and New Paths . . . . . . . . . . . . . . 16 | 6.2.2. Handshakes and New Paths . . . . . . . . . . . . . . 16 | |||
| 6.2.3. Speeding Up Handshake Completion . . . . . . . . . . 17 | 6.2.3. Speeding Up Handshake Completion . . . . . . . . . . 17 | |||
| 6.2.4. Sending Probe Packets . . . . . . . . . . . . . . . . 17 | 6.2.4. Sending Probe Packets . . . . . . . . . . . . . . . . 18 | |||
| 6.3. Handling Retry Packets . . . . . . . . . . . . . . . . . 18 | 6.3. Handling Retry Packets . . . . . . . . . . . . . . . . . 19 | |||
| 6.4. Discarding Keys and Packet State . . . . . . . . . . . . 19 | 6.4. Discarding Keys and Packet State . . . . . . . . . . . . 19 | |||
| 7. Congestion Control . . . . . . . . . . . . . . . . . . . . . 19 | 7. Congestion Control . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 7.1. Explicit Congestion Notification . . . . . . . . . . . . 20 | 7.1. Explicit Congestion Notification . . . . . . . . . . . . 20 | |||
| 7.2. Initial and Minimum Congestion Window . . . . . . . . . . 20 | 7.2. Initial and Minimum Congestion Window . . . . . . . . . . 21 | |||
| 7.3. Congestion Control States . . . . . . . . . . . . . . . . 20 | 7.3. Congestion Control States . . . . . . . . . . . . . . . . 21 | |||
| 7.3.1. Slow Start . . . . . . . . . . . . . . . . . . . . . 21 | 7.3.1. Slow Start . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.3.2. Recovery . . . . . . . . . . . . . . . . . . . . . . 21 | 7.3.2. Recovery . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 7.3.3. Congestion Avoidance . . . . . . . . . . . . . . . . 22 | 7.3.3. Congestion Avoidance . . . . . . . . . . . . . . . . 23 | |||
| 7.4. Ignoring Loss of Undecryptable Packets . . . . . . . . . 22 | 7.4. Ignoring Loss of Undecryptable Packets . . . . . . . . . 23 | |||
| 7.5. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 23 | 7.5. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.6. Persistent Congestion . . . . . . . . . . . . . . . . . . 23 | 7.6. Persistent Congestion . . . . . . . . . . . . . . . . . . 24 | |||
| 7.6.1. Duration . . . . . . . . . . . . . . . . . . . . . . 23 | 7.6.1. Duration . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 7.6.2. Establishing Persistent Congestion . . . . . . . . . 24 | 7.6.2. Establishing Persistent Congestion . . . . . . . . . 25 | |||
| 7.6.3. Example . . . . . . . . . . . . . . . . . . . . . . . 24 | 7.6.3. Example . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 7.7. Pacing . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 7.7. Pacing . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 7.8. Under-utilizing the Congestion Window . . . . . . . . . . 27 | 7.8. Under-utilizing the Congestion Window . . . . . . . . . . 28 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 27 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 28 | |||
| 8.1. Congestion Signals . . . . . . . . . . . . . . . . . . . 27 | 8.1. Congestion Signals . . . . . . . . . . . . . . . . . . . 28 | |||
| 8.2. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 27 | 8.2. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 28 | |||
| 8.3. Misreporting ECN Markings . . . . . . . . . . . . . . . . 27 | 8.3. Misreporting ECN Markings . . . . . . . . . . . . . . . . 28 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 28 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 29 | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 29 | 10.2. Informative References . . . . . . . . . . . . . . . . . 30 | |||
| Appendix A. Loss Recovery Pseudocode . . . . . . . . . . . . . . 30 | Appendix A. Loss Recovery Pseudocode . . . . . . . . . . . . . . 31 | |||
| A.1. Tracking Sent Packets . . . . . . . . . . . . . . . . . . 30 | A.1. Tracking Sent Packets . . . . . . . . . . . . . . . . . . 32 | |||
| A.1.1. Sent Packet Fields . . . . . . . . . . . . . . . . . 31 | A.1.1. Sent Packet Fields . . . . . . . . . . . . . . . . . 32 | |||
| A.2. Constants of Interest . . . . . . . . . . . . . . . . . . 31 | A.2. Constants of Interest . . . . . . . . . . . . . . . . . . 32 | |||
| A.3. Variables of interest . . . . . . . . . . . . . . . . . . 32 | A.3. Variables of interest . . . . . . . . . . . . . . . . . . 33 | |||
| A.4. Initialization . . . . . . . . . . . . . . . . . . . . . 33 | A.4. Initialization . . . . . . . . . . . . . . . . . . . . . 34 | |||
| A.5. On Sending a Packet . . . . . . . . . . . . . . . . . . . 33 | A.5. On Sending a Packet . . . . . . . . . . . . . . . . . . . 34 | |||
| A.6. On Receiving a Datagram . . . . . . . . . . . . . . . . . 33 | A.6. On Receiving a Datagram . . . . . . . . . . . . . . . . . 35 | |||
| A.7. On Receiving an Acknowledgment . . . . . . . . . . . . . 34 | A.7. On Receiving an Acknowledgment . . . . . . . . . . . . . 35 | |||
| A.8. Setting the Loss Detection Timer . . . . . . . . . . . . 35 | A.8. Setting the Loss Detection Timer . . . . . . . . . . . . 37 | |||
| A.9. On Timeout . . . . . . . . . . . . . . . . . . . . . . . 37 | A.9. On Timeout . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| A.10. Detecting Lost Packets . . . . . . . . . . . . . . . . . 38 | A.10. Detecting Lost Packets . . . . . . . . . . . . . . . . . 39 | |||
| Appendix B. Congestion Control Pseudocode . . . . . . . . . . . 39 | A.11. Upon Dropping Initial or Handshake Keys . . . . . . . . . 40 | |||
| B.1. Constants of interest . . . . . . . . . . . . . . . . . . 39 | Appendix B. Congestion Control Pseudocode . . . . . . . . . . . 41 | |||
| B.2. Variables of interest . . . . . . . . . . . . . . . . . . 40 | B.1. Constants of interest . . . . . . . . . . . . . . . . . . 41 | |||
| B.3. Initialization . . . . . . . . . . . . . . . . . . . . . 40 | B.2. Variables of interest . . . . . . . . . . . . . . . . . . 41 | |||
| B.4. On Packet Sent . . . . . . . . . . . . . . . . . . . . . 41 | B.3. Initialization . . . . . . . . . . . . . . . . . . . . . 42 | |||
| B.5. On Packet Acknowledgement . . . . . . . . . . . . . . . . 41 | B.4. On Packet Sent . . . . . . . . . . . . . . . . . . . . . 42 | |||
| B.6. On New Congestion Event . . . . . . . . . . . . . . . . . 42 | B.5. On Packet Acknowledgement . . . . . . . . . . . . . . . . 43 | |||
| B.7. Process ECN Information . . . . . . . . . . . . . . . . . 43 | B.6. On New Congestion Event . . . . . . . . . . . . . . . . . 43 | |||
| B.8. On Packets Lost . . . . . . . . . . . . . . . . . . . . . 43 | B.7. Process ECN Information . . . . . . . . . . . . . . . . . 44 | |||
| B.9. Upon dropping Initial or Handshake keys . . . . . . . . . 43 | B.8. On Packets Lost . . . . . . . . . . . . . . . . . . . . . 44 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 44 | B.9. Removing Discarded Packets From Bytes In Flight . . . . . 45 | |||
| C.1. Since draft-ietf-quic-recovery-30 . . . . . . . . . . . . 44 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 45 | |||
| C.2. Since draft-ietf-quic-recovery-29 . . . . . . . . . . . . 44 | C.1. Since draft-ietf-quic-recovery-31 . . . . . . . . . . . . 45 | |||
| C.3. Since draft-ietf-quic-recovery-28 . . . . . . . . . . . . 44 | C.2. Since draft-ietf-quic-recovery-30 . . . . . . . . . . . . 45 | |||
| C.4. Since draft-ietf-quic-recovery-27 . . . . . . . . . . . . 45 | C.3. Since draft-ietf-quic-recovery-29 . . . . . . . . . . . . 45 | |||
| C.5. Since draft-ietf-quic-recovery-26 . . . . . . . . . . . . 45 | C.4. Since draft-ietf-quic-recovery-28 . . . . . . . . . . . . 46 | |||
| C.6. Since draft-ietf-quic-recovery-25 . . . . . . . . . . . . 45 | C.5. Since draft-ietf-quic-recovery-27 . . . . . . . . . . . . 46 | |||
| C.7. Since draft-ietf-quic-recovery-24 . . . . . . . . . . . . 45 | C.6. Since draft-ietf-quic-recovery-26 . . . . . . . . . . . . 46 | |||
| C.8. Since draft-ietf-quic-recovery-23 . . . . . . . . . . . . 45 | C.7. Since draft-ietf-quic-recovery-25 . . . . . . . . . . . . 46 | |||
| C.9. Since draft-ietf-quic-recovery-22 . . . . . . . . . . . . 46 | C.8. Since draft-ietf-quic-recovery-24 . . . . . . . . . . . . 46 | |||
| C.10. Since draft-ietf-quic-recovery-21 . . . . . . . . . . . . 46 | C.9. Since draft-ietf-quic-recovery-23 . . . . . . . . . . . . 46 | |||
| C.11. Since draft-ietf-quic-recovery-20 . . . . . . . . . . . . 46 | C.10. Since draft-ietf-quic-recovery-22 . . . . . . . . . . . . 47 | |||
| C.12. Since draft-ietf-quic-recovery-19 . . . . . . . . . . . . 46 | C.11. Since draft-ietf-quic-recovery-21 . . . . . . . . . . . . 47 | |||
| C.13. Since draft-ietf-quic-recovery-18 . . . . . . . . . . . . 47 | C.12. Since draft-ietf-quic-recovery-20 . . . . . . . . . . . . 47 | |||
| C.14. Since draft-ietf-quic-recovery-17 . . . . . . . . . . . . 47 | C.13. Since draft-ietf-quic-recovery-19 . . . . . . . . . . . . 47 | |||
| C.15. Since draft-ietf-quic-recovery-16 . . . . . . . . . . . . 47 | C.14. Since draft-ietf-quic-recovery-18 . . . . . . . . . . . . 48 | |||
| C.16. Since draft-ietf-quic-recovery-14 . . . . . . . . . . . . 48 | C.15. Since draft-ietf-quic-recovery-17 . . . . . . . . . . . . 48 | |||
| C.17. Since draft-ietf-quic-recovery-13 . . . . . . . . . . . . 48 | C.16. Since draft-ietf-quic-recovery-16 . . . . . . . . . . . . 49 | |||
| C.18. Since draft-ietf-quic-recovery-12 . . . . . . . . . . . . 48 | C.17. Since draft-ietf-quic-recovery-14 . . . . . . . . . . . . 49 | |||
| C.19. Since draft-ietf-quic-recovery-11 . . . . . . . . . . . . 49 | C.18. Since draft-ietf-quic-recovery-13 . . . . . . . . . . . . 49 | |||
| C.20. Since draft-ietf-quic-recovery-10 . . . . . . . . . . . . 49 | C.19. Since draft-ietf-quic-recovery-12 . . . . . . . . . . . . 50 | |||
| C.21. Since draft-ietf-quic-recovery-09 . . . . . . . . . . . . 49 | C.20. Since draft-ietf-quic-recovery-11 . . . . . . . . . . . . 50 | |||
| C.22. Since draft-ietf-quic-recovery-08 . . . . . . . . . . . . 49 | C.21. Since draft-ietf-quic-recovery-10 . . . . . . . . . . . . 50 | |||
| C.23. Since draft-ietf-quic-recovery-07 . . . . . . . . . . . . 49 | C.22. Since draft-ietf-quic-recovery-09 . . . . . . . . . . . . 50 | |||
| C.24. Since draft-ietf-quic-recovery-06 . . . . . . . . . . . . 49 | C.23. Since draft-ietf-quic-recovery-08 . . . . . . . . . . . . 50 | |||
| C.25. Since draft-ietf-quic-recovery-05 . . . . . . . . . . . . 49 | C.24. Since draft-ietf-quic-recovery-07 . . . . . . . . . . . . 50 | |||
| C.26. Since draft-ietf-quic-recovery-04 . . . . . . . . . . . . 50 | C.25. Since draft-ietf-quic-recovery-06 . . . . . . . . . . . . 51 | |||
| C.27. Since draft-ietf-quic-recovery-03 . . . . . . . . . . . . 50 | C.26. Since draft-ietf-quic-recovery-05 . . . . . . . . . . . . 51 | |||
| C.28. Since draft-ietf-quic-recovery-02 . . . . . . . . . . . . 50 | C.27. Since draft-ietf-quic-recovery-04 . . . . . . . . . . . . 51 | |||
| C.29. Since draft-ietf-quic-recovery-01 . . . . . . . . . . . . 50 | C.28. Since draft-ietf-quic-recovery-03 . . . . . . . . . . . . 51 | |||
| C.30. Since draft-ietf-quic-recovery-00 . . . . . . . . . . . . 50 | C.29. Since draft-ietf-quic-recovery-02 . . . . . . . . . . . . 51 | |||
| C.31. Since draft-iyengar-quic-loss-recovery-01 . . . . . . . . 50 | C.30. Since draft-ietf-quic-recovery-01 . . . . . . . . . . . . 51 | |||
| Appendix D. Contributors . . . . . . . . . . . . . . . . . . . . 51 | C.31. Since draft-ietf-quic-recovery-00 . . . . . . . . . . . . 51 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 51 | C.32. Since draft-iyengar-quic-loss-recovery-01 . . . . . . . . 51 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 51 | Appendix D. Contributors . . . . . . . . . . . . . . . . . . . . 52 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
| 1. Introduction | 1. Introduction | |||
| QUIC is a new multiplexed and secure transport protocol atop UDP, | QUIC is a new multiplexed and secure transport protocol atop UDP, | |||
| specified in [QUIC-TRANSPORT]. This document describes congestion | specified in [QUIC-TRANSPORT]. This document describes congestion | |||
| control and loss recovery for QUIC. Mechanisms described in this | control and loss recovery for QUIC. Mechanisms described in this | |||
| document follow the spirit of existing TCP congestion control and | document follow the spirit of existing TCP congestion control and | |||
| loss recovery mechanisms, described in RFCs, various Internet-drafts, | loss recovery mechanisms, described in RFCs, various Internet-drafts, | |||
| or academic papers, and also those prevalent in TCP implementations. | or academic papers, and also those prevalent in TCP implementations. | |||
| skipping to change at page 10, line 18 ¶ | skipping to change at page 10, line 31 ¶ | |||
| NOT refresh the min_rtt value too often, since the actual minimum RTT | NOT refresh the min_rtt value too often, since the actual minimum RTT | |||
| of the path is not frequently observable. | of the path is not frequently observable. | |||
| 5.3. Estimating smoothed_rtt and rttvar | 5.3. Estimating smoothed_rtt and rttvar | |||
| smoothed_rtt is an exponentially-weighted moving average of an | smoothed_rtt is an exponentially-weighted moving average of an | |||
| endpoint's RTT samples, and rttvar is the variation in the RTT | endpoint's RTT samples, and rttvar is the variation in the RTT | |||
| samples, estimated using a mean variation. | samples, estimated using a mean variation. | |||
| The calculation of smoothed_rtt uses RTT samples after adjusting them | The calculation of smoothed_rtt uses RTT samples after adjusting them | |||
| for acknowledgement delays. These delays are computed using the ACK | for acknowledgement delays. These delays are decoded from the ACK | |||
| Delay field of the ACK frame as described in Section 19.3 of | Delay field of ACK frames as described in Section 19.3 of | |||
| [QUIC-TRANSPORT]. | [QUIC-TRANSPORT]. | |||
| The peer might report acknowledgement delays that are larger than the | The peer might report acknowledgement delays that are larger than the | |||
| peer's max_ack_delay during the handshake (Section 13.2.1 of | peer's max_ack_delay during the handshake (Section 13.2.1 of | |||
| [QUIC-TRANSPORT]). To account for this, the endpoint SHOULD ignore | [QUIC-TRANSPORT]). To account for this, the endpoint SHOULD ignore | |||
| max_ack_delay until the handshake is confirmed (Section 4.1.2 of | max_ack_delay until the handshake is confirmed (Section 4.1.2 of | |||
| [QUIC-TLS]). When they occur, these large acknowledgement delays are | [QUIC-TLS]). When they occur, these large acknowledgement delays are | |||
| likely to be non-repeating and limited to the handshake. The | likely to be non-repeating and limited to the handshake. The | |||
| endpoint can therefore use them without limiting them to the | endpoint can therefore use them without limiting them to the | |||
| max_ack_delay, avoiding unnecessary inflation of the RTT estimate. | max_ack_delay, avoiding unnecessary inflation of the RTT estimate. | |||
| skipping to change at page 10, line 43 ¶ | skipping to change at page 11, line 9 ¶ | |||
| the peer's reporting of the acknowledgement delay or in the | the peer's reporting of the acknowledgement delay or in the | |||
| endpoint's min_rtt estimate. Therefore, prior to handshake | endpoint's min_rtt estimate. Therefore, prior to handshake | |||
| confirmation, an endpoint MAY ignore RTT samples if adjusting the RTT | confirmation, an endpoint MAY ignore RTT samples if adjusting the RTT | |||
| sample for acknowledgement delay causes the sample to be less than | sample for acknowledgement delay causes the sample to be less than | |||
| the min_rtt. | the min_rtt. | |||
| After the handshake is confirmed, any acknowledgement delays reported | After the handshake is confirmed, any acknowledgement delays reported | |||
| by the peer that are greater than the peer's max_ack_delay are | by the peer that are greater than the peer's max_ack_delay are | |||
| attributed to unintentional but potentially repeating delays, such as | attributed to unintentional but potentially repeating delays, such as | |||
| scheduler latency at the peer or loss of previous acknowledgements. | scheduler latency at the peer or loss of previous acknowledgements. | |||
| Excess delays could also be due to a non-compliant receiver. | ||||
| Therefore, these extra delays are considered effectively part of path | Therefore, these extra delays are considered effectively part of path | |||
| delay and incorporated into the RTT estimate. | delay and incorporated into the RTT estimate. | |||
| Therefore, when adjusting an RTT sample using peer-reported | Therefore, when adjusting an RTT sample using peer-reported | |||
| acknowledgement delays, an endpoint: | acknowledgement delays, an endpoint: | |||
| * MAY ignore the acknowledgement delay for Initial packets, since | * MAY ignore the acknowledgement delay for Initial packets, since | |||
| these acknowledgements are not delayed by the peer (Section 13.2.1 | these acknowledgements are not delayed by the peer (Section 13.2.1 | |||
| of [QUIC-TRANSPORT]); | of [QUIC-TRANSPORT]); | |||
| skipping to change at page 11, line 23 ¶ | skipping to change at page 11, line 38 ¶ | |||
| underestimation of the smoothed_rtt due to a misreporting peer. | underestimation of the smoothed_rtt due to a misreporting peer. | |||
| Additionally, an endpoint might postpone the processing of | Additionally, an endpoint might postpone the processing of | |||
| acknowledgements when the corresponding decryption keys are not | acknowledgements when the corresponding decryption keys are not | |||
| immediately available. For example, a client might receive an | immediately available. For example, a client might receive an | |||
| acknowledgement for a 0-RTT packet that it cannot decrypt because | acknowledgement for a 0-RTT packet that it cannot decrypt because | |||
| 1-RTT packet protection keys are not yet available to it. In such | 1-RTT packet protection keys are not yet available to it. In such | |||
| cases, an endpoint SHOULD subtract such local delays from its RTT | cases, an endpoint SHOULD subtract such local delays from its RTT | |||
| sample until the handshake is confirmed. | sample until the handshake is confirmed. | |||
| smoothed_rtt and rttvar are computed as follows, similar to | Similar to [RFC6298], smoothed_rtt and rttvar are computed as | |||
| [RFC6298]. | follows. | |||
| When there are no samples for a network path, and on the first RTT | An endpoint initializes the RTT estimator during connection | |||
| sample for the network path: | establishment and when the estimator is reset during connection | |||
| migration; see Section 9.4 of [QUIC-TRANSPORT]. Before any RTT | ||||
| samples are available for a new path or when the estimator is reset, | ||||
| the estimator is initialized using the initial RTT; see | ||||
| Section 6.2.2. | ||||
| smoothed_rtt = rtt_sample | smoothed_rtt and rttvar are initialized as follows, where kInitialRtt | |||
| rttvar = rtt_sample / 2 | contains the initial RTT value: | |||
| Before any RTT samples are available, the initial RTT is used as | smoothed_rtt = kInitialRtt | |||
| rtt_sample. On the first RTT sample for the network path, that | rttvar = kInitialRtt / 2 | |||
| sample is used as rtt_sample. This ensures that the first | RTT samples for the network path are recorded in latest_rtt; see | |||
| measurement erases the history of any persisted or default values. | Section 5.1. On the first RTT sample after initialization, the | |||
| estimator is reset using that sample. This ensures that the | ||||
| estimator retains no history of past samples. | ||||
| On the first RTT sample after initialization, smoothed_rtt and rttvar | ||||
| are set as follows: | ||||
| smoothed_rtt = latest_rtt | ||||
| rttvar = latest_rtt / 2 | ||||
| On subsequent RTT samples, smoothed_rtt and rttvar evolve as follows: | On subsequent RTT samples, smoothed_rtt and rttvar evolve as follows: | |||
| ack_delay = decoded acknowledgement delay from ACK frame | ack_delay = decoded acknowledgement delay from ACK frame | |||
| if (handshake confirmed): | if (handshake confirmed): | |||
| ack_delay = min(ack_delay, max_ack_delay) | ack_delay = min(ack_delay, max_ack_delay) | |||
| adjusted_rtt = latest_rtt | adjusted_rtt = latest_rtt | |||
| if (min_rtt + ack_delay < latest_rtt): | if (min_rtt + ack_delay < latest_rtt): | |||
| adjusted_rtt = latest_rtt - ack_delay | adjusted_rtt = latest_rtt - ack_delay | |||
| smoothed_rtt = 7/8 * smoothed_rtt + 1/8 * adjusted_rtt | smoothed_rtt = 7/8 * smoothed_rtt + 1/8 * adjusted_rtt | |||
| skipping to change at page 12, line 34 ¶ | skipping to change at page 13, line 8 ¶ | |||
| Fast Retransmit ([RFC5681]), Early Retransmit ([RFC5827]), FACK | Fast Retransmit ([RFC5681]), Early Retransmit ([RFC5827]), FACK | |||
| ([FACK]), SACK loss recovery ([RFC6675]), and RACK ([RACK]). This | ([FACK]), SACK loss recovery ([RFC6675]), and RACK ([RACK]). This | |||
| section provides an overview of how these algorithms are implemented | section provides an overview of how these algorithms are implemented | |||
| in QUIC. | in QUIC. | |||
| A packet is declared lost if it meets all the following conditions: | A packet is declared lost if it meets all the following conditions: | |||
| * The packet is unacknowledged, in-flight, and was sent prior to an | * The packet is unacknowledged, in-flight, and was sent prior to an | |||
| acknowledged packet. | acknowledged packet. | |||
| * Either its packet number is kPacketThreshold smaller than an | * The packet was sent kPacketThreshold packets before an | |||
| acknowledged packet (Section 6.1.1), or it was sent long enough in | acknowledged packet (Section 6.1.1), or it was sent long enough in | |||
| the past (Section 6.1.2). | the past (Section 6.1.2). | |||
| The acknowledgement indicates that a packet sent later was delivered, | The acknowledgement indicates that a packet sent later was delivered, | |||
| and the packet and time thresholds provide some tolerance for packet | and the packet and time thresholds provide some tolerance for packet | |||
| reordering. | reordering. | |||
| Spuriously declaring packets as lost leads to unnecessary | Spuriously declaring packets as lost leads to unnecessary | |||
| retransmissions and may result in degraded performance due to the | retransmissions and may result in degraded performance due to the | |||
| actions of the congestion controller upon detecting loss. | actions of the congestion controller upon detecting loss. | |||
| skipping to change at page 15, line 27 ¶ | skipping to change at page 15, line 50 ¶ | |||
| acknowledgements. For example, this can happen when a client sends | acknowledgements. For example, this can happen when a client sends | |||
| 0-RTT packets to the server; it does so without knowing whether the | 0-RTT packets to the server; it does so without knowing whether the | |||
| server will be able to decrypt them. Similarly, this can happen when | server will be able to decrypt them. Similarly, this can happen when | |||
| a server sends 1-RTT packets before confirming that the client has | a server sends 1-RTT packets before confirming that the client has | |||
| verified the server's certificate and can therefore read these 1-RTT | verified the server's certificate and can therefore read these 1-RTT | |||
| packets. | packets. | |||
| A sender SHOULD restart its PTO timer every time an ack-eliciting | A sender SHOULD restart its PTO timer every time an ack-eliciting | |||
| packet is sent or acknowledged, when the handshake is confirmed | packet is sent or acknowledged, when the handshake is confirmed | |||
| (Section 4.1.2 of [QUIC-TLS]), or when Initial or Handshake keys are | (Section 4.1.2 of [QUIC-TLS]), or when Initial or Handshake keys are | |||
| discarded (Section 9 of [QUIC-TLS]). This ensures the PTO is always | discarded (Section 4.9 of [QUIC-TLS]). This ensures the PTO is | |||
| set based on the latest estimate of the round-trip time and for the | always set based on the latest estimate of the round-trip time and | |||
| correct packet across packet number spaces. | for the correct packet across packet number spaces. | |||
| When a PTO timer expires, the PTO backoff MUST be increased, | When a PTO timer expires, the PTO backoff MUST be increased, | |||
| resulting in the PTO period being set to twice its current value. | resulting in the PTO period being set to twice its current value. | |||
| The PTO backoff factor is reset when an acknowledgement is received, | The PTO backoff factor is reset when an acknowledgement is received, | |||
| except in the following case. A server might take longer to respond | except in the following case. A server might take longer to respond | |||
| to packets during the handshake than otherwise. To protect such a | to packets during the handshake than otherwise. To protect such a | |||
| server from repeated client probes, the PTO backoff is not reset at a | server from repeated client probes, the PTO backoff is not reset at a | |||
| client that is not yet certain that the server has finished | client that is not yet certain that the server has finished | |||
| validating the client's address. That is, a client does not reset | validating the client's address. That is, a client does not reset | |||
| the PTO backoff factor on receiving acknowledgements until the | the PTO backoff factor on receiving acknowledgements in Initial | |||
| handshake is confirmed; see Section 4.1.2 of [QUIC-TLS]. | packets. | |||
| This exponential reduction in the sender's rate is important because | This exponential reduction in the sender's rate is important because | |||
| consecutive PTOs might be caused by loss of packets or | consecutive PTOs might be caused by loss of packets or | |||
| acknowledgements due to severe congestion. Even when there are ack- | acknowledgements due to severe congestion. Even when there are ack- | |||
| eliciting packets in-flight in multiple packet number spaces, the | eliciting packets in-flight in multiple packet number spaces, the | |||
| exponential increase in probe timeout occurs across all spaces to | exponential increase in probe timeout occurs across all spaces to | |||
| prevent excess load on the network. For example, a timeout in the | prevent excess load on the network. For example, a timeout in the | |||
| Initial packet number space doubles the length of the timeout in the | Initial packet number space doubles the length of the timeout in the | |||
| Handshake packet number space. | Handshake packet number space. | |||
| The total length of time over which consecutive PTOs expire is | The total length of time over which consecutive PTOs expire is | |||
| limited by the idle timeout. | limited by the idle timeout. | |||
| The probe timer MUST NOT be set if the time threshold (Section 6.1.2) | The PTO timer MUST NOT be set if a timer is set for time threshold | |||
| loss detection timer is set. The time threshold loss detection timer | loss detection; see Section 6.1.2. A timer that is set for time | |||
| is expected to both expire earlier than the PTO and be less likely to | threshold loss detection will expire earlier than the PTO timer in | |||
| spuriously retransmit data. | most cases and is less likely to spuriously retransmit data. | |||
| 6.2.2. Handshakes and New Paths | 6.2.2. Handshakes and New Paths | |||
| Resumed connections over the same network MAY use the previous | Resumed connections over the same network MAY use the previous | |||
| connection's final smoothed RTT value as the resumed connection's | connection's final smoothed RTT value as the resumed connection's | |||
| initial RTT. When no previous RTT is available, the initial RTT | initial RTT. When no previous RTT is available, the initial RTT | |||
| SHOULD be set to 333ms, resulting in a 1 second initial timeout, as | SHOULD be set to 333ms, resulting in a 1 second initial timeout, as | |||
| recommended in [RFC6298]. | recommended in [RFC6298]. | |||
| A connection MAY use the delay between sending a PATH_CHALLENGE and | A connection MAY use the delay between sending a PATH_CHALLENGE and | |||
| skipping to change at page 17, line 15 ¶ | skipping to change at page 17, line 38 ¶ | |||
| 6.2.3. Speeding Up Handshake Completion | 6.2.3. Speeding Up Handshake Completion | |||
| When a server receives an Initial packet containing duplicate CRYPTO | When a server receives an Initial packet containing duplicate CRYPTO | |||
| data, it can assume the client did not receive all of the server's | data, it can assume the client did not receive all of the server's | |||
| CRYPTO data sent in Initial packets, or the client's estimated RTT is | CRYPTO data sent in Initial packets, or the client's estimated RTT is | |||
| too small. When a client receives Handshake or 1-RTT packets prior | too small. When a client receives Handshake or 1-RTT packets prior | |||
| to obtaining Handshake keys, it may assume some or all of the | to obtaining Handshake keys, it may assume some or all of the | |||
| server's Initial packets were lost. | server's Initial packets were lost. | |||
| To speed up handshake completion under these conditions, an endpoint | To speed up handshake completion under these conditions, an endpoint | |||
| MAY send a packet containing unacknowledged CRYPTO data earlier than | MAY, for a limited number of occasions per each connection, send a | |||
| the PTO expiry, subject to the address validation limits in | packet containing unacknowledged CRYPTO data earlier than the PTO | |||
| Section 8.1 of [QUIC-TRANSPORT]. | expiry, subject to the address validation limits in Section 8.1 of | |||
| [QUIC-TRANSPORT]. Doing so at most once for each connection is | ||||
| adequate to quickly recover from a single packet loss. Endpoints | ||||
| that do not cease retransmitting packets in response to | ||||
| unauthenticated data risk creating an infinite exchange of packets. | ||||
| Endpoints can also use coalesced packets (see Section 12.2 of | Endpoints can also use coalesced packets (see Section 12.2 of | |||
| [QUIC-TRANSPORT]) to ensure that each datagram elicits at least one | [QUIC-TRANSPORT]) to ensure that each datagram elicits at least one | |||
| acknowledgement. For example, a client can coalesce an Initial | acknowledgement. For example, a client can coalesce an Initial | |||
| packet containing PING and PADDING frames with a 0-RTT data packet | packet containing PING and PADDING frames with a 0-RTT data packet | |||
| and a server can coalesce an Initial packet containing a PING frame | and a server can coalesce an Initial packet containing a PING frame | |||
| with one or more packets in its first flight. | with one or more packets in its first flight. | |||
| 6.2.4. Sending Probe Packets | 6.2.4. Sending Probe Packets | |||
| skipping to change at page 19, line 7 ¶ | skipping to change at page 19, line 32 ¶ | |||
| connection state, in particular cryptographic handshake messages, is | connection state, in particular cryptographic handshake messages, is | |||
| retained; see Section 17.2.5 of [QUIC-TRANSPORT]. | retained; see Section 17.2.5 of [QUIC-TRANSPORT]. | |||
| The client MAY compute an RTT estimate to the server as the time | The client MAY compute an RTT estimate to the server as the time | |||
| period from when the first Initial was sent to when a Retry or a | period from when the first Initial was sent to when a Retry or a | |||
| Version Negotiation packet is received. The client MAY use this | Version Negotiation packet is received. The client MAY use this | |||
| value in place of its default for the initial RTT estimate. | value in place of its default for the initial RTT estimate. | |||
| 6.4. Discarding Keys and Packet State | 6.4. Discarding Keys and Packet State | |||
| When packet protection keys are discarded (see Section 4.8 of | When packet protection keys are discarded (see Section 4.9 of | |||
| [QUIC-TLS]), all packets that were sent with those keys can no longer | [QUIC-TLS]), all packets that were sent with those keys can no longer | |||
| be acknowledged because their acknowledgements cannot be processed | be acknowledged because their acknowledgements cannot be processed | |||
| anymore. The sender MUST discard all recovery state associated with | anymore. The sender MUST discard all recovery state associated with | |||
| those packets and MUST remove them from the count of bytes in flight. | those packets and MUST remove them from the count of bytes in flight. | |||
| Endpoints stop sending and receiving Initial packets once they start | Endpoints stop sending and receiving Initial packets once they start | |||
| exchanging Handshake packets; see Section 17.2.2.1 of | exchanging Handshake packets; see Section 17.2.2.1 of | |||
| [QUIC-TRANSPORT]. At this point, recovery state for all in-flight | [QUIC-TRANSPORT]. At this point, recovery state for all in-flight | |||
| Initial packets is discarded. | Initial packets is discarded. | |||
| skipping to change at page 19, line 32 ¶ | skipping to change at page 20, line 12 ¶ | |||
| arrive before Initial packets, early 0-RTT packets will be declared | arrive before Initial packets, early 0-RTT packets will be declared | |||
| lost, but that is expected to be infrequent. | lost, but that is expected to be infrequent. | |||
| It is expected that keys are discarded after packets encrypted with | It is expected that keys are discarded after packets encrypted with | |||
| them would be acknowledged or declared lost. However, Initial | them would be acknowledged or declared lost. However, Initial | |||
| secrets are discarded as soon as handshake keys are proven to be | secrets are discarded as soon as handshake keys are proven to be | |||
| available to both client and server; see Section 4.9.1 of [QUIC-TLS]. | available to both client and server; see Section 4.9.1 of [QUIC-TLS]. | |||
| 7. Congestion Control | 7. Congestion Control | |||
| This document specifies a congestion controller for QUIC similar to | This document specifies a sender-side congestion controller for QUIC | |||
| TCP NewReno ([RFC6582]). | similar to TCP NewReno ([RFC6582]). | |||
| The signals QUIC provides for congestion control are generic and are | The signals QUIC provides for congestion control are generic and are | |||
| designed to support different algorithms. Endpoints can unilaterally | designed to support different sender-side algorithms. A sender can | |||
| choose a different algorithm to use, such as Cubic ([RFC8312]). | unilaterally choose a different algorithm to use, such as Cubic | |||
| ([RFC8312]). | ||||
| If an endpoint uses a different controller than that specified in | If a sender uses a different controller than that specified in this | |||
| this document, the chosen controller MUST conform to the congestion | document, the chosen controller MUST conform to the congestion | |||
| control guidelines specified in Section 3.1 of [RFC8085]. | control guidelines specified in Section 3.1 of [RFC8085]. | |||
| Similar to TCP, packets containing only ACK frames do not count | Similar to TCP, packets containing only ACK frames do not count | |||
| towards bytes in flight and are not congestion controlled. Unlike | towards bytes in flight and are not congestion controlled. Unlike | |||
| TCP, QUIC can detect the loss of these packets and MAY use that | TCP, QUIC can detect the loss of these packets and MAY use that | |||
| information to adjust the congestion controller or the rate of ACK- | information to adjust the congestion controller or the rate of ACK- | |||
| only packets being sent, but this document does not describe a | only packets being sent, but this document does not describe a | |||
| mechanism for doing so. | mechanism for doing so. | |||
| The algorithm in this document specifies and uses the controller's | The algorithm in this document specifies and uses the controller's | |||
| skipping to change at page 20, line 15 ¶ | skipping to change at page 20, line 44 ¶ | |||
| An endpoint MUST NOT send a packet if it would cause bytes_in_flight | An endpoint MUST NOT send a packet if it would cause bytes_in_flight | |||
| (see Appendix B.2) to be larger than the congestion window, unless | (see Appendix B.2) to be larger than the congestion window, unless | |||
| the packet is sent on a PTO timer expiration (see Section 6.2) or | the packet is sent on a PTO timer expiration (see Section 6.2) or | |||
| when entering recovery (see Section 7.3.2). | when entering recovery (see Section 7.3.2). | |||
| 7.1. Explicit Congestion Notification | 7.1. Explicit Congestion Notification | |||
| If a path has been validated to support ECN ([RFC3168], [RFC8311]), | If a path has been validated to support ECN ([RFC3168], [RFC8311]), | |||
| QUIC treats a Congestion Experienced (CE) codepoint in the IP header | QUIC treats a Congestion Experienced (CE) codepoint in the IP header | |||
| as a signal of congestion. This document specifies an endpoint's | as a signal of congestion. This document specifies an endpoint's | |||
| response when its peer receives packets with the ECN-CE codepoint. | response when the peer-reported ECN-CE count increases; see | |||
| Section 13.4.2 of [QUIC-TRANSPORT]. | ||||
| 7.2. Initial and Minimum Congestion Window | 7.2. Initial and Minimum Congestion Window | |||
| QUIC begins every connection in slow start with the congestion window | QUIC begins every connection in slow start with the congestion window | |||
| set to an initial value. Endpoints SHOULD use an initial congestion | set to an initial value. Endpoints SHOULD use an initial congestion | |||
| window of 10 times the maximum datagram size (max_datagram_size), | window of 10 times the maximum datagram size (max_datagram_size), | |||
| limited to the larger of 14720 bytes or twice the maximum datagram | limited to the larger of 14720 bytes or twice the maximum datagram | |||
| size. This follows the analysis and recommendations in [RFC6928], | size. This follows the analysis and recommendations in [RFC6928], | |||
| increasing the byte limit to account for the smaller 8 byte overhead | increasing the byte limit to account for the smaller 8 byte overhead | |||
| of UDP compared to the 20 byte overhead for TCP. | of UDP compared to the 20 byte overhead for TCP. | |||
| skipping to change at page 20, line 41 ¶ | skipping to change at page 21, line 29 ¶ | |||
| congestion window. | congestion window. | |||
| Prior to validating the client's address, the server can be further | Prior to validating the client's address, the server can be further | |||
| limited by the anti-amplification limit as specified in Section 8.1 | limited by the anti-amplification limit as specified in Section 8.1 | |||
| of [QUIC-TRANSPORT]. Though the anti-amplification limit can prevent | of [QUIC-TRANSPORT]. Though the anti-amplification limit can prevent | |||
| the congestion window from being fully utilized and therefore slow | the congestion window from being fully utilized and therefore slow | |||
| down the increase in congestion window, it does not directly affect | down the increase in congestion window, it does not directly affect | |||
| the congestion window. | the congestion window. | |||
| The minimum congestion window is the smallest value the congestion | The minimum congestion window is the smallest value the congestion | |||
| window can decrease to as a response to loss, ECN-CE, or persistent | window can decrease to as a response to loss, increase in the peer- | |||
| congestion. The RECOMMENDED value is 2 * max_datagram_size. | reported ECN-CE count, or persistent congestion. The RECOMMENDED | |||
| value is 2 * max_datagram_size. | ||||
| 7.3. Congestion Control States | 7.3. Congestion Control States | |||
| The NewReno congestion controller described in this document has | The NewReno congestion controller described in this document has | |||
| three distinct states, as shown in Figure 1. | three distinct states, as shown in Figure 1. | |||
| New Path or +------------+ | New Path or +------------+ | |||
| persistent congestion | Slow | | persistent congestion | Slow | | |||
| (O)---------------------->| Start | | (O)---------------------->| Start | | |||
| +------------+ | +------------+ | |||
| skipping to change at page 23, line 40 ¶ | skipping to change at page 24, line 40 ¶ | |||
| Unlike the PTO computation in Section 6.2, this duration includes the | Unlike the PTO computation in Section 6.2, this duration includes the | |||
| max_ack_delay irrespective of the packet number spaces in which | max_ack_delay irrespective of the packet number spaces in which | |||
| losses are established. | losses are established. | |||
| This duration allows a sender to send as many packets before | This duration allows a sender to send as many packets before | |||
| establishing persistent congestion, including some in response to PTO | establishing persistent congestion, including some in response to PTO | |||
| expiration, as TCP does with Tail Loss Probes ([RACK]) and a | expiration, as TCP does with Tail Loss Probes ([RACK]) and a | |||
| Retransmission Timeout ([RFC5681]). | Retransmission Timeout ([RFC5681]). | |||
| Larger values of kPersistentCongestionThreshold cause the sender to | ||||
| become less responsive to persistent congestion in the network, which | ||||
| can result in aggressive sending into a congested network. Too small | ||||
| a value can result in a sender declaring persistent congestion | ||||
| unnecessarily, resulting in reduced throughput for the sender. | ||||
| The RECOMMENDED value for kPersistentCongestionThreshold is 3, which | The RECOMMENDED value for kPersistentCongestionThreshold is 3, which | |||
| is approximately equivalent to two TLPs before an RTO in TCP. | results in behavior that is approximately equivalent to a TCP sender | |||
| declaring an RTO after two TLPs. | ||||
| This design does not use consecutive PTO events to establish | This design does not use consecutive PTO events to establish | |||
| persistent congestion, since application patterns impact PTO | persistent congestion, since application patterns impact PTO | |||
| expirations. For example, a sender that sends small amounts of data | expirations. For example, a sender that sends small amounts of data | |||
| with silence periods between them restarts the PTO timer every time | with silence periods between them restarts the PTO timer every time | |||
| it sends, potentially preventing the PTO timer from expiring for a | it sends, potentially preventing the PTO timer from expiring for a | |||
| long period of time, even when no acknowledgments are being received. | long period of time, even when no acknowledgments are being received. | |||
| The use of a duration enables a sender to establish persistent | The use of a duration enables a sender to establish persistent | |||
| congestion without depending on PTO expiration. | congestion without depending on PTO expiration. | |||
| skipping to change at page 27, line 13 ¶ | skipping to change at page 28, line 13 ¶ | |||
| the above function. | the above function. | |||
| 7.8. Under-utilizing the Congestion Window | 7.8. Under-utilizing the Congestion Window | |||
| When bytes in flight is smaller than the congestion window and | When bytes in flight is smaller than the congestion window and | |||
| sending is not pacing limited, the congestion window is under- | sending is not pacing limited, the congestion window is under- | |||
| utilized. When this occurs, the congestion window SHOULD NOT be | utilized. When this occurs, the congestion window SHOULD NOT be | |||
| increased in either slow start or congestion avoidance. This can | increased in either slow start or congestion avoidance. This can | |||
| happen due to insufficient application data or flow control limits. | happen due to insufficient application data or flow control limits. | |||
| A sender MAY use the pipeACK method described in Section 4.3 of | ||||
| [RFC7661] to determine if the congestion window is sufficiently | ||||
| utilized. | ||||
| A sender that paces packets (see Section 7.7) might delay sending | A sender that paces packets (see Section 7.7) might delay sending | |||
| packets and not fully utilize the congestion window due to this | packets and not fully utilize the congestion window due to this | |||
| delay. A sender SHOULD NOT consider itself application limited if it | delay. A sender SHOULD NOT consider itself application limited if it | |||
| would have fully utilized the congestion window without pacing delay. | would have fully utilized the congestion window without pacing delay. | |||
| A sender MAY implement alternative mechanisms to update its | A sender MAY implement alternative mechanisms to update its | |||
| congestion window after periods of under-utilization, such as those | congestion window after periods of under-utilization, such as those | |||
| proposed for TCP in [RFC7661]. | proposed for TCP in [RFC7661]. | |||
| 8. Security Considerations | 8. Security Considerations | |||
| skipping to change at page 28, line 5 ¶ | skipping to change at page 29, line 5 ¶ | |||
| other frames, or they can use PADDING frames at a potential cost to | other frames, or they can use PADDING frames at a potential cost to | |||
| performance. | performance. | |||
| 8.3. Misreporting ECN Markings | 8.3. Misreporting ECN Markings | |||
| A receiver can misreport ECN markings to alter the congestion | A receiver can misreport ECN markings to alter the congestion | |||
| response of a sender. Suppressing reports of ECN-CE markings could | response of a sender. Suppressing reports of ECN-CE markings could | |||
| cause a sender to increase their send rate. This increase could | cause a sender to increase their send rate. This increase could | |||
| result in congestion and loss. | result in congestion and loss. | |||
| A sender MAY attempt to detect suppression of reports by marking | A sender can detect suppression of reports by marking occasional | |||
| occasional packets that they send with ECN-CE. If a packet sent with | packets that it sends with an ECN-CE marking. If a packet sent with | |||
| ECN-CE is not reported as having been CE marked when the packet is | an ECN-CE marking is not reported as having been CE marked when the | |||
| acknowledged, then the sender SHOULD disable ECN for that path. | packet is acknowledged, then the sender can disable ECN for that path | |||
| by not setting ECT codepoints in subsequent packets sent on that path | ||||
| [RFC3168]. | ||||
| Reporting additional ECN-CE markings will cause a sender to reduce | Reporting additional ECN-CE markings will cause a sender to reduce | |||
| their sending rate, which is similar in effect to advertising reduced | their sending rate, which is similar in effect to advertising reduced | |||
| connection flow control limits and so no advantage is gained by doing | connection flow control limits and so no advantage is gained by doing | |||
| so. | so. | |||
| Endpoints choose the congestion controller that they use. Congestion | Endpoints choose the congestion controller that they use. Congestion | |||
| controllers respond to reports of ECN-CE by reducing their rate, but | controllers respond to reports of ECN-CE by reducing their rate, but | |||
| the response may vary. Markings can be treated as equivalent to loss | the response may vary. Markings can be treated as equivalent to loss | |||
| ([RFC3168]), but other responses can be specified, such as | ([RFC3168]), but other responses can be specified, such as | |||
| skipping to change at page 28, line 31 ¶ | skipping to change at page 29, line 33 ¶ | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| This document has no IANA actions. | This document has no IANA actions. | |||
| 10. References | 10. References | |||
| 10.1. Normative References | 10.1. Normative References | |||
| [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | |||
| QUIC", Work in Progress, Internet-Draft, draft-ietf-quic- | QUIC", Work in Progress, Internet-Draft, draft-ietf-quic- | |||
| tls-31, 25 September 2020, | tls-32, 20 October 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-quic-tls-31>. | <https://tools.ietf.org/html/draft-ietf-quic-tls-32>. | |||
| [QUIC-TRANSPORT] | [QUIC-TRANSPORT] | |||
| Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", Work in Progress, | Multiplexed and Secure Transport", Work in Progress, | |||
| Internet-Draft, draft-ietf-quic-transport-31, 25 September | Internet-Draft, draft-ietf-quic-transport-32, 20 October | |||
| 2020, <https://tools.ietf.org/html/draft-ietf-quic- | 2020, <https://tools.ietf.org/html/draft-ietf-quic- | |||
| transport-31>. | transport-32>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | ||||
| of Explicit Congestion Notification (ECN) to IP", | ||||
| RFC 3168, DOI 10.17487/RFC3168, September 2001, | ||||
| <https://www.rfc-editor.org/info/rfc3168>. | ||||
| [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | [RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | |||
| Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | |||
| March 2017, <https://www.rfc-editor.org/info/rfc8085>. | March 2017, <https://www.rfc-editor.org/info/rfc8085>. | |||
| [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>. | |||
| 10.2. Informative References | 10.2. Informative References | |||
| [FACK] Mathis, M. and J. Mahdavi, "Forward Acknowledgement: | [FACK] Mathis, M. and J. Mahdavi, "Forward Acknowledgement: | |||
| Refining TCP Congestion Control", ACM SIGCOMM , August | Refining TCP Congestion Control", ACM SIGCOMM , August | |||
| 1996. | 1996. | |||
| [PRR] Mathis, M., Dukkipati, N., and Y. Cheng, "Proportional | [PRR] Mathis, M., Dukkipati, N., and Y. Cheng, "Proportional | |||
| Rate Reduction for TCP", RFC 6937, DOI 10.17487/RFC6937, | Rate Reduction for TCP", RFC 6937, DOI 10.17487/RFC6937, | |||
| May 2013, <https://www.rfc-editor.org/info/rfc6937>. | May 2013, <https://www.rfc-editor.org/info/rfc6937>. | |||
| [RACK] Cheng, Y., Cardwell, N., Dukkipati, N., and P. Jha, "The | [RACK] Cheng, Y., Cardwell, N., Dukkipati, N., and P. Jha, "The | |||
| RACK-TLP loss detection algorithm for TCP", Work in | RACK-TLP loss detection algorithm for TCP", Work in | |||
| Progress, Internet-Draft, draft-ietf-tcpm-rack-10, 22 | Progress, Internet-Draft, draft-ietf-tcpm-rack-11, 30 | |||
| August 2020, <http://www.ietf.org/internet-drafts/draft- | September 2020, <http://www.ietf.org/internet-drafts/ | |||
| ietf-tcpm-rack-10.txt>. | draft-ietf-tcpm-rack-11.txt>. | |||
| [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | ||||
| of Explicit Congestion Notification (ECN) to IP", | ||||
| RFC 3168, DOI 10.17487/RFC3168, September 2001, | ||||
| <https://www.rfc-editor.org/info/rfc3168>. | ||||
| [RFC3465] Allman, M., "TCP Congestion Control with Appropriate Byte | [RFC3465] Allman, M., "TCP Congestion Control with Appropriate Byte | |||
| Counting (ABC)", RFC 3465, DOI 10.17487/RFC3465, February | Counting (ABC)", RFC 3465, DOI 10.17487/RFC3465, February | |||
| 2003, <https://www.rfc-editor.org/info/rfc3465>. | 2003, <https://www.rfc-editor.org/info/rfc3465>. | |||
| [RFC5681] Allman, M., Paxson, V., and E. Blanton, "TCP Congestion | [RFC5681] Allman, M., Paxson, V., and E. Blanton, "TCP Congestion | |||
| Control", RFC 5681, DOI 10.17487/RFC5681, September 2009, | Control", RFC 5681, DOI 10.17487/RFC5681, September 2009, | |||
| <https://www.rfc-editor.org/info/rfc5681>. | <https://www.rfc-editor.org/info/rfc5681>. | |||
| [RFC5682] Sarolahti, P., Kojo, M., Yamamoto, K., and M. Hata, | [RFC5682] Sarolahti, P., Kojo, M., Yamamoto, K., and M. Hata, | |||
| skipping to change at page 30, line 46 ¶ | skipping to change at page 31, line 46 ¶ | |||
| [RFC8511] Khademi, N., Welzl, M., Armitage, G., and G. Fairhurst, | [RFC8511] Khademi, N., Welzl, M., Armitage, G., and G. Fairhurst, | |||
| "TCP Alternative Backoff with ECN (ABE)", RFC 8511, | "TCP Alternative Backoff with ECN (ABE)", RFC 8511, | |||
| DOI 10.17487/RFC8511, December 2018, | DOI 10.17487/RFC8511, December 2018, | |||
| <https://www.rfc-editor.org/info/rfc8511>. | <https://www.rfc-editor.org/info/rfc8511>. | |||
| Appendix A. Loss Recovery Pseudocode | Appendix A. Loss Recovery Pseudocode | |||
| We now describe an example implementation of the loss detection | We now describe an example implementation of the loss detection | |||
| mechanisms described in Section 6. | mechanisms described in Section 6. | |||
| The pseudocode segments in this section are licensed as Code | ||||
| Components; see the copyright notice. | ||||
| A.1. Tracking Sent Packets | A.1. Tracking Sent Packets | |||
| To correctly implement congestion control, a QUIC sender tracks every | To correctly implement congestion control, a QUIC sender tracks every | |||
| ack-eliciting packet until the packet is acknowledged or lost. It is | ack-eliciting packet until the packet is acknowledged or lost. It is | |||
| expected that implementations will be able to access this information | expected that implementations will be able to access this information | |||
| by packet number and crypto context and store the per-packet fields | by packet number and crypto context and store the per-packet fields | |||
| (Appendix A.1.1) for loss recovery and congestion control. | (Appendix A.1.1) for loss recovery and congestion control. | |||
| After a packet is declared lost, the endpoint can still maintain | After a packet is declared lost, the endpoint can still maintain | |||
| state for it for an amount of time to allow for packet reordering; | state for it for an amount of time to allow for packet reordering; | |||
| skipping to change at page 32, line 27 ¶ | skipping to change at page 33, line 33 ¶ | |||
| ack for a previously unacked packet. | ack for a previously unacked packet. | |||
| smoothed_rtt: The smoothed RTT of the connection, computed as | smoothed_rtt: The smoothed RTT of the connection, computed as | |||
| described in Section 5.3. | described in Section 5.3. | |||
| rttvar: The RTT variation, computed as described in Section 5.3. | rttvar: The RTT variation, computed as described in Section 5.3. | |||
| min_rtt: The minimum RTT seen in the connection, ignoring | min_rtt: The minimum RTT seen in the connection, ignoring | |||
| acknowledgment delay, as described in Section 5.2. | acknowledgment delay, as described in Section 5.2. | |||
| first_rtt_sample: The time that the first RTT sample was obtained. | ||||
| max_ack_delay: The maximum amount of time by which the receiver | max_ack_delay: The maximum amount of time by which the receiver | |||
| intends to delay acknowledgments for packets in the Application | intends to delay acknowledgments for packets in the Application | |||
| Data packet number space, as defined by the eponymous transport | Data packet number space, as defined by the eponymous transport | |||
| parameter (Section 18.2 of [QUIC-TRANSPORT]). Note that the | parameter (Section 18.2 of [QUIC-TRANSPORT]). Note that the | |||
| actual ack_delay in a received ACK frame may be larger due to late | actual ack_delay in a received ACK frame may be larger due to late | |||
| timers, reordering, or loss. | timers, reordering, or loss. | |||
| loss_detection_timer: Multi-modal timer used for loss detection. | loss_detection_timer: Multi-modal timer used for loss detection. | |||
| pto_count: The number of times a PTO has been sent without receiving | pto_count: The number of times a PTO has been sent without receiving | |||
| skipping to change at page 33, line 16 ¶ | skipping to change at page 34, line 24 ¶ | |||
| At the beginning of the connection, initialize the loss detection | At the beginning of the connection, initialize the loss detection | |||
| variables as follows: | variables as follows: | |||
| loss_detection_timer.reset() | loss_detection_timer.reset() | |||
| pto_count = 0 | pto_count = 0 | |||
| latest_rtt = 0 | latest_rtt = 0 | |||
| smoothed_rtt = kInitialRtt | smoothed_rtt = kInitialRtt | |||
| rttvar = kInitialRtt / 2 | rttvar = kInitialRtt / 2 | |||
| min_rtt = 0 | min_rtt = 0 | |||
| first_rtt_sample = 0 | ||||
| for pn_space in [ Initial, Handshake, ApplicationData ]: | for pn_space in [ Initial, Handshake, ApplicationData ]: | |||
| largest_acked_packet[pn_space] = infinite | largest_acked_packet[pn_space] = infinite | |||
| time_of_last_ack_eliciting_packet[pn_space] = 0 | time_of_last_ack_eliciting_packet[pn_space] = 0 | |||
| loss_time[pn_space] = 0 | loss_time[pn_space] = 0 | |||
| A.5. On Sending a Packet | A.5. On Sending a Packet | |||
| After a packet is sent, information about the packet is stored. The | After a packet is sent, information about the packet is stored. The | |||
| parameters to OnPacketSent are described in detail above in | parameters to OnPacketSent are described in detail above in | |||
| Appendix A.1.1. | Appendix A.1.1. | |||
| skipping to change at page 34, line 44 ¶ | skipping to change at page 36, line 4 ¶ | |||
| DetectAndRemoveAckedPackets(ack, pn_space) | DetectAndRemoveAckedPackets(ack, pn_space) | |||
| // Nothing to do if there are no newly acked packets. | // Nothing to do if there are no newly acked packets. | |||
| if (newly_acked_packets.empty()): | if (newly_acked_packets.empty()): | |||
| return | return | |||
| // Update the RTT if the largest acknowledged is newly acked | // Update the RTT if the largest acknowledged is newly acked | |||
| // and at least one ack-eliciting was newly acked. | // and at least one ack-eliciting was newly acked. | |||
| if (newly_acked_packets.largest().packet_number == | if (newly_acked_packets.largest().packet_number == | |||
| ack.largest_acked && | ack.largest_acked && | |||
| IncludesAckEliciting(newly_acked_packets)): | IncludesAckEliciting(newly_acked_packets)): | |||
| latest_rtt = | latest_rtt = | |||
| now() - newly_acked_packets.largest().time_sent | now() - newly_acked_packets.largest().time_sent | |||
| UpdateRtt(ack.ack_delay) | UpdateRtt(ack.ack_delay) | |||
| // Process ECN information if present. | // Process ECN information if present. | |||
| if (ACK frame contains ECN information): | if (ACK frame contains ECN information): | |||
| ProcessECN(ack, pn_space) | ProcessECN(ack, pn_space) | |||
| lost_packets = DetectAndRemoveLostPackets(pn_space) | lost_packets = DetectAndRemoveLostPackets(pn_space) | |||
| if (!lost_packets.empty()): | if (!lost_packets.empty()): | |||
| OnPacketsLost(lost_packets) | OnPacketsLost(lost_packets) | |||
| OnPacketsAcked(newly_acked_packets) | OnPacketsAcked(newly_acked_packets) | |||
| // Reset pto_count unless the client is unsure if | // Reset pto_count unless the client is unsure if | |||
| // the server has validated the client's address. | // the server has validated the client's address. | |||
| if (PeerCompletedAddressValidation()): | if (PeerCompletedAddressValidation()): | |||
| pto_count = 0 | pto_count = 0 | |||
| SetLossDetectionTimer() | SetLossDetectionTimer() | |||
| UpdateRtt(ack_delay): | UpdateRtt(ack_delay): | |||
| if (is first RTT sample): | if (first_rtt_sample == 0): | |||
| min_rtt = latest_rtt | min_rtt = latest_rtt | |||
| smoothed_rtt = latest_rtt | smoothed_rtt = latest_rtt | |||
| rttvar = latest_rtt / 2 | rttvar = latest_rtt / 2 | |||
| first_rtt_sample = now() | ||||
| return | return | |||
| // min_rtt ignores acknowledgment delay. | // min_rtt ignores acknowledgment delay. | |||
| min_rtt = min(min_rtt, latest_rtt) | min_rtt = min(min_rtt, latest_rtt) | |||
| // Limit ack_delay by max_ack_delay after handshake | // Limit ack_delay by max_ack_delay after handshake | |||
| // confirmation. Note that ack_delay is 0 for | // confirmation. Note that ack_delay is 0 for | |||
| // acknowledgements of Initial and Handshake packets. | // acknowledgements of Initial and Handshake packets. | |||
| if (handshake confirmed): | if (handshake confirmed): | |||
| ack_delay = min(ack_delay, max_ack_delay) | ack_delay = min(ack_delay, max_ack_delay) | |||
| skipping to change at page 39, line 22 ¶ | skipping to change at page 40, line 22 ¶ | |||
| loss_delay = max(loss_delay, kGranularity) | loss_delay = max(loss_delay, kGranularity) | |||
| // Packets sent before this time are deemed lost. | // Packets sent before this time are deemed lost. | |||
| lost_send_time = now() - loss_delay | lost_send_time = now() - loss_delay | |||
| foreach unacked in sent_packets[pn_space]: | foreach unacked in sent_packets[pn_space]: | |||
| if (unacked.packet_number > largest_acked_packet[pn_space]): | if (unacked.packet_number > largest_acked_packet[pn_space]): | |||
| continue | continue | |||
| // Mark packet as lost, or set time when it should be marked. | // Mark packet as lost, or set time when it should be marked. | |||
| // Note: The use of kPacketThreshold here assumes that there | ||||
| // were no sender-induced gaps in the packet number space. | ||||
| if (unacked.time_sent <= lost_send_time || | if (unacked.time_sent <= lost_send_time || | |||
| largest_acked_packet[pn_space] >= | largest_acked_packet[pn_space] >= | |||
| unacked.packet_number + kPacketThreshold): | unacked.packet_number + kPacketThreshold): | |||
| sent_packets[pn_space].remove(unacked.packet_number) | sent_packets[pn_space].remove(unacked.packet_number) | |||
| if (unacked.in_flight): | if (unacked.in_flight): | |||
| lost_packets.insert(unacked) | lost_packets.insert(unacked) | |||
| else: | else: | |||
| if (loss_time[pn_space] == 0): | if (loss_time[pn_space] == 0): | |||
| loss_time[pn_space] = unacked.time_sent + loss_delay | loss_time[pn_space] = unacked.time_sent + loss_delay | |||
| else: | else: | |||
| loss_time[pn_space] = min(loss_time[pn_space], | loss_time[pn_space] = min(loss_time[pn_space], | |||
| unacked.time_sent + loss_delay) | unacked.time_sent + loss_delay) | |||
| return lost_packets | return lost_packets | |||
| A.11. Upon Dropping Initial or Handshake Keys | ||||
| When Initial or Handshake keys are discarded, packets from the space | ||||
| are discarded and loss detection state is updated. | ||||
| Pseudocode for OnPacketNumberSpaceDiscarded follows: | ||||
| OnPacketNumberSpaceDiscarded(pn_space): | ||||
| assert(pn_space != ApplicationData) | ||||
| RemoveFromBytesInFlight(sent_packets[pn_space]) | ||||
| sent_packets[pn_space].clear() | ||||
| // Reset the loss detection and PTO timer | ||||
| time_of_last_ack_eliciting_packet[pn_space] = 0 | ||||
| loss_time[pn_space] = 0 | ||||
| pto_count = 0 | ||||
| SetLossDetectionTimer() | ||||
| Appendix B. Congestion Control Pseudocode | Appendix B. Congestion Control Pseudocode | |||
| We now describe an example implementation of the congestion | We now describe an example implementation of the congestion | |||
| controller described in Section 7. | controller described in Section 7. | |||
| The pseudocode segments in this section are licensed as Code | ||||
| Components; see the copyright notice. | ||||
| B.1. Constants of interest | B.1. Constants of interest | |||
| Constants used in congestion control are based on a combination of | Constants used in congestion control are based on a combination of | |||
| RFCs, papers, and common practice. | RFCs, papers, and common practice. | |||
| kInitialWindow: Default limit on the initial bytes in flight as | kInitialWindow: Default limit on the initial bytes in flight as | |||
| described in Section 7.2. | described in Section 7.2. | |||
| kMinimumWindow: Minimum congestion window in bytes as described in | kMinimumWindow: Minimum congestion window in bytes as described in | |||
| Section 7.2. | Section 7.2. | |||
| skipping to change at page 40, line 18 ¶ | skipping to change at page 41, line 49 ¶ | |||
| Section 7.6 recommends a value of 3. | Section 7.6 recommends a value of 3. | |||
| B.2. Variables of interest | B.2. Variables of interest | |||
| Variables required to implement the congestion control mechanisms are | Variables required to implement the congestion control mechanisms are | |||
| described in this section. | described in this section. | |||
| max_datagram_size: The sender's current maximum payload size. Does | max_datagram_size: The sender's current maximum payload size. Does | |||
| not include UDP or IP overhead. The max datagram size is used for | not include UDP or IP overhead. The max datagram size is used for | |||
| congestion window computations. An endpoint sets the value of | congestion window computations. An endpoint sets the value of | |||
| this variable based on its PMTU (see Section 14.1 of | this variable based on its Path Maximum Transmission Unit (PMTU; | |||
| [QUIC-TRANSPORT]), with a minimum value of 1200 bytes. | see Section 14.2 of [QUIC-TRANSPORT]), with a minimum value of | |||
| 1200 bytes. | ||||
| ecn_ce_counters[kPacketNumberSpace]: The highest value reported for | ecn_ce_counters[kPacketNumberSpace]: The highest value reported for | |||
| the ECN-CE counter in the packet number space by the peer in an | the ECN-CE counter in the packet number space by the peer in an | |||
| ACK frame. This value is used to detect increases in the reported | ACK frame. This value is used to detect increases in the reported | |||
| ECN-CE counter. | ECN-CE counter. | |||
| bytes_in_flight: The sum of the size in bytes of all sent packets | bytes_in_flight: The sum of the size in bytes of all sent packets | |||
| that contain at least one ack-eliciting or PADDING frame, and have | that contain at least one ack-eliciting or PADDING frame, and have | |||
| not been acknowledged or declared lost. The size does not include | not been acknowledged or declared lost. The size does not include | |||
| IP or UDP overhead, but does include the QUIC header and AEAD | IP or UDP overhead, but does include the QUIC header and AEAD | |||
| skipping to change at page 40, line 46 ¶ | skipping to change at page 42, line 30 ¶ | |||
| congestion_recovery_start_time: The time when QUIC first detects | congestion_recovery_start_time: The time when QUIC first detects | |||
| congestion due to loss or ECN, causing it to enter congestion | congestion due to loss or ECN, causing it to enter congestion | |||
| recovery. When a packet sent after this time is acknowledged, | recovery. When a packet sent after this time is acknowledged, | |||
| QUIC exits congestion recovery. | QUIC exits congestion recovery. | |||
| ssthresh: Slow start threshold in bytes. When the congestion window | ssthresh: Slow start threshold in bytes. When the congestion window | |||
| is below ssthresh, the mode is slow start and the window grows by | is below ssthresh, the mode is slow start and the window grows by | |||
| the number of bytes acknowledged. | the number of bytes acknowledged. | |||
| first_rtt_sample: The time that the first RTT sample was obtained. | The congestion control pseudocode also accesses some of the variables | |||
| from the loss recovery pseudocode. | ||||
| B.3. Initialization | B.3. Initialization | |||
| At the beginning of the connection, initialize the congestion control | At the beginning of the connection, initialize the congestion control | |||
| variables as follows: | variables as follows: | |||
| congestion_window = kInitialWindow | congestion_window = kInitialWindow | |||
| bytes_in_flight = 0 | bytes_in_flight = 0 | |||
| congestion_recovery_start_time = 0 | congestion_recovery_start_time = 0 | |||
| ssthresh = infinite | ssthresh = infinite | |||
| first_rtt_sample = 0 | ||||
| for pn_space in [ Initial, Handshake, ApplicationData ]: | for pn_space in [ Initial, Handshake, ApplicationData ]: | |||
| ecn_ce_counters[pn_space] = 0 | ecn_ce_counters[pn_space] = 0 | |||
| B.4. On Packet Sent | B.4. On Packet Sent | |||
| Whenever a packet is sent, and it contains non-ACK frames, the packet | Whenever a packet is sent, and it contains non-ACK frames, the packet | |||
| increases bytes_in_flight. | increases bytes_in_flight. | |||
| OnPacketSentCC(bytes_sent): | OnPacketSentCC(bytes_sent): | |||
| bytes_in_flight += bytes_sent | bytes_in_flight += bytes_sent | |||
| skipping to change at page 42, line 9 ¶ | skipping to change at page 43, line 19 ¶ | |||
| In congestion avoidance, implementers that use an integer | In congestion avoidance, implementers that use an integer | |||
| representation for congestion_window should be careful with division, | representation for congestion_window should be careful with division, | |||
| and can use the alternative approach suggested in Section 2.1 of | and can use the alternative approach suggested in Section 2.1 of | |||
| [RFC3465]. | [RFC3465]. | |||
| InCongestionRecovery(sent_time): | InCongestionRecovery(sent_time): | |||
| return sent_time <= congestion_recovery_start_time | return sent_time <= congestion_recovery_start_time | |||
| OnPacketsAcked(acked_packets): | OnPacketsAcked(acked_packets): | |||
| if (first_rtt_sample == 0): | ||||
| first_rtt_sample = now() | ||||
| for acked_packet in acked_packets: | for acked_packet in acked_packets: | |||
| OnPacketAcked(acked_packet) | OnPacketAcked(acked_packet) | |||
| OnPacketAcked(acked_packet): | OnPacketAcked(acked_packet): | |||
| // Remove from bytes_in_flight. | // Remove from bytes_in_flight. | |||
| bytes_in_flight -= acked_packet.sent_bytes | bytes_in_flight -= acked_packet.sent_bytes | |||
| // Do not increase congestion_window if application | // Do not increase congestion_window if application | |||
| // limited or flow control limited. | // limited or flow control limited. | |||
| if (IsAppOrFlowControlLimited()) | if (IsAppOrFlowControlLimited()) | |||
| return | return | |||
| skipping to change at page 43, line 31 ¶ | skipping to change at page 44, line 43 ¶ | |||
| OnPacketsLost(lost_packets): | OnPacketsLost(lost_packets): | |||
| // Remove lost packets from bytes_in_flight. | // Remove lost packets from bytes_in_flight. | |||
| for lost_packet in lost_packets: | for lost_packet in lost_packets: | |||
| bytes_in_flight -= lost_packet.sent_bytes | bytes_in_flight -= lost_packet.sent_bytes | |||
| OnCongestionEvent(lost_packets.largest().time_sent) | OnCongestionEvent(lost_packets.largest().time_sent) | |||
| // Reset the congestion window if the loss of these | // Reset the congestion window if the loss of these | |||
| // packets indicates persistent congestion. | // packets indicates persistent congestion. | |||
| // Only consider packets sent after getting an RTT sample. | // Only consider packets sent after getting an RTT sample. | |||
| assert(first_rtt_sample != 0) | if (first_rtt_sample == 0): | |||
| return | ||||
| pc_lost = {} | pc_lost = {} | |||
| for lost in lost_packets: | for lost in lost_packets: | |||
| if lost.time_sent > first_rtt_sample: | if lost.time_sent > first_rtt_sample: | |||
| pc_lost.insert(lost) | pc_lost.insert(lost) | |||
| if (InPersistentCongestion(pc_lost)): | if (InPersistentCongestion(pc_lost)): | |||
| congestion_window = kMinimumWindow | congestion_window = kMinimumWindow | |||
| congestion_recovery_start_time = 0 | congestion_recovery_start_time = 0 | |||
| B.9. Upon dropping Initial or Handshake keys | B.9. Removing Discarded Packets From Bytes In Flight | |||
| When Initial or Handshake keys are discarded, packets from the space | When Initial or Handshake keys are discarded, packets sent in that | |||
| are discarded and loss detection state is updated. | space no longer count toward bytes in flight. | |||
| Pseudocode for OnPacketNumberSpaceDiscarded follows: | Pseudocode for RemoveFromBytesInFlight follows: | |||
| OnPacketNumberSpaceDiscarded(pn_space): | RemoveFromBytesInFlight(discarded_packets): | |||
| assert(pn_space != ApplicationData) | ||||
| // Remove any unacknowledged packets from flight. | // Remove any unacknowledged packets from flight. | |||
| foreach packet in sent_packets[pn_space]: | foreach packet in discarded_packets: | |||
| if packet.in_flight | if packet.in_flight | |||
| bytes_in_flight -= size | bytes_in_flight -= size | |||
| sent_packets[pn_space].clear() | ||||
| // Reset the loss detection and PTO timer | ||||
| time_of_last_ack_eliciting_packet[pn_space] = 0 | ||||
| loss_time[pn_space] = 0 | ||||
| pto_count = 0 | ||||
| SetLossDetectionTimer() | ||||
| Appendix C. Change Log | Appendix C. Change Log | |||
| *RFC Editor's Note:* Please remove this section prior to | *RFC Editor's Note:* Please remove this section prior to | |||
| publication of a final version of this document. | publication of a final version of this document. | |||
| Issue and pull request numbers are listed with a leading octothorp. | Issue and pull request numbers are listed with a leading octothorp. | |||
| C.1. Since draft-ietf-quic-recovery-30 | C.1. Since draft-ietf-quic-recovery-31 | |||
| * Limit the number of Initial packets sent in response to | ||||
| unauthenticated packets (#4183, #4188) | ||||
| C.2. Since draft-ietf-quic-recovery-30 | ||||
| Editorial changes only. | Editorial changes only. | |||
| C.2. Since draft-ietf-quic-recovery-29 | C.3. Since draft-ietf-quic-recovery-29 | |||
| * Allow caching of packets that can't be decrypted, by allowing the | * Allow caching of packets that can't be decrypted, by allowing the | |||
| reported acknowledgment delay to exceed max_ack_delay prior to | reported acknowledgment delay to exceed max_ack_delay prior to | |||
| confirming the handshake (#3821, #3980, #4035, #3874) | confirming the handshake (#3821, #3980, #4035, #3874) | |||
| * Persistent congestion cannot include packets sent before the first | * Persistent congestion cannot include packets sent before the first | |||
| RTT sample for the path (#3875, #3889) | RTT sample for the path (#3875, #3889) | |||
| * Recommend reset of min_rtt in persistent congestion (#3927, #3975) | * Recommend reset of min_rtt in persistent congestion (#3927, #3975) | |||
| * Persistent congestion is independent of packet number space | * Persistent congestion is independent of packet number space | |||
| (#3939, #3961) | (#3939, #3961) | |||
| * Only limit bursts to the initial window without information about | * Only limit bursts to the initial window without information about | |||
| the path (#3892, #3936) | the path (#3892, #3936) | |||
| * Add normative requirements for increasing and reducing the | * Add normative requirements for increasing and reducing the | |||
| congestion window (#3944, #3978, #3997, #3998) | congestion window (#3944, #3978, #3997, #3998) | |||
| C.3. Since draft-ietf-quic-recovery-28 | C.4. Since draft-ietf-quic-recovery-28 | |||
| * Refactored pseudocode to correct PTO calculation (#3564, #3674, | * Refactored pseudocode to correct PTO calculation (#3564, #3674, | |||
| #3681) | #3681) | |||
| C.4. Since draft-ietf-quic-recovery-27 | C.5. Since draft-ietf-quic-recovery-27 | |||
| * Added recommendations for speeding up handshake under some loss | * Added recommendations for speeding up handshake under some loss | |||
| conditions (#3078, #3080) | conditions (#3078, #3080) | |||
| * PTO count is reset when handshake progress is made (#3272, #3415) | * PTO count is reset when handshake progress is made (#3272, #3415) | |||
| * PTO count is not reset by a client when the server might be | * PTO count is not reset by a client when the server might be | |||
| awaiting address validation (#3546, #3551) | awaiting address validation (#3546, #3551) | |||
| * Recommend repairing losses immediately after entering the recovery | * Recommend repairing losses immediately after entering the recovery | |||
| period (#3335, #3443) | period (#3335, #3443) | |||
| * Clarified what loss conditions can be ignored during the handshake | * Clarified what loss conditions can be ignored during the handshake | |||
| (#3456, #3450) | (#3456, #3450) | |||
| * Allow, but don't recommend, using RTT from previous connection to | * Allow, but don't recommend, using RTT from previous connection to | |||
| seed RTT (#3464, #3496) | seed RTT (#3464, #3496) | |||
| * Recommend use of adaptive loss detection thresholds (#3571, #3572) | * Recommend use of adaptive loss detection thresholds (#3571, #3572) | |||
| C.5. Since draft-ietf-quic-recovery-26 | C.6. Since draft-ietf-quic-recovery-26 | |||
| No changes. | No changes. | |||
| C.6. Since draft-ietf-quic-recovery-25 | C.7. Since draft-ietf-quic-recovery-25 | |||
| No significant changes. | No significant changes. | |||
| C.7. Since draft-ietf-quic-recovery-24 | C.8. Since draft-ietf-quic-recovery-24 | |||
| * Require congestion control of some sort (#3247, #3244, #3248) | * Require congestion control of some sort (#3247, #3244, #3248) | |||
| * Set a minimum reordering threshold (#3256, #3240) | * Set a minimum reordering threshold (#3256, #3240) | |||
| * PTO is specific to a packet number space (#3067, #3074, #3066) | * PTO is specific to a packet number space (#3067, #3074, #3066) | |||
| C.8. Since draft-ietf-quic-recovery-23 | C.9. Since draft-ietf-quic-recovery-23 | |||
| * Define under-utilizing the congestion window (#2630, #2686, #2675) | * Define under-utilizing the congestion window (#2630, #2686, #2675) | |||
| * PTO MUST send data if possible (#3056, #3057) | * PTO MUST send data if possible (#3056, #3057) | |||
| * Connection Close is not ack-eliciting (#3097, #3098) | * Connection Close is not ack-eliciting (#3097, #3098) | |||
| * MUST limit bursts to the initial congestion window (#3160) | * MUST limit bursts to the initial congestion window (#3160) | |||
| * Define the current max_datagram_size for congestion control | * Define the current max_datagram_size for congestion control | |||
| (#3041, #3167) | (#3041, #3167) | |||
| C.9. Since draft-ietf-quic-recovery-22 | C.10. Since draft-ietf-quic-recovery-22 | |||
| * PTO should always send an ack-eliciting packet (#2895) | * PTO should always send an ack-eliciting packet (#2895) | |||
| * Unify the Handshake Timer with the PTO timer (#2648, #2658, #2886) | * Unify the Handshake Timer with the PTO timer (#2648, #2658, #2886) | |||
| * Move ACK generation text to transport draft (#1860, #2916) | * Move ACK generation text to transport draft (#1860, #2916) | |||
| C.10. Since draft-ietf-quic-recovery-21 | C.11. Since draft-ietf-quic-recovery-21 | |||
| * No changes | * No changes | |||
| C.11. Since draft-ietf-quic-recovery-20 | C.12. Since draft-ietf-quic-recovery-20 | |||
| * Path validation can be used as initial RTT value (#2644, #2687) | * Path validation can be used as initial RTT value (#2644, #2687) | |||
| * max_ack_delay transport parameter defaults to 0 (#2638, #2646) | * max_ack_delay transport parameter defaults to 0 (#2638, #2646) | |||
| * ACK delay only measures intentional delays induced by the | * ACK delay only measures intentional delays induced by the | |||
| implementation (#2596, #2786) | implementation (#2596, #2786) | |||
| C.12. Since draft-ietf-quic-recovery-19 | C.13. Since draft-ietf-quic-recovery-19 | |||
| * Change kPersistentThreshold from an exponent to a multiplier | * Change kPersistentThreshold from an exponent to a multiplier | |||
| (#2557) | (#2557) | |||
| * Send a PING if the PTO timer fires and there's nothing to send | * Send a PING if the PTO timer fires and there's nothing to send | |||
| (#2624) | (#2624) | |||
| * Set loss delay to at least kGranularity (#2617) | * Set loss delay to at least kGranularity (#2617) | |||
| * Merge application limited and sending after idle sections. Always | * Merge application limited and sending after idle sections. Always | |||
| skipping to change at page 47, line 5 ¶ | skipping to change at page 48, line 10 ¶ | |||
| packet is ack-eliciting but the largest_acked is not (#2592) | packet is ack-eliciting but the largest_acked is not (#2592) | |||
| * Don't arm the handshake timer if there is no handshake data | * Don't arm the handshake timer if there is no handshake data | |||
| (#2590) | (#2590) | |||
| * Clarify that the time threshold loss alarm takes precedence over | * Clarify that the time threshold loss alarm takes precedence over | |||
| the crypto handshake timer (#2590, #2620) | the crypto handshake timer (#2590, #2620) | |||
| * Change initial RTT to 500ms to align with RFC6298 (#2184) | * Change initial RTT to 500ms to align with RFC6298 (#2184) | |||
| C.13. Since draft-ietf-quic-recovery-18 | C.14. Since draft-ietf-quic-recovery-18 | |||
| * Change IW byte limit to 14720 from 14600 (#2494) | * Change IW byte limit to 14720 from 14600 (#2494) | |||
| * Update PTO calculation to match RFC6298 (#2480, #2489, #2490) | * Update PTO calculation to match RFC6298 (#2480, #2489, #2490) | |||
| * Improve loss detection's description of multiple packet number | * Improve loss detection's description of multiple packet number | |||
| spaces and pseudocode (#2485, #2451, #2417) | spaces and pseudocode (#2485, #2451, #2417) | |||
| * Declare persistent congestion even if non-probe packets are sent | * Declare persistent congestion even if non-probe packets are sent | |||
| and don't make persistent congestion more aggressive than RTO | and don't make persistent congestion more aggressive than RTO | |||
| verified was (#2365, #2244) | verified was (#2365, #2244) | |||
| * Move pseudocode to the appendices (#2408) | * Move pseudocode to the appendices (#2408) | |||
| * What to send on multiple PTOs (#2380) | * What to send on multiple PTOs (#2380) | |||
| C.14. Since draft-ietf-quic-recovery-17 | C.15. Since draft-ietf-quic-recovery-17 | |||
| * After Probe Timeout discard in-flight packets or send another | * After Probe Timeout discard in-flight packets or send another | |||
| (#2212, #1965) | (#2212, #1965) | |||
| * Endpoints discard initial keys as soon as handshake keys are | * Endpoints discard initial keys as soon as handshake keys are | |||
| available (#1951, #2045) | available (#1951, #2045) | |||
| * 0-RTT state is discarded when 0-RTT is rejected (#2300) | * 0-RTT state is discarded when 0-RTT is rejected (#2300) | |||
| * Loss detection timer is cancelled when ack-eliciting frames are in | * Loss detection timer is cancelled when ack-eliciting frames are in | |||
| skipping to change at page 47, line 48 ¶ | skipping to change at page 49, line 5 ¶ | |||
| controller (#2138, 2187) | controller (#2138, 2187) | |||
| * Process ECN counts before marking packets lost (#2142) | * Process ECN counts before marking packets lost (#2142) | |||
| * Mark packets lost before resetting crypto_count and pto_count | * Mark packets lost before resetting crypto_count and pto_count | |||
| (#2208, #2209) | (#2208, #2209) | |||
| * Congestion and loss recovery state are discarded when keys are | * Congestion and loss recovery state are discarded when keys are | |||
| discarded (#2327) | discarded (#2327) | |||
| C.15. Since draft-ietf-quic-recovery-16 | C.16. Since draft-ietf-quic-recovery-16 | |||
| * Unify TLP and RTO into a single PTO; eliminate min RTO, min TLP | * Unify TLP and RTO into a single PTO; eliminate min RTO, min TLP | |||
| and min crypto timeouts; eliminate timeout validation (#2114, | and min crypto timeouts; eliminate timeout validation (#2114, | |||
| #2166, #2168, #1017) | #2166, #2168, #1017) | |||
| * Redefine how congestion avoidance in terms of when the period | * Redefine how congestion avoidance in terms of when the period | |||
| starts (#1928, #1930) | starts (#1928, #1930) | |||
| * Document what needs to be tracked for packets that are in flight | * Document what needs to be tracked for packets that are in flight | |||
| (#765, #1724, #1939) | (#765, #1724, #1939) | |||
| skipping to change at page 48, line 30 ¶ | skipping to change at page 49, line 36 ¶ | |||
| * Limit ack_delay by max_ack_delay (#2060, #2099) | * Limit ack_delay by max_ack_delay (#2060, #2099) | |||
| * Initial keys are discarded once Handshake keys are available | * Initial keys are discarded once Handshake keys are available | |||
| (#1951, #2045) | (#1951, #2045) | |||
| * Reorder ECN and loss detection in pseudocode (#2142) | * Reorder ECN and loss detection in pseudocode (#2142) | |||
| * Only cancel loss detection timer if ack-eliciting packets are in | * Only cancel loss detection timer if ack-eliciting packets are in | |||
| flight (#2093, #2117) | flight (#2093, #2117) | |||
| C.16. Since draft-ietf-quic-recovery-14 | C.17. Since draft-ietf-quic-recovery-14 | |||
| * Used max_ack_delay from transport params (#1796, #1782) | * Used max_ack_delay from transport params (#1796, #1782) | |||
| * Merge ACK and ACK_ECN (#1783) | * Merge ACK and ACK_ECN (#1783) | |||
| C.17. Since draft-ietf-quic-recovery-13 | C.18. Since draft-ietf-quic-recovery-13 | |||
| * Corrected the lack of ssthresh reduction in CongestionEvent | * Corrected the lack of ssthresh reduction in CongestionEvent | |||
| pseudocode (#1598) | pseudocode (#1598) | |||
| * Considerations for ECN spoofing (#1426, #1626) | * Considerations for ECN spoofing (#1426, #1626) | |||
| * Clarifications for PADDING and congestion control (#837, #838, | * Clarifications for PADDING and congestion control (#837, #838, | |||
| #1517, #1531, #1540) | #1517, #1531, #1540) | |||
| * Reduce early retransmission timer to RTT/8 (#945, #1581) | * Reduce early retransmission timer to RTT/8 (#945, #1581) | |||
| skipping to change at page 48, line 47 ¶ | skipping to change at page 50, line 4 ¶ | |||
| * Corrected the lack of ssthresh reduction in CongestionEvent | * Corrected the lack of ssthresh reduction in CongestionEvent | |||
| pseudocode (#1598) | pseudocode (#1598) | |||
| * Considerations for ECN spoofing (#1426, #1626) | * Considerations for ECN spoofing (#1426, #1626) | |||
| * Clarifications for PADDING and congestion control (#837, #838, | * Clarifications for PADDING and congestion control (#837, #838, | |||
| #1517, #1531, #1540) | #1517, #1531, #1540) | |||
| * Reduce early retransmission timer to RTT/8 (#945, #1581) | * Reduce early retransmission timer to RTT/8 (#945, #1581) | |||
| * Packets are declared lost after an RTO is verified (#935, #1582) | * Packets are declared lost after an RTO is verified (#935, #1582) | |||
| C.18. Since draft-ietf-quic-recovery-12 | C.19. Since draft-ietf-quic-recovery-12 | |||
| * Changes to manage separate packet number spaces and encryption | * Changes to manage separate packet number spaces and encryption | |||
| levels (#1190, #1242, #1413, #1450) | levels (#1190, #1242, #1413, #1450) | |||
| * Added ECN feedback mechanisms and handling; new ACK_ECN frame | * Added ECN feedback mechanisms and handling; new ACK_ECN frame | |||
| (#804, #805, #1372) | (#804, #805, #1372) | |||
| C.19. Since draft-ietf-quic-recovery-11 | C.20. Since draft-ietf-quic-recovery-11 | |||
| No significant changes. | No significant changes. | |||
| C.20. Since draft-ietf-quic-recovery-10 | C.21. Since draft-ietf-quic-recovery-10 | |||
| * Improved text on ack generation (#1139, #1159) | * Improved text on ack generation (#1139, #1159) | |||
| * Make references to TCP recovery mechanisms informational (#1195) | * Make references to TCP recovery mechanisms informational (#1195) | |||
| * Define time_of_last_sent_handshake_packet (#1171) | * Define time_of_last_sent_handshake_packet (#1171) | |||
| * Added signal from TLS the data it includes needs to be sent in a | * Added signal from TLS the data it includes needs to be sent in a | |||
| Retry packet (#1061, #1199) | Retry packet (#1061, #1199) | |||
| * Minimum RTT (min_rtt) is initialized with an infinite value | * Minimum RTT (min_rtt) is initialized with an infinite value | |||
| (#1169) | (#1169) | |||
| C.21. Since draft-ietf-quic-recovery-09 | C.22. Since draft-ietf-quic-recovery-09 | |||
| No significant changes. | No significant changes. | |||
| C.22. Since draft-ietf-quic-recovery-08 | C.23. Since draft-ietf-quic-recovery-08 | |||
| * Clarified pacing and RTO (#967, #977) | * Clarified pacing and RTO (#967, #977) | |||
| C.23. Since draft-ietf-quic-recovery-07 | C.24. Since draft-ietf-quic-recovery-07 | |||
| * Include ACK delay in RTO(and TLP) computations (#981) | * Include ACK delay in RTO(and TLP) computations (#981) | |||
| * ACK delay in SRTT computation (#961) | * ACK delay in SRTT computation (#961) | |||
| * Default RTT and Slow Start (#590) | * Default RTT and Slow Start (#590) | |||
| * Many editorial fixes. | * Many editorial fixes. | |||
| C.24. Since draft-ietf-quic-recovery-06 | C.25. Since draft-ietf-quic-recovery-06 | |||
| No significant changes. | No significant changes. | |||
| C.25. Since draft-ietf-quic-recovery-05 | C.26. Since draft-ietf-quic-recovery-05 | |||
| * Add more congestion control text (#776) | * Add more congestion control text (#776) | |||
| C.26. Since draft-ietf-quic-recovery-04 | C.27. Since draft-ietf-quic-recovery-04 | |||
| No significant changes. | No significant changes. | |||
| C.27. Since draft-ietf-quic-recovery-03 | C.28. Since draft-ietf-quic-recovery-03 | |||
| No significant changes. | No significant changes. | |||
| C.28. Since draft-ietf-quic-recovery-02 | C.29. Since draft-ietf-quic-recovery-02 | |||
| * Integrate F-RTO (#544, #409) | * Integrate F-RTO (#544, #409) | |||
| * Add congestion control (#545, #395) | * Add congestion control (#545, #395) | |||
| * Require connection abort if a skipped packet was acknowledged | * Require connection abort if a skipped packet was acknowledged | |||
| (#415) | (#415) | |||
| * Simplify RTO calculations (#142, #417) | * Simplify RTO calculations (#142, #417) | |||
| C.29. Since draft-ietf-quic-recovery-01 | C.30. Since draft-ietf-quic-recovery-01 | |||
| * Overview added to loss detection | * Overview added to loss detection | |||
| * Changes initial default RTT to 100ms | * Changes initial default RTT to 100ms | |||
| * Added time-based loss detection and fixes early retransmit | * Added time-based loss detection and fixes early retransmit | |||
| * Clarified loss recovery for handshake packets | * Clarified loss recovery for handshake packets | |||
| * Fixed references and made TCP references informative | * Fixed references and made TCP references informative | |||
| C.30. Since draft-ietf-quic-recovery-00 | C.31. Since draft-ietf-quic-recovery-00 | |||
| * Improved description of constants and ACK behavior | * Improved description of constants and ACK behavior | |||
| C.31. Since draft-iyengar-quic-loss-recovery-01 | C.32. Since draft-iyengar-quic-loss-recovery-01 | |||
| * Adopted as base for draft-ietf-quic-recovery | * Adopted as base for draft-ietf-quic-recovery | |||
| * Updated authors/editors list | * Updated authors/editors list | |||
| * Added table of contents | * Added table of contents | |||
| Appendix D. Contributors | Appendix D. Contributors | |||
| The IETF QUIC Working Group received an enormous amount of support | The IETF QUIC Working Group received an enormous amount of support | |||
| from many people. The following people provided substantive | from many people. The following people provided substantive | |||
| contributions to this document: | contributions to this document: | |||
| * Alessandro Ghedini | * Alessandro Ghedini | |||
| End of changes. 90 change blocks. | ||||
| 200 lines changed or deleted | 254 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/ | ||||