
Chez Cisco, SPANNING-TREE est exécuté par VLAN. On appelle cela PER VLAN SPANNING-TREE ou PVST+. Le plus correspond à la deuxième version de PVST, qui utilise 802.1Q pour l’encapsulation de VLAN, contrairement à la première version qui utilisait ISL, protocole propriétaire Cisco.
Dans l’exemple suivant, Spanning-Tree est exécuté pour les VLAN 88 et 91 sur SW1 et SW3, mais uniquement pour le VLAN 91 sur SW2 :

Il faut bien faire la différence entre la topologie physique et la topologie logique : Un switch peut être le ROOT BRIDGE pour le VLAN 88 mais ne pas l’être pour le VLAN 91. Dans ce cas, les ports ne fonctionnent pas de la même façon en fonction des VLAN. Un port désigné dans le VLAN 88 peut être bloqué dans le VLAN 91.
Pour expliquer ce principe, regardez les topologies ci-dessous :

L’avantage d’avoir un ROOT BRIDGE différent par VLAN ?
Répartir la charge sur les liens pour chaque VLAN, et donc optimiser l’utilisation des ressources ; )
Voici le résultat de la commande “show spanning-tree vlan 88” qui permet d’afficher le fonctionnement de Spanning-Tree par VLAN :
VLAN0088
Spanning tree enabled protocol ieee
Root ID Priority 32856
Address 0006.2A09.4593
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32856 (priority 32768 sys-id-ext 88)
Address 0006.2A09.4593
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Desg Fwd 4 128.25 P2p
Gi0/2 Desg Fwd 4 128.26 P2p
Dans cette capture de SW1, vous pouvez voir deux blocs d’informations : Un bloc ROOT ID et un BLOC BRIDGE ID. Le BLOC ROOT ID contient les informations qui concernent le ROOT BRIDGE pour ce VLAN, en l'occurrence nous sommes ici sur le ROOT BRIDGE car il est indiqué : “This bridge is the root”.
On retrouve ensuite :
Hello Time 2 sec : correspond à l’envoi de Hello BPDU toutes les deux secondes.
Max Age 20 sec : correspond au délai de non réception de réponses aux HELLO BPDU envoyés à un switch avant de le considérer comme tombé.
Forward Delay 15 sec : correspond au délai de l’état listening et au délai de l’état learning, 15 secondes par état.
Dans la partie Bridge ID, on trouve (priority 32768 sys-id-ext 88), ce qui correspond à la priorité du switch, ici par défaut de 32768 et l’ID de VLAN, ce qui donne une priorité de 32856.
Enfin, pour les interfaces, on trouve différentes informations :
Role : Desg Correspond à un port désigné, qui émet et envoie des trames.
Sts : correspond à l’état du port, ici FWD pour FORWARDING.
Cost : correspond au coût, ici 4 car c’est un lien Gigabit Ethernet.
Prio : correspond a la priorité du port, ici 128 par défaut, modifiable de 0 à 240, en allant de 16 en 16, plus cette valeur est basse plus elle sera préférée.
Nbr : correspond au numéro de port, permet de départager deux interfaces en cas de priorité identique, le port avec le numéro le plus bas l’emporte.
Que se passe t’il en cas de changement de topologie, comment Spanning-tree va réagir ?
Si un changement de topologie se produit, par exemple un port tombe, le switch qui détecte ce changement va envoyer un TCN BPDU ou TOPOLOGY CHANGE NOTIFICATION BPDU au ROOT BRIDGE qui va ensuite envoyer des TC BPDU aux autres switches.
Quand un switch non root reçoit un BPDU TC du ROOT BRIDGE, le délai d’expiration des entrées de la table MAC passe de 300 secondes à 15 secondes, ce qui permet d’épurer plus rapidement les anciennes adresses MAC.
Le TC est propagé pendant deux fois le temps de FORWARD DELAY (15 secondes), soit 30 secondes pour garantir que tous les switches réagissent.
Voici un exemple de configuration du protocole PVST+ :

