Zum Hauptinhalt springen

III. Umgebung

Wir nehmen an, dass der typische Host ein Timesharing-Betriebssystem hat, in dem die CPU von Prozessen gemeinsam genutzt wird.

Prozesse​

Wir stellen uns vor, dass jeder Prozess mit einer Benutzernummer gekennzeichnet ist. Es kann mehr als einen Prozess mit derselben Benutzernummer geben, und in diesem Fall sollten sie bei der Nutzung des Netzes alle zusammenarbeiten.

Wir stellen uns vor, dass jeder Prozess eine Menge von Ports enthält, die für den Prozess eindeutig sind. Diese Ports dienen der Eingabe in den bzw. der Ausgabe aus dem Prozess, von bzw. zu Dateien, Geräten oder anderen Prozessen.

Wir stellen uns außerdem vor, dass jeder Prozess einen Ereigniskanal hat, über den er sehr kurze Nachrichten (einige Bit) empfangen kann. Wir werden diesen Mechanismus nutzen, um einem Prozess mitzuteilen, dass eine Aktion außerhalb des Prozesses stattgefunden hat.

Um am Netzbetrieb teilzunehmen, schließt ein Prozess einen lokalen Socket an einen seiner Ports an. Sockets werden durch Benutzernummer, Host und AEN identifiziert, und ein Socket ist für einen Prozess lokal, wenn ihre Benutzernummern übereinstimmen und sie sich im selben Host befinden. Ein Prozess muss nur dann eine AEN angeben, wenn er sich auf einen lokalen Socket bezieht.

Jeder Port hat einen Status, der durch Systemaufrufe und durch nebenläufige Ereignisse außerhalb des Prozesses verändert wird. Immer wenn sich der Status eines Ports ändert, wird dem Prozess über seinen Ereigniskanal ein Ereignis gesendet, das angibt, welcher Port seinen Status geändert hat. Der Prozess kann sich dann den Status eines Ports ansehen.

Diese Annahmen werden im nachfolgenden beschreibenden Material verwendet. Diese Annahmen werden jedoch nicht durch das Netzprotokoll vorgeschrieben, und die in Abschnitt IV vorgeschlagene Implementierung ist in keiner Weise verbindlich.

Wir möchten ganz deutlich machen, dass dieses Material nur angeboten wird, um Hinweise darauf zu geben, worin die Schwierigkeiten der Implementierung bestehen könnten, und nicht, um eine bestimmte Disziplin vorzuschreiben.

Zum Beispiel behandeln wir <RFC>s, die für nicht angeschlossene lokale Sockets eintreffen, als gültig und reihen sie in eine Warteschlange ein. Falls gewünscht, kann ein NCP sie ablehnen, wie Meyer vorschlägt, oder es kann sie eine Weile zurückhalten und ablehnen, wenn sie nicht bald bedient werden. Das angebotene Protokoll unterstützt alle diese Optionen.

Eine weitere lokale Option ist die bereits erwähnte, mehrere Ports an einen Socket anzuschließen. Wir haben eine Eins-zu-eins-Entsprechung gezeigt, doch kann diese ignoriert werden. Ebenso sind die Systemaufrufe lediglich als Anregung gedacht.

Systemaufrufe​

Dies sind typische Systemaufrufe, die ein Benutzerprozess ausführen könnte. Wir zeigen sie nur der Vollständigkeit halber; jeder Standort wird zweifellos den gleichwertigen Satz implementieren, der ihm zweckmäßig erscheint.

Wir verwenden die Notation

        Syscall ( arg , arg ...; val ... )
1 2 1

wobei

  1. Syscall ist der Systemaufruf,

  2. arg₁ usw. sind die mit dem Aufruf übergebenen Parameter und

  3. val₁ usw. sind alle vom Systemaufruf zurückgegebenen Werte.

Init (P,AEN,FS,Bsiz;C)​

  1. P: Gibt einen Port des Prozesses an.

  2. AEN: Gibt einen lokalen Socket an. Die Benutzernummer dieses Prozesses und die Host-Nummer dieses Hosts sind implizit.

  3. FS: Gibt einen Socket mit beliebiger Benutzernummer in einem beliebigen Host mit beliebiger AEN an.

  4. Bsiz: Gibt die Speichermenge in Bit an, die der Benutzer für das Puffern von Nachrichten bereitstellen will.

  5. C: Der zurückgegebene Bedingungscode.

Init versucht, den durch AEN angegebenen lokalen Socket an den Port P anzuschließen und eine Verbindung mit dem Socket FS einzuleiten. Mögliche Rückgabewerte von C sind

  1. C = ok: Das Init war zulässig, und der Socket FS wird kontaktiert. Wenn die Verbindung hergestellt ist oder wenn FS ablehnt, erhält der Prozess ein Ereignis.

  2. C = busy: Der lokale Socket wurde von einem Port dieses oder eines anderen Prozesses mit derselben Benutzernummer verwendet. Es wurde keine Aktion ausgeführt.

  3. C = homosex: AEN und FS waren entweder beide Sende- oder beide Empfangs-Sockets.

  4. C = nohost: Der in FS bezeichnete Host ist nicht bekannt.

  5. C = bufbig: Bsiz ist zu groß.

Listen (P,AEN,Bsize;C)​

  1. P: Gibt einen Port des Prozesses an.

  2. AEN: Gibt einen lokalen Socket an.

  3. Bsiz: Gibt eine Puffergröße an.

  4. C: Der zurückgegebene Zulässigkeitscode.

Codes für C sind

C = ok

C = busy

C = bufbig

Der durch AEN angegebene lokale Socket wird an P angeschlossen. Liegt ein wartender Anruf vor, wird er verarbeitet; andernfalls wird keine Aktion ausgeführt. Wenn ein Anruf eingeht, wird eine Verbindung hergestellt und der Prozess über ein Ereignis benachrichtigt.

Close (P)​

P gibt einen Port des Prozesses an.

Jede Aktivität wird beendet, und der Port wird für eine andere Verwendung frei.

Transmit (P,M,L1;L2,C)​

  1. P: Gibt einen Port mit einer offenen Verbindung an.

  2. M: Der zu übertragende Text.

  3. L1: Gibt die Länge des Texts an.

  4. L2: Die tatsächlich übertragene Länge.

  5. C: Der Fehlercode.

Die Übertragung zwischen den Prozessen auf beiden Seiten des Ports findet statt.

Codes für C sind

C = ok

oder

  1. C = not open: falls derzeit keine Verbindung offen und anderweitig nicht gesperrt ist

Status (P;C)​

Der Status des Ports P wird als C zurückgegeben.