🔌 Diagnostic rĂ©seau OT/IT · au shell Linux

Chapitre 08
L'anneau MRP

Objectifs du chapitre

1. Pourquoi un anneau

Une ligne cĂąblĂ©e « en Ă©toile » a un talon d'Achille : chaque cĂąble est un point unique de dĂ©faillance. Coupe le lien entre deux switches et tout ce qui est derriĂšre tombe. En automatisme, oĂč un arrĂȘt de production coĂ»te cher, on prĂ©fĂšre cĂąbler les switches en boucle : chaque switch a deux chemins vers le reste du rĂ©seau. Si un cĂąble lĂąche, le trafic emprunte l'autre sens. C'est la redondance mĂ©dia.

Mais une boucle physique de commutateurs, laissĂ©e telle quelle, est une catastrophe : une trame broadcast tourne indĂ©finiment et sature le rĂ©seau en quelques millisecondes — la fameuse tempĂȘte de boucle. Il faut donc un protocole qui garde la boucle physiquement fermĂ©e (pour la redondance) tout en la maintenant logiquement ouverte (pour Ă©viter la tempĂȘte). CĂŽtĂ© Siemens, ce protocole est MRP — Media Redundancy Protocol, normalisĂ© IEC 62439-2.

Dans un anneau MRP, un switch joue le rĂŽle de MRM (Media Redundancy Manager) — ici SW-A (192.168.0.240) — et tous les autres sont des MRC (Media Redundancy Clients) — SW-B (.241) et SW-C (.242). Chaque switch dĂ©die deux ports Ă  l'anneau, ses ring ports. L'astuce est lĂ  : en fonctionnement normal, le MRM bloque logiquement l'un de ses deux ring ports. L'anneau est bien un cercle de cĂąbles, mais du point de vue du trafic c'est une ligne ouverte Ă  un endroit — chez le manager. Aucune trame ne fait le tour.

Anneau FERMÉ — normal port bloquĂ© SW-A MRM SW-B MRC SW-C MRC Anneau OUVERT — guĂ©ri ✂ dĂ©bloquĂ© ✓ SW-A MRM SW-B MRC SW-C MRC
Figure 8.1. À gauche, l'anneau en fonctionnement normal : le MRM (SW-A) tient l'un de ses deux ring ports bloquĂ© (croix rouge). La boucle est fermĂ©e physiquement, mais le trafic circule en ligne, jamais en rond. À droite, un cĂąble a lĂąchĂ© entre SW-B et SW-C : le MRM dĂ©bloque son port secondaire et le passage est rĂ©tabli. Le procĂ©dĂ© continue — mais la redondance est maintenant consommĂ©e.

Retiens l'image d'un anneau MRP sain : le manager garde toujours un port fermĂ©. Le trafic ne tourne jamais en rond. Un anneau oĂč « tout passe partout » n'est pas un anneau redondant, c'est une boucle non protĂ©gĂ©e — et tu le sentiras vite passer.

2. Les trames de test MRP

Comment le MRM sait-il que sa boucle est intacte ? Il ne fait pas confiance Ă  l'Ă©tat des liens vu port par port : il teste le tour complet. PĂ©riodiquement, le MRM Ă©met une trame MRP_Test par chacun de ses deux ring ports — donc dans les deux sens de l'anneau. Ces trames portent l'Ethertype 0x88E3 et sont envoyĂ©es en multicast ; les MRC les relaient de proche en proche sans les traiter.

Ce « prĂ©venir tout le monde » se fait avec des trames MRP_TopologyChange : le MRM ordonne aux MRC de vider leur table d'adresses MAC, sans quoi les switches continueraient Ă  envoyer le trafic vers l'ancien chemin, dĂ©sormais mort. On croise aussi des MRP_LinkChange (LinkUp/LinkDown), qu'un MRC Ă©met vers le MRM pour signaler qu'un de ses ring ports vient de changer d'Ă©tat — c'est souvent ce qui dĂ©clenche la reconfiguration avant mĂȘme que les MRP_Test ne manquent.

