NetLab Academy

Сетевые лаборатории в браузере

Войти Начать бесплатно

Теория: STP / RSTP — защита от петель L2

Зачем нужны резервные линки между коммутаторами и как STP не даёт им превратиться в петлю. Прочитайте материал, а затем пройдите тест — следующий пункт курса откроется после верных ответов.

Проблема петель на канальном уровне

В отличие от IP-пакетов, у кадров Ethernet нет TTL (Time To Live) — ничто не мешает кадру бесконечно кружить по физической петле между коммутаторами. Если между двумя коммутаторами случайно (или специально, ради резервирования) есть два параллельных линка, любой широковещательный кадр, попавший в эту петлю, начинает размножаться экспоненциально: каждый коммутатор честно пересылает его на все порты, кроме входного, а поскольку петля замкнута, кадр возвращается снова и снова, плюс каждый круг плодит новые копии. За считаные секунды это превращается в broadcast storm, который полностью забивает полосу пропускания и кладёт сеть — причём именно широковещательный шторм часто выглядит особенно эффектно: загрузка CPU коммутаторов взлетает к 100%, а индикаторы линков мигают так, будто сеть передаёт огромный объём полезного трафика, хотя реально передаются одни и те же зацикленные копии мусора.

Дополнительно страдают MAC-таблицы: один и тот же MAC-адрес начинает «прыгать» между разными портами коммутатора (кадры от одного и того же устройства приходят то с одной стороны петли, то с другой), и это называют MAC table instability — таблица почти бесполезна, пока не остановят петлю физически. Именно эта комбинация — шторм плюс нестабильная таблица — превращает лишний провод, воткнутый «на всякий случай», в катастрофу для всей сети за минуты.
Одно и то же кольцо: без защиты и под STP
Без STP кадр не умирает никогда
SW1 SW2 SW3
кадр идёт по кругу и множится на каждом шаге
1 2 4 8 → …
у кадра Ethernet нет TTL — остановить это изнутри нечем
Со STP физически кольцо, логически дерево
SW1 корень SW2 SW3 порт в блокировке
провод на месте — просто через него не пускают кадры
петли нет связность полная
оборвётся основной путь — этот линк включится за секунды
Заблокированный порт — не поломка, а вся суть STP. Провод остаётся подключённым и продолжает слушать: если основной путь оборвётся, этот линк перейдёт в передачу и заменит его. Именно поэтому резервные линки между коммутаторами ставят намеренно.
Кольцо здесь то же самое, что в лабе «STP: разорви петлю и назначь корень».

Что делает STP

Spanning Tree Protocol (STP, IEEE 802.1D) решает проблему не запретом резервных линков, а умным управлением ими: протокол строит логическое дерево без петель (откуда и название — spanning tree, «остовное дерево») над физической топологией, в которой петли могут существовать сколько угодно. Избыточные линки не отключаются физически — порты на них переводятся в состояние blocking, где они не пропускают пользовательский трафик, но продолжают слушать служебные BPDU-кадры и готовы автоматически включиться, если основной путь откажет. Получается лучшее из двух миров: физическая избыточность на случай отказа кабеля или коммутатора, и логическое отсутствие петель в любой момент времени.

Выборы корневого коммутатора (Root Bridge)

Все коммутаторы в сети STP сначала договариваются, кто из них Root Bridge — точка отсчёта, от которой строится всё дерево. Победителем становится коммутатор с наименьшим Bridge ID, который складывается из 2-байтного приоритета (по умолчанию 32768 у многих платформ) и MAC-адреса коммутатора. Если все коммутаторы оставить с настройками по умолчанию, корнем случайно станет тот, у кого банально меньше MAC-адрес — то есть, по сути, дело случая, а не дизайна сети. В реальных сетях приоритет почти всегда настраивают вручную: например, мощному коммутатору в центре сети явно назначают низкий приоритет, чтобы он точно стал корнем, а не какой-то случайный коммутатор на краю сети, через который тогда пришлось бы прогонять весь трафик нерационально длинным путём.

После выбора корня все остальные коммутаторы считают свой root path cost — суммарную стоимость пути до корня, где у каждого линка есть своя стоимость в зависимости от скорости: исторически 10 Мбит/с — cost 100, 100 Мбит/с — cost 19, 1 Гбит/с — cost 4, 10 Гбит/с — cost 2 (конкретные цифры стандартизированы IEEE и могут отличаться по ревизиям, но сама логика — быстрее линк, ниже cost — остаётся неизменной).
Как коммутаторы выбирают корень и кто из них замолкает
MAC-адреса взяты с реального стенда лабы — приоритеты у всех одинаковые, поэтому на шаге 3 решает именно адрес.

