|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Network Working Group R. Ludwig |
|
|
Request for Comments: 4015 Ericsson Research |
|
|
Category: Standards Track A. Gurtov |
|
|
HIIT |
|
|
February 2005 |
|
|
|
|
|
|
|
|
The Eifel Response Algorithm for TCP |
|
|
|
|
|
Status of This Memo |
|
|
|
|
|
This document specifies an Internet standards track protocol for the |
|
|
Internet community, and requests discussion and suggestions for |
|
|
improvements. Please refer to the current edition of the "Internet |
|
|
Official Protocol Standards" (STD 1) for the standardization state |
|
|
and status of this protocol. Distribution of this memo is unlimited. |
|
|
|
|
|
Copyright Notice |
|
|
|
|
|
Copyright (C) The Internet Society (2005). |
|
|
|
|
|
Abstract |
|
|
|
|
|
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. |
|
|
|
|
|
1. Introduction |
|
|
|
|
|
The Eifel response algorithm relies on a detection algorithm such as |
|
|
the Eifel detection algorithm, defined in [RFC3522]. That document |
|
|
contains informative background and motivation context that may be |
|
|
useful for implementers of the Eifel response algorithm, but it is |
|
|
not necessary to read [RFC3522] in order to implement the Eifel |
|
|
response algorithm. Note that alternative response algorithms have |
|
|
been proposed [BA02] that could also rely on the Eifel detection |
|
|
algorithm, and alternative detection algorithms have been proposed |
|
|
[RFC3708], [SK04] that could work together with the Eifel response |
|
|
algorithm. |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 1] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
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. |
|
|
|
|
|
Note: A previous version of the Eifel response algorithm also |
|
|
included a response to a detected spurious fast retransmit. |
|
|
However, as a consensus was not reached about how to adapt the |
|
|
duplicate acknowledgement threshold in that case, that part of the |
|
|
algorithm was removed for the time being. |
|
|
|
|
|
1.1. Terminology |
|
|
|
|
|
The keywords MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, |
|
|
SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL, when they appear in this |
|
|
document, are to be interpreted as described in [RFC2119]. |
|
|
|
|
|
We refer to the first-time transmission of an octet as the 'original |
|
|
transmit'. A subsequent transmission of the same octet is referred |
|
|
to as a 'retransmit'. In most cases, this terminology can also be |
|
|
applied to data segments. However, when repacketization occurs, a |
|
|
segment can contain both first-time transmissions and retransmissions |
|
|
of octets. In that case, this terminology is only consistent when |
|
|
applied to octets. For the Eifel detection and response algorithms, |
|
|
this makes no difference, as they also operate correctly when |
|
|
repacketization occurs. |
|
|
|
|
|
We use the term 'acceptable ACK' as defined in [RFC793]. That is an |
|
|
ACK that acknowledges previously unacknowledged data. We use the |
|
|
term 'bytes_acked' to refer to the amount (in terms of octets) of |
|
|
previously unacknowledged data that is acknowledged by the most |
|
|
recently received acceptable ACK. We use the TCP sender state |
|
|
variables 'SND.UNA' and 'SND.NXT' as defined in [RFC793]. SND.UNA |
|
|
holds the segment sequence number of the oldest outstanding segment. |
|
|
SND.NXT holds the segment sequence number of the next segment the TCP |
|
|
sender will (re-)transmit. In addition, we define as 'SND.MAX' the |
|
|
segment sequence number of the next original transmit to be sent. |
|
|
The definition of SND.MAX is equivalent to the definition of |
|
|
'snd_max' in [WS95]. |
|
|
|
|
|
We use the TCP sender state variables 'cwnd' (congestion window), and |
|
|
'ssthresh' (slow-start threshold), and the term 'FlightSize' as |
|
|
defined in [RFC2581]. FlightSize is the amount (in terms of octets) |
|
|
of outstanding data at a given point in time. We use the term |
|
|
'Initial Window' (IW) as defined in [RFC3390]. The IW is the size of |
|
|
the sender's congestion window after the three-way handshake is |
|
|
completed. We use the TCP sender state variables 'SRTT' and |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 2] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
'RTTVAR', and the terms 'RTO' and 'G' as defined in [RFC2988]. G is |
|
|
the clock granularity of the retransmission timer. In addition, we |
|
|
assume that the TCP sender maintains the value of the latest round- |
|
|
trip time (RTT) measurement in the (local) variable 'RTT-SAMPLE'. |
|
|
|
|
|
We use the TCP sender state variable 'T_last', and the term 'tcpnow' |
|
|
as used in [RFC2861]. T_last holds the system time when the TCP |
|
|
sender sent the last data segment, whereas tcpnow is the TCP sender's |
|
|
current system time. |
|
|
|
|
|
2. Appropriate Detection Algorithms |
|
|
|
|
|
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. |
|
|
|
|
|
Designers of detection algorithms who want their algorithms to work |
|
|
together with the Eifel response algorithm should reuse the variable |
|
|
"SpuriousRecovery" with the semantics and defined values specified in |
|
|
[RFC3522]. In addition, we define the constant LATE_SPUR_TO (set |
|
|
equal to -1) as another possible value of the variable |
|
|
SpuriousRecovery. Detection algorithms should set the value of |
|
|
SpuriousRecovery to LATE_SPUR_TO if the detection of a spurious |
|
|
retransmit is based on the ACK for the retransmit (as opposed to an |
|
|
ACK for an original transmit). For example, this applies to |
|
|
detection algorithms that are based on the DSACK option [RFC3708]. |
|
|
|
|
|
3. The Eifel Response Algorithm |
|
|
|
|
|
The complete algorithm is specified in section 3.1. In sections 3.2 |
|
|
- 3.6, we discuss the different steps of the algorithm. |
|
|
|
|
|
3.1. The Algorithm |
|
|
|
|
|
Given that a TCP sender has enabled a detection algorithm that |
|
|
complies with the requirements set in Section 2, a TCP sender MAY use |
|
|
the Eifel response algorithm as defined in this subsection. |
|
|
|
|
|
If the Eifel response algorithm is used, the following steps MUST be |
|
|
taken by the TCP sender, but only upon initiation of a timeout-based |
|
|
loss recovery. That is 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. In |
|
|
particular, it may not be reinitiated upon subsequent timeouts for |
|
|
the same segment, or upon retransmitting segments other than the |
|
|
oldest outstanding segment. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 3] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
(0) Before the variables cwnd and ssthresh get updated when |
|
|
loss recovery is initiated, set a "pipe_prev" variable as |
|
|
follows: |
|
|
pipe_prev <- max (FlightSize, ssthresh) |
|
|
|
|
|
Set a "SRTT_prev" variable and a "RTTVAR_prev" variable as |
|
|
follows: |
|
|
SRTT_prev <- SRTT + (2 * G) |
|
|
RTTVAR_prev <- RTTVAR |
|
|
|
|
|
(DET) This is a placeholder for a detection algorithm that must |
|
|
be executed at this point, and that sets the variable |
|
|
SpuriousRecovery as outlined in Section 2. If |
|
|
[RFC3522] is used as the detection algorithm, steps (1) - |
|
|
(6) of that algorithm go here. |
|
|
|
|
|
(7) If SpuriousRecovery equals SPUR_TO, then |
|
|
proceed to step (8); |
|
|
|
|
|
else if SpuriousRecovery equals LATE_SPUR_TO, then |
|
|
proceed to step (9); |
|
|
|
|
|
else |
|
|
proceed to step (DONE). |
|
|
|
|
|
(8) Resume the transmission with previously unsent data: |
|
|
|
|
|
Set |
|
|
SND.NXT <- SND.MAX |
|
|
|
|
|
(9) Reverse the congestion control state: |
|
|
|
|
|
If the acceptable ACK has the ECN-Echo flag [RFC3168] set, |
|
|
then |
|
|
proceed to step (DONE); |
|
|
|
|
|
else set |
|
|
cwnd <- FlightSize + min (bytes_acked, IW) |
|
|
ssthresh <- pipe_prev |
|
|
|
|
|
Proceed to step (DONE). |
|
|
|
|
|
(10) Interworking with Congestion Window Validation: |
|
|
|
|
|
If congestion window validation is implemented according |
|
|
to [RFC2861], then set |
|
|
T_last <- tcpnow |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 4] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
(11) Adapt the conservativeness of the retransmission timer: |
|
|
|
|
|
Upon the first RTT-SAMPLE taken from new data; i.e., the |
|
|
first RTT-SAMPLE that can be derived from an acceptable |
|
|
ACK for data that was previously unsent when the spurious |
|
|
timeout occurred, |
|
|
|
|
|
if the retransmission timer is implemented according |
|
|
to [RFC2988], then set |
|
|
SRTT <- max (SRTT_prev, RTT-SAMPLE) |
|
|
RTTVAR <- max (RTTVAR_prev, RTT-SAMPLE/2) |
|
|
RTO <- SRTT + max (G, 4*RTTVAR) |
|
|
|
|
|
Run the bounds check on the RTO (rules (2.4) and |
|
|
(2.5) in [RFC2988]), and restart the |
|
|
retransmission timer; |
|
|
|
|
|
else |
|
|
appropriately adapt the conservativeness of the |
|
|
retransmission timer that is implemented. |
|
|
|
|
|
(DONE) No further processing. |
|
|
|
|
|
3.2. Storing the Current Congestion Control State (Step 0) |
|
|
|
|
|
The TCP sender stores in pipe_prev what is considered a safe slow- |
|
|
start threshold (ssthresh) before loss recovery is initiated; i.e., |
|
|
before the loss indication is taken into account. This is either the |
|
|
current FlightSize, if the TCP sender is in congestion avoidance, or |
|
|
the current ssthresh, if the TCP sender is in slow-start. If the TCP |
|
|
sender later detects that it has entered loss recovery unnecessarily, |
|
|
then pipe_prev is used in step (9) to reverse the congestion control |
|
|
state. Thus, until the loss recovery phase is terminated, pipe_prev |
|
|
maintains a memory of the congestion control state of the time right |
|
|
before the loss recovery phase was initiated. A similar approach is |
|
|
proposed in [RFC2861], where this state is stored in ssthresh |
|
|
directly after a TCP sender has become idle or application limited. |
|
|
|
|
|
There had been debates about whether the value of pipe_prev should be |
|
|
decayed over time; e.g., upon subsequent timeouts for the same |
|
|
outstanding segment. We do not require decaying pipe_prev for the |
|
|
Eifel response algorithm and do not believe that such a conservative |
|
|
approach should be in place. Instead, we follow the idea of |
|
|
revalidating the congestion window through slow-start, as suggested |
|
|
in [RFC2861]. That is, in step (9), the cwnd is reset to a value |
|
|
that avoids large packet bursts, and ssthresh is reset to the value |
|
|
of pipe_prev. Note that [RFC2581] and [RFC2861] also do not require |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 5] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
a decaying of ssthresh after it has been reset in response to a loss |
|
|
indication, or after a TCP sender has become idle or application |
|
|
limited. |
|
|
|
|
|
3.3. Suppressing the Unnecessary go-back-N Retransmits (Step 8) |
|
|
|
|
|
Without the use of the TCP timestamps option [RFC1323], the TCP |
|
|
sender suffers from the retransmission ambiguity problem [Zh86], |
|
|
[KP87]. Therefore, when the first acceptable ACK arrives after a |
|
|
spurious timeout, the TCP sender must assume that this ACK was sent |
|
|
in response to the retransmit when in fact it was sent in response to |
|
|
an original transmit. Furthermore, the TCP sender must further |
|
|
assume that all other segments that were outstanding at that point |
|
|
were lost. |
|
|
|
|
|
Note: Except for certain cases where original ACKs were lost, the |
|
|
first acceptable ACK cannot carry a DSACK option [RFC2883]. |
|
|
|
|
|
Consequently, once the TCP sender's state has been updated after the |
|
|
first acceptable ACK has arrived, SND.NXT equals SND.UNA. This is |
|
|
what causes the often unnecessary go-back-N retransmits. From that |
|
|
point on every arriving acceptable ACK that was sent in response to |
|
|
an original transmit will advance SND.NXT. But as long as SND.NXT is |
|
|
smaller than the value that SND.MAX had when the timeout occurred, |
|
|
those ACKs will clock out retransmits, whether or not the |
|
|
corresponding original transmits were lost. |
|
|
|
|
|
In fact, during this phase the TCP sender breaks 'packet |
|
|
conservation' [Jac88]. This is because the go-back-N retransmits are |
|
|
sent during slow-start. For each original transmit leaving the |
|
|
network, two retransmits are sent into the network as long as SND.NXT |
|
|
does not equal SND.MAX (see [LK00] for more detail). |
|
|
|
|
|
Once a spurious timeout has been detected (upon receipt of an ACK for |
|
|
an original transmit), it is safe to let the TCP sender resume the |
|
|
transmission with previously unsent data. Thus, the Eifel response |
|
|
algorithm changes the TCP sender's state by setting SND.NXT to |
|
|
SND.MAX. Note that this step is only executed if the variable |
|
|
SpuriousRecovery equals SPUR_TO, which in turn requires a detection |
|
|
algorithm such as the Eifel detection algorithm [RFC3522] or the F- |
|
|
RTO algorithm [SK04] that detects a spurious retransmit based upon |
|
|
receiving an ACK for an original transmit (as opposed to the ACK for |
|
|
the retransmit [RFC3708]). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 6] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
3.4. Reversing the Congestion Control State (Step 9) |
|
|
|
|
|
When a TCP sender enters loss recovery, it reduces cwnd and ssthresh. |
|
|
However, once the TCP sender detects that the loss recovery has been |
|
|
falsely triggered, this reduction proves unnecessary. We therefore |
|
|
believe that it is safe to revert to the previous congestion control |
|
|
state, following the approach of revalidating the congestion window |
|
|
as outlined below. This is unless the acceptable ACK signals |
|
|
congestion through the ECN-Echo flag [RFC3168]. In that case, the |
|
|
TCP sender MUST refrain from reversing congestion control state. |
|
|
|
|
|
If the ECN-Echo flag is not set, cwnd is reset to the sum of the |
|
|
current FlightSize and the minimum of bytes_acked and IW. In some |
|
|
cases, this can mean that the first few acceptable ACKs that arrive |
|
|
will not clock out any data segments. Recall that bytes_acked is the |
|
|
number of bytes that have been acknowledged by the acceptable ACK. |
|
|
Note that the value of cwnd must not be changed any further for that |
|
|
ACK, and that the value of FlightSize at this point in time may be |
|
|
different from the value of FlightSize in step (0). The value of IW |
|
|
puts a limit on the size of the packet burst that the TCP sender may |
|
|
send into the network after the Eifel response algorithm has |
|
|
terminated. The value of IW is considered an acceptable burst size. |
|
|
It is the amount of data that a TCP sender may send into a yet |
|
|
"unprobed" network at the beginning of a connection. |
|
|
|
|
|
Then ssthresh is reset to the value of pipe_prev. As a result, the |
|
|
TCP sender either immediately resumes probing the network for more |
|
|
bandwidth in congestion avoidance, or it slow-starts to what is |
|
|
considered a safe operating point for the congestion window. |
|
|
|
|
|
3.5. Interworking with the CWV Algorithm (Step 10) |
|
|
|
|
|
An implementation of the Congestion Window Validation (CWV) algorithm |
|
|
[RFC2861] could potentially misinterpret a delay spike that caused a |
|
|
spurious timeout as a phase where the TCP sender had been idle. |
|
|
Therefore, T_last is reset to prevent the triggering of the CWV |
|
|
algorithm in this case. |
|
|
|
|
|
Note: The term 'idle' implies that the TCP sender has no data |
|
|
outstanding; i.e., all data sent has been acknowledged [Jac88]. |
|
|
According to this definition, a TCP sender is not idle while it is |
|
|
waiting for an acceptable ACK after a timeout. Unfortunately, the |
|
|
pseudo-code in [RFC2861] does not include a check for the |
|
|
condition "idle" (SND.UNA == SND.MAX). We therefore had to add |
|
|
step (10) to the Eifel response algorithm. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 7] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
3.6. Adapting the Retransmission Timer (Step 11) |
|
|
|
|
|
There is currently only one retransmission timer standardized for TCP |
|
|
[RFC2988]. We therefore only address that timer explicitly. Future |
|
|
standards that might define alternatives to [RFC2988] should propose |
|
|
similar measures to adapt the conservativeness of the retransmission |
|
|
timer. |
|
|
|
|
|
A spurious timeout often results from a delay spike, which is a |
|
|
sudden increase of the RTT that usually cannot be predicted. After a |
|
|
delay spike, the RTT may have changed permanently; e.g., due to a |
|
|
path change, or because the available bandwidth on a bandwidth- |
|
|
dominated path has decreased. This may often occur with wide-area |
|
|
wireless access links. In this case, the RTT estimators (SRTT and |
|
|
RTTVAR) should be reinitialized from the first RTT-SAMPLE taken from |
|
|
new data according to rule (2.2) of [RFC2988]. That is, from the |
|
|
first RTT-SAMPLE that can be derived from an acceptable ACK for data |
|
|
that was previously unsent when the spurious timeout occurred. |
|
|
|
|
|
However, a delay spike may only indicate a transient phase, after |
|
|
which the RTT returns to its previous range of values, or even to |
|
|
smaller values. Also, a spurious timeout may occur because the TCP |
|
|
sender's RTT estimators were only inaccurate enough that the |
|
|
retransmission timer expires "a tad too early". We believe that two |
|
|
times the clock granularity of the retransmission timer (2 * G) is a |
|
|
reasonable upper bound on "a tad too early". Thus, when the new RTO |
|
|
is calculated in step (11), we ensure that it is at least (2 * G) |
|
|
greater (see also step (0)) than the RTO was before the spurious |
|
|
timeout occurred. |
|
|
|
|
|
Note that other TCP sender processing will usually take place between |
|
|
steps (10) and (11). During this phase (i.e., before step (11) has |
|
|
been reached), the RTO is managed according to the rules of |
|
|
[RFC2988]. We believe that this is sufficiently conservative for the |
|
|
following reasons. First, the retransmission timer is restarted upon |
|
|
the acceptable ACK that was used to detect the spurious timeout. As |
|
|
a result, the delay spike is already implicitly factored in for |
|
|
segments outstanding at that time. This is discussed in more detail |
|
|
in [EL04], where this effect is called the "RTO offset". |
|
|
Furthermore, if timestamps are enabled, a new and valid RTT-SAMPLE |
|
|
can be derived from that acceptable ACK. This RTT-SAMPLE must be |
|
|
relatively large, as it includes the delay spike that caused the |
|
|
spurious timeout. Consequently, the RTT estimators will be updated |
|
|
rather conservatively. Without timestamps the RTO will stay |
|
|
conservatively backed-off due to Karn's algorithm [RFC2988] until the |
|
|
first RTT-SAMPLE can be derived from an acceptable ACK for data that |
|
|
was previously unsent when the spurious timeout occurred. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 8] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
For the new RTO to become effective, the retransmission timer has to |
|
|
be restarted. This is consistent with [RFC2988], which recommends |
|
|
restarting the retransmission timer with the arrival of an acceptable |
|
|
ACK. |
|
|
|
|
|
4. Advanced Loss Recovery is Crucial for the Eifel Response Algorithm |
|
|
|
|
|
We have studied environments where spurious timeouts and multiple |
|
|
losses from the same flight of packets often coincide [GL02], [GL03]. |
|
|
In such a case, the oldest outstanding segment arrives at the TCP |
|
|
receiver, but one or more packets from the remaining outstanding |
|
|
flight are lost. In those environments, end-to-end performance |
|
|
suffers if the Eifel response algorithm is operated without an |
|
|
advanced loss recovery scheme such as a SACK-based scheme [RFC3517] |
|
|
or NewReno [RFC3782]. The reason is TCP-Reno's aggressiveness after |
|
|
a spurious timeout. Even though TCP-Reno breaks 'packet |
|
|
conservation' (see Section 3.3) when blindly retransmitting all |
|
|
outstanding segments, it usually recovers all packets lost from that |
|
|
flight within a single round-trip time. On the contrary, the more |
|
|
conservative TCP-Reno-with-Eifel is often forced into another |
|
|
timeout. Thus, we recommend that the Eifel response algorithm always |
|
|
be operated in combination with [RFC3517] or [RFC3782]. Additional |
|
|
robustness is achieved with the Limited Transmit and Early Retransmit |
|
|
algorithms [RFC3042], [AAAB04]. |
|
|
|
|
|
Note: The SACK-based scheme we used for our simulations in [GL02] |
|
|
and [GL03] is different from the SACK-based scheme that later got |
|
|
standardized [RFC3517]. The key difference is that [RFC3517] is |
|
|
more robust to multiple losses from the same flight. It is less |
|
|
conservative in declaring that a packet has left the network, and |
|
|
is therefore less dependent on timeouts to recover genuine packet |
|
|
losses. |
|
|
|
|
|
If the NewReno algorithm [RFC3782] is used in combination with the |
|
|
Eifel response algorithm, step (1) of the NewReno algorithm SHOULD be |
|
|
modified as follows, but only if SpuriousRecovery equals SPUR_TO: |
|
|
|
|
|
(1) Three duplicate ACKs: |
|
|
When the third duplicate ACK is received and the sender is |
|
|
not already in the Fast Recovery procedure, go to step 1A. |
|
|
|
|
|
That is, the entire step 1B of the NewReno algorithm is obsolete |
|
|
because step (8) of the Eifel response algorithm avoids the case |
|
|
where three duplicate ACKs result from unnecessary go-back-N |
|
|
retransmits after a timeout. Step (8) of the Eifel response |
|
|
algorithm avoids such unnecessary go-back-N retransmits in the first |
|
|
place. However, recall that step (8) is only executed if the |
|
|
variable SpuriousRecovery equals SPUR_TO, which in turn requires a |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 9] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
detection algorithm, such as the Eifel detection algorithm [RFC3522] |
|
|
or the F-RTO algorithm [SK04], that detects a spurious retransmit |
|
|
based upon receiving an ACK for an original transmit (as opposed to |
|
|
the ACK for the retransmit [RFC3708]). |
|
|
|
|
|
5. Security Considerations |
|
|
|
|
|
There is a risk that a detection algorithm is fooled by spoofed ACKs |
|
|
that make genuine retransmits appear to the TCP sender as spurious |
|
|
retransmits. When such a detection algorithm is run together with |
|
|
the Eifel response algorithm, this could effectively disable |
|
|
congestion control at the TCP sender. Should this become a concern, |
|
|
the Eifel response algorithm SHOULD only be run together with |
|
|
detection algorithms that are known to be safe against such "ACK |
|
|
spoofing attacks". |
|
|
|
|
|
For example, the safe variant of the Eifel detection algorithm |
|
|
[RFC3522], is a reliable method to protect against this risk. |
|
|
|
|
|
6. Acknowledgements |
|
|
|
|
|
Many thanks to Keith Sklower, Randy Katz, Michael Meyer, Stephan |
|
|
Baucke, Sally Floyd, Vern Paxson, Mark Allman, Ethan Blanton, Pasi |
|
|
Sarolahti, Alexey Kuznetsov, and Yogesh Swami for many discussions |
|
|
that contributed to this work. |
|
|
|
|
|
7. References |
|
|
|
|
|
7.1. Normative References |
|
|
|
|
|
[RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion |
|
|
Control", RFC 2581, April 1999. |
|
|
|
|
|
[RFC3390] Allman, M., Floyd, S., and C. Partridge, "Increasing TCP's |
|
|
Initial Window", RFC 3390, October 2002. |
|
|
|
|
|
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate |
|
|
Requirement Levels", BCP 14, RFC 2119, March 1997. |
|
|
|
|
|
[RFC3782] Floyd, S., Henderson, T., and A. Gurtov, "The NewReno |
|
|
Modification to TCP's Fast Recovery Algorithm", RFC 3782, |
|
|
April 2004. |
|
|
|
|
|
[RFC2861] Handley, M., Padhye, J., and S. Floyd, "TCP Congestion |
|
|
Window Validation", RFC 2861, June 2000. |
|
|
|
|
|
[RFC3522] Ludwig, R. and M. Meyer, "The Eifel Detection Algorithm for |
|
|
TCP", RFC 3522, April 2003. |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 10] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
[RFC2988] Paxson, V. and M. Allman, "Computing TCP's Retransmission |
|
|
Timer", RFC 2988, November 2000. |
|
|
|
|
|
[RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC |
|
|
793, September 1981. |
|
|
|
|
|
[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition of |
|
|
Explicit Congestion Notification (ECN) to IP", RFC 3168, |
|
|
September 2001. |
|
|
|
|
|
7.2. Informative References |
|
|
|
|
|
[RFC3042] Allman, M., Balakrishnan, H., and S. Floyd, "Enhancing |
|
|
TCP's Loss Recovery Using Limited Transmit", RFC 3042, |
|
|
January 2001. |
|
|
|
|
|
[AAAB04] Allman, M., Avrachenkov, K., Ayesta, U., and J. Blanton, |
|
|
Early Retransmit for TCP and SCTP, Work in Progress, July |
|
|
2004. |
|
|
|
|
|
[BA02] Blanton, E. and M. Allman, On Making TCP More Robust to |
|
|
Packet Reordering, ACM Computer Communication Review, Vol. |
|
|
32, No. 1, January 2002. |
|
|
|
|
|
[RFC3708] Blanton, E. and M. Allman, "Using TCP Duplicate Selective |
|
|
Acknowledgement (DSACKs) and Stream Control Transmission |
|
|
Protocol (SCTP) Duplicate Transmission Sequence Numbers |
|
|
(TSNs) to Detect Spurious Retransmissions", RFC 3708, |
|
|
February 2004. |
|
|
|
|
|
[RFC3517] Blanton, E., Allman, M., Fall, K., and L. Wang, "A |
|
|
Conservative Selective Acknowledgment (SACK)-based Loss |
|
|
Recovery Algorithm for TCP", RFC 3517, April 2003. |
|
|
|
|
|
[EL04] Ekstrom, H. and R. Ludwig, The Peak-Hopper: A New End-to- |
|
|
End Retransmission Timer for Reliable Unicast Transport, In |
|
|
Proceedings of IEEE INFOCOM 04, March 2004. |
|
|
|
|
|
[RFC2883] Floyd, S., Mahdavi, J., Mathis, M., and M. Podolsky, "An |
|
|
Extension to the Selective Acknowledgement (SACK) Option |
|
|
for TCP", RFC 2883, July 2000. |
|
|
|
|
|
[GL02] Gurtov, A. and R. Ludwig, Evaluating the Eifel Algorithm |
|
|
for TCP in a GPRS Network, In Proceedings of the European |
|
|
Wireless Conference, February 2002. |
|
|
|
|
|
[GL03] Gurtov, A. and R. Ludwig, Responding to Spurious Timeouts |
|
|
in TCP, In Proceedings of IEEE INFOCOM 03, April 2003. |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 11] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
[Jac88] Jacobson, V., Congestion Avoidance and Control, In |
|
|
Proceedings of ACM SIGCOMM 88. |
|
|
|
|
|
[RFC1323] Jacobson, V., Braden, R., and D. Borman, "TCP Extensions |
|
|
for High Performance", RFC 1323, May 1992. |
|
|
|
|
|
[KP87] Karn, P. and C. Partridge, Improving Round-Trip Time |
|
|
Estimates in Reliable Transport Protocols, In Proceedings |
|
|
of ACM SIGCOMM 87. |
|
|
|
|
|
[LK00] Ludwig, R. and R. H. Katz, The Eifel Algorithm: Making TCP |
|
|
Robust Against Spurious Retransmissions, ACM Computer |
|
|
Communication Review, Vol. 30, No. 1, January 2000. |
|
|
|
|
|
[SK04] Sarolahti, P. and M. Kojo, F-RTO: An Algorithm for |
|
|
Detecting Spurious Retransmission Timeouts with TCP and |
|
|
SCTP, Work in Progress, November 2004. |
|
|
|
|
|
[WS95] Wright, G. R. and W. R. Stevens, TCP/IP Illustrated, Volume |
|
|
2 (The Implementation), Addison Wesley, January 1995. |
|
|
|
|
|
[Zh86] Zhang, L., Why TCP Timers Don't Work Well, In Proceedings |
|
|
of ACM SIGCOMM 88. |
|
|
|
|
|
Authors' Addresses |
|
|
|
|
|
Reiner Ludwig |
|
|
Ericsson Research (EDD) |
|
|
Ericsson Allee 1 |
|
|
52134 Herzogenrath, Germany |
|
|
|
|
|
EMail: Reiner.Ludwig@ericsson.com |
|
|
|
|
|
|
|
|
Andrei Gurtov |
|
|
Helsinki Institute for Information Technology (HIIT) |
|
|
P.O. Box 9800, FIN-02015 |
|
|
HUT, Finland |
|
|
|
|
|
EMail: andrei.gurtov@cs.helsinki.fi |
|
|
Homepage: http://www.cs.helsinki.fi/u/gurtov |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 12] |
|
|
|
|
|
RFC 4015 The Eifel Response Algorithm for TCP February 2005 |
|
|
|
|
|
|
|
|
Full Copyright Statement |
|
|
|
|
|
Copyright (C) The Internet Society (2005). |
|
|
|
|
|
This document is subject to the rights, licenses and restrictions |
|
|
contained in BCP 78, and except as set forth therein, the authors |
|
|
retain all their rights. |
|
|
|
|
|
This document and the information contained herein are provided on an |
|
|
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS |
|
|
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET |
|
|
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, |
|
|
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE |
|
|
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED |
|
|
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
|
|
|
|
|
Intellectual Property |
|
|
|
|
|
The IETF takes no position regarding the validity or scope of any |
|
|
Intellectual Property Rights or other rights that might be claimed to |
|
|
pertain to the implementation or use of the technology described in |
|
|
this document or the extent to which any license under such rights |
|
|
might or might not be available; nor does it represent that it has |
|
|
made any independent effort to identify any such rights. Information |
|
|
on the IETF's procedures with respect to rights in IETF Documents can |
|
|
be found in BCP 78 and BCP 79. |
|
|
|
|
|
Copies of IPR disclosures made to the IETF Secretariat and any |
|
|
assurances of licenses to be made available, or the result of an |
|
|
attempt made to obtain a general license or permission for the use of |
|
|
such proprietary rights by implementers or users of this |
|
|
specification can be obtained from the IETF on-line IPR repository at |
|
|
http://www.ietf.org/ipr. |
|
|
|
|
|
The IETF invites any interested party to bring to its attention any |
|
|
copyrights, patents or patent applications, or other proprietary |
|
|
rights that may cover technology that may be required to implement |
|
|
this standard. Please address the information to the IETF at ietf- |
|
|
ipr@ietf.org. |
|
|
|
|
|
|
|
|
Acknowledgement |
|
|
|
|
|
Funding for the RFC Editor function is currently provided by the |
|
|
Internet Society. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Gurtov Standards Track [Page 13] |
|
|
|
|
|
|