Tenho dois componentes que se comunicam via TCP / IP. O componente A atua como um servidor / ouvinte e o componente B é o cliente. Os dois devem se comunicar o mais rápido possível. Só pode haver uma conexão por vez (embora isso não seja parte dessa questão). Um desenvolvedor sênior da minha empresa disse que preciso usar pulsações no nível do aplicativo entre os dois componentes para garantir que a conexão permaneça aberta.
Achei que a conexão permanecesse aberta com TCP / IP, mas li vários blogs / sites dizendo que é uma prática padrão pulsar entre esses aplicativos.
Eu sei que parte da razão do componente A pulsar do componente B é para que ele possa informar o suporte se houver problemas de comunicação com o componente B (o link está inativo ou o componente B não está funcionando). Os batimentos cardíacos são necessários por algum outro motivo? Como garantir que sempre haja algo "no tubo" para mantê-lo aberto?
O componente A atualmente bate o componente B a cada 20 segundos e fecha a conexão se nada for recebido de volta do componente B em 120 segundos. Em seguida, ele retoma a escuta de conexões, supondo que o componente B tentará se reconectar periodicamente se o link for interrompido. Isso funciona com sucesso.
Para reiterar minha pergunta: as pulsações são necessárias para manter uma conexão TCP / IP ativa?
Respostas:
A conexão deve permanecer aberta independentemente, mas sim, muitas vezes é comum ver protocolos implementarem uma pulsação para ajudar a detectar conexões mortas, IRC com o comando PING, por exemplo.
fonte
Como muitos outros notaram, a conexão TCP permanecerá ativa se deixada por conta própria. No entanto, se você tiver um dispositivo no meio da conexão que rastreia seu estado (como um firewall), pode ser necessário manter a atividade para evitar que a entrada da tabela de estado expire.
fonte
Se seus componentes:
então você não precisa ter um batimento cardíaco.
Se alguma dessas suposições for falsa (estou olhando para você, GPRS!), Uma batida do coração se torna necessária rapidamente.
fonte
Você não precisa enviar batimentos cardíacos. A conexão TCP permanecerá aberta independentemente do uso.
Observe que o TCP implementa um mecanismo opcional de manutenção de atividade , que pode ser usado para identificar uma conexão fechada em tempo hábil, em vez de exigir que você envie dados em uma data posterior e só então descobrir que a conexão foi fechada.
fonte
Se estiver usando o Windows, tome cuidado com o TCP Keep-alive. Por padrão, está desabilitado, a menos que você o ligue globalmente com o registro do Windows ou via setsockopt.
O intervalo padrão de keep-alive é 2 horas.
http://msdn.microsoft.com/en-us/library/ms819735.aspx
Você pode precisar implementar seu próprio batimento cardíaco e desabilitar o TCP keep-alive no Windows se 2 horas de keep-alive não for desejável.
fonte
Eles são úteis para detectar quando uma conexão morreu.
fonte
O TCP manterá a conexão ativa. As pulsações do aplicativo são para considerações de nível de aplicativo, como failover, balanceamento de carga ou alertando os administradores sobre problemas em potencial.
fonte
O batimento cardíaco é uma boa maneira de dizer ao servidor que você está vivo, o que significa que, se o servidor estiver usando sistemas de prevenção de ataques DoS, ele (o servidor) pode remover todos os recursos alocados para aquela conexão em particular, após a detecção em atividade por um período específico.
Não têm mandato para implementar mecanismos de pulsação.
Mas é bom se você estiver projetando um aplicativo, onde o principal critério é a capacidade de resposta. Você não vai gostar de perder tempo com configurações de conexão, pesquisas de DNS e descobertas de caminhos. Simplesmente mantenha uma conexão ativa o tempo todo, continue enviando pulsações e o aplicativo saberá que a conexão está ativa e a configuração da conexão não é necessária. Simplesmente envie e receba.
fonte
TCP / IP como um protocolo é especificado como não sendo fechado até que você envie um pacote fechado. Eu tive tomadas que permaneceram abertas mesmo depois de ter conexões sem fio ou de internet instáveis.
No entanto, tudo isso depende muito das implementações. Provavelmente haverá um "tempo limite", o que significa o tempo máximo de espera por uma resposta antes de considerar a conexão como "morta". Às vezes, isso é baseado no próprio aplicativo, às vezes em roteadores NAT.
Portanto, eu recomendo que você mantenha uma "pulsação" para detectar conexões ruins e mantê-las abertas.
fonte
Basicamente, uma conexão TCP cria estados de link armazenados em switches ao longo da rota. Para detectar conexões interrompidas (como quando uma contraparte falha (sem enviar uma desconexão adequada)), esses estados devem ser removidos após um período de inatividade. E quando isso acontece, sua conexão TCP foi encerrada. Embora eu não possa dizer exatamente quanto tempo esses tempos limites são, eles parecem depender dos produtores de dispositivos e / ou provedores de Internet. Lembro que minhas sessões de terminal SSH ocioso foram fechadas rapidamente (menos de 15 minutos de tempo ocioso) pelo meu antigo provedor de Internet 1 e 1 enquanto permaneciam abertos por várias horas ao usar uma conexão fornecida pelo Kabel-BW ...
Por fim, concluo com meus palestrantes anteriores: uma batida de coração é uma boa maneira de saber se uma conexão ainda está viva e funcionando ...
fonte
O que você chama de pulsação é útil ao tentar definir tempos limite. Seu soquete pode parecer aberto, mas a pessoa do outro lado pode estar sofrendo de um BSOD. Uma das maneiras mais fáceis de detectar clientes / servidores extintos é definir um tempo limite e garantir que uma mensagem seja recebida de vez em quando.
Algumas pessoas os chamam de NOOPs (No Ops).
Mas não, eles não são necessários para manter a conexão ativa, apenas ajudam a saber qual é o status.
fonte
Eu diria que se você não tem pulsação, não importa se sua conexão TCP / IP está aberta ou não.
fonte
A pulsação não é uma necessidade para os protocolos TCP. Sua implementação existe para detectar se o outro lado encerrou a conexão de maneira não padrão (ou seja, não passou pelo processo de desativação).
fonte
A conexão permanecerá aberta - não há necessidade de implementar uma pulsação, e a maioria dos aplicativos que usam soquetes não o fazem.
fonte
Muitos protocolos implementam um tipo de batimento cardíaco ou estado de saúde, como disse Lloyd. Só para você saber que a conexão ainda está aberta e se você pode ter perdido alguma coisa
fonte