Il Protocollo TCP/IP

Il Controllo di Congestione e di Flusso

Uno degli aspetti più interessanti ed imponenti del protocollo TCP è il controllo del flusso e della congestione dei pacchetti che viaggiano tra due host. Immaginate per un istante che dobbiate andare ad un importante appuntamento e che rimaniate imbottigliati nel traffico a causa di un blocco al casello autostradale. Ecco, talvolta un pacchetto subisce la stessa sorte. A causa di qualche motivo che legato per esempio, alla difficoltà di trasmissione, alla bassa velocità di trasmissione o al temporaneo disservizio del Provider, i vostri pacchetti subiscono un notevole ritardo se non una perdita. Il risultato? Una connessione lenta. Il TCP, però è stato progettato per realizzare un'incredibile funzionalità: intervenire, e in alcuni casi anche prevedere, sulla rete se essa è interessata dal malfunzionamenti di trasmissione. Ma, che cosa si intende per controllo di flusso e congestione?

 A. Controllo di congestione: interessa principalmente la rete e i pacchetti che sono già stati in qualche modo trasmessi. Quando la rete risulta affetta da eventuali ingorghi, il TCP è in grado di rilevarne la presenza ed intervenire.

B. Controllo di flusso: il controllo di flusso interessa i pacchetti in partenza e in arrivo dell'host mittente e dell'host destinatario. Si colloca al livello di Socket (nel paragrafo successivo vedremo cos'è una Socket).

Avrete sicuramente notato che in un segmento TCP esiste un particolare campo detto Finestra di Ricezione. Questo campo ha il compito di mettere in comunicazione i due host sul loro stato di trasmissione/ricezione. Ogni host è dotato di una finestra di ricezione e di trasmissione di dimensione prefissata in cui vengono accodati i pacchetti in arrivo e in uscita. Se la finestra di ricezione arrivasse al punto di non essere capace di ospitare altri pacchetti in arrivo, tutti i pacchetti che arriveranno all'host verranno inevitabilmente persi. Come fa TCP a impedire la perdita dei pacchetti? Attraverso il controllo di flusso da parte dell'host mittente.

Come esempio, immaginate un classico sistema di scolo. Supponete di aver riempito d'acqua una vasca da bagno e che lasciando il rubinetto aperto, apriate il condotto di scolo. Ad un certo istante il tubo di scolo viene parzialmente ostruito. A meno che non vogliate che il livello dell'acqua cresca a tal punto da fuoriuscire dalla vasca, siete costretti ad regolare il flusso d'acqua del rubinetto. Ecco, cosa succede in TCP. L'host mittente, attraverso i NACK ricevuti dal destinatario, è in grado di rilevare un problema di ricezione (finestra di ricezione piena), e, agendo sulla propria finestra di trasmissione, regola il flusso di pacchetti in uscita.

Per realizzare questo meccanismo di controllo di congestione e, in parte anche per prevenire situazioni di perdite, il TCP realizza un meccanismo che va sotto il nome di TCP Reno. Data la complessità di tale meccanismo, non entreremo nel dettaglio, ma per capire come funziona immaginate che tale meccanismo è simile ad un bimbo che avanza nei confronti dei propri genitori richieste più frequenti fino al momento in cui essi diranno "Basta!" e il bambino farà marcia indietro. Ecco cosa accade nel TCP Reno: il destinatario segnala al mittente di ridurre la propria trasmissione, il quale dopo tale segnalazione si ferma e riparte con una velocità di trasmissione sempre più elevata.