« Les réseaux informatiques/La couche liaison » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
mAucun résumé des modifications
Ligne 46 : Ligne 46 :
|}
|}


[[File:MAC-48 Address.svg|centre|vignette|upright=2.0||MAC-48 Address]]
[[File:MAC-48 Address.svg|centre|vignette|upright=2.0|MAC-48 Address]]


==La fiabilité des transmissions==
==La fiabilité des transmissions==

Version du 13 avril 2018 à 11:51

Comme dit dans le chapitre précédent, un réseau local est un réseau contenant peu d'ordinateurs, qui sont reliés entre eux par des câbles réseaux, des routeurs ou des switchs. Sur un réseau local, les données sont échangées sous la forme de paquets de données de taille fixe. Ces paquets sont émis par un ordinateur, et se propagent dans le réseau local jusqu’à l'ordinateur de destination. Ces paquets de données sont appelés des trames. La couche liaison prend donc en charge plusieurs fonctionnalités, qu'on peut regrouper en trois grandes fonctions : l'encapsulation des données envoyés sur le réseau et la détection/correction des erreurs de transmission.

L'encapsulation des trames

Le codage des trames indique comment l'émetteur doit envoyer les données sur le bus, ce qui permet aux récepteurs de détecter les données transmises et les interpréter. Le terme trame réfère aux données transmises : toutes les informations nécessaires pour une transmission sont regroupées dans ce qu'on appelle une trame qui est envoyée telle quelle sur le bus. Une trame doit fournir plusieurs informations. Premièrement, le codage des trames doit permettre une synchronisation des équipements réseaux, qui ne fonctionnent pas forcément à la même vitesse. Cela se fait par la transmission d'un signal de synchronisation ou signal d'horloge dans les trames. Enfin, la trame doit contenir toutes les données de la transmission, et de quoi contrôler celle-ci : indiquer les récepteurs, dire quand commence la transmission et quand elle se termine, etc.

Le codage du début et de la fin de transmission

