II. Le protocole
La notion de connexion, telle qu'expliquée dans la NWG/RFC #33, imprègne l'ensemble du protocole. Une connexion est un chemin de communication simplex, destiné à relier deux processus.
La fonction principale du protocole est d'assurer (1) l'établissement des connexions, (2) la régulation du flux sur les connexions et (3) la terminaison des connexions.
En outre, le protocole fournit certaines fonctions auxiliaires, telles que l'envoi d'impulsions d'interruption simulées et l'écho de messages de test.
Afin de disposer d'un chemin pour échanger des informations sur les connexions, nous désignons des liaisons spécifiques, à savoir la liaison un entre chaque paire d'hôtes, comme liaisons de contrôle. Le trafic sur les liaisons de contrôle se compose uniquement de commandes de contrôle, définies ci-dessous.
Les connexions sont nommées par une paire de sockets. Les sockets sont des noms de 40 bits connus dans tout le réseau. Chaque hôte se voit attribuer un sous-ensemble privé de ces noms, et une commande qui demande une connexion nomme un socket local à l'hôte demandeur et un socket local au destinataire de la demande.
Les sockets sont polarisés. Les sockets de numéro pair sont des sockets de réception, ceux de numéro impair sont des sockets d'émission. Il en faut un de chaque type pour établir une connexion.
Pour faciliter la transmission d'informations sur une connexion, une liaison unique est attribuée à chaque connexion. L'une des étapes de l'établissement d'une connexion est donc l'attribution d'une liaison. Parmi les liaisons autres que de contrôle, la liaison zéro est réservée à l'usage interne du réseau, et les liaisons 32 à 255 sont réservées à l'expérimentation et à l'extension. Ainsi, seules les liaisons 2 à 31 sont disponibles pour un usage régulier. L'attribution des liaisons doit être faite soit toujours par le récepteur, soit toujours par l'émetteur. Nous avons choisi (presque) arbitrairement d'en confier la responsabilité au récepteur.
Tous les messages réguliers se composent d'un en-tête de 32 bits, d'un marquage, du texte et d'un remplissage. Le marquage est une suite (éventuellement vide) de zéros suivie d'un 1, et le remplissage est un 1 suivi d'une suite (éventuellement vide) de zéros.
Un message régulier envoyé sur la liaison de contrôle (liaison 1) est appelé message de contrôle. Son texte est constitué d'un nombre entier (éventuellement nul) de commandes de contrôle, sous la forme décrite ci-dessous, et ce texte doit se terminer à une limite de commande.
Les commandes servant à établir une connexion sont STR et RTS. La commande STR est envoyée par un émetteur potentiel à un récepteur potentiel. Son champ <my socket> contient un socket d'émission local à l'émetteur potentiel, et son champ <your socket> contient un socket de réception local au récepteur potentiel. La commande RTS en est le dual, mais elle contient en outre un champ <link> pour l'attribution de la liaison. Ces deux commandes sont appelées demandes de connexion (RFC). Une STR et une RTS concordent si le champ <my socket> de l'une est identique au champ <your socket> de l'autre, et réciproquement. Une connexion est établie lorsqu'une paire de RFC concordantes a été échangée.
Il est interdit aux hôtes d'établir plus d'une connexion vers un même socket local. Par conséquent, un hôte ne peut pas utiliser un socket dans le champ <my socket> d'une RFC si ce socket est mentionné dans une RFC précédente et que la connexion n'est pas encore terminée.
La commande servant à terminer une connexion est CLS. Chaque côté doit envoyer et recevoir une commande CLS avant qu'une connexion soit complètement terminée et que les sockets soient libres de participer à d'autres connexions. Il n'est pas nécessaire que les deux RFC aient été échangées avant qu'une connexion soit terminée. Plus de détails sur la terminaison sont donnés ci-dessous.
Une fois une connexion établie, l'hôte récepteur envoie une commande ALL qui alloue de l'espace pour la connexion. L'émetteur tient le compte de l'espace disponible dans l'hôte récepteur et ne transmet pas plus de texte que l'hôte récepteur ne peut en accepter, comme expliqué ci-dessus. L'IMP local empêche en outre un émetteur d'envoyer un message sur une connexion tant que le RFNM du message précédent n'a pas été reçu.
Une fois une connexion établie, les commandes CLS envoyées par le récepteur et par l'émetteur ont des effets légèrement différents. Une commande CLS envoyée par l'émetteur indique qu'aucun autre message ne sera envoyé sur la connexion. Cette commande ne doit pas être envoyée si un message est en transit sur la connexion.
Les commandes CLS envoyées par le récepteur valent demande à l'émetteur de cesser la transmission. Cependant, comme l'acheminement de la commande CLS jusqu'à l'émetteur prend un certain délai, le récepteur doit s'attendre à ce que ses tampons se remplissent jusqu'à la limite fixée dans les commandes ALL.
Tant qu'une connexion est établie, chaque côté peut envoyer des commandes INR ou INS. L'interprétation de ces commandes est une affaire locale, mais en général elles fourniront une fonction d'échappement.
Notez que les commandes ALL, INR et INS ne peuvent être envoyées qu'après l'établissement de la connexion et avant l'envoi d'une commande CLS.
Les commandes ECO et ERP fournissent un dispositif de test très simple. À la réception d'une commande ECO, un hôte doit changer les huit premiers bits en ERP et la renvoyer. Ces commandes n'ont aucun rapport avec les connexions.
Une commande NOP est incluse par commodité. Elle est codée par zéro afin de faciliter la construction des messages de commande.
Enfin, une commande ERR est prévue pour signaler à un hôte distant qu'il a (apparemment) commis une erreur. Pour l'instant, aucune liste précise d'erreurs n'est définie, et aucune action n'est définie à la réception de commandes ERR. Les hôtes devraient consigner les commandes ERR à leur réception afin que les programmeurs système puissent diagnostiquer le problème. Un hôte peut générer une commande ERR à tout moment et pour toute raison, mais il est recommandé que chaque hôte publie une liste exhaustive des commandes ERR qu'il est susceptible d'envoyer et de leurs interprétations.
Commandes de contrôle du réseau
Voici une description détaillée de la structure et du format de chacune des commandes de contrôle.
Pour faciliter et clarifier la description des sockets, les conventions suivantes ont été adoptées:
<my socket> et <your socket> sont utilisés dans les descriptions des commandes.
<my socket> est local à l'initiateur de la commande.
<your socket> est local au destinataire de la commande.
Formats des commandes de contrôle
Aucune opération
_______
| |
| NOP |
|_______|
Demande de connexion, du récepteur vers l'émetteur
______________________________________________
| | | | |
| RTS | my socket | your socket | link |
|_______|_____________|_______________|________|
Demande de connexion, de l'émetteur vers le récepteur
_____________________________________
| | | |
| STR | my socket | your socket |
|_______|_____________|_______________|
Fermeture
_____________________________________
| | | |
| CLS | my socket | your socket |
|_______|_____________|_______________|
Allocation
__________________________
| | | |
| ALL | link | space |
|_______|________|_________|
Interruption envoyée par le processus récepteur
_______________
| | |
| INR | link |
|______|________|
Interruption envoyée par le processus émetteur
_______________
| | |
| INS | link |
|______|________|
Demande d'écho
____________________________ _________
| | \ \ |
| ECO | length / / text |
|_______|____________________\ \________|
Réponse d'écho
____________________________ _________
| | \ \ |
| ERP | length / / text |
|_______|____________________\ \________|
Erreur détectée
____________________________ _________
| | \ \ |
| ERR | length / / text |
|_______|____________________\ \________|
L'hôte est spécifié dans l'en-tête.
<link> fait 8 bits
<space> fait 32 bits et est un entier non signé.
<length> est un entier non signé de 16 bits.
<text> a la longueur indiquée par length. La commande est donc plus longue de 24 bits que length. La longueur maximale est d'un message, afin de faciliter le décodage et la manipulation des commandes.
Tous les codes de commande de contrôle font 8 bits:
NOP = 0
RTS = 1
STR = 2
CLS = 3
ALL = 4
INR = 5
INS = 6
ECO = 7
ERP = 8
ERR = 9
<my socket> et <your socket> font 32 bits,
_______________________
| | |
| User number | AEN |
|_______________|_______|
24 bits pour le numéro d'utilisateur et 8 bits pour l'AEN.