| draft-ietf-quic-recovery-latest.txt | draft-ietf-quic-recovery-auth48.txt | |||
|---|---|---|---|---|
| skipping to change at page 2, line 7 ¶ | skipping to change at line 46 ¶ | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 3 | 2. Conventions and Definitions | |||
| 3. Design of the QUIC Transmission Machinery . . . . . . . . . . 4 | 3. Design of the QUIC Transmission Machinery | |||
| 4. Relevant Differences Between QUIC and TCP . . . . . . . . . . 5 | 4. Relevant Differences between QUIC and TCP | |||
| 4.1. Separate Packet Number Spaces . . . . . . . . . . . . . . 5 | 4.1. Separate Packet Number Spaces | |||
| 4.2. Monotonically Increasing Packet Numbers . . . . . . . . . 5 | 4.2. Monotonically Increasing Packet Numbers | |||
| 4.3. Clearer Loss Epoch . . . . . . . . . . . . . . . . . . . 5 | 4.3. Clearer Loss Epoch | |||
| 4.4. No Reneging . . . . . . . . . . . . . . . . . . . . . . . 6 | 4.4. No Reneging | |||
| 4.5. More ACK Ranges . . . . . . . . . . . . . . . . . . . . . 6 | 4.5. More ACK Ranges | |||
| 4.6. Explicit Correction For Delayed Acknowledgments . . . . . 6 | 4.6. Explicit Correction for Delayed Acknowledgments | |||
| 4.7. Probe Timeout Replaces RTO and TLP . . . . . . . . . . . 6 | 4.7. Probe Timeout Replaces RTO and TLP | |||
| 4.8. The Minimum Congestion Window Is Two Packets . . . . . . 7 | 4.8. The Minimum Congestion Window Is Two Packets | |||
| 4.9. Handshake Packets Are Not Special . . . . . . . . . . . . 7 | 4.9. Handshake Packets Are Not Special | |||
| 5. Estimating the Round-Trip Time . . . . . . . . . . . . . . . 7 | 5. Estimating the Round-Trip Time | |||
| 5.1. Generating RTT Samples . . . . . . . . . . . . . . . . . 7 | 5.1. Generating RTT Samples | |||
| 5.2. Estimating min_rtt . . . . . . . . . . . . . . . . . . . 8 | 5.2. Estimating min_rtt | |||
| 5.3. Estimating smoothed_rtt and rttvar . . . . . . . . . . . 9 | 5.3. Estimating smoothed_rtt and rttvar | |||
| 6. Loss Detection . . . . . . . . . . . . . . . . . . . . . . . 11 | 6. Loss Detection | |||
| 6.1. Acknowledgment-Based Detection . . . . . . . . . . . . . 11 | 6.1. Acknowledgment-Based Detection | |||
| 6.1.1. Packet Threshold . . . . . . . . . . . . . . . . . . 12 | 6.1.1. Packet Threshold | |||
| 6.1.2. Time Threshold . . . . . . . . . . . . . . . . . . . 12 | 6.1.2. Time Threshold | |||
| 6.2. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 13 | 6.2. Probe Timeout | |||
| 6.2.1. Computing PTO . . . . . . . . . . . . . . . . . . . . 14 | 6.2.1. Computing PTO | |||
| 6.2.2. Handshakes and New Paths . . . . . . . . . . . . . . 15 | 6.2.2. Handshakes and New Paths | |||
| 6.2.3. Speeding up Handshake Completion . . . . . . . . . . 16 | 6.2.3. Speeding up Handshake Completion | |||
| 6.2.4. Sending Probe Packets . . . . . . . . . . . . . . . . 17 | 6.2.4. Sending Probe Packets | |||
| 6.3. Handling Retry Packets . . . . . . . . . . . . . . . . . 18 | 6.3. Handling Retry Packets | |||
| 6.4. Discarding Keys and Packet State . . . . . . . . . . . . 18 | 6.4. Discarding Keys and Packet State | |||
| 7. Congestion Control . . . . . . . . . . . . . . . . . . . . . 19 | 7. Congestion Control | |||
| 7.1. Explicit Congestion Notification . . . . . . . . . . . . 19 | 7.1. Explicit Congestion Notification | |||
| 7.2. Initial and Minimum Congestion Window . . . . . . . . . . 20 | 7.2. Initial and Minimum Congestion Window | |||
| 7.3. Congestion Control States . . . . . . . . . . . . . . . . 20 | 7.3. Congestion Control States | |||
| 7.3.1. Slow Start . . . . . . . . . . . . . . . . . . . . . 21 | 7.3.1. Slow Start | |||
| 7.3.2. Recovery . . . . . . . . . . . . . . . . . . . . . . 21 | 7.3.2. Recovery | |||
| 7.3.3. Congestion Avoidance . . . . . . . . . . . . . . . . 22 | 7.3.3. Congestion Avoidance | |||
| 7.4. Ignoring Loss of Undecryptable Packets . . . . . . . . . 22 | 7.4. Ignoring Loss of Undecryptable Packets | |||
| 7.5. Probe Timeout . . . . . . . . . . . . . . . . . . . . . . 23 | 7.5. Probe Timeout | |||
| 7.6. Persistent Congestion . . . . . . . . . . . . . . . . . . 23 | 7.6. Persistent Congestion | |||
| 7.6.1. Duration . . . . . . . . . . . . . . . . . . . . . . 23 | 7.6.1. Duration | |||
| 7.6.2. Establishing Persistent Congestion . . . . . . . . . 24 | 7.6.2. Establishing Persistent Congestion | |||
| 7.6.3. Example . . . . . . . . . . . . . . . . . . . . . . . 25 | 7.6.3. Example | |||
| 7.7. Pacing . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 7.7. Pacing | |||
| 7.8. Underutilizing the Congestion Window . . . . . . . . . . 27 | 7.8. Underutilizing the Congestion Window | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 27 | 8. Security Considerations | |||
| 8.1. Loss and Congestion Signals . . . . . . . . . . . . . . . 27 | 8.1. Loss and Congestion Signals | |||
| 8.2. Traffic Analysis . . . . . . . . . . . . . . . . . . . . 27 | 8.2. Traffic Analysis | |||
| 8.3. Misreporting ECN Markings . . . . . . . . . . . . . . . . 27 | 8.3. Misreporting ECN Markings | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 9. References | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 28 | 9.1. Normative References | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . 29 | 9.2. Informative References | |||
| Appendix A. Loss Recovery Pseudocode . . . . . . . . . . . . . . 30 | Appendix A. Loss Recovery Pseudocode | |||
| A.1. Tracking Sent Packets . . . . . . . . . . . . . . . . . . 31 | A.1. Tracking Sent Packets | |||
| A.1.1. Sent Packet Fields . . . . . . . . . . . . . . . . . 31 | A.1.1. Sent Packet Fields | |||
| A.2. Constants of Interest . . . . . . . . . . . . . . . . . . 31 | A.2. Constants of Interest | |||
| A.3. Variables of Interest . . . . . . . . . . . . . . . . . . 32 | A.3. Variables of Interest | |||
| A.4. Initialization . . . . . . . . . . . . . . . . . . . . . 33 | A.4. Initialization | |||
| A.5. On Sending a Packet . . . . . . . . . . . . . . . . . . . 33 | A.5. On Sending a Packet | |||
| A.6. On Receiving a Datagram . . . . . . . . . . . . . . . . . 34 | A.6. On Receiving a Datagram | |||
| A.7. On Receiving an Acknowledgment . . . . . . . . . . . . . 34 | A.7. On Receiving an Acknowledgment | |||
| A.8. Setting the Loss Detection Timer . . . . . . . . . . . . 36 | A.8. Setting the Loss Detection Timer | |||
| A.9. On Timeout . . . . . . . . . . . . . . . . . . . . . . . 37 | A.9. On Timeout | |||
| A.10. Detecting Lost Packets . . . . . . . . . . . . . . . . . 38 | A.10. Detecting Lost Packets | |||
| A.11. Upon Dropping Initial or Handshake Keys . . . . . . . . . 39 | A.11. Upon Dropping Initial or Handshake Keys | |||
| Appendix B. Congestion Control Pseudocode . . . . . . . . . . . 40 | Appendix B. Congestion Control Pseudocode | |||
| B.1. Constants of Interest . . . . . . . . . . . . . . . . . . 40 | B.1. Constants of Interest | |||
| B.2. Variables of Interest . . . . . . . . . . . . . . . . . . 40 | B.2. Variables of Interest | |||
| B.3. Initialization . . . . . . . . . . . . . . . . . . . . . 41 | B.3. Initialization | |||
| B.4. On Packet Sent . . . . . . . . . . . . . . . . . . . . . 41 | B.4. On Packet Sent | |||
| B.5. On Packet Acknowledgment . . . . . . . . . . . . . . . . 41 | B.5. On Packet Acknowledgment | |||
| B.6. On New Congestion Event . . . . . . . . . . . . . . . . . 42 | B.6. On New Congestion Event | |||
| B.7. Process ECN Information . . . . . . . . . . . . . . . . . 43 | B.7. Process ECN Information | |||
| B.8. On Packets Lost . . . . . . . . . . . . . . . . . . . . . 43 | B.8. On Packets Lost | |||
| B.9. Removing Discarded Packets from Bytes in Flight . . . . . 43 | B.9. Removing Discarded Packets from Bytes in Flight | |||
| Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | Contributors | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 45 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| QUIC is a secure, general-purpose transport protocol, described in | QUIC is a secure, general-purpose transport protocol, described in | |||
| [QUIC-TRANSPORT]. This document describes loss detection and | [QUIC-TRANSPORT]. This document describes loss detection and | |||
| congestion control mechanisms for QUIC. | congestion control mechanisms for QUIC. | |||
| 2. Conventions and Definitions | 2. Conventions and Definitions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| skipping to change at page 4, line 37 ¶ | skipping to change at line 173 ¶ | |||
| transmissions and retransmissions; this eliminates significant | transmissions and retransmissions; this eliminates significant | |||
| complexity from QUIC's interpretation of TCP loss detection | complexity from QUIC's interpretation of TCP loss detection | |||
| mechanisms. | mechanisms. | |||
| QUIC packets can contain multiple frames of different types. The | QUIC packets can contain multiple frames of different types. The | |||
| recovery mechanisms ensure that data and frames that need reliable | recovery mechanisms ensure that data and frames that need reliable | |||
| delivery are acknowledged or declared lost and sent in new packets as | delivery are acknowledged or declared lost and sent in new packets as | |||
| necessary. The types of frames contained in a packet affect recovery | necessary. The types of frames contained in a packet affect recovery | |||
| and congestion control logic: | and congestion control logic: | |||
| o All packets are acknowledged, though packets that contain no ack- | * All packets are acknowledged, though packets that contain no ack- | |||
| eliciting frames are only acknowledged along with ack-eliciting | eliciting frames are only acknowledged along with ack-eliciting | |||
| packets. | packets. | |||
| o Long header packets that contain CRYPTO frames are critical to the | * Long header packets that contain CRYPTO frames are critical to the | |||
| performance of the QUIC handshake and use shorter timers for | performance of the QUIC handshake and use shorter timers for | |||
| acknowledgment. | acknowledgment. | |||
| o Packets containing frames besides ACK or CONNECTION_CLOSE frames | * Packets containing frames besides ACK or CONNECTION_CLOSE frames | |||
| count toward congestion control limits and are considered to be in | count toward congestion control limits and are considered to be in | |||
| flight. | flight. | |||
| o PADDING frames cause packets to contribute toward bytes in flight | * PADDING frames cause packets to contribute toward bytes in flight | |||
| without directly causing an acknowledgment to be sent. | without directly causing an acknowledgment to be sent. | |||
| 4. Relevant Differences Between QUIC and TCP | 4. Relevant Differences between QUIC and TCP | |||
| Readers familiar with TCP's loss detection and congestion control | Readers familiar with TCP's loss detection and congestion control | |||
| will find algorithms here that parallel well-known TCP ones. | will find algorithms here that parallel well-known TCP ones. | |||
| However, protocol differences between QUIC and TCP contribute to | However, protocol differences between QUIC and TCP contribute to | |||
| algorithmic differences. These protocol differences are briefly | algorithmic differences. These protocol differences are briefly | |||
| described below. | described below. | |||
| 4.1. Separate Packet Number Spaces | 4.1. Separate Packet Number Spaces | |||
| QUIC uses separate packet number spaces for each encryption level, | QUIC uses separate packet number spaces for each encryption level, | |||
| skipping to change at page 6, line 24 ¶ | skipping to change at line 256 ¶ | |||
| implementations on both sides and reducing memory pressure on the | implementations on both sides and reducing memory pressure on the | |||
| sender. | sender. | |||
| 4.5. More ACK Ranges | 4.5. More ACK Ranges | |||
| QUIC supports many ACK ranges, as opposed to TCP's three SACK ranges. | QUIC supports many ACK ranges, as opposed to TCP's three SACK ranges. | |||
| In high-loss environments, this speeds recovery, reduces spurious | In high-loss environments, this speeds recovery, reduces spurious | |||
| retransmits, and ensures forward progress without relying on | retransmits, and ensures forward progress without relying on | |||
| timeouts. | timeouts. | |||
| 4.6. Explicit Correction For Delayed Acknowledgments | 4.6. Explicit Correction for Delayed Acknowledgments | |||
| QUIC endpoints measure the delay incurred between when a packet is | QUIC endpoints measure the delay incurred between when a packet is | |||
| received and when the corresponding acknowledgment is sent, allowing | received and when the corresponding acknowledgment is sent, allowing | |||
| a peer to maintain a more accurate RTT estimate; see Section 13.2 of | a peer to maintain a more accurate RTT estimate; see Section 13.2 of | |||
| [QUIC-TRANSPORT]. | [QUIC-TRANSPORT]. | |||
| 4.7. Probe Timeout Replaces RTO and TLP | 4.7. Probe Timeout Replaces RTO and TLP | |||
| QUIC uses a probe timeout (PTO; see Section 6.2), with a timer based | QUIC uses a probe timeout (PTO; see Section 6.2), with a timer based | |||
| on TCP's retransmission timeout (RTO) computation; see [RFC6298]. | on TCP's retransmission timeout (RTO) computation; see [RFC6298]. | |||
| skipping to change at page 7, line 45 ¶ | skipping to change at line 325 ¶ | |||
| for each path: the minimum value over a period of time (min_rtt), an | for each path: the minimum value over a period of time (min_rtt), an | |||
| exponentially weighted moving average (smoothed_rtt), and the mean | exponentially weighted moving average (smoothed_rtt), and the mean | |||
| deviation (referred to as "variation" in the rest of this document) | deviation (referred to as "variation" in the rest of this document) | |||
| in the observed RTT samples (rttvar). | in the observed RTT samples (rttvar). | |||
| 5.1. Generating RTT Samples | 5.1. Generating RTT Samples | |||
| An endpoint generates an RTT sample on receiving an ACK frame that | An endpoint generates an RTT sample on receiving an ACK frame that | |||
| meets the following two conditions: | meets the following two conditions: | |||
| o the largest acknowledged packet number is newly acknowledged, and | * the largest acknowledged packet number is newly acknowledged, and | |||
| o at least one of the newly acknowledged packets was ack-eliciting. | * at least one of the newly acknowledged packets was ack-eliciting. | |||
| The RTT sample, latest_rtt, is generated as the time elapsed since | The RTT sample, latest_rtt, is generated as the time elapsed since | |||
| the largest acknowledged packet was sent: | the largest acknowledged packet was sent: | |||
| latest_rtt = ack_time - send_time_of_largest_acked | latest_rtt = ack_time - send_time_of_largest_acked | |||
| An RTT sample is generated using only the largest acknowledged packet | An RTT sample is generated using only the largest acknowledged packet | |||
| in the received ACK frame. This is because a peer reports | in the received ACK frame. This is because a peer reports | |||
| acknowledgment delays for only the largest acknowledged packet in an | acknowledgment delays for only the largest acknowledged packet in an | |||
| ACK frame. While the reported acknowledgment delay is not used by | ACK frame. While the reported acknowledgment delay is not used by | |||
| the RTT sample measurement, it is used to adjust the RTT sample in | the RTT sample measurement, it is used to adjust the RTT sample in | |||
| subsequent computations of smoothed_rtt and rttvar (Section 5.3). | subsequent computations of smoothed_rtt and rttvar (Section 5.3). | |||
| To avoid generating multiple RTT samples for a single packet, an ACK | To avoid generating multiple RTT samples for a single packet, an ACK | |||
| frame SHOULD NOT be used to update RTT estimates if it does not newly | frame SHOULD NOT be used to update RTT estimates if it does not newly | |||
| acknowledge the largest acknowledged packet. | acknowledge the largest acknowledged packet. | |||
| skipping to change at page 10, line 8 ¶ | skipping to change at line 433 ¶ | |||
| 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 acknowledgments. | scheduler latency at the peer or loss of previous acknowledgments. | |||
| Excess delays could also be due to a noncompliant receiver. | Excess delays could also be due to a noncompliant 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 | |||
| acknowledgment delays, an endpoint: | acknowledgment delays, an endpoint: | |||
| o MAY ignore the acknowledgment delay for Initial packets, since | * MAY ignore the acknowledgment delay for Initial packets, since | |||
| these acknowledgments are not delayed by the peer (Section 13.2.1 | these acknowledgments are not delayed by the peer (Section 13.2.1 | |||
| of [QUIC-TRANSPORT]); | of [QUIC-TRANSPORT]); | |||
| o SHOULD ignore the peer's max_ack_delay until the handshake is | * SHOULD ignore the peer's max_ack_delay until the handshake is | |||
| confirmed; | confirmed; | |||
| o MUST use the lesser of the acknowledgment delay and the peer's | * MUST use the lesser of the acknowledgment delay and the peer's | |||
| max_ack_delay after the handshake is confirmed; and | max_ack_delay after the handshake is confirmed; and | |||
| o MUST NOT subtract the acknowledgment delay from the RTT sample if | * MUST NOT subtract the acknowledgment delay from the RTT sample if | |||
| the resulting value is smaller than the min_rtt. This limits the | the resulting value is smaller than the min_rtt. This limits the | |||
| 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 | |||
| acknowledgments when the corresponding decryption keys are not | acknowledgments 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 | |||
| acknowledgment for a 0-RTT packet that it cannot decrypt because | acknowledgment 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. | |||
| skipping to change at page 11, line 50 ¶ | skipping to change at line 523 ¶ | |||
| Acknowledgment-based loss detection implements the spirit of TCP's | Acknowledgment-based loss detection implements the spirit of TCP's | |||
| Fast Retransmit [RFC5681], Early Retransmit [RFC5827], Forward | Fast Retransmit [RFC5681], Early Retransmit [RFC5827], Forward | |||
| Acknowledgment [FACK], SACK loss recovery [RFC6675], and RACK-TLP | Acknowledgment [FACK], SACK loss recovery [RFC6675], and RACK-TLP | |||
| [RFC8985]. This section provides an overview of how these algorithms | [RFC8985]. This section provides an overview of how these algorithms | |||
| are implemented in QUIC. | are implemented in QUIC. | |||
| A packet is declared lost if it meets all of the following | A packet is declared lost if it meets all of the following | |||
| conditions: | conditions: | |||
| o 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. | |||
| o The packet was sent kPacketThreshold packets before 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 acknowledgment indicates that a packet sent later was delivered, | The acknowledgment 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 13, line 8 ¶ | skipping to change at line 577 ¶ | |||
| constant. The time threshold is: | constant. The time threshold is: | |||
| max(kTimeThreshold * max(smoothed_rtt, latest_rtt), kGranularity) | max(kTimeThreshold * max(smoothed_rtt, latest_rtt), kGranularity) | |||
| If packets sent prior to the largest acknowledged packet cannot yet | If packets sent prior to the largest acknowledged packet cannot yet | |||
| be declared lost, then a timer SHOULD be set for the remaining time. | be declared lost, then a timer SHOULD be set for the remaining time. | |||
| Using max(smoothed_rtt, latest_rtt) protects from the two following | Using max(smoothed_rtt, latest_rtt) protects from the two following | |||
| cases: | cases: | |||
| o the latest RTT sample is lower than the smoothed RTT, perhaps due | * the latest RTT sample is lower than the smoothed RTT, perhaps due | |||
| to reordering where the acknowledgment encountered a shorter path; | to reordering where the acknowledgment encountered a shorter path; | |||
| o the latest RTT sample is higher than the smoothed RTT, perhaps due | * the latest RTT sample is higher than the smoothed RTT, perhaps due | |||
| to a sustained increase in the actual RTT, but the smoothed RTT | to a sustained increase in the actual RTT, but the smoothed RTT | |||
| has not yet caught up. | has not yet caught up. | |||
| The RECOMMENDED time threshold (kTimeThreshold), expressed as an RTT | The RECOMMENDED time threshold (kTimeThreshold), expressed as an RTT | |||
| multiplier, is 9/8. The RECOMMENDED value of the timer granularity | multiplier, is 9/8. The RECOMMENDED value of the timer granularity | |||
| (kGranularity) is 1 millisecond. | (kGranularity) is 1 millisecond. | |||
| Note: TCP's RACK [RFC8985] specifies a slightly larger threshold, | | Note: TCP's RACK [RFC8985] specifies a slightly larger | |||
| equivalent to 5/4, for a similar purpose. Experience with QUIC | | threshold, equivalent to 5/4, for a similar purpose. | |||
| shows that 9/8 works well. | | Experience with QUIC shows that 9/8 works well. | |||
| Implementations MAY experiment with absolute thresholds, thresholds | Implementations MAY experiment with absolute thresholds, thresholds | |||
| from previous connections, adaptive thresholds, or the including of | from previous connections, adaptive thresholds, or the including of | |||
| RTT variation. Smaller thresholds reduce reordering resilience and | RTT variation. Smaller thresholds reduce reordering resilience and | |||
| increase spurious retransmissions, and larger thresholds increase | increase spurious retransmissions, and larger thresholds increase | |||
| loss detection delay. | loss detection delay. | |||
| 6.2. Probe Timeout | 6.2. Probe Timeout | |||
| A Probe Timeout (PTO) triggers the sending of one or two probe | A Probe Timeout (PTO) triggers the sending of one or two probe | |||
| skipping to change at page 24, line 16 ¶ | skipping to change at line 1097 ¶ | |||
| 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. | |||
| 7.6.2. Establishing Persistent Congestion | 7.6.2. Establishing Persistent Congestion | |||
| A sender establishes persistent congestion after the receipt of an | A sender establishes persistent congestion after the receipt of an | |||
| acknowledgment if two packets that are ack-eliciting are declared | acknowledgment if two packets that are ack-eliciting are declared | |||
| lost, and: | lost, and: | |||
| o across all packet number spaces, none of the packets sent between | * across all packet number spaces, none of the packets sent between | |||
| the send times of these two packets are acknowledged; | the send times of these two packets are acknowledged; | |||
| o the duration between the send times of these two packets exceeds | * the duration between the send times of these two packets exceeds | |||
| the persistent congestion duration (Section 7.6.1); and | the persistent congestion duration (Section 7.6.1); and | |||
| o a prior RTT sample existed when these two packets were sent. | * a prior RTT sample existed when these two packets were sent. | |||
| These two packets MUST be ack-eliciting, since a receiver is required | These two packets MUST be ack-eliciting, since a receiver is required | |||
| to acknowledge only ack-eliciting packets within its maximum | to acknowledge only ack-eliciting packets within its maximum | |||
| acknowledgment delay; see Section 13.2 of [QUIC-TRANSPORT]. | acknowledgment delay; see Section 13.2 of [QUIC-TRANSPORT]. | |||
| The persistent congestion period SHOULD NOT start until there is at | The persistent congestion period SHOULD NOT start until there is at | |||
| least one RTT sample. Before the first RTT sample, a sender arms its | least one RTT sample. Before the first RTT sample, a sender arms its | |||
| PTO timer based on the initial RTT (Section 6.2.2), which could be | PTO timer based on the initial RTT (Section 6.2.2), which could be | |||
| substantially larger than the actual RTT. Requiring a prior RTT | substantially larger than the actual RTT. Requiring a prior RTT | |||
| sample prevents a sender from establishing persistent congestion with | sample prevents a sender from establishing persistent congestion with | |||
| skipping to change at page 25, line 15 ¶ | skipping to change at line 1140 ¶ | |||
| 7.6.3. Example | 7.6.3. Example | |||
| The following example illustrates how a sender might establish | The following example illustrates how a sender might establish | |||
| persistent congestion. Assume: | persistent congestion. Assume: | |||
| smoothed_rtt + max(4*rttvar, kGranularity) + max_ack_delay = 2 | smoothed_rtt + max(4*rttvar, kGranularity) + max_ack_delay = 2 | |||
| kPersistentCongestionThreshold = 3 | kPersistentCongestionThreshold = 3 | |||
| Consider the following sequence of events: | Consider the following sequence of events: | |||
| +--------+-----------------------------------+ | +========+===================================+ | |||
| | Time | Action | | | Time | Action | | |||
| +--------+-----------------------------------+ | +========+===================================+ | |||
| | t=0 | Send packet #1 (application data) | | | t=0 | Send packet #1 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=1 | Send packet #2 (application data) | | | t=1 | Send packet #2 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=1.2 | Receive acknowledgment of #1 | | | t=1.2 | Receive acknowledgment of #1 | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=2 | Send packet #3 (application data) | | | t=2 | Send packet #3 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=3 | Send packet #4 (application data) | | | t=3 | Send packet #4 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=4 | Send packet #5 (application data) | | | t=4 | Send packet #5 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=5 | Send packet #6 (application data) | | | t=5 | Send packet #6 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=6 | Send packet #7 (application data) | | | t=6 | Send packet #7 (application data) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=8 | Send packet #8 (PTO 1) | | | t=8 | Send packet #8 (PTO 1) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=12 | Send packet #9 (PTO 2) | | | t=12 | Send packet #9 (PTO 2) | | |||
| | | | | +--------+-----------------------------------+ | |||
| | t=12.2 | Receive acknowledgment of #9 | | | t=12.2 | Receive acknowledgment of #9 | | |||
| +--------+-----------------------------------+ | +--------+-----------------------------------+ | |||
| Table 1 | ||||
| Packets 2 through 8 are declared lost when the acknowledgment for | Packets 2 through 8 are declared lost when the acknowledgment for | |||
| packet 9 is received at "t = 12.2". | packet 9 is received at "t = 12.2". | |||
| The congestion period is calculated as the time between the oldest | The congestion period is calculated as the time between the oldest | |||
| and newest lost packets: "8 - 1 = 7". The persistent congestion | and newest lost packets: "8 - 1 = 7". The persistent congestion | |||
| duration is "2 * 3 = 6". Because the threshold was reached and | duration is "2 * 3 = 6". Because the threshold was reached and | |||
| because none of the packets between the oldest and the newest lost | because none of the packets between the oldest and the newest lost | |||
| packets were acknowledged, the network is considered to have | packets were acknowledged, the network is considered to have | |||
| experienced persistent congestion. | experienced persistent congestion. | |||
| skipping to change at page 28, line 22 ¶ | skipping to change at line 1295 ¶ | |||
| 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 [RFC8511] or | [RFC3168], but other responses can be specified, such as [RFC8511] or | |||
| [RFC8311]. | [RFC8311]. | |||
| 9. References | 9. References | |||
| 9.1. Normative References | 9.1. Normative References | |||
| [QUIC-TLS] | [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | |||
| Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure | ||||
| QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021, | |||
| <https://www.rfc-editor.org/info/rfc9001>. | <https://www.rfc-editor.org/info/rfc9001>. | |||
| [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", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
| DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://www.rfc-editor.org/info/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| skipping to change at page 29, line 8 ¶ | skipping to change at line 1326 ¶ | |||
| 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>. | |||
| 9.2. Informative References | 9.2. Informative References | |||
| [FACK] Mathis, M. and J. Mahdavi, "Forward acknowledgement: | [FACK] Mathis, M. and J. Mahdavi, "Forward acknowledgement: | |||
| Refining TCP Congestion Control", | Refining TCP Congestion Control", ACM SIGCOMM Computer | |||
| DOI 10.1145/248157.248181, ACM SIGCOMM Computer | Communication Review, DOI 10.1145/248157.248181, August | |||
| Communication Review, August 1996. | 1996, <https://doi.org/10.1145/248157.248181>. | |||
| [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>. | |||
| [RETRANSMISSION] | [RETRANSMISSION] | |||
| Karn, P. and C. Partridge, "Improving Round-Trip Time | Karn, P. and C. Partridge, "Improving Round-Trip Time | |||
| Estimates in Reliable Transport Protocols", | Estimates in Reliable Transport Protocols", ACM | |||
| DOI 10.1145/118544.118549, ACM Transactions on Computer | Transactions on Computer Systems, | |||
| Systems, November 1991. | DOI 10.1145/118544.118549, November 1991, | |||
| <https://doi.org/10.1145/118544.118549>. | ||||
| [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP | |||
| Selective Acknowledgment Options", RFC 2018, | Selective Acknowledgment Options", RFC 2018, | |||
| DOI 10.17487/RFC2018, October 1996, | DOI 10.17487/RFC2018, October 1996, | |||
| <https://www.rfc-editor.org/info/rfc2018>. | <https://www.rfc-editor.org/info/rfc2018>. | |||
| [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>. | |||
| skipping to change at page 44, line 17 ¶ | skipping to change at line 2040 ¶ | |||
| foreach packet in discarded_packets: | foreach packet in discarded_packets: | |||
| if packet.in_flight | if packet.in_flight | |||
| bytes_in_flight -= size | bytes_in_flight -= size | |||
| Contributors | 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: | |||
| o Alessandro Ghedini | * Alessandro Ghedini | |||
| * Benjamin Saunders | ||||
| o Benjamin Saunders | * Gorry Fairhurst | |||
| * 山本和彦 (Kazu Yamamoto) | ||||
| o Gorry Fairhurst | * 奥 一穂 (Kazuho Oku) | |||
| * Lars Eggert | ||||
| o Kazu Yamamoto | * Magnus Westerlund | |||
| * Marten Seemann | ||||
| o Kazuho Oku | * Martin Duke | |||
| * Martin Thomson | ||||
| o Lars Eggert | * Mirja Kühlewind | |||
| * Nick Banks | ||||
| o Magnus Westerlund | * Praveen Balasubramanian | |||
| o Marten Seemann | ||||
| o Martin Duke | ||||
| o Martin Thomson | ||||
| o Mirja Kuehlewind | ||||
| o Nick Banks | ||||
| o Praveen Balasubramanian | ||||
| Authors' Addresses | Authors' Addresses | |||
| Jana Iyengar (editor) | Jana Iyengar (editor) | |||
| Fastly | Fastly | |||
| Email: jri.ietf@gmail.com | Email: jri.ietf@gmail.com | |||
| Ian Swett (editor) | Ian Swett (editor) | |||
| End of changes. 39 change blocks. | ||||
| 141 lines changed or deleted | 133 lines changed or added | |||
This html diff was produced by rfcdiff 1.44jr. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||