Il controllo della congestione è uno dei compiti del livello di rete.
Una congestione è un carico maggiore di quello che le risorse possono sopportare in una zona della rete.
La congestione può essere temporanea e può dipendere dalle politiche dei livelli di data link, di rete e di trasporto (servizi connessi o no, trasmissione degli ack, ritrasmissione dei pacchetti ecc.); una causa è che spesso il traffico presenta picchi improvvisi.
Per risolvere una congestione temporanea si può cercare di diminuire il carico ma se la congestione si presenta molto spesso bisogna aumentare le risorse nella rete.
Il momento in cui si può presentare una congestione dipende dal tipo di servizio. Nelle reti che usano servizi non connessi la congestione si può presentare in qualsiasi momento, nelle reti che usano servizi connessi si può presentare soltanto al momento della creazione di una nuova connessione; se c’è una congestione non si può creare una nuova connessione (o bisogna aggirare le aree congestionate).
Si può cercare di prevenire la congestione prima che si presenti, indipendentemente dallo stato corrente della rete (controllo a ciclo aperto) o cercare di individuare le congestioni quando si presentano e di risolverle agendo di conseguenza (controllo a ciclo chiuso).
Per quanto riguarda la prevenzione delle congestioni ci sono diversi criteri da considerare a vari livelli (data link, rete e trasporto).
Per esempio il criterio di gestione degli errori usato nel controllo di flusso a livello di data link può influire sulla congestione: in sliding windows la tecnica selective repeat crea un carico minore di quella go back n; anche l’uso del piggybacking aiuta a ridurre il carico.
A livello di rete un buon algoritmo di routing può aiutare a prevenire le congestioni distribuendo il traffico su tutte le linee; anche il tempo di vita dei pacchetti è importante: se la vita è troppo lunga i pacchetti persi possono restare per molto tempo a intasare la rete, ma se è troppo breve i pacchetti possono scadere prima di arrivare a destinazione, causando ritrasmissioni.
Nelle reti che usano servizi connessi per prevenire la congestione viene usato il controllo di ammissione: una connessione può essere creata solo se non crea problemi alle connessioni esistenti; se non è possibile, la connessione viene rifiutata. Può essere possibile creare una nuova connessione instradandola in modo da evitare le aree già congestionate.
Gli algoritmi a ciclo chiuso, che gestiscono le congestioni solo quando si presentano, devono monitorare la rete per individuare le congestioni; possono controllare per esempio la percentuale di pacchetti scartati per mancanza di spazio nei buffer, la lunghezza media delle code, il numero di pacchetti che vanno in timeout e vengono ritrasmessi o il ritardo medio dei pacchetti.
Può essere il mittente stesso a dedurre l’esistenza della congestione e a ridurre il traffico (algoritmi a feedback implicito) o può essere un router ad individuare la congestione e ad avvertire il mittente di rallentare (algoritmi a feedback esplicito).
Il mittente può supporre l’esistenza della congestione per esempio esaminando il tempo necessario a ricevere gli ack.
Con il metodo dei pacchetti regolatori (choke packet) i router tengono sotto controllo le linee di uscita e quando un router si accorge che una linea è congestionata invia al mittente un pacchetto per avvertirlo di ridurre il traffico verso quella destinazione.
Una volta individuata la congestione in un punto della rete bisogna ridurre temporaneamente il traffico in quel punto.
Generalmente il mittente riduce il traffico del 50% e poi prova ad aumentare con piccoli incrementi per evitare che la congestione si ripresenti in fretta.
Un metodo drastico è lo scarto dei pacchetti: quando arrivano troppi pacchetti i router li possono scartare; lo scarto può avvenire in modo casuale o meglio selezionando quali pacchetti scartare.
Potrebbero essere le applicazioni a indicare sui pacchetti la classe di priorità da utilizzare per lo scarto.
In un trasferimento di file sono più importanti i pacchetti vecchi (che dovrebbero essere ritrasmessi con tutti i successivi) e quindi è meglio scartare i pacchetti più nuovi (politica wine), per i dati multimediali invece sono più importanti i pacchetti nuovi (politica milk).
Lo scarto dei pacchetti potrebbe essere segnalato al mittente, ma per non aumentare il carico della rete potrebbe anche non essere reso noto.
La sorgente prima o poi si accorgerà che il pacchetto è andato perso e provvederà di conseguenza.
Partendo dal presupposto che nelle reti cablate è più probabile che la perdita di pacchetti sia dovuta a problemi di congestione piuttosto che ad errori di ritrasmissione, invece di rispedire i pacchetti la sorgente provvederà a rallentare la velocità di trasmissione.