Aller au contenu principal

2. Procédures hôte-hôte

2.1 Généralités​

L'idée de base est que plusieurs utilisateurs, sur un hôte donné, devraient pouvoir utiliser simultanément le réseau en partageant dans le temps ses installations physiques.

Cela implique qu'au sein de chaque système d'exploitation d'hôte, il doit exister un programme spécial qui multiplexe vers le réseau les messages sortants des utilisateurs et distribue les messages entrants aux utilisateurs appropriés. Nous appellerons ce programme spécial le programme Réseau.

2.2 Liaisons et connexions (voir figure 1)​

2.2.1 Définitions​

Il est commode de considérer le Réseau comme une boîte noire - un système dont le comportement est connu mais dont les mécanismes ne le sont pas - servant à faire communiquer des messages entre des utilisateurs distants plutôt qu'entre des paires d'ordinateurs hôtes.

(a) Connexions logiques​

Nous définissons une connexion logique comme étant un chemin de communication reliant deux utilisateurs sur des HOST[s] distants.

Avec ce concept, un utilisateur (programme utilisateur) sur un ordinateur hôte peut (1) établir plusieurs connexions logiques vers n'importe quels utilisateurs d'hôtes distants, et (2) envoyer ou recevoir des messages sur ces connexions.

Les connexions apparaissent aux utilisateurs comme étant en duplex intégral.

L'un des buts du programme Réseau est de servir les utilisateurs pour établir, identifier et maintenir ces connexions.

(b) Liaisons logiques​

Chaque connexion logique est constituée d'une paire de liaisons directionnelles : l'une pour l'émission, l'autre pour la réception.

Ces liaisons, appelées liaisons logiques, sont établies par les programmes Réseau et utilisées par eux.

Notons ici que les utilisateurs ne s'intéressent qu'aux connexions et ignorent complètement les liaisons. Les relations entre liaisons et connexions sont prises en charge par le programme Réseau.

L'un des avantages à définir une connexion comme une paire de liaisons directionnelles est qu'un hôte aura la capacité de se boucler lui-même à travers son IMP (il ouvre une connexion vers lui-même). Cette particularité peut être utile à des fins de mise au point.

Dans la suite de ce document, nous n'utiliserons plus l'attribut logique en nous référant aux liaisons ou aux connexions.

2.2.2 Types de connexion​

Afin d'atteindre une grande souplesse dans l'utilisation du Réseau, il est avantageux de classer les connexions.

On distingue trois types de connexions : (a) connexion de contrôle, (b) connexion primaire et (c) connexion auxiliaire.

(a) Connexion de contrôle​

Cette connexion a un statut particulier et est unique entre une paire de HOST[s] ; par exemple, si le Réseau comprend x HOST[s], il y a au plus x connexions de contrôle issues d'un hôte.

Cette connexion est utilisée par les programmes Réseau distants pour échanger des messages de contrôle dans les deux sens. Les messages de contrôle sont fondamentaux pour l'établissement/la suppression des connexions standard. (Voir 2.4.2)

Notons ici que cette connexion de contrôle est la seule connexion qui n'est pas utilisée par les utilisateurs de l'hôte.

Décrivons maintenant les connexions standard.

(b) Connexion primaire​

Ces connexions relient des utilisateurs distants.

Une connexion primaire :

  • Est unique entre une paire d'utilisateurs et est la première à être établie.
  • Est "de type téléscripteur", c'est-à-dire :
    • Les caractères ASCII sont transmis ;
    • Les échos sont générés par l'hôte distant ;
    • Les HOST[s] récepteurs recherchent les caractères de rupture ;
    • Le débit de transmission est lent (moins de 20 caractères/seconde).
  • Est principalement utilisé pour transmettre des commandes de contrôle, par exemple pour l'ouverture de session dans le système d'exploitation d'un hôte distant.

(c) Connexion auxiliaire​

Ces connexions relient également des utilisateurs distants :

Une connexion auxiliaire :

  • Est ouverte parallèlement à une connexion primaire et n'est pas unique, c'est-à-dire que plusieurs connexions auxiliaires peuvent être établies entre des utilisateurs.
  • Est utilisée pour transmettre de grands volumes de données (orientée fichier).
  • Est utilisée soit pour la transmission binaire, soit pour la transmission de caractères.

