Aller au contenu principal
reseauEthernet et la commutation

Ethernet et la commutation

Ce que ce chapitre apporte

  • Nommer les champs d'une trame Ethernet et dire à quoi chacun sert.
  • Expliquer pourquoi une trame ne peut pas faire moins de 64 octets ni plus de 1518.
  • Décrire la structure d'une adresse MAC et délimiter sa portée.
  • Expliquer comment un commutateur remplit sa table d'adresses, et ce qu'il fait tant qu'elle est vide.
  • Comparer les trois modes de transfert et dire lequel choisir selon la situation.
  • Expliquer ce qu'un commutateur ne protège pas, et pourquoi sa table est une cible.

Le chapitre précédent a montré comment plusieurs machines se partagent un fil, et à quel prix. Ce chapitre montre l'équipement qui a rendu ce partage inutile. Un commutateur ne se configure pas pour savoir où sont les machines : il l'apprend seul, en écoutant, et il l'apprend d'une seule façon. Cette façon est contre-intuitive, et tout le reste en découle, y compris ce qui arrive quand elle est mise en défaut.

Trois choses à distinguer dans ce chapitre : ce que contient une trame, ce que représente une adresse MAC, et ce qu'un commutateur en fait. Les trois sont liées, mais confondre les deux dernières est l'erreur la plus fréquente à ce niveau.

La trame Ethernet

Une trame Ethernet est une enveloppe de taille connue autour d'une charge de taille variable. Elle porte quatre champs de service et un contrôle final.

ChampTailleRôle
Préambule et délimiteur8 octetsSynchroniser l'horloge du récepteur, avant la trame proprement dite
Adresse MAC destination6 octetsÀ qui la trame s'adresse, sur ce réseau local
Adresse MAC source6 octetsQui l'émet, sur ce réseau local
Type2 octetsCe que contient la charge : 0x0800 pour IPv4, 0x86DD pour IPv6, 0x0806 pour ARP
Données46 à 1500 octetsLa charge utile, complétée par du bourrage si elle est plus courte
FCS4 octetsUn CRC calculé sur toute la trame, qui permet au récepteur de la jeter si elle est abîmée

Le préambule n'est pas compté dans la taille de la trame : il précède la trame et sert seulement à réveiller le récepteur. Restent 18 octets de service, 14 devant et 4 derrière, autour d'une charge comprise entre 46 et 1500 octets.

Le champ Type n'est pas une taille. Il indique quel protocole se trouve dans la charge, et c'est ce qui permet à IPv4, IPv6 et ARP de circuler sur la même carte réseau sans se mélanger. Une carte qui ne saurait pas lire ce champ devrait deviner, et ne pourrait porter qu'un seul protocole à la fois.

Les deux bornes de taille ne viennent pas du même endroit. La borne haute, 1500 octets, est un choix de compromis entre le rendement et le temps qu'une trame monopolise le support. La borne basse, elle, a été démontrée au chapitre précédent : une trame de moins de 64 octets pourrait finir avant qu'une collision ne revienne.

main.py
Sortie
>_ Prêt à exécuter…

Une trame qui ne transporte que 20 octets utiles en occupe 64 sur le câble : moins d'un tiers de ce qui passe sert à quelque chose. C'est le prix des petits échanges, et c'est pourquoi un réseau qui transporte beaucoup de très petits messages travaille loin de son débit nominal, sans qu'aucun équipement ne soit en cause.

L'adresse MAC

Adresse MAC

Une adresse MAC est un identifiant de 48 bits attribué à une interface réseau, écrit en douze chiffres hexadécimaux. Sa portée est strictement locale : elle sert à désigner une machine sur un même réseau, et ne franchit jamais un routeur.

Les 48 bits se lisent en deux moitiés. Les 24 premiers bits identifient le constructeur, et sont attribués par l'IEEE : c'est l'OUI. Les 24 suivants sont laissés au constructeur, qui les attribue à ses interfaces. Deux cartes du même fabricant partagent donc leur première moitié d'adresse, ce qui se voit à l'œil nu dans une capture.

Deux bits du premier octet portent un sens particulier, et ce sont eux qui distinguent les trois façons d'adresser une trame.

main.py
Sortie
>_ Prêt à exécuter…

