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 [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message