Date: Sun, 5 Mar 2000 19:33:17 +0100 From: =?iso-8859-1?Q?R=E9mi_Guyomarch?= <rguyom@mail.dotcom.fr> To: freebsd-net@FreeBSD.ORG Cc: Jonathan Lemon <jlemon@flugsvamp.com>, jayanth <jayanth@yahoo-inc.com> Subject: Re: TCP performance problems, Linux faster than FreeBSD ? Message-ID: <20000305193317.B22005@pingoo.ifn.fr> In-Reply-To: <20000303165052.C23732@pingoo.ifn.fr>; from rguyom@mail.dotcom.fr on Fri, Mar 03, 2000 at 04:50:52PM %2B0100 References: <20000303165052.C23732@pingoo.ifn.fr>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Mar 03, 2000 at 04:50:52PM +0100, Rémi Guyomarch wrote:
> 
> I have a problem with FreeBSD 3.4-STABLE. When I'm downloading from some
> sites I see a large number of duplicate packets comming in. If I download the
> same file(s) with a Linux 2.2.14 box, I don't see those duplicate packets.
> Well, a lot less I mean.
Ok, I think I've found something. I finally got the real difference
between the delayed acks implementation in Linux and *BSD stacks.
Linux sends an ack when the last non-acked packet is 200ms old, or if
there's two or more packets non-acked.
*BSD stacks just put a reference to delayed acks packets in a list, queue
or something, and read this list every 200 ms.
So, Linux use the time of the last non-acked packet as a starting
point for the 200ms timer, but *BSD stacks use a fixed 'clock'.
This is completely different !
I put an ugly hack in sys/netinet/tcp_timer.c to try to fix the
problem. And now I'm getting **way** less duplicate packets.
It's not very clear to me why sending fewer acks eliminates the
duplicate packet problem.  Maybe my 64k leased line isn't really
full-duplex (it's physically made of two wires, so it can't be really
full-duplex anyway). So sending an ack while a packet is received
cause some problems and some of my acks are lost in the process.
As I said, this patch is really ugly, this is just a proof that there
is a problem in the implementation of delayed acks in *BSD. Well, at
least I think so :-)
What do you think ?
(with this pactch, the kernel reads the delayed-ack list every 400ms
instead of 200)
void
tcp_fasttimo()
{
        register struct inpcb *inp;
        register struct tcpcb *tp;
        int s;
+       static char delay_delack = 1;
        if (tcp_delack_enabled) {
                s = splnet();
+               if( delay_delack )
+                       delay_delack = 0;
+               else {
                        for (inp = tcb.lh_first; inp != NULL; inp = inp->inp_list.le_next) {
                                if ((tp = (struct tcpcb *)inp->inp_ppcb) &&
                                    (tp->t_flags & TF_DELACK)) {
                                        tp->t_flags &= ~TF_DELACK;
                                        tp->t_flags |= TF_ACKNOW;
                                        tcpstat.tcps_delack++;
                                        (void) tcp_output(tp);
                                }
+                       delay_delack = 1;
+                       }
                }
                splx(s);
        }
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000305193317.B22005>
