Concetti di progettazione
I calcolatori che partecipano alla rete si somigliano sotto due aspetti importanti: ciascuno sostiene ricerche indipendenti dalla rete e ciascuno è soggetto alla disciplina di un sistema time-sharing. Questi fatti hanno contribuito alla seguente filosofia di progettazione.
In primo luogo, poiché i calcolatori della rete hanno scopi indipendenti, è necessario preservare un controllo amministrativo decentralizzato dei vari calcolatori. Poiché tutti i supervisori di time-sharing possiedono meccanismi di contabilità e di allocazione delle risorse elaborati e definiti, abbiamo organizzato le cose in modo che tali meccanismi controllino il carico dovuto alla rete allo stesso modo in cui controllano il carico generato localmente.
In secondo luogo, poiché tutti i calcolatori sono gestiti secondo discipline di time-sharing, è sembrato opportuno facilitare i meccanismi interattivi di base.
In terzo luogo, poiché questa rete è usata da programmatori esperti, era indispensabile offrire la massima libertà nell'uso della rete. Restrizioni riguardanti insiemi di caratteri, linguaggi di programmazione, ecc. non sarebbero state tollerate, e abbiamo evitato tali restrizioni.
In quarto luogo, ancora perché la rete è usata da programmatori esperti, si è ritenuto necessario lasciare la progettazione aperta. Ci aspettiamo che col tempo sorgano delle convenzioni man mano che si acquisisce esperienza, ma ci siamo sentiti in dovere di non imporle arbitrariamente.
In quinto luogo, per rendere la partecipazione alla rete comoda, o in alcuni casi praticabile, l'interfaccia software verso la rete dovrebbe richiedere un intervento minimo sul sistema operativo dell'host.
Infine, accettiamo l'ipotesi sopra enunciata, secondo cui l'uso della rete consiste in conversazioni prolungate anziché in richieste isolate.
Queste considerazioni hanno portato alle nozioni di connessioni, di Network Control Program, di collegamento di controllo, di comandi di controllo, di socket e di reti virtuali.
Una connessione è un'estensione di un collegamento. Una connessione collega due processi, in modo che l'output di un processo sia l'input dell'altro. Le connessioni sono simplex, quindi occorrono due connessioni se due processi devono conversare in entrambe le direzioni.
I processi all'interno di un host comunicano con la rete attraverso un Network Control Program (NCP). Nella maggior parte degli host, il NCP farà parte dell'executive, cosicché i processi useranno chiamate di sistema per comunicare con esso. La funzione principale del NCP è stabilire connessioni, interrompere connessioni, commutare connessioni e controllare il flusso.
Per svolgere i propri compiti, un NCP in un host deve comunicare con un NCP in un altro host. A tal fine, un particolare collegamento tra ogni coppia di host è stato designato come collegamento di controllo. I messaggi ricevuti sul collegamento di controllo sono sempre interpretati dal NCP come una sequenza di uno o più comandi di controllo. Per esempio, uno dei tipi di comandi di controllo serve ad assegnare un collegamento e ad avviare una connessione, mentre un altro tipo porta la notifica che una connessione è stata terminata. Una descrizione parziale della sintassi e della semantica dei comandi di controllo è data nella sezione successiva.
Una questione importante è come riferirsi ai processi in un host remoto. Ogni host ha un proprio schema di denominazione interno, ma questi vari schemi sono spesso incompatibili. Poiché non è pratico imporre uno schema comune di denominazione interna dei processi, è stato creato uno spazio di nomi intermedio, con una porzione separata dello spazio di nomi assegnata a ciascun host. Spetta a ciascun host mappare gli identificatori interni dei processi nel proprio spazio di nomi.
Gli elementi dello spazio di nomi sono detti socket. Un socket costituisce un'estremità di una connessione, e una connessione è completamente specificata da una coppia di socket. Un socket è specificato dalla concatenazione di tre numeri:
- (a) un numero di utente (24 bit)
- (b) un numero di HOST (8 bit)
- (c) AEN (8 bit)
Un tipico socket è illustrato nella figura 3.
A ciascun host sono assegnati tutti i socket dello spazio di nomi il cui campo (b) è uguale all'identificazione dell'host stesso.
Un socket è o un socket di ricezione o un socket di invio, e viene contrassegnato come tale dal bit di ordine inferiore dell'AEN (0 = ricezione, 1 = invio). Gli altri sette bit dell'AEN forniscono semplicemente una popolazione considerevole di socket per ogni numero utilizzato presso ciascun host. (AEN sta per "another eight-bit number")
A ciascun utente è assegnato un numero di utente di 24 bit che lo identifica univocamente in tutta la rete. Generalmente questo sarà il numero di HOST di 8 bit del suo host di origine, seguito da 16 bit che lo identificano univocamente presso quell'host. Si può anche prevedere che un utente abbia un numero di utente non legato a un particolare host, una disposizione auspicabile per gli utenti mobili che potrebbero non avere un host di origine o averne più di uno. Questo numero di utente di 24 bit viene poi usato nel modo seguente. Quando un utente accede a un host, il suo numero di utente viene cercato. In seguito, ogni processo creato dall'utente viene contrassegnato con il suo numero di utente. Quando l'utente accede a un host remoto attraverso la rete, lo stesso numero di utente viene usato per contrassegnare i processi che egli crea in quell'host. L'host remoto ottiene il numero di utente consultando una tabella al momento del log-in, come fa l'host di origine, oppure rilevando l'identificazione del chiamante. L'effetto della propagazione del numero dell'utente è che ciascun utente crea una propria rete virtuale costituita dai processi che ha creato. Questa rete virtuale può estendersi su un numero arbitrario di host. Sarà quindi facile per un utente collegare i propri processi in modi arbitrari, pur consentendogli di collegare i propri processi con quelli di altre reti virtuali.
La relazione tra socket e processi è ora descrivibile (vedi la figura 4). Per ogni numero di utente presso ciascun host vi sono 128 socket di invio e 128 socket di ricezione. Un processo può richiedere al NCP locale l'uso di uno qualsiasi dei socket con lo stesso numero di utente; la richiesta viene soddisfatta se il socket non è già in uso. L'osservazione chiave è che un socket richiesto da un processo non può essere già in uso, a meno che non lo sia da parte di un altro processo all'interno della stessa rete virtuale, e tale processo è controllato dallo stesso utente.
Un aspetto insolito del protocollo HOST-HOST è che un processo può spostare la propria estremità di una connessione da un socket a un altro. Il nuovo socket può trovarsi in qualsiasi rete virtuale e presso qualsiasi host, e il processo può avviare lo spostamento sia al momento in cui la connessione viene stabilita, sia in seguito. Le forme più generali di commutazione comportano un'implementazione piuttosto complessa e non sono pertinenti al resto di questo articolo, perciò ne verrà spiegata solo una forma limitata. Questa forma limitata di commutazione prevede soltanto che un processo possa sostituire un socket con un altro durante lo stabilimento di una connessione. Il nuovo socket deve avere lo stesso numero di utente e lo stesso numero di HOST, e la connessione è comunque stabilita verso lo stesso processo. Questa forma di commutazione è quindi solo un modo di rietichettare un socket, poiché non avviene alcun cambiamento nell'instradamento dei messaggi. Nella sezione successiva documentiamo le chiamate di sistema e i comandi di controllo; nella sezione ancora successiva consideriamo come potrebbe essere implementato il log-in.