| rfc9959v2.txt | rfc9959.txt | |||
|---|---|---|---|---|
| skipping to change at line 13 ¶ | skipping to change at line 13 ¶ | |||
| Request for Comments: 9959 Thales Alenia Space | Request for Comments: 9959 Thales Alenia Space | |||
| Category: Standards Track E. Stephan | Category: Standards Track E. Stephan | |||
| ISSN: 2070-1721 Orange | ISSN: 2070-1721 Orange | |||
| G. Fairhurst | G. Fairhurst | |||
| R. Secchi | R. Secchi | |||
| University of Aberdeen | University of Aberdeen | |||
| C. Huitema | C. Huitema | |||
| Private Octopus Inc. | Private Octopus Inc. | |||
| April 2026 | April 2026 | |||
| Convergence of Congestion Control from Retained State | Careful Resume: Convergence of Congestion Control from Retained State | |||
| Abstract | Abstract | |||
| This document specifies a cautious method for Internet transports | This document specifies a cautious method for Internet transports | |||
| that enables fast startup of congestion control for a wide range of | that enables fast startup of Congestion Control (CC) for a wide range | |||
| connections, known as "Careful Resume". It reuses a set of computed | of connections, known as "Careful Resume". It reuses a set of | |||
| congestion control parameters that are based on previously observed | computed CC parameters that are based on previously observed path | |||
| path characteristics between the same pair of transport endpoints. | characteristics between the same pair of transport endpoints. These | |||
| These parameters are saved, allowing them to be later used to modify | parameters are saved, allowing them to be later used to modify the CC | |||
| the congestion control behaviour of a subsequent connection. | behaviour of a subsequent connection. | |||
| This document describes the assumptions and defines the requirements | This document describes the assumptions and defines the requirements | |||
| for how a sender utilises these parameters to provide opportunities | for how a sender utilises these parameters to provide opportunities | |||
| for a connection to more rapidly get up to speed and utilise | for a connection to more rapidly get up to speed and utilise | |||
| available capacity. It discusses how the use of this method impacts | available capacity. It discusses how the use of this method impacts | |||
| the capacity at a shared network bottleneck and the safe response | the capacity at a shared network bottleneck and the safe response | |||
| that is needed after any indication that the new rate is | that is needed after any indication that the new rate is | |||
| inappropriate. | inappropriate. | |||
| Status of This Memo | Status of This Memo | |||
| skipping to change at line 126 ¶ | skipping to change at line 126 ¶ | |||
| All Internet transports are required to either use a Congestion | All Internet transports are required to either use a Congestion | |||
| Control (CC) algorithm or to constrain their rate of transmission | Control (CC) algorithm or to constrain their rate of transmission | |||
| [RFC2914] [RFC8085]. In 2010, a survey of alternative CC algorithms | [RFC2914] [RFC8085]. In 2010, a survey of alternative CC algorithms | |||
| [RFC5783] noted that there are challenges when a CC algorithm | [RFC5783] noted that there are challenges when a CC algorithm | |||
| operates across an Internet path with a high and/or varying | operates across an Internet path with a high and/or varying | |||
| Bandwidth-Delay Product (BDP). The specified method targets a | Bandwidth-Delay Product (BDP). The specified method targets a | |||
| solution for these challenges. | solution for these challenges. | |||
| A CC algorithm typically takes time to ramp up the sending rate. | A CC algorithm typically takes time to ramp up the sending rate. | |||
| This is called the "Slow-Start Phase" and is informally known as the | This is called the "Slow Start Phase" and is informally known as the | |||
| time to "get up to speed". This defines a time during which a sender | time to "get up to speed". This defines a time during which a sender | |||
| intentionally uses less capacity than might be available, with the | intentionally uses less capacity than might be available, with the | |||
| intention to avoid or limit overshoot of the available capacity for | intention to avoid or limit overshoot of the available capacity for | |||
| the path. In the context of CC, a path is associated with the end- | the path. In the context of CC, a path is associated with the end- | |||
| to-end communication between a pair of transport endpoints, each | to-end communication between a pair of transport endpoints, each | |||
| identified by a source IP address and a unicast or anycast | identified by a source IP address and a unicast or anycast | |||
| destination IP address. (This document does not define support for | destination IP address. (This document does not define support for | |||
| broadcast or multicast destination addresses.) A path can also be | broadcast or multicast destination addresses.) A path can also be | |||
| associated with a specific Differentiated Services Code Point (DSCP). | associated with a specific Differentiated Services Code Point (DSCP). | |||
| Below the transport layer, a specific path could be realised in | Below the transport layer, a specific path could be realised in | |||
| skipping to change at line 160 ¶ | skipping to change at line 160 ¶ | |||
| the capacity at a common bottleneck [RFC2914]). | the capacity at a common bottleneck [RFC2914]). | |||
| A separate instance of a CC algorithm typically executes over a | A separate instance of a CC algorithm typically executes over a | |||
| transport path. This seeks to avoid an increase in the queuing | transport path. This seeks to avoid an increase in the queuing | |||
| (latency or jitter) and/or congestion packet loss for the flow. In | (latency or jitter) and/or congestion packet loss for the flow. In | |||
| the case of a multipath transport, there can be more than one path | the case of a multipath transport, there can be more than one path | |||
| with a separate CC context for each path. | with a separate CC context for each path. | |||
| This document specifies Careful Resume, a method that seeks to reduce | This document specifies Careful Resume, a method that seeks to reduce | |||
| the time to complete a transfer when the sending rate is limited by | the time to complete a transfer when the sending rate is limited by | |||
| the congestion controller using the congestion window (CWND). That | the congestion controller using the congestion window (CWND). | |||
| is, when a transfer seeks to send significantly more data than | Specifically, this is when a transfer seeks to send significantly | |||
| allowed by the initial congestion window (IW) and where the BDP of | more data than allowed by the initial congestion window (IW) and | |||
| the path is also significantly more than the product of the IW and | where the BDP of the path is also significantly more than the product | |||
| path Round Trip Time (RTT). | of the IW and path Round Trip Time (RTT). | |||
| Careful Resume introduces an alternative method to select initial CC | Careful Resume introduces an alternative method to select initial CC | |||
| parameters that seeks to more rapidly and safely grow the sending | parameters that seeks to more rapidly and safely grow the sending | |||
| rate controlled by the CWND. | rate controlled by the CWND. | |||
| Careful Resume is based on temporal sharing (sometimes known as | Careful Resume is based on temporal sharing (sometimes known as | |||
| "caching") of a saved set of CC parameters that relate to previous | "caching") of a saved set of CC parameters that relate to previous | |||
| observations of the same path. The parameters are saved and used to | observations of the same path. The parameters are saved and used to | |||
| modify the CC behaviour of a subsequent connection between the same | modify the CC behaviour of a subsequent connection between the same | |||
| endpoints. | endpoints. | |||
| skipping to change at line 213 ¶ | skipping to change at line 213 ¶ | |||
| 1.2. Receiver Preference | 1.2. Receiver Preference | |||
| Whilst the sender could take optimisation decisions without | Whilst the sender could take optimisation decisions without | |||
| considering the receiver's preference, there are cases where a | considering the receiver's preference, there are cases where a | |||
| receiver could have information that is not available at the sender | receiver could have information that is not available at the sender | |||
| or might benefit from understanding that Careful Resume might be | or might benefit from understanding that Careful Resume might be | |||
| used. In these cases, a receiver could use a transport mechanism to | used. In these cases, a receiver could use a transport mechanism to | |||
| explicitly ask to either enable or inhibit Careful Resume when an | explicitly ask to either enable or inhibit Careful Resume when an | |||
| application initiates a new connection. | application initiates a new connection. | |||
| Examples where a receiver might request to inhibit using Careful | Receivers might request the ability to inhibit the use of Careful | |||
| Resume include: | Resume in some situations, for example: | |||
| 1. a receiver that can predict the pattern of traffic (e.g., insight | 1. when a receiver can predict the pattern of traffic (e.g., insight | |||
| into the volume of data to be sent, the expected length of a | into the volume of data to be sent, the expected length of a | |||
| connection, or the requested maximum transfer rate); | connection, or the requested maximum transfer rate); | |||
| 2. a receiver with a local indication that a path/local interface | 2. when a receiver with a local indication that a path/local | |||
| has changed since the CC parameters were saved; | interface has changed since the CC parameters were saved; | |||
| 3. knowledge of the current hardware limitations at a receiver; | 3. when a receiver has knowledge of the current hardware | |||
| limitations; | ||||
| 4. a receiver that can predict additional capacity will be needed | 4. when a receiver can predict additional capacity will be needed | |||
| for other concurrent or later flows (i.e., it prefers to activate | for other concurrent or later flows (i.e., it prefers to activate | |||
| Careful Resume for a different connection). | Careful Resume for a different connection). | |||
| 1.3. Transport Protocol Interaction | 1.3. Transport Protocol Interaction | |||
| The CWND is one factor that limits the sending rate of a transport | The CWND is one factor that limits the sending rate of a transport | |||
| protocol. Other mechanisms also constrain the maximum sending rate. | protocol. Other mechanisms also constrain the maximum sending rate. | |||
| These include the sender pacing rate and the receiver-advertised | These include the sender pacing rate and the receiver-advertised | |||
| window [RFC9293] or flow credit [RFC9000]; see Section 4.7. | window [RFC9293] or flow control credit [RFC9000]; see Section 4.7. | |||
| 1.4. Examples of Scenarios of Interest | 1.4. Examples of Scenarios of Interest | |||
| This section provides a set of examples where Careful Resume is | This section provides a set of examples where Careful Resume is | |||
| expected to improve performance. Either endpoint can assume the role | expected to improve performance. Either endpoint can assume the role | |||
| of a sender or a receiver. Careful Resume can also be independently | of a sender or a receiver. Careful Resume can also be independently | |||
| used for each direction of a bidirectional connection. | used for each direction of a bidirectional connection. | |||
| For example, consider an application that uses a series of | For example, consider an application that uses a series of | |||
| connections over a path: Without a new method, each connection would | connections over a path: Without a new method, each connection would | |||
| skipping to change at line 290 ¶ | skipping to change at line 291 ¶ | |||
| changed so much that the saved values are no longer valid. We | changed so much that the saved values are no longer valid. We | |||
| describe that as the "Reconnaissance Phase". During that phase, | describe that as the "Reconnaissance Phase". During that phase, | |||
| the sender will not send more data than allowed for any new | the sender will not send more data than allowed for any new | |||
| connection, e.g., using the recommended maximum IW for the first | connection, e.g., using the recommended maximum IW for the first | |||
| RTT of transmitting data [RFC6928] [RFC9002]. The sender will | RTT of transmitting data [RFC6928] [RFC9002]. The sender will | |||
| only proceed with the resume process if the reconnaissance | only proceed with the resume process if the reconnaissance | |||
| succeeds. If it fails (for example, if previous packets in a | succeeds. If it fails (for example, if previous packets in a | |||
| connection experience congestion or the RTT is significantly | connection experience congestion or the RTT is significantly | |||
| different), the sender will follow the standard process for a new | different), the sender will follow the standard process for a new | |||
| connection. This provides some protection against aggravating | connection. This provides some protection against aggravating | |||
| severe congestion and to establish the minimum RTT. | severe congestion and allows establishing the minimum RTT. | |||
| 2. The second precaution is to cautiously use the saved parameters | 2. The second precaution is to cautiously use the saved parameters | |||
| when resuming. This is called the "Unvalidated Phase". For | when resuming. This is called the "Unvalidated Phase". For | |||
| example, the jump in the size of CWND/rate is restricted to a | example, the jump in the size of CWND/rate is restricted to a | |||
| fraction (1/2) of the saved_cwnd, to avoid starving other flows | fraction (1/2) of the saved_cwnd, to avoid starving other flows | |||
| that may have started or increased their capacity after the last | that may have started or increased their capacity after the last | |||
| capacity measurement. The same principle applies for CC | capacity measurement. The same principle applies for CC | |||
| algorithms that use different parameters to classic TCP CC: i.e., | algorithms that use different parameters to classic TCP CC: i.e., | |||
| a sender must not send faster than allowed by a fraction of the | a sender must not send faster than allowed by a fraction of the | |||
| saved CC parameters. For example, a connection using a rate- | saved CC parameters. For example, a connection using a rate- | |||
| skipping to change at line 314 ¶ | skipping to change at line 315 ¶ | |||
| does not exceed the previously used rate. This is intended to | does not exceed the previously used rate. This is intended to | |||
| avoid a sudden influx of packets that could result in building a | avoid a sudden influx of packets that could result in building a | |||
| bottleneck queue and disrupting existing flows. Successful | bottleneck queue and disrupting existing flows. Successful | |||
| validation can allow further increases of the CWND, after first | validation can allow further increases of the CWND, after first | |||
| validating that the used rate did not result in congestion. | validating that the used rate did not result in congestion. | |||
| 3. The third precaution is to enter a "Safe Retreat Phase" if the | 3. The third precaution is to enter a "Safe Retreat Phase" if the | |||
| validation fails, for example, if congestion is detected during | validation fails, for example, if congestion is detected during | |||
| validation. The risk here is that the trial use of the saved CC | validation. The risk here is that the trial use of the saved CC | |||
| parameters could have disrupted existing connections. For | parameters could have disrupted existing connections. For | |||
| example, consider a connection using Reno CC: When exiting "slow | example, consider a connection using Reno CC: When exiting "Slow | |||
| start" mode due to loss, Reno would normally update the CWND to a | Start" mode due to loss, Reno would normally update the CWND to a | |||
| "slow start threshold" set to half the volume of data in flight. | "Slow Start threshold" set to half the volume of data in flight. | |||
| However, during this validation, the CWND is restored from the | However, during this validation, the CWND is restored from the | |||
| saved CC parameters. The resultant sending rate could be much | saved CC parameters. The resultant sending rate could be much | |||
| larger than the value that would have been reached by a | larger than the value that would have been reached by a | |||
| "standard" slow start process, resulting in an overload of the | "standard" Slow Start process, resulting in an overload of the | |||
| path that potentially could cause significant congestion to other | path that potentially could cause significant congestion to other | |||
| flows. Instead of continuing with that "too large" value, the | flows. Instead of continuing with that "too large" value, the | |||
| retreat process resets the congestion window (rate) to a value no | retreat process resets the congestion window (rate) to a value no | |||
| greater than what a standard process would have discovered. For | greater than what a standard process would have discovered. For | |||
| other CC algorithms, such as Cubic [RFC9438] or BBR, the | other CC algorithms, such as CUBIC [RFC9438] or BBR, the | |||
| implementation details may differ, but the principle remains: | implementation details may differ, but the principle remains: | |||
| Trying and failing should not unduly disadvantage existing | Trying and failing should not unduly disadvantage existing | |||
| connections that share a common bottleneck (e.g., resulting in | connections that share a common bottleneck (e.g., resulting in | |||
| starving these connections). | starving these connections). | |||
| 2. Language, Notation, and Terms | 2. Language, Notation, and Terms | |||
| This section provides a brief summary of key terms and the | This section provides a brief summary of key terms and the | |||
| requirements language. | requirements language. | |||
| skipping to change at line 370 ¶ | skipping to change at line 371 ¶ | |||
| information could improve the path differentiation, it could reduce | information could improve the path differentiation, it could reduce | |||
| the reusability of saved parameters. | the reusability of saved parameters. | |||
| The saved CC parameters can only be used to modify the startup when | The saved CC parameters can only be used to modify the startup when | |||
| the Remote Endpoint is not known to have changed (see Section 3.2). | the Remote Endpoint is not known to have changed (see Section 3.2). | |||
| 2.3. Logging Support | 2.3. Logging Support | |||
| This document defines triggers to support logging key events. For | This document defines triggers to support logging key events. For | |||
| example, [LOG] provides definitions that enable a Careful Resume | example, [LOG] provides definitions that enable a Careful Resume | |||
| implementation to generate qlog events when using QUIC. | implementation to generate QLOG events when using QUIC. | |||
| 2.4. Notation and Terms | 2.4. Notation and Terms | |||
| The document uses language drawn from a range of RFCs. The following | The document uses language drawn from a range of RFCs. The following | |||
| terms are defined: | terms are defined: | |||
| ACK: The indication at the transport layer that the Remote Endpoint | ACK: The indication at the transport layer that the Remote Endpoint | |||
| has correctly received the acknowledged data. In a CC algorithm, | has correctly received the acknowledged data. In a CC algorithm, | |||
| an ACK also confirms that the acknowledged data is no longer in | an ACK also confirms that the acknowledged data is no longer in | |||
| flight. | flight. | |||
| Beta: A scaling factor between 0.5 and 1; the default value is 0.5. | Beta: A scaling factor between 0.5 and 1; the default value is 0.5. | |||
| Careful Resume (CR): The method specified in this document to select | Careful Resume: The method specified in this document to select | |||
| initial CC parameters and to more rapidly and safely increase the | initial CC parameters and to more rapidly and safely increase the | |||
| initial sending rate. | initial sending rate. | |||
| Congestion Control (CC) parameters: A set of saved CC parameters | Congestion Control (CC) parameters: A set of saved CC parameters | |||
| from observing the capacity of an established connection (see | from observing the capacity of an established connection (see | |||
| Section 1.1). | Section 1.1). | |||
| congestion window (CWND): The congestion window or equivalent CC | congestion window (CWND): The congestion window or equivalent CC | |||
| variable limiting the maximum sending rate (see [RFC5681]). | variable limiting the maximum sending rate (see [RFC5681]). | |||
| skipping to change at line 470 ¶ | skipping to change at line 471 ¶ | |||
| * Observing (saved_cwnd): The currently utilised capacity for the | * Observing (saved_cwnd): The currently utilised capacity for the | |||
| connection is measured as the volume of bytes sent during an RTT | connection is measured as the volume of bytes sent during an RTT | |||
| and is recorded in the saved_cwnd. This could be computed by | and is recorded in the saved_cwnd. This could be computed by | |||
| measuring the volume of data acknowledged in one RTT. If the | measuring the volume of data acknowledged in one RTT. If the | |||
| measured CWND is less than four times the IW, the sender can | measured CWND is less than four times the IW, the sender can | |||
| choose to not save the CC parameters, because the additional | choose to not save the CC parameters, because the additional | |||
| actions associated with performing Careful Resume for a small CWND | actions associated with performing Careful Resume for a small CWND | |||
| would not justify its use. | would not justify its use. | |||
| * Observing (saved_rtt): The minimum RTT at the time of observation | * Observing (saved_rtt): The minimum RTT at the time of observation | |||
| is saved as the saved_rrt. | is saved as the saved_rtt. | |||
| * Observing (updating saved CC parameters): A sender MUST NOT retain | * Observing (updating saved CC parameters): A sender MUST NOT retain | |||
| more than one set of CC parameters for a Remote Endpoint, but the | more than one set of CC parameters for a Remote Endpoint, but the | |||
| set of CC parameters SHOULD be updated (or replaced) after a later | set of CC parameters SHOULD be updated (or replaced) after a later | |||
| observation of a path to the same Remote Endpoint. | observation of a path to the same Remote Endpoint. | |||
| Implementation notes are provided in Section 4.1. | Implementation notes are provided in Section 4.1. | |||
| 3.2. Reconnaissance Phase | 3.2. Reconnaissance Phase | |||
| skipping to change at line 495 ¶ | skipping to change at line 496 ¶ | |||
| The sender enters the Reconnaissance Phase after connection setup | The sender enters the Reconnaissance Phase after connection setup | |||
| (using normal CC). In this phase, the CWND is initialised to the IW, | (using normal CC). In this phase, the CWND is initialised to the IW, | |||
| and the sender transmits any initial data. | and the sender transmits any initial data. | |||
| In the Reconnaissance Phase, the sender performs the following | In the Reconnaissance Phase, the sender performs the following | |||
| action: | action: | |||
| * Reconnaissance Phase (received acknowledgment): The CWND is | * Reconnaissance Phase (received acknowledgment): The CWND is | |||
| increased using normal CC as each ACK confirms delivery of | increased using normal CC as each ACK confirms delivery of | |||
| previously unacknowledged data (i.e., the base congestion control | previously unacknowledged data (i.e., the base CC algorithm | |||
| algorithm continues to operate normally). | continues to operate normally). | |||
| The sender exits the Reconnaissance Phase and stops using Careful | The sender exits the Reconnaissance Phase and stops using Careful | |||
| Resume when one of the following events occurs: | Resume when one of the following events occurs: | |||
| * Reconnaissance Phase (detected congestion): If the sender detects | * Reconnaissance Phase (detected congestion): If the sender detects | |||
| congestion (e.g., packet loss or ECN-CE marking), this indicates | congestion (e.g., packet loss or ECN-CE marking), this indicates | |||
| that use of the saved CC parameters is inappropriate. The sender | that use of the saved CC parameters is inappropriate. The sender | |||
| stops using Careful Resume and MUST continue using normal CC to | stops using Careful Resume and MUST continue using normal CC to | |||
| react to the detected congestion. | react to the detected congestion. | |||
| skipping to change at line 520 ¶ | skipping to change at line 521 ¶ | |||
| Careful Resume and return to use normal CC. | Careful Resume and return to use normal CC. | |||
| * Reconnaissance Phase (path change): If the Remote Endpoint is not | * Reconnaissance Phase (path change): If the Remote Endpoint is not | |||
| the same as any saved_remote_endpoint, or the sender receives a | the same as any saved_remote_endpoint, or the sender receives a | |||
| signal from the local stack indicating that the path is now | signal from the local stack indicating that the path is now | |||
| different to the observed path, the sender MUST stop using Careful | different to the observed path, the sender MUST stop using Careful | |||
| Resume and returns to use normal CC. | Resume and returns to use normal CC. | |||
| * Reconnaissance Phase (lifetime of saved CC parameters): The CC | * Reconnaissance Phase (lifetime of saved CC parameters): The CC | |||
| parameters are temporal. If the Lifetime of the observed CC | parameters are temporal. If the Lifetime of the observed CC | |||
| parameters is exceeded, this set of CC parameters is not used; the | parameters is exceeded, this set of CC parameters is not used. | |||
| saved CC parameters are deleted and MUST stop using Careful Resume | The saved CC parameters are deleted, and the sender MUST stop | |||
| and returns to use normal CC. | using Careful Resume and return to using normal CC. | |||
| * Reconnaissance Phase (minimum RTT too small): If the minimum RTT | * Reconnaissance Phase (minimum RTT too small): If the minimum RTT | |||
| recorded in the Reconnaissance Phase is less than or equal to | recorded in the Reconnaissance Phase is less than or equal to | |||
| (saved_rtt / 2) (see Section 4.2.1), the sender MUST stop using | (saved_rtt / 2) (see Section 4.2.1), the sender MUST stop using | |||
| Careful Resume (e.g., logged as rtt_not_validated in [LOG]) and | Careful Resume (e.g., logged as rtt_not_validated in [LOG]) and | |||
| returns to use normal CC. This is because the calculation of a | returns to use normal CC. This is because the calculation of a | |||
| sending rate from a saved_cwnd is directly impacted by the RTT; | sending rate from a saved_cwnd is directly impacted by the RTT; | |||
| therefore, a significant change in the RTT is a strong indication | therefore, a significant change in the RTT is a strong indication | |||
| that the previously observed CC parameters are not valid for the | that the previously observed CC parameters are not valid for the | |||
| current path. | current path. | |||
| skipping to change at line 620 ¶ | skipping to change at line 621 ¶ | |||
| packet): The sender enters the Validating Phase when an ACK is | packet): The sender enters the Validating Phase when an ACK is | |||
| received that acknowledges the first packet number (or higher) | received that acknowledges the first packet number (or higher) | |||
| that was sent in the Unvalidated Phase (e.g., logged as | that was sent in the Unvalidated Phase (e.g., logged as | |||
| first_unvalidated_packet_acknowledged in [LOG]). | first_unvalidated_packet_acknowledged in [LOG]). | |||
| * Unvalidated Phase (limiting time in the Unvalidated Phase): The | * Unvalidated Phase (limiting time in the Unvalidated Phase): The | |||
| sender enters the Validating Phase if more than one RTT has | sender enters the Validating Phase if more than one RTT has | |||
| elapsed while in the Unvalidated Phase (e.g., logged as | elapsed while in the Unvalidated Phase (e.g., logged as | |||
| rtt_exceeded in [LOG]). | rtt_exceeded in [LOG]). | |||
| Unvalidated Phase (check flight_size): Upon any of these events (and | Unvalidated Phase (check flight_size): Upon any of these events, and | |||
| after processing any Acknowledgments that update the PipeSize and | after processing any Acknowledgments that update the PipeSize and | |||
| flight_size), the sender checks if (flight_size is less than the IW) | flight_size, the sender checks if the flight_size is less than the IW | |||
| or (flight_size is less than or equal to the PipeSize) then the CWND | or if the flight_size is less than or equal to the PipeSize, and if | |||
| is reset to the PipeSize (e.g., logged as rate_limited in [LOG]) and | true, resets the CWND to the PipeSize (e.g., logged as rate_limited | |||
| the sender stops using Careful Resume and returns to use normal CC. | in [LOG]) and stops using Careful Resume and returns to use normal | |||
| In the absence of detected congestion, the CWND is not reduced below | CC. In the absence of detected congestion, the CWND is not reduced | |||
| the IW. (The PipeSize does not include the part of the jump_cwnd | below the IW. (The PipeSize does not include the part of the | |||
| that was not utilised.) Otherwise, the CWND MUST be set to the | jump_cwnd that was not utilised.) Otherwise, the CWND MUST be set to | |||
| flight_size and the sender progresses to the Validating Phase. | the flight_size and the sender progresses to the Validating Phase. | |||
| Implementation notes are provided in Section 4.3. | Implementation notes are provided in Section 4.3. | |||
| Notes for BBR are provided in Appendix C.1. | Notes for BBR are provided in Appendix C.1. | |||
| 3.4. Validating Phase | 3.4. Validating Phase | |||
| The Validating Phase checks whether all packets sent in the | The Validating Phase checks whether all packets sent in the | |||
| Unvalidated Phase were received without inducing congestion. The | Unvalidated Phase were received without inducing congestion. The | |||
| CWND remains unvalidated and the sender typically remains in this | CWND remains unvalidated and the sender typically remains in this | |||
| phase for one RTT. | phase for one RTT. | |||
| In the Validating Phase, the sender performs the following actions: | In the Validating Phase, the sender performs the following actions: | |||
| * Validating Phase (tracking PipeSize): The PipeSize is increased by | * Validating Phase (tracking PipeSize): The PipeSize is increased by | |||
| the volume of acknowledged data for each received ACK that | the volume of acknowledged data for each received ACK that | |||
| indicates a packet was successfully sent over the path. | indicates a packet was successfully sent over the path. | |||
| * Validating Phase (updating the CWND): The CWND is updated using | * Validating Phase (updating the CWND): The CWND is updated using | |||
| the normal rules for the current congestion controller. This | the normal rules for the current congestion controller. This | |||
| typically will use "slow start", which allows the CWND to be | typically will use "Slow Start", which allows the CWND to be | |||
| increased for each received ACK that indicates a packet has been | increased for each received ACK that indicates a packet has been | |||
| successfully sent across the path. | successfully sent across the path. | |||
| The sender exits the Validating Phase when one of the following | The sender exits the Validating Phase when one of the following | |||
| events occurs: | events occurs: | |||
| * Validating Phase (detected congestion): If the sender determines | * Validating Phase (detected congestion): If the sender determines | |||
| that congestion was detected (e.g., packet loss or ECN-CE | that congestion was detected (e.g., packet loss or ECN-CE | |||
| marking), Careful Resume enters the Safe Retreat Phase (e.g., | marking), Careful Resume enters the Safe Retreat Phase (e.g., | |||
| logged as either packet_loss or ECN_CE in [LOG]). | logged as either packet_loss or ECN_CE in [LOG]). | |||
| skipping to change at line 720 ¶ | skipping to change at line 721 ¶ | |||
| * Safe Retreat Phase (acknowledgment of unvalidated packets): When | * Safe Retreat Phase (acknowledgment of unvalidated packets): When | |||
| the last packet (or a later packet) sent during the Unvalidated | the last packet (or a later packet) sent during the Unvalidated | |||
| Phase has been acknowledged, the sender stops using Careful Resume | Phase has been acknowledged, the sender stops using Careful Resume | |||
| and returns to use normal CC. | and returns to use normal CC. | |||
| On leaving the Safe Retreat Phase, the ssthresh MUST be set to no | On leaving the Safe Retreat Phase, the ssthresh MUST be set to no | |||
| larger than the most recently measured PipeSize * Beta, where Beta is | larger than the most recently measured PipeSize * Beta, where Beta is | |||
| a scaling factor between 0.5 and 1. The default value is 0.5, chosen | a scaling factor between 0.5 and 1. The default value is 0.5, chosen | |||
| to reduce the probability of inducing a second round of congestion. | to reduce the probability of inducing a second round of congestion. | |||
| Cubic defines a Beta__cubic of 0.7 [RFC9438] (e.g., logged as | CUBIC defines a Beta__cubic of 0.7 [RFC9438] (e.g., logged as | |||
| exit_recovery in [LOG]). | exit_recovery in [LOG]). | |||
| Implementation notes are provided in Section 4.5. | Implementation notes are provided in Section 4.5. | |||
| Notes for BBR are described in Appendix C.3. | Notes for BBR are described in Appendix C.3. | |||
| 3.6. Detecting Persistent Congestion While Using Careful Resume | 3.6. Detecting Persistent Congestion While Using Careful Resume | |||
| A sender that experiences persistent congestion (e.g., a | A sender that experiences persistent congestion (e.g., a | |||
| Retransmission Time Out (RTO) or expiry in TCP) ceases to use Careful | Retransmission Time Out (RTO) or expiry in TCP) ceases to use Careful | |||
| skipping to change at line 743 ¶ | skipping to change at line 744 ¶ | |||
| cause it to enter the Drain state while the "carefully-resuming" flag | cause it to enter the Drain state while the "carefully-resuming" flag | |||
| is set to True; see Appendix C.3. | is set to True; see Appendix C.3. | |||
| As in loss recovery, data sent in the Unvalidated Phase could be | As in loss recovery, data sent in the Unvalidated Phase could be | |||
| later acknowledged after an RTO event. | later acknowledged after an RTO event. | |||
| 3.7. Returning to Use Normal CC | 3.7. Returning to Use Normal CC | |||
| After exiting Careful Resume, the sender returns to using the normal | After exiting Careful Resume, the sender returns to using the normal | |||
| CC algorithm (e.g., in congestion avoidance when the CWND is more | CC algorithm (e.g., in congestion avoidance when the CWND is more | |||
| than ssthresh, or slow start when less than or equal to ssthresh). | than ssthresh, or Slow Start when less than or equal to ssthresh). | |||
| Implementation notes are provided in Section 4.6. | Implementation notes are provided in Section 4.6. | |||
| 4. Implementation Notes and Guidelines | 4. Implementation Notes and Guidelines | |||
| This section provides guidance for implementation and use. | This section provides guidance for implementation and use. | |||
| 4.1. Observing the Path Capacity | 4.1. Observing the Path Capacity | |||
| There are various approaches to measuring the capacity used by a | There are various approaches to measuring the capacity used by a | |||
| connection. Congestion controllers, such as such as Reno [RFC5681] | connection. Congestion controllers, such as Reno [RFC5681] or CUBIC | |||
| or Cubic [RFC9438], could estimate the capacity based on the CWND, | [RFC9438], could estimate the capacity based on the CWND, | |||
| flight_size, acknowledged rate, etc. A different approach could | flight_size, acknowledged rate, etc. A different approach could | |||
| estimate the same parameters for a rate-based congestion controller, | estimate the same parameters for a rate-based congestion controller, | |||
| such as BBR [BBR-CC], or by observing the rate at which data is | such as BBR [BBR-CC], or by observing the rate at which data is | |||
| acknowledged by the Remote Endpoint. | acknowledged by the Remote Endpoint. | |||
| Implementations are required to calculate a saved_rtt, measuring the | Implementations are required to calculate a saved_rtt, measuring the | |||
| minimum RTT while observing the capacity. For example, this could be | minimum RTT while observing the capacity. For example, this could be | |||
| the minimum of a set RTT of measurements measured over the previous 5 | the minimum of a set RTT of measurements measured over the previous 5 | |||
| minutes. | minutes. | |||
| * There are cases where the current CWND does not reflect the path | * There are cases where the current CWND does not reflect the path | |||
| capacity. At the end of slow start, the CWND can be significantly | capacity. At the end of Slow Start, the CWND can be significantly | |||
| larger than needed to fully utilise the path (i.e., a CWND | larger than needed to fully utilise the path (i.e., a CWND | |||
| overshoot). It is inappropriate to use an overshoot in the CWND | overshoot). It is inappropriate to use an overshoot in the CWND | |||
| as a basis for estimating the capacity. In most cases, the CWND | as a basis for estimating the capacity. In most cases, the CWND | |||
| will converge to a stable value after several more RTTs. One | will converge to a stable value after several more RTTs. One | |||
| mitigation when a connection is in Slow Start could be to set the | mitigation when a connection is in Slow Start could be to set the | |||
| saved_cwnd based on the validated pipe size (i.e., CWND / 2). | saved_cwnd based on the validated pipe size (i.e., CWND / 2). | |||
| * When the sender is rate limited or in the RTT following a burst of | * When the sender is rate limited or in the RTT following a burst of | |||
| transmission, a sender typically transmits less data than allowed | transmission, a sender typically transmits less data than allowed | |||
| by the CWND. Such observations could be discounted when | by the CWND. Such observations could be discounted when | |||
| skipping to change at line 819 ¶ | skipping to change at line 820 ¶ | |||
| A sender that is rate limited [RFC7661] sends insufficient data to be | A sender that is rate limited [RFC7661] sends insufficient data to be | |||
| able to validate transmission at a higher rate. Such a sender is | able to validate transmission at a higher rate. Such a sender is | |||
| allowed to remain in the Reconnaissance Phase and to not transition | allowed to remain in the Reconnaissance Phase and to not transition | |||
| to the Unvalidated Phase until there is more data in the transmission | to the Unvalidated Phase until there is more data in the transmission | |||
| buffer than would normally be permitted by the CC algorithm. | buffer than would normally be permitted by the CC algorithm. | |||
| 4.2.1. Confirming the Path | 4.2.1. Confirming the Path | |||
| Path characteristics can change over time for many reasons. This can | Path characteristics can change over time for many reasons. This can | |||
| result in the previously observed CC parameters becoming irrelevant. | result in the previously observed CC parameters becoming irrelevant. | |||
| To help confirm the path, the sender compares the saved_rrt with each | To help confirm the path, the sender compares the saved_rtt with each | |||
| current RTT sample. | current RTT sample. | |||
| If the current RTT sample is less than a half of the saved_rrt, this | If the current RTT sample is less than a half of the saved_rtt, this | |||
| is regarded as too small. This is an indicator of a path change. | is regarded as too small. This is an indicator of a path change. | |||
| This factor of two arises because the jump_cwnd is calculated as half | This factor of two arises because the jump_cwnd is calculated as half | |||
| the measured saved_cwnd and the sending rate ought not to exceed the | the measured saved_cwnd and the sending rate ought not to exceed the | |||
| observed rate when the saved_cwnd was measured. | observed rate when the saved_cwnd was measured. | |||
| If the current RTT is larger than the saved_rtt, this would result in | If the current RTT is larger than the saved_rtt, this would result in | |||
| a proportionally lower rate for the unvalidated packets, because the | a proportionally lower rate for the unvalidated packets, because the | |||
| transmission is paced based on the current RTT. Hence, this rate is | transmission is paced based on the current RTT. Hence, this rate is | |||
| still safe. If the current RTT has been incorrectly measured as | still safe. If the current RTT has been incorrectly measured as | |||
| larger than the actual path RTT, the sender will receive an ACK for | larger than the actual path RTT, the sender will receive an ACK for | |||
| an unvalidated packet before it has completed the Unvalidated Phase. | an unvalidated packet before it has completed the Unvalidated Phase. | |||
| This ACK resets the CWND to reflect the flight_size, and the sender | This ACK resets the CWND to reflect the flight_size, and the sender | |||
| then enters the Validating Phase. The flight_size reflects the | then enters the Validating Phase. The flight_size reflects the | |||
| amount of outstanding data in the network rather than the maximum | amount of outstanding data in the network rather than the maximum | |||
| that is permitted by the CWND. | that is permitted by the CWND. | |||
| A current RTT that is more than ten times the saved_rrt is indicative | A current RTT that is more than ten times the saved_rtt is indicative | |||
| of a path change. The value of ten accommodates both increases in | of a path change. The value of ten accommodates both increases in | |||
| latency from buffering on a path and any variation between RTT | latency from buffering on a path and any variation between RTT | |||
| samples. | samples. | |||
| Note 1: In the Reconnaissance Phase, the sender calculates a minimum | Note 1: In the Reconnaissance Phase, the sender calculates a minimum | |||
| RTT over the phase and checks this on entry to the Unvalidated Phase. | RTT over the phase and checks this on entry to the Unvalidated Phase. | |||
| This avoids a need to check after each current RTT sample. | This avoids a need to check after each current RTT sample. | |||
| Note 2: During the Unvalidated Phase, the minimum RTT cannot | Note 2: During the Unvalidated Phase, the minimum RTT cannot | |||
| increase, and hence the minimum RTT can never be larger than | increase, and hence the minimum RTT can never be larger than | |||
| (saved_rtt x 10) during the Unvalidated Phase. | (saved_rtt x 10) during the Unvalidated Phase. | |||
| The sender also verifies that the initial data was acknowledged. Any | The sender also verifies that the initial data was acknowledged. Any | |||
| loss could be indicative of persistent congestion. If a sender in | loss could be indicative of persistent congestion. If a sender in | |||
| the Reconnaissance Phase detects congestion, it stops using Careful | the Reconnaissance Phase detects congestion, it stops using Careful | |||
| Resume and returns to using normal CC. Some transport protocols | Resume and returns to using normal CC. Some transport protocols | |||
| implement CC mechanisms that infer potential congestion from an | implement CC mechanisms that infer potential congestion from an | |||
| increase in the current RTT. Designs need to consider if such an | increase in the current RTT. Designs need to consider whether such | |||
| indication is a suitable trigger to revert to stop using Careful | an indication is a suitable trigger to stop using Careful Resume and | |||
| Resume. | revert to using normal CC. | |||
| 4.3. Safety in the Unvalidated Phase | 4.3. Safety in the Unvalidated Phase | |||
| This section considers the safety for using saved CC parameters to | This section considers the safety for using saved CC parameters to | |||
| tentatively update the CWND. This seeks to avoid starving other | tentatively update the CWND. This seeks to avoid starving other | |||
| flows that could have either started or increased their use of | flows that could have either started or increased their use of | |||
| capacity since observing the capacity of a path. | capacity since observing the capacity of a path. | |||
| To avoid inducing significant congestion to any connections that have | To avoid inducing significant congestion to any connections that have | |||
| started to use a shared bottleneck, a sender must not directly use | started to use a shared bottleneck, a sender must not directly use | |||
| skipping to change at line 903 ¶ | skipping to change at line 904 ¶ | |||
| period. However, [RFC7661] targets rate-limited connections using | period. However, [RFC7661] targets rate-limited connections using | |||
| normal CC. Careful Resume includes additional mechanisms to avoid | normal CC. Careful Resume includes additional mechanisms to avoid | |||
| and mitigate the effects of overshoot, and therefore a longer period | and mitigate the effects of overshoot, and therefore a longer period | |||
| can be justified when using a saved_cwnd with Careful Resume. | can be justified when using a saved_cwnd with Careful Resume. | |||
| When the path characteristics are known to be dynamic, or the path | When the path characteristics are known to be dynamic, or the path | |||
| varies, a small Lifetime is desirable (e.g., measured in minutes). | varies, a small Lifetime is desirable (e.g., measured in minutes). | |||
| For stable paths, and where the sender does not expect the path to be | For stable paths, and where the sender does not expect the path to be | |||
| shared by many senders, a longer Lifetime (e.g., measured in hours) | shared by many senders, a longer Lifetime (e.g., measured in hours) | |||
| could be used. A bottleneck that is shared by a large number of | could be used. A bottleneck that is shared by a large number of | |||
| senders brings greater risk that CR connections could contribute | senders brings greater risk that Careful Resume connections could | |||
| congestion that leads to prolonged overload with starvation. This | contribute congestion that leads to prolonged overload with | |||
| can be mitigated by setting a small Lifetime. | starvation. This can be mitigated by setting a small Lifetime. | |||
| 4.3.2. Pacing in the Unvalidated Phase | 4.3.2. Pacing in the Unvalidated Phase | |||
| A sender needs to avoid any step increase in the CWND resulting in a | A sender needs to avoid any step increase in the CWND resulting in a | |||
| burst of packets that is greater than the size of the CC algorithm's | burst of packets that is greater than the size of the CC algorithm's | |||
| IW. This is consistent with [RFC8085] and [RFC9000]. | IW. This is consistent with [RFC8085] and [RFC9000]. | |||
| Pacing packets as a function of the current RTT, rather than the | Pacing packets as a function of the current RTT, rather than the | |||
| saved_rrt, provides additional safety during the Unvalidated Phase, | saved_rtt, provides additional safety during the Unvalidated Phase, | |||
| because it avoids a smaller saved_rrt inflating the sending rate. | because it avoids a smaller saved_rtt inflating the sending rate. | |||
| The lower bound to the minimum acceptable current RTT avoids sending | The lower bound to the minimum acceptable current RTT avoids sending | |||
| unvalidated packets at a rate that would be higher than was | unvalidated packets at a rate that would be higher than was | |||
| previously observed. | previously observed. | |||
| The following example provides a relevant pacing rhythm: An Inter- | The following example provides a relevant pacing rhythm: An Inter- | |||
| packet Transmission Time (ITT) is determined by using the current | packet Transmission Time (ITT) is determined by using the current | |||
| Maximum Packet Size (MPS), including headers, the saved_cwnd, and the | Maximum Packet Size (MPS), including headers, the saved_cwnd, and the | |||
| current RTT. A safety margin can be configured to avoid sending more | current RTT. A safety margin can be configured to avoid sending more | |||
| than a maximum (max_jump): | than a maximum (max_jump): | |||
| skipping to change at line 986 ¶ | skipping to change at line 987 ¶ | |||
| for unvalidated packets. | for unvalidated packets. | |||
| The Safe Retreat Phase sets a safe CWND value to drain any | The Safe Retreat Phase sets a safe CWND value to drain any | |||
| unvalidated packets from the path after a packet loss has been | unvalidated packets from the path after a packet loss has been | |||
| detected or when ACKs that indicate the sent packets were marked as | detected or when ACKs that indicate the sent packets were marked as | |||
| ECN-CE. The CC parameters that were used are invalid and are | ECN-CE. The CC parameters that were used are invalid and are | |||
| removed. | removed. | |||
| The Safe Retreat reaction differs from a traditional reaction to | The Safe Retreat reaction differs from a traditional reaction to | |||
| detected congestion, because a jump_cwnd can result in a | detected congestion, because a jump_cwnd can result in a | |||
| significantly higher rate than would be allowed by Slow-Start. Such | significantly higher rate than would be allowed by Slow Start. Such | |||
| a jump could aggressively feed a congested bottleneck, resulting in | a jump could aggressively feed a congested bottleneck, resulting in | |||
| overshoot where a disproportionate number of packets from existing | overshoot where a disproportionate number of packets from existing | |||
| flows are displaced from the buffer at the congested bottleneck. For | flows are displaced from the buffer at the congested bottleneck. For | |||
| this reason, a sender in the Safe Retreat Phase needs to react to | this reason, a sender in the Safe Retreat Phase needs to react to | |||
| detected congestion by reducing the CWND significantly below the | detected congestion by reducing the CWND significantly below the | |||
| saved_cwnd. | saved_cwnd. | |||
| During loss recovery, a receiver can cumulatively acknowledge data | During loss recovery, a receiver can cumulatively acknowledge data | |||
| that was previously sent in the Unvalidated Phase in addition to | that was previously sent in the Unvalidated Phase in addition to | |||
| acknowledging the successful retransmission of data. [RFC3465] | acknowledging the successful retransmission of data. [RFC3465] | |||
| skipping to change at line 1115 ¶ | skipping to change at line 1116 ¶ | |||
| if a server is configured to send using Careful Resume, there is an | if a server is configured to send using Careful Resume, there is an | |||
| onus to appropriately manage the use of saved CC parameters (see | onus to appropriately manage the use of saved CC parameters (see | |||
| Section 4.2). | Section 4.2). | |||
| The way in which this is realised will depend upon the design choices | The way in which this is realised will depend upon the design choices | |||
| in configuring the network and the servers. On the one hand, if all | in configuring the network and the servers. On the one hand, if all | |||
| the servers responding to a given IP address share the same location | the servers responding to a given IP address share the same location | |||
| (e.g., are in the same data center), then a method could be provided | (e.g., are in the same data center), then a method could be provided | |||
| to coordinate their sharing of the CC parameters that are used to | to coordinate their sharing of the CC parameters that are used to | |||
| send data using Careful Resume. On the other hand, if the service | send data using Careful Resume. On the other hand, if the service | |||
| configuration is such that subsquent use of the IP anycast address | configuration is such that subsequent use of the IP anycast address | |||
| might result in a very different path to a server (e.g., at a | might result in a very different path to a server (e.g., at a | |||
| different location where the path would be unable to support the same | different location where the path would be unable to support the same | |||
| capacity), a sender should not use Careful Resume based on saved CC | capacity), a sender should not use Careful Resume based on saved CC | |||
| parameters. | parameters. | |||
| 6. IANA Considerations | 6. IANA Considerations | |||
| This document has no IANA actions. | This document has no IANA actions. | |||
| 7. Security Considerations | 7. Security Considerations | |||
| The security considerations are the same as for other sender-based | The security considerations are the same as for other sender-based CC | |||
| congestion control methods. Such methods rely on the receiver | methods. Such methods rely on the receiver appropriately | |||
| appropriately acknowledging receipt of data. The ability of an on- | acknowledging receipt of data. The ability of an on-path or off-path | |||
| path or off-path attacker to influence congestion control depends | attacker to influence CC depends upon the security properties of the | |||
| upon the security properties of the transport protocol being used. | transport protocol being used. | |||
| 8. References | 8. References | |||
| 8.1. Normative References | 8.1. Normative References | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| skipping to change at line 1283 ¶ | skipping to change at line 1284 ¶ | |||
| restart-00>. | restart-00>. | |||
| Appendix A. Notes on the Careful Resume Phases | Appendix A. Notes on the Careful Resume Phases | |||
| The table below is provided to illustrate the operation of Careful | The table below is provided to illustrate the operation of Careful | |||
| Resume. This table is informative; please refer to the body of the | Resume. This table is informative; please refer to the body of the | |||
| document for the normative specification. The description is based | document for the normative specification. The description is based | |||
| on a normal CC that uses Reno. The PipeSize tracks the validated | on a normal CC that uses Reno. The PipeSize tracks the validated | |||
| CWND. | CWND. | |||
| The table uses the following abbreviations: | The phases in Table 1 correspond to Sections 3.2 through 3.5. This | |||
| table also uses the following abbreviations: | ||||
| SS = Slow-Start | SS = Slow Start | |||
| FS = flight_size | FS = flight_size | |||
| PS = PipeSize | PS = PipeSize | |||
| ACK = highest acknowledged packet | ACK = highest acknowledged packet | |||
| CC =Congestion Control | ||||
| CR = Careful Resume | ||||
| IW = Initial congestion Window | ||||
| CWND = Congestion Window | ||||
| +======+=========+============+=============+===========+===========+ | +=======+=========+============+============+===========+===========+ | |||
| |Phase |Normal |Recon. |Unvalidated |Validating |Safe Ret. | | |Phase |Normal |Recon. |Unvalidated |Validating |Safe Ret. | | |||
| +======+=========+============+=============+===========+===========+ | +=======+=========+============+============+===========+===========+ | |||
| | |Observing|Confirm path|Send faster |Validate |Drain path;| | | |Observing|Confirm path|Send faster |Validate |Drain path;| | |||
| | |CC params| |using |new CWND; |Update PS | | | |CC params| |using |new CWND; |Update PS | | |||
| | | | |saved_cwnd |Update PS | | | | | | |saved_cwnd |Update PS | | | |||
| +------+---------+------------+-------------+-----------+-----------+ | +-------+---------+------------+------------+-----------+-----------+ | |||
| |On | - |CWND=IW |PS=FS |If (FS>PS) |CWND=(PS/2)| | |On | - |CWND=IW |PS=FS |If (FS>PS) |CWND=(PS/2)| | |||
| |entry:| | |jump_cwnd |{CWND=FS} | | | |entry: | | |jump_cwnd |{CWND=FS} | | | |||
| | | | |=saved_cwnd |else | | | | | | |=saved_cwnd |else | | | |||
| | | | |/2; CWND |{CWND=PS; | | | | | | |/2; CWND |{CWND=PS; | | | |||
| | | | |=jump_cwnd |use Normal | | | | | | |=jump_cwnd |use Normal | | | |||
| | | | | |CC} | | | | | | | |CC} | | | |||
| +------+---------+------------+-------------+-----------+-----------+ | +-------+---------+------------+------------+-----------+-----------+ | |||
| |CWND: |When in |CWND |CWND is not |CWND can |CWND is not| | |CWND: |When in |CWND |CWND is not |CWND can |CWND is not| | |||
| | |observe, |increases |increased |increase |increased | | | |observe, |increases |increased |increase |increased | | |||
| | |measure |using SS | |using | | | | |measure |using SS | |using | | | |||
| | |saved | | |normal CC | | | | |saved | | |normal CC | | | |||
| | |_cwnd | | | | | | | |_cwnd | | | | | | |||
| +------+---------+------------+-------------+-----------+-----------+ | +-------+---------+------------+------------+-----------+-----------+ | |||
| |PS: | - | - |PS+=ACked | | |PS: | - | - |PS+=ACKed | | |||
| +------+---------+------------+-------------+-----------+-----------+ | +-------+---------+------------+------------+-----------+-----------+ | |||
| |RTT: |Measure |Measure | - | - | - | | |RTT: |Measure |Measure | - | - | - | | |||
| | |saved_rtt|current RTT | | | | | | |saved_rtt|current RTT | | | | | |||
| +------+---------+------------+-------------+-----------+-----------+ | +-------+---------+------------+------------+-----------+-----------+ | |||
| |If |Normal CC|Normal CC; |Enter Safe Retreat | - | | |If loss|Normal CC|Normal CC; |Enter Safe Retreat | - | | |||
| |loss | |CR is not | | | | |or ECN-| |CR is not | | | | |||
| |or | |allowed | | | | |CE: | |allowed | | | | |||
| |ECNCE:| | | | | | +-------+---------+------------+------------+-----------+-----------+ | |||
| +------+---------+------------+-------------+-----------+-----------+ | |Next |Observing|If (CWND, |If (FS>CWND |If (ACK >= |If (ACK >= | | |||
| |Next |Observing|If (CWND, |If (FS>CWND |If (ACK >= |If (ACK >= | | |Phase: |(as |Lifetime, |or >1 RTT |last |last | | |||
| |Phase:|(as |Lifetime, |or >1 RTT |last |last | | | |needed) |and RTT |has passed |unvalidated|unvalidated| | |||
| | |needed) |and RTT |has passed |unvalidated|unvalidated| | | | |confirmed), |or ACK >= |packet), |packet), | | |||
| | | |confirmed), |or ACK >= |packet), |packet), | | | | |enter |first |use Normal |ssthresh = | | |||
| | | |enter |first |use Normal |ssthresh = | | | | |Unvalidated;|unvalidated |CC |PS x Beta; | | |||
| | | |Unvalidated;|unvalidated |CC |PS x Beta; | | | | |else |packet), If | |and use | | |||
| | | |else |packet), If | |and use | | | | |CWND=Max |((FS>CWND) | |Normal CC | | |||
| | | |CWND=Max |((FS>CWND) | |Normal CC | | | | |(PS,IW); and|or | | | | |||
| | | |(PS,IW); and|or (FS<=PS)) | | | | | | |use Normal |(FS<=PS)) | | | | |||
| | | |use Normal |cwnd=PS; and | | | | | | |CC |cwnd=PS; | | | | |||
| | | |CC |use Normal | | | | | | | |and use | | | | |||
| | | | |CC else | | | | | | | |Normal CC | | | | |||
| | | | |cwnd=FS; | | | | | | | |else | | | | |||
| | | | |enter | | | | | | | |cwnd=FS; | | | | |||
| | | | |Validating | | | | | | | |enter | | | | |||
| +------+---------+------------+-------------+-----------+-----------+ | | | | |Validating | | | | |||
| +-------+---------+------------+------------+-----------+-----------+ | ||||
| Table 1: Illustration of the Operation of Careful Resume | Table 1: Illustration of the Operation of Careful Resume | |||
| Appendix B. Examples of the Careful Resume Phases | Appendix B. Examples of the Careful Resume Phases | |||
| The following examples consider an implementation that keeps track of | The following examples consider an implementation that keeps track of | |||
| transmitted data in terms of packets and provide informative examples | transmitted data in terms of packets and provide informative examples | |||
| of use. | of use. | |||
| In the Unvalidated Phase, the first unvalidated packet corresponds to | In the Unvalidated Phase, the first unvalidated packet corresponds to | |||
| skipping to change at line 1390 ¶ | skipping to change at line 1397 ¶ | |||
| When the first unvalidated packet is acknowledged (packet number 30), | When the first unvalidated packet is acknowledged (packet number 30), | |||
| the sender enters the Validating Phase. (This transition would also | the sender enters the Validating Phase. (This transition would also | |||
| occur if the flight_size increased to equal the CWND.) During this | occur if the flight_size increased to equal the CWND.) During this | |||
| phase, the CWND can be increased for each ACK that acknowledges an | phase, the CWND can be increased for each ACK that acknowledges an | |||
| unvalidated packet, because this indicates that the packet was | unvalidated packet, because this indicates that the packet was | |||
| validated. | validated. | |||
| When an ACK is received that acknowledges the last packet that was | When an ACK is received that acknowledges the last packet that was | |||
| sent in the Unvalidated Phase, the sender stops using Careful Resume. | sent in the Unvalidated Phase, the sender stops using Careful Resume. | |||
| For example, if the CWND is less than ssthresh, a Reno or Cubic | For example, if the CWND is less than ssthresh, a Reno or CUBIC | |||
| sender using normal CC is permitted to use Slow-Start to grow the | sender using normal CC is permitted to use Slow Start to grow the | |||
| CWND towards the ssthresh and will then enter congestion avoidance. | CWND towards the ssthresh and will then enter congestion avoidance. | |||
| B.2. Example with No Loss, Rate Limited | B.2. Example with No Loss, Rate Limited | |||
| A rate-limited sender will not fully utilise the available CWND when | A rate-limited sender will not fully utilise the available CWND when | |||
| using Careful Resume, and the CWND is therefore reset on entry to the | using Careful Resume, and the CWND is therefore reset on entry to the | |||
| Validating Phase, as described below. | Validating Phase, as described below. | |||
| The sender starts by sending up to IW packets (10) in the | The sender starts by sending up to IW packets (10) in the | |||
| Reconnaissance Phase. It commences as described in the first | Reconnaissance Phase. It commences as described in the first | |||
| skipping to change at line 1464 ¶ | skipping to change at line 1471 ¶ | |||
| acknowledged. This conservative CWND calculation ensures the sender | acknowledged. This conservative CWND calculation ensures the sender | |||
| drains the path after this potentially severe congestion event. | drains the path after this potentially severe congestion event. | |||
| There is no further increase in the CWND in this phase. | There is no further increase in the CWND in this phase. | |||
| The sender continues to receive ACKs that acknowledge the remaining | The sender continues to receive ACKs that acknowledge the remaining | |||
| 86 (121-35) unvalidated packets. Recall that the 35th unvalidated | 86 (121-35) unvalidated packets. Recall that the 35th unvalidated | |||
| packet was lost and had packet number 64 (29+35). The PipeSize | packet was lost and had packet number 64 (29+35). The PipeSize | |||
| tracks the capacity discovered by ACKs that acknowledge the | tracks the capacity discovered by ACKs that acknowledge the | |||
| unvalidated packets (i.e., the PipeSize is increased for each | unvalidated packets (i.e., the PipeSize is increased for each | |||
| received ACK that acknowledges new data). Although this PipeSize | received ACK that acknowledges new data). Although this PipeSize | |||
| cannot be used to safety initialise the CWND (because it was measured | cannot be used to safely initialise the CWND (because it was measured | |||
| when the sender had aggressively created overload), the estimated | when the sender had aggressively created overload), the estimated | |||
| PipeSize (which, in this case, is 121-1 = 120 packets) can be used to | PipeSize (which, in this case, is 121-1 = 120 packets) can be used to | |||
| set the ssthresh on exit from Safe Retreat, since it does indicate a | set the ssthresh on exit from Safe Retreat, since it does indicate a | |||
| measured upper limit to the current capacity. | measured upper limit to the current capacity. | |||
| At the point where all the unvalidated packets that were sent in the | At the point where all the unvalidated packets that were sent in the | |||
| Unvalidated Phase have been either acknowledged or have been declared | Unvalidated Phase have been either acknowledged or have been declared | |||
| lost, the sender updates the ssthresh to be no larger than the | lost, the sender updates the ssthresh to be no larger than the | |||
| recently measured PipeSize multiplied by Beta (the final action of | recently measured PipeSize multiplied by Beta (the final action of | |||
| the Safe Retreat Phase), and the sender stops using Careful Resume. | the Safe Retreat Phase), and the sender stops using Careful Resume. | |||
| Because the CWND will now be less than ssthresh, a sender using | Because the CWND will now be less than ssthresh, a sender using | |||
| normal CC is permitted to use Slow-Start to grow the CWND towards the | normal CC is permitted to use Slow Start to grow the CWND towards the | |||
| ssthresh, after which it will enter congestion avoidance. | ssthresh, after which it will enter congestion avoidance. | |||
| Appendix C. Implementation Notes for Using BBR | Appendix C. Implementation Notes for Using BBR | |||
| Bottleneck Bandwidth and Round-trip propagation time (BBR) uses | Bottleneck Bandwidth and Round-trip propagation time (BBR) uses | |||
| recent measurements of a transport connection's delivery rate, Round | recent measurements of a transport connection's delivery rate, Round | |||
| Trip Time (RTT), and packet loss rate to build an explicit model of | Trip Time (RTT), and packet loss rate to build an explicit model of | |||
| the network path. BBR then uses this model to control both how fast | the network path. BBR then uses this model to control both how fast | |||
| it sends data and the maximum volume of data it allows in flight in | it sends data and the maximum volume of data it allows in flight in | |||
| the network at any time [BBR-CC]. | the network at any time [BBR-CC]. | |||
| End of changes. 42 change blocks. | ||||
| 120 lines changed or deleted | 127 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||