[e2e] TCP ssthresh setting after retransmission timeouts

Mark Allman mallman at grc.nasa.gov
Mon Jul 7 08:58:30 PDT 2003

> If a TCP connection with cwnd = CWND segment experiences a retransmission
> timeout, then 
> 	Rule 1: ssthresh is set to max(cwnd / 2, 2) segments and cwnd is set
> to 1 segment or
> 	Rule 2: ssthresh is set to max(FlightSize / 2, 2) segments and cwnd
> is set to 1 segment as specified in RFC2581.
> Most implementations seem to follow rule 1, including FreeBSD and NetBSD.
> Q1. What happens if there is a second retransmission timeout
> without snd.una having advanced? Rule 1 implies that ssthresh is
> set to 2 segments. Under rule 2, the value of ssthresh will depend
> on the definition of FightSize. Is FlightSize in this example
> equal to 1 or CWND segments? Depending on the definition, under
> rule 2, sshthresh will be set to 2 or CWND/2 on this and any
> subsequent retransmission timeouts. Which one is it?

You're right, it is quite ambiguous in the spec (sigh).

I think the right answer is ssthresh gets set to 2*SMSS bytes.
(Just my hit, though.)

> Q2. Many publications imply that the window size is "halved" on
> each such retransmission timeout, which sounds reasonable. I guess
> that really is not true.

Right.  When the RTO fires the window is not halved -- it is cut to
1 segment.  However, if the TCP can recover from the losses without
incurring an RTO (using fast retransmit, newreno, sack, etc.) then
the window is halved.

I hope that helps!


Mark Allman -- BBN/NASA GRC -- http://roland.grc.nasa.gov/~mallman/

More information about the end2end-interest mailing list