|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Network Working Group R. Ludwig |
|
|
Request for Comments: 3522 M. Meyer |
|
|
Category: Experimental Ericsson Research |
|
|
April 2003 |
|
|
|
|
|
|
|
|
The Eifel Detection Algorithm for TCP |
|
|
|
|
|
Status of this Memo |
|
|
|
|
|
This memo defines an Experimental Protocol for the Internet |
|
|
community. It does not specify an Internet standard of any kind. |
|
|
Discussion and suggestions for improvement are requested. |
|
|
Distribution of this memo is unlimited. |
|
|
|
|
|
Copyright Notice |
|
|
|
|
|
Copyright (C) The Internet Society (2003). All Rights Reserved. |
|
|
|
|
|
Abstract |
|
|
|
|
|
The Eifel detection algorithm allows a TCP sender to detect a |
|
|
posteriori whether it has entered loss recovery unnecessarily. It |
|
|
requires that the TCP Timestamps option defined in RFC 1323 be |
|
|
enabled for a connection. The Eifel detection algorithm makes use of |
|
|
the fact that the TCP Timestamps option eliminates the retransmission |
|
|
ambiguity in TCP. Based on the timestamp of the first acceptable ACK |
|
|
that arrives during loss recovery, it decides whether loss recovery |
|
|
was entered unnecessarily. The Eifel detection algorithm provides a |
|
|
basis for future TCP enhancements. This includes response algorithms |
|
|
to back out of loss recovery by restoring a TCP sender's congestion |
|
|
control state. |
|
|
|
|
|
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 likewise |
|
|
be applied to data segments as opposed to octets. However, with |
|
|
repacketization, 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 |
|
|
algorithm, this makes no difference as it also operates correctly |
|
|
when repacketization occurs. |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 1] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
We use the term 'acceptable ACK' as defined in [RFC793]. That is an |
|
|
ACK that acknowledges previously unacknowledged data. We use the |
|
|
term 'duplicate ACK', and the variable 'dupacks' as defined in |
|
|
[WS95]. The variable 'dupacks' is a counter of duplicate ACKs that |
|
|
have already been received by a TCP sender before the fast retransmit |
|
|
is sent. We use the variable 'DupThresh' to refer to the so-called |
|
|
duplicate acknowledgement threshold, i.e., the number of duplicate |
|
|
ACKs that need to arrive at a TCP sender to trigger a fast |
|
|
retransmit. Currently, DupThresh is specified as a fixed value of |
|
|
three [RFC2581]. Future TCPs might implement an adaptive DupThresh. |
|
|
|
|
|
1. Introduction |
|
|
|
|
|
The retransmission ambiguity problem [Zh86], [KP87] is a TCP sender's |
|
|
inability to distinguish whether the first acceptable ACK that |
|
|
arrives after a retransmit was sent in response to the original |
|
|
transmit or the retransmit. This problem occurs after a timeout- |
|
|
based retransmit and after a fast retransmit. The Eifel detection |
|
|
algorithm uses the TCP Timestamps option defined in [RFC1323] to |
|
|
eliminate the retransmission ambiguity. It thereby allows a TCP |
|
|
sender to detect a posteriori whether it has entered loss recovery |
|
|
unnecessarily. |
|
|
|
|
|
This added capability of a TCP sender is useful in environments where |
|
|
TCP's loss recovery and congestion control algorithms may often get |
|
|
falsely triggered. This can be caused by packet reordering, packet |
|
|
duplication, or a sudden delay increase in the data or the ACK path |
|
|
that results in a spurious timeout. For example, such sudden delay |
|
|
increases can often occur in wide-area wireless access networks due |
|
|
to handovers, resource preemption due to higher priority traffic |
|
|
(e.g., voice), or because the mobile transmitter traverses through a |
|
|
radio coverage hole (e.g., see [Gu01]). In such wireless networks, |
|
|
the often unnecessary go-back-N retransmits that typically occur |
|
|
after a spurious timeout create a serious problem. They decrease |
|
|
end-to-end throughput, are useless load upon the network, and waste |
|
|
transmission (battery) power. Note that across such networks the use |
|
|
of timestamps is recommended anyway [RFC3481]. |
|
|
|
|
|
Based on the Eifel detection algorithm, a TCP sender may then choose |
|
|
to implement dedicated response algorithms. One goal of such a |
|
|
response algorithm would be to alleviate the consequences of a |
|
|
falsely triggered loss recovery. This may include restoring the TCP |
|
|
sender's congestion control state, and avoiding the mentioned |
|
|
unnecessary go-back-N retransmits. Another goal would be to adapt |
|
|
protocol parameters such as the duplicate acknowledgement threshold |
|
|
[RFC2581], and the RTT estimators [RFC2988]. This is to reduce the |
|
|
risk of falsely triggering TCP's loss recovery again as the |
|
|
connection progresses. However, such response algorithms are outside |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 2] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
the scope of this document. Note: The original proposal, the "Eifel |
|
|
algorithm" [LK00], comprises both a detection and a response |
|
|
algorithm. This document only defines the detection part. The |
|
|
response part is defined in [LG03]. |
|
|
|
|
|
A key feature of the Eifel detection algorithm is that it already |
|
|
detects, upon the first acceptable ACK that arrives during loss |
|
|
recovery, whether a fast retransmit or a timeout was spurious. This |
|
|
is crucial to be able to avoid the mentioned go-back-N retransmits. |
|
|
Another feature is that the Eifel detection algorithm is fairly |
|
|
robust against the loss of ACKs. |
|
|
|
|
|
Also the DSACK option [RFC2883] can be used to detect a posteriori |
|
|
whether a TCP sender has entered loss recovery unnecessarily [BA02]. |
|
|
However, the first ACK carrying a DSACK option usually arrives at a |
|
|
TCP sender only after loss recovery has already terminated. Thus, |
|
|
the DSACK option cannot be used to eliminate the retransmission |
|
|
ambiguity. Consequently, it cannot be used to avoid the mentioned |
|
|
unnecessary go-back-N retransmits. Moreover, a DSACK-based detection |
|
|
algorithm is less robust against ACK losses. A recent proposal based |
|
|
on neither the TCP timestamps nor the DSACK option does not have the |
|
|
limitation of DSACK-based schemes, but only addresses the case of |
|
|
spurious timeouts [SK03]. |
|
|
|
|
|
2. Events that Falsely Trigger TCP Loss Recovery |
|
|
|
|
|
The following events may falsely trigger a TCP sender's loss recovery |
|
|
and congestion control algorithms. This causes a so-called spurious |
|
|
retransmit, and an unnecessary reduction of the TCP sender's |
|
|
congestion window and slow start threshold [RFC2581]. |
|
|
|
|
|
- Spurious timeout |
|
|
|
|
|
- Packet reordering |
|
|
|
|
|
- Packet duplication |
|
|
|
|
|
A spurious timeout is a timeout that would not have occurred had the |
|
|
sender "waited longer". This may be caused by increased delay that |
|
|
suddenly occurs in the data and/or the ACK path. That in turn might |
|
|
cause an acceptable ACK to arrive too late, i.e., only after a TCP |
|
|
sender's retransmission timer has expired. For the purpose of |
|
|
specifying the algorithm in Section 3, we define this case as SPUR_TO |
|
|
(equal 1). |
|
|
|
|
|
Note: There is another case where a timeout would not have |
|
|
occurred had the sender "waited longer": the retransmission timer |
|
|
expires, and afterwards the TCP sender receives the duplicate ACK |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 3] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
that would have triggered a fast retransmit of the oldest |
|
|
outstanding segment. We call this a 'fast timeout', since in |
|
|
competition with the fast retransmit algorithm the timeout was |
|
|
faster. However, a fast timeout is not spurious since apparently |
|
|
a segment was in fact lost, i.e., loss recovery was initiated |
|
|
rightfully. In this document, we do not consider fast timeouts. |
|
|
|
|
|
Packet reordering in the network may occur because IP [RFC791] does |
|
|
not guarantee in-order delivery of packets. Additionally, a TCP |
|
|
receiver generates a duplicate ACK for each segment that arrives |
|
|
out-of-order. This results in a spurious fast retransmit if three or |
|
|
more data segments arrive out-of-order at a TCP receiver, and at |
|
|
least three of the resulting duplicate ACKs arrive at the TCP sender. |
|
|
This assumes that the duplicate acknowledgement threshold is set to |
|
|
three as defined in [RFC2581]. |
|
|
|
|
|
Packet duplication may occur because a receiving IP does not (cannot) |
|
|
remove packets that have been duplicated in the network. A TCP |
|
|
receiver in turn also generates a duplicate ACK for each duplicate |
|
|
segment. As with packet reordering, this results in a spurious fast |
|
|
retransmit if duplication of data segments or ACKs results in three |
|
|
or more duplicate ACKs to arrive at a TCP sender. Again, this |
|
|
assumes that the duplicate acknowledgement threshold is set to three. |
|
|
|
|
|
The negative impact on TCP performance caused by packet reordering |
|
|
and packet duplication is commonly the same: a single spurious |
|
|
retransmit (the fast retransmit), and the unnecessary halving of a |
|
|
TCP sender's congestion window as a result of the subsequent fast |
|
|
recovery phase [RFC2581]. |
|
|
|
|
|
The negative impact on TCP performance caused by a spurious timeout |
|
|
is more severe. First, the timeout event itself causes a single |
|
|
spurious retransmit, and unnecessarily forces a TCP sender into slow |
|
|
start [RFC2581]. Then, as the connection progresses, a chain |
|
|
reaction gets triggered that further decreases TCP's performance. |
|
|
Since the timeout was spurious, at least some ACKs for original |
|
|
transmits typically arrive at the TCP sender before the ACK for the |
|
|
retransmit arrives. (This is unless severe packet reordering |
|
|
coincided with the spurious timeout in such a way that the ACK for |
|
|
the retransmit is the first acceptable ACK to arrive at the TCP |
|
|
sender.) Those ACKs for original transmits then trigger an implicit |
|
|
go-back-N loss recovery at the TCP sender [LK00]. Assuming that none |
|
|
of the outstanding segments and none of the corresponding ACKs were |
|
|
lost, all outstanding segments get retransmitted unnecessarily. In |
|
|
fact, during this phase, a TCP sender violates the packet |
|
|
conservation principle [Jac88]. This is because the unnecessary go- |
|
|
back-N retransmits are sent during slow start. Thus, for each packet |
|
|
that leaves the network and that belongs to the first half of the |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 4] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
original flight, two useless retransmits are sent into the network. |
|
|
In addition, some TCPs suffer from a spurious fast retransmit. This |
|
|
is because the unnecessary go-back-N retransmits arrive as duplicates |
|
|
at the TCP receiver, which in turn triggers a series of duplicate |
|
|
ACKs. Note that this last spurious fast retransmit could be avoided |
|
|
with the careful variant of 'bugfix' [RFC2582]. |
|
|
|
|
|
More detailed explanations, including TCP trace plots that visualize |
|
|
the effects of spurious timeouts and packet reordering, can be found |
|
|
in the original proposal [LK00]. |
|
|
|
|
|
3. The Eifel Detection Algorithm |
|
|
|
|
|
3.1 The Idea |
|
|
|
|
|
The goal of the Eifel detection algorithm is to allow a TCP sender to |
|
|
detect a posteriori whether it has entered loss recovery |
|
|
unnecessarily. Furthermore, the TCP sender should be able to make |
|
|
this decision upon the first acceptable ACK that arrives after the |
|
|
timeout-based retransmit or the fast retransmit has been sent. This |
|
|
in turn requires extra information in ACKs by which the TCP sender |
|
|
can unambiguously distinguish whether that first acceptable ACK was |
|
|
sent in response to the original transmit or the retransmit. Such |
|
|
extra information is provided by the TCP Timestamps option [RFC1323]. |
|
|
Generally speaking, timestamps are monotonously increasing "serial |
|
|
numbers" added into every segment that are then echoed within the |
|
|
corresponding ACKs. This is exploited by the Eifel detection |
|
|
algorithm in the following way. |
|
|
|
|
|
Given that timestamps are enabled for a connection, a TCP sender |
|
|
always stores the timestamp of the retransmit sent in the beginning |
|
|
of loss recovery, i.e., the timestamp of the timeout-based retransmit |
|
|
or the fast retransmit. If the timestamp of the first acceptable |
|
|
ACK, that arrives after the retransmit was sent, is smaller then the |
|
|
stored timestamp of that retransmit, then that ACK must have been |
|
|
sent in response to an original transmit. Hence, the TCP sender must |
|
|
have entered loss recovery unnecessarily. |
|
|
|
|
|
The fact that the Eifel detection algorithm decides upon the first |
|
|
acceptable ACK is crucial to allow future response algorithms to |
|
|
avoid the unnecessary go-back-N retransmits that typically occur |
|
|
after a spurious timeout. Also, if loss recovery was entered |
|
|
unnecessarily, a window worth of ACKs are outstanding that all carry |
|
|
a timestamp that is smaller than the stored timestamp of the |
|
|
retransmit. The arrival of any one of those ACKs is sufficient for |
|
|
the Eifel detection algorithm to work. Hence, the solution is fairly |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 5] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
robust against ACK losses. Even the ACK sent in response to the |
|
|
retransmit, i.e., the one that carries the stored timestamp, may get |
|
|
lost without compromising the algorithm. |
|
|
|
|
|
3.2 The Algorithm |
|
|
|
|
|
Given that the TCP Timestamps option [RFC1323] is enabled for a |
|
|
connection, a TCP sender MAY use the Eifel detection algorithm as |
|
|
defined in this subsection. |
|
|
|
|
|
If the Eifel detection algorithm is used, the following steps MUST be |
|
|
taken by a TCP sender, but only upon initiation of loss recovery, |
|
|
i.e., when either the timeout-based retransmit or the fast retransmit |
|
|
is sent. The Eifel detection algorithm MUST NOT be reinitiated after |
|
|
loss recovery has already started. In particular, it must not be |
|
|
reinitiated upon subsequent timeouts for the same segment, and not |
|
|
upon retransmitting segments other than the oldest outstanding |
|
|
segment, e.g., during selective loss recovery. |
|
|
|
|
|
(1) Set a "SpuriousRecovery" variable to FALSE (equal 0). |
|
|
|
|
|
(2) Set a "RetransmitTS" variable to the value of the |
|
|
Timestamp Value field of the Timestamps option included in |
|
|
the retransmit sent when loss recovery is initiated. A |
|
|
TCP sender must ensure that RetransmitTS does not get |
|
|
overwritten as loss recovery progresses, e.g., in case of |
|
|
a second timeout and subsequent second retransmit of the |
|
|
same octet. |
|
|
|
|
|
(3) Wait for the arrival of an acceptable ACK. When an |
|
|
acceptable ACK has arrived, proceed to step (4). |
|
|
|
|
|
(4) If the value of the Timestamp Echo Reply field of the |
|
|
acceptable ACK's Timestamps option is smaller than the |
|
|
value of RetransmitTS, then proceed to step (5), |
|
|
|
|
|
else proceed to step (DONE). |
|
|
|
|
|
(5) If the acceptable ACK carries a DSACK option [RFC2883], |
|
|
then proceed to step (DONE), |
|
|
|
|
|
else if during the lifetime of the TCP connection the TCP |
|
|
sender has previously received an ACK with a DSACK option, |
|
|
or the acceptable ACK does not acknowledge all outstanding |
|
|
data, then proceed to step (6), |
|
|
|
|
|
else proceed to step (DONE). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 6] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
(6) If the loss recovery has been initiated with a timeout- |
|
|
based retransmit, then set |
|
|
SpuriousRecovery <- SPUR_TO (equal 1), |
|
|
|
|
|
else set |
|
|
SpuriousRecovery <- dupacks+1 |
|
|
|
|
|
(RESP) Do nothing (Placeholder for a response algorithm). |
|
|
|
|
|
(DONE) No further processing. |
|
|
|
|
|
The comparison "smaller than" in step (4) is conservative. In |
|
|
theory, if the timestamp clock is slow or the network is fast, |
|
|
RetransmitTS could at most be equal to the timestamp echoed by an ACK |
|
|
sent in response to an original transmit. In that case, it is |
|
|
assumed that the loss recovery was not falsely triggered. |
|
|
|
|
|
Note that the condition "if during the lifetime of the TCP connection |
|
|
the TCP sender has previously received an ACK with a DSACK option" in |
|
|
step (5) would be true in case the TCP receiver would signal in the |
|
|
SYN that it is DSACK-enabled. But unfortunately, this is not |
|
|
required by [RFC2883]. |
|
|
|
|
|
3.3 A Corner Case: "Timeout due to loss of all ACKs" (step 5) |
|
|
|
|
|
Even though the oldest outstanding segment arrived at a TCP receiver, |
|
|
the TCP sender is forced into a timeout if all ACKs are lost. |
|
|
Although the resulting retransmit is unnecessary, such a timeout is |
|
|
unavoidable. It should therefore not be considered spurious. |
|
|
Moreover, the subsequent reduction of the congestion window is an |
|
|
appropriate response to the potentially heavy congestion in the ACK |
|
|
path. The original proposal [LK00] does not handle this case well. |
|
|
It effectively disables this implicit form of congestion control for |
|
|
the ACK path, which otherwise does not exist in TCP. This problem is |
|
|
fixed by step (5) of the Eifel detection algorithm as explained in |
|
|
the remainder of this section. |
|
|
|
|
|
If all ACKs are lost while the oldest outstanding segment arrived at |
|
|
the TCP receiver, the retransmit arrives as a duplicate. In response |
|
|
to duplicates, RFC 1323 mandates that the timestamp of the last |
|
|
segment that arrived in-sequence should be echoed. That timestamp is |
|
|
carried by the first acceptable ACK that arrives at the TCP sender |
|
|
after loss recovery was entered, and is commonly smaller than the |
|
|
timestamp carried by the retransmit. Consequently, the Eifel |
|
|
detection algorithm misinterprets such a timeout as being spurious, |
|
|
unless the TCP receiver is DSACK-enabled [RFC2883]. In that case, |
|
|
the acceptable ACK carries a DSACK option, and the Eifel algorithm is |
|
|
terminated through the first part of step (5). |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 7] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
Note: Not all TCP implementations strictly follow RFC 1323. In |
|
|
response to a duplicate data segment, some TCP receivers echo the |
|
|
timestamp of the duplicate. With such TCP receivers, the corner |
|
|
case discussed in this section does not apply. The timestamp |
|
|
carried by the retransmit would be echoed in the first acceptable |
|
|
ACK, and the Eifel detection algorithm would be terminated through |
|
|
step (4). Thus, even though all ACKs were lost and independent of |
|
|
whether the DSACK option was enabled for a connection, the Eifel |
|
|
detection algorithm would have no effect. |
|
|
|
|
|
With TCP receivers that are not DSACK-enabled, disabling the |
|
|
mentioned implicit congestion control for the ACK path is not a |
|
|
problem as long as data segments are lost, in addition to the entire |
|
|
flight of ACKs. The Eifel detection algorithm misinterprets such a |
|
|
timeout as being spurious, and the Eifel response algorithm would |
|
|
reverse the congestion control state. Still, the TCP sender would |
|
|
respond to congestion (in the data path) as soon as it finds out |
|
|
about the first loss in the outstanding flight. I.e., the TCP sender |
|
|
would still halve its congestion window for that flight of packets. |
|
|
If no data segment is lost while the entire flight of ACKs is lost, |
|
|
the first acceptable ACK that arrives at the TCP sender after loss |
|
|
recovery was entered acknowledges all outstanding data. In that |
|
|
case, the Eifel algorithm is terminated through the second part of |
|
|
step (5). |
|
|
|
|
|
Note that there is little concern about violating the packet |
|
|
conservation principle when entering slow start after an unavoidable |
|
|
timeout caused by the loss of an entire flight of ACKs, i.e., when |
|
|
the Eifel detection algorithm was terminated through step (5). This |
|
|
is because in that case, the acceptable ACK corresponds to the |
|
|
retransmit, which is a strong indication that the pipe has drained |
|
|
entirely, i.e., that no more original transmits are in the network. |
|
|
This is different with spurious timeouts as discussed in Section 2. |
|
|
|
|
|
3.4 Protecting Against Misbehaving TCP Receivers (the Safe Variant) |
|
|
|
|
|
A TCP receiver can easily make a genuine retransmit appear to the TCP |
|
|
sender as a spurious retransmit by forging echoed timestamps. This |
|
|
may pose a security concern. |
|
|
|
|
|
Fortunately, there is a way to modify the Eifel detection algorithm |
|
|
in a way that makes it robust against lying TCP receivers. The idea |
|
|
is to use timestamps as a segment's "secret" that a TCP receiver only |
|
|
gets to know if it receives the segment. Conversely, a TCP receiver |
|
|
will not know the timestamp of a segment that was lost. Hence, to |
|
|
"prove" that it received the original transmit of a segment that a |
|
|
TCP sender retransmitted, the TCP receiver would need to return the |
|
|
timestamp of that original transmit. The Eifel detection algorithm |
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 8] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
could then be modified to only decide that loss recovery has been |
|
|
unnecessarily entered if the first acceptable ACK echoes the |
|
|
timestamp of the original transmit. |
|
|
|
|
|
Hence, implementers may choose to implement the algorithm with the |
|
|
following modifications. |
|
|
|
|
|
Step (2) is replaced with step (2'): |
|
|
|
|
|
(2') Set a "RetransmitTS" variable to the value of the |
|
|
Timestamp Value field of the Timestamps option that was |
|
|
included in the original transmit corresponding to the |
|
|
retransmit. Note: This step requires that the TCP sender |
|
|
stores the timestamps of all outstanding original |
|
|
transmits. |
|
|
|
|
|
Step (4) is replaced with step (4'): |
|
|
|
|
|
(4') If the value of the Timestamp Echo Reply field of the |
|
|
acceptable ACK's Timestamps option is equal to the value |
|
|
of the variable RetransmitTS, then proceed to step (5), |
|
|
|
|
|
else proceed to step (DONE). |
|
|
|
|
|
These modifications come at a cost: the modified algorithm is fairly |
|
|
sensitive against ACK losses since it relies on the arrival of the |
|
|
acceptable ACK that corresponds to the original transmit. |
|
|
|
|
|
Note: The first acceptable ACK that arrives after loss recovery |
|
|
has been unnecessarily entered should echo the timestamp of the |
|
|
original transmit. This assumes that the ACK corresponding to the |
|
|
original transmit was not lost, that that ACK was not reordered in |
|
|
the network, and that the TCP receiver does not forge timestamps |
|
|
but complies with RFC 1323. In case of a spurious fast |
|
|
retransmit, this is implied by the rules for generating ACKs for |
|
|
data segments that fill in all or part of a gap in the sequence |
|
|
space (see section 4.2 of [RFC2581]) and by the rules for echoing |
|
|
timestamps in that case (see rule (C) in section 3.4 of |
|
|
[RFC1323]). In case of a spurious timeout, it is likely that the |
|
|
delay that has caused the spurious timeout has also caused the TCP |
|
|
receiver's delayed ACK timer [RFC1122] to expire before the |
|
|
original transmit arrives. Also, in this case the rules for |
|
|
generating ACKs and the rules for echoing timestamps (see rule (A) |
|
|
in section 3.4 of [RFC1323]) ensure that the original transmit's |
|
|
timestamp is echoed. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 9] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
A remaining problem is that a TCP receiver might guess a lost |
|
|
segment's timestamp from observing the timestamps of recently |
|
|
received segments. For example, if segment N was lost while segment |
|
|
N-1 and N+1 have arrived, a TCP receiver could guess the timestamp |
|
|
that lies in the middle of the timestamps of segments N-1 and N+1, |
|
|
and echo it in the ACK sent in response to the retransmit of segment |
|
|
N. Especially if the TCP sender implements timestamps with a coarse |
|
|
granularity, a misbehaving TCP receiver is likely to be successful |
|
|
with such an approach. In fact, with the 500 ms granularity |
|
|
suggested in [WS95], it even becomes quite likely that the timestamps |
|
|
of segments N-1, N, N+1 are identical. |
|
|
|
|
|
One way to reduce this risk is to implement fine grained timestamps. |
|
|
Note that the granularity of the timestamps is independent of the |
|
|
granularity of the retransmission timer. For example, some TCP |
|
|
implementations run a timestamp clock that ticks every millisecond. |
|
|
This should make it more difficult for a TCP receiver to guess the |
|
|
timestamp of a lost segment. Alternatively, it might be possible to |
|
|
combine the timestamps with a nonce, as is done for the Explicit |
|
|
Congestion Notification (ECN) [RFC3168]. One would need to take |
|
|
care, though, that the timestamps of consecutive segments remain |
|
|
monotonously increasing and do not interfere with the RTT timing |
|
|
defined in [RFC1323]. |
|
|
|
|
|
4. IPR Considerations |
|
|
|
|
|
The IETF has been notified of intellectual property rights claimed in |
|
|
regard to some or all of the specification contained in this |
|
|
document. For more information consult the online list of claimed |
|
|
rights at http://www.ietf.org/ipr. |
|
|
|
|
|
The IETF takes no position regarding the validity or scope of any |
|
|
intellectual property 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; neither does it represent that it |
|
|
has made any effort to identify any such rights. Information on the |
|
|
IETF's procedures with respect to rights in standards-track and |
|
|
standards-related documentation can be found in BCP-11. Copies of |
|
|
claims of rights made available for publication 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 implementors or users of this specification can |
|
|
be obtained from the IETF Secretariat. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 10] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
5. Security Considerations |
|
|
|
|
|
There do not seem to be any security considerations associated with |
|
|
the Eifel detection algorithm. This is because the Eifel detection |
|
|
algorithm does not alter the existing protocol state at a TCP sender. |
|
|
Note that the Eifel detection algorithm only requires changes to the |
|
|
implementation of a TCP sender. |
|
|
|
|
|
Moreover, a variant of the Eifel detection algorithm has been |
|
|
proposed in Section 3.4 that makes it robust against lying TCP |
|
|
receivers. This may become relevant when the Eifel detection |
|
|
algorithm is combined with a response algorithm such as the Eifel |
|
|
response algorithm [LG03]. |
|
|
|
|
|
Acknowledgments |
|
|
|
|
|
Many thanks to Keith Sklower, Randy Katz, Stephan Baucke, Sally |
|
|
Floyd, Vern Paxson, Mark Allman, Ethan Blanton, Andrei Gurtov, Pasi |
|
|
Sarolahti, and Alexey Kuznetsov for useful discussions that |
|
|
contributed to this work. |
|
|
|
|
|
Normative References |
|
|
|
|
|
[RFC2581] Allman, M., Paxson, V. and W. Stevens, "TCP Congestion |
|
|
Control", RFC 2581, April 1999. |
|
|
|
|
|
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate |
|
|
Requirement Levels", BCP 14, RFC 2119, March 1997. |
|
|
|
|
|
[RFC2883] Floyd, S., Mahdavi, J., Mathis, M., Podolsky, M. and A. |
|
|
Romanow, "An Extension to the Selective Acknowledgement |
|
|
(SACK) Option for TCP", RFC 2883, July 2000. |
|
|
|
|
|
[RFC1323] Jacobson, V., Braden, R. and D. Borman, "TCP Extensions for |
|
|
High Performance", RFC 1323, May 1992. |
|
|
|
|
|
[RFC2018] Mathis, M., Mahdavi, J., Floyd, S. and A. Romanow, "TCP |
|
|
Selective Acknowledgement Options", RFC 2018, October 1996. |
|
|
|
|
|
[RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC |
|
|
793, September 1981. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 11] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
Informative References |
|
|
|
|
|
[BA02] Blanton, E. and M. Allman, "Using TCP DSACKs and SCTP |
|
|
Duplicate TSNs to Detect Spurious Retransmissions", Work in |
|
|
Progress. |
|
|
|
|
|
[RFC1122] Braden, R., "Requirements for Internet Hosts - |
|
|
Communication Layers", STD 3, RFC 1122, October 1989. |
|
|
|
|
|
[RFC2582] Floyd, S. and T. Henderson, "The NewReno Modification to |
|
|
TCP's Fast Recovery Algorithm", RFC 2582, April 1999. |
|
|
|
|
|
[Gu01] Gurtov, A., "Effect of Delays on TCP Performance", In |
|
|
Proceedings of IFIP Personal Wireless Communications, |
|
|
August 2001. |
|
|
|
|
|
[RFC3481] Inamura, H., Montenegro, G., Ludwig, R., Gurtov, A. and F. |
|
|
Khafizov, "TCP over Second (2.5G) and Third (3G) Generation |
|
|
Wireless Networks", RFC 3481, February 2003. |
|
|
|
|
|
[Jac88] Jacobson, V., "Congestion Avoidance and Control", In |
|
|
Proceedings of ACM SIGCOMM 88. |
|
|
|
|
|
[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. |
|
|
|
|
|
[LG03] Ludwig, R. and A. Gurtov, "The Eifel Response Algorithm for |
|
|
TCP", Work in Progress. |
|
|
|
|
|
[RFC2988] Paxson, V. and M. Allman, "Computing TCP's Retransmission |
|
|
Timer", RFC 2988, November 2000. |
|
|
|
|
|
[RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, September |
|
|
1981. |
|
|
|
|
|
[RFC3168] Ramakrishnan, K., Floyd, S. and D. Black, "The Addition of |
|
|
Explicit Congestion Notification (ECN) to IP", RFC 3168, |
|
|
September 2001. |
|
|
|
|
|
[SK03] Sarolahti, P. and M. Kojo, "F-RTO: A TCP RTO Recovery |
|
|
Algorithm for Avoiding Unnecessary Retransmissions", Work |
|
|
in Progress. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 12] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
[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 86. |
|
|
|
|
|
Authors' Addresses |
|
|
|
|
|
Reiner Ludwig |
|
|
Ericsson Research |
|
|
Ericsson Allee 1 |
|
|
52134 Herzogenrath, Germany |
|
|
|
|
|
EMail: Reiner.Ludwig@eed.ericsson.se |
|
|
|
|
|
|
|
|
Michael Meyer |
|
|
Ericsson Research |
|
|
Ericsson Allee 1 |
|
|
52134 Herzogenrath, Germany |
|
|
|
|
|
EMail: Michael.Meyer@eed.ericsson.se |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 13] |
|
|
|
|
|
RFC 3522 The Eifel Detection Algorithm for TCP April 2003 |
|
|
|
|
|
|
|
|
Full Copyright Statement |
|
|
|
|
|
Copyright (C) The Internet Society (2003). All Rights Reserved. |
|
|
|
|
|
This document and translations of it may be copied and furnished to |
|
|
others, and derivative works that comment on or otherwise explain it |
|
|
or assist in its implementation may be prepared, copied, published |
|
|
and distributed, in whole or in part, without restriction of any |
|
|
kind, provided that the above copyright notice and this paragraph are |
|
|
included on all such copies and derivative works. However, this |
|
|
document itself may not be modified in any way, such as by removing |
|
|
the copyright notice or references to the Internet Society or other |
|
|
Internet organizations, except as needed for the purpose of |
|
|
developing Internet standards in which case the procedures for |
|
|
copyrights defined in the Internet Standards process must be |
|
|
followed, or as required to translate it into languages other than |
|
|
English. |
|
|
|
|
|
The limited permissions granted above are perpetual and will not be |
|
|
revoked by the Internet Society or its successors or assigns. |
|
|
|
|
|
This document and the information contained herein is provided on an |
|
|
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING |
|
|
TASK FORCE DISCLAIMS 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. |
|
|
|
|
|
Acknowledgement |
|
|
|
|
|
Funding for the RFC Editor function is currently provided by the |
|
|
Internet Society. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ludwig & Meyer Experimental [Page 14] |
|
|
|
|
|
|