rfc-5682

Forward RTO-Recovery (F-RTO): An Algorithm for Detecting Spurious Retransmission Timeouts with TCP

P. Sarolahti, M. Kojo, K. Yamamoto, M. Hata
date2009-09 streamIETF areawit wgtcpm statusPROPOSED STANDARD pages19 canonicalhttps://www.rfc-editor.org/rfc/rfc5682 doi10.17487/RFC5682
The purpose of this document is to move the F-RTO (Forward RTO-Recovery) functionality for TCP in RFC 4138 from Experimental to Standards Track status. The F-RTO support for Stream Control Transmission Protocol (SCTP) in RFC 4138 remains with Experimental status. See Appendix B for the differences between this document and RFC 4138. Spurious retransmission timeouts cause suboptimal TCP performance because they often result in unnecessary retransmission of the last window of data. This document describes the F-RTO detection algorithm for detecting spurious TCP retransmission timeouts. F-RTO is a TCP sender-only algorithm that does not require any TCP options to operate. After retransmitting the first unacknowledged segment triggered by a timeout, the F-RTO algorithm of the TCP sender monitors the incoming acknowledgments to determine whether the timeout was spurious. It then decides whether to send new segments or retransmit unacknowledged segments. The algorithm effectively helps to avoid additional unnecessary retransmissions and thereby improves TCP performance in the case of a spurious timeout. [STANDARDS-TRACK]

updates

Extracted elements (26)

design-rationale §2.2

F-RTO blocks algorithm entry when an earlier RTO recovery is underway (recover ≥ SND.UNA check) because acknowledgments for retransmitted segments could falsely lead the sender to declare the timeout spurious; the exception is multiple consecutive RTO expirations for the same segment.

tcp

design-rationale §2.2

F-RTO has a beneficial side effect on RTT measurement: by avoiding unnecessary retransmissions it can take RTT samples on delayed segments without retransmission ambiguity, yielding more accurate and larger RTO estimates — an advantage in networks prone to delay spikes.

tcp, congestion

design-rationale §1

F-RTO is a TCP sender-only algorithm requiring no TCP options. Unlike Eifel (which requires TCP timestamps) and DSACK-based algorithms (which require SACK with DSACK extension), F-RTO can be deployed with sender-side modifications only, broadening its applicability.

tcp, congestion

design-rationale §2.2

In step 2a, if the first ACK covers 'recover' but not beyond, the timeout cannot be declared spurious because there is insufficient evidence that a non-retransmitted segment arrived; this correctly handles the common case where a fast retransmission is lost and then retransmitted after an RTO.

tcp

design-rationale §2.2

The F-RTO sender is allowed to transmit up to two new segments in step 2b because a conventional TCP sender would also transmit two segments when the first new ACK arrives after an RTO retransmission; this is consistent with TCP congestion control requirements and does not inject extra traffic.

tcp, congestion

design-rationale §3.2

The SACK-enhanced F-RTO leverages the assumption that when a genuine RTO occurs in steady state there are no segments left in the pipe; if ACKs for pre-timeout segments arrive in response to the two new segments sent at step 2, normal TCP operation was merely delayed and the timeout is spurious.

tcp, congestion

design-rationale §2.2

When a spurious timeout is declared, 'recover' is reset to SND.UNA so that subsequent duplicate ACKs can trigger fast retransmit. Because F-RTO only retransmits the segment that triggered the timeout, the NewReno problem of unnecessary multiple fast retransmits cannot occur.

tcp, congestion

design-rationale §2.2

When the receiver window prevents new transmissions in step 2b, reverting to conventional RTO recovery is recommended to prevent the transfer from stalling: without new segments the pipe drains and no further ACKs arrive. Appendix A discusses alternative window-limited strategies.

tcp, congestion

interoperability-note §1

F-RTO detects spurious RTOs only following an RTO event. Eifel (using TCP timestamps) and DSACK-based algorithms can additionally detect spurious retransmissions caused by other events such as packet reordering, providing broader detection coverage.

tcp, congestion

interoperability-note §2.2

If a spurious RTO occurs during fast recovery, F-RTO often cannot detect it because segments transmitted before the fast-recovery trigger generate duplicate ACKs. In those cases F-RTO falls back to conventional slow-start retransmissions, performing the same as regular RTO recovery.

tcp, congestion

interoperability-note §1

The F-RTO algorithm for SCTP was specified in RFC 4138 and remains at Experimental status; this document covers TCP only and advances F-RTO for TCP to Standards Track, replacing the TCP portion of RFC 4138.

tcp, sctp