Les ordres de grandeur Ă  avoir en tĂȘte :

ParamĂštreValeur typiqueRemarque
PĂ©riode des MRP_Test~20 mspar ring port ; configurable
Reconfiguration MRP standard< 200 msclasse par dĂ©faut IEC 62439-2
MRP « rapide » (Siemens)~10–30 mspĂ©riode de test rĂ©duite, matĂ©riel compatible
Ethertype0x88E3toutes trames MRP

Le nombre de switches dans l'anneau compte : plus l'anneau est grand, plus une trame MRP_Test met de temps Ă  faire le tour, et plus la reconvergence sera lente. La classe MRP (200 ms vs rapide) et le nombre de nƓuds sont deux paramĂštres que l'on confronte Ă  la mesure au §6.

3. Observer MRP avec tshark

Tout se joue sur l'Ethertype 0x88E3. On filtre Ă  la capture (filtre BPF ether proto) et on affiche le dissecteur mrp :

# Capturer uniquement les trames MRP sur l'interface machine
sudo tshark -i eth0 -f 'ether proto 0x88E3' -Y mrp

Sur un anneau sain, on obtient un flux rĂ©gulier de MRP_Test, deux « pistes » qui alternent (une par ring port du MRM), espacĂ©es d'environ 20 ms :

# Anneau FERMÉ : MRP_Test rĂ©guliers, rien d'autre
$ sudo tshark -i eth0 -f 'ether proto 0x88E3' -Y mrp
  1  0.000000  Siemens_A0:24:0a → MRP-Test  MRP  60  MRP_Test, Prio 40960, Ring closed
  2  0.019987  Siemens_A0:24:0a → MRP-Test  MRP  60  MRP_Test, Prio 40960, Ring closed
  3  0.040012  Siemens_A0:24:0a → MRP-Test  MRP  60  MRP_Test, Prio 40960, Ring closed
  4  0.059998  Siemens_A0:24:0a → MRP-Test  MRP  60  MRP_Test, Prio 40960, Ring closed
  5  0.080003  Siemens_A0:24:0a → MRP-Test  MRP  60  MRP_Test, Prio 40960, Ring closed

Une seule MAC source (celle du MRM, SW-A), un intervalle stable, l'Ă©tat Ring closed : c'est exactement ce qu'on veut voir. Maintenant, dĂ©branchons un cĂąble d'anneau et regardons la coupure :

# Instant de la coupure : rafale de LinkChange puis TopologyChange
$ sudo tshark -i eth0 -f 'ether proto 0x88E3' -Y mrp
 42  0.840010  Siemens_A0:24:0a → MRP-Test    MRP  60  MRP_Test, Ring closed
 43  0.851203  Siemens_B1:07:c2 → MRP-Ctrl    MRP  60  MRP_LinkChange, LinkDown
 44  0.851560  Siemens_A0:24:0a → MRP-Ctrl    MRP  60  MRP_TopologyChange, Interval 20
 45  0.853102  Siemens_A0:24:0a → MRP-Ctrl    MRP  60  MRP_TopologyChange, Interval 20
 46  0.856050  Siemens_A0:24:0a → MRP-Ctrl    MRP  60  MRP_TopologyChange, Interval 20
 47  0.860018  Siemens_A0:24:0a → MRP-Test    MRP  60  MRP_Test, Ring open
 48  0.880004  Siemens_A0:24:0a → MRP-Test    MRP  60  MRP_Test, Ring open

La sĂ©quence est lisible : un MRC (SW-B) signale un LinkDown, le MRM Ă©met aussitĂŽt une salve de MRP_TopologyChange (pour purger les tables MAC), dĂ©bloque son port, et ses MRP_Test repartent en Ring open. AprĂšs la rĂ©paration physique du cĂąble, on verrait la sĂ©quence miroir : LinkUp, nouvelle salve de TopologyChange, retour en Ring closed.

