Learning Platform
Глоссарий Troubleshooting
Урок 05.03 · 18 мин
Начальный
SwitchHubMAC tableBroadcast DomainCollision Domain

Свитчи vs хабы — как кадр находит правильный порт

В 1990-х в офисах стояли коробки-хабы (концентраторы), и любой кадр, влетевший в один порт, выплёвывался во все остальные. Сейчас вместо хабов везде свитчи — они умные, и кадр идёт только в нужный порт. Эта разница кажется мелкой, но она поменяла сети в десятки раз: дала full duplex, ускорила всё на порядки, сделала VLAN-ы возможными.

В этом уроке разберём, как свитч на самом деле узнаёт, в какой порт класть кадр, что такое MAC-table и какой это L2 device, чем отличаются broadcast domain и collision domain. Это понимание важно для DE, потому что когда вы видите tcpdump-овые загадки («почему я не вижу трафик соседа?»), правильный mental model свитча сразу даёт ответ.


Хаб — тупой повторитель

Хаб (он же повторитель, repeater) — электрический усилитель. Он не имеет интеллекта, не понимает структуру Ethernet-кадра, не смотрит на MAC. Принцип:

  1. На любой порт хаба что-то приходит.
  2. Хаб повторяет этот сигнал на ВСЕ остальные порты.
  3. Все устройства смотрят на dst MAC в кадре и решают сами: моё — беру, не моё — молча игнорирую.
Хаб -- broadcast любого кадра во все порты
Host AОтправляет кадр для Host C на свой порт хаба
HubНе смотрит на MAC. Повторяет сигнал на ВСЕ другие порты
Port BHost B видит кадр, смотрит dst MAC -- 'не мой' -- дропает. Но всё равно потратил CPU и пропускную полосу
Port CHost C видит кадр, dst MAC = его MAC -- принимает
Port DHost D тоже видит, не его -- дропает

Что плохого в хабе:

  1. Пропускная полоса делится. Если хаб 100 Мбит/с и 4 устройства активно общаются — каждое получает в среднем 25 Мбит/с (а на пике трафика и того меньше).
  2. Коллизии. Если A и B шлют одновременно — сигналы накладываются, оба теряются. CSMA/CD: устройства слушают перед передачей, если коллизия — ждут случайное время и повторяют. Это half-duplex по определению.
  3. Подслушивание. Любой кадр виден всем. Это раздолье для snifferов: пускаешь Wireshark на хаб — видишь весь трафик всех устройств.
  4. Безопасность. MAC-фильтры не помогают — кадр всё равно физически приходит.

Хабы вымерли как класс примерно к 2005 году. Сейчас «хаб» — ругательное слово в IT.


Свитч — умный коммутатор

Свитч (он же bridge) — устройство второго уровня OSI. Он понимает Ethernet-кадры, читает MAC-адреса и знает, какой MAC за каким портом. Когда приходит кадр:

  1. Свитч смотрит на dst MAC в кадре.
  2. Ищет этот MAC в своей MAC-table (forwarding table).
  3. Если нашёл — отправляет кадр только в тот порт.
  4. Если не нашёл — посылает во все порты (кроме того, откуда пришёл) — это называется flooding.
  5. Когда устройство отвечает — свитч учит, в каком порту этот MAC.
Свитч -- кадр идёт точно в нужный порт
Host AШлёт кадр на dst MAC = C. Свитч получает его на port 1
port 1
SwitchСмотрит на dst MAC = C. В MAC-table запись: C находится за port 3. Forward в port 3, в остальные порты не идёт
Port BНе получает ничего. Свитч не послал сюда кадр. Сосeд занят -- мы не знаем и не мешаем
Port CПолучает кадр. Принимает
Port DТоже не получает ничего

Преимущества:

  1. Full duplex. A может слать B, C может слать D одновременно — разные порты, никаких коллизий. Свитч 24x1Gbit фактически даёт 24 Gbit/s одновременно.
  2. Изоляция. B не видит трафик между A и C. Лучше с приватностью и безопасностью.
  3. Меньше нагрузки на хостов. Хост получает только нужные ему кадры.
  4. Поддержка большого числа устройств. Свитчи с MAC-table на десятки тысяч записей.

MAC learning — как свитч заполняет таблицу

Свитч не получает MAC-table от админа. Он учится сам в процессе работы. Алгоритм:

  1. Свитч включается — MAC-table пуста.
  2. Приходит первый кадр на port 1 c src MAC = A. Свитч учит: «MAC A за port 1». Запоминает с TTL ~5 минут.
  3. Что делать с этим кадром? Смотрит на dst MAC. Если в таблице нет — flood во все порты.
  4. Если кто-то ответил — его src MAC = B, пришло с port 3. Учит: «MAC B за port 3».
  5. Следующий кадр от A к B — уже знаем, идёт точно в port 3.
