🏛️ ArchiZeroTrust CCIE QoS 06 — Queuing
🗂️ QoS · Queuing

Queuing — Files d'attente

Sans queue intelligente, backup et voix partagent le même couloir. FIFO → WFQ → CBWFQ → LLQ : chaque étape résout un problème que la précédente ne pouvait pas gérer. La voix mérite son propre couloir.

Le problème fondamental : un routeur a une interface WAN à 512 kbps. En même temps arrivent un appel VoIP, une vidéo Teams et un backup S3. Sans queue intelligente, ils font la queue dans le même couloir — FIFO. Le backup passe en premier ? La voix se dégrade. La queue est la solution.
Étape 1
FIFO
Premier arrivé, premier servi. Un seul buffer. Simple mais aveugle.
✗ Backup écrase la voix
Étape 2
WFQ
Séparation automatique par flux. Poids par IP Precedence. Pas besoin de config.
✗ Pas de garantie stricte voix
Étape 3
CBWFQ
Tu définis les classes toi-même. Bande passante garantie par classe. MQC.
✗ Voix peut encore attendre
Étape 4
LLQ
Priority queue stricte. La voix passe TOUJOURS en premier. Zéro attente.
✓ Solution complète
LAN 🎤 VoIP 📹 Vidéo 💼 Apps 📦 Backup Router Queue ici shape 512k 512 kbps WAN ⚠ goulot d'étranglement Sans queue — FIFO BACK BACK BACK VOIX voix attend derrière backup ! latence → appel dégradé Avec LLQ + CBWFQ VOIX ← sort en 1er VID APP BACK chaque classe attend son tour
MécanismeRôleConfigDéfaut IOS
FIFOUn seul buffer, ordre d'arrivéeAucuneOui (interfaces rapides)
WFQSéparation automatique par flux, équitéAutomatiqueOui (interfaces lentes <2M)
CBWFQClasses manuelles, bande passante garantie minimumMQC class+policyNon
LLQCBWFQ + priority queue stricte pour la voixMQC + priorityNon
FIFO = First In, First Out. Un seul buffer. Les paquets entrent dans l'ordre où ils arrivent et sortent dans le même ordre. Pas d'intelligence, pas de priorité. C'est le défaut IOS sur les interfaces >2 Mbps.
Buffer FIFO — arrivée désordonnée entrée → BACK1 BACK2 BACK3 VOIX BACK4 BACK5 sortie WAN 512k Ordre de sortie : BACK1 BACK2 BACK3 VOIX attend 3 paquets backup = latence inacceptable Tail Drop — buffer plein : le dernier paquet arrivé est droppé — quel que soit son type
⚠️ TCP Global Sync : quand le buffer FIFO est plein, tous les flux TCP subissent le tail drop en même temps. Tous réduisent leur fenêtre simultanément → le lien WAN devient sous-utilisé → tous repartent en même temps → buffer plein à nouveau. Oscillations permanentes. C'est une des raisons d'exister de WRED (page 07).
✅ FIFO convient quand le lien n'est jamais congestionné — typiquement les interfaces LAN 1G/10G sur campus où la bande passante est largement suffisante. Sur un lien WAN congestionné : toujours remplacer FIFO par CBWFQ + LLQ.
WFQ = Weighted Fair Queuing. IOS crée automatiquement une queue par flux (par paire IP src/dst + port). Chaque flux a un poids basé sur l'IP Precedence. Les flux légers (voix) obtiennent proportionnellement plus de bande passante que les flux lourds (backup). Pas de config MQC requise.
Trafic entrant (mélangé) BK VO BK VD BK WFQ classifier par flux Queue Voix (poids 5) Queue Vidéo (poids 3) Queue Backup (poids 1) Scheduler WFQ WAN 512k Poids WFQ = IP Precedence + 1 EF (Prec 5) → poids 6, backup BE (Prec 0) → poids 1
Par défaut sur Serial/BRI < 2 Mbps : WFQ est actif sans rien faire.
Sur d'autres interfaces (FastEthernet, GigabitEthernet) : FIFO par défaut — il faut activer manuellement.
! ── Activer WFQ sur une interface (si pas déjà par défaut) ──
interface Serial0/0/0
 fair-queue                   ! active WFQ avec paramètres par défaut

! ── Syntaxe complète avec paramètres ──
interface Serial0/0/0
 fair-queue 64 256 0         ! threshold=64  queues=256  reservable=0
!              │     │      └── queues réservées RSVP (IntServ)
!              │     └──────── nombre de queues dynamiques (défaut : 256)
!              └────────────── seuil de congestion (défaut : 64 paquets)

! ── Augmenter à 1024 queues (pour plus de 256 flux) ──
interface Serial0/0/0
 fair-queue 64 1024 0       ! valeurs possibles : 16, 32, 64, 128, 256, 512, 1024, 2048, 4096

! ── Vérifier ──
show interfaces Serial0/0/0 | include Queueing
show queue Serial0/0/0
Flux = 5-tuple unique : adresse IP source + adresse IP destination + port source + port destination + protocole IP (TCP/UDP/ICMP…)

Chaque combinaison unique = une queue dédiée.
Exemple : PC-A (192.168.1.10:5000) → Serveur (10.0.0.1:443) = 1 flux = 1 queue
PC-A (192.168.1.10:5001) → Serveur (10.0.0.1:443) = 2e flux = 2e queue (port source différent)
⚠️ 256 queues = limite très basse. Un seul poste Windows ouvre facilement 50–100 connexions TCP simultanées (navigateur, Windows Update, antivirus…). Avec 10 postes : 10 × 50 = 500 flux potentiels → on dépasse déjà 256.

