1. Introduction
Van Jacobson's packet conservation principle [Jacobson88] defines a self clock process wherein N data segments delivered to the receiver generate acknowledgments that the data sender uses as the clock to trigger sending another N data segments into the network.
Congestion control algorithms like Reno [RFC5681] and CUBIC [RFC9438] are built on the conceptual foundation of this self clock process. They control the sending process of a transport protocol connection by using a congestion window ("cwnd") to limit "inflight", the volume of data that a connection estimates is in flight in the network at a given time. Furthermore, these algorithms require that transport protocol connections reduce their cwnd in response to packet losses. Fast recovery (see [RFC5681] and [RFC6675]) is the algorithm for using the feedback from acknowledgments to perform this cwnd reduction. Its stated goal is to maintain the sender's self clock by relying on returning ACKs to clock more data into the network during recovery.
Without Proportional Rate Reduction (PRR), fast recovery typically adjusts the window by waiting for most of a round-trip time (RTT) (half an RTT of ACKs for Reno [RFC5681], or 30% of an RTT for CUBIC [RFC9438]) before sending any data.
[RFC6675] makes fast recovery with support for Selective Acknowledgment (SACK) [RFC2018] more accurate by computing "pipe" (the sender's estimate of the number of bytes still outstanding in the network). With [RFC6675], fast recovery is implemented by sending data as needed on each ACK to allow pipe to rise to match ssthresh (the target window size as set by the congestion control algorithm for fast recovery). This protects fast recovery from timeouts in many cases where there is heavy loss. However, [RFC6675] has two notable shortcomings.
First, because it makes a very large multiplicative reduction to cwnd at the beginning of fast recovery, it may cause a timeout if data or ACKs for the entire second half of the window are lost. Second, a single ACK carrying SACK options that imply a large quantity of missing data can cause the pipe estimator to have a step discontinuity, which can cause a burst of data to be transmitted on fast retransmit.
PRR regulates the transmit process during fast recovery in a way that avoids these excessive window adjustments such that the transmissions proceed smoothly and, at the end of recovery, the actual window size will be as close as possible to ssthresh.
The approach taken by PRR was inspired by Van Jacobson's packet conservation principle. PRR relies on the self clock process as much as possible and is only weakly affected by the accuracy of estimators, such as those for the amount of data that is in flight. This is why the algorithm maintains its accuracy even in the presence of events that cause uncertainty for other estimators.
When inflight is above ssthresh, PRR smoothly reduces inflight down to ssthresh by clocking out transmissions at a rate that is proportional to the delivered data and ssthresh.
When inflight is below ssthresh, PRR adaptively selects between two Reduction Bounds to limit the total window reduction from all mechanisms (including transient application stalls and the losses themselves). As a baseline, PRR uses its Conservative Reduction Bound (CRB) to strictly follow packet conservation, for prudence when there may be substantial congestion. When recovery seems to be proceeding well, PRR uses its Slow Start Reduction Bound (SSRB), which is more aggressive than PRR-CRB by at most one segment per ACK.
PRR-CRB meets the Strong Packet Conservation Bound described in Appendix A; however, its performance in actual networks is not as good as the algorithm described in [RFC6675], which has been
shown to be more aggressive in a large number of cases, when used as the sole algorithm. PRR-SSRB offers a compromise by allowing a connection to send one additional segment per ACK relative to PRR-CRB in certain situations. Although PRR-SSRB is less aggressive than [RFC6675] (transmitting fewer segments or taking more time to transmit them), it outperforms it due to the lower probability of additional losses during recovery.
The original definition of packet conservation principle [Jacobson88] treated packets presumed to be lost (e.g., marked as candidates for retransmission) as having left the network. This idea is reflected in the inflight estimator used by PRR, but it differs from the Strong Packet Conservation Bound described in Appendix A, which is defined based only on the data that actually arrived at the receiver.
This document specifies several major changes relative to the earlier version of PRR in [RFC6937]. First, it introduces a new adaptive heuristic that replaces a manually configured parameter that determined how conservative PRR would be when inflight is below ssthresh (whether to use PRR-CRB or PRR-SSRB).
Second, the algorithm specifies behavior for non-SACK connections (connections that did not negotiate SACK [RFC2018] support via the "SACK-permitted" option). Third, the algorithm ensures smooth sending even in cases where a sender experiences high reordering and does not start loss recovery until after a substantial sequence space has been SACKed.
Finally, this document also includes additional discussion of the integration of PRR with congestion control and loss detection algorithms.
PRR has extensive deployment experience in multiple TCP implementations since the first widely deployed TCP PRR implementation in 2011 [First_TCP_PRR].