III. Environnement
Nous supposons que le host type disposera d'un système d'exploitation à temps partagé dans lequel l'unité centrale est partagée entre des processus.
Processus
Nous envisageons que chaque processus soit étiqueté par un numéro_d'utilisateur. Il peut exister plusieurs processus ayant le même numéro d'utilisateur, auquel cas ils doivent tous coopérer en ce qui concerne l'utilisation du réseau.
Nous envisageons que chaque processus contienne un ensemble de ports qui lui sont propres. Ces ports servent aux entrées vers le processus ou aux sorties depuis celui-ci, en provenance ou à destination de fichiers, de périphériques ou d'autres processus.
Nous envisageons aussi que chaque processus dispose d'un canal d'événements sur lequel il peut recevoir des messages très courts (quelques bits). Nous utiliserons ce mécanisme pour avertir un processus qu'une action extérieure à ce processus s'est produite.
Pour se livrer à une activité de réseau, un processus rattache un socket_local à l'un de ses ports. Les sockets sont identifiés par un numéro d'utilisateur, un host et un AEN, et un socket est local à un processus si leurs numéros d'utilisateur concordent et s'ils se trouvent sur le même host. Un processus n'a besoin de spécifier qu'un AEN lorsqu'il désigne un socket local.
Chaque port a un état qui est modifié par les appels système et par des événements concurrents extérieurs au processus. Chaque fois que l'état d'un port change, un événement est envoyé au processus sur son canal d'événements, indiquant quel port a changé d'état. Le processus peut alors consulter l'état d'un port.
Ces hypothèses sont utilisées dans les éléments descriptifs qui suivent. Cependant, ces hypothèses ne sont pas imposées par le protocole de réseau et la mise en œuvre suggérée dans la section IV n'a aucun caractère contraignant.
Nous tenons à préciser très clairement que ces éléments ne sont proposés que pour donner des indices sur ce que pourraient être les difficultés de mise en œuvre, et non pour imposer une discipline particulière.
Par exemple, nous traitons les <RFC> qui arrivent pour des sockets locaux non rattachés comme valides et nous les mettons en file d'attente. Si on le souhaite, un NCP peut les rejeter, comme le suggère Meyer, ou il peut les conserver un certain temps et les rejeter s'ils ne sont pas rapidement satisfaits. Le protocole proposé permet toutes ces options.
Une autre option locale est celle, mentionnée précédemment, qui consiste à rattacher plusieurs ports à un socket. Nous avons montré une correspondance biunivoque, mais on peut n'en pas tenir compte. De même, les appels système ne sont qu'indicatifs.
Appels système
Voici des appels système types qu'un processus utilisateur pourrait exécuter. Nous ne les présentons que par souci d'exhaustivité ; chaque site mettra sans doute en œuvre l'ensemble équivalent qui lui convient.
Nous utilisons la notation
Syscall ( arg , arg ...; val ... )
1 2 1
où
-
Syscall est l'appel système
-
arg₁ etc. sont les paramètres fournis avec l'appel, et
-
val₁ etc. sont les valeurs éventuellement renvoyées par l'appel système.
Init (P,AEN,FS,Bsiz;C)
-
P: Spécifie un port du processus.
-
AEN: Spécifie un socket local. Le numéro d'utilisateur de ce processus et le numéro de host de ce host sont implicites.
-
FS: Spécifie un socket ayant n'importe quel numéro d'utilisateur, sur n'importe quel host, avec n'importe quel AEN.
-
Bsiz: Spécifie la quantité de mémoire, en bits, que l'utilisateur souhaite consacrer à la mise en tampon des messages.
-
C: Le code de condition renvoyé.
Init tente de rattacher le socket local spécifié par AEN au port P et d'initier une connexion avec le socket FS. Les valeurs possibles renvoyées dans C sont
-
C = ok: L'Init était licite et le socket FS est en cours de contact. Lorsque la connexion sera établie ou lorsque FS refusera, le processus recevra un événement.
-
C = busy: Le socket local était utilisé par un port de ce processus ou d'un autre processus ayant le même numéro d'utilisateur. Aucune action n'a été entreprise.
-
C = homosex: L'AEN et FS étaient soit tous deux des sockets d'émission, soit tous deux des sockets de réception.
-
C = nohost: Le host désigné dans FS n'est pas connu.
-
C = bufbig: Bsiz est trop grand.
Listen (P,AEN,Bsize;C)
-
P: Spécifie un port du processus.
-
AEN: Spécifie un socket local.
-
Bsiz: Spécifie une taille de tampon.
-
C: Le code de licéité renvoyé.
Les codes de C sont
C = ok
C = busy
C = bufbig
Le socket local spécifié par AEN est rattaché à P. S'il y a un appel en attente, il est traité ; sinon, aucune action n'est entreprise. Lorsqu'un appel arrive, une connexion est établie et le processus en est averti au moyen d'un événement.
Close (P)
P spécifie un port du processus.
Toute activité est arrêtée, et le port devient libre pour un autre usage.
Transmit (P,M,L1;L2,C)
-
P: Spécifie un port ayant une connexion ouverte.
-
M: Le texte à transmettre.
-
L1: Spécifie la longueur du texte.
-
L2: La longueur effectivement transmise.
-
C: Le code d'erreur.
La transmission a lieu entre les processus situés de part et d'autre du port.
Les codes de C sont
C = ok
ou
- C = not open: si aucune connexion n'est actuellement ouverte et non inhibée par ailleurs
Status (P;C)
L'état du port P est renvoyé dans C.