Quand la limite est atteinte : les nouveaux flux entrent dans une queue de débordement partagée — on perd l'équité WFQ et on retombe dans du FIFO pour ces flux. WFQ est adapté aux petites structures (< 50 utilisateurs environ). Pour des entreprises moyennes/grandes : CBWFQ obligatoire.
Critère de poidsDétailEffet
IP Precedence Poids = 32 384 / (IP Precedence + 1)
Prec 0 (BE) → poids 32 384
Prec 5 (Voice) → poids 5 397
Prec 7 (Network) → poids 4 048
Poids bas = servi plus souvent.
Prec 5 est servi ~6× plus souvent que Prec 0
Taille de paquet Le numéro de séquence d'un flux augmente proportionnellement aux octets transmis Un flux qui envoie de gros paquets "avance" plus vite dans sa séquence → servi moins souvent. Favorise les petits paquets (voix).
Sans IP Precedence Tous les paquets ont Prec 0 → même poids (32 384) WFQ fonctionne quand même — équité pure entre flux, favorise les petits paquets. Pas besoin de marquage DSCP/Prec pour activer WFQ.
Résumé du double critère : WFQ favorise simultanément les flux à haute priorité (IP Precedence élevé) et les flux à petits paquets (voix/interactive). Un flux backup qui envoie des blocs de 1500 octets se retrouve "en retard" par rapport à un flux voix qui envoie des paquets de 60 octets — c'est voulu.
ContexteWFQ pertinent ?Recommandation
Lien Serial WAN <2Mbps (ancien) Oui — actif par défaut, correct pour petites structures Acceptable si pas de voix critique
Réseau avec voix/vidéo Non — pas de garantie stricte CBWFQ + LLQ obligatoire
class-default dans CBWFQ Oui — fair-queue dans class-default Usage recommandé : équité entre flux non classifiés dans le bucket par défaut
WAN moderne (MPLS, SD-WAN) Non — remplacé par CBWFQ/LLQ + DSCP WFQ = mécanisme legacy. CBWFQ/LLQ = standard actuel. WFQ survit uniquement dans class-default.
⚠️ WFQ ne garantit pas de bande passante stricte. Proportionnel ≠ garanti. Si 200 flux backup saturent le lien, la voix obtient toujours plus proportionnellement — mais ce peut ne pas suffire pour le temps réel. Pour une garantie absolue : CBWFQ (bandwidth). Pour priorité stricte : LLQ (priority).
CritèreWFQ
Config requiseAucune — fair-queue suffit
Définition d'un flux5-tuple : src IP + dst IP + src port + dst port + protocole
Queues dynamiques256 par défaut — modifiable jusqu'à 4096
Critère de poidsIP Precedence (poids = 32 384 / Prec+1) + taille des paquets
Fonctionne sans marquageOui — équité pure si Prec 0 partout
Bande passante garantieNon — proportionnelle seulement
Priorité stricte voixNon — LLQ requis
Défaut IOS surInterfaces <2 Mbps (Serial, BRI). FIFO sur FastEth/Gig.
CBWFQ = Class-Based WFQ. C'est un mécanisme d'ordonnancement (scheduling) — pas du policing, pas du shaping. Tu définis des classes manuellement avec MQC (class-map + policy-map + service-policy). Chaque classe obtient un minimum de bande passante garanti en cas de congestion. Sans congestion, toutes les classes peuvent utiliser plus que leur minimum — la bande passante libre est partagée proportionnellement.

CBWFQ ne marque rien par défaut — il ne modifie pas le DSCP des paquets. Il les classe et ordonnance. Le marquage (set dscp) est une action optionnelle que tu peux ajouter dans la même classe.
ingress (flux mélangés) → class-map trie → une file par classe → scheduler → WAN ingress DSCP EF DSCP AF41 DSCP EF DSCP AF31 DSCP BE DSCP AF41 DSCP BE policy-map PM-WAN class CM-VOIX match dscp ef class CM-VIDEO match dscp af41 class CM-APPS match dscp af31 class-default (tout le reste — BE, FTP…) CM-VOIX bandwidth 128 CM-VIDEO bandwidth 128 CM-APPS bandwidth 128 class-default fair-queue WFQ Scheduler proportionnel au bandwidth 512 kbps WAN out ① class-map + policy-map ② une file créée par classe ③ service-policy congestion = garantie active
ÉtapeCommandeRôle
① class-map class-map match-all CM-VOIX Définit qui est concerné — le critère de classification (DSCP, ACL, protocole, VLAN…)
② policy-map policy-map PM-WAN + class CM-VOIX + bandwidth 128 Définit quoi faire — garantir une bande passante, priorité, marquage…
③ service-policy interface Serial0/0/0service-policy output PM-WAN Applique la policy à une interface, dans un sens (input = policing, output = queuing/shaping)
! ── Classification par DSCP (recommandé — survit au transit MPLS) ──
class-map match-all CM-VOIX
 match dscp ef                    ! DSCP 46 — voix EF

class-map match-all CM-VIDEO
 match dscp af41                  ! DSCP 34 — vidéo AF41

class-map match-all CM-APPS
 match dscp af31 af21             ! plusieurs DSCP dans un seul match

! ── Classification par ACL (L3/L4 — quand pas de marquage DSCP) ──
ip access-list extended ACL-VOIX
 permit udp any any range 16384 32767  ! ports RTP voix

class-map match-all CM-VOIX-ACL
 match access-group name ACL-VOIX

! ── Classification par protocole (NBAR — reconnaissance applicative) ──
class-map match-all CM-WEBEX
 match protocol webex-meeting       ! NBAR2 identifie l'appli sans ACL

class-map match-all CM-HTTP
 match protocol http                 ! ou https, ftp, ssh, ospf…

! ── Classification par IP Precedence (ancien, interopérabilité) ──
class-map match-all CM-CRITIQUE
 match ip precedence critical        ! Prec 5

! ── match-all vs match-any ──
! match-all = ET logique (tous les critères doivent être vrais)
! match-any = OU logique (un seul critère suffit)
class-map match-any CM-TEMPS-REEL
 match dscp ef
 match dscp af41                   ! voix OU vidéo → même classe
