# Explicit Congestion Notification

L’Explicit Congestion Notification (in italiano "notifica esplicita di congestione"), abbreviato ECN, è un'estensione dei protocolli TCP/IP definita nella RFC 3168 che consente di rilevare la presenza di congestione di rete senza perdita di pacchetti. Questa funzionalità è disponibile solo quando entrambi i terminali e l'infrastruttura di rete che li connette la supportano.
In assenza di ECN, le reti basate su TCP/IP segnalano la presenza di congestione mediante l'eliminazione di alcuni pacchetti, utilizzando un meccanismo chiamato random early detection. Quando è attiva l'ECN invece un router può inserire un marcatore nell’header di un pacchetto IP per segnalare un'imminente congestione. Il destinatario rimanda quindi il marcatore al mittente del pacchetto, il quale riduce così la sua velocità di trasmissione.

## Funzionamento

L'imminente congestione è indicata impostando il campo ECN di un pacchetto IP packet a CE (Congestion Experienced) ed è rimandata indietro dal destinatario al mittente impostando dei bit specifici nell’header.

### ECN su IP

L'ECN utilizza i due bit meno significativi (cioè quelli più a destra) del campo Traffic Class degli header IPv4 e IPv6 per trasmettere quattro possibili stati:
* 00 – ECN non supportato
* 01 – ECN supportato
* 10 – ECN supportato
* 11 – Congestion Experienced (CE)
Quando entrambi i terminali supportano l'ECN, i pacchetti vengono marcati con i codici 01 o 10, che sono equivalenti. In presenza di congestione, se il router che la rileva supporta l'ECN cambierà il codice in 11 (CE) invece di eliminare dei pacchetti. Il nuovo codice sarà ricevuto dal destinatario, che lo rimanderà al mittente dei pacchetti, il quale ridurrà la sua velocità di trasmissione.

### ECN su TCP

Il TCP supporta ECN usando due diversi indicatori nell’header TCP. Il primo, chiamato ECN-Echo (ECE), è usato per rimandare l'avviso di congestione al mittente per chiedere di ridurre la velocità di trasmissione. Il secondo, denominato Congestion Window Reduced (CWR), è impostato dal mittente per segnalare che la notifica di congestione è stata ricevuta.
L'uso dell'ECN in una connessione TCP è facoltativo ed è possibile solo se è stabilito al momento della creazione della connessione aggiungendo apposite opzioni nei pacchetti di sincronizzazione iniziali SYN e SYN-ACK. Questo processo è chiamato negoziazione e serve a stabilire se tutti i dispositivi su cui è creata la connessione supportano l'ECN. Una volta che l'utilizzo dell'ECN è stato negoziato correttamente tra le parti, quando il destinatario riceve un pacchetto in cui è presente il marcatore CE, reinvia quest'informazione al mittente utilizzando l'indicatore ECE nell’header TCP. Il mittente quindi ridurrà la sua velocità di trasmissione dei pacchetti e invierà una conferma mediante l'indicatore CWR.

### ECN su altri protocolli

L'ECN è definita anche su altri protobolli di comunicazione a livello di trasporto, tra cui DCCP e SCTP.
È anche possibile usare l'ECN nei protocolli basati su UDP, tuttavia è supportato solo quelli più recenti, come ad esempio QUIC.

## Supporto

Microsoft Windows supporta l'ECN a partire dalle versioni Vista e Server 2012. Nelle versioni Server è abilitato di default, mentre in quelle non Server deve essere abilitato manualmente.
Linux supporta l'ECN a partire dalla versione 2.4.20 del kernel Linux uscita nel novembre 2002.
L'ECN è stato introdotto in Mac OS X 10.5 ed è abilitato di default da OS X 10.11. È anche supportato e abilitato di default da iOS 9.