II. Il protocollo
La nozione di connessione, come spiegata in NWG/RFC #33, permea il protocollo. Una connessione è un percorso di comunicazione simplex, destinato a collegare due processi.
La funzione principale del protocollo è provvedere a (1) l'instaurazione delle connessioni, (2) la regolazione del flusso sulle connessioni e (3) la terminazione delle connessioni.
Il protocollo fornisce inoltre alcune funzioni accessorie, come l'invio di impulsi di interrupt simulati e l'eco di messaggi di prova.
Per fornire un percorso per lo scambio di informazioni sulle connessioni, designiamo come link di controllo dei link specifici, cioè il link uno tra ciascuna coppia di host. Il traffico sui link di controllo consiste soltanto di comandi di controllo, definiti più avanti.
Le connessioni sono identificate da una coppia di socket. I socket sono nomi di 40 bit noti in tutta la rete. A ogni host è assegnato un sottoinsieme privato di questi nomi, e un comando che richiede una connessione nomina un socket locale all'host richiedente e uno locale al destinatario della richiesta.
I socket sono polarizzati: i socket di numero pari sono socket di ricezione, quelli di numero dispari sono socket di invio. Per realizzare una connessione ne serve uno di ciascun tipo.
Per facilitare la trasmissione di informazioni su una connessione, a ciascuna connessione è assegnato un link univoco. Uno dei passi per stabilire una connessione è quindi l'assegnazione di un link. Tra i link non di controllo, lo zero è riservato all'uso interno alla rete, e i link da 32 a 255 sono riservati alla sperimentazione e all'espansione. Pertanto solo i link da 2 a 31 sono disponibili per l'uso regolare. L'assegnazione dei link deve essere fatta sempre dal ricevente oppure sempre dal mittente. Abbiamo scelto in modo (quasi) arbitrario di affidarla al ricevente.
Tutti i messaggi regolari sono costituiti da un'intestazione di 32 bit, una marcatura, il testo e un riempimento. La marcatura è una sequenza (eventualmente vuota) di zeri seguita da un 1; il riempimento è un 1 seguito da una sequenza (eventualmente vuota) di zeri.
Un messaggio regolare inviato sul link di controllo (link 1) è detto messaggio di controllo. Il suo testo è un numero intero (eventualmente zero) di comandi di controllo nella forma descritta più avanti, e deve terminare al confine di un comando.
I comandi usati per stabilire una connessione sono STR e RTS. Il comando STR è inviato da un potenziale mittente a un potenziale ricevente. Il suo campo <my socket> contiene un socket di invio locale al potenziale mittente; il suo campo <your socket> contiene un socket di ricezione locale al potenziale ricevente. Il comando RTS è il duale, ma contiene anche un campo <link> per l'assegnazione del link. Questi due comandi sono detti richieste di connessione (RFC). Uno STR e un RTS corrispondono se il campo <my socket> dell'uno è identico al campo <your socket> dell'altro e viceversa. Una connessione è stabilita quando è stata scambiata una coppia di RFC corrispondenti.
Agli host è vietato stabilire più di una connessione verso uno stesso socket locale. Pertanto un host non può usare un socket nel campo <my socket> di una RFC se quel socket è citato in una RFC precedente e la connessione non è ancora terminata.
Il comando usato per terminare una connessione è CLS. Ciascuna parte deve inviare e ricevere un comando CLS prima che una connessione sia completamente terminata e i socket siano liberi di partecipare ad altre connessioni. Non è necessario che entrambe le RFC siano state scambiate prima che una connessione venga terminata. Ulteriori dettagli sulla terminazione sono forniti più avanti.
Dopo che una connessione è stabilita, l'host ricevente invia un comando ALL che alloca spazio per la connessione. Il mittente tiene traccia di quanto spazio è disponibile nell'host ricevente e non trasmette più testo di quanto l'host ricevente possa accettare, come spiegato sopra. Inoltre l'IMP locale impedisce al mittente di inviare un messaggio su una connessione finché non riceve il RFNM relativo al messaggio precedente.
Dopo che una connessione è stabilita, i comandi CLS inviati dal ricevente e dal mittente hanno effetti leggermente diversi. Un comando CLS inviato dal mittente indica che non verranno inviati altri messaggi sulla connessione. Questo comando non deve essere inviato se c'è un messaggio in transito sulla connessione.
I comandi CLS inviati dal ricevente valgono come richieste al mittente di terminare la trasmissione. Tuttavia, poiché il comando CLS impiega del tempo per raggiungere il mittente, il ricevente deve aspettarsi che i propri buffer si riempiano fino al limite concesso nei comandi ALL.
Finché una connessione è stabilita, ciascuna delle due parti può inviare comandi INR o INS. L'interpretazione di questi comandi è una questione locale, ma in generale forniranno una funzione di escape.
Si noti che i comandi ALL, INR e INS possono essere inviati solo dopo che la connessione è stabilita e prima che venga inviato un comando CLS.
Una funzione di prova molto semplice è fornita dai comandi ECO ed ERP. Alla ricezione di un comando ECO, un host deve cambiare i primi otto bit in ERP e restituirlo. Questi comandi non hanno alcuna relazione con le connessioni.
Per comodità è previsto un comando NOP. È codificato come zero per facilitare la costruzione dei messaggi di comando.
Infine, è previsto un comando ERR per notificare a un host remoto che ha (apparentemente) commesso un errore. Al momento non è definito alcun elenco specifico di errori, né alcuna azione da intraprendere alla ricezione dei comandi ERR. Gli host dovrebbero registrare i comandi ERR alla ricezione, così che i programmatori di sistema possano diagnosticare il problema. Un host può generare un comando ERR in qualsiasi momento e per qualsiasi motivo, ma si raccomanda che ogni host pubblichi un elenco esaustivo dei comandi ERR che può inviare e delle relative interpretazioni.
Comandi di controllo della rete
Segue una descrizione dettagliata della struttura e del formato di ciascuno dei comandi di controllo.
Per facilitare e chiarire le descrizioni dei socket, sono state adottate le seguenti convenzioni:
<my socket> e <your socket> sono usati nelle descrizioni dei comandi.
<my socket> è locale a chi origina il comando.
<your socket> è locale a chi riceve il comando.
Formati dei comandi di controllo
Nessuna operazione
_______
| |
| NOP |
|_______|
Richiesta di connessione, dal ricevente al mittente
______________________________________________
| | | | |
| RTS | my socket | your socket | link |
|_______|_____________|_______________|________|
Richiesta di connessione, dal mittente al ricevente
_____________________________________
| | | |
| STR | my socket | your socket |
|_______|_____________|_______________|
Chiusura
_____________________________________
| | | |
| CLS | my socket | your socket |
|_______|_____________|_______________|
Allocazione
__________________________
| | | |
| ALL | link | space |
|_______|________|_________|
Interrupt inviato dal processo ricevente
_______________
| | |
| INR | link |
|______|________|
Interrupt inviato dal processo mittente
_______________
| | |
| INS | link |
|______|________|
Richiesta di eco
____________________________ _________
| | \ \ |
| ECO | length / / text |
|_______|____________________\ \________|
Risposta di eco
____________________________ _________
| | \ \ |
| ERP | length / / text |
|_______|____________________\ \________|
Errore rilevato
____________________________ _________
| | \ \ |
| ERR | length / / text |
|_______|____________________\ \________|
L'host è specificato nell'intestazione.
<link> è di 8 bit
<space> è lungo 32 bit ed è un intero senza segno.
<length> è un intero senza segno di 16 bit.
<text> è lungo quanto indicato da length. Il comando è quindi 24 bit più lungo di length. La lunghezza massima è un messaggio, per facilitare la decodifica e la manipolazione dei comandi.
Tutti i codici dei comandi di controllo sono lunghi 8 bit:
NOP = 0
RTS = 1
STR = 2
CLS = 3
ALL = 4
INR = 5
INS = 6
ECO = 7
ERP = 8
ERR = 9
<my socket> e <your socket> sono lunghi 32 bit,
_______________________
| | |
| User number | AEN |
|_______________|_______|
24 bit per il numero utente e 8 bit per l'AEN.