NBAR (Network Based Application Recognition) = inspection applicative (DPI) intégrée à IOS. Au lieu de se fier au DSCP ou aux ports, IOS analyse le contenu des paquets pour identifier l'application. Compatible avec CBWFQ : match protocol <appli> dans un class-map suffit.

Quand préférer NBAR à match dscp :
• Les endpoints ne sont pas de confiance (BYOD, télétravail, WiFi public) — ils pourraient auto-marquer en EF
• Le trafic arrive sans marquage (pas de trust boundary configurée en amont)
• Tu veux distinguer Teams vs Zoom vs Webex (même ports, applis différentes)
• Tu veux confiner du P2P (BitTorrent) sans ACL complexe
! ── Activer NBAR sur l'interface (requis sur IOS, automatique sur IOS-XE/NBAR2) ──
interface Serial0/0/0
 ip nbar protocol-discovery     ! active la reconnaissance — observe les protocoles

! ── class-maps avec match protocol ──
class-map match-all CM-WEBEX
 match protocol webex-meeting     ! NBAR reconnaît Webex même sur ports dynamiques

class-map match-all CM-RTP-VOIX
 match protocol rtp audio         ! RTP audio uniquement — pas vidéo RTP

class-map match-all CM-P2P
 match protocol bittorrent        ! identifier pour limiter/déprioriser

class-map match-all CM-SQL
 match protocol sqlserver         ! trafic base de données métier

! ── policy-map : même structure que DSCP — NBAR est transparent pour CBWFQ ──
policy-map PM-WAN-NBAR
 class CM-RTP-VOIX
  priority 128                  ! LLQ pour voix identifiée par NBAR — 128 kbps
 class CM-WEBEX
  bandwidth 128                ! CBWFQ pour vidéo conférence — 128 kbps
 class CM-SQL
  bandwidth 64                   ! 64 kbps garanti pour la base de données
 class CM-P2P
  bandwidth 32                   ! confinement P2P — toujours en dernier
 class class-default
  fair-queue

! ── Vérifier ce que NBAR a identifié ──
show ip nbar protocol-discovery interface Serial0/0/0 stats byte-count
show ip nbar protocol-discovery top-n 10  ! top 10 applis les plus actives
AspectNBAR
Avantage principalIdentifie des applis sans DSCP ni ACL complexe — reconnaît ports dynamiques et encapsulation
CPU overheadPlus élevé que match dscp — DPI paquet par paquet. À éviter sur routeurs bas de gamme sous forte charge.
Premiers paquets du fluxNBAR peut classer en class-default avant d'identifier l'appli (besoin de voir plusieurs paquets). Problème mineur en pratique.
Trafic TLS chiffréNBAR2 utilise des heuristiques statistiques — moins fiable qu'une inspection claire. Teams/Webex identifiables via SNI.
Combo optimal terrainNBAR en ingress pour set dscp → CBWFQ en egress lit le DSCP. DPI une seule fois à l'entrée, scheduling léger sur chaque lien.
CBWFQ peut aussi marquer en ajoutant set dscp dans la class action. Deux cas d'usage : (1) reclassifier du trafic en transit, (2) marquer le trafic généré par le routeur lui-même.
! ── Cas 1 : trafic en transit — reclassifier + ordonnancer ──
!    Exemple : le trafic SSH arrive non marqué → on le marque AF21 en sortie
class-map match-all CM-SSH
 match access-group name ACL-SSH   ! ACL identifie le flux SSH

policy-map PM-WAN
 class CM-SSH
  set dscp af21                     ! ① MARQUE le paquet DSCP 18
  bandwidth 64                      ! ② GARANTIT 64 kbps minimum

! ── Cas 2 : trafic généré par le routeur (OSPF, BGP, SSH management) ──
!    Un service-policy OUTPUT sur une interface attrape aussi les paquets
!    originés par le routeur lui-même qui sortent par cette interface
class-map match-all CM-OSPF-LOCAL
 match protocol ospf                ! NBAR identifie les hellos OSPF locaux

policy-map PM-WAN
 class CM-OSPF-LOCAL
  set ip precedence critical        ! Prec 5 sur les paquets de contrôle
  bandwidth 32                      ! 32 kbps garanti pour les paquets de contrôle

! ── Alternative pour protocoles de routage — commande ip-precedence ──
router ospf 1
 ip-precedence critical           ! marque tous les paquets OSPF générés par ce process

router bgp 65000
 neighbor 10.0.0.1 dscp 40         ! marque les paquets BGP vers ce voisin (IOS 15.x+)
Contexte : Lien WAN 512 kbps. 4 types de trafic. Les apps métier et la téléphonie partagent le lien avec du backup FTP qui saturerait tout en FIFO. Objectif : voix et vidéo ont leur bande passante garantie, même si le backup est à fond.
Note : On utilise CBWFQ seul ici (sans LLQ) pour illustrer. En prod, la voix prendrait priority.
! ══════════════════════════════════════════════════════════
!  Étape 1 — class-maps : QUI est classé ?
! ══════════════════════════════════════════════════════════
class-map match-all CM-VOIX
 match dscp ef                    ! EF = DSCP 46 — voix IP

class-map match-all CM-VIDEO
 match dscp af41                  ! AF41 = DSCP 34 — vidéo

class-map match-all CM-APPS
 match dscp af31                  ! AF31 = DSCP 26 — applis métier

! class-default récupère tout le reste (backup FTP, BE…)

! ══════════════════════════════════════════════════════════
!  Étape 2 — policy-map : QUOI faire ?
! ══════════════════════════════════════════════════════════
policy-map PM-WAN-CBWFQ
 class CM-VOIX
  bandwidth 128                ! 128 kbps garantis — 25% de 512k

 class CM-VIDEO
  bandwidth 128                ! 128 kbps garantis — 25%

 class CM-APPS
  bandwidth 128                ! 128 kbps garantis — 25%
