Spanning-Tree : Port cost vs Port priority

Lorsque Spanning-Tree (STP) (voir Fiche Récapitulative n°6) résout une boucle dans un réseau de switches, il respecte une série de paramètres permettants de déterminer le meilleur chemin vers le Root Bridge, ce « chemin » sera identifié sur chaque switch par le « Root Port »…

Ces critères sont, par ordre décroissant de priorité:

  • Le « Root Path Cost »: la somme des costs des interfaces par lesquelles le BPDU entre.
  • Le Bridge ID du switch voisin.
  • Le Port-ID du switch voisin.

Le Root path cost peut être influencé en modifiant le cost des interfaces par lesquelles les BPDUs entrent.

Le Bridge ID quant à lui peut être manipulant en ajustant le priorité de STP. C’est ce que l’on fait généralement pour s’assurer qu’un switch précis soit élu le Root-Bridge. Il est donc délicat de la modifier afin d’influencer le choix du RP (root-port).

Il peut arriver que deux liens, mènent au Root Bridge avec le même cost, et que le Bridge ID du voisin soit identique (deux liaisons parallèles entre deux mêmes switches), c’est là qu’intervient le Port-ID. Comme pour tout le reste dans STP, le plus petit Port-ID sera le meilleur.

En réalité le port ID est constitué de deux élements…

  • La priorité du port codée sur 8 bits (0-255)
  • L’identifiant du port codé sur 8 bits, dépendant du matériel donc non modifiable.

En général ce détail est simplifié en disant qu’à cost égal et à bridge-id voisin égal, le switch choisi la plus petit interface (par classement alphanumérique)… par exemple fastEthernet0/0 est plus petit que fastEthernet0/1 … mais en réalité, chacun de ses ports a un numéro d’identification qui lui est associé (qui reflète d’ailleurs la logique simplifiée décrite ci-dessus).

Bien que le principe semble simple, sa compréhension peut-être délicate. En effet, la modification du cost d’une interface a un effet sur le switch local… parce qu’il est additionné au Root-Path-Cost présent dans le BPDU … par contre … La priorité du port quant à elle a un effet indirect. Le switch choisira l’interface par laquelle il reçoit le Port-ID le plus faible … ce qui implique que l’information est donnée par le switch voisin.

Voyons cela dans la pratique…

Topologie utilisée

STP-port-prio

SWITCH-B et SWITCH-C sont connectés par leurs interfaces respectives Fa0/1, Fa0/2, FA0/9 et Fa0/10. Les interfaces Fa0/1 et Fa0/2 sont configurée en un Etherchannel statique, il en va de même pour Fa0/9 et Fa0/10.

De la sorte, nous avons deux switches liées par deux etherchannel parallèles, de cost égaux etc.

Analyse de la topologie de base

SWITCH-B#show spanning-tree vlan 1
VLAN0001
 Spanning tree enabled protocol ieee
 Root ID Priority 32769
 Address 000e.84fd.c440
 This bridge is the root
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
 Address 000e.84fd.c440
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Aging Time 300
Interface        Role Sts    Cost   Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Po1              Desg FWD        12   128.65 P2p
Po2              Desg FWD        12   128.66 P2p
SWITCH-B#

Actuellement SWITCH-B est le root-bridge. Les deux Etherchannels (Po1 et Po2) sont donc des DP (Designated Port) et sont dans un état « forwarding ». C’est donc du côté de SWITCH-C qu’il y aura un port bloquant.

SWITCH-C#show spanning-tree vlan 1
VLAN0001
 Spanning tree enabled protocol ieee
 Root ID Priority 32769
 Address 000e.84fd.c440
 Cost 12
 Port 65 (Port-channel1)
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
 Address 000f.28a2.d740
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Aging Time 300
Interface        Role Sts    Cost   Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Po1              Root FWD        12   128.65 P2p
Po2              Altn BLK        12   128.66 P2p
SWITCH-C#

