Como Ethernet usa direcciones MAC para la comunicación, ¿podría crear una red Ethernet donde los dispositivos no tendrían una dirección IP, solo una dirección MAC?
Si estaba escribiendo todo su propio software desde cero, entonces ciertamente podría hacerlo. Simplemente haga que el software acepte una dirección MAC en cualquier lugar donde la contraparte normal de ese programa hubiera aceptado una dirección IP. Use todas las llamadas del sistema para enviar paquetes de ethernet sin procesar en lugar de la dirección IP y funcionará, pero sería una gran molestia.
En general, las direcciones MAC en su red no siguen ningún patrón. El fabricante los quema en el hardware. Son largos y voluminosos. El mío ahora es C8-60-00-CA-4B-9A. La computadora a mi lado es 00-40-F4-48-1B-88.
Para que las máquinas puedan comunicarse entre sí, puede proporcionar a cada máquina una lista codificada de todas las direcciones MAC de todas las otras máquinas en la red para que sepa dónde enviar paquetes. Esta es una gran cantidad de errores de escritura, y cada vez que cambie su hardware de red, tendrá que dar la vuelta y cambiar todas las listas para reflejar las nuevas direcciones MAC.
Esta es una gran molestia, por lo que probablemente terminaría encontrando una forma para que las máquinas en la red descubran automáticamente las direcciones MAC de los demás utilizando paquetes de difusión. Luego les daría una forma de identificarse con alguna dirección significativa, por lo que tendría que escribir comandos como "telnet C8-60-00-CA-4B-9A".
Resulta que esto es exactamente lo que hace IP: es una forma de usar números significativos para direccionar hosts en una red en lugar de codificar direcciones MAC. Agregue DNS en la parte superior de IP y puede escribir comandos como "servidor web telnet".
¿No podría Ethernet usar direcciones IP para enviar mensajes? No digo que deba hacerlo, solo pregunto si podría haber elegido hacerlo.
Las direcciones MAC son 6 bytes de información y las direcciones IP son solo 4 bytes, por lo que no puede hacer ningún tipo de mapeo 1 a 1. Necesita alguna forma de encontrar la dirección MAC (para poner en el paquete) desde una dirección IP (suministrada por el software que desea comunicarse con otro host en la red).
Una forma (núcleo duro) de hacer esto sería ir a cada máquina de la red y cambiar su dirección MAC de hardware para que parezca una dirección IP haciendo que los dos bytes superiores sean ceros (o algún otro número fijo que sea el mismo para cada máquina en la red) y configure los cuatro bytes inferiores a la "dirección IP" que desea que tengan en la red. (La mayoría de las tarjetas de red le permitirán ingresar y modificar la dirección MAC asignada por el proveedor)
Para que esto realmente funcione, a continuación, también tendría que hackear el código en su pila de red para usar este sistema. Básicamente, eliminaría todo lo que tenga que ver con ARP (el método que utiliza IP para traducir las direcciones IP a la dirección MAC). Extraería las partes que compilan / leen encabezados IP. En cambio, lo reemplazaría todo con el código muy simple que, dado un paquete IP que se enviará al host en la dirección wxyz, construye un marco de ethernet con la dirección DEST establecida en 00-00-wxyz.
También necesitaría una manera de indicar al receptor de un paquete para qué protocolo (UDP, TCP) está destinado. Probablemente podría pegar esto en algún lugar del encabezado de Ethernet anulando un campo existente. ¿Quizás use uno de los dos primeros bytes de la dirección de origen? Esto no afectaría la capacidad de las máquinas de destino para recibir, pero podría estropear algunos conmutadores. También puede agregar el protocolo al principio o al final de la trama de Ethernet y aumentar el tamaño de la carga útil en uno, pero eso está empezando a oler como un encabezado IP.
Entonces, ¿qué te compraría todo este trabajo?
Primero, le ahorraría la sobrecarga de una búsqueda en la tabla ARP en cada paquete saliente. Esto es probablemente del orden de solo microsegundos.
Usted ahorra el trabajo de calcular sumas de verificación de encabezado IP y la memoria necesaria para mantenerlas. Esto probablemente no sea significativo en el hardware moderno.
Guarda 16 bytes en cada paquete en la red ya que no habría encabezados IP. Esto podría sumar dependiendo de la aplicación.
La mayor ganancia sería que no tendría que hacer ninguna solicitud ARP. Enviar un paquete IP estándar a un nuevo host desencadena un intercambio ARP que puede tomar milisegundos y es impredecible. Esto puede ser una gran ganancia para algunas aplicaciones que son muy sensibles a la latencia y la fluctuación de fase.
Para algunas aplicaciones muy especializadas, esto realmente tiene sentido. Una vez trabajé en un sistema en tiempo real que usaba solo paquetes UDP de transmisión para todas las comunicaciones entre hosts por la única razón de que evitaba que esas secuencias ARP se activaran y agregaran retardo y jitter de manera impredecible. También trabajé una vez en un sistema embebido de recursos limitados que funcionaba enviando cargas útiles UDP dentro de paquetes IP directamente (sin encabezado IP) porque guardaba toda la complejidad y memoria necesaria para implementar todo el ARP y la máscara de red y cosas de suma de verificación adicionales.