🏛️ ArchiZeroTrust CCIE QoS 07 — WRED
🎲 QoS · WRED

WRED — Weighted Random Early Detection

Le tail drop crée une synchronisation globale TCP : tous les flows reculent en même temps, puis redémarrent ensemble — throughput oscillant. WRED droppe aléatoirement et sélectivement avant saturation, cassant cette synchronisation.

WRED = RED avec pondération DSCP. RED (Random Early Detection) résout le problème de TCP Global Synchronization causé par le tail drop. WRED ajoute la pondération : les paquets avec un DSCP de haute priorité sont droppés moins souvent (thresholds plus élevés), ceux avec un drop precedence élevé sont droppés en premier.
Tail Drop seul : quand la queue est pleine, TOUS les paquets qui arrivent sont droppés — peu importe leur DSCP ou leur flow. Les senders TCP détectent la perte (timeout ou ACK dupliqué) et tous simultanément réduisent leur fenêtre de congestion à 1 MSS (slow start). La queue se vide brusquement. Tous les flows redémarrent ensemble. La queue se remplit à nouveau trop vite. Le cycle recommence indéfiniment — c'est la TCP Global Synchronization.
❌ Sans WRED — Tail Drop — TCP Global Synchronization temps → Queue pleine Queue vide tail drop DROP TOUS DROP TOUS DROP TOUS DROP TOUS DROP TOUS Tous les flows TCP reculent simultanément → queue se vide → tous redémarrent → se remplissent → cycle sans fin ✅ Avec WRED — drops précoces et échelonnés — throughput lissé temps → Queue pleine tail drop min-threshold (WRED commence) drop 1 flow drop 1 flow Drop WRED (1 flow, aléatoire) Profondeur queue (stable) min-threshold
Pourquoi ça fonctionne : WRED commence à dropper aléatoirement dès que la queue dépasse le min-threshold — bien avant la saturation. En droppant un seul flow à la fois (et pas tous ensemble), les backs-off TCP sont échelonnés. La queue reste stable dans la zone WRED. Le throughput global reste élevé et continu.
AspectREDWRED
Profils de dropUn seul profil pour tous les paquetsProfil par IP Precedence ou DSCP — classes différentes = thresholds différents
PrioritéAveugle — traite tous les flows de façon identiqueAF13 droppé avant AF12, avant AF11 — respect du drop precedence
TCP vs UDPDrop sans discriminationDrop sans discrimination aussi — WRED est efficace uniquement sur TCP
Cisco IOSCommande random-detect sans optionCommande random-detect dscp-based ou prec-based
UsageObsolète en pratiqueStandard sur liens WAN congestionné avec trafic DSCP marqué
MécanismeQuand droppeQui droppeEffet TCP
Tail DropQueue 100% pleineTous les arrivantsGlobal Sync — oscillation
REDDès le min-thresholdAléatoire, indifférenciéÉchelonné, mais aveugle au DSCP
WREDDès le min-threshold du profil DSCPAléatoire, pondéré par DSCPÉchelonné + respect priorité
WRED + ECNDès le min-thresholdMarque CE bit — ne droppe pasOptimal — zéro perte, signal congestion
Trois paramètres contrôlent le comportement WRED par profil : min-threshold (début des drops), max-threshold (début du tail drop), mark-probability denominator (taux de drop au max-threshold). Comprendre la courbe de drop est essentiel pour dimensionner WRED correctement.
profondeur queue (paquets) probabilité de drop 0% 20% 40% 60% 80% 100% 0 10 20 30 40 50 60 1/mark-prob = ~10% ZONE 1 Admission totale 0% drop ZONE 2 Drop WRED progressif 0% → 1/mark-prob ZONE 3 TAIL DROP 100% drop comme sans WRED min-threshold début des drops max-threshold tail drop immédiat
Formule drop probability (Zone 2) :
P(drop) = (avg_queue - min_threshold) / (max_threshold - min_threshold) × (1 / mark_prob_denominator)

