Une introduction interactive au Spanning Tree Protocol
Avertissement
Cet article contient des exemples interactifs. Pour les visualiser et interagir avec eux, vous devez quitter votre lecteur de flux.
Imaginez que vous louiez des bureaux pour un Ă©vĂ©nement de trois jours. Vous installez Ă la hĂąte quelques commutateurs Ethernet et scotchez des cĂąbles au sol pour connecter tout le monde. Malheureusement, Gaston, votre collĂšgue le plus maladroit, trĂ©buche sur un cĂąble Ă chaque fois quâil se lĂšve pour aller chercher un cafĂ©. Vous pourriez ajouter des cĂąbles supplĂ©mentaires, mais vous provoqueriez alors une tempĂȘte de diffusionâŻ: des paquets Ethernet qui tournent en boucle et se multiplient jusquâĂ saturation.
Câest lĂ quâintervient le spanning tree protocol (STP). STP bloque le trafic sur un sous-ensemble des cĂąbles pour ne laisser quâun arbre sans boucle. Quand Gaston rĂ©cidive, STP reconstruit lâarbre en une seconde, ce qui laisse Ă Nono, votre unique renfort technique, le temps de rebrancher le cĂąble1. Jugez par vous-mĂȘmeâŻ: lâillustration ci-dessous fait tourner une vĂ©ritable implĂ©mentation de STP dans votre navigateurâŻ!
:demo
A1 @0,0 prio=4096
A2 @0,1
A3 @0,2
A4 @0,3
B1 @1,0 prio=8192
B2 @1,1
B3 @1,2
B4 @1,3
C1 @2,0 prio=8192
C2 @2,1
C3 @2,2
C4 @2,3
A1 -- A2 hazard=0
A2 -- A3 hazard=0
A3 -- A4 hazard=0
B1 -- B2
B2 -- B3
B3 -- B4
C1 -- C2 hazard=0
C2 -- C3 hazard=0
C3 -- C4 hazard=0
A1 -- B1 cost=10
B1 -- C1 cost=10
A4 -- B4 cost=20
B4 -- C4 cost=20
LĂ©o @-0.3,0.7 proto=none icon=đŠđ»
ZoĂ© @-0.3,1.3 proto=none icon=đ§đœ
Eva @0.3,0.7 proto=none icon=đ±đ»ââïž
Luc @0.3,1.3 proto=none icon=đšđŸ
A2 -- Léo hazard=0 A2:edge
A2 -- Zoé hazard=0 A2:edge
A2 -- Eva hazard=0 A2:edge
A2 -- Luc hazard=0 A2:edge
Max @-0.3,1.7 proto=none icon=đšđœ
Ana @-0.3,2.3 proto=none icon=đ©đŸ
Ida @0.3,1.7 proto=none icon=đ”đŸ
LĂ©a @0.3,2.3 proto=none icon=đ©đŒ
A3 -- Max hazard=0 A3:edge
A3 -- Ana hazard=0 A3:edge
A3 -- Ida hazard=0 A3:edge
A3 -- Léa hazard=0 A3:edge
Tom @0.7,0.7 proto=none icon=đŠđŒ
Zac @0.7,1.3 proto=none icon=đšđ»
Sam @1.3,0.7 proto=none icon=đ§đœ
Noa @1.3,1.3 proto=none icon=đ±đŒ
B2 -- Tom hazard=0.2 B2:edge
B2 -- Zac hazard=0.2 B2:edge
B2 -- Sam hazard=0.2 B2:edge
B2 -- Noa hazard=0.2 B2:edge
Isa @0.7,1.7 proto=none icon=đ©đ»
Cam @0.7,2.3 proto=none icon=đ§đŸâđб
Aya @1.3,1.7 proto=none icon=đ§đœ
Guy @1.3,2.3 proto=none icon=đŽđż
B3 -- Isa hazard=0.2 B3:edge
B3 -- Cam hazard=0.2 B3:edge
B3 -- Aya hazard=0.2 B3:edge
B3 -- Guy hazard=0.2 B3:edge
Awa @1.7,0.7 proto=none icon=đ©đż
Ăve @1.7,1.3 proto=none icon=đ§đŒ
AĂ«l @2.3,0.7 proto=none icon=đ§đż
Ali @2.3,1.3 proto=none icon=đ§đŸ
C2 -- Awa hazard=0 C2:edge
C2 -- Ăve hazard=0 C2:edge
C2 -- Aël hazard=0 C2:edge
C2 -- Ali hazard=0 C2:edge
Gil @1.7,1.7 proto=none icon=đšđŒâđŠł
Lou @1.7,2.3 proto=none icon=đ§đż
Lia @2.3,1.7 proto=none icon=đ§đ»
Mia @2.3,2.3 proto=none icon=đ©đœâđа
C3 -- Gil hazard=0 C3:edge
C3 -- Lou hazard=0 C3:edge
C3 -- Lia hazard=0 C3:edge
C3 -- Mia hazard=0 C3:edge
Note
Cet article est aussi disponible en vidĂ©o, en anglais avec des sous-titres en français, mais je vous conseille de continuer ici afin dâexplorer les dĂ©monstrations interactives.
Les bases
Conçu dans les annĂ©es 80, le spanning tree protocol a donnĂ© naissance Ă une dĂ©clinaison «âŻrapideâŻÂ» (RSTP) et Ă une variante «âŻcompatible VLANâŻÂ» (MSTP)2. Tout ingĂ©nieur rĂ©seau sensĂ© sait quâil existe de meilleures solutions, comme BGP EVPN VXLAN. Pourtant, puisque nâimporte quel commutateur le parle, le vĂ©nĂ©rable spanning tree protocol nâa pas dit son dernier mot.
Nous nous concentrons sur RSTPâŻ: il a remplacĂ© le protocole dâorigine en 2004. Pour Ă©liminer les boucles rĂ©seau, RSTP met en Ćuvre une machine Ă Ă©tats complexe. Des temporisateurs, les changements dâĂ©tat des liens et les trames de contrĂŽle quâun pont reçoit de ses voisins commandent ses transitions. Ces trames Ethernet sont les Bridge Protocol Data Units (BPDU). Vous pouvez les voir Ă lâĆuvre ci-dessousâŻ: appuyez sur le bouton «âŻStartâŻÂ».
:protocol rstp
:tx-hold 10
A1 @0,1
C11 @1,0 prio=4096 icon=đł
C12 @1,2 prio=4096 icon=đł
C21 @2,0 prio=4096 icon=đł
C22 @2,2 prio=4096 icon=đł
A2 @3,1
H1 @0,0.2 proto=none icon=đ»
H2 @0,1.8 proto=none icon=đšïž
H3 @3,0.2 proto=none icon=đ
H4 @3,1.8 proto=none icon=đș
A1 -- C11
A1 -- C12
A2 -- C21
A2 -- C22
C11 -- C12
C11 -- C21
C11 -- C21
C11 -- C22
C12 -- C21
C12 -- C22
C21 -- C22
A1 -- H1 A1:edge
A1 -- H2 A1:edge
A2 -- H3 A2:edge
A2 -- H4 A2:edge
Au bout de quelques instants, la topologie converge vers un arbreâŻ: depuis la racine C11, il existe un chemin vers chaque pont3 et aucune boucle. En haut Ă droite, lâinterface affiche une icĂŽne dâarbre đł suivie du temps quâil a fallu pour atteindre cet Ă©tat. Coupez un lien et observez comment le protocole trouve en moins dâune seconde un autre chemin pour joindre C12. Vous pouvez arrĂȘter la simulation, lâavancer pas Ă pas, la rĂ©initialiser ou la ralentir avec le mode «âŻescargotâŻÂ» đ. Ne vous inquiĂ©tez pas de toutes les informations affichĂ©esâŻ: je les explique plus loin.
Tous les exemples sâexĂ©cutent dans votre navigateur grĂące Ă MSTPD, une implĂ©mentation libre de RSTP4 fonctionnant en espace utilisateur5.
Interlude historique
Radia Perlman, intronisĂ©e Ă lâInternet Hall of Fame en 2014, a rĂ©sumĂ© dans ce poĂšme lâancĂȘtre de STP quâelle a inventĂ© chez DEC. Il a Ă©tĂ© repris plus tard dans un brevet amĂ©ricainâŻ:
I think that I shall never see
A graph more lovely than a tree.
A tree whose crucial property
Is loop-free connectivity.
A tree which must be sure to span
So packets can reach every LAN.
First, the root must be selected.
By ID, it is elected.
Least cost paths from root are traced.
In the tree, these paths are placed.
A mesh is made by folks like me,
Then bridges find a spanning tree.â Radia Perlman, Algorhyme.
Ălection de la racine
Pour construire un arbre, RSTP commence par élire comme pont racine celui
qui a lâidentifiant de pont le plus faible. Cet identifiant combine la
prioritĂ© et lâadresse MACâŻ: 8192.6e:2b:10:a0:5f:29.
Dans lâexemple ci-dessous, S1 et S2 ont des prioritĂ©s de 4âŻ096 et 8âŻ192âŻ: S1 devient racine. S4 a une prioritĂ© de 12âŻ288, tandis que S3 conserve la prioritĂ© par dĂ©faut de 32âŻ7686âŻ: S4 devient racine. S5 et S6 nâont pas de prioritĂ© particuliĂšreâŻ: lâadresse MAC la plus faible lâemporte et S5 devient racine.
:protocol rstp
S1 @0,0 prio=4096
S2 @0,1 prio=8192
S1 -- S2
S3 @1,0
S4 @1,1 prio=12288
S3 -- S4
S5 @2,0
S6 @2,1
S5 -- S6
Au dĂ©part, chaque pont sâannonce comme racine7âŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
Root Identifier: 8192.02:00:00:01:00:01
Bridge Identifier: 8192.02:00:00:01:00:01
DĂšs quâun pont reçoit une BPDU annonçant une meilleure racine, il propage cette nouvelle information Ă ses voisins.
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
Root Identifier: 4096.02:00:00:00:00:00
Bridge Identifier: 8192.02:00:00:00:00:01
Attribution des rĂŽles aux ports
La deuxiĂšme Ă©tape consiste Ă attribuer un rĂŽle Ă chaque port. RSTP dĂ©finit cinq rĂŽles, chacun reprĂ©sentĂ© par une lettreâŻ:
- racine (R, root),
- désigné (D, designated),
- alternatif (A, alternate),
- désactivé (X, disabled),
- de secours (B, backup)8.
Chaque pont qui nâest pas racine choisit comme port racine celui dont le chemin vers la racine a le coĂ»t le plus faible. Sauf si vous configurez une valeur spĂ©cifique, chaque pont dĂ©duit le coĂ»t dâun lien Ă partir de son dĂ©bitâŻ: 20âŻ000 pour 1 Gbit/s. En cas dâĂ©galitĂ©, lâidentifiant de port le plus faible lâemporte.
Chacun des ports restants devient un port dĂ©signĂ© si la BPDU quâil Ă©met est «âŻmeilleureâŻÂ» que celle quâil reçoit. Sinon, il devient un port alternatif. Plus tard, si le port racine tombe, le «âŻmeilleurâŻÂ» port alternatif devient le port racine. Les critĂšres pour choisir la meilleure BPDU sontâŻ:
- lâidentifiant de pont racine le plus faible,
- le coĂ»t cumulĂ© jusquâĂ la racine le plus faible,
- lâidentifiant de pont le plus faible,
- lâidentifiant de port le plus faible.
:protocol rstp
S1 @1,0 prio=4096 icon=đł
S2 @0,1
S3 @2,1
S1 -- S2
S1 -- S3
S1 -- S3
S2 -- S3
Dans lâexemple ci-dessus, aprĂšs convergence, S1 est la racine car sa prioritĂ© est de 4âŻ096, alors que les autres ponts ont une prioritĂ© de 32âŻ768. Tous ses ports sont des ports dĂ©signĂ©s puisque le coĂ»t cumulĂ© jusquâĂ la racine est nul.
Le port de S2 face à S1 devient un port racine car il présente le coût cumulé le
plus faible vers la racineâŻ: 20âŻ000 contre 40âŻ000. S3 possĂšde deux ports face Ă
S1 et celui dont lâidentifiant de port est le plus faible devient le port
racineâŻ: 0x8000 contre 0x8001. Lâautre candidat est un port alternatif car
le port distant sur ce lien émet une meilleure BPDU, avec un coût cumulé nul.
Sur le segment entre S2 et S3, câest le port de S2 qui lâemporteâŻ: les deux
ponts ont le mĂȘme coĂ»t cumulĂ© jusquâĂ la racine (20âŻ000), mais lâidentifiant de
pont de S2 est plus petitâŻ: 32768.02:00:00:00:00:01 contre
32768.02:00:00:00:00:02.
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
Root Identifier: 4096.02:00:00:00:00:00
Root Path Cost: 20000
Bridge Identifier: 32768.02:00:00:00:00:01
Port identifier: 0x8002
Si vous coupez le lien actif entre S1 et S3, S3 promeut le «âŻmeilleurâŻÂ» port alternatif en port racine. Si vous dĂ©sactivez aussi le second lien, S3 retient le port alternatif restant comme port racine. En revanche, si vous dĂ©sactivez le lien entre S1 et S2, S2 doit travailler un peu plus pour Ă©lire un nouveau port racine, car il ne dispose dâaucun port alternatif.
Sauf Ă©vĂ©nement particulier, les ports dĂ©signĂ©s Ă©mettent une BPDU toutes les 2 secondes9. Si un pont ne reçoit plus de BPDU de son voisin pendant 3 pĂ©riodes «âŻhelloâŻÂ» consĂ©cutives, il le considĂšre comme mort et efface les informations associĂ©es au port.
Transition dâĂ©tat des ports
Chaque port se trouve dans lâun des trois Ă©tats suivants. Le schĂ©ma reprĂ©sente chaque Ă©tat par une couleur de fondâŻ:
- rejet (discarding, rouge),
- apprentissage (learning, jaune),
- transmission (forwarding, vert).
Un port racine passe automatiquement Ă lâĂ©tat de transmission. Un port alternatif reste Ă lâĂ©tat de rejet. Un port dĂ©signĂ© dispose de deux moyens pour passer de lâĂ©tat de rejet Ă lâĂ©tat de transmissionâŻ:
- Si le port est un port dâextrĂ©mitĂ© (edge port), soit par configuration, soit parce que lâĂ©quipement distant ne parle aucune variante de STP, le pont suppose que cet Ă©quipement ne participe pas au protocole et ne peut donc pas crĂ©er de boucle. Dans ce cas, le port dĂ©signĂ© passe immĂ©diatement Ă lâĂ©tat de transmission.
- Sinon, il envoie une proposition Ă son voisin en aval. Si le pont distant estime que la BPDU reçue est «âŻmeilleureâŻÂ» que toutes celles mĂ©morisĂ©es pour ses autres ports, il Ă©lit le port de rĂ©ception comme port racine et dĂ©marre le processus de synchronisationâŻ: pour Ă©viter une boucle, il fait passer Ă lâĂ©tat de rejet tous les ports dĂ©signĂ©s qui ne sont ni des ports dâextrĂ©mitĂ© ni dĂ©jĂ synchronisĂ©s. Il renvoie ensuite un accord. Ă la rĂ©ception de cet accord, le port dĂ©signĂ© du pair passe Ă lâĂ©tat de transmission10.
:protocol rstp
S1 @1,0 prio=4096 icon=đł
S2 @1,1
S3 @0,2
S4 @2,2
S5 @0,3 prio=8192 icon=đȘŸ
S6 @2,3
H1 @0,1.2 proto=none icon=đšïž
H2 @2,1.2 proto=none icon=đ
H3 @2.5,1.3 proto=none icon=đș
H4 @2.5,2.3 proto=none icon=đ»
S1 -- S2
S2 -- S3
S2 -- S4
S3 -- S5
S4 -- S6
S4 -- S3
S5 -- S6
S3 -- H1 S3:edge
S4 -- H2 S4:edge
S4 -- H3 S4:edge
S6 -- H4 S6:edge
Dans la topologie ci-dessus, H1, H2, H3 et H4 sont des Ă©quipements terminaux qui ne participent pas au protocole. Nous configurons les ports auxquels ils sont raccordĂ©s comme des ports dâextrĂ©mitĂ©âŻ: ces ports passent donc immĂ©diatement Ă lâĂ©tat de transmission.
Utilisez le bouton «âŻstepâŻÂ» pour faire avancer la simulation. Lâhorloge passe Ă 1 seconde. Avancez encore dâun cranâŻ: S1 et S2 sâenvoient mutuellement une proposition. Voici celle de S2âŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x4e, Agreement, Port Role: Designated, Proposal
0... .... = Topology Change Acknowledgment: No
.1.. .... = Agreement: Yes
..0. .... = Forwarding: No
...0 .... = Learning: No
.... 11.. = Port Role: Designated (3)
.... ..1. = Proposal: Yes
.... ...0 = Topology Change: No
Root Identifier: 32768.02:00:00:00:00:01
Root Path Cost: 0
Bridge Identifier: 32768.02:00:00:00:00:01
Port identifier: 0x8001
S1 ignore cette propositionâŻ: son propre identifiant de racine est plus faible. Quand S2 reçoit une proposition similaire de S1, il accepte S1 comme racine. Il Ă©lit Ă©galement le port vers S1 comme port racine et dĂ©marre le processus de synchronisation. Ses deux ports dĂ©signĂ©s sont dĂ©jĂ Ă lâĂ©tat de rejetâŻ: rien ne change de ce cĂŽtĂ©. Avancez encore dâun cranâŻ: S2 envoie deux BPDU Ă S1. Dans lâune dâelles, le bit dâaccord vaut 1 et le bit de proposition vaut 0. Elle montre aussi que S2 a acceptĂ© S1 comme racine et que son port racine est dĂ©sormais Ă lâĂ©tat de transmission. Ă la rĂ©ception de cette BPDU, S1 fait passer son propre port dĂ©signĂ© Ă lâĂ©tat de transmission. Ă partir de cet instant, le lien entre S1 et S2 achemine le trafic utilisateur.
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x79, Agreement, Forwarding, Learning, Port Role: Root, Topology Change
0... .... = Topology Change Acknowledgment: No
.1.. .... = Agreement: Yes
..1. .... = Forwarding: Yes
...1 .... = Learning: Yes
.... 10.. = Port Role: Root (2)
.... ..0. = Proposal: No
.... ...1 = Topology Change: Yes
Root Identifier: 4096.02:00:00:00:00:00
Root Path Cost: 20000
Bridge Identifier: 32768.02:00:00:00:00:01
Port identifier: 0x8001
Voyons maintenant ce qui est arrivĂ© Ă S5. RĂ©initialisez la simulation et avancez de deux pas. S5 Ă©change des BPDU avec S3 et S6. Comme S5 possĂšde un identifiant de racine plus faible que S3 et S6, il reste la racine, tandis que S3 et S6 acceptent la proposition et Ă©lisent leurs ports racines. S3 et S6 dĂ©marrent le processus de synchronisation. Le port de S6 vers H4 reste actif car il sâagit dâun port dâextrĂ©mitĂ©. Avancez dâun cranâŻ: S3 et S6 renvoient tous deux un accord Ă S5, qui fait passer ses deux ports dĂ©signĂ©s Ă lâĂ©tat de transmission. Pourtant, le lien entre S5 et S3 continue de rejeter le trafic utilisateurâŻ! Si vous regardez attentivement, le port de S3 vers S5 est maintenant un port dĂ©signĂ©, et non un port racine. Lors de la mĂȘme Ă©tape, S3 reçoit aussi une meilleure BPDU de S2, avec S1 comme racine. Il Ă©lit son port vers S2 comme port racine et rĂ©trograde le port vers S5 en port dĂ©signĂ©, qui reste Ă lâĂ©tat de rejet.
Ă lâĂ©tape suivante, les choses se corsent un peu. S3 envoie une proposition Ă S511âŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x4f, Agreement, Port Role: Designated, Proposal, Topology Change
0... .... = Topology Change Acknowledgment: No
.1.. .... = Agreement: Yes
..0. .... = Forwarding: No
...0 .... = Learning: No
.... 11.. = Port Role: Designated (3)
.... ..1. = Proposal: Yes
.... ...1 = Topology Change: Yes
Root Identifier: 4096.02:00:00:00:00:00
Root Path Cost: 40000
Bridge Identifier: 32768.02:00:00:00:00:02
Port identifier: 0x8002
S5 Ă©lit S1 comme racine et le port vers S3 comme port racine. Il dĂ©marre son processus de synchronisation, mais le port dĂ©signĂ© vers S6 ne passe pas Ă lâĂ©tat de rejet. PourquoiâŻ? Ce port reste un port dĂ©signĂ© et son voisin S6 avait dĂ©jĂ envoyĂ© un accord sur ce lienâŻ: il conserve donc son statut de port synchronisĂ©.
Revenons maintenant un pas en arriĂšre pour observer ce qui arrive Ă S6. Ă cet instant, S6 croit que S5 est la racine. Avancez dâun cranâŻ: S4 envoie une nouvelle proposition Ă S6. S6 lâaccepte, Ă©lit S1 comme racine et le port vers S4 comme port racine. Le rĂŽle du port face Ă S5 changeâŻ: de port racine, il devient port dĂ©signĂ©. Comme son pair continue dâannoncer une BPDU infĂ©rieure sur le lien, ce port devient contestĂ© (disputed) et passe Ă lâĂ©tat de rejet. Le port racine passe Ă lâĂ©tat de transmission et le lien devient immĂ©diatement opĂ©rationnel, car le port dĂ©signĂ© de S4 est dĂ©jĂ Ă lâĂ©tat de transmission. Si nous avançons dâun cran, S5 et S6 Ă©changent deux BPDU. Celle de S5 est meilleure grĂące Ă son identifiant de pont plus faible. Le port de S5 reste un port dĂ©signĂ©, tandis que S6 rĂ©trograde le sien en port alternatif.
Reprenons une derniĂšre fois depuis le dĂ©butâŻ: coupez le lien entre S1 et S2, laissez tourner la simulation jusquâĂ ce que la topologie soit stable, arrĂȘtez-la, puis rĂ©tablissez le lien entre S1 et S2. Lors du premier pas, S1 et S2 Ă©changent des propositions. S2 Ă©lit S1 comme racine Ă la place de S5, et le port vers S1 comme port racine. Il rĂ©trograde son ancien port racine en port dĂ©signĂ© et le place Ă lâĂ©tat de rejet. Lâautre port dĂ©signĂ© reste synchronisĂ© et conserve son Ă©tat de transmission. Ă lâĂ©tape suivante, S2 envoie un accord Ă S1 et le lien entre eux commence Ă acheminer le trafic utilisateur. S2 envoie Ă©galement une proposition Ă S3, mais pas Ă S4âŻ: il lui envoie une BPDU ordinaire. S4 Ă©lit malgrĂ© tout S1 comme racine et le port vers S2 comme port racine. Il rĂ©trograde son ancien port racine, celui vers S3, en port dĂ©signĂ©, qui passe Ă lâĂ©tat de rejet Ă cause du changement de port racine. Lâautre port alternatif, celui vers S6, devient lui aussi un port dĂ©signĂ© et reste Ă lâĂ©tat de rejet. Le nouveau port racine passe Ă lâĂ©tat de transmission. Ă lâĂ©tape suivante, le port de S4 vers S3 se stabilise comme port alternatif aprĂšs avoir reçu une «âŻmeilleureâŻÂ» BPDU de S3.
RSTP est une gigantesque machine Ă Ă©tats dĂ©coupĂ©e en machines plus petitesâŻ: Bridge Detection, Port Information, Port Protocol Migration, Port Role Selection, Port Role Transitions, Port Receive, Port State Transitions, Port Timers, Port Transmit et Topology Change. Certaines sâappliquent Ă lâensemble du pont, dâautres Ă chaque port. Chaque pont exĂ©cute une instanceâŻ; le temps, les changements dâĂ©tat opĂ©rationnel des ports et les BPDU reçues des autres instances en pilotent les transitions. Ce fonctionnement par Ă©vĂ©nements rend RSTP plus efficace, mais aussi plus difficile Ă apprĂ©hender.