!  Total explicite = 384 kbps = 75% de 512k ← limite exacte
!  class-default reçoit les 128k restants (25%) — backup FTP ici

 class class-default
  fair-queue                    ! équité entre flux non classifiés dans ce bucket

! ══════════════════════════════════════════════════════════
!  Étape 3 — service-policy : OÙ appliquer ?
! ══════════════════════════════════════════════════════════
interface Serial0/0/0
 bandwidth 512                  ! IOS doit connaître la bw logique (kbps)
 service-policy output PM-WAN-CBWFQ
Voix EF
128k
25%
Vidéo AF41
128k
25%
Apps AF31
128k
25%
Best Effort
128k
25%

Total alloué explicitement : 384 kbps = 75%. class-default reçoit les 128k restants. Backup FTP = confiné dans class-default — il ne peut plus voler la bande des autres.

⚠️ IOS réserve 25% pour le control plane (OSPF, BGP, ARP, management SSH…). Si la somme de tous les bandwidth dans une policy-map dépasse 75% de la bande passante de l'interface, IOS refuse l'application du service-policy.
! ── Scénario : on essaie d'allouer trop ──
policy-map PM-TOO-MUCH
 class CM-VOIX
  bandwidth 200                ! 200 kbps
 class CM-VIDEO
  bandwidth 200                ! 200 kbps
 class CM-APPS
  bandwidth 100                ! 100 kbps → total = 500 kbps = 97.6% de 512k ❌

interface Serial0/0/0
 bandwidth 512
 service-policy output PM-TOO-MUCH

! ── Réponse IOS ──
%CBWFQ: bandwidth sum 500000 bps exceeds 75% of interface bandwidth 512000 bps (384000 bps)
%Service policy PM-TOO-MUCH not applied on interface Serial0/0/0 - insufficient bandwidth

! ── Fix : descendre à 384 kbps max ──
!    Voix=128k + Video=128k + Apps=128k = 384k = 75% ← OK
!    Ou utiliser "bandwidth percent" pour être auto-adaptatif :
 bandwidth percent 25           ! → voir section ci-dessous
⚠️ Erreur classique — mélange des unités Cisco :

La commande bandwidth dans une policy-map est en kbps.
bandwidth 128 = 128 kbps  ✓
bandwidth 128000 = 128 000 kbps = 128 Mbps ← absurde sur un lien 512k !

À ne pas confondre avec shape average et police rate qui eux sont en bps :
shape average 512000 = 512 000 bps = 512 kbps  ✓
police rate 1000000 bps = 1 000 000 bps = 1 Mbps  ✓
CommandeUnitéExempleRésultat
bandwidth interfacekbpsbandwidth 512512 kbps — référence logique du lien
bandwidth policy-mapkbpsbandwidth 128128 kbps garanti minimum
priority policy-mapkbpspriority 128128 kbps LLQ strict
shape averagebpsshape average 512000512 kbps (512 000 bps)
police ratebpspolice rate 1000000 bps1 Mbps (1 000 000 bps)
Référence = la commande bandwidth configurée sur l'interface (en kbps).
Ni la vitesse physique du câble, ni le CIR du shaping — uniquement la valeur logique déclarée.

Exemple :
interface Serial0/0/0bandwidth 512  ← déclare 512 kbps comme référence
bandwidth percent 25 dans la policy-map = 25% × 512 = 128 kbps

Si la commande bandwidth n'est pas configurée sur l'interface, IOS utilise la vitesse physique du port (clock rate). Sur un lien WAN contrat 512 kbps sur un port physique 2 Mbps, ne pas mettre bandwidth 512 = mauvais calcul de référence.
! ── Scénario : contrat WAN upgradé de 512k à 1 Mbps ──────────

!  Avec valeur absolue — tu dois tout recalculer manuellement :
interface Serial0/0/0
 bandwidth 1024                 ! nouveau contrat 1 Mbps

policy-map PM-WAN
 class CM-VOIX
  bandwidth 256               ! ← à changer manuellement (était 128)
 class CM-VIDEO
  bandwidth 256               ! ← à changer manuellement
 class CM-APPS
  bandwidth 256               ! ← à changer manuellement
!  3 lignes à modifier → risque d'oubli, erreur humaine

!  Avec percent — 1 seule ligne à changer :
interface Serial0/0/0
 bandwidth 1024                 ! ← seul changement nécessaire

policy-map PM-WAN
 class CM-VOIX
  bandwidth percent 25         ! 512k → 128k, 1024k → 256k : auto-recalcul
 class CM-VIDEO
  bandwidth percent 25         ! idem
 class CM-APPS
  bandwidth percent 25         ! idem — total = 75% ← respecte la règle
!  La policy-map ne change pas — seule la bandwidth interface suffit
CBWFQ est un ordonnanceur (scheduler), pas un policer.

En cas de congestion : chaque classe est servie au minimum garanti. Les classes qui "veulent" plus mais sont au plafond de leur quota attendent.

Sans congestion : IOS distribue la bande passante libre proportionnellement aux classes qui en veulent plus. Si la voix n'envoie que 50 kbps alors qu'elle a 128k garanti, les 78k libres sont redistribués aux autres classes (apps, backup…).

Conséquence : bandwidth 128 ne bloque pas la classe à 128k. Contrairement à police rate 128000 bps … exceed-action drop qui lui, plafonne à 128k.
CritèreWFQCBWFQ
ConfigAucune — automatiqueMQC : class-map + policy-map + service-policy
Définition des classesAutomatique par flux (5-tuple)Manuelle — tu choisis les critères
Bande passante garantieNon — proportionnelle IP PrecOui — valeur absolue (kbps) ou percent
Peut marquer (set dscp)NonOui — avec set dscp dans la class action
Nombre de queues256 max (4096 configurable)Illimité — une queue par class-map
Limite 75%Non applicableOui — 75% max de la bw interface
ScalabilitéFaible (<50 users)Excellente — grandes entreprises, WAN MPLS
Utilisation typiqueSerial <2Mbps (legacy) ou class-defaultStandard actuel sur WAN/LAN — toujours avec LLQ pour voix
Pas comme le policing/shaping. CBWFQ maintient une queue (buffer FIFO) par classe, pas un token bucket.