MAC learning -- свитч строит таблицу из проходящего трафика
t=0Свитч пустой. Любой кадр будет flood'иться, потому что таблица пустая
A speaks
t=1A послал кадр на port 1. Свитч учит: 'A за port 1'. Таблица: A -> port 1
t=2B послал на port 3. Свитч учит: 'B за port 3'. Таблица: A -> 1, B -> 3
A -> B
t=3A шлёт B. Свитч видит dst=B, в таблице B->port 3. Forward точечно. Никаких флудов

Записи в MAC-table имеют TTL (обычно 300 секунд). Если за это время с MAC не было трафика — запись стирается. Это нужно, чтобы:

  • Если устройство переключили в другой порт — свитч переучится.
  • MAC-table не разрастается бесконечно.

Посмотреть MAC-table на свитчах с CLI:

# Cisco IOS:
show mac address-table

# MikroTik RouterOS:
/interface bridge host print

# Linux bridge (если у вас Linux работает как свитч):
bridge fdb show
# или:
brctl showmacs br0

Это выведет таблицу формата MAC | VLAN | port | age | type.


Broadcast vs collision domain — разница, которую важно понимать

Эти два понятия путают чаще всего. Они не одно и то же.

Collision domain — область, где два устройства могут «столкнуться» при одновременной передаче (физическая коллизия сигналов).

  • На хабе: collision domain = весь хаб. Все 8 портов хаба — один collision domain. Двое говорят одновременно — коллизия.
  • На свитче: каждый порт = отдельный collision domain. Точка. Свитч физически разделяет порты.
  • Full duplex Ethernet (современный): collision domain как понятие почти бессмысленно — одновременная передача в обе стороны — норма.

Broadcast domain — область, до которой долетит broadcast-кадр (dst MAC = ff:ff:ff:ff:ff:ff).

  • На свитче: все порты — один broadcast domain. ARP-broadcast долетит до всех устройств за свитчём.
  • Свитчи можно соединять цепочкой — broadcast domain расширяется (если без VLAN-ов — сильно расширяется, иногда болезненно).
  • Граница broadcast domain — роутер. Роутер по умолчанию не пересылает broadcast’ы.
Свитч: разные collision domains, один broadcast domain
Host AСвой collision domain -- port 1. Может слать одновременно с другими портами без коллизий
Host BСвой collision domain -- port 2
Host CСвой collision domain -- port 3
Switch3 collision domains (по числу портов), 1 broadcast domain (все порты в одной L2-сети)
ARP broadcastКадр с dst=ff:ff:... От A идёт во все порты свитча (кроме порта A). B и C видят его -- они в том же broadcast domain

Почему это важно. Когда у вас в офисе 200 машин в одном broadcast domain:

  1. Каждый ARP-запрос видят все 200.
  2. DHCP DISCOVER (тоже broadcast) видят все 200.
  3. mDNS, LLMNR, NetBIOS broadcast’ы — всё в эту же кучу.
  4. Если кто-то сделает broadcast storm (петля в свитчах + broadcast в петле) — сеть умрёт.

Решение: делить broadcast domain на VLAN-ы (про них в следующем уроке) или использовать роутер.


Свитч — L2 устройство, но границы размываются

Классический свитч работает только на layer 2 — смотрит исключительно на MAC. Но в современности:

  • L3 свитчи (managed) — умеют делать роутинг между VLAN-ами на железе, очень быстро. На уровне backplane они работают как роутер+свитч в одном корпусе.
  • L4-L7 свитчи / load balancers — умеют делать решения на основе TCP-портов и даже HTTP-заголовков (это уже не свитчи, конечно, а application-level девайсы, но маркетинг такой).

В мире DC сейчас почти все свитчи — L3, потому что в современных топологиях (spine-leaf) роутинг на свитчах — норма.


Что с этим делать на практике

Видеть таблицу. Если у вас Linux-машина работает как свитч (через brctl или nmcli bridge), вы можете посмотреть bridge fdb show. Это полная аналогия MAC-table.

Понимать tcpdump. Если вы делаете tcpdump -i eth0 на машине — видите только трафик, который идёт через eth0 этой машины. Свитч не присылает вам чужой трафик. Это базовый ответ на «почему я не вижу пакеты между двумя соседями».

