Оскільки Ethernet використовує MAC-адреси для зв'язку, чи можу я створити мережу Ethernet, де пристрої не мали б IP-адреси, а лише MAC-адресу?
Якщо ви писали все власне програмне забезпечення з нуля, то, безумовно, можете це зробити. Просто пропонуйте програмне забезпечення прийняти MAC-адресу де завгодно, щоб звичайний аналог цієї програми прийняв IP-адресу. Використовуйте всі системні виклики для надсилання сирих пакетів Ethernet, а не IP-адреси, і це спрацює - але це було б величезним клопотом.
Як правило, MAC-адреси у вашій мережі не відповідають жодній схемі. Вони випалюються в апараті виробником. Вони довгі і об'ємні. Зараз у мене шахта C8-60-00-CA-4B-9A. Комп'ютер поруч зі мною 00-40-F4-48-1B-88.
Щоб машини мали змогу розмовляти з вами один одному, ви можете надати кожній машині жорстко зашифрований список усіх MAC-адрес усіх інших машин у мережі, щоб він знав, куди надсилати пакети. Це дуже багато схильних до помилок введення тексту, і коли б ви змінили будь-яке мережеве обладнання, вам доведеться обходити і змінювати всі списки, щоб відображати нові MAC адреси.
Це величезна проблема, тому ви, мабуть, придумаєте спосіб, коли машини в мережі автоматично відкриють MAC-адреси один одного, використовуючи широкомовні пакети. Тоді ви дасте їм спосіб ідентифікувати себе з якоюсь значущою адресою, тому вам доведеться вводити команди типу "telnet C8-60-00-CA-4B-9A".
Виявляється, це саме те, що робить IP - це спосіб використовувати значущі числа для адреси хостів у мережі, а не жорстке кодування MAC-адрес. Додайте в DNS поверх IP-адреси, і ви можете ввести команду типу "веб-сервер telnet".
Не вдалося Ethernet використовувати IP-адреси для надсилання повідомлень? Я не кажу, що це повинно, я просто запитую, чи міг би це зробити.
MAC-адреси - це 6 байтів інформації, а IP-адреси - лише 4 байти, тому ви не можете здійснювати будь-яке відображення від 1 до 1. Вам потрібен певний спосіб пошуку MAC-адреси (щоб помістити в пакет) з IP-адреси (надається програмним забезпеченням, яке хоче спілкуватися з іншим хостом у мережі).
Один (жорсткий ядро) спосіб зробити це - зайти в кожну машину в мережі та змінити її апаратну MAC-адресу, щоб вона виглядала як IP-адреса, зробивши два верхні байти нулями (або деяким іншим фіксованим числом, таким самим для кожної машини в мережі) і встановіть чотири байти внизу на "IP-адресу", яку ви бажаєте мати в мережі. (Більшість мережевих карток дозволить вам увійти та змінити призначену MAC-адресу постачальника)
Для того, щоб це фактично працювало, далі вам також доведеться зламати код у вашому мережевому стеку, щоб фактично використовувати цю систему. В основному ви вирвете все, що стосується ARP (метод IP використовує для перекладу IP-адрес у MAC-адресу). Ви вирвете частини, які створюють / читають заголовки IP. Замість цього, ви заміните все це дуже простим кодом, який, даючи пакет IP, який буде надісланий хосту за адресою wxyz, будує Ethernet-кадр з адресою DEST, встановленою на 00-00-wxyz.
Вам також знадобиться спосіб вказати одержувачеві пакету, для якого протоколу (UDP, TCP) він призначений. Ви, ймовірно, могли вставити це десь у заголовку Ethernet, замінивши наявне поле. Може використовувати один із перших двох байтів вихідної адреси? Це не вплине на можливість призначення машин прийому, але може зіпсувати деякі комутатори. Ви також можете додати протокол до початку або в кінці кадру Ethernet і збільшити розмір корисної навантаження на одну - але це починає пахнути IP-заголовком.
То що б у вас все це працювало?
По-перше, це заощадить накладні витрати на пошук у таблиці ARP на кожному вихідному пакеті. Це, мабуть, порядку лише мікросекунд.
Ви зберігаєте роботу обчислень контрольних сум заголовків IP та пам'яті, необхідної для їх зберігання. Це, мабуть, не суттєво для сучасного обладнання.
Ви зберігаєте 16 байт у кожному пакеті мережі, оскільки не було б заголовків IP. Це може скластися залежно від програми.
Найбільшим виграшем було б те, що вам не доведеться робити жодних запитів ARP. Відправка стандартного пакету IP новому хосту запускає обмін ARP, який може зайняти мілісекунди і непередбачуваний. Це може бути величезною вигодою для деяких додатків, які дуже чутливі до затримки та тремтіння.
Для деяких дуже спеціалізованих застосувань це насправді має сенс робити. Я колись працював у режимі реального часу, який використовував лише широкомовні UDP-пакети для всіх міжвідомчих комунікацій з єдиної причини, що вона уникала того, щоб ці послідовності ARP запускалися, і непередбачувано додавали затримку та тремтіння. Я також колись працював над вбудованою системою з обмеженими ресурсами, яка працювала надсилаючи безпосередньо UDP корисні навантаження всередині IP-пакетів (без IP-заголовка), оскільки це економило всю складність та пам'ять, необхідну для реалізації всіх програм ARP та мережевої маски та додаткових контрольних сум.