Un flot continu de MRP_TopologyChange — pas une salve isolĂ©e, mais des rafales qui reviennent toutes les quelques secondes — n'est pas une coupure franche : c'est un anneau qui « flappe ». Un cĂąble Ă  moitiĂ© enfichĂ©, un connecteur RJ45 oxydĂ©, un SFP fatiguĂ© : le lien monte et tombe sans arrĂȘt, et le MRM reconfigure en boucle. À corrĂ©ler avec les compteurs d'erreurs de port du chapitre 2 (ethtool -S, CRC/carrier).

4. DĂ©tecter l'anneau ouvert — la faute silencieuse

Voici le point le plus important du chapitre. Quand une coupure survient, MRP fait son travail : en moins de 200 ms (souvent bien moins), le passage est rĂ©tabli et le procĂ©dĂ© continue de tourner. Aucun voyant rouge sur la machine, aucun arrĂȘt, aucune alarme process Ă©vidente. Tout va bien
 en apparence.

Sauf que la redondance a Ă©tĂ© consommĂ©e. L'anneau est dĂ©sormais ouvert : il ne reste qu'un seul chemin. Une seconde faute — un autre cĂąble, un autre switch qui redĂ©marre — et cette fois il n'y a plus de secours : c'est l'arrĂȘt de production. L'anneau ouvert est donc une faute silencieuse mais critique : elle ne fait pas de bruit, mais elle a mis l'installation Ă  un pas du gouffre.

« Le procĂ©dĂ© tourne » ne veut pas dire « l'anneau est sain ». Un anneau ouvert produit exactement le mĂȘme comportement machine qu'un anneau fermĂ© — jusqu'Ă  la deuxiĂšme panne. Ne te fie jamais Ă  l'absence d'alarme process pour juger de l'Ă©tat de la redondance : il faut aller la lire explicitement.

Deux façons de la dĂ©busquer :

La lecture SNMP de la MRP-MIB (snmpget/snmpwalk sur mrpRingState) est dĂ©taillĂ©e au chapitre 10. Retiens ici l'idĂ©e : interroger le MRM (192.168.0.240) pour obtenir open/closed est la façon la plus fiable et la moins intrusive de surveiller la redondance en continu.

Dans TIA Portal, le rĂŽle (MRP Manager / Client), le domaine MRP et les deux ring ports de chaque switch sont configurĂ©s dans les propriĂ©tĂ©s « Media redundancy » de l'appareil. Le CPU peut aussi remonter une alarme de diagnostic « redondance perdue » quand l'anneau s'ouvre : si elle existe et qu'elle est cĂąblĂ©e vers la supervision, c'est le meilleur signal. Le shell reste utile pour vĂ©rifier la rĂ©alitĂ© quand cette alarme n'a pas Ă©tĂ© configurĂ©e — ce qui est frĂ©quent.

5. Reconstituer la topologie de l'anneau