Le scheduler WFQ interne calcule un numéro de séquence de fin pour chaque paquet : SEQ = seq_précédent + (taille_paquet / bandwidth_classe). Le paquet avec le SEQ le plus bas est servi en premier — ce qui garantit proportionnellement la bande passante à chaque classe.

En pratique : pense à CBWFQ comme plusieurs files d'attente avec un gardien qui donne le tour à chaque file proportionnellement à son quota. Pas de tokens, pas de burst accumulé — c'est du scheduling pur.
⚠️ Confusion courante : CBWFQ classe et ordonnance — il ne modifie pas les headers IP.
Un paquet qui entre dans CM-VOIX avec DSCP EF ressort avec DSCP EF inchangé.
Si tu veux marquer, tu dois ajouter explicitement set dscp ef ou set ip precedence 5 dans la class action.

Les 3 actions possibles dans une classe CBWFQ :
bandwidth — ordonnancer (scheduling)
set — marquer (optionnel)
queue-limit — limiter la taille du buffer de la classe (optionnel)
⚠️ CBWFQ ne protège pas totalement la voix. bandwidth 128 garantit 128 kbps minimum mais la voix peut quand même attendre dans sa queue derrière d'autres paquets voix ou données de la même classe. Pour zéro latence sur la voix → il faut LLQ (priority au lieu de bandwidth).
LLQ = Low Latency Queuing. C'est CBWFQ augmenté d'une priority queue stricte.

Un seul mot-clé change tout : priority au lieu de bandwidth.
Mais priority 128 fait deux choses simultanément que beaucoup ignorent :
① Priority queue stricte — la classe sort AVANT toutes les autres, à chaque cycle du scheduler, sans passer par le calcul SEQ WFQ.
② Policer intégré à 128 kbps — si le trafic dépasse 128 kbps, l'excès est droppé immédiatement, pas mis en attente.

C'est la combinaison des deux qui protège la voix : zéro attente ET zéro possibilité de saturer le lien par accident.
CM-VOIX — priority 128 PRIORITY QUEUE policer 128k excès droppé CM-VIDEO — bandwidth 128 CM-APPS — bandwidth 128 class-default — fair-queue Scheduler LLQ ① priority queue vide ? NON → servir voix OUI → WFQ scheduler pour les autres classes SEQ uniquement sur CBWFQ bypass SEQ 512 kbps WAN out ⚠ Si priority sature 512k → starvation des autres Priority queue : court-circuite le WFQ — zéro calcul SEQ — zéro attente CBWFQ : traité par WFQ scheduler seulement quand la priority queue est vide
Mécanismebandwidth 128priority 128
Ordre de serviceTour WFQ par SEQ — attend les autresSort EN PREMIER, toujours, avant tout
Calcul SEQOui — poids dans le scheduler WFQNon — bypass total du scheduler WFQ
Si trafic < 128kBande libre redistribuée aux autresBande libre redistribuée aux autres
Si trafic = 128kGaranti — servi en priorité WFQGaranti — servi immédiatement
Si trafic > 128kMis en attente jusqu'à avoir son tourExcès DROPPÉ — policer intégré actif
! ── Ce que priority 128 fait réellement ──────────────────
 class CM-VOIX
  priority 128    ! équivaut EXACTEMENT à :
!                   ① file strictement prioritaire (sort avant toutes les autres)
!                   ② police rate 128 kbps — excès droppé, jamais bufferisé
!
! ── Scénario piège : 3 appels voix G.711 sur lien 512k ───
!    3 appels G.711 = 3 × 85 kbps = 255 kbps réels (codec + headers)
!    priority 128 → seulement 128 kbps passent, 127 kbps droppés → voix dégradée !
!
! ── Fix 1 : ajuster la valeur absolue
 class CM-VOIX
  priority 256          ! 256 kbps = 3 × 85k + marge ≈ correct pour 3 appels G.711
!
! ── Fix 2 : utiliser priority percent — s'adapte si le lien change
 class CM-VOIX
  priority percent 50   ! 50% de 512k = 256k → couvre 3 appels G.711
!
! ⚠  MAIS 50% pour la voix sur un lien 512k, c'est dangereux — voici pourquoi :
!
!    Budget lien 512k                                    512 kbps  (100%)
!    └─ priority voix  (3 appels G.711)                  256 kbps  ( 50%)
!    └─ control plane  (OSPF hellos, BGP keepalives…)    ~128 kbps ( 25%)  ← réservé
!    └─ reste pour données, vidéo, backup                ~128 kbps ( 25%)  ← quasi rien !
!
!    Règle empirique : priority ≤ 33% du lien
!    Au-delà, le risque de starvation des autres classes devient réel.
!
! ── Conclusion : 3 appels G.711 sur 512k, c'est trop
!    Passer à G.729 : 3 × 30k = 90k = 17.5% → budget sain, reste 57.5% pour données
 class CM-VOIX
  priority percent 18   ! 18% de 512k = ~92k → 3 appels G.729 avec marge
!
! ── priority percent — syntaxe et référence ──────────────
!    La référence est la commande 'bandwidth' de l'interface (pas la vitesse physique)
!
! ⚠  PIÈGE : bandwidth par défaut ≠ CIR sur Ethernet WAN
!
!    Interface Serial  → bandwidth par défaut = clockrate → souvent correct
!    Interface GigE    → bandwidth par défaut = 1 000 000 kbps (vitesse physique !!!)
!
!    Si tu oublies de déclarer la CIR sur une GigE :
!      priority percent 25 = 25% de 1 000 000k = 250 Mbps → le policer ne sert à rien !
!
!    Il faut donc déclarer manuellement la CIR réelle du lien WAN :
interface GigabitEthernet0/1
 bandwidth 512         ! déclare ta CIR à IOS — référence pour tous les calculs % QoS
