Ho bisogno di heartbeat per mantenere aperta una connessione TCP?


94

Ho due componenti che comunicano tramite TCP / IP. Il componente A funge da server / ascoltatore e il componente B è il client. I due dovrebbero comunicare il più rapidamente possibile. Ci può essere solo una connessione in qualsiasi momento (anche se questo è a parte questa domanda). Uno sviluppatore senior della mia azienda ha affermato che è necessario utilizzare heartbeat a livello di applicazione tra i due componenti per garantire che la connessione rimanga aperta.

Pensavo che la connessione rimanesse aperta con TCP / IP, ma ho letto un certo numero di blog / siti che dicono che è una pratica abbastanza standard battere il cuore tra queste applicazioni.

Conosco parte del motivo per cui il componente A batte il componente B in modo che possa informare il supporto se ci sono problemi di comunicazione con il componente B (il collegamento è inattivo o il componente B non è in esecuzione). I battiti cardiaci sono necessari per altri motivi? Come garantire che spesso ci sia qualcosa "nel tubo" per tenerlo aperto?

Il componente A attualmente batte il componente B ogni 20 secondi e chiude la connessione se non viene ricevuto nulla dal componente B entro 120 secondi. Quindi riprende ad ascoltare le connessioni presumendo che il componente B proverà periodicamente a riconnettersi se il collegamento è interrotto. Funziona con successo.

Per ribadire la mia domanda: gli heartbeat sono necessari per mantenere attiva una connessione TCP / IP?


1
Questo comportamento potrebbe anche dipendere dall'implementazione? È qualcosa specificato nello standard TCP o è lasciato come dettaglio di implementazione? Spero che qualcun altro possa rispondere anche a questo.
dss539

1
È un dettaglio di implementazione, direi, poiché non tutti i protocolli basati su TCP / IP implementano in modo tale che sia lasciato interamente a te.
Lloyd

5
Sì - non becuase del protocollo TCP / IP - ma a causa di altro hardware o software di connessione può passare attraverso, come firewall e router '' casa che tendono a cadere le connessioni TCP inattive, correlati: stackoverflow.com/questions/3907537/...
markmnl

Risposte:


54

La connessione dovrebbe rimanere aperta a prescindere, ma sì, è spesso comune vedere i protocolli implementare un heartbeat per aiutare a rilevare le connessioni morte, ad esempio IRC con il comando PING .


34
Un altro motivo comune per keepalive è quello di mantenere la connessione aperta attraverso i gateway nat. Sebbene il protocollo TCP stesso non abbia bisogno di keepalive per funzionare, è normale che i gateway nat "interrompano" una connessione tcp dopo un determinato timeout.
n.

4
Cos'è un normale timeout? secondi, minuti, ore?
MiniGod

@ Lloyd "Penso" che MiniGod significasse "Quanto tempo sarebbe un normale timeout?" (la risposta data in secondi, minuti, ore, ...)
jeromej

@JeromeJ Chissà, sono passati alcuni anni;)
Lloyd

Inoltre, se la tua connessione sta passando attraverso un proxy, puoi aspettarti che la tua connessione venga interrotta se considerata obsoleta. Non penso che mantenere in vita sarebbe d'aiuto in questo caso, perché questo aspetto di tcp non si propaga all'applicazione.
Ghita

49

Come molti altri hanno notato, la connessione TCP rimarrà attiva se lasciata ai propri dispositivi. Tuttavia, se hai un dispositivo nel mezzo della connessione che tiene traccia del suo stato (come un firewall), potresti aver bisogno di keepalive per evitare che la voce della tabella degli stati scada.


La connessione TCP dirà vivo per sempre?
user7817808

22

Se i tuoi componenti:

  • sono in una rete cablata convenzionale
  • non ci sono firewall o router NAT tra di loro
  • nessuno di loro si schianta

quindi non è necessario avere un battito cardiaco.

Se una di queste ipotesi è falsa (ti sto guardando, GPRS!), Un battito cardiaco diventa necessario piuttosto rapidamente.


1
Questo è il networking in generale, però. Considera gli errori di elaborazione distribuita di Peter Deutsch; sappiamo che le reti sono intrinsecamente inaffidabili e quindi dovrebbero essere trattate come un punto di errore quasi certo nella tua applicazione. In questo contesto, rete cablata convenzionale o meno, presumi che prima o poi si verificherà un errore e progetta la tua applicazione per gestire quello scenario.
Steven Bakhtiari

11

Non è necessario inviare tu stesso i battiti cardiaci. La connessione TCP rimarrà aperta indipendentemente dall'utilizzo.

Si noti che TCP implementa un meccanismo keepalive opzionale , che può essere utilizzato per identificare una connessione chiusa in modo tempestivo, piuttosto che richiedere di inviare dati in un secondo momento e solo allora scoprire che la connessione è chiusa.