Exemple : avg=30 paquets, min=20, max=40, mark-prob=10
P = (30-20)/(40-20) × 1/10 = 10/20 × 0.1 = 0.05 = 5%

À mi-chemin entre min et max, 5% des paquets sont droppés. Au max-threshold, 10% sont droppés (1/10) — puis la zone 3 prend le relais : 100%.
ParamètreRôleValeur IOS par défautImpact si trop bas/haut
min-threshold Profondeur queue à partir de laquelle WRED commence à dropper Variable selon DSCP (ex: 20 pour AF11) Trop bas → drops excessifs avant congestion réelle. Trop haut → WRED s'active trop tard, risque tail drop
max-threshold Profondeur queue à partir de laquelle tail drop s'active (100%) Variable selon DSCP (ex: 40 pour AF11) Trop bas → tail drop précoce = même problème que sans WRED. Trop haut → grande latence
mark-probability denominator Taux de drop au max-threshold = 1/denominator 10 → 10% de drop au max-threshold Trop petit (denom=2 → 50%) → drops agressifs. Trop grand (denom=100 → 1%) → WRED quasi-inefficace
WRED ne compare pas à la profondeur instantanée de la queue — il compare à la profondeur moyenne exponentielle (EWMA). Cela évite les réactions aux micro-bursts transitoires.

avg_queue = (1 - 2^-exp_weight) × prev_avg + 2^-exp_weight × current_queue

exp-weighting-constant (défaut = 9) : plus la valeur est grande, plus la moyenne est lissée. Une valeur faible (ex: 1) rend WRED réactif aux micro-bursts — rarement souhaitable.
random-detect dscp-based est la forme standard de WRED en production. Chaque valeur DSCP a son propre profil (min-threshold, max-threshold, mark-probability). Les classes AF sont conçues pour être droppées dans l'ordre de leur drop precedence : AF_3 (high drop) avant AF_2 (medium drop) avant AF_1 (low drop).
Rappel DSCP AFxy : x = classe (1 à 4), y = drop precedence (1=low, 2=medium, 3=high)

AF11 = classe 1, drop precedence LOW → thresholds ÉLEVÉS → droppé en dernier
AF12 = classe 1, drop precedence MEDIUM → thresholds MOYENS → droppé en second
AF13 = classe 1, drop precedence HIGH → thresholds BAS → droppé EN PREMIER

En cas de congestion dans la classe CM-VIDEO (qui contient AF11/AF12/AF13), WRED sacrifie AF13 avant AF12 avant AF11 — les paquets "moins importants" de la même classe partent en premier.
profondeur queue (paquets) drop probability 0% 20% 40% 60% 80% 100% 0 10 20 30 40 50 22 40 18 32 14 24 AF13 — drop HIGH — droppé EN PREMIER (min=14, max=24) AF12 — drop MEDIUM — droppé en second (min=18, max=32) AF11 — drop LOW — droppé en dernier (min=22, max=40) à queue=20 paquets : AF13 = déjà en zone WRED (drop ~30%) AF12 = déjà en zone WRED (drop ~10%) AF11 = encore en zone 0% (pas encore dropé)
DSCPmin-thresholdmax-thresholdmark-prob denomComportement
EF (46)224010Voix — ne devrait pas être droppée (LLQ préférable)
AF11 (10)224010Drop precedence LOW — protégé
AF12 (12)183210Drop precedence MEDIUM
AF13 (14)142410Drop precedence HIGH — premier sacrifié
AF21 (18)224010DROP LOW
AF22 (20)183210DROP MEDIUM
AF23 (22)142410DROP HIGH
BE / default (0)204010Best Effort — thresholds intermédiaires
CS1 à CS6VariablesVariables10Dépend du marking
WRED s'applique toujours dans une policy-map, sur une classe bandwidth (CBWFQ). Il est incompatible avec les classes priority (LLQ) — IOS refuse ou ignore. Il fonctionne également sur class-default avec WFQ.
policy-map PM-WAN-CHILD class CM-VOIX priority 128 ← LLQ WRED interdit class CM-VIDEO bandwidth 128 ← CBWFQ ✓ WRED OK random-detect class class-default ← WFQ ✓ WRED OK Output WAN WRED incompatible avec priority (LLQ a son propre policer intégré)
! ── ÉTAPE 1 : class-maps ────────────────────────────────────────────
class-map match-any CM-VOIX
 match dscp ef

