Re: TCP Connection times out

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday 10 February 2003 13:12, you wrote:
>    From: Martin Zielinski <mz@seh.de>
>    Date: Mon, 10 Feb 2003 12:48:39 +0100
>
>    I think, you overlooked the reseting of tp->probes_out in
>    tcp_input.c - tcp_ack()  to 0 with each ACK coming back from the
> receiver. tp->packets_out must be 0 - otherwise  the relevant code in
> tcp_send_probe0 would not be reached so the code jumps to the "no_queue"
> label.
>
> And by mentioning this you unearth the real bug, tp->backoff needs
> to be reset here where tp->probes_out is reset.

No, that's not the solution.
Remember the situation:
- Linux wants to transmit data sending a packet with window size e.g. 5840
- The receiver can't use the data (printer paper empty) -> ACK window size 0
- Linux takes a timeout (tp->probes_out is zero after receiving the ACK)
... LOOP - The Timeout between these cycles is doubled by the use of 
tp->backoff (tp->rto << tp->backoff) until TCP_MAX_RTO is reached.

This is absolute correct behaviour. When (tp->rto << tp->backoff) is greater 
than TCP_MAX_RTO, the tp->backoff value is not relevant anymore. Nevertheless 
the timeout should be doubled until than. Resetting tp->backoff would cause 
the timeout to stay at its initial value. This would cause lots of traffic.

The bug is simply, that (tp->rto << tp->backoff) becomes zero after 31 or 32 
cycles (on a 32 bit machine) and the timeout becomes zero, too.

This can be avoided by adding a line in tcp_send_probe0:

+		if (min(tp->rto << (tp->backoff+1), TCP_RTO_MAX) != TCP_RTO_MAX) 
		tp->backoff++;

Perhaps someone finds a nicer solution, but this one works.

Bye,
Martin

> Can you make this change and see if this makes your problem
> go away?
>
> Alexey, anything missed here?  Maybe only reset tp->backoff when
> tp->probes_out is non-zero at this point?

-- 
Martin Zielinski       mz@seh.de

-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux