Aller au contenu principal

VII. État de la connexion

Un excellent moyen de décrire la séquence d'événements nécessaire pour établir et terminer une connexion consiste à utiliser un diagramme d'états. Nous pouvons supposer que chaque socket peut être associé à une machine à états, et que cette machine à états peut, à tout moment, se trouver dans l'un de dix états possibles. Dans chaque état, certains événements réseau font passer l'état de la connexion à un autre état ; d'autres événements sont ignorés ; d'autres encore constituent des erreurs. Une transition peut également impliquer que le NCP local effectue une action. La Figure 7.1 représente la machine à états. Les cercles [désormais des rectangles : Éd.] représentent les états (décrits ci-dessous) ; les flèches indiquent les transitions légales entre états. Les libellés des flèches identifient l'événement qui les a provoquées (notez que CLOSE est un appel système et CLS une commande de contrôle). Les expressions placées après des barres obliques indiquent l'action à effectuer lors du passage par cette flèche. La flèche étiquetée '[E]RFC' (située entre les états 0 et 1) représente la condition selon laquelle, chaque fois qu'une connexion entre dans l'état CLOSED, la file des appels en attente de cette connexion est vérifiée [L'original comportait un « E » inversé : Éd.]

S'il existe des appels en attente dans la file, la connexion passe à l'état PENDING. Si un RFC est reçu pour un socket dans l'état CLOSED, il est également acheminé par ce chemin vers l'état PENDING. Les événements et les actions qu'ils provoquent sont décrits dans les sections VIII et IX ci-dessous. Voici la description des dix états :

(0) CLOSED​

Le socket local n'est attaché à aucun port et aucun utilisateur n'a demandé de connexion avec lui. (L'entrée de table n'existe pas.)

(1) PENDING CALL​

Le socket n'est attaché à aucun port, mais une ou plusieurs demandes de connexion ont été reçues. Un appel système LISTEN sera satisfait immédiatement par la première entrée de la file des appels en attente correspondant à une requête ; tous les autres appels en attente sont supprimés.

(2) LISTENING​

Le socket est attaché à un port. Nous attendons qu'un utilisateur demande une connexion avec ce socket.

(3) RFC-RCVD​

Nous sommes en écoute et un RFC a été reçu. L'utilisateur local a été informé de l'appel en attente. Il doit répondre soit par un CLOSE, soit par un ACCEPT.

(4) ABORT​

Nous avons averti l'utilisateur que son LISTEN a été satisfait, mais il n'a pas encore répondu ; si, pendant ce temps, l'utilisateur distant abandonne la connexion en envoyant un CLS, nous envoyons un CLS pour acquitter l'abandon et consignons ce fait par cet état. Lorsque l'utilisateur accepte ou refuse l'appel, nous pouvons l'informer que la connexion a été terminée prématurément.

(5) RFC-SENT​

On entre dans cet état lorsque :

  • a) L'utilisateur local a attaché ce socket à un port en émettant un CONNECT.
  • b) Un RFC a été envoyé, et
  • c) Aucune réponse n'a été reçue.

Lorsque l'utilisateur émet un CONNECT, la file des appels en attente est parcourue.

Si aucun RFC correspondant n'est trouvé, la file est supprimée et on entre dans cet état. À mesure que de nouveaux RFC arrivent, ils sont comparés à la requête de notre utilisateur. S'ils ne correspondent pas, le RFC est immédiatement refusé. Si le RFC correspond, il achève le processus d'initialisation et la connexion entre dans l'état OPEN.

(6) OPEN​

Les RFC ont été échangés et la connexion est solidement établie. La transmission peut commencer après la réception d'une commande ALL provenant du côté réception, et se poursuivra ensuite sous réserve du contrôle de flux.

(7) CLS-WAIT​

Après que l'utilisateur local a exécuté un CLOSE et que nous avons émis un CLS, nous devons attendre un CLS d'acquittement avant que la connexion puisse être complètement fermée. Si le CLS approprié n'a pas déjà été reçu, on entre dans cet état.