Pour raisonner sur l'anneau, il faut connaĂźtre son ordre physique : quel switch est voisin de quel switch, et par quels ports. On ne le devine pas depuis le plan d'adressage IP (l'ordre des adresses ne dit rien du cĂąblage). On le lit avec LLDP (chapitre 3), qui expose chaque voisinage physique port par port.

$ lldpctl SW-A | grep -A2 -E 'Interface|SysName'
Interface:    port-1, via: LLDP
  Chassis:  SysName: SW-B
Interface:    port-2, via: LLDP
  Chassis:  SysName: SW-C

En croisant les voisinages des trois switches, on reconstitue la boucle :

# Voisinage LLDP consolidé (qui parle à qui, par quel port)
SW-A port-1 ─── port-2 SW-B       ← ring port
SW-B port-1 ─── port-2 SW-C       ← ring port
SW-C port-1 ─── port-2 SW-A       ← ring port  → la boucle se referme

La boucle se referme sur elle-mĂȘme : A → B → C → A. Les deux ports par lesquels chaque switch participe Ă  cette boucle sont ses ring ports ; tous les autres ports mĂšnent Ă  des Ă©quipements terminaux (CPU, ET 200SP, poste de diagnostic .71) et ne comptent pas dans l'anneau. Avec ce schĂ©ma en main, une trame LinkDown vue au §3 se localise immĂ©diatement : « SW-B a perdu son port-2 » dĂ©signe prĂ©cisĂ©ment le cĂąble SW-B ↔ SW-C.

Dessine l'anneau une fois, Ă  froid, quand tout va bien, et garde-le. Le jour d'un incident, tu ne veux pas reconstruire la topologie sous pression : tu veux juste pointer le lien mort sur un schĂ©ma dĂ©jĂ  connu. La sortie LLDP consolidĂ©e fait un excellent document de rĂ©fĂ©rence d'armoire.

6. Mesurer la reconvergence

La thĂ©orie annonce « < 200 ms » ou « ~20 ms en rapide ». Mais ce qui compte vraiment, c'est le trou vu par le procĂ©dĂ© : pendant combien de temps le cyclique Profinet (chapitre 7) s'est-il rĂ©ellement interrompu ? On le mesure en capturant en parallĂšle les trames Profinet RT et l'Ă©vĂ©nement MRP, sur le mĂȘme horodatage.

# Capturer cÎté cyclique : trames Profinet RT (0x8892) + MRP (0x88E3)
sudo tshark -i eth0 -f 'ether proto 0x8892 or ether proto 0x88E3' \
     -T fields -e frame.time_relative -e eth.type -e _ws.col.Info

On dĂ©branche un cĂąble d'anneau (sur banc !), on laisse tourner quelques secondes, on rebranche, puis on cherche le plus grand Ă©cart entre deux trames RT consĂ©cutives — c'est le trou :

# Extrait autour de la coupure — on isole le cyclique (0x8892)
1.203  0x8892  RT_CLASS_1  ...        # dernier échange avant la coupure
1.204  0x88e3  MRP_LinkChange, LinkDown
1.205  0x88e3  MRP_TopologyChange
... trou : plus aucune 0x8892 ...
1.271  0x8892  RT_CLASS_1  ...        # reprise du cyclique

Ici, derniĂšre trame RT Ă  1.203 s, reprise Ă  1.271 s : le procĂ©dĂ© a subi un trou de ~67 ms. On compare cette valeur Ă  deux rĂ©fĂ©rences : la classe MRP configurĂ©e (67 ms est cohĂ©rent avec une classe 200 ms, largement dans les clous), et le temps de surveillance du device Profinet (le watchdog, typiquement 3 Ă— la pĂ©riode cyclique). Tant que le trou reste sous le watchdog, le device ne dĂ©clare pas de dĂ©faut de communication et le procĂ©dĂ© ne bronche pas. S'il le dĂ©passe, on verrait une coupure Profinet franche — et lĂ , la reconvergence MRP est trop lente pour la pĂ©riode cyclique choisie.

Couper un cĂąble d'anneau, c'est consommer la redondance volontairement : pendant tout l'essai, l'installation n'a plus de secours. Sur un banc de test, aucun souci — c'est mĂȘme l'essai Ă  faire pour valider la classe MRP. En production, on ne dĂ©branche pas un ring port pour « voir » : on lit l'Ă©tat par SNMP et on planifie ce test pendant un arrĂȘt.

Pour trouver le trou automatiquement plutĂŽt qu'Ă  l'Ɠil, filtre le seul cyclique et calcule les deltas inter-trames avec awk :

$ sudo tshark -i eth0 -f 'ether proto 0x8892' -T fields -e frame.time_relative \
   | awk 'NR>1{d=$1-p; if(d>max){max=d}} {p=$1} END{printf "trou max = %.1f ms\n", max*1000}'
trou max = 67.4 ms

Récapitulatif

Exercices

Exercice 1 — PĂ©riode des MRP_Test et Ă©tat de l'anneau

On te fournit une capture filtrĂ©e sur 0x88E3. Voici les premiĂšres lignes :

1  0.000000  Siemens_A0:24:0a  MRP_Test, Ring closed
2  0.020015  Siemens_A0:24:0a  MRP_Test, Ring closed
3  0.039992  Siemens_A0:24:0a  MRP_Test, Ring closed
4  0.060008  Siemens_A0:24:0a  MRP_Test, Ring closed

DĂ©termine la pĂ©riode des MRP_Test et l'Ă©tat de l'anneau. Comment distinguerais-tu, dans une telle capture, un anneau stable d'un anneau en cours de reconfiguration ?

Voir la solution

Les horodatages sont espacĂ©s d'environ 20 ms (0.020, 0.040, 0.060
) : c'est la pĂ©riode de test. Toutes les trames portent Ring closed et une seule MAC source (le MRM) : l'anneau est fermĂ© et stable, la redondance est disponible.