Роли портов

Root port — порт с наименьшим суммарным cost до Root Bridge, ровно один на каждом некорневом коммутаторе. Если до корня ведут два пути с одинаковым cost, тай-брейк решается по Bridge ID соседа, а затем по номеру порта — чтобы результат был детерминированным, а не случайным.
Designated port — порт, который выигрывает право пересылать трафик для конкретного сегмента сети; на каждом сегменте (то есть линке между двумя коммутаторами) может быть только один designated-порт, иначе и получилась бы петля.
Blocking (в классическом 802.1D) / Alternate (в RSTP) — резервный порт, который проиграл выборы designated-порта на своём сегменте; он не пересылает пользовательский трафик, но продолжает слушать BPDU и готов мгновенно подключиться, если основной путь исчезнет.

Состояния портов и скорость сходимости

Классический 802.1D проходит через состояния Blocking → Listening → Learning → Forwarding: Listening — порт слушает BPDU, но ещё не учится MAC-адресам и не пересылает трафик; Learning — уже учится MAC-адресам, но трафик всё ещё не пересылает; и только Forwarding — полноценная работа. На каждый из переходных этапов уходит порядка 15 секунд (таймер Forward Delay), итого 30–50 секунд от включения порта до полноценной передачи трафика — болезненно долго, если, скажем, ПК просто перезагрузили и он ждёт сетевой доступ дольше времени своей собственной загрузки.

RSTP (802.1w, Rapid STP) переработала механизм почти полностью: вместо пассивного ожидания таймеров соседние коммутаторы активно обмениваются предложениями через механизм proposal/agreement — «я хочу стать designated на этом сегменте, согласен?» / «согласен» — и при удачном сценарии переход в forwarding происходит за доли секунды вместо десятков. Сегодня почти везде настраивают именно RSTP (или его варианты MSTP/PVST+), а классический 802.1D можно встретить разве что на музейном оборудовании.

BPDU — как коммутаторы договариваются

Коммутаторы обмениваются служебными кадрами BPDU (Bridge Protocol Data Unit) каждые 2 секунды по умолчанию (Hello Timer) — в них передаётся Bridge ID отправителя, ID известного ему Root Bridge, путь cost до корня и ряд других параметров. Если BPDU от соседа не приходят дольше Max Age (по умолчанию 20 секунд в классическом STP — то есть 10 пропущенных Hello подряд), коммутатор считает, что топология изменилась, и запускает пересчёт дерева заново.

Интересный нюанс: в классическом STP только Root Bridge изначально генерирует BPDU, а остальные коммутаторы просто пересылают (релеят) их дальше, лишь немного модифицируя; в RSTP каждый коммутатор генерирует свои BPDU самостоятельно каждые 2 секунды независимо от соседей, что и позволяет куда быстрее обнаруживать обрыв связи — не нужно ждать, пока истечёт долгий Max Age, достаточно нескольких пропущенных собственных Hello от прямого соседа.

Защитные механизмы: BPDU Guard, Root Guard, Loop Guard

Базовый STP защищает от петель, но не от человеческого фактора и злого умысла, поэтому в дополнение к нему придумали несколько защитных механизмов.

BPDU Guard ставится на access-порты к конечным устройствам (вместе с PortFast, см. ниже): если на таком порту вдруг появляется BPDU — а его там в принципе не должно быть, потому что обычный ПК не говорит на языке STP — порт автоматически блокируется. Это защита от ситуации, когда кто-то по ошибке (или специально) подключает свой домашний коммутатор или роутер в порт, отведённый под обычную рабочую станцию, рискуя случайно образовать петлю или повлиять на выборы Root Bridge.

Root Guard ставится на порты, через которые Root Bridge заведомо не должен появиться (например, граница с сетью другого отдела): если оттуда внезапно приходит BPDU с более привлекательным (меньшим) Bridge ID, претендующим на роль корня, порт блокируется, не позволяя чужому или случайному коммутатору перехватить роль Root Bridge у всей сети.