interoperability-note §2.2

When packet reordering or duplication affects the segment that triggered the spurious timeout, the basic F-RTO algorithm may fail to detect the spurious timeout due to incoming duplicate ACKs. The SACK-enhanced version handles most such cases by using SACK information to identify new data.

tcp, congestion

normative-requirement §2.1 MUST

A TCP sender implementing the basic F-RTO algorithm MUST take the specified steps after the retransmission timer expires. If the retransmission timer expires again during F-RTO execution, the sender MUST restart the algorithm from step 1.

tcp, congestion

normative-requirement §3.1 MUST

A TCP sender MAY apply the SACK-enhanced F-RTO algorithm when SACK is enabled; if it does, it MUST follow the specified steps. The SACK-enhanced algorithm SHOULD NOT be applied if the sender is already in loss recovery when the retransmission timeout occurs.

tcp, congestion

normative-requirement §4 SHOULD

If no specific spurious-RTO response algorithm is implemented, the TCP sender SHOULD respond to a spurious timeout conservatively by applying the TCP congestion control specification (RFC 5681).

tcp, congestion

normative-requirement §2.1 SHOULD NOT

If the sender implements a loss recovery algorithm other than Reno or NewReno, the F-RTO algorithm SHOULD NOT be entered when an earlier fast recovery is underway.

tcp, congestion

normative-requirement §2.1 MAY

In F-RTO step 2b, when the first post-RTO ACK advances the window without covering 'recover', the sender transmits up to two new (previously unsent) segments and MAY override the Nagle algorithm to immediately send a segment if needed.

tcp, congestion

normative-requirement §2.1 SHOULD

The TCP sender SHOULD ignore acknowledgments that neither advance the cumulative acknowledgment nor are duplicate ACKs, waiting instead for a qualifying segment.

tcp

protocol-element §2.1

The 'recover' variable (inherited from NewReno) is used by the basic F-RTO algorithm to store the highest sequence number transmitted so far; it is reset to SND.UNA upon declaring a spurious timeout, re-enabling fast retransmit on subsequent duplicate ACKs.

tcp

protocol-element §3.1

The 'RecoveryPoint' variable, used by the SACK-enhanced F-RTO, records the highest sequence number transmitted so far at key algorithm checkpoints; it is set to SND.UNA when a spurious timeout is declared, permitting fast recovery on incoming duplicate acknowledgments.

tcp

protocol-element §2

The 'SpuriousRecovery' variable tracks F-RTO detection outcome: SPUR_TO indicates a spurious retransmission timeout was detected; FALSE indicates the timeout is not declared spurious and conventional RTO recovery should continue. This variable can serve as input to a corresponding response algorithm.

tcp

security-consideration §6

A malicious receiver can acknowledge data it has not received, causing F-RTO step 3 to declare a spurious timeout. However, the sender's resulting incorrect state means it cannot retransmit the undelivered segment, limiting the practical benefit of this attack to the receiver.

tcp, security

security-consideration §6

A malicious receiver can delay acknowledgment of a segment until after the sender enters F-RTO step 3, causing a genuine timeout to be falsely declared spurious. Mitigation: when an RTO occurs during fast recovery the sender should reduce the congestion window to 1 rather than fully reverting it.

tcp, security, congestion

security-consideration §6

The primary security threat of F-RTO is a receiver misleading the sender into setting an excessively large congestion window after an RTO. Loss of the unnecessary RTO retransmission cannot be detected without an explicit acknowledgment scheme such as DSACK, a limitation shared with Eifel and regular TCP without DSACK.

tcp, security, congestion

state-machine §2.1

The basic F-RTO algorithm has three steps triggered by RTO expiry: Step 1 retransmits the first unacknowledged segment and sets SpuriousRecovery=FALSE; Step 2 processes the first post-RTO ACK (revert to conventional recovery on duplicate ACK or 'recover'-covering ACK, else send two new segments); Step 3 processes the second ACK (declare SPUR_TO if the window advances on non-retransmitted data, else set cwnd ≤ 3*MSS and retransmit in slow start).

tcp, congestion

state-machine §3.1

The SACK-enhanced F-RTO operates in three steps: Step 1 fires on RTO expiry (reset SACK scoreboard, check RecoveryPoint vs. SND.UNA); Step 2 waits for the cumulative ACK of retransmitted data while updating the scoreboard from SACKs; Step 3 declares SPUR_TO if cumulative ACK or SACK acknowledges previously unacknowledged data not transmitted after the timeout, otherwise reverts to conventional recovery.

tcp, congestion