Architecture FIB + table d'adjacence, switching paths, load-balancing, punting et dCEF. Prérequis fondamental pour BFD, MPLS, PBR et QoS.
Chaque paquet interrompt le CPU via une interrupt. Le processeur consulte la RIB, résout l'ARP, construit l'en-tête L2, transmet. Non scalable au-delà de quelques Mpps.
Premier paquet d'un flow traité en process switching, résultat mis en cache. Paquets suivants commutés via ce cache. Mémoire limitée, invalidation difficile, problèmes de routage asymétrique.
La FIB est recalculée entièrement à chaque changement de RIB (pas de cache par flow). La table d'adjacence est recalculée à chaque changement ARP/L2. La commutation s'effectue dans le dataplane sans interruption CPU pour chaque paquet.
Résultat : déterministe, uniforme pour tous les paquets d'un préfixe, compatible avec ECMP, MPLS, BFD, PBR, QoS.
CEF est activé globalement par défaut sur pratiquement toute plateforme IOS/IOS-XE moderne. La commande ip cef est implicite. Sur les anciennes plateformes ou dans des cas rares, no ip cef peut l'avoir désactivé.
! Vérification rapide show ip cef summary ! Résultat attendu : IPv4 CEF is enabled and running
| Fonction | Dépendance CEF | Raison |
|---|---|---|
| BFD | Obligatoire | BFD utilise le dataplane CEF pour mesurer la latence réelle de forwarding |
| MPLS | Obligatoire | Label switching repose sur la FIB et l'LFIB CEF |
| PBR (Policy-Based Routing) | Obligatoire | CEF PBR = fast-path PBR ; sans CEF = process switching uniquement |
| IP SLA (certains modes) | Recommandé | Mesures précises nécessitent le dataplane |
| QoS (MQC) | Recommandé | CBWFQ/LLQ efficace sur le dataplane CEF |
| NetFlow v5/v9 | Recommandé | Capture dans le dataplane CEF |
| NAT (haute performance) | Recommandé | CEF-switching NAT évite le process switching |
Copie optimisée de la RIB, indexée pour un Longest Prefix Match (LPM) rapide. Contient : préfixe, next-hop IP, interface de sortie, pointeur vers l'entrée d'adjacence.
Recalculée à chaque modification de la RIB. Structure en trie ou Patricia tree.
show ip cef ! table FIB complète show ip cef 10.1.1.0/24 ! entrée spécifique show ip cef detail ! avec pointeurs adj
Contient pour chaque next-hop : l'en-tête L2 précalculé (MAC src, MAC dst, 802.1q tag si vlan). La réécriture L2 est appliquée sans calcul ARP au moment de la commutation.
Types d'entrées : glean (ARP requis), drop, punt, null, entrée normale.
show adjacency show adjacency detail show adjacency GigabitEthernet0/0
| Type | Description | Action dataplane |
|---|---|---|
| normal | Next-hop connu, ARP résolu | Réécriture L2 + forwarding |
| glean | Réseau directement connecté, ARP non encore résolu | Envoie une requête ARP, punt vers CPU pour ce paquet |
| punt | Paquet nécessitant une attention CPU | Remonte au process switching (voir onglet Punting) |
| drop | Destination injoignable ou filtrée | Paquet silencieusement jeté |
| null0 | Route de type Null (blackhole) | Paquet jeté avec ICMP Unreachable optionnel |
| discard | Filtrage explicit (ACL, etc.) | Paquet jeté |
| Critère | Process Switching | Fast Switching | CEF |
|---|---|---|---|
| Lookup par paquet | RIB (CPU) | Cache (1er : CPU) | FIB (dataplane) |
| Résolution L2 | ARP à chaque fois | Cache L2 | Adj table précalculée |
| Invalidation | N/A | Par flow, complexe | Sur changement topo (propre) |
| Load-balancing | Per-packet | Per-destination (flow) | Per-dest ou per-packet |
| Compatibilité BFD | ❌ | ❌ | ✅ |
| Compatibilité MPLS | ❌ | ❌ | ✅ |
| Activation | no ip cef + no ip route-cache | no ip cef | ip cef (défaut) |
show ip interface GigabitEthernet0/0 ! Chercher : IP fast switching is enabled IP CEF switching is enabled IP CEF switching turbo vector IP multicast fast switching is disabled
show ip interface <if> | include CEF.
Le hash est calculé sur l'adresse source et destination IP. Tous les paquets d'un même flux (même src/dst) empruntent le même chemin.
Avantages : Ordre des paquets préservé, compatible TCP, débogage plus facile.
Inconvénient : Distribution inégale si peu de flux distincts.
Chaque paquet est envoyé sur le prochain next-hop disponible (round-robin). Distribution parfaitement équilibrée en octets.
Inconvénient majeur : Paquets hors-ordre → dégradation TCP, incompatible avec la plupart des applications. À éviter.
! Per-destination (défaut, rien à faire) ip cef load-sharing algorithm original ! Universal (inclut ports src/dst dans le hash) ip cef load-sharing algorithm universal ! Tunnel ID-based (pour MPLS TE) ip cef load-sharing algorithm tunnel ! Vérification show ip cef load-sharing show ip cef 0.0.0.0/0 ! voir les next-hops ECMP
Si plusieurs routeurs utilisent le même algorithme avec les mêmes paramètres, le trafic peut se retrouver toujours sur le même lien à chaque saut (polarisation). La solution est de configurer des graines différentes par routeur.
! Algorithme universal avec graine fixe ip cef load-sharing algorithm universal 1234567 ! Ou laisser IOS choisir automatiquement (recommandé) ip cef load-sharing algorithm universal
show ip cef 10.0.0.0/8 ! Output exemple : 10.0.0.0/8, version 42, epoch 0 via 192.168.1.1, GigabitEthernet0/0, 0 dependencies traffic share 1 next hop 192.168.1.1, GigabitEthernet0/0 valid adjacency via 192.168.2.1, GigabitEthernet0/1, 0 dependencies traffic share 1 next hop 192.168.2.1, GigabitEthernet0/1 valid adjacency
| Cause | Description | Normal ? |
|---|---|---|
| Trafic destiné au routeur | SSH, Telnet, BGP, OSPF Hello, SNMP… | Normal |
| ARP incomplet (glean) | Premier paquet vers un voisin direct non encore dans le cache ARP | Normal |
| TTL = 1 | Traceroute, paquet expiré → ICMP Time Exceeded | Normal |
| Options IP | Record Route, Timestamp, Loose/Strict Source Routing | Normal |
| Fragments IP | Premier fragment (si non-hardware) | Normal |
| Tunnels non-CEF | GRE sans CEF activé sur tunnel interface | À corriger |
| Crypto (VPN) | Certains VPN en software encryption | Surveiller |
| ACL incohérente | ACL qui force le process switching | Problème |
! Statistiques CEF globales show ip cef switching statistics ! Drops CEF par type show cef drop ! Interfaces avec CEF désactivé (= punt total) show ip interface | include CEF|line ! Compteurs process switching (doit rester bas) show interface GigabitEthernet0/0 | include switching
Le CPU du routeur a une capacité de traitement limitée (process switching). Un punt excessif peut saturer le CPU, provoquer des drops de paquets de contrôle (BGP keepalives, OSPF Hello), déclencher des flaps de voisinage, et finalement une panne réseau.
! Surveiller le CPU show processes cpu sorted show processes cpu history ! Si le process "IP Input" consomme > 20% → punt excessif
FIB et adj table sur le Route Processor (RP) uniquement. Les line cards transfèrent les paquets au RP pour la commutation. Le bus interne est un goulot d'étranglement.
Plateformes : routeurs ISR (1 CPU, pas de line cards indépendantes).
Le RP distribue la FIB à chaque line card via un protocole interne. Chaque LC commute localement. Le RP n'est impliqué que pour les mises à jour de la FIB.
Débit : peut atteindre des centaines de Gbps sans saturer le RP.
! Sur les plateformes supportant dCEF ip cef distributed ! Vérification show ip cef summary ! Output sur plateforme dCEF : IPv4 CEF is enabled and running distributed CEF is enabled show ip cef distributed ! état par line card
Quand la RIB change (route ajoutée/retirée), le RP recalcule la FIB et distribue les mises à jour différentielles à chaque LC. Pendant ce court laps de temps, les LCs peuvent avoir des FIBs légèrement différentes.
Surveillance : show ip cef inconsistency détecte les incohérences entre la FIB du RP et celles des LCs.
show ip cef inconsistency show ip cef summary ! compter préfixes par LC
show ip cef ! Affiche toute la FIB show ip cef summary ! Résumé : nombre de préfixes, état CEF ! Output clé : IPv4 CEF is enabled and running VRF Default 14 prefixes (9/5 fwd/non-fwd) show cef state ! État détaillé avec flags de configuration
show ip cef 10.1.1.0/24 ! Output : 10.1.1.0/24, version 18, epoch 0 via 192.168.1.1, GigabitEthernet0/0, 0 dependencies traffic share 1 next hop 192.168.1.1, GigabitEthernet0/0 valid adjacency show ip cef 10.1.1.0/24 detail ! Avec pointeurs internes, compteurs, adj handle show ip cef exact-route 10.0.0.1 10.1.1.1 ! Simule le LPM pour un paquet src→dst
show adjacency ! Toutes les adjacences Protocol Interface Address IP Gi0/0 192.168.1.1(7) show adjacency detail ! Avec le L2 rewrite header (bytes hex) IP Gi0/0 192.168.1.1(7) 0 packets, 0 bytes epoch 0 sourced in sev-epoch 4 Encap length 14 AABBCC001122 001122AABBCC 0800 (dst MAC )(src MAC )(IPv4) show adjacency GigabitEthernet0/0 detail
! Quel chemin prendrait un paquet ? show ip cef exact-route 192.168.1.100 10.5.5.5 nexthop 172.16.0.1 GigabitEthernet0/0 ! Debug (ATTENTION : très verbeux en production) debug ip cef debug ip cef events undebug all
! 1. CEF actif globalement ? show ip cef summary → "enabled and running" ! 2. CEF actif sur l'interface ? show ip interface Gi0/0 | inc CEF → "CEF switching is enabled" ! 3. La FIB a une entrée pour la destination ? show ip cef 10.1.1.0/24 → "valid adjacency" ! 4. L'adjacence est résolue ? show adjacency detail → pas de "incomplete" ! 5. Pas d'inconsistances FIB ? show ip cef inconsistency → vide = OK
Par défaut, certaines interfaces logiques (tunnel GRE, virtual-template) n'ont pas CEF activé. BFD sur tunnel échoue silencieusement. Toujours vérifier show ip interface tunnel0 | include CEF et activer avec ip route-cache cef sur l'interface si nécessaire.
Si show adjacency detail montre incomplete, le routeur n'a pas encore résolu l'ARP du next-hop. Les paquets vers ce next-hop sont puntés. Vérifier la connectivité L2, le VLAN, et forcer une résolution avec ping <next-hop-ip>.
La commande no ip route-cache sur une interface force le process switching. Dans un lab CCIE, si quelqu'un a appliqué cette commande "pour tester", CEF est contourné sur cette interface et BFD ne fonctionnera pas. Vérifier et retirer no ip route-cache.
Dans une topologie ECMP multi-niveaux (spine-leaf, etc.), si tous les routeurs utilisent le même hash (algorithme "original" par défaut), un flow peut toujours choisir le même chemin physique à chaque niveau. Configurer des graines différentes avec ip cef load-sharing algorithm universal <seed>.
Sur les plateformes distribuées, après une convergence rapide, la FIB d'une line card peut temporairement être différente de celle du RP. show ip cef inconsistency le détecte. En production, cela peut causer des micro-boucles transitoires. Surveiller surtout après des maintenances.
Si ip load-sharing per-packet (ancienne commande) ou l'équivalent est configuré, les paquets TCP d'un même flux peuvent arriver hors-ordre, causant des retransmissions massives et des performances catastrophiques. Toujours utiliser per-destination (défaut) ou l'algorithme universal.
Si une interface est configurée dans un VRF mais que la route est dans le VRF global (ou vice versa), CEF ne trouvera pas l'adjacence. Toujours vérifier : show ip cef vrf <nom-vrf> pour la FIB du bon VRF, et show ip vrf interfaces pour confirmer l'appartenance des interfaces.
Quand le process switching explose, show processes cpu sorted montre "IP Input" consommant la majorité du CPU. Causes fréquentes : trafic de broadcast (storm), ACL forçant process switching, DDoS avec options IP, ou NTP/DNS flood. Isoler avec debug ip packet detail brièvement, puis CoPP pour protéger.
show ip cef summary → doit afficher "IPv4 CEF is enabled and running". Aussi show cef state pour les détails de configuration.show adjacency detail d'utile pour le debug ?ip cef load-sharing algorithm universal <graine-unique> avec une graine différente sur chaque routeur.show ip cef exact-route <src-ip> <dst-ip> — affiche le next-hop et l'interface de sortie que CEF sélectionnerait pour ce couple d'adresses.no ip route-cache cef sur l'interface. Cela force le fast switching (si activé) ou le process switching. À éviter absolument en production car cela casse BFD, MPLS, PBR et dégrade les performances.