Notification de changement de topologie
Un pont maintient automatiquement une table dâadresses MACâŻ: il associe chaque adresse MAC source au port qui lâa reçue en dernier. Pour commuter une trame Ethernet, il consulte cette table afin de choisir le bon port12. Quand un lien tombe, un frigo connectĂ© joignable par un port peut le devenir par un autre. Les ponts concernĂ©s doivent alors purger les adresses MAC apprisesâŻ: elles ne sont peut-ĂȘtre plus valables.
Pour cela, RSTP met en Ćuvre des notifications de changement de topologie Ă lâaide dâun mĂ©canisme dâinondation. Lorsquâun port qui nâest pas un port dâextrĂ©mitĂ© passe Ă lâĂ©tat de transmission, un pont gĂ©nĂšre des BPDU dont le bit topology change (TC) est activĂ©. Il les envoie Ă tous ses ports dĂ©signĂ©s, Ă lâexception des ports dâextrĂ©mitĂ©, ainsi quâĂ son port racine. Il purge Ă©galement la table dâadresses MAC sur ces ports. Quand un pont reçoit une telle BPDU, il propage la notification sur ses ports dĂ©signĂ©s hors ports dâextrĂ©mitĂ© et sur son port racine, sauf celui par lequel elle est arrivĂ©e. Il purge lui aussi la table dâadresses MAC sur ces ports. Dans les exemples, les BPDU dont le bit TC vaut 1 sont entourĂ©es dâun cercle rouge.
:protocol rstp
S1 @1,0 prio=4096 icon=đł
S2 @0,1
S3 @1,1
S4 @2,1
S5 @1,2
LPT @0.1,2 proto=none icon=đšïž
S1 -- S2
S1 -- S3
S1 -- S4
S2 -- S3
S2 -- S5
S4 -- S5
S5 -- LPT S5:edge
Lancez la simulation et attendez quelques secondes que la topologie se stabilise. ArrĂȘtez la simulation et dĂ©sactivez le lien entre S2 et S5. S5 Ă©lit le port face Ă S4 comme port racine, lequel passe immĂ©diatement Ă lâĂ©tat de transmission. Avancez dâun cranâŻ: S5 Ă©met une BPDU avec le bit TC Ă 1âŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x79, Agreement, Forwarding, Learning, Port Role: Root, Topology Change
0... .... = Topology Change Acknowledgment: No
.1.. .... = Agreement: Yes
..1. .... = Forwarding: Yes
...1 .... = Learning: Yes
.... 10.. = Port Role: Root (2)
.... ..0. = Proposal: No
.... ...1 = Topology Change: Yes
Root Identifier: 4096.02:00:00:00:00:00
Root Path Cost: 40000
Bridge Identifier: 32768.02:00:00:00:00:04
Port identifier: 0x8002
S4 reçoit cette BPDU. Il purge la table dâadresses MAC sur le port face Ă S1âŻ: par exemple, LPT Ă©tait auparavant joignable par ce port, mais il faut dĂ©sormais passer par S5. Avancez dâun cranâŻ: S4 envoie Ă S1 une BPDU avec le bit TC Ă 1. Ă la rĂ©ception de cette BPDU, S1 purge la table dâadresses MAC sur les ports face Ă S2 et S3. Avancez dâun cranâŻ: S1 envoie une notification Ă S2 et Ă S3. Avancez encore dâun cranâŻ: S2 envoie une notification Ă S3, tandis que S3 ne fait rien car son port vers S2 est un port alternatif. S3 ne purge aucune table dâadresses MACâŻ: LPT reste joignable par son port vers S1.
Si vous avancez encore un peu, vous verrez que certaines BPDU pĂ©riodiques conservent le bit TC Ă 1. Chaque port dispose dâun temporisateur Ă©gal au temporisateur «âŻhelloâŻÂ» plus une seconde13. Ce temporisateur dĂ©marre quand le port Ă©met une notification. JusquâĂ son expiration, le port positionne le bit TC Ă 1 dans toutes les BPDU quâil envoie. Vous pouvez aussi voir certaines BPDU pĂ©riodiques sans le bit TCâŻ: elles proviennent dâun port qui nâa fait que recevoir une notification et qui nâa donc pas armĂ© son temporisateur.
Sécurité
RSTP est sensible aux erreurs de configuration et peu rĂ©sistant face aux acteurs malveillants. Un pont qui ne parle pas RSTP peut crĂ©er une boucle. Une personne malveillante peut sâinsĂ©rer dans la topologie pour perturber le service, espionner le trafic ou le modifier.
Pour limiter ces problĂšmes, vous devez identifier les ports dâextrĂ©mitĂ©. Un port dâextrĂ©mitĂ© est raccordĂ© Ă un Ă©quipement tel quâun PC ou une imprimante. Ces Ă©quipements ne gĂ©nĂšrent pas de BPDU et ne peuvent pas crĂ©er de boucle. RSTP propose deux options liĂ©esâŻ:
- Quand elle est vraie, AdminEdge initialise un port comme port dâextrĂ©mitĂ©.
- Quand elle est vraie, AutoEdge permet Ă un port de devenir un port dâextrĂ©mitĂ© sâil ne reçoit aucune BPDU pendant 3 secondes. Cette option est activĂ©e par dĂ©faut.
Si un port dâextrĂ©mitĂ© reçoit une BPDU, quelles que soient les valeurs de ces deux options, il redevient un port ordinaire.
R0 @1.5,1.5 prio=8192
# AutoEdge=true, AdminEdge=false, bridge
S1 @3,1.58
R0 -- S1
# AutoEdge=true, AdminEdge=false, end device
H1 @2.84,2.18 icon=đšïž proto=none
R0 -- H1
# AutoEdge=true, AdminEdge=true, bridge
S2 @2.18,2.84
R0 -- S2 R0:edge
# AutoEdge=true, AdminEdge=true, end device
H2 @1.58,3 icon=đ» proto=none
R0 -- H2 R0:edge
# AutoEdge=false, AdminEdge=true, bridge
S3 @0.68,2.76
R0 -- S3 R0:edge R0:no-auto-edge
# AutoEdge=false, AdminEdge=true, end device
H3 @0.24,2.32 icon=đ proto=none
R0 -- H3 R0:edge R0:no-auto-edge
# AutoEdge=false, AdminEdge=false, bridge
S4 @0,1.42
R0 -- S4 R0:no-auto-edge
# AutoEdge=false, AdminEdge=false, end device
H4 @0.16,0.82 icon=đș proto=none
R0 -- H4 R0:no-auto-edge
# Network port, bridge
S5 @0.82,0.16
R0 -- S5 R0:network S5:network
# Network port, end device
H5 @1.42,0 icon=â proto=none
R0 -- H5 R0:network
# AdminEdge=true, bpdu-guard=true, bridge
S6 @2.32,0.24
R0 -- S6 R0:bpdu-guard R0:edge
# AdminEdge=true, bpdu-guard=true, end device
H6 @2.76,0.68 icon=đĄ proto=none
R0 -- H6 R0:bpdu-guard R0:edge
Dans la topologie ci-dessus, S1, S2, S3, S4, S5 et S6 se comportent comme des ponts, tandis que H1, H2, H3, H4, H5 et H6 se comportent comme des Ă©quipements terminauxâŻ:
- S1 et H1 sont sur un port sans configurationâŻ: AutoEdge est vraie, AdminEdge est fausse,
- S2 et H2 sont sur un port oĂč AdminEdge est vraie,
- S3 et H3 sont sur un port oĂč AutoEdge est fausse et AdminEdge est vraie,
- S4 et H4 sont sur un port oĂč AutoEdge est fausse.
Si vous lancez la topologie et attendez une vingtaine de secondes, les liens vers S1, S2, S3, S4, H1, H2, H3 et H4 finissent par acheminer le trafic utilisateurâŻ: aucune de ces options nâa dâimportance.
Mais quâen est-il des deux derniĂšres pairesâŻ? S5 et H5 sont raccordĂ©s Ă un port de type network. Un tel port active une fonctionnalitĂ© propriĂ©taireâŻ: le bridge assurance. Le port Ă©met des BPDU quel que soit son rĂŽle. Sâil nâen reçoit aucune pendant 3 pĂ©riodes «âŻhelloâŻÂ» consĂ©cutives, il passe Ă lâĂ©tat de rejet. Sur le lien entre R0 et S5, vous pouvez voir des BPDU circuler dans les deux sens, contrairement aux autres liens, oĂč seuls les ports dĂ©signĂ©s en Ă©mettent.
S6 et H6 sont raccordĂ©s Ă un port oĂč AdminEdge est vraie et oĂč le BPDU guard est activĂ©. Il sâagit dâune autre fonctionnalitĂ© propriĂ©taire, qui dĂ©sactive un port sâil reçoit une BPDU.
En rĂ©sumĂ©, si vous attendez dâun port quâil soit un port dâextrĂ©mitĂ©, positionnez AdminEdge Ă vrai et activez le BPDU guard. Sinon, dĂ©clarez-le comme port network.
Pourquoi RSTP aujourdâhuiâŻ?
Un cas dâusage solide pour RSTP aujourdâhui est le rĂ©seau dâadministration hors bande (OOB) dâun centre de donnĂ©es, oĂč quelques secondes dâindisponibilitĂ© sont tolĂ©rables. La configuration est minimale et vous pouvez utiliser des commutateurs bon marchĂ©, comme un Cisco 2960X14. Deux commutateurs jouent le rĂŽle de ponts racines et plusieurs boucles raccordent les commutateurs prĂ©sents dans chaque baie. Cette conception simple survit Ă une panne sur chaque boucle15.
:protocol rstp
:tx-hold 10
# Root bridges
R1 @0,1 prio=0
R2 @0,2 prio=4096
R1 -- R2 cost=200 R1:network R2:network
R1 -- R2 cost=200 R1:network R2:network
# First loop
C1 @1,0 icon=đïž
C4 @2,0 icon=đïž
C7 @3,0 icon=đïž
C10 @4,0 icon=đïž
C12 @5,0 icon=đïž
C13 @5,3 icon=đïž
C15 @4,3 icon=đïž
C18 @3,3 icon=đïž
C21 @2,3 icon=đïž
C24 @1,3 icon=đïž
R1 -- C1 R1:network C1:network
C1 -- C4 C1:network C4:network
C4 -- C7 C4:network C7:network
C7 -- C10 C7:network C10:network
C10 -- C12 C10:network C12:network
C12 -- C13 C12:network C13:network
C13 -- C15 C13:network C15:network
C15 -- C18 C15:network C18:network
C18 -- C21 C18:network C21:network
C21 -- C24 C21:network C24:network
C24 -- R2 C24:network R2:network
# Second loop
C2 @1,0.5 icon=đïž
C5 @2,0.5 icon=đïž
C8 @3,0.5 icon=đïž
C11 @4,0.5 icon=đïž
C14 @4,2.5 icon=đïž
C17 @3,2.5 icon=đïž
C20 @2,2.5 icon=đïž
C23 @1,2.5 icon=đïž
R1 -- C2 R1:network C2:network
C2 -- C5 C2:network C5:network
C5 -- C8 C5:network C8:network
C8 -- C11 C8:network C11:network
C11 -- C14 C11:network C14:network
C14 -- C17 C14:network C17:network
C17 -- C20 C17:network C20:network
C20 -- C23 C20:network C23:network
C23 -- R2 C23:network R2:network
# Third loop
C3 @1,1 icon=đïž
C6 @2,1 icon=đïž
C9 @3,1 icon=đïž
C16 @3,2 icon=đïž
C19 @2,2 icon=đïž
C22 @1,2 icon=đïž
R1 -- C3 R1:network C3:network
C3 -- C6 C3:network C6:network
C6 -- C9 C6:network C9:network
C9 -- C16 C9:network C16:network
C16 -- C19 C16:network C19:network
C19 -- C22 C19:network C22:network
C22 -- R2 C22:network R2:network
La convergence prend environ 6 secondes. Chaque boucle doit rester petite (environ 16 ponts) pour rĂ©duire la probabilitĂ© dâune double panne et Ă©viter de partager trop de bande passante. Cette conception peut Ă©voluer un peu sans devenir trop complexeâŻ: un VLAN par boucle ou un domaine de pont par boucle.
Quelle taille pour un réseau�
LâĂąge maximal, dont la valeur par dĂ©faut est 20, dĂ©termine la distance maximale entre un nĆud et la racine. La topologie ci-dessous est trop grandeâŻ: les BPDU issues de R1 ne parviennent pas au-delĂ de S2016.
:protocol rstp
:tx-hold 10
:max-age 20
R1 @0,0 prio=4096 icon=đł
R2 @0,5 prio=4096 icon=đȘŸ
S1 @1,0
S2 @2,0
S3 @3,0
S4 @4,0
S5 @5,0
S6 @6,0
S7 @6,1
S8 @5,1
S9 @4,1
S10 @3,1
S11 @2,1
S12 @1,1
S13 @1,2
S14 @2,2
S15 @3,2
S16 @4,2
S17 @5,2
S18 @6,2
S19 @6,3
S20 @5,3
S21 @4,3
S22 @3,3
S23 @2,3
S24 @1,3
S25 @1,4
S26 @2,4
S27 @3,4
S28 @4,4
S29 @5,4
S30 @6,4
S31 @6,5
S32 @5,5
S33 @4,5
S34 @3,5
S35 @2,5
S36 @1,5
R1 -- S1
S1 -- S2
S2 -- S3
S3 -- S4
S4 -- S5
S5 -- S6
S6 -- S7
S7 -- S8
S8 -- S9
S9 -- S10
S10 -- S11
S11 -- S12
S12 -- S13
S13 -- S14
S14 -- S15
S15 -- S16
S16 -- S17
S17 -- S18
S18 -- S19
S19 -- S20
S20 -- S21
S21 -- S22
S22 -- S23
S23 -- S24
S24 -- S25
S25 -- S26
S26 -- S27
S27 -- S28
S28 -- S29
S29 -- S30
S30 -- S31
S31 -- S32
S32 -- S33
S33 -- S34
S34 -- S35
S35 -- S36
S36 -- R2
R1 -- R2 cost=200 down
Une fois la topologie stabilisĂ©e, une partie du rĂ©seau considĂšre R1 comme racine et lâautre partie vote pour R2. Ă la frontiĂšre, S20 tente de dĂ©marrer une synchronisation avec S21 pour faire passer son port dĂ©signĂ© Ă lâĂ©tat de transmission. Sa BPDU ressemble Ă ceciâŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x4e, Agreement, Port Role: Designated, Proposal
Root Identifier: 4096.02:00:00:00:00:00
Root Path Cost: 400000
Bridge Identifier: 32768.02:00:00:00:00:15
Port identifier: 0x8002
Message Age: 20
Max Age: 20
S21 la rejette car lâĂąge du message est Ă©gal Ă lâĂąge maximal. De son cĂŽtĂ©, la BPDU que S21 envoie Ă S20 ressemble Ă ceciâŻ:
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x7c, Agreement, Forwarding, Learning, Port Role: Designated
Root Identifier: 4096.02:00:00:00:00:01
Root Path Cost: 320000
Bridge Identifier: 32768.02:00:00:00:00:16
Port identifier: 0x8001
Message Age: 16
Max Age: 20
Cela ne suffit pas Ă changer le port racine de S20, car S20 dispose dâun
identifiant de racine plus faibleâŻ: 4096.02:00:00:00:00:00 contre
4096.02:00:00:00:00:01.
RĂ©parer le lien entre R1 et R2 rĂ©sout le problĂšme. LâĂąge de message maximal transportĂ© par un paquet est dĂ©sormais de 18, en dessous de lâĂąge maximal configurĂ©. Mais cela ne fonctionne que jusquâĂ la rupture dâun autre lien. Une correction possible consiste Ă porter lâĂąge maximal Ă 4017.
RSTP est-il rapide�
RSTP converge en gĂ©nĂ©ral en quelques secondes au dĂ©marrage. Il rĂ©pare souvent un arbre en moins dâune seconde. MĂȘme la topologie Ă 38 ponts converge en moins de 10 secondes18. Certaines topologies mettent un peu plus de temps Ă se rĂ©tablir quand la racine devient indisponible19.
:protocol rstp
R0 @1,0 prio=0
S1 @1,1 prio=4096
S2 @0,2 prio=8192
S3 @2,2
R0 -- S1
S1 -- S2
S2 -- S3
S3 -- S1
Dans la topologie ci-dessus, lancez la simulation, attendez la convergence, arrĂȘtez-la, puis coupez le lien entre R0 et S1. La topologie est dĂ©jĂ optimale, mais RSTP peine Ă converger de nouveau.
Dâabord, S1 perd son port racine. Il nâa plus aucune information sur R0 et se proclame racine. Il conserve ses ports vers S2 et S3 comme ports dĂ©signĂ©s Ă lâĂ©tat de transmission. Avancez dâun cranâŻ: il envoie une BPDU Ă S2 et Ă S3 pour les informer du changement de racine. Ă sa rĂ©ception, S2 accepte S1 comme racine, car il ne connaĂźt pas de meilleure racine sur un autre port. Il Ă©lit le port vers S1 comme port racine. Lâautre port reste un port dĂ©signĂ©. Aucun des deux ports ne change dâĂ©tat.
Ă la rĂ©ception de la BPDU de S1, S3 se comporte diffĂ©remmentâŻ: il connaĂźt R0 comme une meilleure racine que S1 grĂące Ă son port alternatif vers S2. Il promeut ce port en port racine et rĂ©trograde le port vers S1 en port dĂ©signĂ©, ce qui nĂ©cessite un nouvel accord. Avancez dâun cranâŻ: S3 envoie une proposition Ă S1 avec R0 comme racine. S1 Ă©lit R0 comme racine et promeut son port vers S3 en port racine.
Lors de la mĂȘme sĂ©quence, S3 reçoit aussi une BPDU de S2 affirmant que S1 est la racine. S3 nâa donc plus aucun port annonçant R0 comme racineâŻ: il Ă©lit S1 comme racine et son port vers S2 comme port racine. Avancez dâun cranâŻ: sa BPDU suivante vers S1 contient cette information et S1 sâĂ©lit de nouveau racine. Mais lors de la mĂȘme vague, S1 envoie une proposition Ă S2 avec R0 comme racine. Alors que S1 et S3 sâaccordent sur le fait que S1 est la racine, S2 croit dĂ©sormais que câest R0âŻ! Ă son tour, S2 convainc de nouveau S3 que R0 est la racine, S3 convainc S1, S1 convainc S2 et S2 convainc S3.
Cela pourrait durer indĂ©finiment, mais ce nâest pas le cas. Les BPDU affirmant «âŻR0 est la racineâŻÂ» finissent par se pĂ©rimer lorsque lâĂąge du message dĂ©passe lâĂąge maximal. Dans lâexemple ci-dessus, Ă la onziĂšme seconde, S2 envoie une BPDU Ă S3 avec R0 comme racine, mais S3 la jette car elle a atteint lâĂąge maximal. Avec un peu de chance, la convergence peut aussi ĂȘtre plus rapide si un port cesse de transmettre des BPDU aprĂšs avoir atteint le nombre maximal autorisĂ© par secondeâŻ: il sâagit du transmit hold count, dont la valeur par dĂ©faut est 6.
Ă propos de MSTP
MSTP est la version «âŻcompatible VLANâŻÂ» de RSTPâŻ: il exĂ©cute plusieurs instances de RSTP et permet dâassocier chaque VLAN Ă une instance donnĂ©e. Par exemple, vous pouvez rattacher les VLANâŻ100 Ă 200 Ă une premiĂšre instance et les VLANâŻ300 Ă 400 Ă une seconde. Les VLAN restants sont rattachĂ©s Ă une instance spĂ©ciale appelĂ©e Internal Spanning Tree (IST). MSTP apporte sa propre complexitĂ©, mais lâidĂ©e est de disposer de plusieurs topologies logiques indĂ©pendantes. Pour creuser le sujet, jetez un Ćil à «âŻMSTP Tutorial Part I: Inside a RegionâŻÂ».
Ă propos des exemples interactifs
Les exemples interactifs exĂ©cutent MSTPD directement dans votre navigateur, compilĂ© en WebAssembly avec emscripten. Une API C remplace le code qui dialogue avec le noyau LinuxâŻ: elle gĂšre les ponts et les ports, exporte lâĂ©tat en JSON et fait avancer le temps de maniĂšre dĂ©terministe. Une surcouche JavaScript la rend plus agrĂ©able Ă utiliserâŻ:
import { loadMSTPD } from "./dist/mstpd.mjs";
const mstp = await loadMSTPD();
// Crée 3 ponts
const a = mstp.createBridge("A", { priority: 4096 });
const b = mstp.createBridge("B", { priority: 8192 });
const c = mstp.createBridge("C");
// Chaque pont a deux ports
const a1 = a.addPort("a-b", { portno: 1 });
const a2 = a.addPort("a-c", { portno: 2 });
const b1 = b.addPort("b-a", { portno: 1 });
const b2 = b.addPort("b-c", { portno: 2 });
const c1 = c.addPort("c-a", { portno: 1 });
const c2 = c.addPort("c-b", { portno: 2 });
// Construit une topologie en triangle
mstp.link(a1, b1);
mstp.link(a2, c1);
mstp.link(b2, c2);
// Active tous les ponts et tous les ports
for (const br of [a, b, c]) br.enable();
for (const p of [a1, a2, b1, b2, c1, c2]) p.enable();
// Exécute 40 secondes de temps réel et affiche la topologie
mstp.step(40);
console.log("Topology:", mstp.topology());
Plusieurs dizaines de tests unitaires explorent les fonctionnalitĂ©s de MSTPD et vĂ©rifient quâelles se comportent correctement dans cet environnementâŻ:
$ node --test *.test.mjs
â two bridges: lower priority becomes root (41.657342ms)
â triangle loop: exactly one port blocks and all agree on the root (5.832ms)
â breaking the active link reconverges and restoring recovers (18.730753ms)
[âŠ]
âč tests 40
âč pass 40
âč fail 0
[âŠ]
âč duration_ms 396.190897
Du code JavaScript supplémentaire recherche les blocs <pre> contenant une
définition de topologie et les transforme en composant interactif. Vous pouvez
inspecter et modifier la dĂ©finition en cliquant sur le bouton «âŻeditâŻÂ».
Il y a aussi une astuce pour dĂ©terminer si la topologie a convergĂ©. AprĂšs chaque pas, nous enregistrons un instantanĂ© de la mĂ©moire de la simulation, jouons 50 secondes en accĂ©lĂ©rĂ© pour vĂ©rifier que la topologie est stable, puis remontons le temps en restaurant cet instantanĂ©. đ°ïž
Le code complet se trouve sur GitHub. Je suis trĂšs satisfait du rĂ©sultat. Il peut ĂȘtre difficile de suivre tout ce qui se passe Ă chaque Ă©tape, mais la possibilitĂ© dâavancer et reculer aide beaucoup. Je compte rĂ©utiliser cette approche dans de prochains articles.
Note
Michael Lynch a relu une premiĂšre version de la version anglaise de cet article. Il est lâauteur de «âŻRefactoring EnglishâŻÂ», un livre pour amĂ©liorer votre Ă©criture en anglaisâŻ: articles de blog, documentation, messages de commit et tutoriels. Les erreurs restantes sont les miennesâŻ!
-
STP a Ă©tĂ© introduit dans IEEEâŻ802.1D-1990. Il est encore prĂ©sent dans IEEEâŻ802.1D-1998, mais il a Ă©tĂ© retirĂ© dâIEEEâŻ802.1D-2004 au profit de RSTP, introduit dans IEEEâŻ802.1w-2001. MSTP est apparu dans IEEEâŻ802.1s-2002 avant dâĂȘtre intĂ©grĂ© Ă IEEEâŻ802.1Q-2003. Tous deux font partie dâIEEEâŻ802.1Q-2022, aux cĂŽtĂ©s de SPB,
un protocole dont je nâavais jamais entendu parler avant dâĂ©crire cet article. ⩠-
Ă partir dâici, jâemploie le terme «âŻpontâŻÂ» plutĂŽt que le mot plus courant «âŻcommutateurâŻÂ». â©
-
MSTPD implĂ©mente la machine Ă Ă©tats dâIEEEâŻ802.1Q-2005, mais sous Linux, il ne fait tourner que RSTP. LinuxâŻ5.18 a ajoutĂ© la prise en charge de la commutation pour plusieurs arbres recouvrants, mais MSTPD ne lâutilise pas encore. Consultez la PR #150 pour suivre les avancĂ©es sur ce point. â©
-
Le noyau Linux ne gĂšre que STP. Il dĂ©lĂšgue les autres protocoles Ă lâespace utilisateur. â©
-
La prioritĂ© est un multiple de 4âŻ096âŻ: avec MSTP, les 12 bits de poids faible de la prioritĂ© du pont encodent lâidentifiant de lâinstance MST, ne laissant que les 4 bits de poids fort pour la prioritĂ© configurĂ©e. â©
-
Pour inspecter les BPDU qui circulent sur un lien, sĂ©lectionnez-le, cliquez sur le bouton «âŻDownload packetsâŻÂ», puis ouvrez le fichier avec Wireshark. â©
-
Un port de secours nâexiste que si le pont possĂšde plusieurs ports sur le mĂȘme domaine de collision. Cela ne devrait pas se produire dans un rĂ©seau commutĂ©. â©
-
Câest la valeur du temporisateur «âŻhelloâŻÂ». Elle Ă©tait autrefois configurable, mais IEEEâŻ802.1Q-2005 la fixe Ă 2. MSTPD nâautorise pas dâautre valeur. â©
-
Si un port ne reçoit pas dâaccord Ă lâexpiration du temporisateur «âŻhelloâŻÂ» (ou de lâĂąge maximal si le port vient tout juste dâĂȘtre activĂ©), il se rabat sur la mĂ©thode Ă base de temporisateurs, par compatibilitĂ© avec STPâŻ: il passe Ă lâĂ©tat dâapprentissage, attend de nouveau lâexpiration du temporisateur «âŻhelloâŻÂ», puis passe Ă lâĂ©tat de transmission. â©
-
Comme dans beaucoup de propositions, S3 positionne aussi le bit dâaccord Ă 1. Le bit de proposition signifie «âŻje suis le port dĂ©signĂ© sur ce lien et je veux passer Ă lâĂ©tat de transmissionâŻÂ». Le bit dâaccord signifie «âŻje suis dĂ©jĂ synchronisĂ© avec le reste de mon pont sur cette information de racineâŻÂ». Les deux peuvent ĂȘtre vrais en mĂȘme temps. â©
-
Sâil ne trouve aucune entrĂ©e, le pont duplique la trame Ethernet sur tous les ports, sauf celui dâentrĂ©e. Il en va de mĂȘme si lâadresse MAC de destination est lâadresse de diffusion (
ff:ff:ff:ff:ff:ff). Ce comportement amorce le processus dâapprentissage. ⩠-
Ce temporisateur rend RSTP rĂ©sistant Ă la perte de paquets. â©
-
Vous pouvez en trouver dâoccasion pour moins de 100âŻâŹ. Tous les ports utilisent PVST+ par dĂ©faut et basculent automatiquement vers RSTP classique. â©
-
Une solution de rechange serait lâEthernet Ring Protection Switching (ERPS), un autre protocole dont je nâavais jamais entendu parler avant de me documenter pour cet article. â©
-
Si vous observez attentivement ce qui se passe Ă t=2s, vous verrez que R2 gagne en popularitĂ© comme racineâŻ: S17 Ă S36 croient que R2 est la racine. S16 ne suit pas car nous atteignons lâĂąge maximal. Plus tard, S17 Ă S20 changent dâavis. Je vous laisse explorer lâĂ©tat des diffĂ©rents ponts pour en comprendre la cause. â©
-
En portant lâĂąge maximal Ă 40, vous devez aussi augmenter le dĂ©lai de transmission Ă 21 (
:forward-delay 21), car le standard impose la condition suivanteâŻ: 2 Ă (Forward Delay â 1) â„ Max Age. Pour cette topologie prĂ©cise, vous pourriez aussi porter lâĂąge maximal Ă 37 et le dĂ©lai de transmission Ă 20. ⩠-
La simulation peut sembler lente, mais elle ne tourne pas en temps rĂ©el. Regardez lâhorodatage dans le coin supĂ©rieur droit pour connaĂźtre le temps Ă©coulĂ©, par exemple «âŻt=8sâŻÂ». Une fois la topologie stabilisĂ©e, ce mĂȘme coin affiche le temps de convergence, par exemple «âŻđł 2sâŻÂ». â©
-
Khaled Elmeleegy, Alan Cox et Eugene Ng ont formalisĂ© ce phĂ©nomĂšne dans «âŻOn Count-to-Infinity Induced Forwarding Loops in Ethernet NetworksâŻÂ», puis dans «âŻUnderstanding and Mitigating the Effects of Count to Infinity in Ethernet NetworksâŻÂ». Ils proposent une correction qui nâa jamais trouvĂ© sa place dans un standard. â©
24 August, 2026 03:00PM by Vincent Bernat








