Trasporto di affidabilità TCP
Conosciamo tutti il protocollo TCP come protocollo di trasporto affidabile, ma come garantisce l'affidabilità del trasporto?
Per ottenere una trasmissione affidabile, è necessario considerare molti fattori, come la corruzione dei dati, la perdita, la duplicazione e la presenza di frammenti fuori ordine. Se questi problemi non possono essere risolti, non è possibile ottenere una trasmissione affidabile.
Pertanto, TCP impiega meccanismi quali numero di sequenza, risposta di conferma, controllo di reinvio, gestione della connessione e controllo della finestra per garantire una trasmissione affidabile.
In questo articolo ci concentreremo sulla finestra scorrevole, sul controllo di flusso e sul controllo di congestione del TCP. Il meccanismo di ritrasmissione verrà trattato separatamente nella sezione successiva.
Controllo del flusso di rete
Il controllo del flusso di rete, o noto come controllo del traffico di rete, è in realtà una manifestazione della sottile relazione tra produttori e consumatori. Probabilmente vi sarete imbattuti spesso in questo scenario al lavoro o durante i colloqui. Se la capacità di produzione del produttore supera di gran lunga la capacità di consumo del consumatore, la coda crescerà indefinitamente. In un caso più grave, potreste sapere che un accumulo eccessivo di messaggi RabbitMQ può causare un degrado delle prestazioni dell'intero server MQ. Lo stesso vale per TCP; se non controllato, troppi messaggi verranno immessi nella rete e i consumatori avranno superato la loro capacità, mentre i produttori continueranno a inviare messaggi duplicati, il che influirà notevolmente sulle prestazioni della rete.
Per affrontare questo fenomeno, il TCP fornisce un meccanismo che consente al mittente di controllare la quantità di dati inviati in base all'effettiva capacità di ricezione del destinatario, un meccanismo noto come controllo di flusso. Il destinatario mantiene una finestra di ricezione, mentre il mittente mantiene una finestra di invio. È importante notare che queste finestre sono valide solo per una singola connessione TCP e non tutte le connessioni condividono una finestra.
TCP fornisce il controllo di flusso utilizzando una variabile per una finestra di ricezione. La finestra di ricezione fornisce al mittente un'indicazione della quantità di spazio cache ancora disponibile. Il mittente controlla la quantità di dati inviati in base all'effettiva capacità di accettazione del destinatario.
L'host ricevente notifica al mittente la dimensione dei dati che può ricevere e il mittente invia fino a questo limite. Questo limite è la dimensione della finestra, ricordate l'intestazione TCP? Esiste un campo "finestra di ricezione", che viene utilizzato per indicare il numero di byte che il destinatario è in grado o disposto a ricevere.
L'host mittente invierà periodicamente un pacchetto di sonda finestra, che viene utilizzato per verificare se l'host destinatario è ancora in grado di accettare dati. Quando il buffer del destinatario rischia di sovraccaricarsi, la dimensione della finestra viene impostata su un valore inferiore per indicare al mittente di controllare la quantità di dati inviati.
Ecco uno schema di controllo del flusso di rete:
Controllo della congestione della rete
Prima di introdurre il controllo della congestione, è necessario comprendere che, oltre alla finestra di ricezione e alla finestra di invio, esiste anche una finestra di congestione, utilizzata principalmente per risolvere il problema della velocità con cui il mittente inizia a inviare dati alla finestra di ricezione. Pertanto, la finestra di congestione è gestita anche dal mittente TCP. È necessario un algoritmo per decidere la quantità di dati appropriata da inviare, poiché inviare una quantità di dati insufficiente o eccessiva non è la soluzione ideale, da qui il concetto di finestra di congestione.
Nel precedente controllo del flusso di rete, ciò che evitavamo era che il mittente riempisse la cache del destinatario di dati, ma non sapevamo cosa stesse accadendo nella rete. In genere, le reti di computer si trovano in un ambiente condiviso. Di conseguenza, potrebbe verificarsi una congestione di rete a causa delle comunicazioni tra altri host.
Quando la rete è congestionata, se si continua a inviare un numero elevato di pacchetti, potrebbero verificarsi problemi come ritardi e perdita di pacchetti. A questo punto, il TCP ritrasmette i dati, ma la ritrasmissione aumenterà il carico sulla rete, causando ritardi maggiori e ulteriori perdite di pacchetti. Questo può innescare un circolo vizioso e peggiorare ulteriormente.
Pertanto, il TCP non può ignorare ciò che accade sulla rete. Quando la rete è congestionata, il TCP si sacrifica riducendo la quantità di dati inviati.
Pertanto, viene proposto il controllo della congestione, che mira a evitare di riempire l'intera rete con i dati provenienti dal mittente. Per regolare la quantità di dati che il mittente deve inviare, TCP definisce un concetto chiamato finestra di congestione. L'algoritmo di controllo della congestione regolerà la dimensione della finestra di congestione in base al grado di congestione della rete, in modo da controllare la quantità di dati inviati dal mittente.
Cos'è una finestra di congestione? Cosa c'entra con la finestra di invio?
La finestra di congestione è una variabile di stato gestita dal mittente che determina la quantità di dati che il mittente può inviare. La finestra di congestione cambia dinamicamente in base al livello di congestione della rete.
La finestra di invio è una dimensione concordata tra mittente e destinatario che indica la quantità di dati che il destinatario può ricevere. La finestra di congestione e la finestra di invio sono correlate; la finestra di invio è solitamente pari al minimo tra la finestra di congestione e quella di ricezione, ovvero swnd = min(cwnd, rwnd).
La finestra di congestione cwnd cambia come segue:
Se non c'è congestione nella rete, ovvero se non si verifica alcun timeout di ritrasmissione, la finestra di congestione aumenta.
Se si verifica una congestione nella rete, la finestra di congestione diminuisce.
Il mittente determina se la rete è congestionata osservando se il pacchetto di conferma ACK viene ricevuto entro il tempo specificato. Se il mittente non riceve il pacchetto di conferma ACK entro il tempo specificato, la rete viene considerata congestionata.
Oltre alla finestra di congestione, è il momento di discutere l'algoritmo di controllo della congestione TCP. L'algoritmo di controllo della congestione TCP si compone di tre parti principali:
Partenza lenta:Inizialmente, la finestra di congestione cwnd è relativamente piccola e il mittente aumenta esponenzialmente la finestra di congestione per adattarsi rapidamente alla capacità della rete.
Evitare la congestione:Dopo che la finestra di congestione supera una certa soglia, il mittente aumenta la finestra di congestione in modo lineare per rallentare il tasso di crescita della finestra di congestione ed evitare di sovraccaricare la rete.
Recupero rapido:In caso di congestione, il mittente dimezza la finestra di congestione ed entra nello stato di ripristino rapido per determinare la posizione del ripristino della rete tramite gli ack duplicati ricevuti, quindi continua ad aumentare la finestra di congestione.
Partenza lenta
Quando viene stabilita una connessione TCP, la finestra di congestione cwnd viene inizialmente impostata su un valore minimo di MSS (dimensione massima del segmento). In questo modo, la velocità di invio iniziale è di circa MSS/RTT byte al secondo. La larghezza di banda effettivamente disponibile è solitamente molto maggiore di MSS/RTT, quindi TCP cerca di trovare la velocità di invio ottimale, che può essere ottenuta tramite slow-start.
Nel processo di avvio lento, il valore della finestra di congestione cwnd verrà inizializzato a 1 MSS e, ogni volta che il segmento di pacchetto trasmesso viene riconosciuto, il valore di cwnd verrà aumentato di un MSS, ovvero il valore di cwnd diventerà 2 MSS. Successivamente, il valore di cwnd verrà raddoppiato per ogni trasmissione riuscita di un segmento di pacchetto, e così via. Il processo di crescita specifico è mostrato nella figura seguente.
Tuttavia, la velocità di invio non può aumentare sempre; la crescita deve prima o poi terminare. Quindi, quando termina l'aumento della velocità di invio? L'avvio lento in genere interrompe l'aumento della velocità di invio in uno dei seguenti modi:
Il primo caso riguarda la perdita di pacchetti durante il processo di invio con avvio lento. Quando si verifica una perdita di pacchetti, TCP imposta la finestra di congestione del mittente cwnd a 1 e riavvia il processo di avvio lento. A questo punto, viene introdotto il concetto di soglia di avvio lento ssthresh, il cui valore iniziale è la metà del valore di cwnd che genera la perdita di pacchetti. In altre parole, quando viene rilevata una congestione, il valore di ssthresh è la metà del valore della finestra.
Il secondo metodo consiste nel correlarlo direttamente con il valore della soglia di slow-start ssthresh. Poiché il valore di ssthresh è la metà del valore della finestra al momento del rilevamento della congestione, si potrebbe verificare una perdita di pacchetti a ogni raddoppio quando cwnd è maggiore di ssthresh. Pertanto, è consigliabile impostare cwnd su ssthresh, il che causerà il passaggio di TCP alla modalità di controllo della congestione e la fine dello slow-start.
L'ultimo modo in cui l'avvio lento può terminare è quando vengono rilevati tre ACK ridondanti: TCP esegue una ritrasmissione rapida ed entra in stato di ripristino. (Se non è chiaro il motivo per cui ci sono tre pacchetti ACK, verrà spiegato separatamente nel meccanismo di ritrasmissione.)
Evitare la congestione
Quando TCP entra nello stato di controllo della congestione, cwnd viene impostato a metà della soglia di congestione ssthresh. Ciò significa che il valore di cwnd non può essere raddoppiato ogni volta che viene ricevuto un segmento di pacchetto. Viene invece adottato un approccio relativamente conservativo in cui il valore di cwnd viene aumentato di un solo MSS (lunghezza massima del segmento di pacchetto) dopo il completamento di ogni trasmissione. Ad esempio, anche se vengono confermati 10 segmenti di pacchetto, il valore di cwnd aumenterà solo di un MSS. Questo è un modello di crescita lineare e presenta anche un limite superiore di crescita. Quando si verifica una perdita di pacchetto, il valore di cwnd viene modificato in un MSS e il valore di ssthresh viene impostato a metà di cwnd. Oppure interrompe la crescita di MSS quando vengono ricevute 3 risposte ACK ridondanti. Se vengono ancora ricevute tre risposte ACK ridondanti dopo aver dimezzato il valore di cwnd, il valore di ssthresh viene registrato come metà del valore di cwnd e viene attivato lo stato di ripristino rapido.
Recupero rapido
Nello stato di Fast Recovery, il valore della finestra di congestione cwnd viene aumentato di un MSS per ogni ACK ridondante ricevuto, ovvero un ACK che non arriva in sequenza. Questo serve a utilizzare i segmenti di pacchetto trasmessi correttamente nella rete per migliorare il più possibile l'efficienza di trasmissione.
Quando arriva un ACK del segmento di pacchetto perso, TCP diminuisce il valore di cwnd ed entra nello stato di prevenzione della congestione. Questo serve a controllare la dimensione della finestra di congestione ed evitare un ulteriore aumento della congestione della rete.
Se si verifica un timeout dopo lo stato di controllo della congestione, la condizione di rete diventa più grave e TCP migra dallo stato di prevenzione della congestione allo stato di avvio lento. In questo caso, il valore della finestra di congestione cwnd viene impostato a 1 MSS, la lunghezza massima del segmento di pacchetto, e il valore della soglia di avvio lento ssthresh viene impostato a metà di cwnd. Lo scopo è quello di aumentare gradualmente la dimensione della finestra di congestione dopo il ripristino della rete per bilanciare la velocità di trasmissione e il grado di congestione della rete.
Riepilogo
In quanto protocollo di trasporto affidabile, TCP implementa il trasporto affidabile tramite numero di sequenza, conferma di ricezione, controllo di ritrasmissione, gestione della connessione e controllo della finestra. Tra questi, il meccanismo di controllo del flusso controlla la quantità di dati inviati dal mittente in base all'effettiva capacità di ricezione del destinatario, evitando così i problemi di congestione della rete e il degrado delle prestazioni. Il meccanismo di controllo della congestione evita il verificarsi di congestione della rete regolando la quantità di dati inviati dal mittente. I concetti di finestra di congestione e finestra di invio sono correlati tra loro e la quantità di dati al mittente viene controllata regolando dinamicamente la dimensione della finestra di congestione. Avvio lento, prevenzione della congestione e ripristino rapido sono i tre componenti principali dell'algoritmo di controllo della congestione TCP, che regolano la dimensione della finestra di congestione attraverso diverse strategie per adattarsi alla capacità e al grado di congestione della rete.
Nella prossima sezione, esamineremo in dettaglio il meccanismo di ritrasmissione del TCP. Il meccanismo di ritrasmissione è una parte importante del TCP per garantire una trasmissione affidabile. Garantisce la trasmissione affidabile dei dati ritrasmettendo i dati persi, corrotti o in ritardo. Il principio di implementazione e la strategia del meccanismo di ritrasmissione saranno introdotti e analizzati in dettaglio nella prossima sezione. Restate sintonizzati!
Data di pubblicazione: 24 febbraio 2025