La dernière adresse de la liste commence par 02, dont le bit d'administration locale vaut 1 : elle est administrée localement, et n'appartient à aucun constructeur. C'est ce que fait une machine virtuelle ou un conteneur, qui se fabrique une adresse plutôt que d'en recevoir une.

Une adresse MAC ne dit pas où est la machine, seulement laquelle c'est. Elle ne contient aucune information de position, aucune hiérarchie, aucun préfixe exploitable pour choisir un chemin. C'est exactement pour cela qu'un autre système d'adressage a été nécessaire par-dessus, et c'est le sujet du chapitre 5.

Ce qu'un commutateur apprend

Un concentrateur recopie sur tous ses ports ce qui arrive sur l'un d'eux. Un commutateur fait mieux, mais il ne dispose au démarrage d'aucune information : sa table est vide, et personne ne la remplit à sa place.

Il l'apprend en lisant l'adresse source de chaque trame qui entre. Une trame qui arrive sur le port 2 en provenance de aaaa.aaaa.0002 prouve que cette machine est joignable par le port 2, et c'est la seule chose qu'elle prouve. L'adresse destination, elle, n'apprend rien : elle désigne une machine dont on ignore encore tout.

Deux conséquences en découlent, et la figure suivante les montre mieux qu'une définition.

trame 1 sur 5
COMMUTATEURGi0/1PC1aaaa.aaaa.0001Gi0/2PC2aaaa.aaaa.0002Gi0/3PC3aaaa.aaaa.0003PC1PC2

Table d'adresses, après la trame 1

adresseport
aaaa.aaaa.0001PC1Gi0/1

Entrée créée par l'adresse source de cette trame, et par elle seule.

inondationPC1PC2(la première requête)entrée sur Gi0/1, sortie sur Gi0/2, Gi0/3 : destination inconnue : la trame part partout, faute de mieux.

  • 1 trame sur 5 part sur tous les ports faute de savoir où est la destination, la dernière étant la trame 1. Ensuite, le commutateur en sait assez.
  • La table compte 1 entrée à cet instant, pour 3 ports : elle ne se remplit qu'au rythme des machines qui parlent, jamais de celles dont on parle.
La table se remplit du côté de l'émetteur, jamais du côté du destinataire. Avancer trame par trame pour voir l'inondation cesser d'elle-même.

Tant qu'il ignore, il inonde. Une trame dont la destination n'est pas dans la table part sur tous les ports sauf celui d'où elle vient. Ce n'est pas un défaut mais le seul comportement qui garantisse la livraison : mieux vaut déranger tout le monde que perdre la trame.

La première réponse suffit à tout changer. La réponse de PC2 entre par le port 2 et porte PC2 en source : le commutateur la range, et la trame suivante vers PC2 ne part plus que sur un port. Une conversation commence donc toujours par une inondation, et une seule.

La quatrième trame de la figure mérite un arrêt. Une diffusion ne s'adresse à personne en particulier, et pourtant elle renseigne le commutateur aussi bien qu'une trame ordinaire, puisqu'elle porte elle aussi une adresse source. C'est ce qui explique qu'un réseau réel n'inonde presque jamais : les protocoles bavards du démarrage ont déjà tout appris au commutateur.

Vieillissement

Chaque entrée porte un compteur, remis à zéro à chaque trame reçue de cette adresse. Passé un délai d'inactivité, souvent de 300 secondes, l'entrée est effacée.

Sans ce vieillissement, une machine débranchée resterait indéfiniment associée à son ancien port, et les trames qui lui sont destinées partiraient dans le vide. Avec lui, la table oublie ce qui ne parle plus, et une machine rebranchée ailleurs se signale d'elle-même dès sa première trame. C'est ce que montre la variante suivante.

trame 1 sur 4
COMMUTATEURGi0/1Portableaaaa.aaaa.0001Gi0/2Serveuraaaa.aaaa.0002Gi0/3librePortableServeur

Table d'adresses, après la trame 1

adresseport
aaaa.aaaa.0001PortableGi0/1

Entrée créée par l'adresse source de cette trame, et par elle seule.

