[successivo] [precedente] [indice]

Gestione della Connessione

Una connessione ha tre fasi:

Stabilimento della Connessione

La trasmissione e' iniziata dal lato client. Si tratta di uno handshake a tre vie.

  1. Il client invia un segmento col flag SYN settato, specificando il Numero di Porto destinazione ed un Numero di Sequenza Iniziale (Initial Sequence Number - ISN) casuale
  2. Il lato server risponde con un segmento col flag SYN settato, con il flag ACk settato e contenente lo ISN del client nel campo Numero Sequenza e il valore ISN+1 nel campo Numero Conferma
  3. Il client risponde con un segmento contenente nel campo Numero Conferma lo ISN del server piu' uno

Si dice che il lato che invia il primo segmento SYN compie una active open. L'altro lato compie una passive open.

Il valore di un ISN deve essere diverso per ogni nuova connessione. La specifica indica che lo ISN deve essere considerato un contatore a 32 bit che aumenta di 1 ogni 4 microsecondi, allo scopo di impedire che pacchetti ritardati vengano interpretati cone appartenenti ad una connessione in corso.

In realta' l'implementazione dei nuovi ISN e' diversa da sistema a sistema e qualche volta errata.

Terminazione della Connessione

La termiinazione consiste di due mezze terminazioni (half close), poiche' i dati scorrono lungo la connessione in modo full duplex e indipendentemente. Ogni half close richiede lo scambio di due segmenti.

  1. La stazione che richiede la terminazione invia un segmento con il flag FIN settato; si taratta di una operazione di active close
  2. L'altra stazione risponde con un segmento col campo ACK settato e nel campo Numero di Conferma, il campo Numero di Sequenza della prima stazione piu' uno; si tratta di una operazione di passive close

Teoricamente una stazione che compie una half close puo' sempre continuare a ricevere dati. In realta' nella maggior parte dei casi e' l'applicativo client che decide di chiudere la connession, dietro istruzioni dell'essere umano, e il server risponde ad una half close con un altra half close, terminando l'intera connessione.

Timeout di Stabilimento Connessione

La stazione che compie' una active open inizializza un contatore di timeout, settato a 6 secondi nelle implementazioni Berkeley. Se non giunge risposta un secondo tentativo ha il timeout a 24 secondi e un terzo timeout e' a 48 secondi. Se la connessione non e' stata stabilita entro 75 secondi, un secondo contatore scatta e termina ogni ulteriore tentativo.

Maximum Segment Size

La dimensione massima del blocco dati trattato e' posta da molte implementazioni a 1024 byte per default. Alcune implementazioni permettono di cambiare questo valore, altre lo permettono ma richiedono un multiplo di 512 byte. Il valore ottimale coincide col valore che renderebbe la lunghezza di trama totale uguale allo MTU.

Il primo segmento inviato contiene l'opzione MSS. La stazione che compie la active open si aspetta di trovare un'opzione MSS nel segmento di risposta Se il MSS di risposta e' inferiore viene adottato il nuovo valore. Se lo MSS di risposta manca, viene adottato il valore di default 536.

Diagramma di Stato

Lo stato di una connessione si puo' rappresentare da un diagramma a stati finiti, alquanto complesso.

I nomi degli stati sono identici ai valori riportati in output dal comando netstat.

Non tutte le transizioni sono ugualmente probabili o supportate. Il diagramma mostra l'insieme tipico di transizioni per un client e per un server. Per ciascuna transizion vengono dati, se esistono, l'operazione dell'applicativo che l'ha causata, il tipo di segmento ricevuto il tipo di segmento trasmesso.

Lo stato TIME_WAIT permane per un tempo di 2 volte il valore del MSL (maximum segment lifetime), tempo massimo di vita di un segmento. Questo e' allo scopo di attendere che anche l'ultimo segmento rimasto nella rete di una connessione in via di chiusura vada a morire. Valori tipici di MSL sono dai 30 secondi ai 2 minuti (raccomandato: 2 minuti).

Tutti i segmenti della connessione ricevuti durante questo periodo vengono scartati.

Questo stato di TIME_WAIT ha come conseguenza che in caso di chiusura di un server, lo stesso programma server non puo' essere immediatamente lanciato sullo stesso porto fino allo scadere del tempo 2MSL.

Lo stesso e' valido anche per i client, ma questo non e' tipicamente un problema poiche' i client usano porti effimeri.

Su molte versioni Berkeley vi e' un effetto strano e pericoloso: un client che tenta una connessione ad un server che si trova nello stato TIME_WAIT riesce ad ottenerla se il nuovo Numero di Sequenza del client e' superiore all'ultimo numero di sequenza che il server aveva accettato prima della close. Si chiama questo effetto una reincarnazione della vecchia connessione.

Per impedire reincarnazioni involontarie attraverso un reboot di sistema, al protocollo TCP e' proibito iniziare nuove connessioni se non e' trascorso almeno un tempo MSL dal boot.

Anomalie di Connessione

Segmenti di Reset

Quando arriva una richiesta di connessione ma non vi e' alcun processo in ascolto al porto specificato, il protocollo TCP del ricevente invia al richiedente un segmento di Reset. Il caso equivalente con UDP e' invece gestito con l'invio di un messaggio ICMP Port Unreachable.

Aborto di Connessione

La terminazione normale si chiama anche rilascio ordinato (ordered release) della connessione. E' possibile anche un rilascio abortito (aborted release), con l'invio di un Reset anziche' un FIN.

In tal caso:

Detezione di Half Open

Una connessione si dice half open se un lato ha chiuso o abortito la connessione ma l'altro lato non ne ha ricevuto notifica. Questo avviene quando un lato ha compiuto uno shutdown improvviso o e' andato in crash.

Senza un keepalive timer possono anche verificarsi molte situazioni di half open, p.es. in presenza di PC che vengono semplicemente spenti.

E' da notare che il tentativo di ripristinare la vecchia connessione non ha mai successo, poiche' il nuovo client rinato non ha conoscenza dei numeri di sequenza ultimi usati nella connessione precedente.

Open Simultanee

Puo' capitare che due corrispondenti inviino contemporaneamente il segmento SYN iniziale di connessione all'altro.

Entrambi i corrispondenti si trovano nello stato SYN_SENT quando ricevono il SYN iniziale: entrambi emettono un segmento SYN ACK e si portano nello stato SYN_RCVD. Alla ricevuta del segmento ACK del corrispondente, entrambi si portano nello stao ESTABLISHED.

Il risultato e' la presenza di una connessione stabilita, non due.

Close Simultanee

Il nodo che ha emesso una FIN e si e' portato nello stato FIN_WAIT_1, si attende un ACK. Se al suo posto riceve un FIN, significa che anche il nodo remoto ha iniziato una active close. Il nodo locale invia un ACK e si porta nello stato CLOSING, e lo stesso fara' il nodo remoto. Alla ricezione di un ACK la connessione e' chiusa.