Como a Ethernet usa endereços MAC para comunicação, eu poderia criar uma rede Ethernet na qual os dispositivos não teriam um endereço IP, apenas um endereço MAC?
Se você estava escrevendo todo o seu próprio software a partir do zero, certamente poderia fazer isso. Basta fazer com que o software aceite um endereço MAC em qualquer lugar que a contraparte normal desse programa tenha aceitado um endereço IP. Use todas as chamadas do sistema para enviar pacotes Ethernet brutos em vez do endereço IP e isso funcionará - mas seria um grande aborrecimento.
Geralmente, os endereços MAC na sua rede não seguem nenhum padrão. Eles são queimados no hardware pelo fabricante. Eles são longos e volumosos. A minha agora é C8-60-00-CA-4B-9A. O computador ao meu lado é 00-40-F4-48-1B-88.
Para que as máquinas possam conversar entre si, você pode fornecer a cada máquina uma lista codificada de todos os endereços MAC de todas as outras máquinas da rede, para que ela saiba para onde enviar pacotes. Isso gera muita digitação e, sempre que você altera seu hardware de rede, precisa mudar e alterar todas as listas para refletir os novos endereços MAC.
Como esse é um grande aborrecimento, você provavelmente descobrirá uma maneira de as máquinas da rede descobrirem automaticamente os endereços MAC uns dos outros usando pacotes de difusão. Depois, você lhes daria uma maneira de se identificar com algum endereço significativo, para que você tivesse que digitar comandos como "telnet C8-60-00-CA-4B-9A".
Acontece que é exatamente isso que o IP faz - é uma maneira de usar números significativos para endereçar hosts em uma rede, em vez de codificar endereços MAC. Adicione o DNS em cima do IP e você poderá digitar o comando como "telnet webserver".
A Ethernet não podia usar endereços IP para enviar mensagens? Não estou dizendo que deveria, estou apenas perguntando se poderia ter escolhido fazê-lo.
Os endereços MAC são 6 bytes de informações e os endereços IP são apenas 4 bytes; portanto, você não pode fazer nenhum tipo de mapeamento 1 para 1. Você precisa encontrar uma maneira de encontrar o endereço MAC (para colocar no pacote) a partir de um endereço IP (fornecido pelo software que deseja se comunicar com outro host na rede).
Uma maneira (essencial) de fazer isso seria entrar em todas as máquinas da rede e alterar o endereço MAC do hardware para parecer um endereço IP, fazendo com que os dois bytes iniciais sejam zeros (ou algum outro número fixo igual) para todas as máquinas da rede) e defina os quatro bytes inferiores para o "endereço IP" que você deseja que eles tenham na rede. (A maioria das placas de rede permite entrar e modificar o endereço MAC atribuído pelo fornecedor)
Para que isso funcione, em seguida, você também precisará hackear o código na sua pilha de rede para realmente usar esse sistema. Você basicamente eliminaria tudo o que tinha a ver com ARP (o método que o IP usa para converter endereços IP em endereços MAC). Você retiraria as partes que constroem / leem os cabeçalhos IP. Em vez disso, você substitui tudo pelo código muito simples que, dado um pacote IP a ser enviado para hospedar no endereço wxyz, constrói um quadro Ethernet com o endereço DEST definido como 00-00-wxyz.
Você também precisaria de uma maneira de indicar ao destinatário de um pacote para qual protocolo (UDP, TCP) ele se destina. Você provavelmente poderia colocar isso em algum lugar do cabeçalho Ethernet, substituindo um campo existente. Talvez use um dos dois primeiros bytes do endereço de origem? Isso não afetaria a capacidade de recebimento das máquinas de destino, mas poderia atrapalhar alguns comutadores. Você também pode adicionar o protocolo ao início ou ao final do quadro Ethernet e aumentar o tamanho da carga útil em um - mas isso está começando a cheirar como um cabeçalho IP.
Então, o que todo esse trabalho compraria para você?
Primeiro, você economizaria a sobrecarga de uma pesquisa na tabela ARP em todos os pacotes enviados. Provavelmente é da ordem de apenas microssegundos.
Você salva o trabalho de calcular somas de verificação do cabeçalho IP e a memória necessária para mantê-las. Provavelmente isso não é significativo no hardware moderno.
Você economiza 16 bytes em cada pacote da rede, pois não haveria cabeçalhos de IP. Isso pode aumentar dependendo do aplicativo.
O maior ganho seria que você não precisaria fazer nenhuma solicitação de ARP. O envio de um pacote IP padrão para um novo host aciona uma troca ARP que pode levar milissegundos e é imprevisível. Isso pode ser um grande ganho para alguns aplicativos que são muito sensíveis à latência e jitter.
Para algumas aplicações muito especializadas, isso realmente faz sentido. Certa vez, trabalhei em um sistema em tempo real que usava apenas pacotes UDP de difusão para todas as comunicações entre hosts pelo único motivo de evitar que essas sequências ARP fossem ativadas e imprevisivelmente adicionassem atraso e instabilidade. Também trabalhei em um sistema embarcado com recursos limitados que enviava cargas UDP diretamente dentro de pacotes IP (sem cabeçalho IP) porque economizava toda a complexidade e memória necessárias para implementar todo o material ARP e máscara de rede e somas de verificação extras.