rfc-4015

The Eifel Response Algorithm for TCP

R. Ludwig, A. Gurtov
date2005-02 streamIETF areawit wgtsvwg statusPROPOSED STANDARD pages13 canonicalhttps://www.rfc-editor.org/rfc/rfc4015 doi10.17487/RFC4015
Based on an appropriate detection algorithm, the Eifel response algorithm provides a way for a TCP sender to respond to a detected spurious timeout. It adapts the retransmission timer to avoid further spurious timeouts and (depending on the detection algorithm) can avoid the often unnecessary go-back-N retransmits that would otherwise be sent. In addition, the Eifel response algorithm restores the congestion control state in such a way that packet bursts are avoided. [STANDARDS-TRACK]

Extracted elements (18)

design-rationale §3.4

cwnd in step 9 is reset to FlightSize + min(bytes_acked, IW) rather than a larger value because IW (Initial Window) bounds the burst size to an amount considered acceptable for an 'unprobed' network, preventing large post-recovery packet bursts.

tcp, congestion

design-rationale §3.6

In step 11, SRTT_prev is pre-inflated by 2*G (two times the clock granularity) to ensure the new RTO is at least 2*G greater than the pre-spurious-timeout RTO, accounting for cases where a spurious timeout occurs because RTT estimators were only inaccurate by a small margin.

tcp

design-rationale §3.2

pipe_prev is set to max(FlightSize, ssthresh) rather than always FlightSize because FlightSize reflects the actual amount in flight during congestion avoidance, while ssthresh reflects the safe operating point during slow-start; this preserves a meaningful congestion state snapshot for later restoration.

tcp, congestion

design-rationale §3.3

Step 8 (SND.NXT <- SND.MAX) is only executed when SpuriousRecovery equals SPUR_TO because this value requires a detection algorithm (like RFC 3522 or F-RTO) that confirms spurious retransmit via an ACK for an original transmit, providing sufficient certainty to safely skip go-back-N retransmits.

tcp

design-rationale §3.2

The algorithm does not require decaying pipe_prev over time (e.g., upon subsequent timeouts for the same segment) because the approach of revalidating the congestion window through slow-start, as in RFC 2861, is preferred over more conservative decay-based approaches.

tcp, congestion

interoperability-note §4

The Eifel response algorithm SHOULD always be operated with an advanced loss recovery scheme such as SACK-based loss recovery (RFC 3517) or NewReno (RFC 3782), because in environments with coincident spurious timeouts and multiple losses, the conservative Eifel response can cause additional timeouts without such schemes.

tcp, congestion

normative-requirement §3.4 MUST

If the acceptable ACK in step 9 has the ECN-Echo flag set, the TCP sender MUST refrain from reversing the congestion control state and proceed directly to step DONE.

tcp, congestion, ecn

normative-requirement §2 MUST

If the Eifel response algorithm is implemented at the TCP sender, it MUST be implemented together with a detection algorithm that is specified in a standards track or experimental RFC.

tcp, congestion

normative-requirement §4 SHOULD

If the NewReno algorithm (RFC 3782) is used with the Eifel response algorithm, step 1 of NewReno SHOULD be modified to omit step 1B when SpuriousRecovery equals SPUR_TO, because step 8 of the Eifel response algorithm already avoids the unnecessary go-back-N retransmits that step 1B was designed to handle.

tcp, congestion

normative-requirement §3.1 MUST

When the Eifel response algorithm is used, the specified steps MUST be taken by the TCP sender upon initiation of a timeout-based loss recovery (i.e., when the first timeout-based retransmit is sent). The algorithm MUST NOT be reinitiated after a timeout-based loss recovery has already been started but not completed.

tcp, congestion

protocol-element §3.1

Step 0 of the algorithm stores pre-recovery congestion control state: pipe_prev is set to max(FlightSize, ssthresh), SRTT_prev is set to SRTT + (2 * G), and RTTVAR_prev is set to RTTVAR, all before cwnd and ssthresh are updated upon loss recovery initiation.

tcp, congestion

protocol-element §3.1

Step 10 handles interworking with Congestion Window Validation (RFC 2861): T_last is reset to tcpnow to prevent the CWV algorithm from misinterpreting a delay spike that caused a spurious timeout as an idle phase.

tcp, congestion

protocol-element §3.1

Step 11 adapts the retransmission timer upon the first RTT-SAMPLE from new data after a spurious timeout: SRTT is set to max(SRTT_prev, RTT-SAMPLE), RTTVAR to max(RTTVAR_prev, RTT-SAMPLE/2), and RTO to SRTT + max(G, 4*RTTVAR), followed by bounds checks per RFC 2988 and timer restart.

tcp

protocol-element §3.1

Step 8 suppresses unnecessary go-back-N retransmits by setting SND.NXT <- SND.MAX when SpuriousRecovery equals SPUR_TO, allowing the TCP sender to resume transmission with previously unsent data rather than retransmitting already-delivered segments.

tcp

protocol-element §3.1

Step 9 reverses congestion control state when SpuriousRecovery indicates a spurious timeout and the ECN-Echo flag is not set: cwnd is reset to FlightSize + min(bytes_acked, IW), and ssthresh is reset to pipe_prev.

tcp, congestion, ecn

protocol-element §2

The variable SpuriousRecovery is reused with semantics from RFC 3522. The constant LATE_SPUR_TO (set to -1) is defined as an additional value, set when spurious retransmit detection is based on the ACK for the retransmit (e.g., DSACK-based detection per RFC 3708), as opposed to an ACK for an original transmit.

tcp

security-consideration §5 SHOULD

Spoofed ACKs could fool a detection algorithm into classifying genuine retransmits as spurious, which when combined with the Eifel response algorithm could effectively disable congestion control at the TCP sender. The Eifel response algorithm SHOULD only be run with detection algorithms known to be safe against ACK spoofing attacks; the safe variant of the Eifel detection algorithm (RFC 3522) is cited as a reliable protection.

tcp, security, congestion

state-machine §3.1

Upon SpuriousRecovery detection: if SPUR_TO, execute step 8 (suppress go-back-N) then step 9 (reverse congestion state); if LATE_SPUR_TO, skip step 8 and go directly to step 9 (reverse congestion state only); otherwise proceed to DONE with no recovery reversal.

tcp, congestion