Le travail en profondeur (deep work en anglais) est lâĂ©norme oubliĂ© de lâactivitĂ© sur site. Ătant donnĂ© lâorganisation actuelle des bureaux, il nâest aujourdâhui possible (quasiment) quâen tĂ©lĂ©travail.
Pour rappel, le travail en profondeur sâincarne dans des plages de temps de travail ininterrompues, de 1h Ă 4h. Vous commencez Ă voir le problĂšme.
Impossible de se concentrer dans un open space. Les discussions au tĂ©lĂ©phone incessantes vous en empĂȘchent. Des rĂ©unions dĂ©marrent tous les demi-heures, parfois tous les quarts dâheure, et viennent briser votre concentration.
Entre les deux, des collĂšgues discutent de diffĂ©rents projets, mais aussi de la pluie et du beau temps sous votre nez, vous interpellent directement sâils ont une question, perturbant les calculs complexes que vous Ă©tiez laborieusement en train dâessayer de mener Ă leur terme.
Ă midi, câest le grand dĂ©part, des groupes se joignent, il faut courir pour manger avec untel ou unetelle, ou on vient vous chercher sans vergogne Ă votre bureau, sans se soucier du rythme de travail qui est nĂ©cessaire pour mener Ă bien votre Ă©tude en cours.
Bien sĂ»r, tous les mĂ©tiers nâont peut-ĂȘtre pas besoin de travail en profondeur. Les mĂ©tiers rĂ©actifs, ou on se met en avant en rĂ©agissant Ă tout ce qui se passe dans lâentreprise (et souvent Ă rien), sont ceux qui permettent dâĂȘtre le plus visible et donc de se mettre en avant. Mais beaucoup le nĂ©cessitent. Le dĂ©veloppement dâapplications, la conception dâarchitecture complexe, et sĂ»rement beaucoup dâautres demandent un travail en profondeur pour ĂȘtre menĂ© Ă bien et dans les meilleures conditions.
Et vous ? Comment gĂ©rez-vous vos plages de travail en profondeur ? Vous y arrivez sur site ou vous attendez vos jours de tĂ©lĂ©travail ? Dites moi tout en commentaires 
Je suis architecte infrastructure cloud (AWS et Azure) senior freelance, adepte du tĂ©lĂ©travail et du travail en profondeur, et conçois les infrastructures dont vous avez besoin pour faire tourner les services IT de vos entreprises. Disponible pour une nouvelle mission dĂšs mi-janvier 2026. NâhĂ©sitez pas Ă me contacter si je peux vous aider dans vos projets.















































Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je lâĂ©cris pour 









