Passa al contenuto principale

3.1. Slow Start e Congestion Avoidance

Gli algoritmi di slow start e congestion avoidance DEVONO (MUST) essere utilizzati da un mittente TCP per controllare la quantità di dati in sospeso iniettati nella rete.

Variabili di stato

Per implementare questi algoritmi, vengono aggiunte due variabili allo stato TCP per connessione:

  1. Finestra di congestione (Congestion Window, cwnd): Una limitazione lato mittente sulla quantità di dati che il mittente può trasmettere nella rete prima di ricevere un riconoscimento (ACK)
  2. Finestra annunciata del ricevitore (Receiver's Advertised Window, rwnd): Una limitazione lato ricevitore sulla quantità di dati in sospeso

Il minimo di cwnd e rwnd governa la trasmissione dei dati.

Un'altra variabile di stato, la soglia di slow start (slow start threshold, ssthresh), viene utilizzata per determinare se utilizzare l'algoritmo di slow start o congestion avoidance per controllare la trasmissione dei dati, come discusso di seguito.

Scopo dello Slow Start

Iniziare la trasmissione in una rete con condizioni sconosciute richiede che TCP sondaggi lentamente la rete per determinare la capacità disponibile, al fine di evitare di congestionare la rete con un burst di dati inappropriatamente grande. L'algoritmo di slow start viene utilizzato a questo scopo:

  • All'inizio di una trasmissione
  • Dopo aver riparato una perdita rilevata dal timer di ritrasmissione

Lo slow start serve inoltre ad avviare il "clock ACK" che il mittente TCP utilizza per rilasciare dati nella rete negli algoritmi di slow start, congestion avoidance e recupero dalla perdita.

Finestra iniziale (IW)

L'IW, il valore iniziale di cwnd, DEVE (MUST) essere impostato utilizzando le seguenti linee guida come limite superiore:

Se SMSS > 2190 byte:
IW = 2 * SMSS byte e NON DEVE essere più di 2 segmenti

Se (SMSS > 1095 byte) e (SMSS <= 2190 byte):
IW = 3 * SMSS byte e NON DEVE essere più di 3 segmenti

Se SMSS <= 1095 byte:
IW = 4 * SMSS byte e NON DEVE essere più di 4 segmenti

Come specificato in [RFC3390], il SYN/ACK e il riconoscimento del SYN/ACK NON DEVONO (MUST NOT) aumentare la dimensione della finestra di congestione. Inoltre, se il SYN o SYN/ACK viene perso, la finestra iniziale utilizzata da un mittente dopo un SYN trasmesso correttamente DEVE (MUST) essere un segmento composto da al massimo SMSS byte.

Una motivazione e una discussione dettagliata dell'impostazione dell'IW sono fornite in [RFC3390].

Valore iniziale di ssthresh

Il valore iniziale di ssthresh DOVREBBE (SHOULD) essere impostato arbitrariamente alto (ad es., alla dimensione della finestra annunciata più grande possibile), ma ssthresh DEVE (MUST) essere ridotto in risposta alla congestione.

Impostare ssthresh il più alto possibile consente alle condizioni di rete, piuttosto che a un limite arbitrario dell'host, di dettare il tasso di invio.

Selezione dell'algoritmo

  • L'algoritmo di slow start viene utilizzato quando cwnd < ssthresh
  • L'algoritmo di congestion avoidance viene utilizzato quando cwnd > ssthresh
  • Quando cwnd e ssthresh sono uguali, il mittente può utilizzare slow start o congestion avoidance

Algoritmo di Slow Start

Durante lo slow start, un TCP aumenta cwnd di al massimo SMSS byte per ogni ACK ricevuto che riconosce cumulativamente nuovi dati. Lo slow start termina quando:

  • cwnd supera ssthresh (o facoltativamente, quando lo raggiunge, come menzionato sopra), o
  • Quando viene osservata congestione

Aumento raccomandato di cwnd

Mentre tradizionalmente le implementazioni TCP hanno aumentato cwnd di esattamente SMSS byte al ricevimento di un ACK che copre nuovi dati, RACCOMANDIAMO (RECOMMEND) che le implementazioni TCP aumentino cwnd secondo:

cwnd += min (N, SMSS)    (Equazione 2)

dove N è il numero di byte precedentemente non riconosciuti che vengono riconosciuti nell'ACK in arrivo.

Questa regolazione fa parte di Appropriate Byte Counting [RFC3465] e fornisce robustezza contro ricevitori che si comportano male che potrebbero tentare di indurre un mittente a gonfiare artificialmente cwnd utilizzando un meccanismo noto come "divisione ACK" [SCWA99].

Algoritmo di Congestion Avoidance

Durante la congestion avoidance, cwnd viene incrementato di circa 1 segmento completo per Round-Trip Time (RTT). La congestion avoidance continua fino a quando non viene rilevata la congestione.

Linee guida per l'aumento di cwnd

Le linee guida di base per aumentare cwnd durante la congestion avoidance sono:

  • PUÒ (MAY) aumentare cwnd di SMSS byte
  • DOVREBBE (SHOULD) aumentare cwnd secondo l'equazione (2) una volta per RTT
  • NON DEVE (MUST NOT) aumentare cwnd di più di SMSS byte

Implementazione raccomandata

Il modo RACCOMANDATO (RECOMMENDED) per aumentare cwnd durante la congestion avoidance è contare il numero di byte che sono stati riconosciuti dagli ACK per nuovi dati. Quando il numero di byte riconosciuti raggiunge cwnd, allora cwnd può essere aumentato fino a SMSS byte.

Si noti che durante la congestion avoidance, cwnd NON DEVE (MUST NOT) essere aumentato di più di SMSS byte per RTT.

Formula alternativa

Un'altra formula comune che un TCP PUÒ (MAY) utilizzare per aggiornare cwnd durante la congestion avoidance è fornita nell'Equazione (3):

cwnd += SMSS*SMSS/cwnd    (Equazione 3)

Risposta alla perdita

Quando un mittente TCP rileva la perdita di un segmento utilizzando il timer di ritrasmissione e il segmento dato non è ancora stato ritrasmesso dal timer di ritrasmissione, il valore di ssthresh DEVE (MUST) essere impostato a non più del valore fornito nell'Equazione (4):

ssthresh = max (FlightSize / 2, 2*SMSS)    (Equazione 4)

dove, come discusso sopra, FlightSize è la quantità di dati in sospeso nella rete.

Inoltre, al verificarsi di un timeout (come specificato in [RFC2988]) cwnd DEVE (MUST) essere impostato a non più della finestra di perdita LW, che è uguale a 1 segmento completo (indipendentemente dal valore di IW).

Pertanto, dopo aver ritrasmesso il segmento scartato, il mittente TCP utilizza l'algoritmo di slow start per aumentare la finestra da 1 segmento completo al nuovo valore di ssthresh, al quale punto la congestion avoidance riprende.