Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Mar 1996 14:14:11 -0800
From:      Matthew Dillon <dillon@backplane.com>
To:        bugs@FreeBSD.ORG
Cc:        "Garrett A. Wollman" <wollman@lcs.mit.edu>
Subject:   srtt calculation bug .. found
Message-ID:  <199603082214.OAA00252@apollo.backplane.com>

next in thread | raw e-mail | index | archive | help
    ok, I've found the bug with t_srtt ... the problem is mainly
    due to the lack of resolution to SLOWHZ (which is only 500ms).
    That coupled with the following:

	    delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
	    if ((tp->t_srtt += delta) <= 0)
		    tp->t_srtt = 1;

    The above equation breaks down statistically for < 500 ms RTT's.  You
    would think that if the rtt variable is 1 half the time and 2
    half the time, that srtt should wind up at around 4 (200 ms).

    Unfortunately, that does not occur because this line:

	    delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);

    Fails to generate a negative number in the case where 'rtt' is 1
    (i.e. delta time is 0 at a 500ms resolution).  However, it DOES 
    generate a positive number if rtt is 2.  The (tp->t_srtt >> TCP_RTT_SHIFT)
    also fails to generate a negative number until t_srtt reaches 8, but
    by that time it's too late.. you effectively get a random number
    depending on when you sample rather then the rtt.

    Even if you round tp->t_srtt up by 1/2 (a value of 4), it still breaks
    down statistically.

    The proper solution is to balance the weighting of an rtt of 1 and an
    rtt of 2 (i.e. a delta time of 0 and a delta time of 1).... give the
    delta time of 0 a -1 value to match the delta time of 1, as follows:

            delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
	    if (delta == 0)		/* ADD ME */
		delta = -1;		/* ADD ME */
            if ((tp->t_srtt += delta) <= 0)
                    tp->t_srtt = 1;

    Now you have a reasonably balanced weighting and the statistical
    calculation no longer breaks down for round trip times < 500ms.

    There is one other problem, and that is where you update the route
    table rtt when t_rttupdated >= 16.  16 may not be a high enough
    number to handle round trip times < 10 ms with a 500 ms timer
    resolution.

    The solution is to either increase the timer resolution or to increase
    rttupdated... though obviously there are practical limits to how
    large rttupdated can be and still work.

    --

    I have tested this on a slip link, and the route table entries come
    up with the correct round trip time with the fix in, and the completely
    incorrect round trip time without the fix.

						-Matt

    Matthew Dillon   Engineering, BEST Internet Communications, Inc.
		     <dillon@apollo.backplane.com>
    [always include a portion of the original email in any response!]



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199603082214.OAA00252>