Un anneau en cours de reconfiguration se trahirait par : (a) l'apparition de MRP_TopologyChange et/ou MRP_LinkChange au milieu des MRP_Test, et (b) le basculement de l'Ă©tat de test en Ring open. Si l'Ă©tat reste durablement Ring open aprĂšs la salve, l'anneau est restĂ© ouvert (redondance consommĂ©e, cf. §4) — Ă  corrĂ©ler avec l'Ă©tat SNMP du switch.

Exercice 2 — Anneau sain ou anneau qui flappe ?

Deux captures de 30 s, comptĂ©es par type de trame MRP :

# Capture X
MRP_Test          1500
MRP_TopologyChange   0

# Capture Y
MRP_Test          1490
MRP_TopologyChange  84

Laquelle correspond Ă  un anneau sain ? Que se passe-t-il dans l'autre, et par quoi le confirmes-tu cĂŽtĂ© couche 1 ?

Voir la solution

Capture X est saine : uniquement des MRP_Test rĂ©guliers, zĂ©ro TopologyChange sur 30 s — l'anneau n'a pas bougĂ©.

Capture Y montre 84 TopologyChange en 30 s, soit des rafales rĂ©currentes : l'anneau flappe. Un lien monte et tombe sans cesse, et le MRM reconfigure en boucle. Cause probable cĂŽtĂ© L1 : cĂąble mal enfichĂ© ou endommagĂ©, RJ45/connecteur oxydĂ©, SFP dĂ©faillant, ou perturbation CEM. On le confirme avec les compteurs de port du chapitre 2 :

$ ethtool -S eth0 | grep -iE 'crc|carrier|error'
     rx_crc_errors: 2417
     carrier_changes: 168

Des carrier_changes qui grimpent et des erreurs CRC en hausse pointent le port fautif ; LLDP (§5) permet de nommer le cĂąble exact (ex. SW-B port-2 ↔ SW-C) Ă  remplacer.

Exercice 3 — Mesurer le temps de reconvergence

Sur un banc, tu captures en parallÚle le Profinet cyclique (0x8892) et le MRP (0x88E3), puis tu débranches un cùble d'anneau. Propose la commande de capture, et explique comment tu obtiens le temps réel d'interruption vu par le procédé.

Voir la solution

Capturer les deux Ethertypes avec horodatage :

sudo tshark -i eth0 -f 'ether proto 0x8892 or ether proto 0x88E3' \
     -T fields -e frame.time_relative -e eth.type -e _ws.col.Info

Le trou = le plus grand Ă©cart entre deux trames RT (0x8892) consĂ©cutives, encadrant la salve MRP. On l'extrait automatiquement en ne gardant que le cyclique :

$ sudo tshark -i eth0 -f 'ether proto 0x8892' -T fields -e frame.time_relative \
   | awk 'NR>1{d=$1-p; if(d>max)max=d} {p=$1} END{printf "trou = %.1f ms\n", max*1000}'
trou = 67.4 ms

On compare ce ~67 ms Ă  : (1) la classe MRP configurĂ©e (ici cohĂ©rent avec 200 ms, marge confortable) ; (2) le watchdog Profinet du device (souvent 3 Ă— la pĂ©riode cyclique). Tant que le trou < watchdog, le device ne dĂ©clare aucun dĂ©faut et le procĂ©dĂ© ne s'en aperçoit pas. Si le trou dĂ©passait le watchdog, la reconvergence MRP serait trop lente pour cette pĂ©riode cyclique : il faudrait passer en MRP rapide ou allonger le watchdog.