inondationPortableServeur(la conversation habituelle)entrée sur Gi0/1, sortie sur Gi0/2, Gi0/3 : destination inconnue : la trame part partout, faute de mieux.

  • 1 trame sur 4 part sur tous les ports faute de savoir où est la destination, la dernière étant la trame 1. Ensuite, le commutateur en sait assez.
  • La table compte 1 entrée à cet instant, pour 3 ports : elle ne se remplit qu'au rythme des machines qui parlent, jamais de celles dont on parle.
  • 1 entrée change de port en cours de route, sans aucune intervention : une seule trame émise depuis la nouvelle prise suffit.
Un déplacement ne se configure pas. La première trame émise depuis la nouvelle prise corrige l'entrée, et la réponse suivante prend le bon port.

Les trois modes de transfert

La question est de savoir à quel moment le commutateur commence à réémettre une trame : dès qu'il en a lu assez pour choisir un port, ou seulement après l'avoir reçue en entier.

Store-and-forward. Le commutateur reçoit toute la trame, vérifie son FCS, puis la réémet. Une trame abîmée est détruite au lieu d'être propagée, et le mode est obligatoire dès que les deux ports n'ont pas le même débit, puisqu'il faut bien stocker ce qui arrive plus vite qu'il ne peut sortir.

Cut-through. Le commutateur réémet dès qu'il a lu les 6 octets de l'adresse destination. La latence est minimale, mais le FCS arrive trop tard : une trame abîmée est déjà partie.

Fragment-free. Un compromis : le commutateur attend les 64 premiers octets. C'est exactement la taille au-dessous de laquelle une trame ne peut être qu'un débris de collision. Il élimine donc les fragments, sans attendre le reste.

main.py
Sortie
>_ Prêt à exécuter…

L'écart est réel mais borné : au pire une douzaine de microsecondes sur un lien gigabit. À comparer à la latence d'un réseau étendu, qui se compte en millisecondes, soit mille fois plus. Le cut-through se justifie donc là où ces microsecondes comptent vraiment, dans une salle de marché ou un cluster de calcul, et le store-and-forward partout ailleurs, parce qu'il ne propage pas les erreurs.

Ce que le commutateur ne protège pas

La table d'adresses est une ressource finie, de quelques milliers à quelques dizaines de milliers d'entrées. Une machine qui émet des trames avec des adresses source inventées, très vite, la remplit entièrement. À partir de là, plus aucune adresse légitime ne peut y être rangée, et le commutateur fait ce qu'il a toujours fait quand il ignore : il inonde.

Le résultat est un commutateur qui se comporte comme un concentrateur, et un réseau où tout le trafic redevient lisible par n'importe quel poste. L'attaque ne casse rien et ne laisse pas d'équipement en panne : elle exploite exactement le comportement décrit plus haut.

La parade tient en une idée : limiter le nombre d'adresses apprises par port. Un port d'accès dessert un poste, donc une ou deux adresses ; au-delà, le port se ferme ou refuse d'apprendre. S'y ajoutent les mesures d'accès à l'équipement lui-même, à savoir la désactivation des ports inutilisés et un accès d'administration chiffré plutôt qu'en clair.

Un commutateur n'est pas un dispositif de sécurité. Il livre la trame au bon port dans le cas normal, et c'est tout ce qu'il promet. Il ne chiffre rien, ne vérifie l'identité de personne, et cesse d'isoler le trafic dès que sa table est saturée. Ce qui sépare vraiment deux groupes de machines sur un même commutateur est le sujet du chapitre 8.

Exercices type

Exercice 1 : une capture montre que la toute première trame d'un échange est reçue par trois machines, alors qu'elle est adressée à une seule. Le commutateur est-il en panne ?

Afficher la solution

Non, c'est le fonctionnement normal.

La destination n'était pas encore dans la table d'adresses, faute d'avoir jamais émis. Le commutateur a donc inondé, c'est-à-dire recopié la trame sur tous les ports sauf celui d'entrée.

Ce qui doit attirer l'attention, c'est la suite : à partir de la réponse, la destination est apprise et les trames suivantes ne devraient plus partir que sur un port. Si l'inondation continue au-delà des premières trames, alors il y a bien quelque chose à chercher, du côté d'une table saturée ou d'un vieillissement mal réglé.

Exercice 2 : un poste est déplacé d'une prise à une autre sans être éteint. Faut-il intervenir sur le commutateur ?

Afficher la solution

Non. Dès que le poste émet une trame depuis sa nouvelle prise, le commutateur lit son adresse source, constate qu'elle était associée à un autre port, et corrige l'entrée.

