por que o linux reutiliza a porta 'time_wait'?

7

Como eu sei, a porta tcp no stat 'time_wait' não pode ser usada. No entanto, na minha experiência, o servidor reutiliza a porta 'time_wait'? Por quê?

Primeiramente, na máquina cliente, digite o comando ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range . Então, o número máximo de portas TCP é 2.

código do servidor

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

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

código do cliente

    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

São até 3 conexões. Eu acho, 2 conexões no máximo. Por quê ?  servidor tem 2 conexões de tempo de espera.

[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                              

Ambiente

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

configuração do servidor

[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

configuração do cliente

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

Importante     Eu também tento o servidor Ubuntu 14.04, mas tenho o mesmo resultado.

    
por Pengcheng 27.07.2016 / 09:08

1 resposta

6

O estado de espera de tempo é usado para impedir que pacotes antigos de uma conexão anterior sejam aceitos em uma nova conexão. Ele efetivamente permite tempo suficiente para que os pacotes antigos "morram" na rede.

No entanto, um soquete no estado Timewait pode aceitar uma nova conexão, desde que o Número de Sequência Inicial no SYN seja maior que o último número de sequência visto no soquete.

    
por 27.07.2016 / 10:17