<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Aperçu de TCP keepalive</title><link href="style.css" rel="stylesheet" type="text/css" /><meta content="DocBook XSL Stylesheets V1.73.2" name="generator" /><link rel="start" href="index.html" title="Guide pratique du maintien de connexion TCP" /><link rel="up" href="index.html" title="Guide pratique du maintien de connexion TCP" /><link rel="prev" href="index.html" title="Guide pratique du maintien de connexion TCP" /><link rel="next" href="ar01s03.html" title="Utiliser TCP keepalive sous Linux" /></head><body><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">Aperçu de TCP keepalive</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="index.html">Précédent</a> </td><th align="center" width="60%"> </th><td align="right" width="20%"> <a accesskey="n" href="ar01s03.html">Suivant</a></td></tr></table><hr /></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title"><a id="apercu" />Aperçu de TCP keepalive</h2></div></div></div><p> Afin de comprendre ce que fait TCP keepalive (que nous appellerons 'keepalive'), vous n'avez besoin que d'en lire le nom : keep TCP alive (maintenir TCP en vie), c'est à dire conserver la connexion TCP. Cela signifie que vous serez en mesure de vérifier l'état de votre socket de connexion (appelée aussi socket TCP), et de déterminer si la connexion est toujours établie ou si elle est rompue. </p><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="questce" />Qu'est-ce que TCP keepalive ?</h3></div></div></div><p> Le concept du keepalive est très simple: lorsque vous initiez une connexion TCP, vous y associez un jeu de chronomètres. Certains de ces chronomètres ont trait à la procédure du keepalive. Quand la durée maximale du keepalive est atteinte, vous adressez à l'hôte distant un paquet sonde de keepalive ne contenant aucune donnée, avec le bit ACK positionné. Cela est possible grâce aux particularités de TCP/IP, une sorte de ACK doublé, et l'hôte distant n'aura aucun argument, puisque TCP est un protocole orienté flux. En retour vous aurez une réponse de l'hôte distant (qui n'a nul besoin d'implémenter le keepalive, mais seulement TCP/IP), sans donnée, et le ACK positionné. </p><p> Si vous recevez une réponse à votre sonde keepalive, vous pouvez être certain que la connexion est toujours établie et active sans inquiétude pour le niveau applicatif. Concrètement, TCP permet de maintenir un flux, sans paquet, donc un paquet de longueur zéro n'est pas dangereux pour le programme utilisateur. </p><p> Cette méthode est utile car si les autres points distants perdent leurs connexions (en raison d'un redémarrage par exemple) vous détecterez que la connexion est rompue, même sans avoir de flux de donnée. Si les sondes keepalive n'obtiennent pas de réponse, vous pouvez certifier que la connexion ne peut plus être considérée comme valide et agir en conséquence. </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="pourquoiutiliser" />Pourquoi utiliser TCP keepalive ?</h3></div></div></div><p> Vous pouvez vivre plutôt heureux sans keepalive, donc si vous lisez ces lignes, soit vous essayez de comprendre si keepalive est une réponse possible à vos problèmes, soit vous n'avez rien de plus intéressant à faire et c'est bien aussi. :) </p><p> Keepalive est non invasif, et dans la plupart des cas, si vous avez un doute, vous pouvez l'activer sans risque d'erreur. mais souvenez vous que c'est générateur de flux supplémentaire, ce qui peut avoir un impact sur les routeurs et les pare-feu. </p><p> En résumé, utilisez vos méninges et soyez prudent. </p><p> Dans la section suivante nous distinguerons les deux objectifs de keepalive: <div class="itemizedlist"><ul><li><p>S'assurer qu'un hôte distant n'est pas injoignable</p></li><li><p>Éviter une déconnexion due à une inactivité réseau.</p></li></ul></div> </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="verifierinjoignables" />Vérifier les hôtes injoignables</h3></div></div></div><p> Keepalive peut être utilisé pour être averti que l'hôte distant est mort avant qu'il soit capable de vous le notifier. Cela pourrait se produire en différentes circonstances, une panique noyau ou une interruption soudaine du processus maintenant la connexion par exemple. Un autre cas justifiant keepalive pour détecter que l'hôte distant n'est pas joignable est la défaillance du réseau. Dans ce cas, si le réseau n'est pas à nouveau opérationnel, vous êtes dans la même situation que pour la mort de l'hôte distant. C'est dans ces cas de figure que les mécanismes TCP classiques ne permettent pas de s'assurer de l'état d'une connexion. </p><p> Songez à une simple connexion TCP entre l'hôte A et l'hôte B: il y a la poignée de main initiale en trois phases, le paquet SYN de A vers B, le SYN/ACK en retour de B vers A, et le ACK final de A vers B. A ce stade, nous sommes dans une situation stable : la connexion est établie, et les données peuvent donc être envoyées sur ce lien. Mais le problème survient : débranchez l'alimentation de B et instantanément il s'éteint, sans rien envoyer sur le réseau pour notifier A que la connexion va être interrompue. A, de son côté, est prêt à envoyer des données, et n'imagine pas que B est muet. Maintenant rebranchez l'alimentation de B et attendez que le système redémarre. A et B sont de retour, mais A présente une connexion toujours active vers B, alors que B l'ignore. La situation se résout d'elle-même lorsque A tente d'envoyer des données à B sur une connexion morte, et que B répond par un paquet RST, forçant A à finalement mettre fin à la connexion. </p><p> Keepalive peut vous notifier quand un destinataire devient injoignable sans risque de faux positif. En fait, si le problème tient au réseau entre les deux hôtes, le rôle du keepalive est d'attendre un temps pour tenter à nouveau, adressant le paquet keepalive avant de notifier de la rupture du lien. </p><p> <pre class="screen"> _____ _____ | | | | | A | | B | |_____| |_____| ^ ^ |--->--->--->-------------- SYN -------------->--->--->---| |---<---<---<------------ SYN/ACK ------------<---<---<---| |--->--->--->-------------- ACK -------------->--->--->---| | | | le système meurt ---> X | | le système redémarre ---> ^ | | |--->--->--->-------------- PSH -------------->--->--->---| |---<---<---<-------------- RST --------------<---<---<---| | | </pre> </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="eviterdeconnexion" />Éviter une déconnexion due à une inactivité réseau.</h3></div></div></div><p> L'autre objectif utile de keepalive est d'éviter que l'inactivité ne provoque une déconnexion. C'est un cas fréquent d'être déconnecté sans raison lorsque vous vous trouvez derrière un proxy NAT ou un pare-feu. Ce comportement est dû aux procédures de surveillance des connexions des proxies et pare-feu, qui tiennent un inventaire des connexions qui les traverse. En raison des limites physiques de leurs ressources, ces machines ne peuvent conserver en mémoire qu'un nombre déterminé de connexions. La règle la plus courante et la plus logique est de maintenir les connexions les plus récentes et de mettre d'abord fin aux connexions les plus anciennes ou inactives. </p><p> Pour revenir à nos hôtes A et B, reconnectons les. Une fois le lien établi, attendons qu'un évènement se produise pour le transmettre à l'hôte distant. Qu'en est-il si cet évènement se produit après un long moment ? Notre connexion a sa propre durée, qui est inconnue du proxy. Lorsque nous finissons par transmettre des données, le proxy n'est plus capable de les traiter correctement, et la connexion est rompue. </p><p> Puisque le fonctionnement normal est de mettre en tête de liste la connexion par laquelle transitent des paquets, et de choisir la dernière connexion de la file quand il faut en supprimer une, le fait d'envoyer périodiquement des paquets sur le réseau est un bon moyen pour toujours rester en phase avec un risque minime de suppression. </p><p> <pre class="screen"> _____ _____ _____ | | | | | | | A | | NAT | | B | |_____| |_____| |_____| ^ ^ ^ |--->--->--->---|----------- SYN ------------->--->--->---| |---<---<---<---|--------- SYN/ACK -----------<---<---<---| |--->--->--->---|----------- ACK ------------->--->--->---| | | | | | <--- connexion supprimée de la table | | | | |--->- PSH ->---| <--- connexion invalide | | | | </pre> </p></div></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="index.html">Précédent</a> </td><td align="center" width="20%"> </td><td align="right" width="40%"> <a accesskey="n" href="ar01s03.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">Guide pratique du maintien de connexion TCP </td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%"> Utiliser TCP keepalive sous Linux</td></tr></table></div></body></html>