class-map match-any CM-VIDEO
 match dscp af41 af42 af43        ! 3 drop precedences dans la même classe

class-map match-any CM-DATA
 match dscp af21 af22 af23

! ── ÉTAPE 2 : policy-map avec WRED sur classes CBWFQ ────────────────
policy-map PM-WAN-CHILD

 class CM-VOIX
  priority 128                     ! LLQ — WRED incompatible ici

 class CM-VIDEO
  bandwidth 192                    ! CBWFQ — WRED s'applique ici
  random-detect dscp-based         ! active WRED avec profils DSCP par défaut
!                                    ! AF43 droppé avant AF42, avant AF41

 class CM-DATA
  bandwidth 96
  random-detect dscp-based         ! même logique : AF23 > AF22 > AF21

 class class-default
  fair-queue
  random-detect                    ! RED simple sur le reste (best-effort)

! ── ÉTAPE 3 : policy parent + application ───────────────────────────
policy-map PM-WAN-PARENT
 class class-default
  shape average 512000
  service-policy PM-WAN-CHILD

interface GigabitEthernet0/1
 bandwidth 512
 service-policy output PM-WAN-PARENT
! Syntaxe : random-detect dscp value min-threshold max-threshold mark-prob-denominator
 class CM-VIDEO
  bandwidth 192
  random-detect dscp-based
!
! Surcharger les thresholds par défaut pour AF41/AF42/AF43 :
  random-detect dscp af41 24 40 10   ! AF41 : min=24, max=40, mark-prob=10
  random-detect dscp af42 20 34 10   ! AF42 : min=20, max=34, mark-prob=10
  random-detect dscp af43 16 26 10   ! AF43 : min=16, max=26 — droppé le plus tôt
!
! Ajuster le lissage EWMA (défaut=9, valeurs 1-16) :
  random-detect exponential-weighting-constant 9
! 9 = lissage normal | 1 = très réactif aux bursts | 16 = très lissé (lent à réagir)
ECN (Explicit Congestion Notification) = WRED sans perte. Au lieu de dropper le paquet, WRED marque le bit CE (Congestion Experienced) dans l'en-tête IP. Le receiver retransmet ce signal au sender TCP via le bit ECE dans l'ACK. Le sender réduit sa fenêtre sans avoir perdu de paquet. Condition : les deux extrémités (sender ET receiver) doivent supporter ECN.
WRED classique — drop du paquet Sender TCP paquet TCP Routeur WRED DROP ✗ paquet perdu Receiver timeout → retransmission → réduction fenêtre TCP WRED + ECN — marquage CE bit, zéro perte Sender TCP paquet ECT=1 Routeur WRED CE=1 marqué ✓ paquet livré (CE=1) Receiver ACK avec ECE=1 → sender réduit fenêtre immédiatement — zéro retransmission En-tête IP — champ ECN (2 bits) 00 = Non-ECT (pas ECN-capable) 01 = ECT(1) — ECN-capable 10 = ECT(0) — ECN-capable 11 = CE — Congestion signalée !
! ── WRED + ECN — ajouter 'ecn' après random-detect ─────────────────
 class CM-VIDEO
  bandwidth 192
  random-detect dscp-based
  random-detect ecn            ! active ECN : marque CE au lieu de dropper
