Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Dec 1999 12:50:50 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        John Baldwin <jhb@FreeBSD.ORG>
Cc:        FreeBSD Hackers <freebsd-current@FreeBSD.ORG>
Subject:   Odd TCP glitches in new currents
Message-ID:  <199912212050.MAA84567@apollo.backplane.com>

next in thread | raw e-mail | index | archive | help
    I think this may be due to the timing changes.  While typing over a
    TCP connection, running a remote X client (such as netscape), and so
    forth I sometimes see momentary 1/10 second hangs, even on a clean,
    empty network.

    For a while I thought it was packet loss, but then I realized that it
    wasn't (plus I replaced my HUB with a switch).  ping always succeeds
    wonderfully, even -f, even with various packet sizes, yet TCP connections
    get momentary hangs.

On machine A
                527 data packets (528796 bytes) retransmitted
                527 data packets (528796 bytes) retransmitted
                527 data packets (528796 bytes) retransmitted
                527 data packets (528796 bytes) retransmitted
                528 data packets (528872 bytes) retransmitted
                528 data packets (528872 bytes) retransmitted
                528 data packets (528872 bytes) retransmitted

On machine B
                658 completely duplicate packets (197326 bytes)
                659 completely duplicate packets (197402 bytes)
                659 completely duplicate packets (197402 bytes)

    I think the problem is that the TCP connection is not waiting long
    enough for the returned ack. 

lander:/home/dillon# route -n get apollo
   route to: 216.240.41.2
destination: 216.240.41.2
  interface: rl0
      flags: <UP,HOST,DONE,LLINFO,WASCLONED>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0      8015        24        22         0      1500      1185 

    I have NOT tested this fix yet, so I don't know if it works, but I
    believe the problem is that on high speed networks the milliscond round
    trip delay is short enough that you can get 1-tick timeouts.

    24 msec translates to how many ticks?  Essentially just 1.

    What happens when you specify a 1-tick timeout and the tick interrupt
    occurs a microsecond later?  For that matter what happens when you want
    1.5 ticks worth of timeout?  Do you get only 1?  What happens is that
    the TCP stack thinks it timed out when it only just sent the packet a
    few microseconds ago.

    Here is a hack that should fix the problem.  The question is whether
    to do it here or whether to just add a tick gratuitously in
    callout_reset().

						-Matt

Index: tcp_input.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.99
diff -u -r1.99 tcp_input.c
--- tcp_input.c	1999/12/14 15:43:56	1.99
+++ tcp_input.c	1999/12/21 20:47:12
@@ -651,7 +651,7 @@
 					callout_stop(tp->tt_rexmt);
 				else if (!callout_active(tp->tt_persist))
 					callout_reset(tp->tt_rexmt, 
-						      tp->t_rxtcur,
+						      tp->t_rxtcur + 1,
 						      tcp_timer_rexmt, tp);
 
 				sowwakeup(so);
@@ -1541,7 +1541,7 @@
 			callout_stop(tp->tt_rexmt);
 			needoutput = 1;
 		} else if (!callout_active(tp->tt_persist))
-			callout_reset(tp->tt_rexmt, tp->t_rxtcur,
+			callout_reset(tp->tt_rexmt, tp->t_rxtcur + 1,
 				      tcp_timer_rexmt, tp);
 
 		/*
Index: tcp_output.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_output.c,v
retrieving revision 1.36
diff -u -r1.36 tcp_output.c
--- tcp_output.c	1999/08/30 21:17:06	1.36
+++ tcp_output.c	1999/12/21 20:47:09
@@ -668,7 +668,7 @@
 		 */
 		if (!callout_active(tp->tt_rexmt) &&
 		    tp->snd_nxt != tp->snd_una) {
-			callout_reset(tp->tt_rexmt, tp->t_rxtcur,
+			callout_reset(tp->tt_rexmt, tp->t_rxtcur + 1,
 				      tcp_timer_rexmt, tp);
 			if (callout_active(tp->tt_persist)) {
 				callout_stop(tp->tt_persist);


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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