Чтобы увидеть чужой трафик:

  • Сделать port mirror / SPAN на свитче (если есть admin-доступ).
  • Использовать tap-устройство физически на проводе.
  • Атаковать ARP-таблицы (ARP poisoning, но это незаконно за пределами своей лаборатории).

Понимать broadcast. Если ваш сервис делает много DNS lookup’ов на каждый запрос, эти DNS-запросы идут через свитч — normal traffic. Но если у вас в Kubernetes сотни pod’ов делают mDNS discovery — broadcast storm может положить весь сегмент.

Понимать MAC flapping. Если один MAC видим то с одного порта, то с другого — свитч начинает плеваться warnings. Это может быть:

  • Петля в кабелях (два провода между свитчами без STP).
  • Bond без правильной конфигурации (active-active без LACP).
  • Виртуалка с миграцией между гипервизорами без правильной настройки.
# Логи свитча (Cisco):
# %MAC_MOVE-SP-4-NOTIF: Host AAAA.BBBB.CCCC in vlan 10 is flapping between port Gi1/0/3 and port Gi1/0/5

# Linux bridge:
dmesg | grep -i 'received packet on'
# или
bridge link show

Попробуй сам

# Если у вас Linux и есть рутовый доступ -- создайте свой свитч:

# 1. Создать bridge (программный свитч):
sudo ip link add name br-test type bridge
sudo ip link set br-test up

# 2. Добавить два виртуальных интерфейса (veth pair):
sudo ip link add veth-a type veth peer name veth-a-br
sudo ip link add veth-b type veth peer name veth-b-br
sudo ip link set veth-a-br master br-test
sudo ip link set veth-b-br master br-test
sudo ip link set veth-a-br up
sudo ip link set veth-b-br up
sudo ip link set veth-a up
sudo ip link set veth-b up

# 3. Задать IP в одном broadcast domain:
sudo ip addr add 10.99.99.1/24 dev veth-a
sudo ip addr add 10.99.99.2/24 dev veth-b

# 4. Пингануть и посмотреть, как заполняется MAC-table:
ping -c 3 -I veth-a 10.99.99.2
bridge fdb show br br-test    # увидите MAC-и обоих veth
# +обнаружите, что свитч узнал MAC через MAC-learning

# 5. Сэмулировать сниффер -- запустить tcpdump на bridge:
sudo tcpdump -i br-test
# и параллельно генерировать трафик:
ping -I veth-a 10.99.99.2

# 6. Очистить:
sudo ip link del br-test
sudo ip link del veth-a
sudo ip link del veth-b

Это самый простой способ потрогать свитч руками — Linux bridge ведёт себя как реальный managed switch.

# Если у вас macOS -- запустите docker-контейнеры на одной bridge-сети:
docker network create test-bridge
docker run -d --name a --network test-bridge alpine sleep 1000
docker run -d --name b --network test-bridge alpine sleep 1000
docker exec a ping -c 3 b
# Под капотом Docker делает то же самое -- Linux bridge + veth.

Linux bridge в Docker: MAC-learning и forwarding в действии
Проверка знанийKnowledge check
Вы запустили tcpdump на своём ноутбуке, надеясь увидеть трафик коллеги, сидящего за соседним столом (вы оба в одной офисной сети). tcpdump молчит -- видны только ваши собственные пакеты. Объясните, почему. И что нужно сделать (легально), чтобы увидеть чужой трафик в этой сети для диагностики?
ОтветAnswer
Причина в том, что современная офисная сеть стоит на свитчах, а не хабах. Свитч смотрит на dst MAC каждого кадра и шлёт его только в порт, за которым находится этот MAC. Когда коллега общается со своим сервером, свитч отправляет эти кадры только в порт коллеги и порт сервера/uplink -- ваш порт не задействован, и tcpdump ничего не видит. На хабе вы бы видели всё, но хабы вымерли как класс. Чтобы легально увидеть чужой трафик для диагностики, есть несколько способов: 1) port mirror / SPAN -- настроить на managed-свитче зеркалирование трафика интересующего порта на ваш порт (это делается через CLI свитча, нужен админский доступ); 2) TAP -- врезать в физический провод аппаратный TAP-устройство, которое отдаст копию трафика; 3) если общение идёт через какой-то промежуточный узел (proxy, gateway), снять tcpdump на нём -- там будет весь трафик; 4) в виртуализированных средах -- использовать promiscuous mode на virtual switch (vSwitch на ESXi, OVS на Linux). Незаконные методы (ARP poisoning) не упоминаем.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. В чём принципиальная разница между хабом и свитчём при обработке Ethernet-кадра?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4