L'apprentissage par la source rend le déplacement transparent, et c'est précisément l'intérêt du mécanisme : aucune configuration ne décrit où sont les machines, donc aucune configuration n'est à reprendre quand elles bougent.

Le seul cas gênant est un poste qui ne dit rien après son déplacement. Les trames qui lui sont destinées continuent alors de partir sur l'ancien port jusqu'à ce que le vieillissement efface l'entrée.

Exercice 3 : un poste est relié à un lien gigabit, un serveur à un lien 100 Mbit/s, sur le même commutateur. Le mode cut-through est-il utilisable entre les deux ?

Afficher la solution

Non, et c'est une impossibilité physique et non un choix de configuration.

Le cut-through consiste à réémettre pendant qu'on reçoit encore. Cela suppose que la sortie évacue au moins aussi vite que l'entrée n'arrive. Ici les octets arrivent dix fois plus vite qu'ils ne peuvent partir : il faut bien les stocker quelque part en attendant.

Toute traversée entre deux ports de débits différents impose donc le store-and-forward. C'est aussi le cas le plus fréquent dans un réseau réel, où les liens vers les serveurs et les liens entre commutateurs sont plus rapides que les liens vers les postes.

Exercice 4 : sur un commutateur d'accès, l'administrateur constate que toutes les trames sont visibles depuis n'importe quel port. Les compteurs de collisions sont à zéro. Que chercher ?

Afficher la solution

Le zéro de collisions écarte d'emblée l'hypothèse d'un support partagé : les liens sont bien en full-duplex, et il ne s'agit pas d'un concentrateur oublié dans l'armoire.

Reste la table d'adresses. Si elle est pleine, le commutateur ne peut plus ranger aucune destination et inonde tout, en permanence. Deux vérifications le confirment : le nombre d'entrées occupées, comparé à la capacité de l'équipement, et le nombre d'adresses distinctes vues sur un même port. Un port d'accès qui en présente des milliers désigne la source.

La remédiation est double. Dans l'immédiat, isoler le port fautif. Ensuite, limiter le nombre d'adresses apprises par port, pour que le même envoi ne puisse plus saturer la table.

Vérification rapideon peut se reprendre

1.Que lit un commutateur pour remplir sa table d'adresses ?

2.Que fait un commutateur d'une trame dont la destination est inconnue ?

3.Pourquoi une trame Ethernet ne peut-elle pas faire moins de 64 octets ?

4.Quelle est la portée d'une adresse MAC ?

5.Deux ports de débits différents doivent échanger une trame. Quel mode s'impose ?

6.À quoi sert le champ FCS d'une trame ?

7.Que se passe-t-il quand la table d'adresses d'un commutateur est saturée ?

La méthode

  1. Distinguer une inondation normale d'une inondation permanente : la première cesse à la première réponse, la seconde signale une table saturée.
  2. Lire l'adresse source, pas la destination, pour savoir ce que le commutateur a appris.
  3. Vérifier le nombre d'adresses vues par port avant de soupçonner l'équipement lui-même.
  4. Compter le service de 18 octets par trame avant de conclure qu'un débit utile est anormal.
  5. Choisir le store-and-forward par défaut, et le cut-through seulement là où les microsecondes se justifient.
  6. Limiter les adresses apprises par port sur tout port d'accès, et désactiver les ports inutilisés.

Synthèse

  • Une trame Ethernet porte 18 octets de service autour de 46 à 1500 octets de charge, soit 64 à 1518 octets sur le câble.
  • Le champ Type dit ce que contient la charge, ce qui permet à plusieurs protocoles de partager la même carte.
  • Une adresse MAC identifie une interface sur 48 bits, ne franchit pas un routeur, et ne dit rien de la position de la machine.
  • Un commutateur apprend par l'adresse source, inonde ce qu'il ne connaît pas, et oublie ce qui se tait.
  • La première réponse d'une conversation met fin à l'inondation ; une diffusion renseigne le commutateur tout autant.
  • Les trois modes de transfert échangent de la latence contre du contrôle d'erreur, et des débits différents imposent le store-and-forward.
  • Une table saturée ramène le commutateur au comportement d'un concentrateur : c'est une faiblesse de conception, pas une panne.