Une transmission est un flux de bits qui a un début et une fin : le codage des trames doit indiquer quand commence une transmission et quand elle se termine. Le récepteur ne reçoit en effet qu'un flux de bits, et doit détecter le début et la fin des trames. Ce processus de segmentation d'un flux de bits en trames n’est cependant pas simple et l'émetteur doit fatalement ajouter des bits pour coder le début et la fin de la trame. De nos jours, la quasi-totalité des protocoles utilisent la même technique pour délimiter le début et la fin d'une trame. Ils utilisent un octet spécial (ou une suite d'octet), qui indique le début de la trame, et un autre octet pour la fin de la trame. Ces octets de synchronisation, respectivement nommés START et STOP, sont standardisés par le protocole. Entre ces octets de synchronisation, on trouve un en-tête standardisé, les données à transmettre et éventuellement des données de contrôle d'erreur. Un problème peut cependant survenir : il se peut qu'un octet de la trame soit identique à un octet START ou STOP. Mais il y a moyen de résoudre le problème assez simplement. Pour cela, il suffit de faire précéder ces pseudo-octets START/STOP par un octet d'échappement, lui aussi standardisé. Les vrais octets START et STOP ne sont pas précédés de cet octet d'échappement et seront pris en compte, là où les pseudo-START/STOP seront ignoré car précédés de l'octet d'échappement. Il arrive plus rarement que ces octets de START/STOP soient en réalité codés par des bits spéciaux. Un bon exemple est celui du bit I²C, où les bits de START et STOP sont codés par des fronts sur les bus de données et de commande. Il en est de même sur le BUS RS-232 et RS-485, comme nous le verrons plus tard.

Trame
Trame

Une autre solution consiste à remplacer l'octet/bit STOP par la longueur de la trame. Immédiatement à la suite de l'octet/bit START, l'émetteur va envoyer la longueur de la trame en octet ou en bits. Cette information permettra au récepteur de savoir quand la trame se termine. Cette technique permet de se passer totalement des octets d'échappement : on sait que les octets START dans une trame sont des données et il n'y a pas d'octet STOP à échapper. Ce faisant, le récepteur a moins de travail d'analyse à faire : il n'a pas vraiment à analyser le contenu des octets pour savoir quoi faire, mais a juste à compter les octets qu'il reçoit. Cette méthode et la méthode précédente ont des conséquences différentes sur la taille des trames. Si la trame peut être très longue, la longueur doit être codée sur plusieurs octets : cela prend plus de place que l'octet/bit STOP. Par contre, les octets d’échappement sont économisés. Un autre défaut (très théorique) de cette approche est que la longueur des trames est bornée par le nombre de bits utilisés pour coder la longueur. Dit autrement, elle ne permet pas de trames aussi grandes que possibles. Mais ce défaut est plus théorique qu'autre chose.

Trame - 2
Trame - 2

Dans le cas où les trames ont une taille fixe, à savoir que leur nombre d'octet ne varie pas selon la trame, les deux techniques précédentes sont inutiles. Il suffit d'utiliser un octet/bit de START, les récepteurs ayant juste à compter les octets envoyés à sa suite. Pas besoin de STOP ou de coder la longueur de la trame.

Le codage du récepteur

La trame doit naturellement être envoyée à un récepteur, seul destinataire de la trame. Or, on a vu que sur les réseaux diffusants, toute trame est envoyé à tous les ordinateurs du réseau. Ceux-ci doivent avoir un moyen quelconque pour savoir si la trame leur est destinée. Pour cela, chaque ordinateur d'un réseau diffusant reçoit un numéro qui permet de l’identifier : ce numéro est ce qu'on appelle une adresse physique. Toute trame contient l'adresse physique du récepteur, les ordinateurs ayant juste à comparer cette adresse avec la leur pour savoir s'ils sont destinataires. Pour donner son destinataire, la trame doit indiquer quelle est son adresse. L'adresse en question est intégrée à la trame et est placée à un endroit précis, le plus souvent à son début. La raison à cela est que les récepteurs espionnent le support de transmission en permanence pour détecter les trames qui leur sont destinées. Ils lisent toutes les trames et en extraient l'adresse de destination : si celle-ci leur correspond, ils lisent le reste de la trame, ou l'ignorent sinon. Pour que la transmission soit la plus rapide, il vaut mieux que les périphériques sachent le plus rapidement si la trame leur est destinée, ce qui demande de mettre l'adresse au plus tôt.

De nos jours, les adresses physiques sont définies par le standard MAC. Avec ce standard, chaque adresse physique fait 6 octets (48 bits), et est appelée une adresse MAC. Chaque équipement réseau dispose d'une adresse MAC unique au monde, attribuée par son fabricant. Mais l'utilisateur peut changer l'adresse MAC d'un réseau ou d'un ordinateur. Les réseaux locaux eux-même ont une adresse MAC : cela sert pour connecter des réseaux locaux entre eux, par exemple. Si on envoie un paquet sur l'adresse d'un réseau, celle-ci sera envoyée à tous les ordinateurs du réseau : on parle alors de broadcast. Pour savoir si l'adresse MAC est celle d'un réseau ou d'un équipement réseau, chaque adresse MAC contient un bit I/G, qui vaut 1 si l'adresse est celle d'un réseau et 0 sinon. Pour indiquer si l'adresse a été changée par l'utilisateur, l'adresse MAC contient un bit U/L.

Bit I/G Bit U/L Reste de l'adresse MAC
0 0 L'adresse MAC n'a pas été modifiée par l'utilisateur. L'adresse MAC se décompose en une adresse de 24 bits qui identifie un ordinateur dans le réseau, et un Organizationally Unique Identifier (OUI) de 22 bits qui identifie le constructeur du matériel.
0 1 L'adresse MAC a été modifiée par l'utilisateur.
1 0 Le reste de l'adresse pointe vers un réseau local.
1 1 Le reste de l'adresse est intégralement remplie avec des bits à 1. Elle est interprétée comme étant une adresse de broadcast pour le réseau local.
MAC-48 Address

La fiabilité des transmissions

Lorsqu'une trame est envoyée, il se peut qu'elle n'arrive pas à destination correctement. Des parasites peuvent déformer la trame et/ou en modifier des bits au point de la rendre inexploitable. Dans ces conditions, il faut systématiquement que l'émetteur et le récepteur détectent l'erreur : ils doivent savoir que la trame n'a pas été transmise ou qu'elle est erronée. Pour cela, il existe diverses méthodes de de détection et de correction d'erreur. On en distingue deux classes : celles qui ne font que détecter l'erreur, et celles qui permettent de la corriger.

Détection et correction d'erreur

Tous les codes correcteurs et détecteurs d'erreur ajoutent tous des bits aux données de base, ces bits étant appelés des bits de correction/détection d'erreur. Ces bits servent à détecter et éventuellement corriger toute erreur de transmission/stockage. Plus le nombre de bits ajoutés est important, plus la fiabilité des données sera importante. Dans le cas le plus simple, on se contente d'un simple bit de parité. Dans d'autres cas, on peut ajouter une somme de contrôle ou un code de Hamming à la trame. Cela permet de détecter les erreurs de transmission, et de la corriger dans certains cas.

Bit de parité

Nous allons commercer par aborder le bit de parité/imparité, une technique utilisée dans un grand nombre de circuits électroniques, comme certaines mémoires RAM, ou certains bus (RS232, notamment). Il permet de détecter des corruptions qui touchent un nombre impair de bits. Si un nombre pair de bit est modifié, il sera impossible de détecter l'erreur avec un bit de parité. Il faut noter que ce bit de parité, utilisé seul, n permet pas de localiser le bit corrompu. Ce bit de parité est ajouté aux bits à stocker. Avec ce bit de parité, le nombre stocké (bit de parité inclus) contient toujours un nombre pair de bits à 1. Ainsi, le bit de parité vaut 0 si le nombre contient déjà un nombre pair de 1, et 1 si le nombre de 1 est impair. Si un bit s'inverse, quelle qu'en soit la raison, la parité du nombre total de 1 est modifié : ce nombre deviendra impair si un bit est modifié. Et ce qui est valable avec un bit l'est aussi pour 3, 5, 7, et pour tout nombre impair de bits modifiés. Mais tout change si un nombre pair de bit est modifié : la parité ne changera pas. Ainsi, on peut vérifier si un bit (ou un nombre impair) a été modifié : il suffit de vérifier si le nombre de 1 est impair.

Le bit d'imparité est similaire au bit de parité, si ce n'est que le nombre total de bits doit être impair, et non pair comme avec un bit de parité. Sa valeur est l'inverse du bit de parité du nombre : quand le premier vaut 1, le second vaut 0, et réciproquement. Mais celui-ci n'est pas meilleur que le bit de parité : on retrouve l'impossibilité de détecter une erreur qui corrompt un nombre pair de bits.

Pour obtenir plus d'informations sur le calcul logiciel de ce bit, je vous suggère de lire le chapitre de mon cours sur les opérations bits à bits : Bit de parité.

Code de Hamming

Le code de Hamming se base sur l'usage de plusieurs bits de parité pour un seul nombre. Chaque bit de parité n'est cependant pas calculé en prenant en compte la totalité des bits du nombre : seul un sous-ensemble de ces bits est utilisé pour calculer chaque bit de parité. Chaque bit de parité a son propre sous-ensemble, tous étant différents, mais pouvant avoir des bits en commun. Le but étant que deux sous-ensembles partagent un bit : si ce bit est modifié, cela modifiera les deux bits de parité associés. Et la modification de ce bits est la seule possibilité pour que ces deux bits soient modifiés en même temps : si ces deux bits de parité sont modifiés en même temps, on sait que le bit partagé a été modifié. Pour résumer, un code de Hamming utilise plusieurs bits de parité, calculés chacun à partir de bits différents, souvent partagés entre bits de parité.

Hamming(7,4)

Le code de Hamming le plus connu est certainement le code 7-4-3, un code de Hamming parmi les plus simple à comprendre. Celui-ci prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Pour poursuivre, nous allons noter les bits de parité p1, p2 et p3, tandis que les bits de données seront notés d1, d2, d3 et d4. Voici à partir de quels bits de données sont calculés chaque bit de parité :

Bits de parité incorrects Bit modifié
Les trois bits de parité : p1, p2 et p3 Bit d4
p1 et p2 d1
p2 et p3 d3
p1 et p3 d2

Il faut préciser que toute modification d'un bit de donnée entraine la modification de plusieurs bits de parité. Si un seul bit de parité est incorrect, il est possible que ce bit de parité a été corrompu et que les données sont correctes. Ou alors, il se peut que deux bits de données ont étés modifiés, sans qu'on sache lesquels.

Sommes de contrôle

Les sommes de contrôle sont des techniques de correction d'erreur, où les bits de correction d'erreur sont ajoutés à la suite des données. Les bits de correction d'erreur, ajoutés à la fin du nombre à coder, sont appelés la somme de contrôle. Techniquement, les techniques précédentes font partie des sommes de contrôle au sens large. Mais il existe un sens plus restreint pour le terme de somme de contrôle. Ce terme est souvent utilisé pour des techniques telle l'addition modulaire, le CRC, et quelques autres. Toutes ont en commun de traiter les données à coder comme un gros nombre entier, sur lequel on effectue des opérations arithmétiques pour calculer les bits de correction d'erreur. La seule différence est que l'arithmétique utilisée est quelque peu différente de l'arithmétique binaire usuelle. Dans les calculs de CRC, on utilise une arithmétique où les retenues ne sont pas propagées. Le calcul des additions et soustractions est alors extrêmement simple : elles se résument à de vulgaires XOR.

Une méthode très utilisée dans le cadre du réseau consiste à prendre les données à envoyer, à les diviser par un nombre entier arbitraire, et à utiliser le reste de la division euclidienne comme somme de contrôle. Cette méthode, qui n'a pas de nom, est similaire à celle utilisée dans les Codes de Redondance Cyclique. Effectuer une division dans l'arithmétique utilisée est alors très simple : il suffit d’effectuer la division comme en décimal, en remplaçant les soustractions par des XOR. C'est ainsi que sont calculés les CRC : on divise les données par un diviseur standardisé pour chaque CRC, dans l'arithmétique mentionnée précédemment, et on utilise le reste de la division comme somme de contrôle. L'avantage de ces CRC est qu'ils sont faciles à calculer en matériel. Le remplacement des soustractions entières par des XOR facilite fortement les calculs et leur implémentation. Les circuits de calcul de CRC sont ainsi très simples à concevoir : ce sont souvent de simples registres à décalage à rétroaction linéaire améliorés.

L'Automatic repeat request

ACK TCP

Si l'erreur peut être corrigée par le récepteur, tout va bien. Mais il arrive souvent que ce ne soit pas le cas : l'émetteur doit alors être prévenu et agir en conséquence. Pour cela, le récepteur peut envoyer une trame à l'émetteur qui signifie : la trame précédente envoyée est invalide. Cette trame est appelée un accusé de non-réception. La trame fautive est alors renvoyée au récepteur, en espérant que ce nouvel essai soit le bon. Mais cette méthode ne fonctionne pas si la trame est tellement endommagée que le récepteur ne la détecte pas. Pour éviter ce problème, on utilise une autre solution, beaucoup plus utilisée dans le domaine du réseau. Celle-ci utilise des accusés de réception, à savoir l'inverse des accusés de non-réception. Ces accusés de réception sont envoyés à l'émetteur pour signifier que la trame est valide et a bien été reçue. Nous les noterons ACK dans ce qui suivra. Après avoir envoyé une trame, l'émetteur va attendra un certain temps que l'ACK correspondant lui soit envoyé. Si l’émetteur ne reçoit pas d'ACK pour la trame envoyée, il considère que celle-ci n'a pas été reçue correctement et la renvoie. Pour résumer, on peut corriger et détecter les erreurs avec une technique qui mélange ACK et durée d'attente : après l'envoi d'une trame, on attend durant un temps nommé time-out que l'ACK arrive, et on renvoie la trame au bout de ce temps si non-réception. Cette technique porte un nom : on parle d'Automatic repeat request.

Dans le cas le plus simple, les trames sont envoyées unes par unes au rythme d'une trame après chaque ACK. En clair, l'émetteur attend d'avoir reçu l'ACK de la trame précédente avant d'en envoyer une nouvelle. Parmi les méthodes de ce genre, la plus connue est le protocole Stop-and-Wait. Cette méthode a cependant un problème pour une raison simple : les trames mettent du temps avant d'atteindre le récepteur, de même que les ACK mettent du temps à faire le chemin inverse. Une autre conséquence des temps de transmission est que l'ACK peut arriver après que le time-out (temps d'attente avant retransmission de la trame) soit écoulé. La trame est alors renvoyée une seconde fois avant que son ACK arrive. Le récepteur va alors croire que ce second envoi est en fait l'envoi d'une nouvelle trame ! Pour éviter cela, la trame contient un bit qui est inversé à chaque nouvelle trame. Si ce bit est le même dans deux trames consécutives, c'est que l'émetteur l'a renvoyée car l'ACK était en retard. Mais les temps de transmission ont un autre défaut avec cette technique : durant le temps d'aller-retour, l'émetteur ne peut pas envoyer de nouvelle trame et doit juste attendre. Le support de transmission n'est donc pas utilisé de manière optimale et de la bande passante est gâchée lors de ces temps d'attente.

