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

94

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 doivent communiquer le plus rapidement possible. Il ne peut y avoir qu'une seule connexion à la fois (bien que cela soit mis à part 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 restait ouverte avec TCP / IP, mais j'ai lu un certain nombre de blogs / sites disant que le battement de cœur entre ces applications est une pratique assez courante.

Je connais une partie de la raison pour laquelle le composant A bat le cœur du composant B afin qu'il puisse informer le support s'il y a des problèmes de communication avec le composant B (le lien est en panne ou le composant B ne fonctionne pas). Les battements de cœur sont-ils nécessaires pour une autre raison? De manière à s'assurer qu'il y a souvent quelque chose «dans le tuyau» pour le maintenir 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 dans les 120 secondes. Il reprend ensuite l'écoute des connexions en supposant que le composant B essaiera périodiquement une reconnexion si la liaison est interrompue. Cela fonctionne avec succès.

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

Rob Gray
la source
1
Ce comportement pourrait-il également dépendre de l'implémentation? Est-ce quelque chose de spécifié dans la norme TCP ou est-il laissé comme détail d'implémentation? J'espère que quelqu'un d'autre pourra également répondre.
dss539
1
C'est un détail de mise en œuvre, je dirais, car tous les protocoles basés sur TCP / IP ne l'implémentent pas, c'est donc entièrement à vous.
Lloyd
5
Oui - pas à cause de TCP / IP - mais à cause d'autres matériels ou logiciels que vous pouvez utiliser pour la connexion, tels que les pare-feu et les `` routeurs '' domestiques qui ont tendance à abandonner les connexions TCP inactives, lié: stackoverflow.com/questions/3907537
...

Réponses:

54

La connexion doit rester ouverte malgré tout mais oui, il est souvent fréquent 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.

Lloyd
la source
34
Une autre raison courante pour keepalives est de garder la connexion ouverte via les passerelles nat. Bien que TCP lui-même n'ait pas besoin de keepalives pour fonctionner, il est courant que les passerelles nat «abandonnent» une connexion TCP après un certain délai.
nos
4
Qu'est-ce qu'un délai d'expiration normal? secondes, minutes, heures?
MiniGod
@Lloyd Je "pense" que MiniGod voulait dire, "Combien de temps serait un délai normal ?" (la réponse donnée en secondes, minutes, heures,…)
jeromej
@JeromeJ Qui sait, ça fait quelques années;)
Lloyd
De plus, si votre connexion passe par un proxy, vous pouvez vous attendre à ce que votre connexion soit interrompue si elle est considérée comme obsolète. Je ne pense pas que keep alive aiderait dans ce cas, car cet aspect de tcp ne se propage pas à l'application.
Ghita
49

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 périphérique 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'entrée de la table d'état d'expirer.

Peignes Gerald
la source
La connexion TCP dira-t-elle vivante pour toujours?
user7817808
22

Si vos composants:

  • sont dans un réseau filaire conventionnel
  • il n'y a pas de pare-feu ou de routeurs NAT entre eux
  • aucun d'eux ne s'écrase

alors vous n'avez pas besoin d'avoir un battement de coeur.

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

Eero Aaltonen
la source
1
Cependant, il s'agit généralement de réseautage. Considérez les erreurs de Peter Deutsch sur l'informatique distribuée; nous savons que les réseaux sont intrinsèquement peu fiables et doivent donc être traités comme un point de défaillance presque certain dans votre application. Dans ce contexte, réseau câblé conventionnel ou non, supposez que vous rencontrerez une défaillance à un moment donné et que vous concevrez votre application pour gérer ce scénario.
Steven Bakhtiari
11

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

Notez que TCP implémente un mécanisme optionnel keepalive , 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 à découvrir ensuite que la connexion est fermée.

Brian Agnew
la source
1
Comment cela fonctionne-t-il sous Linux? ça marche en fait? puis-je programmer le délai d'expiration à moins de 2 heures? par exemple 30 secondes?
Itay Levin
Pour que cela fonctionne, l'application doit prendre en charge keepalive. Le simple fait de l'activer sous Linux ne suffira pas.
Mike Vella
9

Si vous utilisez Windows, soyez prudent avec 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 le keep-alive de 2 heures n'est pas souhaitable.

Andrew Keith
la source
3

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

Ils sont utiles pour détecter lorsqu'une connexion est interrompue.

ChrisW
la source
3

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

canard
la source
3

Le battement de cœur est un bon moyen de dire au serveur que vous êtes en vie, 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 la détection. en activité pendant une période déterminée.
Leur aucun mandat pour mettre en œuvre des mécanismes de pulsation.

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 garder une connexion tout le temps, de continuer à envoyer des battements de cœur, et l'application sait que la connexion est active et que la configuration de la connexion n'est pas requise. Envoyez et recevez simplement.

Vivek Sharma
la source
2

TCP / IP en tant que protocole est spécifié comme n'étant pas fermé tant que vous n'avez pas envoyé un paquet de fermeture. J'ai eu des prises restées ouvertes même après avoir des connexions sans fil ou Internet inégales.

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

Par conséquent, je vous recommande fortement de garder un "battement de cœur" pour détecter les mauvaises connexions et les garder ouvertes.

Inconnue
la source
2

Fondamentalement, une connexion TCP crée des états de lien stockés dans des commutateurs le long de la route. Afin de détecter les connexions interrompues (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 sont ces délais, ils semblent dépendre des fabricants de périphériques et / ou des fournisseurs Internet. Je me souviens que mes sessions de terminal SSH inactives ont été rapidement fermées (moins de 15 minutes d'inactivité) par mon ancien fournisseur d'accès Internet 1 & 1 alors qu'elles sont restées ouvertes pendant plusieurs heures lors de l'utilisation d'une connexion fournie par Kabel-BW ...

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

Au secours
la source
1

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 extrémité peut souffrir d'un BSOD. L'un des moyens les plus simples de détecter les clients / serveurs obsolètes 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 active, seulement utiles pour savoir quel est le statut.

Kekoa
la source
1

Je dirais que si vous n'avez pas de battement de cœur, peu importe si votre connexion TCP / IP est ouverte ou non.

D. Patrick
la source
1

Heartbeat n'est pas une nécessité pour les protocoles TCP. Son implémentation est là pour détecter si l'autre côté a mis fin à la connexion de manière non standard (c'est-à-dire pas passé par le processus de démontage).

Étoile noire1
la source
0

La connexion restera ouverte - il n'est pas nécessaire d'implémenter une pulsation, et la plupart des applications qui utilisent des sockets ne le font pas.


la source
-2

De nombreux protocoles implémentent un rythme cardiaque ou un état de santé, comme l'a dit Lloyd. Juste pour que vous sachiez que la connexion est toujours ouverte et si vous avez manqué quelque chose

ist_lion
la source