[e2e] Question about RFC 2581
Michael Welzl
michael.welzl at uibk.ac.at
Wed Jan 12 12:32:17 PST 2005
Dear all,
I'm surprised that nobody seems to care about this message.
Is this issue really negligible? I think not.
I can imagine that sending only 2 segments in the third RTT
(case 2 below) can lead to quite a deviation from the desired
one-segment-per-RTT increase behavior when the rate is
small (when fast recovery sets in).
Cheers,
Michael
----- Original Message -----
From: "Agarwal, Anil" <Anil.Agarwal at viasat.com>
To: <end2end-interest at postel.org>
Sent: Tuesday, January 11, 2005 8:08 PM
Subject: [e2e] Question about RFC 2581
> Michael Welzl wrote -
>
> RFC 2581 states:
>
> One formula commonly used to update
> cwnd during congestion avoidance is given in equation 2:
>
> cwnd += SMSS*SMSS/cwnd (2)
>
> This adjustment is executed on every incoming non-duplicate ACK.
> Equation (2) provides an acceptable approximation to the underlying
> principle of increasing cwnd by 1 full-sized segment per RTT. (Note
> that for a connection in which the receiver acknowledges every data
> segment, (2) proves slightly more aggressive than 1 segment per RTT,
> and for a receiver acknowledging every-other packet, (2) is less
> aggressive.)
>
>
> Actually, for a connection in which the receiver acknowledges every data
> segment,
> (2) is slightly **less** aggressive than 1 segment per RTT.
>
> Take an example of MSS = 1000 bytes over a link with delay >> packet
> transmission time.
> At time 0, cwnd = 1000.
>
> Case 1. cwnd is increased by 1 segment every RTT
> After 1 RTT, cwnd = 1000 + 1000 = 2000
> After 2 RTTs, cwnd = 2000 + 1000 = 3000
> After 3 RTTs, cwnd = 3000 + 1000 = 4000
>
> Case 2. cwnd is increased using (2), and only MSS sized segments are sent
> After 1 RTT, cwnd = 1000 + (1000 * 1000) / 1000 = 2000
>
> In the second RTT, 2 segments are sent and acknowledged.
> After the first ACK, cwnd = (2000 + (1000 * 1000) / 2000) = 2500
> After the second ACK, cwnd = (2500 + (1000 * 1000) / 2500) = 2900
>
> In the third RTT, 2 segments are sent and acknowledged.
> After the first ACK, cwnd = (2900 + (1000 * 1000) / 2900) = 3244
> After the second ACK, cwnd = (3244 + (1000 * 1000) / 3244) = 3552
>
> Note that cwnd is smaller than the value in Case 1 and
> remains so subsequently.
>
> Case 3. cwnd is increased using (2), and partial segments are sent
> After 1 RTT, cwnd = 1000 + (1000 * 1000) / 1000 = 2000
>
> In the second RTT, 2 segments are sent and acknowledged.
> After the first ACK, cwnd = (2000 + (1000 * 1000) / 2000) = 2500
> After the second ACK, cwnd = (2500 + (1000 * 1000) / 2500) = 2900
>
> In the third RTT, 3 segments are sent and acknowledged
> (the last segment is of size 900).
> After the first ACK, cwnd = (2900 + (1000 * 1000) / 2900) =
> 3244
> After the second ACK, cwnd = (3244 + (1000 * 1000) / 3244) =
> 3552
> After the third ACK, cwnd = (3552 + (1000 * 1000) / 3552) =
> 3833
>
> Note that cwnd is smaller than the value in Case 1,
> but larger than in Case 2, and remains so on subsequently.
>
>
> As Mark suggests, "congestion avoidance should be implemented using
> byte counting and that 1 SMSS should be added to cwnd after cwnd bytes
> have been ACKed. That is allowed in the current RFC".
>
> Would the following equation be a reasonable alternative way to do this -
> cwnd += bytes_acked * SMSS / cwnd (3)
> or
> cwnd += bytes_acked / 2 * SMSS / cwnd (4)
>
> (4) tries to capture the effect of delayed acknowledgements.
>
> The above is executed for every ack packet, and does not require
> any additional state to be maintained.
>
> For comparison, (3) with MSS sized segments, and 2 ACKs per segment,
> gives cwnd after RTT 3 = 3415.
>
> Anil
>
> Anil.Agarwal at viasat.com
>
More information about the end2end-interest
mailing list