S1 sera le ROOT BRIDGE du VLAN 10, S2 sera le ROOT BRIDGE du VLAN 20 et S3 sera le ROOT BRIDGE du VLAN 30. Il faut avant de configurer le protocole Spanning-Tree pour chaque VLAN, créer les VLAN et configurer les liens entre les switches en TRUNK 802.1Q :
S1(config)#vlan 10 S1(config-vlan)#name vlan10 S1(config)#vlan 20 S1(config-vlan)#name vlan20 S1(config)#vlan 30 S1(config-vlan)#name vlan30 S1(config)#interface range gig 0/1-2 S1(config-if-range)#switchport mode trunk S2(config)#vlan 10 S2(config-vlan)#name vlan10 S2(config)#vlan 20 S2(config-vlan)#name vlan20 S2(config)#vlan 30 S2(config-vlan)#name vlan30 S2(config)#interface range gig 0/1-2 S2(config-if-range)#switchport mode trunk S3(config)#vlan 10 S3(config-vlan)#name vlan10 S3(config)#vlan 20 S3(config-vlan)#name vlan20 S3(config)#vlan 30 S3(config-vlan)#name vlan30 S3(config)#interface range gig 0/1-2 S3(config-if-range)#switchport mode trunk
Ensuite, il existe deux possibilités pour configurer un ROOT BRIDGE :
La commande priority, qui fonctionne à partir de 0 jusqu’à 61440, permet de définir le ROOT BRIDGE en jouant directement sur la valeur de priorité, la plus basse étant préférée.
La commande root primary, qui permet de définir le ROOT BRIDGE en laissant Spanning-Tree calculer une valeur plus basse automatiquement.
On peut également ajouter un “BACKUP ROOT BRIDGE”, qui deviendra ROOT BRIDGE en cas de panne du ROOT BRIDGE actuel, il faut pour cela :
Soit utiliser la commande priority pour configurer une priorité plus faible sur le BACKUP ROOT BRIDGE que la priorité par défaut (32768) mais supérieure à celle du ROOT BRIDGE
Soit utiliser la commande root secondary, qui va se charger de ce calcul.
Configuration du Switch S1 avec la commande priority :
S1(config)#spanning-tree vlan 10 priority 0
Même chose sur S2 pour le VLAN 20 :
S2(config)#spanning-tree vlan 20 priority 0
Le switch S3 est configuré avec la commande root primary :
S3(config)#spanning-tree vlan 30 root primary
La vérification se fait grâce à la commande “show spanning-tree vlan X” ou “X” représente le numéro de VLAN.
S1 est bien le ROOT BRIDGE pour le VLAN 10 :
S1#show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 10
Address 0001.9748.510C
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
S2 est bien le ROOT BRIDGE pour le VLAN 20 :
S2#show spanning-tree vlan 20
VLAN0020
Spanning tree enabled protocol ieee
Root ID Priority 20
Address 0030.F2C4.1E2C
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
S3 est bien le ROOT BRIDGE pour le VLAN 30 :
S3#show spanning-tree vlan 30
VLAN0030
Spanning tree enabled protocol ieee
Root ID Priority 24606
Address 00D0.BCCA.D83A
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
S1 va maintenant être configuré en tant que BACKUP ROOT BRIDGE pour le VLAN 20 et le VLAN 30 :
S1(config)#spanning-tree vlan 20 priority 4096 S1(config)#spanning-tree vlan 30 root secondary
Si S2 tombe, S1 devient ROOT BRIDGE pour le VLAN 20 :
S1#show spanning-tree vlan 20
VLAN0020
Spanning tree enabled protocol ieee
Root ID Priority 4116
Address 0001.9748.510C
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Même scénario si S3 tombe :
S1#show spanning-tree vlan 30
VLAN0020
Spanning tree enabled protocol ieee
Root ID Priority 28702
Address 0001.9748.510C
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
On peut également modifier le coût d’un port. Regardons cela ensemble.