(8) DATA-WAIT​

Si nous sommes du côté émission et que l'utilisateur local exécute un appel système CLOSE, un CLS ne peut pas être émis si notre tampon de données n'est pas vide ou si un RFNM pour le dernier message de données est encore attendu. La connexion entre dans cet état pour attendre que ces conditions soient remplies. Une fois la sortie terminée et acquittée, un CLS peut être émis et la connexion entre dans l'état CLS-WAIT, en attendant le CLS d'acquittement. Si un CLS arrive alors que l'on est dans l'état DATA-WAIT, nous vidons notre tampon (le CLS provient d'un socket de réception, indiquant qu'il ne s'intéresse plus à nos données) et entrons dans l'état RFNM-WAIT pour attendre que le réseau se vide.

(9) RFNM-WAIT​

Si nous sommes du côté émission et qu'une commande CLS arrive, nous ne pouvons pas émettre de CLS d'acquittement si nous n'avons pas reçu le RFNM pour notre dernier message de données. Nous entrons dans cet état pour attendre le RFNM et cessons toute nouvelle transmission de données. Lorsque le RFNM arrive, un CLS peut alors être émis et la connexion sera fermée.

                      ______________
                     |              |       CLOSE
      CONN/          |    CLOSED    |<---------------------------+
      send RFC       |     (0)      |       LISTEN               |
    +----------------|              |-----------------------+    |
    |                |______________|                       |    |
    |                     |    ^                            |    |
    |              [E]RFC |    |  CLS/send CLS              |    |
    |                  ___V____|____                     ___V____|____
    |  non-matching   |             |                   |             |
    |  CONN/send RFC  |   PENDING   | LISTEN        RFC |  LISTENING  |
    |   +-------------|    (1)      |----------+   +----|     (2)     |
    |   |             |_____________|          |   |    |_____________|
    |   |       matching     |                 |   |
 ___V___V_____  CONN/send RFC|               __V___V______
|             |              |     ACCEPT/  |             | CLS/
|   RFC-SENT  | RFC          |     send RFC |   RFC-RECD  | send CLS
|     (5)     |----------+   |   +----------|     (3)     |---------+
|_____________|          |   |   |          |_____________|         |
   |   |                 |   |   |               |                  |
   |   |              ___V___V___V___  SND&CLOSE |   ____________   |
   |   |    RCV&CLS/ |               |-----------)->|            |  |
   |   |    send CLS |      OPEN     | SND&CLS   |  |  DATA-WAIT |  |
   |   |   +---------|      (6)      |--------+  |  |    (8)     |  |
   |   |   |         |_______________|        |  |  |____________|  |
   |   |   |      RCV&CLOSE/ |                |  |   |              |
   |   |   |       send CLS  |                |  |   |              |
   |   |   |                 |                |  |   | CLS          |
   |   |   |           ______V______          |  |   |              |
   |   |   |   CLOSE/ |             |CLOSE/   |  |   |              |
   |   |   |  send CLS|   CLS-WAIT  |send CLS |  |   |              |
   |   +---)--------->|     (8)     |<--------)--+   |              |
   |       |          |_____________|         |      |              |
   |       |                 |             ___V______V_       ______V___
   |       |                 |            |            |     |          |
   |       |                 |            |  RFNM-WAIT |     |   ABORT  |
   |       |             CLS |            |     (9)    |     |    (4)   |
   |       |                 |            |____________|     |__________|
   |       |                 |                   |                 |
   |       |           ______V_______  RFNM/     |                 |
   |       |          |              | send CLS  |                 |
   |  CLS/ +--------->|    CLOSED    |<----------+                 |
   | send CLS         |     (0)      |                ACCEPT|CLOSE |
   +----------------->|              |<----------------------------+
                      |______________|

Figure 7.1 : Diagramme d'états de la connexion