!
! Condition : les deux endpoints DOIVENT supporter ECN
! Si sender n'est pas ECN-capable (ECT=00) → WRED droppe normalement
! Si sender est ECN-capable (ECT=01 ou 10) → WRED marque CE=11
!
! Vérifier support ECN côté serveur Linux :
sysctl net.ipv4.tcp_ecn       ! 0=disabled, 1=enabled, 2=passive
!
! Limites ECN :
! — Fonctionne uniquement pour TCP (pas UDP)
! — Les deux endpoints doivent le supporter
! — Certains firewalls bloquent les paquets CE — tester en prod
CritèreWRED sans ECNWRED + ECN
CompatibilitéUniverselle — fonctionne avec tout senderRequiert support ECN sur les deux endpoints
Pertes de paquetsOui — paquet droppé, retransmisNon — paquet livré avec CE marqué
LatenceAugmente au timeout TCP avant retransmissionMinimale — réduction fenêtre immédiate
ThroughputBaisse pendant retransmissionReste élevé
Usage recommandéStandard — réseau mixteDatacenters, clouds, serveurs ECN-capables
Service-policy output: PM-WAN-PARENT
Class-map: class-default
Shaping ← shape parent actif
Traffic Shaping
Target Bit Rate (bps): 512000 ← CIR confirmé
Service-policy : PM-WAN-CHILD
Class-map: CM-VOIX
priority: 128 kbps ← LLQ, pas de WRED
pkts preempted/delayed: 0/0
Class-map: CM-VIDEO
bandwidth: 192 kbps (37% of shape)← CBWFQ
Exp-weight-constant: 9 ← EWMA weighting
Mean queue depth: 18 packets ← profondeur moyenne actuelle
dscp min-th max-th mark-prob
af41 24 40 1/10 ← drop LOW — protégé
af42 20 34 1/10 ← drop MEDIUM
af43 16 26 1/10 ← drop HIGH — droppé en 1er
Tail drops : 0 ← idéal — WRED évite le tail drop
WRED drops : 42 ← drops WRED normaux = congestion gérée
! ── Vérification principale ─────────────────────────────────────────
show policy-map interface GigabitEthernet0/1 output
! Affiche : profils WRED par DSCP, mean queue depth, tail drops, WRED drops

! ── Stats WRED détaillées ────────────────────────────────────────────
show policy-map interface GigabitEthernet0/1 output class CM-VIDEO
! Affiche uniquement la classe CM-VIDEO avec tous ses compteurs WRED

! ── Profils WRED configurés ──────────────────────────────────────────
show queueing interface GigabitEthernet0/1

! ── Reset des compteurs ──────────────────────────────────────────────
clear counters GigabitEthernet0/1
CompteurValeur normaleProblème si...
WRED dropsQuelques drops — signe que WRED gère la congestionTrès élevé → thresholds trop bas ou lien sous-dimensionné
Tail dropsIdéalement 0 — WRED doit prévenir le tail dropNon-zéro → max-threshold trop bas, ou congestion chronique
Mean queue depthStable entre min et max thresholdProche de max → congestion persistante → augmenter bandwidth ou baisser charge
AF43 drops >> AF41 dropsNormal — drop precedence fonctionneAF41 drops élevés → WRED inefficace ou lien saturé

⚠️ 1 — Appliquer WRED sur une classe priority (LLQ)

random-detect dans une classe priority est refusé ou ignoré par IOS. La priority queue a son propre mécanisme de drop (le policer intégré). Si le trafic dépasse la valeur priority, l'excès est droppé immédiatement par le policer — WRED ne peut pas intervenir avant ce drop.
Règle : WRED uniquement sur bandwidth (CBWFQ) et class-default.

⚠️ 2 — WRED efficace uniquement sur TCP

WRED fonctionne en signalant la congestion à TCP via les pertes (ou ECN). TCP réduit sa fenêtre de congestion en réponse.
UDP est aveugle aux drops WRED — il continue d'envoyer au même débit. Dropper de l'UDP avec WRED n'a aucun effet sur la congestion (le sender ne ralentit pas). WRED sur du trafic majoritairement UDP = pertes sans bénéfice de congestion control.

⚠️ 3 — Confondre drop precedence et priorité de forwarding

AF13 a un drop precedence élevé = il est droppé EN PREMIER par WRED. Cela ne signifie pas qu'il a une priorité de forwarding basse — tous les paquets AF1x appartiennent à la même classe CBWFQ et ont le même bandwidth garanti.
Le drop precedence ne sert qu'à différencier qui sacrifie ses paquets en cas de congestion dans la file, pas qui passe avant qui au scheduler.