Les deux problèmes précédents peuvent être résolu en utilisant ce qu'on appelle une fenêtre glissante. Avec cette méthode, les trames sont envoyées les unes après les autres, sans attendre la réception des ACKs. Chaque trame est numérotée de manière à ce que l'émetteur et le récepteur puisse l’identifier. Lorsque le récepteur envoie les ACK, il précise le numéro de la trame dont il accuse la réception. Ce faisant, l'émetteur sait quelles sont les trames qui ont étés reçues et celles à renvoyer (modulo les time-out de chaque trame). On peut remarquer qu'avec cette méthode, les trames sont parfois recues dans le désordre, alors qu'elles ont été envoyées dans le désordre. Ce mécanisme permet donc de conserver l'ordre des données envoyées, tout en garantissant le fait que les données sont effectivement transmises sans problèmes. Avec cette méthode, l'émetteur va accumuler les trames à envoyer/déjà envoyées dans une mémoire. L'émetteur devra gérer deux choses : où se situe la première trame pour laquelle il n'a pas d'ACK, et la dernière trame envoyée. La raison est simple : la prochaine trame à envoyer est l'une de ces deux trames. Tout dépend si la première trame pour laquelle il n'a pas d'ACK est validée ou non. Si son ACK n'est pas envoyé, elle doit être renvoyée, ce qui demande de savoir quelle est cette trame. Si elle est validée, l'émetteur pourra envoyer une nouvelle trame, ce qui demande de savoir quelle est la dernière trame envoyée (mais pas encore confirmée). Le récepteur doit juste mémoriser quelle est la dernière trame qu'il a recue. Lui aussi va devoir accumuler les trames recues dans une mémoire, pour les remettre dans l'ordre.

