TCP Keepalive est-il le seul mécanisme permettant de déterminer un lien rompu?

J’ai récemment rencontré un problème où un lien intermédiaire entre un serveur TCP et un client était en panne. Le client a l’obligation de se connecter à un serveur secondaire si le serveur principal est en panne. Lorsque le serveur principal est acheté (par exemple, en faisant ^ C sur le terminal), une séquence d’arrêt TCP passe et le client détecte avec succès le lien rompu et essaie le secondaire. Cependant, si le lien intermédiaire tombe en panne, le client et le serveur n’en seraient pas conscients. Le client ne peut détecter que lorsque ses tampons TCP se remplissent d’opérations “d’envoi” échouées.

Pour remédier à cela, le mécanisme “TCP Keepalive” a été utilisé. Cela fonctionne de manière satisfaisante.

Ma question est “TCP Keepalive” la seule solution?

-Prabhu

Keepalive a été conçu pour traiter les connexions dites à moitié ouvertes, lorsqu’un des côtés (généralement le serveur qui reçoit les demandes) ignore que la connexion a été rompue. Le client le sait généralement, car toute tentative d’envoi de requête au serveur vous renverra une erreur.

Une autre option consiste à garder le programme d’écoute en cours d’exécution. Lorsque le client détecte des problèmes de communication, il essaie simplement de se reconnecter au serveur. Le serveur obtient la connexion entrante, vérifie si elle provient de la même adresse IP et, le cas échéant, ferme la connexion ouverte et en établit une nouvelle.

Mais si le client ignore que la connexion a été interrompue et que le serveur doit envoyer quelque chose, le serveur n’a aucun moyen de rétablir la connexion, mais TCP keepalive.

Si vous ne souhaitez pas utiliser keepalive, vous pouvez utiliser keepalive au niveau de l’application, par exemple, en envoyant quelque chose comme des messages d’écho spécifiques à une application.

J’ai toujours géré cela au niveau de l’application en étendant le protocole via TCP entre le client et les serveurs avec “Keep Alive” -Messages. Le client et le client envoient ce message, par exemple, chaque seconde et s’ils n’ont pas reçu le message “Keep Alive” dans les 2 secondes , la connexion est probablement fermée.

Le mécanisme Keep-Alive de TCP est correct, mais difficile à utiliser, en particulier lorsque vous travaillez sur différentes plates-formes.

Une autre solution consiste à utiliser un battement de coeur sur un socket séparé. De cette façon, vous savez presque immédiatement si la connexion est en panne. Ceci est utile lorsque votre connexion principale envoie des données en continu sans limites de message.

Vous pouvez inventer et implémenter votre propre persistance en utilisant la fonctionnalité hors bande de TCP, mais je ne le considérerais même pas à moins que vous ayez un problème important avec celui qui est déjà conçu pour vous.

Même si SO_KEEPALIVE n’est pas défini, si vous essayez d’envoyer des données via une connexion TCP morte, elles sont généralement réinitialisées ou expirent – une de ces deux méthodes envoie éventuellement une erreur à l’application.

SO_KEEPALIVE signifie que ceci peut être détecté plus tôt sur une connexion autrement inactive. C’est tout.