> Что такое протокол ARP (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: YADRO

Стек: Go

> Пример ответа

Короткий ответ

ARP (Address Resolution Protocol) - протокол канального уровня, который сопоставляет IP-адрес устройства с его MAC-адресом в пределах одной локальной сети. Когда узел хочет отправить пакет другому узлу в той же подсети, он сначала отправляет broadcast-запрос "кто владеет этим IP?", получает ответ с MAC-адресом и сохраняет соответствие в ARP-кэше. Это необходимо, потому что на канальном уровне (Ethernet, Wi-Fi) коммутация происходит по MAC-адресам, а не по IP.

Подробное объяснение

ARP работает на стыке сетевого (L3) и канального (L2) уровней модели OSI. Когда приложение отправляет данные на IP-адрес, стек протоколов должен определить, какому MAC-адресу передать кадр. Если целевой IP находится в другой подсети, ARP используется для поиска MAC-адреса шлюза по умолчанию.

Процесс выглядит так:

  1. Узел проверяет свой ARP-кэш - таблицу соответствий IP → MAC.
  2. Если записи нет, формируется ARP-запрос: broadcast-кадр (MAC FF:FF:FF:FF:FF:FF) с IP-адресом назначения в поле запроса.
  3. Все устройства в сети получают этот кадр, но отвечает только то, чей IP совпадает с запрошенным. Ответ - unicast-кадр с MAC-адресом владельца IP.
  4. Запросчик сохраняет полученное соответствие в кэше с TTL (обычно 60-300 секунд) и отправляет исходный пакет.

Важные детали:

  • ARP работает только в пределах broadcast-домена (одна L2-сеть). Для маршрутизации между сетями используется ARP на каждом хопе отдельно.
  • Существует также Gratuitous ARP - объявление своего IP-MAC соответствия без запроса, используется при смене IP или для обнаружения конфликтов адресов.
  • ARP-таблица может быть статической (задаётся вручную) или динамической (заполняется автоматически).
  • Протокол не имеет механизмов аутентификации, поэтому уязвим для ARP-spoofing - подмены MAC-адреса в ответах.

На практике

В Go при разработке сетевых сервисов ARP редко используется напрямую - обычно работа идёт на уровне TCP/UDP, а ARP обрабатывает ядро ОС. Однако понимание ARP важно для:

  • диагностики сетевых проблем (команды arp -a, ip neigh в Linux);
  • реализации инструментов сетевого сканирования или мониторинга;
  • отладки контейнерных сетей, где виртуальные интерфейсы и мосты активно используют ARP;
  • написания низкоуровневых утилит с использованием raw sockets или библиотек типа gopacket.

При работе с Docker или Kubernetes важно помнить, что каждый контейнер имеет свой сетевой namespace, и ARP-таблицы изолированы. При использовании bridge-сети Docker сам управляет ARP-записями для контейнеров.

Пример кода

В Go можно отправить ARP-запрос с помощью библиотеки gopacket:

GO
package main
import (
"fmt"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func main() {
ifaceName := "eth0"
targetIP := net.ParseIP("192.168.1.1")
handle, err := pcap.OpenLive(ifaceName, 65536, true, pcap.BlockForever)
if err != nil {
panic(err)
}
defer handle.Close()
srcMAC, _ := net.ParseMAC("00:11:22:33:44:55")
srcIP := net.ParseIP("192.168.1.100")
eth := &layers.Ethernet{
SrcMAC: srcMAC,
DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
EthernetType: layers.EthernetTypeARP,
}
arp := &layers.ARP{
AddrType: layers.LinkTypeEthernet,
Protocol: layers.EthernetTypeIPv4,
HwAddressSize: 6,
ProtAddressSize: 4,
Operation: layers.ARPRequest,
SourceHwAddress: srcMAC,
SourceProtAddress: srcIP.To4(),
DstHwAddress: net.HardwareAddr{0, 0, 0, 0, 0, 0},
DstProtAddress: targetIP.To4(),
}
buf := gopacket.NewSerializeBuffer()
opts := gopacket.SerializeOptions{}
err = gopacket.SerializeLayers(buf, opts, eth, arp)
if err != nil {
panic(err)
}
err = handle.WritePacketData(buf.Bytes())
if err != nil {
panic(err)
}
fmt.Println("ARP request sent")
}

Как отвечать на собеседовании

Начни с краткого определения, затем опиши сценарий использования: "когда узел хочет отправить пакет, он должен узнать MAC-адрес получателя". Обязательно упомяни broadcast-запрос и unicast-ответ, а также ARP-кэш с TTL. Если спросят про маршрутизацию - поясни, что ARP работает только в пределах одной L2-сети, а для внешних адресов используется MAC шлюза. Для уровня junior достаточно уверенного объяснения базового механизма и пары практических деталей (например, команда ip neigh). Если интервьюер углубляется - расскажи про gratuitous ARP и ARP-spoofing, но не уходи в излишние детали, если не просят.

Что проверяет интервьюер

  • Понимание разницы между IP-адресом (L3) и MAC-адресом (L2).
  • Знание, что ARP - это broadcast-протокол, работающий в пределах одной подсети.
  • Осознание роли ARP-кэша и его временного характера.
  • Понимание, почему ARP не нужен при отправке на адрес из другой сети (используется шлюз).
  • Базовое представление о безопасности: отсутствие аутентификации, возможность подмены.

Типичные ошибки

  • Утверждение, что ARP работает между разными сетями или через маршрутизаторы - это неверно, ARP всегда локальный.
  • Путаница между ARP и DNS: DNS сопоставляет имена и IP, ARP - IP и MAC.
  • Забывают упомянуть ARP-кэш и его TTL.
  • Говорят, что ARP использует TCP или UDP - на самом деле это отдельный протокол, инкапсулированный напрямую в Ethernet-кадр.
  • Не различают broadcast-запрос и unicast-ответ.
  • Путают MAC-адрес шлюза и MAC-адрес конечного получателя при отправке в другую сеть.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью