От битов и hex до MAC-адресов и протокола ARP
двоичная · hex · IP-октеты
строение · биты I/G, U/L · типы
как по IP узнать MAC
инкапсуляция и декапсуляция
Почему машина думает нулями и как из них вырастают 192.168.0.13 и F4-46-37-55-24-86
Данные, спускаясь по уровням модели, обрастают заголовками: транспортный уровень добавляет номера портов, сетевой — IP-адреса, канальный — MAC-адреса. Но за этой лёгкостью прячутся два вопроса, на которые мы пока не отвечали.
Для нас 192.168.0.1 — четыре числа. Но внутри у компьютера нет цифр — есть только напряжение: «есть ток или нет». Значит, адрес внутри выглядит совсем иначе — придётся спуститься к двоичной записи.
Свой IP и MAC узел знает. IP получателя тоже. А MAC получателя взять неоткуда — он «зашит» в чужую карту. Нужен механизм, который по IP выяснит MAC. Это протокол ARP.
Любое устройство хранит информацию через физические состояния: заряжен участок памяти или нет, есть напряжение или нет. Их удобно свести к двум устойчивым положениям.
Два состояния надёжнее десяти: их проще отличать, они меньше «плывут» от помех. Одно обозначают 0, другое 1 — и любое число, буква, адрес превращается в длинную последовательность нулей и единиц.
Всё «человеческое» — десятичные числа, точки, буквы — лишь удобная форма записи. Машина видит поток битов.
Бит — это тумблер · кликай ›
Возьмём число 192. Важна не только цифра, но и её позиция (разряд). Значение цифры умножается на «вес» разряда — степень основания:
Само число 10 называется основанием — это количество разных цифр (0…9, ровно десять).
Позиционная система счисления — система, в которой значение цифры зависит от её места (позиции) в числе. Количество используемых цифр называется основанием.
Та же идея позиционности, но основание 2. Веса разрядов — степени двойки. Кликай по разрядам — сумма «гирь» считается вживую:
Один октет · клик по битам
IP-адрес · собери 4 октета
0.0.0.0
Клик включает/выключает «гирю». Так на паре можно посчитать любой перевод 2 ↔ 10 прямо на экране.
Возьмём 13. Спрашиваем: суммой каких степеней двойки его собрать? 13 = 8 + 4 + 1. Значит, на весах лежат гири 8, 4 и 1, а гири 2 — нет. Начальные нули отбрасываем:
Читается «один-один-ноль-один» — это набор битов, а не «тысяча сто один». В разряде либо 0 (гири нет), либо 1 (гиря есть) — цифры 3 в двоичной не существует.
Переведём 196. Подбираем гири: 196 = 128 + 64 + 4.
Обратный перевод ещё проще: сложить веса разрядов, где стоит 1. Возьмём 10101000₂:
128 + 32 + 8 = 168
Физически устройство получает ленту из 32 бит. Держать её в голове невозможно, поэтому делаем два шага.
Шаг 1 — режем на октеты по 8 бит. Шаг 2 — каждый октет в десятичное число:
Двоичная запись честная, но длинная. Десятичная короткая, но плохо «дружит» с двоичной: одна десятичная цифра не соответствует ровному числу битов. Нужна третья система — короткая, как десятичная, и совпадающая с двоичной по границам разрядов.
Такая система — шестнадцатеричная: позиционная, основание 16. Но привычных цифр только десять (0–9) — где взять ещё шесть? Недостающие обозначили буквами:
Одна hex-цифра = ровно 4 бита (тетрада). Выделены ключевые: 1111 → F и 1010 → A.
| DEC | BIN | HEX |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| DEC | BIN | HEX |
|---|---|---|
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
Идём через двоичную запись. Раскладываем: 250 = 128 + 64 + 32 + 16 + 8 + 2 → 11111010₂. Режем на тетрады по 4 бита и подставляем по таблице:
Механично: «разрезал по четыре и подставил по таблице».
Три внешне похожих числа дают три разных значения. Ноль где угодно, кроме крайней левой позиции, меняет значение — он «раздвигает» разряды. А крайние левые нули (leading zeroes) можно отбрасывать.
48 бит, две половины OUI и Interface ID, два служебных бита — и три типа рассылки
Под MAC отведено 48 бит (6 байт). В двоичном виде — 48 символов подряд, читать тяжело. В десятичном — шесть октетов, но MAC станет неотличим от IP. В шестнадцатеричном — всего 6 групп по 2 цифры, коротко и узнаваемо (буквы сразу выдают: «это hex, это MAC»).
111101000100011000110111…
48 символов — тяжело
244.70.55.85.36.134
путается с IP
F4-46-37-55-24-86
коротко и узнаваемо ✓
Команда ipconfig (Windows; в Linux — ifconfig / ip a) показывает MAC. Часто он подписан вторым именем — физический адрес (Physical Address).
C:\Users\student> ipconfig /all
Ethernet adapter Ethernet:
Описание. . . . . . . . . : Realtek PCIe GbE Family Controller
Физический адрес (Physical Address). . : F4-46-37-55-24-86
DHCP включён. . . . . . . : Да
IPv4-адрес. . . . . . . . : 192.168.0.13Двенадцать hex-цифр = шесть пар = 48 бит (каждая цифра = 4 бита). Развернём потетрадно:
Любой MAC делится на две равные половины по 24 бита. Коды OUI выдаёт централизованно IEEE — как IANA раздаёт IP, кто-то один ведёт общий реестр (standards-oui.ieee.org).
идентификатор производителя (IEEE)
порядковый номер адаптера
Внутри первого октета OUI спрятаны два управляющих бита — они говорят, как обращаться с адресом. Аналогия: два флажка на конверте — они не меняют текст письма, но меняют, как с ним поступить.
Individual / Group. «Кадр одному или многим?» 0 — одноадресная, 1 — групповая или широковещательная.
Universal / Local. «Адрес настоящий или назначенный?» 0 — заводской (глобально уникальный), 1 — изменён (рандомизация MAC).
Пронумеруем биты от старшего (Bit7) к младшему (Bit0). Смотрим на два младших:
Bit0 = 0 → адрес одноадресный (unicast)
Bit1 = 0 → адрес заводской, не менялся
Компьютер показывает сети честный заводской адрес и принимает только адресованные лично ему кадры.
Один источник → многим, но не всем (прямой эфир на Rutube: источник один, зрителей тысячи). На сетевом уровне это multicast IP из диапазона 224.0.0.0 – 239.255.255.255. На канальном для группового трафика собирают специальный MAC прямо из IP:
младший бит первого октета = 1 — тот самый I/G: «кадр групповой»
всегда нулевой
переносятся младшие 23 бита группового IP-адреса
Источник вещает с группового IP 239.193.1.15. В IP 32 бита, но в MAC уместятся только младшие 23 — старшие 9 бит отбрасываются. Разложим IP по битам и нажмём кнопку: серые уходят, оранжевые остаются.
Фиксированная половина 01-00-5E занимает первые 24 бита, 25-й бит = 0 обязателен, а в оставшиеся 23 бита ложатся младшие биты IP из этапа 1. Прокликай шаги — таблица заполняется по частям.
Иногда нужно достучаться до всех узлов сразу — когда отправитель ещё не знает, кому адресовать (так работают ARP и DHCP). Решение лаконичное: 48 единиц. В первом октете FF = 11111111 оба служебных бита = 1 (I/G=1 «не одноадресный», U/L=1 «сконструирован»). В Wireshark подписан Broadcast.
= 48 единиц · держатся на нём DHCP и ARP
Как по известному IP выяснить неизвестный MAC — запрос всем, ответ лично
Чтобы передать данные соседу, нужны два адреса получателя: IP (логический) и MAC (физический). Без MAC протокол Ethernet не соберёт кадр. Свой IP и MAC узел знает, IP получателя — тоже. А MAC получателя взять неоткуда: он зашит в чужую карту.
сетевой протокол для определения MAC-адреса устройства по его известному IP-адресу.
Узел .233 формирует широковещательный кадр (DST = FF-FF-FF-FF-FF-FF) с вопросом «У кого IP .1? Ответьте .233» — это ARP-запрос. Коммутатор рассылает всем; каждый сравнивает Target IP со своим. Совпадение у одного — он отвечает одноадресно, ведь MAC спрашивавшего известен из запроса. Отправитель пишет MAC в свою ARP-таблицу.
Так выглядит перехваченный запрос. Красные номера — те же поля, что мы разбирали: адреса, протокол, opcode и четыре ARP-поля.
| No. | Time | Source | Destination | Protocol | Length | Info |
|---|---|---|---|---|---|---|
| 2 | 0.057276 | 1IntelCor_55:24:86 | 2Broadcast | 3ARP | 442 | 5Who has 192.168.1.1? Tell 192.168.1.233 |
| 7 | 0.099701 | ASUSTekC_30:e2:9c | IntelCor_55:24:86 | ARP | 42 | 192.168.1.1 is at ac:9e:17:30:e2:9c |
Пакет №7 — ответ. Source и Destination поменялись местами, Destination теперь не Broadcast, а конкретный MAC, а Opcode стал reply (2).
| No. | Time | Source | Destination | Protocol | Length | Info |
| 2 | 0.057276 | IntelCor_55:24:86 | Broadcast | ARP | 42 | Who has 192.168.1.1? Tell 192.168.1.233 |
| 7 | 0.099701 | 1ASUSTekC_30:e2:9c | 2IntelCor_55:24:86 | 3ARP | 42 | 5192.168.1.1 is at ac:9e:17:30:e2:9c |
Служебные биты искомого MAC: U/L = 0 (заводской), I/G = 0 (unicast) — «кричать» больше незачем.
Рассылать broadcast перед каждой отправкой расточительно. Поэтому узел складывает пары IP ↔ MAC в ARP-таблицу и заглядывает туда первым делом. Записи со временем устаревают — устройства меняются, и «вечная» запись начала бы врать. Ограниченное время жизни держит таблицу и компактной, и актуальной.
| Интернет-адрес | Физический адрес | Тип |
|---|---|---|
| 192.168.1.1 | ac-9e-17-30-e2-9c | динамический |
| 192.168.1.255 | ff-ff-ff-ff-ff-ff | статический |
| 224.0.0.22 | 01-00-5e-00-00-16 | статический |
PC-A отправляет файл PC-B: инкапсуляция вниз, ARP добывает MAC, декапсуляция вверх
Приложения (FTP). Файл форматируется и уходит ниже — к TCP.
Транспортный (TCP). Разбивка на сегменты, метки портов: источник 54236, назначение 21 (FTP). Получаем сегмент.
Сетевой (IP). Проставляются SrcIP и DstIP (оба известны). Сегмент стал пакетом.
Чтобы упаковать пакет в кадр, нужен MAC PC-B — а его PC-A не знает. PC-A запоминает почти готовый пакет в памяти и формирует ARP-запрос: IP получателя = IP PC-B, MAC получателя = широковещательный FF:FF:FF:FF:FF:FF.
Широковещание. Коммутатор рассылает кадр всем. Фильтрация: PC-C убеждается, что запрос не ему, и отбрасывает; PC-B узнаёт свой IP и готовит ответ.
ARP-ответ. PC-B отправляет ответ одноадресно обратно на PC-A, вложив свой MAC.
Достройка. PC-A записывает MAC PC-B в ARP-таблицу и достаёт из памяти тот самый пакет. Теперь есть оба адреса — пакет упаковывается в кадр.
Отправка. PC-A шлёт готовый кадр одноадресно на PC-B; коммутатор по своей таблице отправляет его только в нужный порт.
Канальный. PC-B видит, что DstMAC — его, снимает Ethernet-заголовок → пакет.
Сетевой. Сравнивает DstIP со своим, снимает IP-заголовок → сегмент.
По полю «порт назначения» DPrt = 21 PC-B понимает: это FTP. Заголовок сегмента снимается, данные уходят FTP, который форматирует и записывает файл на диск. Передача завершена ✓.
Всё сложилось в цепочку: биты дали возможность записывать адреса, октеты и hex сделали их читаемыми, типы MAC задали адресацию «одному / группе / всем», а ARP связал мир IP с миром MAC. Дальше — маршрутизаторы и шлюзы, когда получатель в другой сети.
| IP | MAC |
|---|
| MAC | порт |
|---|
По групповому IP собрать multicast-MAC: записать IP в двоичном виде, взять младшие 23 бита, приписать к 01-00-5E и нулевому 25-му биту.
По первым 24 битам (OUI) определить производителя сетевой карты; сверить с реестром IEEE и прочитать служебные биты первого октета.
Биты → адреса → типы MAC → ARP → инкапсуляция. Дальше — маршрутизаторы и шлюзы.