Comme Ethernet utilise des adresses MAC pour la communication, pourrais-je créer un réseau Ethernet où les appareils n'auraient pas d'adresse IP, juste une adresse MAC?
Si vous écriviez tous vos propres logiciels à partir de zéro, vous pourriez certainement le faire. Demandez simplement au logiciel d'accepter une adresse MAC n'importe où que l'homologue normal de ce programme aurait accepté une adresse IP. Utilisez tous les appels système pour envoyer des paquets Ethernet bruts plutôt que l'adresse IP et cela fonctionnera - mais ce serait un énorme problème.
Généralement, les adresses MAC sur votre réseau ne suivent aucun modèle. Ils sont gravés dans le matériel par le fabricant. Ils sont longs et volumineux. Le mien en ce moment est le C8-60-00-CA-4B-9A. L'ordinateur à côté de moi est 00-40-F4-48-1B-88.
Pour que les machines puissent vous parler, vous pouvez donner à chaque machine une liste codée en dur de toutes les adresses MAC de toutes les autres machines du réseau afin qu'elle sache où envoyer des paquets. C'est beaucoup de fautes de frappe, et chaque fois que vous changez votre matériel réseau, vous devez faire le tour et modifier toutes les listes pour refléter les nouvelles adresses MAC.
C'est un énorme problème, donc vous finirez probablement par trouver un moyen pour les machines du réseau de découvrir automatiquement les adresses MAC des autres à l'aide de paquets de diffusion. Ensuite, vous leur donneriez un moyen de s'identifier avec une adresse significative afin que vous deviez taper des commandes comme "telnet C8-60-00-CA-4B-9A".
Il s'avère que c'est exactement ce que fait IP - c'est un moyen d'utiliser des nombres significatifs pour adresser les hôtes sur un réseau plutôt que de coder en dur les adresses MAC. Ajoutez DNS sur IP et vous pouvez taper une commande comme "telnet webserver".
Ethernet ne peut-il pas utiliser les adresses IP pour envoyer des messages? Je ne dis pas que cela devrait, je demande simplement s'il aurait pu choisir de le faire.
Les adresses MAC sont de 6 octets d'informations et les adresses IP ne sont que de 4 octets, vous ne pouvez donc pas faire de mappage 1 à 1. Vous avez besoin d'un moyen de trouver l'adresse MAC (à mettre dans le paquet) à partir d'une adresse IP (fournie par le logiciel qui veut communiquer avec un autre hôte sur le réseau).
Une façon (noyau dur) de le faire serait d'aller dans chaque machine du réseau et de changer son adresse MAC matérielle pour ressembler à une adresse IP en faisant les deux premiers octets des zéros (ou un autre nombre fixe qui est le même pour chaque machine sur le réseau) et définissez les quatre derniers octets sur "l'adresse IP" que vous souhaitez qu'ils aient sur le réseau. (La plupart des cartes réseau vous permettent d'entrer et de modifier l'adresse MAC attribuée par le fournisseur)
Pour que cela fonctionne réellement, vous devez également pirater le code de votre pile réseau pour utiliser ce système. Vous arracheriez essentiellement tout ce qui a à voir avec ARP (la méthode utilisée par IP pour traduire les adresses IP en adresse MAC). Vous arracheriez les parties qui construisent / lisent les en-têtes IP. Au lieu de cela, vous remplaceriez le tout par le code très simple qui, étant donné un paquet IP à envoyer à l'hôte à l'adresse wxyz, créerait une trame Ethernet avec l'adresse DEST définie sur 00-00-wxyz.
Vous auriez également besoin d'un moyen d'indiquer au récepteur d'un paquet à quel protocole (UDP, TCP) il est destiné. Vous pourriez probablement coller cela quelque part dans l'en-tête Ethernet en remplaçant un champ existant. Peut-être utiliser l'un des deux premiers octets de l'adresse source? Cela n'affecterait pas la capacité des machines de destination à recevoir, mais pourrait gâcher certains commutateurs. Vous pouvez également ajouter le protocole au début ou à la fin de la trame Ethernet et augmenter la taille de la charge utile d'une unité, mais cela commence à sentir comme un en-tête IP.
Alors, que vous apporterait tout ce travail?
Tout d'abord, cela vous éviterait les frais généraux d'une recherche dans la table ARP sur chaque paquet sortant. C'est probablement de l'ordre de quelques microsecondes seulement.
Vous économisez le travail de calcul des sommes de contrôle d'en-tête IP et la mémoire nécessaire pour les contenir. Ce n'est probablement pas significatif sur le matériel moderne.
Vous enregistrez 16 octets dans chaque paquet sur le réseau car il n'y aurait pas d'en-têtes IP. Cela pourrait s'additionner en fonction de l'application.
Le plus gros gain serait que vous n'auriez pas à faire de requêtes ARP. L'envoi d'un paquet IP standard à un nouvel hôte déclenche un échange ARP qui peut prendre des millisecondes et est imprévisible. Cela peut être un gain énorme pour certaines applications très sensibles à la latence et à la gigue.
Pour certaines applications très spécialisées, cela a du sens. Une fois, j'ai travaillé sur un système en temps réel qui n'utilisait que des paquets UDP diffusés pour toutes les communications interhôtes, pour la seule raison qu'il évitait le déclenchement de ces séquences ARP et ajoutait de manière imprévisible du retard et de la gigue. J'ai également travaillé sur un système embarqué à ressources limitées qui fonctionnait en envoyant directement des charges utiles UDP à l'intérieur de paquets IP (pas d'en-tête IP), car il économisait toute la complexité et la mémoire nécessaires pour implémenter tout l'ARP et le masque de réseau et des trucs de sommes de contrôle supplémentaires.