!                        ! ne limite PAS le trafic — c'est uniquement un paramètre IOS
!                        ! le vrai shaping est fait par 'shape average' dans la policy
!
! ── Si le lien monte de 512k à 1M : changer bandwidth → tout s'adapte
interface GigabitEthernet0/1
 bandwidth 1000        ! lien upgradé à 1M — priority percent 25 = 250k automatiquement
!                        ! sans toucher à la policy-map — c'est l'avantage de percent
!
 class CM-VOIX
  priority percent 25   ! 25% = valeur raisonnable sur un lien dimensionné pour la voix
Ingress DSCP EF (voix) AF41 (vidéo) BE (backup) PRIORITY LANE — voix passe directement policer 128k excès droppé ↓ CM-VIDEO bw 128 class-default WFQ Scheduler SEQ — proportionnel Output 512 kbps WAN Voix : voie directe — zéro attente — bypass total du WFQ scheduler Vidéo/Backup : passent par le WFQ scheduler — servis quand la voix est satisfaite
Erreur la plus fréquente en prod : mettre priority 64 pour de la voix G.711 parce que "G.711 = 64 kbps". Faux — le codec seul c'est 64 kbps, mais les headers IP/UDP/RTP ajoutent 40 octets par paquet. Le débit réel par appel est nettement supérieur.
CodecDébit codecPayload (20ms)Headers IP/UDP/RTPOverheadDébit réel/appel
G.711 64 kbps 160 octets 40 octets 40/(160+40) = 20% ~85 kbps
G.729 8 kbps 20 octets 40 octets 40/(20+40) = 67% ~30 kbps
G.729 + cRTP 8 kbps 20 octets 4 octets (compressés) 4/(20+4) = 17% ~11 kbps
! ── Formule de dimensionnement ──────────────────────────
!   priority = nb_appels × débit_réel/appel × marge (1.10 à 1.20)
!
! Scénario A : 2 appels G.711 simultanés max
!   priority = 2 × 85 × 1.1 = 187 kbps → arrondir à 192
 class CM-VOIX
  priority 192          ! 2 appels G.711 avec marge 10%

! Scénario B : 10 appels G.729 simultanés max
!   priority = 10 × 30 × 1.1 = 330 kbps
 class CM-VOIX
  priority 330          ! 10 appels G.729 avec marge 10%

! Scénario C : lien 512k, 2 appels G.711
!   priority 192 = 37.5% du lien ← attention, limite recommandée 33%
!   Considérer G.729 ou réduire le nombre d'appels simultanés
!
! Ajouter signalisation SIP/H.323 : +10-20 kbps par trunk actif
 class CM-SIGNALISATION
  bandwidth 20          ! CBWFQ suffit — la signalisation tolère +latence
❌ Sans shape parent Ingress DSCP EF (voix) vidéo / backup LLQ software priority queue rarement actif ! paquets passent en direct TX Queue hardware FIFO vid V bck vid V voix et vidéo mélangées ! 512 kbps WAN — ordre FIFO → la voix attend derrière vidéo dans le FIFO hardware — LLQ ne peut rien faire vs ✅ Avec shape parent Ingress DSCP EF (voix) vidéo / backup Shape Queue shape average 512000 V vid V bck V vid toujours pleine → LLQ toujours actif LLQ scheduler actif en permanence — voix sort EN PREMIER TX Queue hardware (presque vide) V 512 kbps WAN — voix prioritaire → Shape Queue = sas logiciel → congestion permanente → LLQ toujours actif → voix toujours en tête
! ── Sans shape parent — LLQ rarement actif ────────────────
interface GigabitEthernet0/1
 bandwidth 512                      ! déclare la CIR à IOS
 service-policy output PM-LLQ-SEUL   ! LLQ actif seulement si TX queue pleine
!  Résultat : en trafic normal (interface GigE), les paquets filent dans le FIFO hardware
!  La TX queue ne se remplit jamais → LLQ ne s'active pas → voix n'est pas prioritaire
!
! ── Avec shape parent — configuration complète ───────────
!
!  ÉTAPE 1 — policy enfant : les vraies règles LLQ + CBWFQ
policy-map PM-CHILD-LLQ
 class CM-VOIX
  priority 128          ! LLQ — voix strictement prioritaire, policer 128k intégré
 class CM-VIDEO
  bandwidth 128          ! CBWFQ — vidéo garantie, servi quand voix satisfaite
 class CM-APPS
  bandwidth 128          ! CBWFQ — apps métier garanties
 class class-default
  fair-queue             ! WFQ pour le reste (backup, inconnu…)
!
!  ÉTAPE 2 — policy parent : shape + appel de la policy enfant
policy-map PM-PARENT
 class class-default
  shape average 512000  ! crée le sas logiciel à 512 kbps
!                          ! → la Shape Queue est toujours pleine → LLQ toujours actif
  service-policy PM-CHILD-LLQ  ! LLQ + CBWFQ tournent dans ce sas
!
!  ÉTAPE 3 — appliquer sur l'interface
interface GigabitEthernet0/1
 bandwidth 512                 ! déclare la CIR — référence pour les calculs %
 service-policy output PM-PARENT  ! ← toujours le PARENT sur l'interface, jamais l'enfant
!
!  Hiérarchie : PM-PARENT (shape 512k) → PM-CHILD-LLQ (priority + bandwidth)
!  Le shaping est traité en détail dans le chapitre QoS Shaping
IOS classique (< 12.4) : une seule classe priority par policy-map.
IOS-XE (15.x+) : plusieurs classes priority possibles — mais avec des niveaux différents.

priority level 1 = priorité absolue (voix)
priority level 2 = priorité haute (vidéo interactive) — servie après level 1

