Eu preciso pulsar para manter uma conexão TCP aberta?

94

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?

Rob Gray
fonte
1
Esse comportamento também poderia ser dependente da implementação? Isso é algo especificado no padrão TCP ou é deixado como um detalhe de implementação? Espero que outra pessoa também possa responder a isso.
dss539
1
É um detalhe de implementação que eu diria, já que nem todos os protocolos baseados em TCP / IP o implementam de forma que você depende inteiramente de você.
Lloyd
5
Sim - não por causa de TCP / IP - mas por causa de outro hardware ou software que sua conexão pode passar, como firewalls e 'roteadores' domésticos que tendem a descartar conexões TCP inativas, relacionado: stackoverflow.com/questions/3907537/…
markmnl

Respostas:

54

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.

Lloyd
fonte
34
Outro motivo comum para keepalives é manter a conexão aberta por meio de gateways nat. Embora o próprio TCP não precise de keepalives para operar, é comum que os gateways nat "abandonem" uma conexão tcp após um determinado tempo limite.
nos
4
O que é um tempo limite normal? segundos, minutos, horas?
MiniGod
@Lloyd Eu "acho" que MiniGod quis dizer: "Quanto tempo seria um tempo limite normal ?" (a resposta é dada em segundos, minutos, horas, ...)
jeromej
@JeromeJ Quem sabe, já se passaram alguns anos;)
Lloyd
Além disso, se sua conexão estiver passando por um proxy, você pode esperar que sua conexão seja interrompida se for considerada obsoleta. Não acho que o keep alive ajudaria neste caso, porque esse aspecto do tcp não se propaga para o aplicativo.
Ghita
49

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.

Gerald Combs
fonte
A conexão TCP dirá viva para sempre?
user7817808
22

Se seus componentes:

  • estão em uma rede convencional com fio
  • não há firewalls ou roteadores NAT entre eles
  • nenhum deles cai

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.

Eero Aaltonen
fonte
1
No entanto, isso geralmente é rede. Considere as falácias da computação distribuída de Peter Deutsch; sabemos que as redes não são inerentemente confiáveis ​​e, portanto, devem ser tratadas como um ponto quase certo de falha em seu aplicativo. Nesse contexto, com ou sem fio convencional, suponha que ocorrerá uma falha em algum ponto e projete seu aplicativo para lidar com esse cenário.
Steven Bakhtiari
11

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.

Brian Agnew
fonte
1
Como é que se deve trabalhar no linux? realmente funciona? posso programar o tempo limite para menos de 2 horas? por exemplo, 30 segundos?
Itay Levin
Para que isso funcione, o aplicativo precisa oferecer suporte a keepalive. Apenas habilitá-lo no Linux não será suficiente.
Mike Vella
9

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.

Andrew Keith
fonte
3

As pulsações são necessárias para manter uma conexão TCP / IP ativa?

Eles são úteis para detectar quando uma conexão morreu.

ChrisW
fonte
3

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.

Pato
fonte
3

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.

Vivek Sharma
fonte
2

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.

Desconhecido
fonte
2

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 ...

Socorro
fonte
1

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.

Kekoa
fonte
1

Eu diria que se você não tem pulsação, não importa se sua conexão TCP / IP está aberta ou não.

D. Patrick
fonte
1

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).

Dark Star1
fonte
0

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
-2

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

ist_lion
fonte