Le protocole Spanning Tree
1. Qu'est-ce que le protocole Spanning Tree ?
1.1 Les boucles de commutation (bridging loops)
Dans un réseau commuté (qui utilise des commutateurs), il peut arriver que plusieurs chemins redondants relient deux commutateurs.
Cette redondance est en général souhaitée pour :
- Assurer la tolérance aux pannes : si un lien tombe, un autre lien permet la continuité du trafic.
- Augmenter la capacité et l'efficacité du réseau : parfois, plusieurs chemins peuvent équilibrer le trafic.
Cependant, s'il n'y a pas de mécanisme de contrôle, la redondance en couche 2 (du modèle OSI) peut créer des boucles de commutation.
Une boucle se produit lorsque des trames circulent en continu entre des commutateurs sans jamais s'arrêter, saturant alors le réseau.
Voici un exemple typique de boucle :
Dans cette configuration, il existe plusieurs chemins entre COM_1, COM_2 et COM_3 (triangle), ce qui offre de la redondance.
Cependant, si on n'active pas STP, on va créer une bouche en couche 2.
Imaginons les étapes suivantes :
- PC1 envoie un broadcast : par exemple, une requête ARP pour connaître l'adresse MAC de PC2. Le broadcast est envoyé vers COM_1
- COM_1 diffuse le broadcast : à tous ses ports sauf celui d'origine. Donc vers COM_2 et vers COM_3.
- COM_3 reçoit le broadcast : provenant de COM_2, mais COM_3 reçoit aussi directement la trame de COM_1. COM_3 diffuse alors à son tour cette trame sur tous ses ports (vers COM_2, COM_1 et PC2), mais comme COM_2 et COM_1 l'ont déjà vue, cela créée une répétition inutile.
- Retour en boucle : COM_2 reçoit à nouveau le broadcast (provenant cette fois de COM_3) et le rediffuse encore vers COM_1, qui lui-même renverra vers COM_3, etc..
- Cette trame tourne en boucle : sur la liaison COM_1 <-> COM_2 <-> COM_3 <-> COM_1
- Petit à petit, comme la trame ARP se propage en continu : chaque switch la réplique à l'infini, créant un véritable orage broadcast (tempête de broadcast). La table MAC de chaque commutateur n'est jamais stabilisée (les adresses MAC sont sans cesse "réapprises" sur différents ports). Le trafic légitime, lui, (par exemple de PC1 vers PC2) est fortement perturbé (ou bloqué !), car la capacité du réseau est saturée.
- Saturation finale : les trames circulent en boucle sans jamais être filtrées. Les ressources des commutateurs (CPU, mémoire de la table MAC) sont très fortement sollicitées, et les liens physiques (ports) sont saturés par milliers voir millions de copies de la même trame. Le réseau devient totalement inutilisable !
Pour éviter cette situation, surtout lorsque vous utilisez des commutateurs qui ne disposent pas du protocole STP (et oui, ça existe encore !), une topologie est toute indiquée :
- la topologie en étoile.
1.2 Le rôle de STP
Le Spanning Tree Protocol (décrit initialement dans la norme IEEE 802.1D) a pour but de prévenir ces boucles de commutation.
Il agit en :
- Bloquant certains ports : sur les commutateurs afin de supprimer les boucles.
- Établissant un chemin unique : (arbre logique) qui connecte tous les commutateurs sans boucles redondantes.
Lorsque STP est activé, le réseau se comporte comme un arbre (d'où le nom « spanning tree ») :
- Les branches : sont les liaisons actives.
- Les ports bloqués : sont des « branches coupées » (pas de trafic).
Si un lien actif tombe, STP est capable de réactiver un lien bloqué pour rétablir la connectivité.
2. Le fonctionnement général de STP
2.1 Les BPDUs (Bridge Protocol Data Units)
Les commutateurs s'échangent régulièrement des BPDUs (Bridge Protocol Data Units) pour :
- Élire un commutateur racine (root bridge).
- Déterminer le rôle de chaque port sur chaque commutateur (root port, designated port, etc.).
- Bloquer ou activer les ports pour éviter les boucles.
Les BPDUs sont envoyés en multidiffusion (multicast) sur les adresses réservées au spanning tree.
Chaque commutateur compare les informations reçues pour décider de la structure logique du réseau.
2.2 L'élection du Root Bridge
Au démarrage du réseau, chaque commutateur se considère initialement comme candidat au rôle de root bridge et envoie ses BPDUs.
Le root bridge est finalement le commutateur ayant la plus faible valeur de priorité (bridge priority).
En cas d'égalité, on compare son adresse MAC (le plus petit MAC l'emporte).
Remarque : on peut configurer manuellement la priorité d'un commutateur pour le forcer à devenir root bridge. Souvent, on choisit un commutateur central et puissant (ou redondant) pour remplir ce rôle.
2.3 Les rôles de port (port roles)
Une fois le root bridge élu, chaque commutateur détermine :
- Root Port : le port qui mène le plus directement vers le root bridge (chemin avec le moindre coût STP).
- Designated Port : le port désigné pour être le chemin principal sur un segment. Le commutateur qui « gagne » la désignation est celui qui a le plus faible coût pour accéder au root bridge.
- Non-Designated Port : port qui n'est pas désigné et qui est placé en blocking state (bloqué) pour éviter la boucle.
2.4 Les états de port
Historiquement, en STP classique (IEEE 802.1D), un port peut se trouver dans l'un des cinq états suivants :
- Disabled : le port est administrativement fermé ou inactif.
- Blocking : le port reçoit les BPDUs mais ne transmet pas de trafic utilisateur.
- Listening : le port commence à écouter le réseau, traite les BPDUs pour définir son rôle, mais ne transmet toujours pas de trafic utilisateur.
- Learning : le port apprend les adresses MAC, stocke l'information dans la table de commutation, mais ne transmet pas encore de trafic utilisateur.
- Forwarding : le port est pleinement opérationnel, il peut envoyer et recevoir du trafic utilisateur.
STP introduit un temps de latence avant le passage à l'état Forwarding (à cause des périodes Listening et Learning), ce qui évite les boucles mais peut ralentir la convergence.
Reprenons notre exemple précédent.
Admettons que COM_1 soit élu Root Bridge (soit parce qu'il a la plus basse adresse MAC, soit parce qu'on a configuré sa priorité STP pour être la plus faible).
En tant que Root Bridge, COM_1 n'a PAS de root port, il ne possède que des ports désignés.
Voici alors la répartition des rôles de ports sur chaque commutateur :
- Port COM_1 -> COM_2 : Désigné (Forwarding)
- Port COM_1 -> COM_3 : Désigné (Forwarding)
- Port COM_1 -> PC_1 : Désigné (Forwarding)
En général, tous les ports d'un root bridge sont en état désigné (sauf cas particuliers comme un port administrativement éteint).
- Port COM_2 -> COM_1 : Root port (Forwarding) - C'est le "meilleur chemin" pour atteindre la racine (COM_1)
- Port COM_2 -> COM_3 : Désigné (Forwarding), ou potentiellement bloqué si, par exemple, COM_3 gagne la désignation.
- Port COM_3 -> COM_1 : Root port (Forwarding) - Lui aussi a un accès direct vers la racine
- Port COM_3 -> PC2 : Désigné (Forwarding) - C'est un port "vers un host", donc il est désigné pour ce segment (reliant PC2 à COM_3)
- Port COM_3 -> COM_2 : Non désigné (Blocking), dans la plupart des cas.
Dans un triangle de commutateurs, il y a nécessairement un lien bloqué pour éviter la boucle.
Comment choisir le port bloqué entre COM_2 et COM_3 ?
- Coût vers le root (COM_1) :
- COM_2 -> COM_1 = coût direct (par exemple 4)
- COM_3 -> COM_1 = coût direct (par exemple 4)
- COM_2 -> COM_3 -> COM_1 = coût 4+4 = 8 (moins favorable)
- COM_3 -> COM_2 -> COM_1 = coût 4+4 = 8 (moins favorable)
- COM_2 et COM_3 préfèrent donc leur lien direct avec le root
- Sur le lien COM_2 - COM_3 : STP doit désigner un seul port désigné. L'autre sera non-désigné (bloqué).
Cas typique
- Si COM_2 possède la bridge ID la plus basse (après COM_1), COM_2 gagne le statut de Designated Bridge sur le segment COM_2 - COM_3
- Le port COM_2 -> COM_3 est alors Désigné (Forwarding)
- Le port COM_3 -> COM_2 devient Non-Désigné (Blocking)
Ou inversement, si COM_3 avait la plus basse bridge ID que COM_2. il deviendrait désigné, et le port de COM_2 bloquerait.
3. Principales variantes de STP
Le STP d'origine (IEEE 802.1D) a évolué pour améliorer la rapidité de convergence et la gestion de multiples VLANs.
3.1 RSTP (Rapid Spanning Tree Protocol, IEEE 802.1w)
Le RSTP a été introduit pour accélérer la convergence (quelques secondes) par rapport à STP classique (qui pouvait prendre jusqu'à ~50 secondes dans certains cas). Principales améliorations :
- Il réduit ou supprime les états Listening et Learning en accélérant la transition des ports.
- Il introduit des rôles de port légèrement différents (Alternate, Backup, etc.).
- Le processus de reconfiguration est beaucoup plus rapide.
3.2 MSTP (Multiple Spanning Tree Protocol, IEEE 802.1s)
Le MSTP gère plusieurs instances de spanning tree pour un ensemble de VLANs.
Cela permet de :
- Réduire la charge : on évite de lancer un STP séparé pour chaque VLAN (comme c'était le cas avec PVST+ de Cisco).
- Optimiser la topologie : on peut regrouper certains VLANs dans la même instance STP et d'autres VLANs dans une instance différente.
4. Résumé des points clés à retenir
- Prévention des boucles : le but principal de STP est d'empêcher les boucles en couche 2.
- Élection du root bridge : le commutateur ayant la priorité la plus basse (ou l'adresse MAC la plus basse en cas d'égalité) devient la racine.
- Rôles de ports :
- Root Port : le chemin préférentiel vers la racine.
- Designated Port : le port « principal » d'un segment.
- Non-Designated Port (Bloqué) : empêche la boucle.
- États de ports (en STP classique) : Blocking, Listening, Learning, Forwarding, Disabled.
- Convergence :
- STP (802.1D) : convergence plus lente (~30 à 50 s).
- RSTP (802.1w) : convergence rapide (quelques secondes).
- MSTP (802.1s) : gère plusieurs topologies pour différents VLANs (plus flexible).
5. Conseils de configuration et bonnes pratiques
- Choisir manuellement le root bridge en ajustant la priorité d'un ou plusieurs commutateurs (afin d'avoir un contrôle précis sur la topologie).
- Utiliser RSTP ou MSTP dans la plupart des environnements modernes pour bénéficier d'une meilleure réactivité.
- Éviter les boucles physiques non nécessaires : même si STP bloque les ports, un excès de liaisons physiques redondantes peut compliquer la topologie.
- Surveiller régulièrement les liaisons et les logs du spanning tree pour détecter des changements fréquents (topology changes).
Le Spanning Tree Protocol est un mécanisme essentiel dans les réseaux Ethernet pour prévenir les boucles de commutation, assurer la fiabilité et la redondance.
Grâce à l'élection d'une racine et à la détermination automatique de rôles de ports, STP garantit qu'un seul chemin logique est actif entre chaque pair de commutateurs.
Au fil du temps, STP a évolué pour offrir des versions plus performantes (RSTP, MSTP).
Dans la majorité des réseaux modernes, on conseille fortement d'utiliser RSTP (IEEE 802.1w) au minimum, car il offre une convergence beaucoup plus rapide que la version STP classique. Pour des environnements complexes et multi-VLAN, MSTP est souvent utilisé.
En suivant les bonnes pratiques (choix d'un root bridge, réduction des liens redondants superflus, surveillance des changements de topologie), on obtient un réseau Ethernet performant et résilient.
Commandes usuelles sur Packet Tracer
Commandes pour afficher l'état du STP
Afficher le résumé STP de tous les VLANs :
Afficher les détails STP pour un VLAN spécifique :
show spanning-tree vlan <vlan_id>
Par exemple, pour VLAN 10 :
show spanning-tree vlan 10
Afficher les informations sur les ports participant au STP :
show spanning-tree interface <interface_id>
Exemple pour une interface spécifique :
show spanning-tree interface GigabitEthernet1/0/1
Afficher le rôle des ports STP :
show spanning-tree detail
Voir les changements de topologie STP :
show spanning-tree detail | include Topology
Commandes de diagnostic STP
Afficher les root bridges pour tous les VLANs :
Vérifier le statut du port en tant que root port ou autre :
show spanning-tree interface <interface_id> detail
Vérifier la priorité et l'état du switch dans le STP :
show spanning-tree bridge
Commandes de configuration rapide pour STP (en mode configuration)
Activer Rapid PVST (mode rapide STP) :
spanning-tree mode rapid-pvst
Configurer une priorité plus basse pour faire de ce switch le root bridge :
spanning-tree vlan <vlan_id> priority 0
Activer PortFast sur une interface (pour les ports connectés à des hôtes) :
interface <interface_id>
spanning-tree portfast
Activer BPDU Guard sur une interface :
interface <interface_id>
spanning-tree bpduguard enable