S4 et S5 sont connectés par deux liens, sur les ports GigabitEthernet 0/1 et 0/2. Le port GigabitEthernet 0/2 de S4 est bloqué pour le VLAN 1 :
S4#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 0006.2A08.9854
Cost 4
Port 25 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 0010.1131.8457
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Root Fwd 4 128.25 P2p
Gi0/2 Altn BLK 4 128.26 P2p
on modifie la priorité du port pour le VLAN 1 sur les deux switches :
S4(config)#int gig 0/2 S4(config-if)#spanning-tree vlan 1 port-priority 0 S5(config)#int gig 0/2 S5(config-if)#spanning-tree vlan 1 port-priority 0
c’est désormais le port GigabitEthernet 0/2 qui est actif :
S4#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 0006.2A08.9854
Cost 4
Port 26 (GigabitEthernet0/2)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 0010.1131.8457
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Altn BLK 4 128.25 P2p
Gi0/2 Root FWD 4 0.26 P2p
Attention, ce changement n’affecte que le VLAN 1, VLAN pour lequel la priorité du port a été modifiée, si on observe le fonctionnement de Spanning-Tree pour le VLAN 2, c’est différent :
S4#show spanning-tree vlan 2
VLAN0002
Spanning tree enabled protocol ieee
Root ID Priority 32770
Address 0006.2A08.9854
Cost 4
Port 25 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32770 (priority 32768 sys-id-ext 2)
Address 0010.1131.8457
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Root Fwd 4 128.25 P2p
Gi0/2 Altn BLK 4 128.26 P2p
Si on souhaite le faire pour plusieurs VLAN, il faut utiliser la commande suivante :
S4(config)#int gig 0/2 S4(config-if)#spanning-tree vlan 1-2 port-priority 0 S5(config)#int gig 0/2 S5(config-if)#spanning-tree vlan 1-2 port-priority 0
Cette fois, le port GigabitEthernet 0/2 dispose également d’une priorité plus basse que le port GigabitEthernet 0/1 pour le VLAN 2 :
S4#show spanning-tree vlan 2
VLAN0002
Spanning tree enabled protocol ieee
Root ID Priority 32770
Address 0006.2A08.9854
Cost 4
Port 26 (GigabitEthernet0/2)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32770 (priority 32768 sys-id-ext 2)
Address 0010.1131.8457
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Altn BLK 4 128.25 P2p
Gi0/2 Root FWD 4 0.26 P2p
Il y a également un autre point important à évoquer : la possibilité pour un administrateur de définir lui-même le chemin vers le ROOT BRIDGE :

Voici comment le faire :
S3#show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 10
Address 0001.9748.510C
Cost 4
Port 26 (GigabitEthernet0/2)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 00D0.BCCA.D83A
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Altn BLK 4 128.25 P2p
Gi0/2 Root FWD 4 128.26 P2p
Si l’administrateur, pour une raison X ou Y, décide que le chemin pour atteindre le ROOT BRIDGE passe par S2 pour le VLAN 10, il faudra configurer les switches comme ceci :
S3(config)#int gig 0/1 S3(config-if)#spanning-tree vlan 10 cost 1 S2(config)#int range gig 0/1-2 S2(config-if-range)#spanning-tree vlan 10 cost 1 S1(config)#int gig 0/1 S1(config-if)#spanning-tree vlan 10 cost 1
Avec cette modification, le coût du chemin en passant par S2 pour atteindre le ROOT BRIDGE du vlan 10 (S1) devient 2, donc inférieur à 4, valeur correspondant par défaut au coût d’un lien Gigabit Ethernet par défaut :
S3#show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 10
Address 0001.9748.510C
Cost 2
Port 25 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 00D0.BCCA.D83A
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Root FWD 1 128.25 P2p
Gi0/2 Altn BLK 4 128.26 P2p
Notez encore une fois que cette modification n’affecte que le VLAN 10, le VLAN 20 n’est pas concerné par cette configuration, le coût pour atteindre le ROOT BRIDGE du VLAN 20 (S2) reste de 4 :
S3#show spanning-tree vlan 20
VLAN0020
Spanning tree enabled protocol ieee
Root ID Priority 20
Address 0030.F2C4.1E2C
Cost 4
Port 25 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32788 (priority 32768 sys-id-ext 20)
Address 00D0.BCCA.D83A
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 20
Interface Role Sts Cost Prio.Nbr Type
Gi0/1 Root FWD 4 128.25 P2p
Gi0/2 Altn BLK 4 128.26 P2p
L’IEEE a défini ensuite le Rapid Spanning-Tree, norme 802.1W, qui apporte des améliorations majeures au protocole Spanning-Tree classique, notamment une réduction drastique du temps de convergence. En environnement Cisco, on parle de RPVST+. Première différence, les états :