[Figure 1 - Liaisons et connexions - voir le fichier PDF]

2.3 Structure des messages​

Les HOST[s] communiquent entre eux au moyen de messages. Un message peut avoir une longueur variable allant jusqu'à 8095 bits (voir plus bas la structure). Les transmissions plus importantes doivent donc être découpées par les utilisateurs de l'hôte en une séquence de tels messages.

La structure d'un message est identifiée sur la figure 2.

Elle comprend les éléments suivants :

(1) Un en-tête (32 bits) : type de message, hôte source/destination, numéro de liaison. (Voir rapport BBN n° 1822, p. 13, 17)

(2) Un marquage (32 bits lorsqu'il est émis par le Sigma 7) pour commencer un texte de message sur une frontière de mot. (Voir rapport BBN n° 1822, p. 17, 19)

(3) Le texte du message (max. : 8015 bits pour le Sigma 7). Il est constitué principalement du texte de l'utilisateur. Toutefois, il peut représenter des informations destinées aux programmes Réseau. (Messages de contrôle, voir 2.4.2)

(4) Une somme de contrôle (16 bits). Son but est de vérifier, au niveau de l'hôte, la bonne transmission d'un message. (Modifications de la configuration des bits ou transposition de paquets ; les paquets sont définis dans le rapport BBN n° 1763, p. 13) Voir plus bas le calcul de la somme de contrôle.

(5) Un remplissage pour résoudre les problèmes de non-concordance de longueur de mot. (Voir rapport BBN n° 1822, p. 17, 19.). En ce qui concerne le logiciel, le remplissage n'intervient qu'à la réception des messages pour délimiter les fins de message. (À l'émission, le matériel se charge du remplissage.)

Remarque :

Calcul de la somme de contrôle :

Les 16 derniers bits de chaque message envoyé par un hôte constituent une somme de contrôle. Cette somme de contrôle est calculée sur l'ensemble du message, y compris tout marquage, mais à l'exclusion de l'en-tête de 32 bits et de tout remplissage. Pour calculer la somme de contrôle :

  1. Considérer le message comme rempli de zéros jusqu'à une longueur de 8640 bits.
  2. Découper les 8640 bits en six segments de 1440 bits, S0, S1...S5.
  3. Découper chaque segment S de 1440 bits en 90 éléments de 16 bits, T0, T1...T89.
  4. Définir une fonction [(+)], qui prend deux éléments de 16 bits en entrée et produit un élément de 16 bits en sortie. Cette fonction est définie par

Tm [(+)] Tn = Tm [(+)] Tn, si Tm + Tn < 2[exp 16]

Tm [(+)] Tn = Tm [(+)] Tn - 2[exp 16] + 1, si Tm + Tn >= 2[exp 16]

  1. Pour chaque segment Si de 1440 bits, calculer Ci = K(Si), où

K(S) = T0 [(+)] T1 + ..... T89

  1. Calculer C = C0[(+)]C1[(+)]C1[(+)]C2[(+)]C2[(+)]C2[(+)]C2....[(+)]C5

(Noter que C1[(+)]C1 n'est que C1 décalé d'un bit vers la gauche)

Le nombre C est la somme de contrôle. La raison pour laquelle les Ci sont décalés de i bits est de détecter la transposition de paquets.

[Figure 2 - Format d'un message envoyé par le Sigma 7 - voir le fichier PDF]

2.4 Transactions utilisateur​

D'après ce qui a été exposé jusqu'ici, le Réseau apparaît à un utilisateur comme un ensemble de connexions. Expliquons maintenant comment on peut utiliser ces connexions.

Tout d'abord, nous allons décrire l'ensemble des transactions auxquelles un utilisateur devrait pouvoir accéder pour utiliser les facilités de connexion.

Ensuite, nous allons expliquer le rôle du programme Réseau dans l'exécution de ces transactions. Cela couvrira un protocole hôte-hôte dans lequel des messages de contrôle sont échangés entre programmes Réseau.

À des fins d'explication, ces transactions sont représentées, au niveau de l'utilisateur, sous la forme d'appels de sous-programmes et de paramètres. Toutefois, cela n'implique nullement que la mise en œuvre suivra étroitement ce modèle. (Nous traitons ici davantage de la description que de l'aspect mise en œuvre, voir chapitre 3.)

2.4.1 Liste des transactions​

On trouvera ci-dessous les descriptions des sous-programmes qui pourraient être à la disposition de l'utilisateur pour créer/rompre des connexions et transmettre/recevoir des données sur celles-ci. Cet ensemble de sous-programmes peut être considéré comme une sorte d'interface entre le niveau utilisateur et le niveau du programme Réseau.

(a) Ouvrir une connexion primaire :​

OPENPRIM (CONNECTID, HOSTID, BUFFADDR, [OPT]) CONNECTID : identification de la connexion # HOSTID : identification de l'hôte distant # BUFFADDR : adresse du tampon pour les messages entrants. OPT : options telles que le message requis après l'établissement réussi de la connexion, "écho intégral" (chaque message est renvoyé par l'hôte distant à des fins de vérification), etc.

Remarque : [ ] signifie facultatif

(b) Ouvrir une connexion auxiliaire​

OPENAUX (CONNECTID, BUFFADDR, N, [OPT]) CONNECTID : identification de la connexion #, c'est-à-dire l'identification de la connexion primaire correspondante (l'utilisateur doit d'abord ouvrir une connexion primaire). BUFFADDR : même signification que ci-dessus. N : nombre de connexions auxiliaires à ouvrir. OPT : même signification que ci-dessus.

(c) Transmission sur une connexion​

TRANSM (CONNECTID, NO, BUFFADDR, N, [OPT]) CONNECTID : identification de la connexion # NO : numéro de connexion #. La connexion primaire est toujours désignée par NO=0. Le numéro d'une connexion auxiliaire correspond à l'ordre dans lequel elle a été établie. (La première auxiliaire ouverte est désignée par NO=1, la deuxième par NO=2, etc.) BUFFADDR : adresse du tampon du message à transmettre. N : taille du message (nombre d'octets) OPT : options telles que le type de données (caractères ou binaire), le bit de trace, etc.

(d) Fermer une connexion​

CLOSE (CONNECTID, [N], [NO]) CONNECTID : identification de la connexion #. N : nombre de connexions à fermer. Si ce paramètre est omis, toutes les connexions utilisées par l'utilisateur, y compris la liaison primaire, sont fermées. NO : dans le cas où N est différent de zéro, ce nombre indique la connexion auxiliaire # à fermer.

2.4.2 Protocole hôte-hôte et messages de contrôle​

Le protocole hôte-hôte est mis en œuvre par les programmes Réseau. Il implique principalement l'exécution des transactions précédentes (initiées par les utilisateurs) et couvre un dialogue hôte-hôte.

Ce dialogue réalise les procédures de contrôle d'ouverture ou de rupture des connexions et consiste à échanger des messages de contrôle sur la liaison de contrôle. Un message de contrôle a une structure identique à celle d'un message ordinaire ; il n'en diffère que par le texte, qui est destiné aux programmes Réseau au lieu des utilisateurs.

Insistons sur le fait que cette procédure de contrôle est totalement indépendante des procédures de contrôle de transmission mises en œuvre dans les ordinateurs IMP. Nous sommes ici au niveau de l'hôte (programmes Réseau), et par conséquent les messages de contrôle, qui vont être décrits ci-dessous, sont transmis à travers les IMP[s] comme des messages ordinaires.

Considérons maintenant les transactions précédentes et décrivons, pour chacune d'elles, quels messages sont échangés sur quelles liaisons. Chaque cas sera expliqué au moyen d'exemples simples.

Nous supposons qu'un utilisateur de HOST(x) veut un programme de l'hôte distant HOST(y) appelé URSA.

(a) Ouvrir une connexion primaire : (OPENPRIM)​

Le programme Réseau de HOST (x), réveillé (voir 3.3) par un utilisateur pour ouvrir une connexion primaire, engage un dialogue avec le programme Réseau de HOST (y).

(i) HOST(x) envoie le message de contrôle suivant :​
HOST(x)       Control link                      HOST(y)
-------------------->
ENQ PRIM 0 1 2

ENQ : demande d'établissement de connexion (un caractère ASCII) PRIM : type de connexion : primaire (un caractère spécial) 0 1 2 : numéro de la liaison sortante. C'est un nombre décimal (3 caractères ASCII), par exemple la liaison #12.

Ce numéro de liaison a été déterminé par le programme Réseau de HOST(x) (voir mise en œuvre : 3.3)

(ii) HOST(y) acquitte en renvoyant le message de contrôle suivant :​
HOST(x)        Control link                     HOST(y)
<------------------------
ACK ENQ PRIM 0 1 2 0 1 5

ACK : acquittement positif (un caractère ASCII) ENQ PRIM 0 1 2 : même signification que ci-dessus. Cette partie du message est renvoyée à des fins de vérification. 0 1 5 : numéro de la liaison entrante. Il suit le même modèle que le numéro de la liaison sortante. Ce numéro de liaison a été déterminé par le programme Réseau de HOST(y).

Maintenant la connexion est établie ; elle utilisera les liaisons #12 et 15 pour échanger des messages utilisateur. On dit que la connexion est dans un état de pré-ouverture de session, c'est-à-dire que l'hôte distant HOST(y) attend ses procédures standard d'ouverture de session.

(b) Transmission sur la connexion primaire : (TRANSM)​

Au moyen de sous-programmes TRANSM se référant à la connexion primaire, l'utilisateur de HOST(x) peut ouvrir une session dans le système d'exploitation de HOST(y), puis appeler le programme URSA (programme utilisateur de HOST(y)).

Les programmes Réseau aux deux extrémités utiliseront les liaisons #12 et #15 pour faire passer les messages. Ces messages sont des messages standard dont le contenu sert à la séquence d'ouverture de session.

Un exemple simple pourrait être :

HOST(x)     Prim. Link #12                       HOST(y)
---------------------------->
! S I G N - I N : X X
HOST(x) Prim. Link #15 HOST(y)
<--------------------------
! ! R E A D Y
HOST(x)     Prim. Link #12                       HOST(y)
---------------------------->
! U R S A

(c) Ouvrir une connexion auxiliaire : (OPENAUXI)​

D'une manière très semblable à (a), une connexion auxiliaire est établie entre HOST(x) et HOST(y). Pour ce faire, des messages de contrôle sont échangés sur la liaison de contrôle.

HOST(x)           Control link                  HOST(y)
------------------------------>
ENQ AUX 0 2 5
HOST(x)           Control link                  HOST(y)
<--------------------------------
ACK ENQ AUX 0 2 5 0 2 1

Maintenant la connexion auxiliaire est établie ; elle utilisera les liaisons #25 et 21 pour échanger des messages standard.

(d) Transmission sur la connexion auxiliaire : (TRANSM)​

Au moyen de sous-programmes TRANSM se référant à la connexion auxiliaire, les utilisateurs aux deux extrémités peuvent échanger des données :

HOST(x)        Aux. Link #25                    HOST(y)
-------------------------------->
X X ..... X X
HOST(x)         Aux. Link #21                   HOST(y)
<--------------------------------
X ......... X

etc.......

(e) Fermer les connexions : (CLOSE)​

Ceci est effectué d'une manière semblable à (a). L'utilisateur appelle un sous-programme CLOSE, puis les programmes Réseau aux deux extrémités échangent des messages de contrôle.

HOST(x)           Control Link                  HOST(y)
----------------------------->
EOT 0 0 1 0 1 2

EOT : fin de transmission (un caractère ASCII) 0 0 1 : nombre de connexions à fermer (3 caractères ASCII décimaux) 0 1 2 : numéro de la liaison sortante à fermer.

Ensuite HOST(y) acquitte en retour comme en (a).

HOST(x)           Control Link                  HOST(y)
<-----------------------------
ACK EOT 0 0 1 0 1 2 0 1 5

Remarque 1 - En (a), (c) et (e), HOST(y) peut répondre par un message contenant un caractère d'acquittement négatif NAK au lieu d'ACK. Ceci pour de nombreuses raisons diverses telles que : mauvaise séquence, connexion déjà ouverte, etc. Le message pourrait être NAK IND, où IND est un caractère alphanumérique indiquant, sous forme codée, pourquoi le bloc précédent a été refusé. En recevant de tels acquittements, HOST(x) répétera son message jusqu'à ce que HOST(y) l'accepte. Une procédure d'urgence sera déclenchée si trop de "messages NAK" successifs se produisent.

Remarque 2 - Sur chacune des illustrations ci-dessus (flèches), seul le texte du message est représenté. En fait, des messages complets (avec en-tête, marquage, remplissage...) sont échangés sur ces liaisons.