On note ici que Po2 est bloquant (Altn BLK). Pourquoi ? … Po1 et Po2 ont le même Root Path Cost, dés lors le switch tente de les départager avec le BID du voisin… hors c’est le même … il lui reste alors le Port-ID du voisin… Po1 sur SWITCH-B a une valuer de 128.65, contre 128.66 pour Po2, dés lors quand SWITCH-C reçoit le BPDU provenant de Po1 de SWITCH-B il le considère comme meilleur et Po1 devient alors le RP.

Modifier le RP en agissant sur le cost

Sans doute la méthode la plus simple, il suffit de modifier le cost de l’interface par laquelle entre le BPDU. Par exemple ici on peut réduire le cost de Po2 sur SWITCH-C. Ce qui diminuera le Root Path Cost par ce lien et le définira comme RP.

SWITCH-C(config)#interface port-channel 2
SWITCH-C(config-if)#spanning-tree vlan 1 cost 11

Vérifions…

SWITCH-C#show spanning-tree vlan 1
VLAN0001
 Spanning tree enabled protocol ieee
 Root ID Priority 32769
 Address 000e.84fd.c440
 Cost 11
 Port 66 (Port-channel2)
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
 Address 000f.28a2.d740
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Aging Time 300
Interface        Role Sts    Cost   Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Po1              Altn BLK        12   128.65 P2p
Po2              Root FWD        11   128.66 P2p
SWITCH-C#

Le résultat correspond à nos attentes, Po2 a maintenant un cost de 11 et est donc le meilleur chemin vers le root, et donc élu RP … Po1 devient donc le port bloquant.

Simple … efficace … mais … modifier le cost d’une interface a un impact sur l’ensemble de la topologie. Si plusieurs switches sont en cascade, modifier le cost sur une interface impacte tous les switches en aval.

On peut donc procéder autrement…

Modifier le RP en agissant sur le Port-ID

Ici c’est plus délicat. On va devoir modifier la priorité du port par lequel est émis le BPDU reçu. Donc pour favoriser Po2 sur SWITCH-C, il va falloir réduire la valeur de priorité de PO2 (plus petit = meilleur) sur SWITCH-B…

Remarque: dans un « show spanning-tree », la colonne  « Prio.Nbr » indique la valeur que le switch inscrira dans le BPDU quand il l’émettra par cette interface.

Tout d’abord on remet le cost par défaut sur SWITCH-C…. (SWITC-C Po1 redevient donc le RP et Po2 redevient bloquant).

SWITCH-C(config)#interface port-channel 2
SWITCH-C(config-if)#no spanning-tree vlan 1 cost 11

Ensuite on passe sur SWITCH-B et on défini une valeur de priorité de port plus faible pour Po2 de sorte que SWITCH-C préfère les BPDU émis par cette interface…

SWITCH-B(config)#interface port-channel 2
SWITCH-B(config-if)#spanning-tree vlan 1 port-priority 112

Notez que la valeur de priorité (128 par défaut) doit être un incrément de X … où X dépend du switch, de l’IOS etc… par exemple sur le c2950 que j’utilise pour l’exemple, il faut utiliser des incréments de 16 (128-16=112).

Vérifions d’abord le résultat sur SWITCH-B…

SWITCH-B#show spanning-tree vlan 1
VLAN0001
 Spanning tree enabled protocol ieee
 Root ID Priority 32769
 Address 000e.84fd.c440
 This bridge is the root
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
 Address 000e.84fd.c440
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Aging Time 300
Interface        Role Sts    Cost   Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Po1              Desg FWD        12   128.65 P2p
Po2              Desg FWD        12   112.66 P2p
SWITCH-B#

On voit bien ici que la priorité de Po2 a été ajustée … mais il ne faut pas oublié que cela n’a pas d’effet local, c’est la valeur indiquée dans le BPDU lorsqu’il est transmis par cette interface.

Voyons maintenant sur SWITCH-C…

SWITCH-C#show spanning-tree vlan 1
VLAN0001
 Spanning tree enabled protocol ieee
 Root ID Priority 32769
 Address 000e.84fd.c440
 Cost 12
 Port 66 (Port-channel2)
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
 Address 000f.28a2.d740
 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
 Aging Time 300
Interface        Role Sts    Cost   Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Po1              Altn BLK        12   128.65 P2p
Po2              Root FWD        12   128.66 P2p
SWITCH-C#

