TCP timeout para conexões estabelecidas no Windows

3

Eu tenho a seguinte situação:

  • Aplicativo (cliente do banco de dados do Firebird) em um computador cliente abre uma conexão TCP ao servidor na porta 3050
  • Falha no aplicativo no cliente, o aplicativo foi encerrado
  • O netstat no servidor ainda mostra a conexão TCP ESTABELECIDA na porta 3050 para o endereço IP dos clientes.
  • desligado do cliente
  • O netstat no servidor ainda mostra a conexão TCP ESTABELECIDA na porta 3050 para o endereço IP dos clientes.
  • esperou vários minutos
  • O netstat no servidor ainda mostra a conexão TCP ESTABELECIDA na porta 3050 para o endereço IP dos clientes.

Existe um tempo limite para conexões estabelecidas no Windows (Win8.1 neste caso)? Posso mudar esse tempo limite?

Eu encontrei isso , mas isso não parece responder à minha pergunta para conexões estabelecidas.

    
por Alois Heimer 11.11.2015 / 12:14

2 respostas

3

Por padrão, uma conexão TCP estabelecida não tem tempo limite ( mas pode fazê-lo devido a restrições de hardware ).

Um aplicativo pode usar o mecanismo TCP keepalive para verificar se há conexões interrompidas. No Firebird (> 1.5), os keepalives TCP estão habilitados .

O "timeout" keepalive deve ser definido no servidor. O intervalo de tempo padrão de manutenção de atividade TCP no Windows é de 2 horas (mas é recomendado 5 minutos ) . Pode ser definido na HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime chave de registro .

Mais detalhes dos links acima:

a failed client connection will be closed after the following time interval: KEEPALIVE_TIME+ ( KEEPALIVE_PROBES+1)* KEEPALIVE_INTERVAL

Com os seguintes valores de registro correspondentes no Windows:

KEEPALIVE_TIME = KeepAliveTime (default: 7200 seconds)
KEEPALIVE_INTERVAL = KeepAliveInterval (default: 1 second)
KEEPALIVE_PROBES = TCPMaxDataRetransmissions (default: 5)

Mas:

A keepalive segment is sent every two hours by default [...]. Even if enabled, other upper-layer protocols such as NetBIOS send their own keepalive value. If the keepalive interval that the upper-layer protocol uses is less than the TCP keepalive interval, TCP keepalive value is never sent. For example, NetBIOS sessions over TCP/IP send a NetBIOS keepalive request every 60 minutes. Therefore, TCP keepalive values that are enabled for a NetBIOS session are never used.

    
por 12.11.2015 / 08:59
0

A especificação TCP não possui nenhum mecanismo de tempo limite ou keepalive. Há entradas do Registro que podem ser configuradas para configurar keepalives de TCP, mas cabe ao aplicativo real usar keepalives. Veja a resposta para esta pergunta:

Habilitando keep-alive TCP em todo o sistema em um sistema Windows

    
por 11.11.2015 / 16:01