# Explicit Congestion Notification

La notification explicite de congestion (dite ECN, de l'anglais « Explicit Congestion Notification ») est une extension aux protocoles TCP et IP qui permet de signaler la congestion du réseau avant que la perte de paquets ne se produise. Elle est définie dans la RFC 3168 et découle de l'utilisation d'une fenêtre glissante, pour le contrôle des flux de données.

## Principe

Normalement, les protocoles de couche transport tels que TCP augmentent le débit tant qu'aucun paquet n'est perdu ; ce n'est que lorsqu'un paquet est perdu que le débit est modéré. Avec ECN, un routeur peut explicitement signaler un début de congestion avant de commencer à perdre des paquets.
ECN est négociée pour chaque connexion : elle n'est utilisée que lorsque les deux hôtes échangeant des données signalent leur intention de l'utiliser.
Lorsque la notification explicite de congestion est mise en place, le routeur marque les paquets qui le traversent lorsqu'il détecte une congestion. Malheureusement, ces paquets marqués sont reçus par leur destinataire, alors que c'est leur émetteur qui devrait être averti de la congestion. Pour cette raison, le récepteur doit transmettre cette information en retour à l'émetteur des paquets, et un aller-retour complet est nécessaire avant que l'émetteur ne soit averti du problème de congestion.

## Adoption

Bien que cette extension ait été conçue de sorte que son usage soit compatible avec les normes existantes, il existe encore à ce jour, plus de dix ans après son introduction en 2001, un nombre important d'équipements incompatibles sur le réseau. Certains routeurs ou pare-feux incompatibles peuvent ainsi bloquer le trafic entre deux hôtes implémentant ECN. C'est pour cette raison qu'elle est désactivée implicitement sur la plupart des systèmes d'exploitation contemporains.

## Mode opératoire

ECN est prise en charge à la fois par les couches réseau et transport, car les routeurs travaillent au niveau de la couche réseau, tandis que le débit est géré « de bout en bout », c'est-à-dire par les extrémités de la connexion, en couche transport.
Ainsi, dans le cas des protocoles TCP et IP, les routeurs signalent une congestion en cours dans l'en-tête du paquet IP, et le destinataire qui reçoit ce paquet en informe l'émetteur dans l'en-tête du prochain segment TCP qu'il lui renvoie. Cette interaction entre des couches réseau différentes casse quelque peu la séparation de principe entre les couches réseau.

### Marquage des paquets IP

ECN utilise les deux bits les moins significatifs (les plus à droite) du champ DSCP de l'en-tête IPv4 ou IPv6, ce qui donne quatre valeurs possibles :
* 00 : transport incapable de gérer l'ECN — Non-ECT
* 10 : transport capable de gérer l'ECN — ECT(0)
* 01 : transport capable de gérer l'ECN — ECT(1)
* 11 : congestion subie — CE
Quand les deux extrémités de la transmission prennent en charge ECN, ils marquent leurs paquets avec ECT(0) ou ECT(1). Si le paquet traverse un routeur qui la prend en charge et qui est congestionné, il peut changer cette valeur en CE (Congestion Experienced).

### Retour d'information dans les segments TCP

TCP utilise deux drapeaux de l'en-tête TCP :
* Le bit ECE (ECN Echo) sert à informer l'émetteur qu'un paquet IP marqué par un routeur a été reçu.
* Le bit CWR (Congestion Window Reduced) sert à informer le récepteur que des mesures ont été prises par l'émetteur en réduisant sa fenêtre de congestion.
Le récepteur continue à transmettre des segments TCP avec le bit ECE tant qu'il n'a pas reçu un segment avec le bit CWR.
L'utilisation de ECN sur une connexion TCP est optionnelle : pour qu'elle soit utilisée, cela doit avoir été négocié lors de l'établissement de la connexion en utilisant les options ad hoc dans les segments SYN et SYN-ACK.
La fenêtre de congestion de TCP ne s'applique pas aux segments de contrôle (acquittements ACK purs, segments SYN ou FIN) et on ne marque donc en général pas les paquets qu'ils contiennent comme étant capables de transmettre les notifications explicites de congestion. Néanmoins, la RFC 5562 suggère de marquer les paquets contenant des segments SYN-ACK comme capables de gérer l'ECN.

### Avec les autres protocoles de transport

ECN est également définie pour d'autres protocoles de couche transport qui gèrent la congestion, en particulier DCCP et SCTP.
Avec UDP, ce serait à l'application au-dessus de UDP de gérer la congestion, en admettant qu'elle puisse accéder aux bits qui lui sont consacrés depuis l'interface de programmation du réseau.