Ethernet
Introduction
Depuis quelques décennies, ethernet est le protocole de choix pour faire fonctionner un réseau local, que ce soit à la maison ou en entreprise. Il peut fonctionner aussi bien en mode filaire (en général sous la forme du câble réseau RJ45) que sans fil (le Wifi). Dans cet article j'essaierai d'expliquer son fonctionnement, pour un ?lectorat? qui n'a pas de connaissances en réseau (il est par contre préférable - même si pas obligatoire - de connaître les bases de comptage binaire et hexadécimal.
Cet article n'abordera pas la partie physique, c'est à dire les différents types de câbles, de fibres optiques ou les différentes normes de wifi pouvant supporter ethernet. On prend pour acquis qu'on a un media qui nous permet de transférer des bits d'une machine à une autre. Les explications qui vont suivre fonctionnent peu importe le média utilisé.
Objectifs d'ethernet :
- faire fonctionner un réseau local d'échelle limitée (entre 2 et quelques centaines voire milliers de machines)
- sans configuration requise ("plug and play")
Fonctionnement :
Les machines connectées entre elles au réseau s'envoient des messages découpés en petits paquets (appellées "trames", ou "frames" en anglais), d'une taille maximum de 1518 octets. Si on veut envoyer plus de 1518 octets de données, on découpera le message en autant de trames que nécessaire. Du point de vue du réseau ethernet en tout cas, la seule structure qui existe est la trame, peu importe qu'elle fasse partie d'une longue conversation ou non, chaque trame est traitée indépendamment des autres.
Adressage :
Chaque machine a une adresse qui l'identifie de façon unique sur le réseau, nommée adresse MAC (pour Media Access Control).
Une adresse MAC est codée sur 48 bits et est représentée en hexadécimal, le plus souvent avec des signes de ponctuation pour aider la lecture. Par exemple sous Linux la commande "ip link show" nous montre :
link/ether 1c:6f:65:cb:d8:47
Sous Windows, la commande "ipconfig /all" nous montre :
Physical Address. . . . . . . . . : AC-2B-6E-13-47-A3
Le format d'affichage varie un peu, mais en tout cas il s'agit bien de 12 caractères hexadécimaux (donc 48 bits). Cette adresse MAC est assignée en usine par le constructeur de l'ordinateur ou de la carte réseau, et il n'y a pas lieu de la modifier ensuite.
Il existe également une adresse spéciale, ff:ff:ff:ff:ff:ff, dite adresse de diffusion (ou de broadcast), qu'on utilise quand on souhaite envoyer une trame à toutes les machines du réseau.
Une machine sait donc qu'une trame lui est destinée si cette dernière est adressée soit à sa propre adresse MAC, soit à ff:ff:ff:ff:ff:ff.
Format d'une trame :
Pour envoyer une trame sur le réseau, l'ordinateur la construit avec les éléments suivants :
- Adresse MAC du destinataire
- Adresse MAC de l'émetteur
- Type des données
- Les données en elles-mêmes
- Somme de contrôle
L'adresse MAC destinataire a deux fonctions : - faire en sorte que toute machine qui recevra la trame puisse déterminer si elle lui est destinée ou non - permettre aux équipements qui vont acheminer la trame de l'envoyer dans la bonne direction (nous y reviendrons plus bas)
L'Adresse MAC émetteur permet au destinataire de savoir qui lui a envoyé une trame au cas où il voudrait lui répondre (c'est souvent le cas).
Type de données (ou Ethertype) : indique le type des données contenues dans la trame. C'est important de le préciser car sans cela le destinataire n'aurait aucun moyen de savoir comment interprêter les données, et ne pourrait donc rien faire de la trame. Le type de données est un code sur 16 bits (représenté en général avec 4 caractères hexadécimaux), et la liste de correspondance entre tous les codes possibles et leur signification est publique, ainsi tous les ordinateurs (du monde) la connaissent. Chaque protocole fonctionnant sur un réseau ethernet a son propre code. Par exemple, IP a le code 0800, ARP a le code 0806, IPv6 a le code 86DD.
Données : Ce sont les données qu'on cherche à transmettre. Dans le cadre du fonctionnement d'ethernet, leur contenu n'a aucune importance (de la même façon que le contenu des lettres n'a aucune importance pour la Poste qui les achemine).
Somme de contrôle : c'est un code issu d'une fonction de hachage, qui permet de vérifier rapidement que la trame (y compris son contenu) n'a pas été altérée pendant son transport. Cela a la même fonction que les derniers chiffres d'un code de carte bancaire ou ceux d'un identifiant de sécurité sociale.
Le switch
Le switch (ou commutateur), est l'équipement qui permet de relier les ordinateurs entre eux, c'est une sorte de multiprise ethernet. Les switchs existent sous diverses formes et peuvent avoir entre 4 et plusieurs centaines de prises ethernet. Les box internet fournies par les fournisseurs d'accès à internet sont également un switch (entre autres fonctions). Les points d'accès wifi fonctionnent également comme des switchs (sauf qu'on s'y connecte en choisissant le réseau et en entrant le mot de passe au lieu de brancher un câble).
Le switch reçoit donc les trames envoyées par les ordinateurs connectés, et a pour rôle de les transmettre à leur destinataire. Pour l'aider dans cette tâche, il dispose d'une mémoire (également appellée "Table MAC") qui garde les correspondances entre les adresses MAC des différentes machines connectées, et le port sur lequel elles sont.
A chaque fois qu'un switch reçoit une trame, il applique l'algorithme suivant : 1- regarder l'adresse MAC source de la trame, et si c'est la première fois que je la vois, l'ajouter à ma mémoire avec le numéro de port sur lequel est est arrivée 2- regarder l'adresse MAC destination de la trame, et la chercher dans ma mémoire pour trouver sur quel port l'envoyer 3- si j'ai trouvé le port lors de ma recherche dans ma mémoire, envoyer la trame sur ce port. Sinon tant pis, envoyer la trame sur tous les ports (sauf le port depuis lequel arrive la trame puisque si la machine destinataire est de ce côté, elle a sûrement déjà reçu la trame).
Dans le cas où l'adresse de destination est l'adresse de broadcast dont on a parlé plus haut, l'étape 2 est ignorée et la trame est directement envoyée sur tous les ports.
Quelques remarques sur le fonctionnement du switch : - la seule source d'informations du switch pour remplir table MAC sont les trames qu'il voit passer et leur adresse MAC source. Il n'a pas de moyen de communiquer directement avec les machines pour leur demander leur adresse MAC par exemple. - le switch n'a pas besoin d'avoir une adresse MAC lui-même pour fonctionner, puisqu'il ne communique pas avec les machines (il n'envoie pas de trames de lui-même) - lors du traitement d'une trame, le switch ne modifie pas cette dernière, il se contente de lire ce qui l'intéresse et de retransmettre la trame telle quelle vers sa destination - pour ne pas que la table MAC du switch grossisse indéfiniment, les adresses MAC qui n'ont pas envoyé de trames depuis un certain temps (quelque minutes) sont supprimées de la mémoire.
Il est possible de raccorder plusieurs switchs (ou points d'accès wifi) entre eux pour faire un réseau plus grand, et rien de plus n'est nécessaire pour que cela fonctionne. C'est une des grandes forces d'ethernet : il est très simple. Les switchs apprennent les informations dont ils ont besoin (les correspondances ports/adresse MAC) automatiquement au fur et à mesure qu'ils reçoivent des trames à traiter, sans nécessiter de configuration. Ils n'ont pas besoin de savoir à l'avance ce qui est branché sur leurs ports : que ce soit une seule machine ou un autre switch avec plusieurs machines branchées dessus n'a pas d'importance, la manière de traiter les trames ne change pas.
Boucles réseau
Quand on connecte plusieurs switchs entre eux, il faut faire attention à ce qu'ils ne soient connectés que par un seul chemin. Pour illustrer le problème, imaginons deux switchs S1 et S2 reliés l'un à l'autre par deux câbles, chacun sur les ports 1 et 2. Dès que S1 recevra une trame de broadcast (ou une trame à destination d'une adresse qu'il ne connaît pas dans sa mémoire) :
- il la réemettera sur tous les ports, y compris les ports 1 et 2 en direction du switch S2
- S2 recevra donc deux copies de la trame. Pour lui ce sont deux trames distinctes, chaque trame étant traitée indépendamment des autres
- S2 réémettra la trame en provenance de son port 1 sur tous ses ports, y compris le port 2 ; et de la même façon il réemettra la trame reçue sur son port 2 tous tous ses ports, y compris le port 1
- S1 recevra à son tour deux copies de la trame, et fera la même chose. A ce stade on se rend compte que les trames circuleront dans le réseau indéfiniment, jusqu'à le surcharger complètement.
Ce phénomène se produit dès le moment où une boucle existe sur le réseau, qu'il s'agisse de deux switchs connectés par deux câbles comme dans notre exemple, trois switchs raccordés en triangle, ou n'importe quel autre montage plus compliqué. Pour qu'un réseau ethernet fonctionne correctement, il ne doit donc contenir aucune boucle. Dit autrement, toute trame allant d'une machine à une autre ne doit avoir qu'un seul chemin possible. Une conséquence de cela est que s'il ne peut pas y avoir de redondance dans les liens entre les switchs, chaque lien devient critique au bon fonctionnement du réseau. Toute coupure d'un lien scindera le réseau en deux parties qui ne pourront plus communiquer l'une avec l'autre. Pour un réseau d'une certaine taille, tomber en panne dès que le moindre câble est endommagé ou débranché par erreur n'est souvent pas satisfaisant.
Spanning Tree
Pour limiter le problème lié aux boucles réseau, le protocole Spanning Tree a été inventé. Je ne vais pas le décrire en détail, mais voici en gros son mode de fonctionnement :
- Chaque switch émet régulièrement des paquets spanning-tree sur tous ses ports pour informer les switchs voisins de sa présence
- Les switchs se coordonnent pour que tous les liens redondants du réseau soient désactivés. Sur ces liens désactivés, aucune trame ne sera transmise (à l'exception des trames spanning-tree)
- Si un lien actif venait à être coupé, un lien précedemment désactivé serait réactivé automatiquement pour que les trames puissent toujours transiter d'un bout à l'autre du réseau.
Quelques remarques :
- Les machines ne jouent aucun rôle dans ce processus, ce sont uniquement les switchs qui échangent et décident entre eux. C'est une nouveauté par rapport à ethernet classique dans lequel les switchs n'émettaient aucune trame eux-mêmes et se contentaient de transmettre les trames qu'ils reçoivent
- Désactiver des liens fait que les trames n'emprunteront souvent pas le chemin le plus court physiquement, et devront parfois faire tout le tour du réseau avant d'arriver à destination. Sur un réseau avec deux switchs ce n'est pas gênant, mais plus le nombre de switchs augmente, plus cela devient inefficace.
Bilan : avantages et inconvénients d'Ethernet
Nous avons vu comment fonctionne un réseau Ethernet, quel est le bilan ? Tout d'abord, et c'est probablement la raison de son succès, c'est un protocole très simple :
- aucune configuration nécessaire, ni pour les machines ni pour les switchs
- les données sont transmises par des trames ayant une structure simple, chaque trame est indépendante des autres, les switchs n'ont donc que très peu d'opérations à faire pour traiter les trames
- le réseau peut être étendu simplement en branchant plus de switchs ou de points d'accès, là non plus aucune configuration n'est nécessaire
Mais Ethernet a également des limitations. Les trames émises en broadcast posent une contrainte forte sur la topologie physique du réseau, soit toute boucle est interdite (fonctionnent de base), soit (avec spanning-tree) les boucles sont physiquement permises mais tous les liens redondants sont désactivés, ce qui mène à un routage inefficace des trames sur un réseau avec un grand nombre de switchs. Les trames broadcast posent un autre problème : puisqu'elles sont transmises à toutes les machines, plus le nombre de machines augmente, plus le traffic de broadcast est important sur tous les liens, et plus les machines reçoivent de paquets broadcast qui ne les concernent pas forcément.
Les réseaux Ethernet sont donc voués à rester d'une taille limitée, rarement plus de quelques milliers de machines.
Et après ?
Maintenant que nous avons une technologie permettant de faire très facilement des réseaux de petite taille, on pourrait inventer un protocole qui permet de relier entre eux plusieurs (et si possible un grand nombre) de réseaux ethernet. Le cahier des charges serait :
- La possibilité d'avoir tous les liens utilisables simultanément même s'ils forment des boucles
- Mais toujours garantir que même en cas de problème, aucune donnée ne circulera indéfiniment dans le réseau
- Utiliser le chemin le plus court pour aller de la source à la destination
- Rester simple, si l'ambition est d'avoir un réseau avec plus d'un milliard de machines il faudra veiller, comme pour ethernet, à ce que chaque équipement réseau garde un fonctionnement assez basique et n'ait pas à connaitre l'entièreté du réseau pour pouvoir fonctionner
Ce sont les objectifs d'IP (Internet Protocol), sur lequel est basé internet, qui fera peut-être l'objet d'un article futur.