Comment un commutateur sait-il où envoyer une trame ?
Un commutateur qui apprend retient, pour chaque adresse MAC, le port par lequel elle est arrivée. Il peut ainsi envoyer chaque trame vers le bon port, au lieu de l’envoyer partout.
Quand une salle de TP branche 30 postes sur un commutateur neuf, personne ne le configure. Au bout de quelques trames, il connaît chaque poste et le réseau devient plus calme.
À la fin de cette leçon
Remarque
Je peux expliquer comment un commutateur apprend sur quel port se trouve une adresse MAC.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Adresse MAC | le numéro unique d’une carte réseau | 00:00:00:00:00:01 |
| Trame | un paquet de la couche Ethernet, avec adresses source et destination | |
| Table d’apprentissage | la liste adresse MAC et port que le commutateur construit | |
| Inondation | envoyer la trame sur tous les ports sauf celui d’entrée | |
| Adresse source | l’adresse de la machine qui envoie la trame | |
| Adresse destination | l’adresse de la machine à qui la trame est destinée |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Il apprend en lisant l’adresse source
Chaque trame porte l’adresse de celui qui l’envoie. Quand une trame arrive par un port, le commutateur sait que cette machine est derrière ce port.
Il l’écrit dans sa table d’apprentissage : adresse MAC, puis port. Si la même machine arrive plus tard par un autre port, il remplace l’entrée.
Il décide en lisant l’adresse destination
Pour choisir où envoyer la trame, le commutateur cherche l’adresse destination dans sa table. S’il la trouve, il envoie la trame sur ce seul port.
S’il ne la connaît pas encore, il fait une inondation : il l’envoie sur tous les ports sauf celui d’entrée. La réponse de la cible lui apprendra où elle est.
Exemple travaillé : quatre trames, une table qui grandit
| Trame | Il apprend | Il cherche | Il fait |
|---|---|---|---|
| A vers B, entrée par le port 1 | A est au port 1 | B : inconnue | Inondation |
| B vers A, entrée par le port 2 | B est au port 2 | A : port 1 | Envoi au port 1 |
| C vers A, entrée par le port 3 | C est au port 3 | A : port 1 | Envoi au port 1 |
| A vers C, entrée par le port 1 | A est toujours au port 1 | C : port 3 | Envoi au port 3 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un commutateur ordinaire montre sa table
Un commutateur Open vSwitch dont l’action est NORMAL se comporte comme un commutateur ordinaire : il apprend tout seul. On construit un commutateur d’essai, appr, pour regarder sa table sans toucher au reste.
fdb/show affiche la table d’apprentissage. Une trace ne reçoit aucune trame réelle : elle n’apprend donc rien. Pour simuler l’apprentissage, on ajoute une entrée à la main, marquée static.
Créer le commutateur appr
sudo ovs-vsctl --if-exists del-br appr -- add-br appr -- set bridge appr datapath_type=system protocols=OpenFlow13 fail-mode=secure -- add-port appr a1 -- set interface a1 type=internal ofport_request=1 -- add-port appr a2 -- set interface a2 type=internal ofport_request=2 -- add-port appr a3 -- set interface a3 type=internal ofport_request=3Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le rendre ordinaire
printf 'priority=1,actions=NORMAL\n' | sudo ovs-ofctl -O OpenFlow13 replace-flows appr -Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire sa table d’apprentissage
sudo ovs-appctl fdb/show apprAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une trame vers une adresse inconnue
sudo ovs-appctl ofproto/trace appr in_port=1,dl_src=aa:00:00:00:00:01,dl_dst=aa:00:00:00:00:02 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Simuler : la machine 02 est au port 2
sudo ovs-appctl fdb/add appr a2 0 aa:00:00:00:00:02Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Relire la table
sudo ovs-appctl fdb/show apprAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La même trame, destination connue
sudo ovs-appctl ofproto/trace appr in_port=1,dl_src=aa:00:00:00:00:01,dl_dst=aa:00:00:00:00:02 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Et la trame de retour ?
sudo ovs-appctl ofproto/trace appr in_port=2,dl_src=aa:00:00:00:00:02,dl_dst=aa:00:00:00:00:01 | grep -A 2 "^ 0\."Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent que le commutateur apprend l’adresse destination. Il ne peut pas : il ne sait pas encore où elle est. Il apprend l’adresse source, car il sait par quel port la trame vient d’arriver. Il cherche ensuite la destination dans ce qu’il a appris.