[2469] in linux-net channel archive

home help back first fref pref prev next nref lref last post

Re: PPP is slow (and so is TCP!) [with fixes]

daemon@ATHENA.MIT.EDU (Eric Schenk)
Fri Apr 12 12:26:05 1996

To: Bernd Wiebelt <bernardo@studi.mathematik.hu-berlin.de>
cc: linux-kernel@vger.rutgers.edu, linux-net@vger.rutgers.edu,
        Alan Cox <iialan@iifeak.swan.ac.uk>
In-reply-to: Your message of "Fri, 12 Apr 1996 11:09:59 EDT."
             <Pine.LNX.3.91.960412165330.152C-100000@melian.mathematik.hu-berlin.de> 
Date: 	Fri, 12 Apr 1996 11:33:09 -0400
From: "Eric Schenk" <schenk@cs.toronto.edu>


Bernd Wiebelt <bernardo@studi.mathematik.hu-berlin.de> writes:
>
>I had some problems with pre-87-kernels, they used to 
>hang on specific http/www-sessions, and even better, 
>these hangs were reproducible (always at the same place).
>
>With 1.3.87 this works somehow, in a quite funny way:
>There are servers working under http, while they do not 
>work under ftp.
>
>For me, ftp.uni-paderborn.de:/pub/doc/guitar is such a location.
>Works under http, but when I do a "dir", the ftp-session hangs.
>
>You may also want to try out "http://happypuppy.com/games/lordsoth"
>which does not work at all (I get 167 bytes until connection dies).

The removal of the tcp_send_ack in bad_tcp_sequence turns
out to have been a bad idea (TM). I stupidly forgot that
more than one ACK packet can be lost at a time. (doh)
To avoid retransmission storms with Solaris we probably still
want to make this a delayed ack, but we should probably at
least put an ack in there.

Try changing the code to bad_tcp_sequence() in tcp_input.c 
to the following:

static void bad_tcp_sequence(struct sock *sk, struct tcphdr *th, u32 end_seq,
              struct device *dev)
{
        if (th->rst)
                return;

        /*
         *      Send a reset if we get something not ours and we are
         *      unsynchronized. Note: We don't do anything to our end. We
         *      are just killing the bogus remote connection then we will
         *      connect again and it will work (with luck).
         */

        if (sk->state==TCP_SYN_SENT || sk->state==TCP_SYN_RECV)
        {
                tcp_send_reset(sk->saddr,sk->daddr,th,sk->prot,NULL,dev, sk->ip_
tos,sk->ip_ttl);
                return;
        }

        tcp_send_delayed_ack(sk, HZ/2);
}

I've got to go and do some real work right now, so I haven't tested
this yet. If you try it let me know how it works...

-- eric

---------------------------------------------------------------------------
Eric Schenk                          www: http://www.cs.toronto.edu/~schenk
Department of Computer Science	               email: schenk@cs.toronto.edu
University of Toronto


home help back first fref pref prev next nref lref last post