L'accès au support de communication

Réseaux sans fils et bus sont souvent regroupés sous le terme de réseaux de diffusion. Ceux-ci ont pour particularité de faire communiquer plusieurs machines avec un même support partagé. Quand une trame est envoyée sur un tel réseau, toutes les machines du réseau reçoivent la trame. Elles doivent alors décider si la trame leur est destinée, en comparant les adresses MAC, et agir en conséquence. Sur les réseaux non-commutés (organisés autour d'un hub, d'un anneau ou d'un bus), chaque paquet est envoyé à tous les ordinateurs du réseau. Mais seuls l'ordinateur de destination est censé prendre en compte la paquet envoyé. Pour cela, tous les ordinateurs du réseau vérifient que l'adresse MAC du destination du paquet est bien la leur. Cependant, tous les PC recevant les informations transmises, rien n’empêche un ordinateur (ou équipement réseau) d'espionner tout ce qui est transmis sur le réseau local : il lui suffit de prendre en compte la totalité des paquets qui sont envoyés sur le réseau. Un tel ordinateur est dit en mode « promiscious ». Il suffit d'installer un logiciel de capture de trames pour pouvoir surveiller le trafic réseau. Un tel logiciels est utile pour vérifier l’occurrence d'une intrusion ou infection, surtout quand il est couplé à un IDS (logiciel de détection d'intrusions) qui analyse les trames capturées.

Réseaux sans fils et bus sont souvent regroupés sous le terme de réseaux de diffusion. Ceux-ci ont pour particularité de faire communiquer plusieurs machines avec un même support partagé. Les autres réseaux et topologies se basent sur un ensemble de connexions points à points, où deux machines sont reliées par un support de communication distinct, qui leur est dédié. La couche liaison permet à deux machines d'échanger des données soit à travers un réseau de diffusion, soit à travers une liaison point à point. Divers protocoles ont été inventés pour les liaisons point à point : le protocole PPP, ou le protocole HDLC en sont de bons exemples. Les protocoles pour réseaux de diffusion sont eux très différents, les plus connus étant Ethernet et les protocoles pour le Wifi. La principale différence entre ces protocoles est dans la gestion du partage du support de transmission, d'où leur nom de protocoles à accès multiples. Inutile par construction pour les liaisons point à point, elle est essentielle pour tout réseau de diffusion.

Réseau à diffusion.
Réseau à diffusion.

Réseaux en anneaux : Token Ring

Il y a peu à dire sur les réseaux non-diffusants. Cependant, les réseaux en anneaux ont besoin d'un contrôle d'accès. Sans cela, plusieurs ordinateurs peuvent envoyer des données dans l'anneau. Pour résoudre ce problème, chaque ordinateur a accès à l'anneau a tour de rôle, un seul ordinateur ayant le droit d'envoyer des données sur l'anneau à la fois. Ce droit est modélisé par un jeton, qui passe d'un ordinateur au suivant à chaque émission. Ce jeton est juste une trame spéciale : toutes les trames envoyées sur le réseau ont un bit qui indique si cette trame est le jeton ou pas. Ce jeton est conservé dans un temps déterminé et fixe, le même pour tous les ordinateurs.

L'utilisation d'un jeton permet à tous les ordinateurs d'avoir un accès équitable au réseau. On sait que tous les ordinateurs auront accès au réseau à un moment ou un autre. Évidemment, ils peuvent ne pas utiliser leur jeton s'ils n’ont rien à envoyer, et transmettent alors le jeton à l'ordinateur suivant. De plus, le temps avant de récupérer le jeton est obligatoirement fini et on peut lui attribuer une limite maximale : le temps que le jeton fasse le tour de l'anneau. C'est un avantage que les bus n'ont pas : un ordinateur peut, en théorie, monopoliser le bus durant un temps indéterminé si rien n'est prévu dans la conception du bus. Si peu d'ordinateurs accèdent au réseau, les réseaux en bus ou étoile ont une meilleure efficacité. Mais à forte charge, les réseaux en anneau ont clairement une efficacité nettement plus importante. En effet, le nombre de collisions augmente sur un réseau en bus, ce qui réduit le débit utilisé pour transmettre des données : le débit utilisé est plus important sur un réseau en anneau, vu qu'il n'y a pas de collisions.

Réseaux de diffusion : détection de collisions

Sur les réseaux à base de bus, il arrive que plusieurs composants tentent d'envoyer ou de recevoir une donnée sur le bus en même temps : c'est un conflit d'accès au bus, aussi appelé une collision. Ce problème a lieu aussi sur les réseaux Wifi, où plusieurs machines peuvent émettre sur la même fréquence. Cela pose problème si un composant cherche à envoyer un 1 et l'autre un 0 : tout ce que l’on reçoit à l'autre bout du fil est un espèce de mélange incohérent des deux données envoyées sur le bus par les deux composants. Détecter l'occurrence d'une collision et la corriger est essentiel pour que le bus fonctionne correctement. Pour résoudre ce problème, diverses méthodes ont étés inventées et intégrées aux protocoles les plus connus.

Un exemple de protocole : Ethernet

Ethernet LAN

Le standard courant de transmission des données sur un réseau local est l'Ethernet. Sa première version date des années 1970 (1973-1976), son inventeur étant la fameuse entreprise Xerox. Elle standardisait la communication sur un bus, aujourd'hui émulé par des concentrateurs (hubs). C'est en 1982 que la seconde version d'Ethernet vit le jour. La troisième version, standardisée par l'IEEE, porte le nom de protocole 802.3. Ce protocole est depuis devenu le protocole le plus populaire pour les réseaux locaux. Techniquement, Ethernet est à la fois un protocole de couche 1 et de couche 2. Sa spécification standardise l'encodage des bits sur un câble Ethernet, par exemple. Cependant, nous allons nous concentrer sur ses fonctionnalités de couche 2 dans ce qui va suivre.

Les trames Ethernet

Toute trame Ethernet contient diverses informations, dont :

  • l'adresse MAC du destinataire : sans cela, on ne sait pas à qui la donnée est destinée ;
  • l'adresse de l'émetteur, qui peut se révéler utile ;
  • la donnée envoyée : un simple bloc de données de taille fixe, le plus souvent ;
  • éventuellement des octets de synchronisation ou de contrôle d'erreur.

Dans la première version d'Ethernet, la trame indique elle-même son nombre d'octets, sa longueur. Celle-ci est comprise entre 46 et 1500 octets. Si le nombre total d'octets est inférieur à 42, l'équipement réseau ajoute des octets inutiles dans la trame, histoire d'avoir au moins 46 octets. Dans les versions suivantes d'Ethernet, la longueur est remplacé par un numéro qui indique quels sont les protocoles utilisés pour la transmission des données sur le net : l'Ethertype. Pour garantir la compatibilité, il a été convenu que les trames Ethernet version 2 ont un champ dont la valeur est supérieure à la longueur de la trame, à savoir 1500.

Trame Ethernet.
Trame Ethernet, version 2.

L'arbitrage du bus : le CSMA-CD

CMSA-CD

Comme tous les autres bus, le bus Ethernet doit contenir des mécanismes d'arbitrage pour résoudre la situation. Le protocole Ethernet utilise une méthode d'arbitrage spéciale : le CSMA-CD. De base, les machines attendent que le bus soit libre (personne n'émet) pour émettre une trame. Mais il arrive que deux machines voient que le bus est libre simultannément et démarrent une transmission chacune de leur coté. Il est ainsi parfaitement possible que deux machines émettent sur le bus en même temps et une collision a lieu.

Avec ce protocole, la détection de collision est relativement simple. Quand une machine envoie un 1 sur le bus, elle s'attend à ce que le bus contienne une tension positive, correspondant à un 1. Même chose pour un 0, qui doit donner une tension nulle. Si deux machines émettent sur le bus, les 1 l'emportent sur les 0 : si une machine émet un 1 et une autre un 0, on observera un 1 sur le bus. Pour détecter une collision, chaque machine compare ce qu'elle envoie sur le bus et ce qu'il y a sur le bus. Si elle observe un 1 sur le bus alors qu'elle a envoyé un 0, une collision a eu lieu. Quand une collision a lieu, a machine qui a détecté la collision stoppe sa transmission et envoie une trame spéciale sur le bus, qui indique l'occurrence d'une collision. Lorsqu'une collision a lieu, ou que le bus n'est pas libre, la machine va attendre son tour. Chaque machine attend durant un temps aléatoire, histoire de limiter l’occurrence des collisions.

CSMA-CD : détection d'une collision.

La carte réseau

Tous les traitements de la couche liaison sont, avec les traitements de la couche physique, pris en charge par la carte réseau. Celle-ci est le composant qui permet à un ordinateur de communiquer sur un réseau (local ou internet). D'ordinaire, elle permet d'envoyer ou de recevoir des informations sur un câble réseau ou une connexion WIFI. Elle communique avec le reste de l'ordinateur via le bus de la carte mère. Les données échangées sont mémorisées temporairement dans une mémoire tampon. Celle-ci permet de mettre en attente les données à envoyer tant que le réseau n'est pas disponible, ou d'accumuler les données reçues en attendant de les recevoir complètement. Ces données sont ensuite gérées par un circuit qui s'occupe de gérer l'encapsulation (ajout/retrait des adresses MAC, calcul de la somme de contrôle). La gestion de la fenêtre glissante, si elle existe, est prise en charge par un circuit spécialisé juste après. La carte réseau contient ensuite un circuit qui transforme les données à transmettre en ondes WIFI ou en signaux électriques (pour les câbles réseau). Dans tous les cas, les transferts d'informations se font en série (le câble est l'équivalent d'un bus série). L'interface de transfert contient donc deux registres à décalage : un pour faire la conversion parallèle -> série, et un autre pour la conversion série -> parallèle.

Architecture matérielle d'une carte réseau.