En pratique : garder une seule classe priority pour la voix EF. Mettre la vidéo en bandwidth CBWFQ. Deux niveaux de priority = complexité accrue, risque de starvation en cascade.
! ── Multi-level LLQ (IOS-XE 15.x+) ───────────────────────
policy-map PM-MULTI-LLQ
 class CM-VOIX
  priority level 1 128    ! level 1 = absolu — servie avant TOUT
 class CM-VIDEO-RT
  priority level 2 256    ! level 2 — servie après level 1, avant CBWFQ
 class CM-APPS
  bandwidth 128            ! CBWFQ classique
 class class-default
  fair-queue

! ⚠ Risque : si level 1 + level 2 saturent → starvation CBWFQ
!   Dimensionner level 1 + level 2 ≤ 50% du lien au total
⚠️ WRED ne s'applique pas à une priority queue.
WRED gère la congestion en droppant des paquets avant que la queue soit pleine (drop proactif). La priority queue LLQ a son propre mécanisme de drop (le policer intégré à 128 kbps). Configurer WRED sur une classe priority est ignoré ou refusé par IOS.

WRED s'applique uniquement sur les classes bandwidth (CBWFQ) et class-default.
ScénarioLienpriorityReste CBWFQRésultat
Bien dimensionné 512 kbps 128 (25%) 384 kbps pour vidéo+apps+backup OK — voix protégée, autres classes ont de la place
Priority trop haut 512 kbps 400 (78%) 112 kbps seulement Starvation — vidéo et apps manquent de bande passante
Priority trop bas 512 kbps 64 (12.5%) 448 kbps Drops voix — 3 appels G.711 = 255 kbps → 191 kbps droppés
Règle terrain Tout lien 20-30% max ≥ 70% pour le reste Jamais dépasser 33% — laisser de la marge pour les pics voix
! ── Vérifier les drops sur la priority queue ──────────────
show policy-map interface Serial0/0/0

! Extrait de sortie :
 Class-map: CM-VOIX (match-all)
   packets: 12450, bytes: 747000
   Output Queue: Conversation 265/1
   (pkts matched/bytes matched) 12450/747000
   (total drops) 0         ! ← 0 drops = priority bien dimensionné ✓
   (total drops) 847       ! ← drops > 0 = priority trop bas ! augmenter

! ── Réinitialiser les compteurs ───────────────────────────
clear counters Serial0/0/0

! ── Vérifier en temps réel ────────────────────────────────
show policy-map interface Serial0/0/0 | include drops|Class|packets
✅ Règles LLQ terrain ENARSI/CCIE :
priority = strict priority + policer intégré — l'excès est droppé, pas bufferisé
• Dimensionner : nb_appels × débit_réel_par_appel × 1.1 (marge 10%)
• G.711 = ~85 kbps/appel, G.729 = ~30 kbps/appel, G.729+cRTP = ~11 kbps/appel
• Ne jamais dépasser 33% du lien shapé en priority
• Toujours associer LLQ à un shape parent — sinon inefficace sur WAN
• WRED incompatible avec priority — ne pas configurer les deux sur la même classe
• drops LLQ > 0 = priority trop bas → augmenter la valeur
Site distant 🎤 IP Phones 📹 PC Teams 📦 Backup LAN 1G CE Router Shape 512k (parent) LLQ+CBWFQ (child) 512 kbps WAN service-policy output PE ISP MPLS core HQ — Siège CUCM Serveurs ■ Voix 128k (LLQ) ■ Vidéo 128k (CBWFQ) ■ Apps 128k (CBWFQ) ■ Backup ~128k (reste)
! ── Étape 1 : class-maps ──────────────────────────────────
class-map match-all CM-VOIX
 match dscp ef                  ! VoIP RTP — DSCP 46

class-map match-all CM-VIDEO
 match dscp af41                ! Teams, Webex vidéo — DSCP 34

class-map match-all CM-APPS
 match dscp af31                ! ERP, CRM — DSCP 26

! class-default matche tout ce qui reste (backup, web...)
! ── Étape 2 : child policy — queuing dans les 512 kbps ───
policy-map PM-WAN-CHILD

 class CM-VOIX
  priority 128                  ! LLQ — sort EN PREMIER — 128 kbps max

 class CM-VIDEO
  bandwidth 128                ! CBWFQ — 128 kbps garanti minimum

 class CM-APPS
  bandwidth 128                ! CBWFQ — 128 kbps garanti minimum

 class class-default
  fair-queue                    ! backup et reste — ce qui reste (~128k)
! ── Étape 3 : parent policy — shape total à 512 kbps ─────
policy-map PM-WAN-PARENT
 class class-default
  shape average 512000          ! plafonner tout le trafic à 512 kbps
  service-policy PM-WAN-CHILD   ! appliquer les priorités dans les 512k

! ── Étape 4 : application sur l'interface WAN ─────────────
interface Serial0/0/0            ! ou GigabitEthernet vers PE MPLS
 service-policy output PM-WAN-PARENT
Total alloué : 128k (LLQ) + 128k (vidéo) + 128k (apps) = 384k = 75% de 512k. IOS réserve les 25% restants (128k) pour le control plane + class-default.
Si tu essaies d'allouer plus de 75%, IOS retourne : % bandwidth sum exceeds available bandwidth.
R1# show policy-map interface Serial0/0/0 output
Serial0/0/0
Service-policy output: PM-WAN-PARENT
Class-map: class-default
shape average cir 512000, bc 64000, be 64000 ← shaping actif
target shape rate 512000
Service-policy: PM-WAN-CHILD
queue stats for all priority classes:
priority level 1
(total drops) 0 ← 0 drops LLQ = voix jamais droppée ✓
(bytes output) 4782340
Class-map: CM-VOIX (match-all)
1520 packets, 121600 bytes
30 second offered rate 124000 bps ← ~128k voix active
Match: dscp ef (46)
Priority: 128000 kbps, burst bytes 3200000
drops: 0 ← parfait — LLQ correctement dimensionné
Class-map: CM-VIDEO (match-all)
30 second offered rate 115000 bps ← dans les 128k garantis
bandwidth 128000 kbps
drops: 0
Class-map: class-default
30 second offered rate 95000 bps ← backup limité au reste disponible
drops: 1240 ← drops backup normaux — tail drop FIFO classe default
! Vue complète avec compteurs par classe
show policy-map interface Serial0/0/0 output