L’état LISTENING n’existe plus en RAPID SPANNING-TREE, on retrouve donc trois états en RAPID SPANNING-TREE : DISCARDING, LEARNING, FORWARDING.
Le principe d’élection du ROOT BRIDGE ne change pas, c’est toujours la priorité la plus basse qui l’emporte, ou l’adresse MAC la plus basse si la priorité n’a pas été modifiée.
La force du Rapid Spanning-Tree réside dans l’utilisation d’un mécanisme de négociation qui ne fonctionne pas du tout de la même façon qu’en Spanning-Tree classique, en effet, un mécanisme de “proposal / agreement” est utilisé entre les switches pour établir un nouveau chemin sans attendre l’expiration des timers Spanning-Tree classiques (Max Age 20 secondes + Listening 15 secondes + Learning 15 secondes).
Si le vlan natif est modifié sur les liens TRUNK, il est important que le VLAN natif soit identique à chaque extrémité des liens trunk, car le vlan natif va servir de canal de compatibilité entre les BPDU PVST+ et les BPDU RPVST+. La capture suivante indique qu’une trame Spanning-Tree est de type RAPID Spanning-Tree :

Voyons maintenant comment fonctionne le mécanisme “proposal / agreement”.

Comment en PVST+, RPVST+ commence par élire le ROOT BRIDGE, en se basant sur les critères habituels (Priorité la plus basse ou adresse mac la plus basse si priorité identique sur tous les switches). Une fois le ROOT BRIDGE élu, il va envoyer un ‘BIT Proposal’ sur tous ses ports.

Un switch NON ROOT reçoit un BPDU qui contient le BIT PROPOSAL sur son port ROOT, puis il bloque tous ses autres ports (sauf les ports connectés aux terminaux, nommés ports EDGE) afin d’éviter toute boucle. Il accepte enfin le PROPOSAL en envoyant un bit AGREEMENT vers le ROOT BRIDGE ou le switch en amont s’il n’est pas directement connecté au ROOT BRIDGE.
Le switch en amont qui reçoit le BPDU AGREEMENT passe le port sur lequel il l’a reçu à l’état FORWARDING, sans attendre les délais LISTENING / LEARNING utilisés en PVST+ basé sur la norme 802.1D. Le processus se répète en cascade sur tous les switches jusqu’à synchronisation complète. L’avantage ? une synchronisation qui passe d’environ 50 secondes à environ… 6 secondes !
En PVST+, basé sur 802.1D, si un switch détectait un changement de topologie, il envoyait une notification au ROOT BRIDGE en unicast et le ROOT BRIDGE informait les autres switches en MULTICAST à l’adresse 01:00:0C:CC:CC:CD (adresse MAC utilisée par Cisco au lieu de l’adresse MAC 01:80:C2:00:00:00 utilisée par 802.1D).
En RPVST+, basé sur 802.1W, si un switch détecte un changement de topologie, il peut désormais avertir tous les autres switches en MULTICAST à l’adresse 01:00:0C:CC:CC:CD.

