The problem I see is that the client starts taking about 3 seconds
for certain connections to occur. This happens when the server is
run locally on the Linux machine and when the server is run on a
SunOS 4.1.3 or SunOS 2.3 machine. Normally, it takes only a few
milliseconds for a connection to occur.
If I run a server on the Linux machine and connect up from a SunOS 4.1.3
machine, the client gets very even connections the entire time. It
never experiences the 3 second delays.
Occasionally, I've seen Linux get stuck in the SYN_SENT state. I have
another program that connects up to a Windows NT machine. It does this
continuously, gets a response, and disconnects. It hangs in a call to
connect(), and netstat shows that the socket is in the SYN_SENT state.
The call never times out. The socket does not appear in a netstat listing
on the NT machine--it seems to have timed out. This problem does not
occur very often. Sometimes it will take thousands of connects and
disconnects before the problem shows up. I just saw it show up after
383 connections (I was running 6 simultaneously, one hung). Here are the
key lines of output from /proc/net/tcp:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
208: 070200C0:06D0 040200C0:0055 02 00000000:00000000 00:FFFA663A 00000000 500 0 8052
and from netstat:
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (State) User
tcp 0 0 atlantic.inetdata:1744 dollar.inetdata.com:85 SYN_SENT chaffee
I tried looking through the TCP code for an answer, but I didn't find
anything obvious. The net code is still rather new to me.
To run the client and server, do something like:
machine1% server -logfile -
machine1(or2)% client -logfile - machine1
-- Gordon Chaffee chaffee@bugs-bunny.cs.berkeley.edu http://www-plateau.cs.berkeley.edu/people/chaffee