Перейти к содержанию

MAC-адрес

У каждого сетевого интерфейса — платы Ethernet, модуля Wi-Fi, адаптера Bluetooth — есть 48-битный адрес, по которому его находят в локальной сети. Первые байты говорят, кто выпустил устройство, а два младших бита первого байта независимо друг от друга говорят, индивидуальный это адрес или групповой (бит I/G) и выдан ли он глобально или назначен локально (бит U/L).

Обновлено Редакция GAW

MAC-адрес (MAC address, EUI-48) — 48-битный идентификатор сетевого интерфейса в сетях IEEE 802 — Ethernet и Wi-Fi; адреса того же 48-битного формата используют и устройства Bluetooth, хотя Bluetooth не входит в семейство IEEE 802. По нему кадр находит получателя внутри одного сегмента сети; IP-адрес нужен для маршрутизации между сетями, а связь двух адресов устанавливает протокол ARP. MAC-адрес вписывает в кадр контроллер MAC Ethernet, но сам адрес — это число, а не блок микросхемы.

Структура EUI-48

IEEE Registration Authority называет такой адрес EUI-48; в стандартах IEEE 802 он исторически звался MAC-48. Это шесть октетов, от октета 0 (старшего) до октета 5. Записывают их шестнадцатеричными парами через дефис: AC-DE-48-23-45-67 — пример из руководства IEEE RA, где AC-DE-48 — OUI организации, а 23-45-67 — номер, который организация присвоила устройству. Кроме блока MA-L с 24-битным OUI и 2^24 адресами, IEEE выдаёт блоки MA-M на 2^20 и MA-S на 2^12 адресов.

Два младших бита октета 0 особые:

Бит октета 0Значение 0Значение 1
бит 0 — I/Gиндивидуальный адрес одного интерфейсагрупповой адрес (multicast)
бит 1 — U/Lуниверсальный, выдан через OUI и глобально уникаленлокально администрируемый

Особые значения по IEEE RA: 00-00-00-00-00-00 никогда не используется как адрес устройства, а FF-FF-FF-FF-FF-FF — групповой адрес, все биты которого единицы; кадр на него принимают все узлы сегмента. Не путайте его с широковещательным адресом IPv4 вроде 192.168.1.255: тот относится к сетевому уровню и адресует узлы IP-подсети, а не интерфейсы канального уровня.

MAC-адрес у микроконтроллеров

Своего адреса у голого микроконтроллера нет: его прошивают на заводе, хранят в отдельной микросхеме или задают в программе. У ESP32 Espressif записывает базовый MAC в eFuse BLK0, и ESP-IDF выводит из него адреса всех интерфейсов. При четырёх универсальных адресах станция Wi-Fi получает базовый адрес, точка доступа — на единицу больше в последнем октете, Bluetooth — на два, Ethernet — на три. Если универсальных адресов меньше, недостающие ESP-IDF делает локальными: ставит бит U/L (0x2) в первом октете, а если он уже стоит, делает XOR первого октета с 0x4.

Для микросхем Ethernet без своего адреса, например W5500 или MAC в STM32, адрес записывает прошивка; как устроены эти контроллеры, рассказано в статье «Ethernet для микроконтроллеров». Две платы с одинаковым адресом в одной сети мешают друг другу: коммутатор не может решить, на какой порт отправлять кадры. Поэтому самодельный адрес без купленного OUI делают локальным — с битом U/L, — и следят, чтобы в пределах сети он не повторялся.

Частые вопросы

Как по MAC-адресу узнать производителя?

По первым трём октетам: при блоке MA-L это OUI, который IEEE Registration Authority выделила организации, например AC-DE-48 в примере из руководства IEEE. Реестр MA-L, MA-M и MA-S открыт на сайте IEEE RA; у блоков MA-M и MA-S производителя определяют по первым 28 или 36 битам. Если в первом октете стоит бит U/L, адрес локальный и производителя по нему не узнать.

Можно ли поменять MAC-адрес на микроконтроллере?

Можно, но адрес должен остаться уникальным в своей сети. В ESP-IDF свой базовый MAC задают функцией esp_iface_mac_addr_set с аргументом ESP_MAC_BASE до инициализации сети, а хранить его можно во флеш, NVS или eFuse BLK3. Для самодельного адреса без своего OUI ставьте бит U/L — это локально администрируемый адрес, и IEEE не гарантирует его уникальность.

Почему у ESP32 MAC Wi-Fi и Bluetooth отличаются на единицу?

ESP-IDF вычисляет адреса всех интерфейсов из одного базового MAC в eFuse: при настройке на четыре универсальных адреса Wi-Fi Station получает сам базовый адрес, точка доступа — плюс один к последнему октету, Bluetooth — плюс два, Ethernet — плюс три. Поэтому на наклейке модуля обычно стоит один адрес, а в сети устройство видно под несколькими.

Источники

  1. IEEE Registration Authority. Guidelines for Use of Extended Unique Identifier (EUI), Organizationally Unique Identifier (OUI), and Company ID (CID) (tutorial, 2017-08-03, figure corrected 2019-08-16) — с. 5–6: когда EUI служит MAC-адресом, младший бит октета 0 (I/G) означает индивидуальный (0) или групповой (1) адрес, второй бит (U/L) — универсальное (0) или локальное (1) администрирование; универсально администрируемый адрес должен быть глобально уникальным; IEEE Std 802 исторически называет EUI-48 «MAC-48»; с. 7: блоки MA-L, MA-M и MA-S дают 2^24, 2^20 и 2^12 адресов EUI-48; с. 9, табл. 6: EUI-48 — шесть октетов от октета 0 (старшего); пример AC-DE-48-23-45-67, где AC-DE-48 — OUI, 23-45-67 — расширение; с. 11: 00-00-00-00-00-00 не используется как EUI, FF-FF-FF-FF-FF-FF — групповой (multicast) адрес IEEE 802
  2. Espressif. ESP-IDF Programming Guide v6.1, ESP32: Miscellaneous System APIs, section «MAC Address» — MAC-адреса всех интерфейсов вычисляются из одного базового MAC, записанного Espressif в eFuse BLK0 на заводе; при четырёх универсальных адресах: Wi-Fi Station — base_mac, SoftAP — +1 к последнему октету, Bluetooth — +2, Ethernet — +3; свой базовый MAC задают esp_iface_mac_addr_set(ESP_MAC_BASE) до инициализации сетевых интерфейсов; свой адрес в eFuse BLK3: 48 бит MAC и CRC-8-CCITT с полиномом 0x07; esp_derive_local_mac() получает локальный адрес установкой бита U/L (0x2) в первом октете, а если он уже стоит — XOR первого октета с 0x4

Нашли ошибку?