1
Come si suppone di funzionare su Linux? funziona infatti? posso programmare il timeout in modo che sia inferiore a 2 ore? per esempio 30 secondi?
Itay Levin

Affinché funzioni, l'applicazione deve supportare keepalive. Il semplice abilitarlo in Linux non sarà sufficiente.
Mike Vella

9

Se stai usando Windows, fai attenzione al TCP Keep-Alive. Per impostazione predefinita, è disabilitato a meno che non lo si attivi globalmente con il registro di Windows o tramite setsockopt.

L'intervallo di mantenimento attivo predefinito è di 2 ore.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Potrebbe essere necessario implementare il proprio battito cardiaco e disabilitare il keep-alive TCP su Windows se il keep-alive di 2 ore non è desiderabile.


3

Gli heartbeat sono necessari per mantenere attiva una connessione TCP / IP?

Sono utili per rilevare quando una connessione è terminata.


3

TCP manterrà attiva la connessione. Gli heartbeat dell'applicazione sono per considerazioni a livello di applicazione come failover, bilanciamento del carico o avviso agli amministratori di potenziali problemi.


3

Il battito cardiaco è un buon modo per dire al server che sei vivo, per cui intendo che, se il server utilizza sistemi di prevenzione degli attacchi DoS, (il server) potrebbe rimuovere tutte le risorse allocate per quella particolare connessione, dopo che ha rilevato in attività per un periodo specificato.
Non hanno il mandato di implementare alcun meccanismo di battito cardiaco.

Ma va bene se stai progettando un'applicazione, in cui il criterio principale è la reattività. Non ti piacerà perdere tempo in configurazioni di connessione, ricerche DNS e scoperte di percorsi. Basta mantenere una connessione sempre attiva, continuare a inviare heartbeat e l'applicazione sa che la connessione è attiva e la configurazione della connessione non è richiesta. Semplicemente invia e ricevi.


2

TCP / IP come protocollo viene specificato come non chiuso finché non si invia un pacchetto di chiusura. Ho avuto prese di corrente aperte anche dopo aver avuto problemi di connessione wireless o Internet.

Tuttavia, tutto questo dipende molto dalle implementazioni. Molto probabilmente ci sarà un "timeout" che significa il tempo massimo di attesa per una risposta prima di considerare la connessione "morta". A volte questo si basa sull'applicazione stessa, a volte sui router NAT.

Pertanto, ti consiglio vivamente di mantenere un "battito cardiaco" per rilevare cattive connessioni e mantenerle aperte.


2

Fondamentalmente una connessione TCP crea stati di collegamento memorizzati negli switch lungo il percorso. Per rilevare connessioni interrotte (come quando una controparte si blocca (senza inviare una disconnessione adeguata)), questi stati devono essere rimossi dopo un periodo di inattività. E quando ciò accade, la tua connessione TCP è stata chiusa. Sebbene non sia in grado di dire esattamente quanto siano lunghi questi timeout, sembrano dipendere dai produttori di dispositivi e / o dai provider Internet. Ricordo che le mie sessioni di terminale SSH inattive sono state rapidamente chiuse (meno di 15 minuti di inattività) dal mio ex provider Internet 1 & 1 mentre sono rimaste aperte per diverse ore quando si utilizza una connessione fornita da Kabel-BW ...

Infine, concludo con i miei precedenti oratori: un battito cardiaco è un buon modo per capire se una connessione è ancora viva e vegeta ...


1

Quello che chiami battito cardiaco è utile quando cerchi di impostare i timeout. Il tuo socket potrebbe sembrare aperto, ma la persona dall'altra parte potrebbe soffrire di un BSOD. Uno dei modi più semplici per rilevare client / server inattivi è impostare un timeout e assicurarsi che ogni tanto venga ricevuto un messaggio.

Alcune persone li chiamano NOOP (No Ops).

Ma no, non sono necessari per mantenere viva la connessione, sono utili solo per sapere qual è lo stato.


1

Direi che se non hai un battito cardiaco, non importa se la tua connessione TCP / IP è aperta o meno.


1

Heartbeat non è una necessità per i protocolli TCP. La sua implementazione è lì per rilevare se l'altra parte ha terminato la connessione in modo non standard (cioè non ha superato il processo di smontaggio).


0

La connessione rimarrà aperta: non è necessario implementare un heartbeat e la maggior parte delle applicazioni che utilizzano socket non lo fanno.


-2

Molti protocolli implementano un battito cardiaco o un tipo di stato di salute come ha detto Lloyd. Solo così sai che la connessione è ancora aperta e se potresti esserti perso qualcosa

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.