Poiché Ethernet utilizza gli indirizzi MAC per la comunicazione, è possibile creare una rete Ethernet in cui i dispositivi non avrebbero un indirizzo IP, ma solo un indirizzo MAC?
Se scrivessi tutto il tuo software da zero, allora potresti sicuramente farlo. Basta che il software accetti un indirizzo MAC ovunque che la normale controparte di quel programma avrebbe accettato un indirizzo IP. Usa tutte le chiamate di sistema per inviare pacchetti Ethernet grezzi anziché l'indirizzo IP e funzionerà, ma sarebbe una seccatura enorme.
In genere, gli indirizzi MAC sulla rete non seguono alcun modello. Vengono bruciati nell'hardware dal produttore. Sono lunghi e voluminosi. Il mio in questo momento è C8-60-00-CA-4B-9A. Il computer accanto a me è 00-40-F4-48-1B-88.
Affinché le macchine possano parlarti a vicenda, potresti dare a ciascuna macchina un elenco hardcoded di tutti gli indirizzi MAC di tutte le altre macchine sulla rete in modo da sapere dove inviare i pacchetti. Questo è un sacco di errori inclini a digitare e ogni volta che hai cambiato qualsiasi hardware di rete dovresti andare in giro e cambiare tutti gli elenchi per riflettere i nuovi indirizzi MAC.
Questa è una seccatura enorme, quindi probabilmente finirai per trovare un modo per le macchine sulla rete di scoprire automaticamente gli indirizzi MAC degli altri usando i pacchetti di trasmissione. Quindi daresti loro un modo per identificarsi con qualche indirizzo significativo, quindi dovresti digitare comandi come "telnet C8-60-00-CA-4B-9A".
Si scopre che questo è esattamente ciò che fa l'IP: è un modo per utilizzare numeri significativi per indirizzare gli host su una rete piuttosto che su indirizzi MAC con codifica rigida. Aggiungi DNS sopra IP e puoi digitare un comando come "telnet webserver".
Ethernet non potrebbe utilizzare gli indirizzi IP per inviare messaggi? Non sto dicendo che dovrebbe, sto solo chiedendo se avrebbe potuto scegliere di farlo.
Gli indirizzi MAC sono 6 byte di informazioni e gli indirizzi IP sono solo 4 byte, quindi non è possibile eseguire alcun tipo di mapping da 1 a 1. È necessario un modo per trovare l'indirizzo MAC (da inserire nel pacchetto) da un indirizzo IP (fornito dal software che desidera comunicare con un altro host sulla rete).
Un modo (hard core) per farlo sarebbe quello di entrare in ogni macchina della rete e cambiare il suo indirizzo MAC hardware in modo che assomigli a un indirizzo IP facendo diventare i primi due byte zero (o qualche altro numero fisso uguale) per ogni macchina sulla rete) e impostare i quattro byte inferiori sull'indirizzo IP che si desidera avere sulla rete. (La maggior parte delle schede di rete consente di accedere e modificare l'indirizzo MAC assegnato dal fornitore)
Per far sì che funzioni davvero, dovresti anche hackerare il codice nello stack di rete per utilizzare effettivamente questo sistema. Fondamentalmente potresti strappare tutto ciò che ha a che fare con ARP (il metodo che IP usa per tradurre gli indirizzi IP in indirizzi MAC). Strapperesti le parti che costruiscono / leggono le intestazioni IP. Invece, sostituiresti tutto con il codice molto semplice che, dato un pacchetto IP da inviare all'host all'indirizzo wxyz, crea un frame ethernet con l'indirizzo DEST impostato su 00-00-wxyz.
Avresti anche bisogno di un modo per indicare al destinatario di un pacchetto per quale protocollo (UDP, TCP) è destinato. Probabilmente potresti attaccarlo da qualche parte nell'intestazione Ethernet sovrascrivendo un campo esistente. Forse utilizzare uno dei primi due byte dell'indirizzo di origine? Ciò non influirebbe sulla capacità delle macchine di destinazione di ricevere, ma potrebbe rovinare alcuni switch. Potresti anche aggiungere il protocollo all'inizio o alla fine del frame Ethernet e aumentare la dimensione del payload di uno, ma questo inizia a puzzare come un'intestazione IP.
Quindi cosa ti comprerebbe tutto questo lavoro?
In primo luogo, si risparmierebbe il sovraccarico di una ricerca nella tabella ARP su ogni pacchetto in uscita. Questo è probabilmente nell'ordine di soli microsecondi.
Si salva il lavoro di calcolo dei checksum dell'intestazione IP e la memoria necessaria per conservarli. Questo probabilmente non è significativo per l'hardware moderno.
Si risparmiano 16 byte in ogni pacchetto sulla rete poiché non ci sarebbero intestazioni IP. Questo potrebbe sommarsi a seconda dell'applicazione.
Il vantaggio maggiore sarebbe che non dovresti fare alcuna richiesta ARP. L'invio di un pacchetto IP standard a un nuovo host attiva uno scambio ARP che può richiedere millisecondi ed è imprevedibile. Questo può essere un enorme vantaggio per alcune applicazioni che sono molto sensibili alla latenza e al jitter.
Per alcune applicazioni molto specializzate questo ha davvero senso fare. Una volta ho lavorato su un sistema in tempo reale che utilizzava solo pacchetti UDP di trasmissione per tutte le comunicazioni tra host, per il solo motivo che evitava di avviare quelle sequenze ARP e di aggiungere imprevedibilmente ritardo e jitter. Una volta ho anche lavorato su un sistema integrato a risorse limitate che ha funzionato inviando direttamente payload UDP all'interno dei pacchetti IP (nessuna intestazione IP) perché ha salvato tutta la complessità e la memoria necessarie per implementare tutta l'ARP e la maschera di rete e roba extra di checksum.