! Vue synthétique — toutes les interfaces
show policy-map interface

! Vérifier le shaping
show traffic-shape
show traffic-shape statistics

! Vérifier les class-maps
show class-map
show class-map CM-VOIX

! Reset des compteurs
clear counters Serial0/0/0
Ce que vous voyezSignificationAction
drops LLQ = 0Voix jamais droppée — LLQ bien dimensionnéRien
drops LLQ > 0Voix droppée — trafic EF dépasse la priority BWAugmenter priority ou vérifier marquage EF
drops class-default élevésNormal — backup droppé en prioritéNormal si voix/video OK
offered rate > bandwidth sur CBWFQClasse en congestion — utilise son minimum garantiNormal — c'est le but de CBWFQ

⚠️ 1 — LLQ sans shaping = inutile sur lien WAN

LLQ seul en egress sur une interface 1G vers un lien MPLS 512 kbps ne sert à rien. Le LLQ s'applique dans le buffer du routeur. Si le lien physique est 1G, le routeur ne bufferise presque jamais — tout passe directement sur le fil. La congestion se produit côté ISP, hors de portée du LLQ. Toujours coupler shape (parent) + LLQ (child). Le shaping crée artificiellement de la congestion dans le routeur pour que le LLQ ait quelque chose à gérer.

⚠️ 2 — bandwidth vs priority

bandwidth 128 = minimum garanti (kbps), pas de priorité. La voix peut encore attendre dans sa queue derrière d'autres paquets.
priority 128 = sort en PREMIER, toujours, ET plafond à 128 kbps. Pour la voix : toujours priority. Pour les données : bandwidth.

⚠️ 3 — Max 75% de bande passante allouable

IOS refuse si la somme de tous les bandwidth et priority dépasse 75% de la bande passante de l'interface (ou du parent shapé). Sur 512 kbps → max allouable = 384 kbps. Si tu mets 3 × 200k = 600k, IOS retourne une erreur à l'application du service-policy.

⚠️ 4 — Une seule classe priority par policy

IOS n'accepte qu'une seule commande priority par policy-map (une seule LLQ). Si tu veux plusieurs trafics en priorité (voix + signalisation), mets-les dans la même class-map avec match-any. Deux classes priority dans la même policy → IOS refuse.

⚠️ 5 — fair-queue dans class-default

Sans fair-queue dans class-default, la classe default utilise FIFO — les flux dans class-default se comportent comme avant (backup écrase tout dans ce bucket). Ajouter fair-queue dans class-default donne de l'équité entre les flux non classifiés sans configuration par flux.

⚠️ 6 — bandwidth percent vs valeur absolue

bandwidth dans une policy-map est en kbpsbandwidth 128 = 128 kbps. À ne pas confondre avec shape average 512000 (bps) ou police rate 1000000 bps (bps). Dans une child policy sous un parent shapé, bandwidth percent 25 se calcule sur la bande passante du parent shapé, pas de l'interface physique. Parent shapé à 512 kbps → bandwidth percent 25 dans la child = 128 kbps.

Cliquez sur une carte pour révéler la réponse.

Quelle est la différence entre CBWFQ et LLQ ?
CBWFQ utilise bandwidth — garantit un minimum mais la classe attend son tour de scheduler. LLQ utilise priority — la classe sort EN PREMIER, avant toutes les autres, à chaque cycle. LLQ = CBWFQ + priority queue stricte.
cliquer
Pourquoi LLQ seul ne suffit pas sur un lien WAN contractuel ?
LLQ agit dans le buffer du routeur. Sur une interface 1G vers un lien MPLS 512 kbps, le routeur ne bufferise pas — tout passe directement. Il faut shape (parent) pour créer de la congestion artificielle dans le routeur, puis LLQ (child) pour gérer les priorités dans cette congestion.
cliquer
Quel est le maximum de bande passante allouable en CBWFQ ?
75% de la bande passante de l'interface (ou du parent shapé). IOS réserve 25% pour le control plane. Sur 512 kbps → max = 384 kbps. Dépasser cette limite → IOS refuse l'application du service-policy.
cliquer
Combien de classes priority peut-on avoir par policy-map ?
Une seule. IOS n'accepte qu'une classe avec priority par policy-map. Pour mettre voix + signalisation en LLQ, créer une class-map match-any qui matche les deux DSCP.
cliquer
Quel est le défaut IOS pour le queuing sur une interface <2 Mbps ?
WFQ (Weighted Fair Queuing) — automatique, sans config. Sur les interfaces >2 Mbps, c'est FIFO. Sur les interfaces tunnel, c'est généralement FIFO aussi.
cliquer
Qu'est-ce que le TCP Global Sync ?
Quand le buffer FIFO est plein, tail drop frappe tous les flux TCP simultanément. Tous réduisent leur fenêtre en même temps → sous-utilisation du lien → tous repartent ensemble → buffer plein à nouveau. Oscillations permanentes. Solution : WRED (drop précoce et aléatoire).
cliquer
priority 128000 — que se passe-t-il si la voix dépasse 128 kbps ?
L'excès est droppé. priority fixe un plafond strict — c'est à la fois une priorité et un policer. Si le trafic voix réel est 150 kbps et priority = 128 kbps, 22 kbps de voix est droppé → dégradation sonore. Dimensionner priority au-dessus du débit voix estimé.
cliquer
Ordre des 4 étapes pour configurer LLQ + CBWFQ sur WAN
1. class-map (définir les classes par DSCP). 2. policy-map child (priority pour voix, bandwidth pour les autres). 3. policy-map parent (shape average + service-policy child). 4. service-policy output sur l'interface WAN.
cliquer