110 votes

Ai-je besoin d'un heartbeat pour maintenir une connexion TCP ouverte ?

J'ai deux composants qui communiquent via TCP/IP. Le composant A fait office de serveur/auditeur et le composant B est le client. Les deux doivent communiquer aussi rapidement que possible. Il ne peut y avoir qu'une seule connexion à la fois (bien que cela soit accessoire à cette question). Un développeur senior de mon entreprise m'a dit que je devais utiliser des battements de cœur au niveau de l'application entre les deux composants pour m'assurer 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 c'est une pratique assez standard de battre le cœur entre ces applications.

Je sais qu'une partie de la raison pour laquelle le composant A bat le cœur du composant B est qu'il peut informer le support s'il y a des problèmes de communication avec le composant B (soit la liaison est en panne, soit le composant B ne fonctionne pas). Les battements de cœur sont-ils nécessaires pour d'autres raisons ? Par exemple, pour s'assurer qu'il y a fréquemment quelque chose "dans le tuyau" pour le maintenir ouvert ?

Actuellement, le composant A envoie des battements de cœur au composant B toutes les 20 secondes et ferme la connexion si rien n'est reçu en retour du composant B dans les 120 secondes. Il reprend ensuite l'écoute des connexions en partant du principe que le composant B essaiera périodiquement de se reconnecter si le lien est rompu. Cela fonctionne avec succès.

Pour réitérer ma question : Les battements de cœur sont-ils nécessaires pour maintenir une connexion TCP/IP en vie ?

1 votes

Ce comportement pourrait-il également dépendre de l'implémentation ? Est-il spécifié dans la norme TCP ou s'agit-il d'un détail de mise en œuvre ? J'espère que quelqu'un d'autre pourra répondre à cette question.

1 votes

Il s'agit d'un détail d'implémentation, car tous les protocoles basés sur TCP/IP n'implémentent pas ce genre de choses, c'est à vous de décider.

6 votes

Oui, pas à cause de TCP/IP, mais à cause d'autres matériels ou logiciels par lesquels votre connexion peut passer, comme les pare-feu et les routeurs domestiques qui ont tendance à supprimer les connexions TCP inactives : stackoverflow.com/questions/3907537/

59voto

Lloyd Points 16334

La connexion devrait restent ouvertes quoi qu'il en soit, mais il est fréquent de voir des protocoles implémenter un battement de cœur afin d'aider à détecter les connexions mortes. PING par exemple.

42 votes

Une autre raison courante pour les keepalives est de maintenir la connexion ouverte à travers les passerelles nat. Alors que le protocole TCP lui-même n'a pas besoin de keepalives pour fonctionner, il est courant que les passerelles nat "abandonnent" une connexion tcp après un délai donné.

5 votes

Quel est le délai d'attente normal ? secondes, minutes, heures ?

0 votes

@Lloyd Je "pense" que MiniGod voulait dire, "Combien de temps serait un normal timeout ?" (la réponse est donnée en secondes, minutes, heures, )

58voto

Gerald Combs Points 746

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

0 votes

La connexion TCP sera toujours en vie ?

27voto

Eero Aaltonen Points 590

Si vos composants :

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

alors vous n'avez pas besoin d'avoir un battement de cœur.

Si l'une de ces hypothèses est fausse (je vous regarde, GPRS !), un coup de cœur s'impose assez rapidement.

1 votes

Il s'agit cependant d'une mise en réseau générale. Considérez les Fallacies of Distributed Computing de Peter Deutsch ; 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, partez du principe que vous connaîtrez une défaillance à un moment donné et concevez votre application pour gérer ce scénario.

13voto

Brian Agnew Points 143181

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

Notez que TCP implémente une option keepalive qui peut être utilisé pour identifier une connexion fermée en temps voulu, plutôt que de vous demander d'envoyer des données à une date ultérieure et de découvrir seulement ensuite que la connexion est fermée.

1 votes

Comment est-ce que cela est censé fonctionner sous linux ? Est-ce que cela fonctionne vraiment ? Est-ce que je peux programmer le délai d'attente pour qu'il soit inférieur à 2 heures ? par exemple 30 secondes ?

0 votes

Pour que cela fonctionne, l'application doit prendre en charge la fonction keepalive. L'activer simplement sous Linux ne sera pas suffisant.

9voto

Andrew Keith Points 5627

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

L'intervalle par défaut de la fonction "keep-alive" est de 2 heures.

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

Vous devrez peut-être mettre en œuvre votre propre rythme cardiaque et désactiver la fonction "keep-alive" de TCP sur Windows si la fonction "keep-alive" de 2 heures n'est pas souhaitable.

0 votes

Keep alive peut être implémenté comme une option de socket SO_KEEPALIVE pour les connexions individuelles. L'intervalle entre les messages est de 1 seconde par défaut. Cela peut nécessiter un soutien des deux points d'extrémité pour un fonctionnement correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X