por que o linux reutiliza a porta 'time_wait'?

0

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 28.07.2016 / 05:06

1 resposta

2

Parece haver muitos erros nas partes transcritas da questão, e pedaços importantes estão faltando, mas acho que posso responder de qualquer maneira. O fato de que existem apenas dois números de porta, não significa que só pode haver duas conexões. As conexões são diferenciadas pelos quatro valores:

  • endereço de origem
  • porta de origem
  • endereço de destino
  • porto de destino

Assim, se, como é normal, o cliente abrir as novas conexões com um novo número de porta em seu final, o mesmo número de porta poderá ser usado pelo servidor e elas ainda serão conexões TCP distintas. Esta é a maneira como os mais servidores funcionam, há apenas uma porta no servidor (a chamada "porta bem conhecida" para o serviço) que o servidor escuta e cada cliente que se conecta a ele tem um endereço local diferente + porta no cliente.

Então, você realmente deveria ver três conexões. Provavelmente, o motivo pelo qual você vê apenas dois é que um deles já esperou o momento apropriado ou ainda não chegou a esse estado. Seu filtro grep provavelmente está ocultando informações vitais. Para este teste, você pode querer que o servidor imprima algo localmente, pois ele aceita cada conexão.

    
por 28.07.2016 / 05:31

Tags