Protocollo Sliding Window: ottimizzazione delle prestazioni
La matematica spietata del protocollo Send and Wait, calcolata nella lezione precedente, ha rivelato un limite strutturale insormontabile: per ottenere l'affidabilità assoluta, la scheda di rete è costretta a rimanere inattiva per quasi tutto il tempo, in attesa di un segnale di via libera. Se le telecomunicazioni si fossero fermate a quell'algoritmo, lo streaming video in HD o i download gigabit odierni sarebbero semplicemente impossibili.
Per sfruttare appieno la potenza delle reti moderne a banda larga (LFN - Long Fat Networks), l'ingegneria informatica ha dovuto abbandonare la regola del "trasmetti un singolo pacchetto e fermati", abbracciando una tecnica chiamata Pipelining. In questa lezione analizzeremo l'implementazione del Pipelining attraverso la geniale architettura della Finestra Scorrevole (Sliding Window), che rappresenta ancora oggi il cuore pulsante del protocollo TCP.
Il Pipelining e l'anatomia della Finestra Scorrevole
Il concetto di Pipelining prevede che il mittente sia autorizzato a trasmettere molteplici pacchetti in sequenza rapida senza dover attendere il riscontro (ACK) del primo pacchetto . In questo modo, invece di inviare un bit e fermarsi, il mittente riempie fisicamente l'intero "tubo" (pipe) transoceanico di dati, massimizzando l'efficienza del canale.
Tuttavia, il mittente non può inviare dati all'infinito senza conferme, altrimenti saturerebbe istantaneamente la memoria RAM del ricevitore (Buffer Overflow). Serve un limite logico. Questo limite è la Sliding Window.
La Finestra Scorrevole è una variabile matematica (espressa in numero di pacchetti o in byte) che definisce la quantità massima di dati "in volo" (unacknowledged data) che il mittente può mantenere sulla rete. Se la dimensione della finestra (N) è pari a 5, il mittente può "sparare" i pacchetti 1, 2, 3, 4 e 5 a raffica alla massima velocità dell'hardware. Raggiunto il pacchetto 5, il mittente si blocca. Ma attenzione: non appena il pacchetto 1 arriva a destinazione e il suo ACK torna indietro, la finestra logica "scivola" (slides) in avanti di una posizione . Il mittente è ora autorizzato a trasmettere il pacchetto 6. Il ciclo diventa un nastro trasportatore continuo e fluido.
L'espansione dei Numeri di Sequenza
Questa rivoluzione ha un costo. Nel protocollo Send and Wait ci bastava un misero bit (0 e 1) per identificare i pacchetti. Con la Sliding Window, avendo multipli pacchetti in volo contemporaneamente, un solo bit è del tutto inutile.
Lo spazio dei Sequence Number: L'algoritmo impone che il campo dei Numeri di Sequenza debba essere drasticamente espanso. La regola matematica stabilisce che lo spazio dei numeri di sequenza debba essere significativamente più grande della dimensione della Finestra (N). Questo evita il disastroso scenario in cui il ricevitore confonda un pacchetto nuovo con una ritrasmissione molto in ritardo di un pacchetto con lo stesso numero. È per questo motivo che l'header del moderno protocollo TCP utilizza un campo enorme a 32 bit, garantendo oltre 4 miliardi di combinazioni prima di azzerarsi.
Gestione degli Errori: Il protocollo Go-Back-N (GBN)
Se inviamo 100 pacchetti in raffica e il pacchetto numero 50 si corrompe, come si gestisce il recupero? La prima e più celebre implementazione storica della Sliding Window è il Go-Back-N (Torna Indietro a N).
Nel GBN, il ricevitore è concepito per essere "stupido" e avere pochissima RAM. Egli accetta i pacchetti solo in rigoroso ordine cronologico. Se riceve 48 e 49, li accetta. Se il 50 viene distrutto da un router, e arriva il 51, il ricevitore scarta (drop) volontariamente il 51, il 52, il 53 e tutti i successivi, perché sta ostinatamente aspettando il 50.
Il mittente andrà inevitabilmente in Timeout per il pacchetto 50. A quel punto, l'algoritmo GBN obbliga il mittente a "Tornare indietro" (Go-Back) al pacchetto 50, ritrasmettendo in massa il 50 e tutti i pacchetti successivi già inviati (51, 52, 53...).
[tooltip]L'ACK Cumulativo: Nel Go-Back-N si usa l'ACK cumulativo per risparmiare banda. Se il ricevitore manda un "ACK 20", non sta confermando solo il pacchetto 20, ma sta implicitamente urlando al mittente: "Ho ricevuto perfettamente TUTTI i pacchetti precedenti, FINO AL numero 20 compreso!".[/tooltip]
L'evoluzione algoritmica: Selective Repeat (SR)
Il Go-Back-N ha un evidente difetto: spreca enormi quantità di banda costringendo a ritrasmettere decine di pacchetti perfettamente integri, solo perché arrivati dopo un pacchetto perso. Per risolvere questa criticità è nato l'algoritmo Selective Repeat (Ripetizione Selettiva).
Nel Selective Repeat, il ricevitore diventa "intelligente" ed è dotato di un ampio buffer in memoria RAM. Se il pacchetto 50 va perso, ma i pacchetti dal 51 al 60 arrivano perfetti, il ricevitore non li scarta. Li parcheggia nel suo buffer e invia degli ACK individuali e specifici (non più cumulativi).
Ibridazione moderna (Il SACK): Quando il timeout del mittente scade per il pacchetto 50, il Selective Repeat ritrasmette esclusivamente e selettivamente il pacchetto 50, salvando un'immensa quantità di banda. Una volta ricevuto il 50, il ricevitore unisce i pezzi nel buffer e la sua finestra fa un balzo in avanti enorme fino al pacchetto 61. Il protocollo TCP moderno (usato nei nostri PC) è un ibrido geniale: usa di base la logica ad ACK Cumulativo del Go-Back-N, ma supporta un'opzione avanzata chiamata SACK (Selective Acknowledgment), che implementa i vantaggi prestazionali del Selective Repeat.
Sintesi applicativa e autoverifica
Il passaggio al Pipelining e alla Finestra Scorrevole ha sbloccato la velocità di Internet. Mantenendo centinaia di pacchetti in volo, il tempo di attesa (RTT) viene virtualmente azzerato perché assorbito dal flusso continuo. L'ingegneria dei protocolli si è poi divisa nel bilanciare la memoria necessaria: il Go-Back-N risparmia RAM sul ricevitore ma spreca banda nelle ritrasmissioni massive; il Selective Repeat ottimizza la banda ma richiede enormi buffer RAM per immagazzinare i pacchetti disordinati.
Alla luce delle spietate regole di scarto esaminate in questa lezione, analizza questo scenario di laboratorio: stai utilizzando un'applicazione che sfrutta rigorosamente la variante Go-Back-N puro. La tua finestra di trasmissione è immensa, ben 200 pacchetti. Trasmetti in un solo istante i pacchetti dal numero 1 al numero 200. Per sfortuna, il pacchetto numero 3 e il pacchetto numero 199 subiscono una collisione e vengono distrutti. Il Timeout per il pacchetto 3 scade. Quanti pacchetti ESATTI (calcolati matematicamente) il tuo software sarà costretto a ritrasmettere sul cavo, e perché?