Loop Guard защищает от более редкого, но неприятного сценария — односторонней потери связи (например, кабель физически цел, но повреждён настолько, что сигнал идёт только в одну сторону), при которой блокирующий порт может ошибочно решить, что путь свободен, и перейти в forwarding, создав петлю именно тогда, когда обычный механизм STP не сработал бы штатно.

PVST+ и MSTP — несколько деревьев вместо одного

Базовый STP/RSTP строит одно общее дерево для всей сети независимо от VLAN — и это не всегда оптимально: при нескольких VLAN может быть выгоднее балансировать нагрузку, гоняя трафик одного VLAN через один путь, а другого — через другой, вместо того, чтобы оба VLAN использовали один и тот же физически оптимальный для всей сети путь, оставляя резервный линк полностью простаивающим.

PVST+ (Per-VLAN Spanning Tree) строит отдельный экземпляр STP/RSTP для каждого VLAN — со своими собственными ролями портов и, возможно, разным Root Bridge для разных VLAN, что реально позволяет распределить нагрузку между избыточными линками. Минус — это требует больше ресурсов CPU коммутатора при большом числе VLAN, ведь каждое дерево считается отдельно. MSTP (Multiple Spanning Tree, 802.1s) — компромисс: группирует VLAN в несколько instance (групп), и для каждой группы строится отдельное дерево, а не для каждого VLAN по отдельности — сохраняя гибкость балансировки, но не взрывая количество вычислений при сотнях VLAN.

Как проверять / частые ошибки

show spanning-tree — кто Root Bridge (и часто отдельно показывает, является ли локальный коммутатор корнем), какая роль у каждого порта (Root/Designated/Blocking-Alternate) и в каком он состоянии. Частые проблемы: STP отключён или сломан на одном из коммутаторов (прямой путь к broadcast storm при наличии физической петли — самая опасная ошибка из всех перечисленных здесь); порт к конечному устройству настроен как обычный, без PortFast, из-за чего ПК ждёт 30+ секунд после подключения кабеля, прежде чем получить сетевой доступ (PortFast специально пропускает промежуточные состояния STP для портов, на которых заведомо не может быть других коммутаторов); Root Bridge выбран случайно (никто не настроил приоритет), и трафик неоптимально гоняется через неудачно расположенный коммутатор.

Команды настройки — шпаргалка

Базовая настройка STP и защитных механизмов (Cisco-style):
# режим работы
spanning-tree mode rapid-pvst   # rapid-pvst — RSTP с отдельным деревом на каждый
                                #   VLAN, вместо медленного классического 802.1D

# кто станет корнем
spanning-tree vlan 1 priority 4096
                                # число после vlan — номер VLAN; после priority —
                                #   приоритет в выборах корня. Чем МЕНЬШЕ, тем выше
                                #   шансы. Допустимы только кратные 4096
spanning-tree vlan 1 root primary
                                # то же самое, но число подберётся само,
                                #   с оглядкой на текущих соседей

# порт к конечному устройству
interface GigabitEthernet0/1
 spanning-tree portfast         # сразу начать передавать, минуя медленные
                                #   промежуточные состояния. Аргументов нет:
                                #   команда либо есть на порту, либо нет

# защиты
spanning-tree portfast bpduguard default
                                # default — включить на ВСЕХ portfast-портах,
                                #   а не на одном. Появился BPDU — порт блокируется
interface GigabitEthernet0/1
 spanning-tree guard root       # вид защиты root: не дать чужому коммутатору
                                #   перехватить через этот порт роль корня
 spanning-tree guard loop       # вид защиты loop: от односторонней потери связи,
                                #   из-за которой порт ошибочно уйдёт в forwarding

# проверка
show spanning-tree              # состояние дерева целиком
show spanning-tree summary      # сводка: кто корень, сколько портов в каком
                                #   состоянии
Контрольные вопросы

Дальше — лабораторная работа «STP: разорви петлю и назначь корень»

Для неё нужен аккаунт: стенд поднимается персонально под вас — свои роутеры, свои конфиги, никто в них не мешает. Регистрация — почта и пароль.

Теория прочитана. Дальше — руками.

Личный стенд из настоящих роутеров разворачивается за секунды. Платформа проверяет не ответы на тесты, а состояние вашей сети: поднялись ли соседства, сошлись ли маршруты, ходит ли ping. Рядом — AI-наставник, который видит ваши конфиги и ведёт к решению, не выдавая готовое.

Начать бесплатно → бета открыта, доступ бесплатный