Le framework qui structure toute la QoS IOS : class-map pour classifier, policy-map pour agir, service-policy pour appliquer. Comprendre MQC, c'est comprendre comment tous les mécanismes QoS s'articulent.
| Objet | Rôle | Commande de création | Portée |
|---|---|---|---|
| class-map | Définir un ensemble de trafic à classifier | class-map [match-all|match-any] <nom> | Global — réutilisable dans plusieurs policy-maps |
| policy-map | Associer des actions à des classes | policy-map <nom> | Global — réutilisable sur plusieurs interfaces |
| service-policy | Attacher une policy-map à une interface | service-policy {input|output} <nom> | Par interface, par direction — une seule policy |
! ① Classifier la voix class-map match-all CM-VOIX match dscp ef ! ② Définir l'action policy-map PM-WAN class CM-VOIX priority 128 class class-default fair-queue ! ③ Appliquer sur l'interface interface GigabitEthernet0/1 service-policy output PM-WAN
| Avant MQC (CAR, CBWFQ natif) | Avec MQC |
|---|---|
| Commandes dispersées, syntaxes différentes par mécanisme | Syntaxe unique pour tous les mécanismes QoS |
| Pas de hiérarchie parent/child possible | Imbrication policy-map dans policy-map |
| Réutilisation impossible — config dupliquée par interface | class-map et policy-map réutilisables globalement |
| Difficile de lire/auditer la config QoS | Structure lisible, auditable, exportable |
| Commande match | Ce qui est examiné | Exemple | Remarque |
|---|---|---|---|
| match dscp | DSCP dans l'en-tête IP (6 bits) | match dscp ef af41 af21 | Valeurs nommées ou décimales (46, 34…). Multiple valeurs = OR interne |
| match ip dscp | Alias de match dscp (IPv4 seulement) | match ip dscp ef | Éviter : match dscp fonctionne aussi en IPv6 |
| match cos | CoS 802.1p (3 bits, trame Ethernet) | match cos 5 | Valide uniquement sur interfaces trunk/dot1q |
| match precedence | IP Precedence (3 bits, ancienne QoS) | match precedence 5 | Priorité=5 ≈ DSCP EF. Héritage pré-DiffServ |
| match access-group | ACL standard ou étendue | match access-group 101 | Très flexible mais coûteux CPU |
| match protocol | Application NBAR (L7) | match protocol httpmatch protocol rtp audio | Nécessite ip nbar protocol-discovery sur l'interface |
| match qos-group | QoS group interne (marquage inter-process) | match qos-group 1 | Marqué avec set qos-group dans une autre policy |
| match mpls experimental | EXP bits MPLS (3 bits) | match mpls experimental topmost 5 | Réseau MPLS PE/P uniquement |
| match class-map | Imbriquer une autre class-map | match class-map CM-VOIX | Permet des critères composites complexes |
| match not | Inverse d'un critère | match not dscp default | Classe "tout sauf BE" |
! Exemple class-map composite avec plusieurs critères class-map match-any CM-INTERACTIVE match dscp af21 af22 af23 ! Trafic interactif basse latence match cos 2 ! Marquage CoS sur trunk class-map match-all CM-VOIP-STRICT match dscp ef ! Doit avoir DSCP EF match cos 5 ! ET CoS 5 (redondant mais utile en audit) class-map match-any CM-CRITIQUE match dscp ef cs5 cs6 ! Voix OU routing OU vidéo match class-map CM-INTERACTIVE ! OU trafic interactif
class d'une policy-map, on ne peut pas combiner
shape + priority ou shape + bandwidth.
Ces actions s'excluent mutuellement. Pour avoir LLQ sous un shaper,
il faut impérativement une hiérarchie parent/child (voir onglet Hiérarchie).
| Combinaison | Valide ? | Solution si non |
|---|---|---|
| bandwidth + set | ✓ Oui | — |
| priority + set | ✓ Oui | — |
| police + set (remark) | ✓ Oui | — |
| bandwidth + random-detect | ✓ Oui | — |
| shape + priority | ✗ Non | Parent: shape / Child: priority |
| shape + bandwidth | ✗ Non | Parent: shape / Child: bandwidth |
| priority + bandwidth (même class) | ✗ Non | Classes séparées |
| shape + police | ✗ Non | Policing en ingress, shaping en egress |
shape et priority/bandwidth dans la même classe.
La solution : une policy-map parent qui contient le shaper, et une policy-map enfant
attachée au parent via service-policy. Le parent crée le sas (buffer logique) ; l'enfant gère
comment ce sas est vidé (LLQ, CBWFQ).
| Règle | Détail |
|---|---|
| Parent : une seule class | La policy parent ne doit avoir que class class-default contenant le shaper. Plusieurs classes dans le parent sont rarement nécessaires. |
| shape dans le parent | shape average <bps> dans class-default du parent. C'est lui qui crée le sas et active le scheduler enfant. |
| priority dans l'enfant uniquement | IOS rejette priority dans le parent si pas de shaper. Le scheduler LLQ n'a de sens que sur un sas. |
| Profondeur max 3 niveaux | IOS supporte parent → child → grandchild. En pratique, 2 niveaux suffisent pour 99% des scénarios. |
| bandwidth enfant ≤ shape parent | La somme des bandwidth des classes enfant ne peut pas dépasser le CIR du shaper parent. |
! Config complète — shape 512k WAN + LLQ voix + CBWFQ vidéo/apps class-map match-all CM-VOIX match dscp ef class-map match-all CM-VIDEO match dscp af41 class-map match-all CM-APPS match dscp af21 policy-map PM-CHILD class CM-VOIX priority 128 ! LLQ — garantie latence class CM-VIDEO bandwidth 128 ! CBWFQ — garantie débit class CM-APPS bandwidth 128 class class-default fair-queue queue-limit 32 policy-map PM-PARENT class class-default shape average 512000 ! CIR 512 kbps → crée le sas service-policy PM-CHILD ! Attache le scheduler interface GigabitEthernet0/1 bandwidth 512 ! Déclare CIR pour calculs % service-policy output PM-PARENT
| Action | Input | Output | Remarque |
|---|---|---|---|
| classify (class-map) | ✓ | ✓ | Les deux directions |
| set dscp / set cos | ✓ | ✓ | Marquage dans les deux sens |
| police | ✓ | ✓ | Policing ingress très courant (DoS, SLA) |
| shape | ✗ | ✓ | Impossible en input — on ne retarde pas ce qui entre |
| priority / bandwidth | ✗ | ✓ | Queuing uniquement en output |
| random-detect (WRED) | ✗ | ✓ | Output uniquement |
| fair-queue | ✗ | ✓ | Output uniquement |
| Contexte | Commande | Cas d'usage |
|---|---|---|
| Interface physique | interface Gi0/1 → service-policy output PM | Le plus courant — WAN, uplink |
| Sous-interface dot1q | interface Gi0/1.100 → service-policy output PM | QoS par VLAN |
| Tunnel GRE/IPSec | interface Tunnel0 → service-policy output PM | Nécessite qos pre-classify sur interface physique pour voir l'IP interne |
| Virtual-template (PPPoE) | virtual-template 1 → service-policy output PM | DSL, sessions PPPoE per-subscriber |
| Dialer (ISDN/async) | dialer → service-policy output PM | Liens à la demande |
no service-policy output PM-OLD puis appliquer la nouvelle.
Router# show policy-map interface GigabitEthernet0/1 GigabitEthernet0/1 Service-policy output: PM-PARENT Class-map: class-default (match-any) 5248 packets, 6234112 bytes 5 minute offered rate 1024000 bps, drop rate 0 bps Match: any Traffic Shaping Current Be_sent: 0/512000 (bits/max) Bc: 64000 bits, Be: 0 bits Tc: 125 ms ↑ Tc = 125ms, Bc = 64000 bits = 512kbps × 0.125s Queue Depth/Total Drops/No-buffer Drops: 0/0/0 Delayed Pkts: 0 Service-policy : PM-CHILD Class-map: CM-VOIX (match-all) 342 packets, 48656 bytes 5 minute offered rate 128000 bps, drop rate 0 bps Match: dscp ef (46) Queueing Strict Priority Output Queue: Conversation 24 Bandwidth 128 (kbps) Burst: 3200 (Bytes) (pkts matched/bytes matched) 342/48656 (total drops/bytes drops): 0/0 ← 0 drop : voix OK Class-map: CM-VIDEO (match-all) 1024 packets, 983040 bytes 5 minute offered rate 256000 bps, drop rate 18000 bps Match: dscp af41 (34) Queueing Output Queue: Conversation 25 Bandwidth 128 (kbps) Max Threshold 64 (packets) (pkts matched/bytes matched) 1024/983040 (depth/total drops/no-buffer drops) 64/89/89 ← file PLEINE ! ↑ bandwidth 128k insuffisant pour 256kbps offert Class-map: class-default (match-any) 3882 packets, 5202456 bytes 5 minute offered rate 512000 bps, drop rate 0 bps Match: any Weighted Fair Queueing Output Queue: Conversation 0
| Compteur | Signification | Valeur normale |
|---|---|---|
| drop rate Xbps | Débit de drops actuel en bps | 0 pour voix/vidéo critique |
| total drops / bytes drops | Drops cumulatifs depuis application policy | 0 idéal pour LLQ |
| depth | Profondeur actuelle de la file (paquets) | Proche de 0 si bien dimensionné |
| Queue Depth/Total Drops | Shaper : paquets en attente dans le sas | Varie — normal si > 0 |
| offered rate vs drop rate | Si drop rate > 0 : classe sous-dimensionnée | drop rate = 0 |
| Delayed Pkts | Paquets retardés par le shaper | Varie — attendu en shaping |
! Voir toutes les class-maps configurées show class-map ! Voir une policy-map spécifique show policy-map PM-PARENT ! Voir les policies appliquées sur toutes les interfaces show policy-map interface ! Réinitialiser les compteurs clear counters GigabitEthernet0/1 ! Debug (attention : très verbeux en prod) debug qos classify debug qos match
Même si tu ne la configures pas, class-default existe dans toute policy-map et capte tout le trafic non classifié. En output sur une interface GigE, sans configuration explicite, elle fait du FIFO — ce qui peut saturer la file et impacter toutes les autres classes. À toujours configurer explicitement avec fair-queue ou bandwidth remaining.
match-all (défaut) = AND : toutes les conditions doivent être vraies. Un paquet DSCP EF sans CoS 5 ne matche PAS class-map match-all CM-X / match dscp ef / match cos 5. Erreur fréquente : utiliser match-all quand on veut "DSCP EF OU CoS 5" — résultat : rien ne matche.
Si tu as un service-policy PM-CHILD dans le parent et que PM-CHILD contient priority, IOS exige que le parent ait un shape average dans la même classe. Sans shaper, LLQ n'a aucun sas sur lequel opérer et IOS retourne une erreur à l'application de la policy.
Sur un tunnel GRE ou IPSec, la policy appliquée sur l'interface physique voit l'en-tête externe (IP tunnel), pas l'IP interne. Pour classifier sur la VoIP interne, il faut qos pre-classify sur l'interface tunnel. Sinon tout le trafic tombe dans class-default et la voix n'est pas priorisée.
match protocol http ou match protocol rtp ne fonctionnent pas si ip nbar protocol-discovery n'est pas activé sur l'interface. IOS accepte la config sans erreur — mais au runtime, rien ne matche. Toujours vérifier avec show ip nbar protocol-discovery interface.
IOS n'accepte qu'une seule policy-map par direction sur une interface. Si tu appliques une deuxième policy sans retirer la première, IOS refuse silencieusement ou retourne une erreur. En lab : toujours no service-policy output PM-OLD avant de reconfigurer.
bandwidth 256 dans une class garantit 256 kbps minimum quand la file est saturée. Mais si les autres classes sont vides, cette classe peut utiliser toute la bande passante disponible. Ce n'est pas un limiteur. Pour limiter : utiliser police.
Si ton shaper parent est à 512 kbps et que tu configures priority 256 + bandwidth 256 + bandwidth 256 dans l'enfant, IOS rejette la config : 768 kbps > 512 kbps. Règle : la somme de toutes les allocations explicites dans le child doit être ≤ 75% du CIR parent (les 25% restants restent pour class-default).
On te donne un flux à classifier. Sélectionne tous les critères match corrects pour construire la class-map. Plusieurs réponses peuvent être correctes.
On te montre un paquet avec ses attributs et deux class-maps. Clique sur la class-map que le paquet va matcher (ou "Aucune").
On te donne un scénario réseau. Sélectionne dans le bon ordre les blocs de configuration pour construire la policy-map correcte.
On te montre une sortie de show policy-map interface. Identifie le problème.
Clique sur une carte pour révéler la réponse.
match-all et match-any ?show policy-map interface <nom> — regarder le champ "packets matched" et "bytes matched" de la classe. Si = 0 longtemps après le trafic, la classification est fausse.shape et priority dans la même classe ?shape average dans la policy parent (class-default), et priority dans la policy enfant attachée via service-policy.bandwidth 256 dans une classe — ça plafonne le trafic à 256 kbps ?bandwidth garantit un minimum de 256 kbps quand la file est congestionnée. Si les autres classes sont vides, la classe peut utiliser plus. Pour limiter : utiliser police.ip nbar protocol-discovery n'est pas configuré sur l'interface et qu'on utilise match protocol http ?ip nbar protocol-discovery sur l'interface avant d'utiliser NBAR.service-policy output différentes sur la même interface ?no service-policy output PM-OLD puis appliquer la nouvelle.match protocol rtp fonctionne ?ip nbar protocol-discovery sous l'interface. Vérifie avec show ip nbar protocol-discovery interface Gi0/1.qos pre-classify sur un tunnel ?qos pre-classify, la policy sur l'interface physique voit l'en-tête IP externe du tunnel, pas l'IP interne. Les class-maps basées sur le DSCP de l'IP interne ne matchent rien. qos pre-classify permet de classifier avant encapsulation.bandwidth ?!================================================ ! 1. CLASS-MAP !================================================ class-map [match-all | match-any] NOM match dscp ef af41 af21 default match ip dscp 46 ! IPv4 uniquement match cos 5 match precedence 5 match access-group 101 match protocol http ! NBAR requis match protocol rtp audio match qos-group 1 match mpls experimental topmost 5 match class-map CM-AUTRE ! Imbrication match not dscp default ! Inversion !================================================ ! 2. POLICY-MAP — actions disponibles !================================================ policy-map PM-NOM class CM-NOM bandwidth 256 ! kbps — minimum garanti bandwidth percent 25 ! % du lien (ref: bandwidth interface) bandwidth remaining percent 30 ! % de la BW résiduelle priority 128 ! kbps — LLQ strict priority percent 25 priority level 1 ! Multi-level LLQ (level 1 = plus prioritaire) shape average 512000 ! bps — crée le sas shape peak 512000 ! bps — utilise Be (rafale) police 1000000 ! bps police rate 1000000 bps burst 10000 byte police rate percent 10 set dscp ef set cos 5 set qos-group 1 random-detect ! WRED par défaut (précédence) random-detect dscp-based ! WRED par DSCP queue-limit 64 packets fair-queue service-policy PM-CHILD ! Hiérarchie — child attaché ici !================================================ ! 3. SERVICE-POLICY !================================================ interface GigabitEthernet0/1 service-policy input PM-INGRESS service-policy output PM-EGRESS ip nbar protocol-discovery ! Requis pour match protocol qos pre-classify ! Requis sur tunnel pour voir IP interne bandwidth 512 ! Déclare CIR pour calculs % QoS !================================================ ! 4. VÉRIFICATION !================================================ show class-map show policy-map show policy-map PM-NOM show policy-map interface GigabitEthernet0/1 show ip nbar protocol-discovery interface Gi0/1 clear counters GigabitEthernet0/1