Les trolls, une activité prisée des Libristes

Lâoctocat, mascotte de Github
Windows, qui reste le logiciel privateur par excellence, mĂȘme si dâautres lâont depuis rejoint
Lâuniforme Ă©voque lâarmĂ©e, ici lâarmĂ©e des clones


FreeBSD, principal projet des BSD sous licence BSD
Issues, le suivi de bug propriétaire de Github
Debian, lâun des principaux projets du Logiciel Libre avec autour de 1000 contributeurs officiels

Le « lion » devant la cheminée
Premiers pas plutÎt festifs le vendredi soir avec le SysAdmin Day dans un bar à Manhattan puis direction Brooklyn pour une Debian Party organisée par
Câest donc le dimanche 1er aoĂ»t que commence la DebConf avec des prĂ©sentations orientĂ©es grand public pour cette premiĂšre journĂ©e appelĂ©e le âDebian Dayâ. Un
DeuxiĂšme jour, on a le droit Ă un
TroisiĂšme jour et lâon dĂ©bute par un
Le quatriĂšme jour, câest le Day Trip. Il sâagit classiquement dâune journĂ©e consacrĂ©e Ă des activitĂ©s touristiques extĂ©rieures. Nous avons Ă©tĂ© visiter lâĂ©glise Trinity Church Ă Manhattan oĂč le drame du 11 septembre 2001 a mis un superbe orgue hors dâusage, remplacĂ© temporairement par un orgue Ă©lectronique âPowered by Linuxâ⊠qui a finalement Ă©tĂ© conservĂ© en raison de sa qualitĂ©. Keith Packard, lâun des gourous de X.org employĂ© chez Intel, a jouĂ© quelques minutes sur cet orgue. Ensuite, direction la plage de Coney Island. Puis un match de baseball oĂč Stefano Zacchiroli lancera la premiĂšre balle du match.
CinquiĂšme jour, on reprend avec un
SixiÚme jour, on débute par
SeptiĂšme et dernier jour, encore de nombreuses prĂ©sentations. Jâai notamment assistĂ© Ă celle de Philippe Kern, membre de la Release Team, qui