Ответ
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.