Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 3232

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<!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  |
|_____|                                                   |_____|
   ^                                                         ^
   |---&gt;---&gt;---&gt;-------------- SYN --------------&gt;---&gt;---&gt;---|
   |---&lt;---&lt;---&lt;------------ SYN/ACK ------------&lt;---&lt;---&lt;---|
   |---&gt;---&gt;---&gt;-------------- ACK --------------&gt;---&gt;---&gt;---|
   |                                                         |
   |                                   le système meurt ---&gt; X
   |
   |                               le système redémarre ---&gt; ^
   |                                                         |
   |---&gt;---&gt;---&gt;-------------- PSH --------------&gt;---&gt;---&gt;---|
   |---&lt;---&lt;---&lt;-------------- RST --------------&lt;---&lt;---&lt;---|
   |                                                         |
</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  |
|_____|         |_____|                                   |_____|
   ^               ^                                         ^
   |---&gt;---&gt;---&gt;---|----------- SYN -------------&gt;---&gt;---&gt;---|
   |---&lt;---&lt;---&lt;---|--------- SYN/ACK -----------&lt;---&lt;---&lt;---|
   |---&gt;---&gt;---&gt;---|----------- ACK -------------&gt;---&gt;---&gt;---|
   |               |                                         |
   |               | &lt;--- connexion supprimée de la table    |
   |               |                                         |
   |---&gt;- PSH -&gt;---| &lt;--- 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>