⚠️ 4 — max-threshold trop bas = tail drop précoce

Si le max-threshold est inférieur à la profondeur normale de la queue en trafic léger, WRED droppe en permanence même sans congestion réelle. Le mean queue depth doit rester sous le min-threshold en trafic normal, et monter vers max uniquement lors de bursts. Règle terrain : max-threshold ≥ 2 × min-threshold.

⚠️ 5 — Oublier random-detect dscp-based = RED aveugle

random-detect seul (sans dscp-based ni prec-based) est du RED classique : un seul profil pour tous les paquets, indifférent au DSCP. AF13 et AF11 sont droppés au même taux — le drop precedence est ignoré. En production avec des paquets marqués, toujours utiliser random-detect dscp-based.

⚠️ 6 — ECN cassé par les middleboxes

Certains firewalls, load balancers ou routeurs intermédiaires modifient ou bloquent les paquets avec le bit CE=1 (ils les considèrent comme malformés ou suspects). Avant de déployer WRED+ECN en production, vérifier le comportement de tous les équipements sur le chemin. Tester avec ping ip ecn ou Wireshark en capturant les bits ECN.

Qu'est-ce que la TCP Global Synchronization ?
Avec tail drop, tous les flows TCP détectent la congestion simultanément (queue pleine → drop massif). Tous réduisent leur fenêtre en même temps → queue se vide → tous redémarrent ensemble → queue se remplit → cycle oscillant. Throughput très irrégulier.
cliquer pour voir
Quels sont les 3 paramètres d'un profil WRED ?
① min-threshold : profondeur queue à partir de laquelle les drops commencent. ② max-threshold : profondeur à partir de laquelle tail drop (100%). ③ mark-probability denominator : taux de drop au max-threshold = 1/denominator (défaut 10 → 10%).
cliquer pour voir
Pourquoi WRED est incompatible avec priority (LLQ) ?
La priority queue a son propre mécanisme de drop : le policer intégré. Si le trafic dépasse la valeur priority, l'excès est droppé immédiatement. WRED ne peut pas s'intercaler avant ce mécanisme. IOS refuse ou ignore random-detect sur une classe priority.
cliquer pour voir
Quelle est la différence entre AF11, AF12 et AF13 dans WRED ?
Même classe de forwarding (AF1x), même bandwidth CBWFQ garanti. La différence est le drop precedence : AF13 a des thresholds WRED plus bas → est droppé EN PREMIER lors de congestion. AF11 a les thresholds les plus hauts → survit le plus longtemps.
cliquer pour voir
Qu'est-ce que l'EWMA dans WRED ?
Exponentially Weighted Moving Average : WRED compare la profondeur MOYENNE de la queue (lissée), pas la profondeur instantanée. Évite les réactions aux micro-bursts. Paramètre : exponential-weighting-constant (défaut=9). Plus élevé = plus lissé = moins réactif.
cliquer pour voir
Comment fonctionne WRED + ECN ?
Au lieu de dropper le paquet, WRED marque le bit CE=11 dans l'en-tête IP. Le receiver retransmet ce signal via le bit ECE dans l'ACK TCP. Le sender réduit sa fenêtre sans perte de paquet. Nécessite que les deux endpoints supportent ECN (ECT bit=01 ou 10).
cliquer pour voir
Quelle commande active WRED avec profils DSCP ?
random-detect dscp-based dans la classe CBWFQ. Utilise les thresholds IOS par défaut par valeur DSCP. Personnalisation : random-detect dscp af43 16 26 10 pour surcharger min=16, max=26, mark-prob=10 pour AF43.
cliquer pour voir
Sur quels types de trafic WRED est-il efficace ?
Uniquement sur TCP. TCP répond aux drops en réduisant sa fenêtre. UDP ignore les drops — le sender continue d'envoyer au même débit. WRED sur trafic UDP génère des pertes sans effet sur la congestion.
cliquer pour voir