Networking

Сетевой адаптер

Устройство, подключающее компьютер к сети: принимает и отправляет кадры, имеет MAC-адрес и в системе виден как сетевой интерфейс.

Что такое Сетевой адаптер

Сетевой адаптер (сетевая карта, NIC — Network Interface Card) — устройство, через которое компьютер подключается к сети. Оно превращает данные из памяти в электрические или световые сигналы и обратно, а заодно берёт на себя проверку целостности кадров и часть работы, которую иначе делал бы процессор.

Сетевая карта и сетевой адаптер — одно и то же: исторически «картой» называли отдельную плату в слот PCIe, но сегодня адаптер чаще распаян на материнской плате или вовсе виртуальный.

Сетевой интерфейс — то, как адаптер выглядит в операционной системе: именованная точка, которой назначают IP-адрес и маршруты. Разница важная: интерфейс не обязан соответствовать железу. lo (loopback), мосты Docker, туннели VPN — полноценные интерфейсы без всякой карты.

MAC-адрес

У каждого адаптера есть MAC-адрес — 48-битный идентификатор, зашитый производителем: 52:54:00:ab:cd:ef. Первые три байта — код вендора (OUI), остальные назначает сам производитель.

Разделение обязанностей простое: IP-адрес нужен, чтобы найти узел в интернете, MAC — чтобы доставить кадр внутри локального сегмента. Соответствие между ними в IPv4 выясняет протокол ARP, в IPv6 — NDP.

$ ip -br link
lo               UNKNOWN        00:00:00:00:00:00
eth0             UP             52:54:00:ab:cd:ef
docker0          DOWN           02:42:9c:1f:3a:11

$ ip neigh                       # ARP-таблица: кто есть кто в сегменте
10.0.0.1 dev eth0 lladdr 00:1a:2b:3c:4d:5e REACHABLE

MAC используют для резервации адреса на DHCP-сервере и для привязки лицензий — а ещё он не проходит дальше первого маршрутизатора, поэтому «вычислить по MAC» из интернета невозможно.

Что показывает ethtool

ethtool — основной инструмент для физического адаптера: он говорит о железе то, чего не знает ip.

$ ethtool eth0
Settings for eth0:
        Speed: 10000Mb/s
        Duplex: Full
        Auto-negotiation: on
        Link detected: yes

$ ethtool -S eth0 | grep -i -E "drop|error"
     rx_dropped: 0
     tx_errors: 0

На что смотреть: Speed — реальная скорость линка (гигабитная карта, договорившаяся на 100 Мбит/с, — почти всегда плохой кабель или порт коммутатора); Duplex: Half на современной сети означает коллизии и провал производительности; растущие rx_dropped и errors — проблему физики: кабель, оптический модуль, перегрев.

Разгрузка и производительность

Адаптер умеет забирать работу у процессора — это и есть offload:

Функция Что делает
TSO / GSO нарезка большого блока на сегменты — на карте, а не в ядре
GRO / LRO сборка входящих пакетов в крупные блоки перед передачей в стек
Checksum offload подсчёт контрольных сумм на карте
RSS распределение прерываний по ядрам процессора
$ ethtool -k eth0 | grep -E "tcp-segmentation|generic-receive"
tcp-segmentation-offload: on
generic-receive-offload: on

Не трогайте offload без причины — они включены не зря. Единственный частый повод отключить: снятие дампа tcpdump, где GRO показывает неправдоподобно большие пакеты и путает анализ. При 10 Гбит/с и выше одного ядра не хватает на обработку прерываний — спасают RSS и привязка очередей к ядрам. Порядок величин полезно помнить: 1 Гбит/с — это ~125 МБ/с, 10 Гбит/с — ~1,25 ГБ/с, быстрее многих дисков.

Адаптеры на серверах и в виртуализации

В виртуальной машине адаптер эмулируется гипервизором. Стандарт — virtio-net: гость знает, что виртуализирован, и не тратит такты на эмуляцию несуществующего железа. Когда нужна максимальная скорость, применяют SR-IOV: физическая карта делится на виртуальные функции (VF), каждая пробрасывается в свою ВМ напрямую, и гипервизор из тракта данных исчезает. Приём тот же, что и GPU passthrough, и с тем же компромиссом: скорость в обмен на гибкость при миграции.

Два адаптера объединяют в bond: отказ одного линка не рвёт связность, а в режиме LACP суммируется и полоса. Стандартная практика для любого сервера с требованиями по отказоустойчивости.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер