Для чего нужен MAC-адрес и как он отличается от IP?

«Для чего нужен MAC-адрес и как он отличается от IP?» — вопрос из категории Сети, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MAC-адрес (Media Access Control) — это уникальный физический идентификатор сетевого интерфейса (сетевой карты, Wi-Fi-адаптера). Он "прошивается" производителем и работает на канальном уровне (L2) модели OSI. Его основная задача — доставка данных (кадров Ethernet) между устройствами в пределах одной локальной сети (LAN).

Ключевое отличие от IP:

  • MAC-адрес — для доставки "в соседнюю комнату" (в рамках одного сетевого сегмента, например, в вашей домашней Wi-Fi сети). Маршрутизаторы обычно не转发ят кадры на основе MAC за пределы локальной сети.
  • IP-адрес — для доставки "в другой город" (логическая адресация и маршрутизация между разными сетями через интернет).

Практический пример из разработки: При написании низкоуровневых сетевых инструментов на C++ (например, сканера сети или анализатора трафика с использованием библиотеки libpcap) может потребоваться получение MAC-адресов.

// Пример получения MAC-адреса сетевого интерфейса в Linux с использованием ioctl (упрощённый код)
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <iomanip>

void print_mac_address(const char* ifname) {
    struct ifreq ifr;
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

    if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
        unsigned char* mac = (unsigned char*)ifr.ifr_hwaddr.sa_data;
        std::cout << "MAC адрес " << ifname << ": ";
        for (int i = 0; i < 6; ++i) {
            std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)mac[i];
            if (i < 5) std::cout << ":";
        }
        std::cout << std::dec << std::endl;
    }
    close(sock);
}
// Вызов: print_mac_address("eth0");

В высокоуровневом C++-коде (например, веб-сервер на Boost.Asio) вы редко работаете с MAC-адресами напрямую, так как всю маршрутизацию берет на себя операционная система и сетевой стек, используя IP.