Pergunta

Quanto tempo posso esperar uma conexão de cliente / servidor TCP para a última na natureza?

Eu quero que ele fique permanentemente conectado, mas as coisas acontecem, então o cliente terá de se reconectar. Em que ponto posso dizer que há um problema no código, em vez de há um problema com algum equipamento externo?

Foi útil?

Solução

Eu concordo com Zan Lynx. Não há nenhuma garantia, mas você pode manter uma conexão viva quase indefinidamente através do envio de dados sobre ele, assumindo que não há problemas de conectividade ou largura de banda.

Geralmente eu fui para a abordagem keep-alive nível de aplicação, embora este tem normalmente porque tem sido na especificação do cliente, então eu tive que fazê-lo. Mas basta enviar um curto pedaço de dados a cada minuto ou dois, para que você espera algum tipo de reconhecimento.

Se você contar uma falha em reconhecer que a conexão não tendo conseguido é com você. Geralmente este é o que eu fiz no passado, embora tenha havido um caso que eu tinha espera para três respostas falharam em uma fila para cair a conexão porque o aplicativo na outra extremidade da conexão foi extremamente esquisito sobre como responder a "você está aí ?" pedidos.

Se a conexão falhar, que em algum momento ele provavelmente irá, mesmo com as máquinas na mesma rede, então é só tentar restabelecer-lo. Se isso falhar um determinado número de vezes, então você tem um problema. Se a sua conexão falhar persistentemente depois de ter sido ligado por um tempo, em seguida, novamente, você tem um problema. O mais provável em ambos os casos é provavelmente algum problema de rede, ao invés de seu código, ou talvez um problema com a pilha TCP / IP da máquina (foi conhecido: I encontrou problemas com isso em uma versão antiga do QNX - it'd apenas cair aleatoriamente ao longo). Dito isto você pode ter um problema de software, ea única maneira de saber com certeza é muitas vezes para anexar um depurador, ou para obter algum registro de lá. Por exemplo. se você sempre pode se conectar com êxito, mas depois de um tempo você parar de receber ACKs, mesmo depois de reconectar, em seguida, talvez o seu servidor está travado, ou ficar preso em um loop ou algo assim.

O que é realmente útil é a criação de uma série de testes de longa execução sob uma variedade de condições de carga, a partir de apenas enviar o manter vivo você está aí? / Ack solicitações e respostas, a absolutamente golpeando o servidor. Isso geralmente lhe dar mais confiança sobre seus componentes de software, e pode ser muito útil em sacudindo alguns problemas muito estranho que não vai necessariamente causar um problema com a sua conexão, embora possam resultar em problemas com as transações que estão ocorrendo. Por exemplo, eu era uma vez escrevendo um servidor de aplicações de telecomunicações que os serviços prestados, tais como tradução de números, e tínhamos acabado de deixá-lo funcionando por dias de cada vez. A coisa foi que quando chegou o sábado inteiro, para todo o dia, ele iria rejeitar todos os pedidos de chamada que veio, que atingiu milhões de chamadas, e não tínhamos idéia do porquê. Ele acabou por ser por causa de um único erro de digitação em algum código de conversão de data que só causou um problema aos sábados.

Espero que ajude.

Outras dicas

Eu acho que a idéia mais importante aqui é prática a teoria vs..

A teoria original de que as ligações não tinha vidas. Se você tivesse uma conexão, ele ficou aberto para sempre, mesmo que não havia tráfego, até que um evento causado o fechamento.

A nova teoria é que a maioria das versões do SO ter ligado o temporizador keep-alive. Isto significa que as conexões vão durar para sempre, enquanto o sistema o outro responde finais para uma troca de nível TCP ocasional.

Na realidade, muitas conexões será encerrado após o tempo, com uma variedade de critérios e situações.

Dois realmente bons exemplos são: O cliente remoto está usando DHCP, a concessão expirar, e as mudanças de endereço IP

.

Outro exemplo é firewalls, que parecem ser cada vez mais inteligentes, e podem identificar o tráfego keep-alive vs. dados reais e estreitas ligações com base em qualquer critério de alto nível, tempo, especialmente ocioso.

Como você deseja implementar a lógica de reconexão depende muito de sua arquitetura, o ambiente de trabalho e suas metas de desempenho.

Deve realmente não importa, você deve projetar seu código para automaticamente reconectar se que é o comportamento desejado.

Não há realmente nenhuma maneira de dizer. Não há nada inerente ao TCP que faria com que a conexão de apenas uma gota após um determinado período de tempo. Alguém em uma conexão confiável poderia ter anos de tempo de atividade, enquanto alguém em uma conexão diferente poderia ter que reconectar a cada 5 minutos. Não há nenhuma maneira de dizer ou até mesmo adivinhar.

Você vai precisar de alguns dados indo através da conexão periodicamente para mantê-lo vivo -. Muitos OS do ou firewalls vai cair uma conexão inativa

Escolha um valor. Uma gota a cada hora é provavelmente bem. conexão inesperada dez gotas em 5 minutos provavelmente indica um problema.

conexões TCP será geralmente duram cerca de duas horas, sem qualquer tipo de tráfego. Cada extremidade pode enviar pacotes keep-alive, que são, penso eu, apenas um ACK no último pacote recebido. Isto normalmente pode ser definido por soquete ou por padrão em cada conexão TCP.

Um nível de aplicação keep-alive também é possível. Para um protocolo de estilo telnet como FTP, SMTP, POP ou IMAP algo como o envio de retorno, nova linha e voltar prompt de um comando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top