VII. Stato della connessione
Un ottimo meccanismo per descrivere la sequenza di eventi necessaria per stabilire e terminare una connessione consiste in un diagramma di stato. Possiamo supporre che a ciascun socket sia associata una macchina a stati e che questa macchina a stati possa trovarsi, in qualsiasi momento, in uno di dieci stati possibili. In ogni stato, certi eventi di rete fanno passare lo stato della connessione a un altro stato; altri eventi vengono ignorati; altri ancora sono errori. Una transizione può anche comportare l’esecuzione di qualche azione da parte dell’NCP locale. La Figura 7.1 illustra la macchina a stati. I cerchi [ora riquadri: N.d.R.] rappresentano gli stati (descritti più avanti); le frecce mostrano le transizioni legali tra stati. Le etichette sulle frecce identificano l’evento che le ha causate (si noti che CLOSE è una chiamata di sistema, CLS è un comando di controllo). Le frasi dopo le barre indicano l’azione da eseguire durante il percorso lungo quella freccia. La freccia etichettata '[E]RFC' (situata tra gli stati 0 e 1) rappresenta la condizione per cui, ogni volta che una connessione entra nello stato CLOSED, viene controllata la coda delle chiamate in sospeso di quella connessione [Nell’originale la "E" era rovesciata: N.d.R.]
Se nella coda esistono chiamate in sospeso, la connessione passa allo stato PENDING. Se viene ricevuta una RFC per un socket nello stato CLOSED, anch’esso viene spostato lungo questo percorso allo stato PENDING. Gli eventi e le azioni che essi provocano sono descritti nelle sezioni VIII e IX più avanti. Seguono le descrizioni dei dieci stati:
(0) CLOSED
Il socket locale non è collegato ad alcuna porta e nessun utente ha richiesto una connessione con esso. (La voce di tabella non esiste).
(1) PENDING CALL
Il socket non è collegato ad alcuna porta, ma sono state ricevute una o più richieste di connessione. Una chiamata di sistema LISTEN verrà soddisfatta immediatamente dalla prima voce nella coda delle chiamate in sospeso relativa a una richiesta corrispondente; tutte le altre chiamate in sospeso vengono cancellate.
(2) LISTENING
Il socket è collegato a una porta. Siamo in attesa che un utente richieda una connessione con questo socket.
(3) RFC-RCVD
Siamo in ascolto ed è stata ricevuta una RFC. L’utente locale è stato informato della chiamata in sospeso. Deve rispondere con una CLOSE o con una ACCEPT.
(4) ABORT
Abbiamo avvisato l’utente che la sua LISTEN è stata soddisfatta, ma egli non ha ancora risposto; se durante questo intervallo l’utente remoto interrompe la connessione inviando un CLS, inviamo un CLS per confermare l’interruzione e registriamo il fatto con questo stato. Quando l’utente accetta o rifiuta la chiamata, possiamo informarlo che la connessione è stata terminata prematuramente.
(5) RFC-SENT
Si entra in questo stato quando:
- a) L’utente locale ha collegato questo socket a una porta emettendo una CONNECT.
- b) È stata inviata una RFC, e
- c) Non è stata ricevuta alcuna risposta.
Quando l’utente emette una CONNECT, viene esaminata la coda delle chiamate in sospeso.
Se non viene trovata una RFC corrispondente, la coda viene cancellata e si entra in questo stato. Man mano che arrivano nuove RFC, vengono confrontate con la richiesta del nostro utente. Se non corrispondono, la RFC viene immediatamente rifiutata. Se la RFC corrisponde, completa il processo di inizializzazione e la connessione entra nello stato OPEN.
(6) OPEN
Le RFC sono state scambiate e la connessione è stabilita in modo sicuro. La trasmissione può iniziare dopo la ricezione di un comando ALL dal lato di ricezione e procederà poi nel rispetto del controllo di flusso.
(7) CLS-WAIT
Dopo che l’utente locale ha eseguito una CLOSE e noi abbiamo emesso un CLS, dobbiamo attendere un CLS di conferma prima che la connessione possa essere completamente chiusa. Se il CLS appropriato non è già stato ricevuto, si entra in questo stato.
(8) DATA-WAIT
Se siamo sul lato di invio e l’utente locale esegue una chiamata di sistema CLOSE, non è possibile emettere un CLS se il nostro buffer dei dati non è vuoto o se è ancora atteso un RFNM per l’ultimo messaggio di dati. La connessione entra in questo stato per attendere che tali condizioni siano soddisfatte. Al completamento e alla conferma dell’output può essere emesso un CLS e la connessione entra nello stato CLS-WAIT, in attesa del CLS di conferma. Se arriva un CLS mentre ci si trova nello stato DATA-WAIT, svuotiamo il nostro buffer (il CLS proviene da un socket di ricezione, a indicare che non è più interessato ai nostri dati) ed entriamo nello stato RFNM-WAIT per attendere che la rete si liberi.
(9) RFNM-WAIT
Se siamo sul lato di invio e arriva un comando CLS, non possiamo emettere un CLS di conferma se non abbiamo ricevuto l’RFNM per il nostro ultimo messaggio di dati. Entriamo in questo stato per attendere l’RFNM e cessiamo ogni ulteriore trasmissione di dati. Quando arriva l’RFNM, può quindi essere emesso un CLS e la connessione verrà chiusa.
______________
| | CLOSE
CONN/ | CLOSED |<---------------------------+
send RFC | (0) | LISTEN |
+----------------| |-----------------------+ |
| |______________| | |
| | ^ | |
| [E]RFC | | CLS/send CLS | |
| ___V____|____ ___V____|____
| non-matching | | | |
| CONN/send RFC | PENDING | LISTEN RFC | LISTENING |
| +-------------| (1) |----------+ +----| (2) |
| | |_____________| | | |_____________|
| | matching | | |
___V___V_____ CONN/send RFC| __V___V______
| | | ACCEPT/ | | CLS/
| RFC-SENT | RFC | send RFC | RFC-RECD | send CLS
| (5) |----------+ | +----------| (3) |---------+
|_____________| | | | |_____________| |
| | | | | | |
| | ___V___V___V___ SND&CLOSE | ____________ |
| | RCV&CLS/ | |-----------)->| | |
| | send CLS | OPEN | SND&CLS | | DATA-WAIT | |
| | +---------| (6) |--------+ | | (8) | |
| | | |_______________| | | |____________| |
| | | RCV&CLOSE/ | | | | |
| | | send CLS | | | | |
| | | | | | | CLS |
| | | ______V______ | | | |
| | | CLOSE/ | |CLOSE/ | | | |
| | | send CLS| CLS-WAIT |send CLS | | | |
| +---)--------->| (8) |<--------)--+ | |
| | |_____________| | | |
| | | ___V______V_ ______V___
| | | | | | |
| | | | RFNM-WAIT | | ABORT |
| | CLS | | (9) | | (4) |
| | | |____________| |__________|
| | | | |
| | ______V_______ RFNM/ | |
| | | | send CLS | |
| CLS/ +--------->| CLOSED |<----------+ |
| send CLS | (0) | ACCEPT|CLOSE |
+----------------->| |<----------------------------+
|______________|
Figura 7.1: Diagramma degli stati della connessione