web-dev-qa-db-fra.com

Dois-je battre mon cœur pour garder une connexion TCP ouverte?

J'ai deux composants qui communiquent via TCP/IP. Le composant A agit comme un serveur/écouteur et le composant B est le client. Les deux devraient communiquer le plus rapidement possible. Il ne peut jamais y avoir qu'une seule connexion à tout moment (bien que cela soit de côté pour cette question). Un développeur senior de mon entreprise a déclaré que je devais utiliser des pulsations au niveau de l'application entre les deux composants pour garantir que la connexion reste ouverte.

Je pensais que la connexion reste ouverte avec TCP/IP, mais j'ai lu un certain nombre de blogs/sites disant que c'est une pratique assez courante de battre du cœur entre ces applications.

Je connais une partie de la raison pour laquelle le composant A bat le cœur B afin qu'il puisse informer le support en cas de problèmes de communication avec le composant B (le lien est interrompu ou le composant B n'est pas en cours d'exécution). Les battements cardiaques sont-ils nécessaires pour une autre raison? De manière à vous assurer qu'il y a fréquemment quelque chose "dans le tuyau" pour le garder ouvert?

Le composant A bat actuellement le composant B toutes les 20 secondes et ferme la connexion si rien n'est reçu du composant B en 120 secondes. Il reprend ensuite l'écoute des connexions en supposant que le composant B tentera périodiquement une reconnexion si le lien est rompu. Cela fonctionne avec succès.

Pour réitérer ma question: des pulsations sont-elles nécessaires pour maintenir une connexion TCP/IP en vie?

90
Rob Gray

La connexion devrait rester ouverte malgré tout, mais oui, il est souvent courant de voir des protocoles implémenter un battement de cœur afin d'aider à détecter les connexions mortes, IRC avec la commande PING par exemple.

52
Lloyd

Comme beaucoup d'autres l'ont noté, la connexion TCP restera active si elle est laissée à ses propres appareils. Cependant, si vous avez un appareil au milieu de la connexion qui suit son état (tel qu'un pare-feu) ), vous pouvez avoir besoin de keepalives afin d'empêcher l'expiration de l'entrée de la table d'état.

47
Gerald Combs

Si vos composants:

  • sont dans un réseau câblé conventionnel
  • il n'y a pas de pare-feu ou NAT routeurs entre eux
  • aucun d'eux ne plante

alors vous n'avez pas besoin d'avoir un rythme cardiaque.

Si l'une de ces hypothèses est fausse (je vous regarde, GPRS!), Un battement de cœur devient nécessaire assez rapidement.

21
Eero Aaltonen

Vous n'avez pas besoin d'envoyer des battements de cœur vous-même. La connexion TCP restera ouverte quelle que soit l'utilisation.

Notez que TCP implémente un mécanisme keepalive facultatif, qui peut être utilisé pour identifier une connexion fermée en temps opportun, plutôt que de vous obliger à envoyer des données à une date ultérieure et seulement alors découvrir que la connexion est fermée.

10
Brian Agnew

Si vous utilisez Windows, faites attention au TCP Keep-alive. Par défaut, il est désactivé sauf si vous l'activez globalement avec le registre Windows ou via setsockopt.

L'intervalle de conservation par défaut est de 2 heures.

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

Vous devrez peut-être implémenter votre propre rythme cardiaque et désactiver TCP Keep-Alive sur Windows si la durée de vie de 2 heures n'est pas souhaitable.

9
Andrew Keith

Le battement de cœur est un bon moyen de dire au serveur que vous êtes vivant, ce qui signifie que, si le serveur utilise des systèmes de prévention des attaques DoS, il (le serveur) peut supprimer toutes les ressources allouées pour cette connexion particulière, après l'avoir détecté. inactivité pendant une période déterminée.
Leur aucun mandat pour mettre en œuvre des mécanismes de battement de coeur.

Mais c'est bien si vous concevez une application, où le critère principal est la réactivité. Vous n'aimerez pas perdre de temps sur les configurations de connexion, les recherches DNS et les découvertes de chemin. Il suffit de maintenir une connexion tout le temps, de continuer à envoyer des pulsations, et l'application sait que la connexion est active et que la configuration de la connexion n'est pas requise. Envoyez et recevez simplement.

3
Vivek Sharma

Les pulsations sont-elles nécessaires pour maintenir en vie une connexion TCP/IP?

Ils sont utiles pour détecter la fin d'une connexion.

3
ChrisW

Fondamentalement, une connexion TCP crée des états de lien stockés dans les commutateurs le long de la route. Afin de détecter les connexions rompues (comme lorsqu'un homologue tombe en panne (sans envoyer une déconnexion appropriée)), ces états doivent être expulsés après une période d'inactivité. Et lorsque cela se produit, votre connexion TCP a été fermée. Bien que je ne puisse pas dire exactement combien de temps ces délais sont, ils semblent dépendre des fabricants de périphériques et/ou Je me souviens que mes sessions de terminal SSH inactives ont été fermées rapidement (moins de 15 minutes d'inactivité) par mon ancien fournisseur Internet 1 & 1 alors qu'elles restaient ouvertes pendant plusieurs heures lors de l'utilisation d'une connexion fournie par Kabel-BW ...

Enfin, je termine avec mes précédents orateurs: un battement de cœur est un bon moyen de savoir si une connexion est toujours vivante et en cours ...

2
Mayday

TCP maintiendra la connexion active. Les pulsations d'application sont destinées à des considérations de niveau application telles que le basculement, l'équilibrage de charge ou l'alerte des administrateurs en cas de problèmes potentiels.

2
Duck

Heartbeat n'est pas une nécessité pour les protocoles TCP. Sa mise en œuvre est là pour détecter si l'autre côté a mis fin à la connexion de manière non standard (c'est-à-dire qu'il n'a pas suivi le processus de suppression).

1
Dark Star1

TCP/IP en tant que protocole est spécifié comme n'étant pas fermé jusqu'à ce que vous envoyiez un paquet de fermeture. J'ai eu des prises restent ouvertes même après avoir des connexions sans fil ou Internet irrégulières.

Cependant, tout cela dépend beaucoup des implémentations. Il y aura très probablement un "timeout" qui signifie le temps maximum pour attendre une réponse avant de considérer la connexion comme "morte". Parfois, cela est basé sur l'application elle-même, parfois sur les routeurs NAT.

Par conséquent, je vous recommande fortement de garder un "rythme cardiaque" pour détecter les mauvaises connexions et les garder ouvertes.

1
Unknown

Ce que vous appelez un battement de cœur est utile lorsque vous essayez de définir des délais. Votre prise peut sembler ouverte, mais la personne à l'autre bout peut souffrir d'un BSOD. L'un des moyens les plus simples de détecter les clients/serveurs disparus est de définir un délai d'expiration et de s'assurer qu'un message est reçu de temps en temps.

Certaines personnes les appellent NOOP (No Ops).

Mais non, ils ne sont pas nécessaires pour maintenir la connexion en vie, ils sont uniquement utiles pour connaître le statut.

1
Kekoa

Je dirais que si vous n'avez pas de rythme cardiaque, peu importe si votre connexion TCP/IP est ouverte ou non.

1
D. Patrick

La connexion restera ouverte - il n'est pas nécessaire d'implémenter un battement de cœur, et la plupart des applications qui utilisent des sockets ne le font pas.

0
anon