7

As I know, tcp port in 'time_wait' stat cann't be used. However, in my experiment, server reuses the 'time_wait' port? Why?

Firstly, in client machine, type command ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range. So, the maximum number of TCP ports is 2.

server code

while (1) {
    int len = sizeof(struct sockaddr);
    fd = accept(sfd, &remote, &len);

    read(fd, buf, sizeof(buf));
    close(fd);
}

client code

    for (i = 0; i < 3; i++)
    {
        sleep(1);
        pid_t pid = fork();
        if (pid == 0)
        {
            handler();
            exit(0);
        }
    }

 void handler()
 {
      * ............. */

      res = connect(sfd, result->ai_addr, result->ai_addrlen);
      if (res == -1) {
        perror("error");
        exit(1);
      }

      printf("connect\n");
 }

show

[root@livecd ~]# ./client 
connect
[root@livecd ~]# connect
connect

It's up to 3 connections. I think, 2 connections at most. Why ? server has 2 timewait connections.

[root@livecd ~]# netstat -anp | grep TIME
tcp  192.168.88.131:2016   192.168.88.132:40000  TIME_WAIT                  
tcp  192.168.88.131:2016   192.168.88.132:40001  TIME_WAIT                              

Environment

Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016

server config

[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 
0
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 
0

client config

[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
40000   40001

Important I also try ubuntu server 14.04, but got the same result.

Pengcheng
  • 73
  • 1
  • 4
  • 2
    This might be better suited to [Unix & Linux SE site](http://unix.stackexchange.com/) as you seem to be using a live CD which doesn't sound like a production system. – zagrimsan Jul 27 '16 at 07:25
  • I also try ubuntu server 14.04, but still got same result. – Pengcheng Jul 27 '16 at 07:27

1 Answers1

6

The Time Wait state is used prevent old packets from a previous connection from being accepted into a new connection. It effectively allows enough time for old packets to "die" in the network.

However, a socket in Timewait state can accept a new connection as long as the Initial Sequence Number on the SYN is higher than the last sequence number seen on the socket.

Mark Riddell
  • 1,103
  • 1
  • 6
  • 10
  • Sorry, I cann't understand your opinion. Sequence number is very large and increases with time. So in most cases, SYN's sequence number is larger than last sequence number. But, if last sequence number is up to the maximum, new SYN's sequence is smaller than last seq num. Last **Fin** seq number cann't be in new connction's sliding window, because seq num needs lots of time to up to maximum. I'm sure the time is much larger than 2MSL time. If you are right, why we need time_wait to "die" old packet? – Pengcheng Jul 28 '16 at 01:52
  • TIME-WAIT is required to ensure that old duplicate packets from a previous connection are not accepted into a new connection where the duplicate packets sequence number happens to fall within the window of the new connection. – Mark Riddell Jul 28 '16 at 07:35