L’interface Po2 est bien devenue le RP sans modifier son cost. Par contre on ne voit pas ici le changement de priorité … de nouveau cette commande n’affiche que la valeur de l’interface locale … pour voir la valeur reçue dans le BPDU il faut gratter plus loin…

SWITCH-C#show spanning-tree vlan 1 detail

VLAN0001 is executing the ieee compatible Spanning Tree protocol
 Bridge Identifier has priority 32768, sysid 1, address 000f.28a2.d740
 Configured hello time 2, max age 20, forward delay 15
 Current root has priority 32769, address 000e.84fd.c440
 Root port is 66 (Port-channel2), cost of root path is 12
 Topology change flag not set, detected flag not set
 Number of topology changes 8 last change occurred 00:14:48 ago
 from Port-channel1
 Times: hold 1, topology change 35, notification 2
 hello 2, max age 20, forward delay 15
 Timers: hello 0, topology change 0, notification 0, aging 300

Port 65 (Port-channel1) of VLAN0001 is blocking
 Port path cost 12, Port priority 128, Port Identifier 128.65.
 Designated root has priority 32769, address 000e.84fd.c440
 Designated bridge has priority 32769, address 000e.84fd.c440
 Designated port id is 128.65, designated path cost 0
 Timers: message age 1, forward delay 0, hold 0
 Number of transitions to forwarding state: 4
 Link type is point-to-point by default
 BPDU: sent 4, received 2207

Port 66 (Port-channel2) of VLAN0001 is forwarding
 Port path cost 12, Port priority 128, Port Identifier 128.66.
 Designated root has priority 32769, address 000e.84fd.c440
 Designated bridge has priority 32769, address 000e.84fd.c440
 Designated port id is 112.66, designated path cost 0
 Timers: message age 1, forward delay 0, hold 0
 Number of transitions to forwarding state: 4
 Link type is point-to-point by default
 BPDU: sent 4, received 2202
SWITCH-C#

Cette commande affiche le détail de STP pour le VLAN1, et plus particulièrement les informations reçues dans les BPDU pour les différentes interfaces concernées (PO& et Po2 dans ce cas-ci).

On voit bel et bien ici que Po2 (le port 66) a reçu un BPDU avec un port-id de 112.66 (112 est la priorité, 66 est le n° du port sur SWITCH-B).

A quoi cela peut-il servir ?

On peut imaginer diverses applications de cette méthode, mais l’une des plus fréquente consiste à effectuer un équilibrage de charge entre deux trunks redondants. On défini un trunk avec une meilleure priorité pour une série de VLANs et l’autre pour les VLANs restant. Cela a pour effet de ne pas laisser un trunk inutilisé et de garder la redondance en cas de défaillance sans impacter la topologie au delà de la liaison concernée.

7 Comments on “Spanning-Tree : Port cost vs Port priority

  1. Re question : si sur tous ces ports, j’ai des téléphones IP Cisco qui embarquent donc une interface de type HUB sur lequel est branché l’ordinateur de l’utilisateur, cela répond à ma question?

  2. Bonjour

    Question : quels types de matériels peuvent modifier l’état d’un port au risque de le faire devenir root? les switch bien sur, les routeurs également, les contrôleurs wifi apparemment? les bornes WiFi? quoi d’autre?

    En fait je pose cette question car j’ai tout un tas de ports (utilisé par les utilisateurs de l’entreprise)sur mon stack principal qui sont potentiellement « éligible root »?!? ce qui me pose problème bien sur… et me fait peur!

    Ou alors je leur ajoute la commande « spanning-tree guard root » ainsi je serai protégé…

    Merci par avance de votre réponse.

    Cedric

    • N’importe quel PC/machine capable d’émettre des trames et configurée pour émettre de faux messages STP peut causer ce genre de souci.
      Il existe d’ailleurs des packages de librairies/softs dédiés à des tests de sécurité réseau et qui gèrent cela à merveille.

  3. Merci bcp ça m’aidera bien
    Mais si je souhaite bloquer un seul port sur le switch de la couche d’accés qui établi une liaison avec deux switch de coeur réseau la methode eest tjrs la même ??