Pour activer RAPID SPANNING-TREE, rien de plus simple :
S1(config)#spanning-tree mode rapid-pvst
On peut également optimiser encore le protocole Spanning-Tree, par exemple, il est possible de rendre un port d’accès, qui accueille par exemple un équipement terminal (PC, imprimante…) immédiatement opérationnel, avec la commande “spanning-tree portfast”.
Il est important d’utiliser spanning-tree portfast avec précaution, car le port va passer directement à l’état Forwarding, et une mauvaise utilisation pourrait causer une boucle, l’IOS va de plus émettre un warning sur cette utilisation :
S1(config-if)#spanning-tree portfast %Warning : portfast should only be enabled on ports connected to a single host. Connecting hubs, concentrators, switches, bridges, etc… to this interface when protfast is enabled, can cause temporary bridging loops. Use with CAUTION %Portfast has been configured on Ethernet0/0 but will only have effect when the interface is in non-trunking mode.
Pour éviter tout problème, on peut activer BPDU GUARD, qui va désactiver le port si un BPDU arrive sur un port configuré avec PORTFAST :
S1(config-if)#spanning-tree bpduguard enable
On peut également ensuite activer ERRDISABLE RECOVERY qui va, en cas de port à l’état d’erreur suite à une détection de BPDU par BPDU GUARD, essayer de réactiver le port automatiquement toutes les 30 secondes si ce dernier ne se trouve plus en situation d’erreur. Cette configuration permet d’éviter à l’administrateur de désactiver le port administrativement, puis de le réactiver :
S1(config)#errdisable recovery cause bpduguard S1(config)#errdisable recovery interval 30
Si on connecte un switch qui émet un BPDU sur ce port, le résultat est immédiat :
*Oct 30 12:07:02.162: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU from bridge aabb.cc00.0200 on port Et0/0 with BPDU Guard enabled. Disabling port. S1# *Oct 30 12:07:02.162: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state S1# *Oct 30 12:07:03.163: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down S1# *Oct 30 12:07:04.162: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
Au bout de quelques instants, le switch essaye de réactiver le port, si ce dernier reçoit toujours des BPDU, il reste en erreur :
*Oct 30 12:07:32.162: %PM-4-ERR_RECOVER: Attempting to recover from bpduguard err-disable state on Et0/0 *Oct 30 12:07:32.166: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU from bridge aabb.cc00.0200 on port Et0/0 with BPDU Guard enabled. Disabling port. S1# *Oct 30 12:07:32.166: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state
Une fois que le port n’est plus connecté à un autre switch, mais par exemple à un PC, il se réactive :
*Oct 30 12:09:02.142: %PM-4-ERR_RECOVER: Attempting to recover from bpduguard err-disable state on Et0/0 S1# *Oct 30 12:09:04.142: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to up S1# *Oct 30 12:09:05.142: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to up
Après BPDUGUARD, une autre fonctionnalité intéressante, ROOT GUARD, permet de protéger le ROOT BRIDGE contre un potentiel ROOT BRIDGE indésirable, soit par erreur ou en cas d’attaque :
S1(config)#int ethernet0/0 S1(config-if)#spanning-tree guard root
Si un switch avec une priorité plus basse se connecte sur ce port, il sera rejeté :
S1# *Oct 30 13:43:11.243: %SPANTREE-2-ROOTGUARD_BLOCK: Received a superior BPDU from bridge aabb.cc00.0200. Root guard blocking port Ethernet0/0 on VLAN0001
PVST+ (Per VLAN Spanning Tree Plus) exécute une instance Spanning-Tree par VLAN, permettant d’adapter la topologie logique à chaque VLAN indépendamment sur une même infrastructure physique.
Un switch peut être Root Bridge pour un VLAN et non pour un autre, ce qui permet de répartir intelligemment la charge réseau selon les flux (ex. VLAN VoIP sur un lien, VLAN utilisateur sur un autre).
En cas de changement de topologie, Spanning-Tree déclenche une notification de changement (TCN) pour forcer un nettoyage rapide des tables MAC et éviter les erreurs de routage.
Le protocole Rapid PVST+ (basé sur 802.1W) remplace les étapes lentes de PVST+ (802.1D) par un mécanisme de proposal/agreement, ce qui réduit drastiquement le temps de convergence du réseau en cas de panne.
Des fonctionnalités comme PortFast, BPDU Guard ou Root Guard permettent de sécuriser et accélérer le démarrage des ports d’accès, tout en protégeant l’architecture Spanning-Tree contre les erreurs ou les configurations malveillantes.
Vous savez maintenant comment configurer Spanning-Tree sur Cisco. Dans le prochain chapitre, découvrez comment fonctionne le protocole HSRP. C'est parti !