Принцип работы протоколов STP/RSTP, функции защиты корня (root guard)
Spanning Tree Protocol — сетевой протокол, работающий на втором уровне модели OSI. Основан на одноименном алгоритме, разработчиком которого является «Мама Интернета» — Радья Перлман (англ. Radia Perlman).
Основной задачей STP является приведение сети Ethernet с множественными связями к древовидной топологии, исключающей циклы пакетов. Происходит это путем автоматического блокирования ненужных в данный момент для полной связности портов. Протокол описан в стандарте IEEE 802.1D.
Для того чтобы определить какие порты заблокировать, а какие будут в режиме пересылки, STP выполняет следующее:
- Выбор корневого моста (Root Bridge)
- Определение корневых портов (Root Port)
- Определение выделенных портов (Designated Port)
Выбор корневого моста
Корневым становится коммутатор с наименьшим идентификатором моста (Bridge ID).
Только один коммутатор может быть корневым. Для того чтобы выбрать корневой коммутатор, все коммутаторы отправляют сообщения BPDU, указывая себя в качестве корневого коммутатора. Если коммутатор получает BPDU от коммутатора с меньшим Bridge ID, то он перестает анонсировать информацию о том, что он корневой и начинает передавать BPDU коммутатора с меньшим Bridge ID. В итоге только один коммутатор останется корневым и будет передавать BPDU.
Изначально Bridge ID состоял из двух полей:
- Приоритет — поле, которое позволяет административно влиять на выборы корневого коммутатора. Размер — 2 байта,
- MAC-адрес — используется как уникальный идентификатор, который, в случае совпадения значений приоритетов, позволяет выбрать корневой коммутатор. Так как MAC-адреса уникальны, то и Bridge ID уникален, так что какой-то коммутатор обязательно станет корневым.
Определение корневых портов
Порт коммутатора, который имеет кратчайший путь к корневому коммутатору называется корневым портом. У любого не корневого коммутатора может быть только один корневой порт.
Определение назначенных портов
Коммутатор в сегменте сети, имеющий наименьшее расстояние до корневого коммутатора называется назначенным коммутатором (мостом). Порт этого коммутатора, который подключен к рассматриваемому сегменту сети, называется назначенным портом.
Принцип действия
- В сети выбирается один корневой мост (Root Bridge).
- Далее каждый, отличный от корневого, мост просчитывает кратчайший путь к корневому. Соответствующий порт называется корневым портом (Root Port). У любого не корневого коммутатора может быть только один корневой порт.
- После этого для каждого сегмента сети просчитывается кратчайший путь к корневому порту. Мост, через который проходит этот путь, становится назначенным для этой сети (Designated Bridge). Непосредственно подключенный к сети порт моста — назначенным портом.
- Далее на всех мостах блокируются все порты, не являющиеся корневыми и назначенными. В итоге получается древовидная структура (математический граф) с вершиной в виде корневого коммутатора.
Алгоритм действия STP
- После включения коммутаторов в сеть, по умолчанию каждый (!) коммутатор считает себя корневым (root).
- Затем коммутатор начинает посылать по всем портам конфигурационные Hello BPDU пакеты раз в 2 секунды.
- Исходя из данных Hello BPDU пакетов, тот или иной коммутатор приобретает статус root, то есть корня.
- После этого все порты кроме root port и designated port блокируются.
Происходит посылка Hello-пакетов раз в 20 секунд либо при пропадании/восстановлении какого-нибудь линка, с целью препятствия появлению петель в сети.
Пример топологии
Изменениями топологии считается изменения ролей DP и RP. Коммутатор, который обнаружил изменения в топологии отправляет Topology Change Notification (TCN) BPDU корневому коммутатору:
- Коммутатор, на котором произошли изменения отправляет TCN BPDU через свой корневой порт. Отправка сообщения повторяется каждый hello interval (2 секунды) до тех пор, пока получение сообщения не будет подтверждено.
- Следующий коммутатор, который получил TCN BPDU отправляет назад подтверждение. Подтверждение отправляется в следующем Hello BPDU, которое будет отправлять коммутатор, выставлением флага Topology Change Acknowledgement (TCA).
- Далее коммутаторы, у которых порт работает в роли DP для сегмента, повторяют первые два шага и отправляют TCN через свой корневой порт и ждут подтверждения.
После того как корневой коммутатор получил TCN BPDU, он отправляет несколько следующих Hello с флагом TCA. Эти сообщения получают все коммутаторы. При получении сообщения hello с флагом TCA, коммутатор использует короткий таймер (Forward Delay time) для того чтобы обновить записи в таблице коммутации. Обновления выполняется из-за того, что после изменений в топологии STP в таблице коммутации могут храниться неправильные записи.
Если порт изменяет состояние с Blocking в Forwarding, то он должен пройти через два промежуточных состояния: Listening и Learning. Переход из Forwarding в Blocking может выполняться сразу.
Роли и состояния портов
- Root Port — корневой порт коммутатора
- Designated Port — назначенный порт сегмента
- Nondesignated Port — неназначенный порт сегмента
- Disabled Port — порт который находится в выключенном состоянии
- Blocking — блокирование
- Listening — прослушивание
- Learning — обучение
- Forwarding — пересылка
Функция root-guard «защита корня»
Функция защиты корня обеспечивает возможность задать расположение корневого моста в сети. Это обеспечивает уверенность в том, что порт, на котором активизирована функция защиты корня, является назначенным. Обычно все порты корневого моста являются назначенными, если два или более портов корневого моста не соединены вместе. Если мост получает высокоприоритетные STP элементы данных протокола управления мостами (BPDU) в корневом порту, для которого включена функция защиты корня, защита корня переводит порт в состояние STP, называемое несогласованностью корня. Состояние несогласованности корня аналогично состоянию прослушивания. Трафик через порт в таком состоянии не пересылается. Таким образом, защита корня задает расположение корневого моста. Функцию защиты корня необходимо включить на всех портах, которые не должны стать корневыми.
Изменения «места разрыва кольца» на оборудовании Sprinter
По умолчанию на оборудовании Sprinter протокол RSTP определяет «место разрыва кольца», т.е. какой порт блокировать, основываясь на скорости соединения, которой соответствует стоимость соединения.
Ниже приведено соответствие скорости и стоимости соединения:
10 Mb/s: Cost=2 000 000
100 Mb/s: Cost=200 000
1000 Mb/s: Cost=20 000
Для того чтобы изменить «место разрыва кольца» необходимо изменять стоимость соединений в тех точках, изменение стоимости которых позволит определить более кратчайший путь через ранее заблокированный порт и заблокирует порт в другом сегменте.
Для изменения стоимости соединения порта необходимо использовать команду:
rstp -c
где port number — номер порта, для которого изменяем стоимость соединения
port cost — новое значение стоимости соединения
Для рисунка, представленного ниже, эта команда выглядит следующим образом:
Принцип работы протокола STP
Причиной создания протокола STP стало возникновение петель на коммутаторах. Что такое петля? Определение петли звучит так:
Петля коммутации (Bridging loop, Switching loop) — состояние в сети, при котором происходит бесконечная пересылка фреймов между коммутаторами, подключенными в один и тот же сегмент сети.
Из определения становится ясно, что возникновение петли создает большие проблемы — ведет к перегрузке свитчей и неработоспособности данного сегмента сети. Как возникает петля? На картинке ниже приведена топология, при которой будет возникать петля при отсутствии каких-либо защитных механизмов:
Возникновение петли при следующих условиях:
1. Какой-либо из хостов посылает бродкаст фрейм:
- К примеру, VPC5 отправляет пакет с бродкастовым адресом назначения.
- Switch1 приняв данный пакет, должен отправить его через все порты, кроме порта, с которого пришел данный пакет. Пакет отправится через порты Gi0/0, Gi1/0.
- Коммутаторы Switch2, Switch3 приняв данный пакет также должны будут его разослать пакет. Таким образом Switch2, получивший пакет от Switch1 отправит его Switch3, а Switch3 отправит его Switch2.
- Далее, Switch2 получив пакет от Switch3, отправит его Switch1, а Switch3 получив пакет от Switch2, отправит его также Switch1. Тем самым, мы приходим к шагу 1) и она будет продолжаться бесконечно. Также все усугубляется тем, что на 4) шаге Switch1 будет иметь уже два экземляра фрейма, так как получит их и от Switch2, и от Switch3.
2. Также петля может образоваться и без отправки бродкаст фрейма.
- К примеру, VPC5 отправляет фрейм с юникастовым мак-адресом назначения.
- Возможна ситуация, что мак-адрес назначения отсутствует в таблице мак-адресов коммутаторов. В данном случае, коммутатор будет пересылать пакет через все порты, кроме порта с которого получил данный фрейм. И получаем такую же ситуацию, как и с бродкаст фреймом.
- Ниже мы будем рассматривать протокол STP на коммутаторах Cisco. На них используется STP отдельно для каждого vlan-а, протокол PVST+. У нас всего один vlan, поэтому смысл от этого не меняется.
Основы STP
Принцип работы данного протокола построен на том, что все избыточные каналы между коммутаторами логически блокируются и трафик через них не передается. Для построения топологии без избыточных каналов строится дерево (математический граф). Чтобы построить такое дерево вначале необходимо определить корень дерева, из которого и будет строиться граф. Поэтому первым шагом протокола STP является определение корневого коммутатора (Root Switch). Для определения Root Switch-a, коммутаторы обмениваются сообщениями BPDU. В общем, протокол STP использует два типа сообщений: BPDU — содержит информацию о коммутаторах и TCN — уведомляет о изменении топологии. Рассмотрим BPDU более детально. Про TCN более подробно поговорим ниже. При включении STP на коммутаторах, коммутаторы начинают рассылать BPDU сообщения. В данных сообщениях содержится следующая информация:
Фрейм BPDU имеет следующие поля:
- Идентификатор версии протокола STA (2 байта). Коммутаторы должны поддерживать одну и ту же версию протокола STA
- Версия протокола STP (1 байт)
- Тип BPDU (1 байт). Существует 2 типа BPDU — конфигурационный и уведомление о реконфигурации
- Флаги (1 байт)
- Идентификатор корневого коммутатора (8 байт)
- Стоимость маршрута до корневого свича (Root Path Cost)
- Идентификатор отправителя (Bridge ID) (8 байт)
- Идентификатор порта, из которого отправлен данный пакет (Port ID) (2 байта)
- Время жизни сообщения (2 байта). Измеряется в единицах по 0,5 с, служит для выявления устаревших сообщений
- Максимальное время жизни сообщения (2 байта). Если кадр BPDU имеет время жизни, превышающее максимальное, то кадр игнорируется коммутаторами
- Интервал hello (2 байт), интервал через который посылаются пакеты BPDU
- Задержка смены состояний (2 байта). Минимальное время перехода коммутатора в активное состояние
- Идентификатор отправителя (Bridge ID)
- Идентификатор корневого свича (Root Bridge ID)
- Идентификатор порта, из которого отправлен данный пакет (Port ID)
- Стоимость маршрута до корневого свича (Root Path Cost)
Вот вывод информации о Bridge ID с коммутатора Switch1 из первой картинки. Priority — 32769 ( по умолчанию 32768 + Vlan Id), MAC-адреса — Address 5000.0001.0000:
Представим картину, коммутаторы только включились и теперь начинают строить топологию без петель. Как только коммутаторы загрузились, они приступают к рассылке BPDU, где информируют всех, что они являются корнем дерева. В BPDU в качестве Root Bridge ID, коммутаторы указывают собственный Bridge ID. Например, Switch1 отправляет BPDU коммутатору Switch3, а Switch3 отправляет к Switch1. BPDU от Switch1 к Switch3:
BPDU от Switch3 к Switch1:
Как видим из Root Identifier, оба коммутотара друг другу сообщают, что именно он является Root коммутатором.
Выбор корневого коммутатора
Пока топология STP не построена, обычный трафик не передается из-за специальных состояний портов, о которых будет сказано ниже. Итак, Switch3 получается BPDU от Switch1 и изучает данное сообщение. Switch3 смотрит в поле Root Bridge ID и видит, что там указан другой Root Bridge ID, чем в том сообщении, которое отправил сам Switch3. Он сравнивает Root Bridge ID в данном сообщении со своим Root Bridge ID и видит, что хоть Priority одинаковые, но MAC-адрес данного коммутатора (Switch1) лучше (меньше), чем у него. Поэтому Switch3 принимает Root Bridge ID от Switch1 и перестает отправлять свои BPDU, а только слушает BPDU от Switch1. Порт, на котором был получен наилучший BPDU становится Root Port-ом. Switch1 также получив BPDU от Switch3, проводит сравнение, но в этом случае поведение Switch1 не меняется, так как полученный BPDU содержит худший Root Bridge ID, чем у Switch1. Таким образом, между Switch1 и Switch3 был определен корневой коммутатор. По аналогичной схеме происходит выбор корневого коммутатора между Switch1 и Switch2. Порты Gi0/0 на Switch2 и Switch3 становятся Root Port — порт, который ведет к корневому коммутатору. Через данный порт коммутаторы Switch2 и Switch3 принимают BPDU от Root Bridge. Теперь разберемся, что произойдет с каналом между Switch2 и Switch3.
Блокирование избыточных каналов
Как мы видим из топологии, канал между Switch2 и Switch3 должен быть заблокирован для предотвращения образования петель. Как STP справляется с этим?
После того, как выбран Root Bridge, Switch2 и Switch3 перестают отправлять BPDU через Root Port-ы, но BPDU, полученные от Root Bridge, они пересылают через все свои остальные активные порты, при этом изменив в данных BPDU только следующие поля:
- Идентификатор отправителя (Bridge ID) — заменяется на свой идентификатор.
- Идентификатор порта, из которого отправлен данный пакет (Port ID) — изменяется на идентификатор порта, с которого будет отправлен BPDU.
- Стоимость маршрута до корневого свича (Root Path Cost) — вычисляется стоимость маршрута относительно самого коммутатора.
А Switch3 от Switch2 получает такой BPDU:
После обмена такими BPDU, Switch2 и Switch3 понимают, что топология избыточна. Почему коммутаторы понимают, что топология избыточна? И Switch2, и Switch3 в своих BPDU сообщают об одном и том же Root Bridge. Это означает, что к Root Bridge, относительно Switch3, существует два пути — через Switch1 и Switch2, а это и есть та самая избыточность против которой мы боремся. Также и для Switch2 два пути — через Switch1 и Switch3. Чтоб избавиться от этой избыточности
необходимо заблокировать канал между Switch3 и Switch2. Как это происходит?
Выбор на каком коммутатоторе заблокировать порт происходит по следующей схеме:
- Меньшего Root Path Cost.
- Меньшего Bridge ID.
- Меньшего Port ID.
Здесь как оказалось заблокируется порт Gi 0/1 на коммутаторе Sw2. В данном голосовании определяющим становится Root Path Cost. Вернемся к нашей топологии. Так как путь до Root Bridge одинаковый, то в данном выборе побеждает Switch2, так как его priority равны, сравниваются Bridge ID. У Switch2 — 50:00:00:02:00:00, у Switch3 — 50:00:00:03:00:00. У Switch2 MAC-адрес лушче (меньше). После того, как выбор сделан, Switch3 перестает переслать какие-либо пакеты через данный порт — Gi1/0, в том числе и BPDU, а только слушает BPDU от Switch2. Данное состояние порта в STP называется Blocking(BLK). Порт Gi1/0 на Switch2 работает в штатном режиме и пересылает различные пакеты при необходимости, но Switch3 их сразу отбрасывает, слушая только BPDU. Таким образом, на данном примере мы построили топологию без избыточных каналов. Единственный избыточный канал между Switch2 и Switch3 был заблокирован при помощи перевода порта Gi1/0 на Switch3 в специальное состояние блокирования — BLK. Теперь более детально разберем механизмы STP.
Состояния портов
Мы говорили выше, что, например, порт Gi1/0 на Switch3 переходит в специальное состояние блокирования — Blocking. В STP существуют следующие состояния портов:
Blocking — блокирование. В данном состоянии через порт не передаются никакие фреймы. Используются для избежания избыточности топологии.
Listening — прослушивание. Как мы говорили выше, что до того, пока еще не выбран корневой коммутатор, порты находятся в специальном состоянии, где передаются только BPDU, фреймы с данными не передаются и не принимаются в этом случае. Состояние Listening не переходит в следующее даже, если Root Bridge определен. Данное состояние порта длится в течении Forward delay timer, который, по умолчанию, равен 15. Почему всегда надо ждать 15 секунд? Это вызвано осторожностью протокола STP, чтоб случайно не был выбран некорректный Root Bridge. По истечению данного периода, порт переходит в следующее состояние — Learning.
Learning — обучение. В данном состояние порт слушает и отправляет BPDU, но информацию с данными не отправляет. Отличие данного состояния от Listening в том, что фреймы с данными, который приходят на порт изучаются и информация о MAC-адресах заносится в таблицу MAC-адресов коммутатора. Переход в следующее состояние также занимает Forward delay timer.
Forwarding — пересылка. Это обычное состояние порта, в котором отправляются и пакеты BPDU, и фреймы с обычными данными. Таким образом, если мы пройдемся по схеме, когда коммутаторы только загрузились, то получается следующая схема:
- Коммутатор переводит все свои подключенные порты в состояние Listening и начинает отправлять BPDU, где объявляет себя корневым коммутатором. В этот период времени, либо коммутатор остается корневым, если не получил лучший BPDU, либо выбирает корневой коммутатор. Это длится 15 секунд.
- После переходит в состояние Learning и изучает MAC-адреса. 15 секунд.
- Определяет какие порты перевести в состояние Forwarding, а какие в Blocking.
Роли портов
Помимо состояний портов, также в STP нужны определить портам их роли. Это делается для того, чтоб на каком порте должен ожидаться BPDU от корневого коммутатора, а через какие порты передавать копии BPDU, полученных от корневого коммутатора. Роли портов следующие:
Root Port — корневой порт коммутатора. При выборе корневого коммутатора также и определяется корневой порт. Это порт через который подключен корневой коммутатор. Например, в нашей топологии порты Gi0/0 на Switch2 и Switch3 являются корневыми портами. Через данные порты Switch2 и Switch3 не отправляют BPDU, а только слушают их от Root Bridge. Возникает вопрос — как выбирается корневой порт? Почему не выбран порт Gi1/0? Через него ведь тоже можно иметь связь с коммутатором? Для определения корневого порта в STP используется метрика, которая указывает в поле BPDU — Root Path Cost (стоимость маршрута до корневого свича). Данная стоимость определяется по скорости канала.
Switch1 в своих BPDU в поле Root Path Cost ставит 0, так как сам является Root Bridge. А вот, когда Switch2, когда отправляет BPDU к Switch3, то изменяет данное поле. Он ставит Root Path Cost равным стоимости канала между собой и Switch1. На картинке BPDU от Switch2 и Switch3 можно увидеть, что в данном поле Root Path Cost равен 4, так как канал между Switch1 и Switch2 равен 1 Gbps. Если количество коммутаторов будет больше, то каждый следующий коммутатор будет суммировать стоимость Root Path Cost. Таблица Root Path Cost.
Designated Port — назначенный порт сегмента. Для каждого сегмента сети должен быть порт, который отвечает за подключение данного сегмента к сети. Условно говоря, под сегментом сети может подразумеваться кабель, который осуществляет подключение данного сегмента. Например, порты Gi0/2 на Switch1, Switch3 подключают отдельные сегменты сети, к которым ведет только данный кабель. Также, например, порты на Root Bridge не могут быть заблокированы и все являются назначенными портами сегмента. После данного пояснения можно дать более строгое определения для назначенных портов:
Designated Port (назначенный) — некорневой порт моста между сегментами сети, принимающий трафик из соответствующего сегмента. В каждом сегменте сети может быть только один назначенный порт. У корневого коммутатора все порты — назначенные.
Также важно заметить, что порт Gi1/0 на Switch2 также является назначенным, несмотря на то, что данный канал связи заблокированным на Switch3. Условно говоря, Switch2 не имеет информации о том, что на другом конце порт заблокирован.
Nondesignated Port — неназначенный порт сегмента. Non-designated Port (неназначенный) — порт, не являющийся корневым, или назначенным. Передача фреймов данных через такой порт запрещена. В нашем примере, порт Gi1/0 является неназначенным.
Disabled Port — порт который находится в выключенном состоянии.
Таймеры и сходимость протокола STP
После того, как STP завершил построение топологии без петель, остается вопрос — Как определять изменения в сети и как реагировать на них? Сообщения BPDU при помощи которых работает STP, рассылаются Root Bridge каждые 2 секунды, по умолчанию. Данный таймер называется Hello Timer. Остальные коммутаторы получив через свой root port данное сообщение пересылают его дальше через все назначенные порты. Выше сказано более подробно какие изменения происходят с BPDU при пересылки его коммутаторов. Если в течении времени, определенным таймером Max Age (по умолчанию — 20 секунд), коммутатор не получил ни одного BPDU от корневого коммутатора, то данное событие трактуется как потеря связи с Root Bridge. Для того, чтобы более корректно описать сходимость протокола необходимо изменить нашу топологию и поставить между коммутаторами хабы. Мы добавили хабы, чтоб при выходе из строя одного из коммутаторов или выхода из строя линка, другие коммутаторы не определяли это по падению линка, а использовали таймеры:
Перед тем, как начать также важно рассказать подробнее о другом типе сообщения STP — TCN. TCN рассылается коммутаторами в случае изменения топологии — как только на каком-либо коммутаторе изменилась топология, например, изменилось состояние интерфейса. TCN отправляется коммутатором только через Root Port. Как только корневой коммутатор получит TCN, он сразу меняет параметр времени хранения MAC-адресов в таблице с 300 секунд до 15 (для чего это делается будет сказано ниже) и в следующем BPDU, Root Switch проставляет флаг — TCA ( Topology Change Acknledgement ), который отправляется коммутатору отправившем TCN для уведовления о том, что TCN был получен. Как только TCN достигает Root Bridge, то он рассылает специальный BPDU, который содержится TCN флаг по всем остальным интерфейсам к другим коммутаторам. На картинке показана структура TCN:
TCN был включен в STP, чтоб некорневые коммутаторы могли уведовлять об изменении в сети. Обычными BPDU они этого делать не могут, так как некорневые коммутаторы не отправляют BPDU. Как можно заметить структура TCN не несет в себе никакой информации о том, что именно и где изменилось, а просто сообщает что где-то что-то изменилось. Теперь перейдем к рассмотрению вопроса о сходимости STP.
Посмотрим, что произойдет если мы отключим интерфейс Gi0/1 на Switch1 и посмотрим при помощи каких механизмов перестроится дерево STP. Switch2 перестанет получать BPDU от Switch1 и не будет получать BPDU от Switch3, так как на Switch3 данный порт заблокирован. У Switch2 уйдет 20 секунд ( Max Age Timer ), чтоб понять потерю связи с Root Bridge. До этого времени, Gi0/0 на Switch2 будет находится в состоянии Forwarding с ролью Root Port. Как только истечет Max Age Timer и Switch2 поймет потерю связи, он будет заново строить дерево STP и как это свойственно STP начнет считать себя Root Bridge. Он отправит новый BPDU, где укажет самого себя в качестве Root Bridge через все активные порты, в том числе и на Switch3. Но таймер Max Age, истекший на Switch2 также истек и на Switch3 для интерфейса Gi1/0. Данный порт уже 20 секунд не получал BPDU и данный порт перейдет в состояние LISTENING и отправит BPDU c указанием в качестве Root Bridge — Switch1. Как только Switch2 примет данный BPDU, он перестанет считать себя Root Bridge и выберет в качестве Root Port — интерфейс Gi1/0. В этот момент Switch2 также отправит TCN через Gi1/0, так как это новый Root Port. Это приведет к тому, что время хранения MAC-адресов на коммутаторах уменьшится с 300 секунд до 15. Но на этом работоспособность сети не восстановится полностью, необходимо подождать пока порт Gi1/0 на Switch3 пройдет состояние Listening, а затем Learning. Это займет время равное двум периодам Forward delay timer — 15 + 15 = 30 секунд. Что мы получаем — при потери связи Switch2 ждет пока истечет таймер Max Age = 20 секунд, заново выберает Root Bridge через другой интерфейс и ждет еще 30 секунд пока ранее заблокированный порт перейдет в состояние Forwarding. Суммарно получаем, что связь между VPC5 и VPC6 прервется на 50 секунд. Как было сказано несколькими предложениями выше при изменение Root Port с Gi0/0 на Gi1/0 на Switch2 был отправлен TCN. Если бы этого не произошло, то все MAC-адреса, изученные через порт Gi 0/0, оставались бы привязаны к Gi0/0. Например, MAC-адрес VPC5 и VPC7 несмотря на то, что STP завершит сходимость через 50 секунд, связь между VPC6 и VPC5, VPC7 не была бы восстановлена, так как все пакеты предназначенные VPC5, VPC7 отправлялись через Gi0/0. Надо было бы ждать не 50 секунд, а 300 секунд пока таблица MAC-адресов перестроится. При помощи TCN, время хранение изменилось с 300 секунд до 15 и пока интерфейс Gi1/0 на Switch3 проходил состояния Listening, а затем Learning и данные о MAC-адресах обновятся.
Также интересен вопрос, что произойдет, если мы заново включим интерфейс Gi0/1 на Switch1? При включение интерфейса Gi0/1, он, как и подобает, перейдет в состояние Listening и начнет рассылать BPDU. Как только Switch2 получит BPDU на порту Gi0/0, то сразу перевыберет свой Root Port, так как тут Cost будет наименьшем и начнет пересылать траффик через интерфейс Gi0/0, но нам необходимо подождать пока интерфейс Gi0/1 пройдет состояния Listening, Learning до Forwarding. И задержка будет уже не 50 секунд, а 30.
В протоколе STP также продуманы различные технологии для оптимизации и безопасности работы протокола STP. Более подробно в данной статье рассматривать их не буду, материалы по поводу них можно найти в избытке на различных сайтах.
Основы компьютерных сетей. Тема №7. Протокол связующего дерева: STP
Приветствую на очередной статье по основам компьютерных сетей. Сегодня затронем еще одно семейство протоколов в мире коммутации. И сегодня мы поговорим о протоколах связующего дерева или STP. Узнаем, как это дерево строиться, как можно им управлять, что такое петли, как с ними бороться. Тема интересная, поэтому приглашаю ознакомиться поподробнее.
Содержание
P.S. Возможно, со временем список дополнится.
Долго думал с чего начать. По-хорошему начинать надо с теории. Но смысл разбирать протокол, когда еще не сталкивался с проблемой, которую этот протокол может решить. Поэтому решил начать с небольшой практики и показать, обо что можно сразу споткнуться. Далее разобраться с это проблемой и показать, что делать дальше. Соберу самую обычную схему.
Есть 2 компьютера и 2 коммутатора, подключенных друг к другу. Адрес у PC1-192.168.1.2, а у PC2-192.168.1.3. Компьютеры общаются друг с другом, что-то друг другу отправляют. Но мы замечаем уязвимое место.
Если произойдет обрыв кабеля, то участники останутся без связи. И самая первая мысль, которая приходит в голову — это воткнуть еще один кабель. Но первая мысль не всегда бывает верна. На картинках это не показать, поэтому я покажу это в виде анимации.
Коммутационная петля
Думаю заметили, как странно и синхронно замигали линки. Это явление зовут петлей. Чтобы подробнее с ней ознакомиться, необходимо перейти в режим симуляции. Открывайте спойлер ниже и любуйтесь.
Коммутационная петля в режиме симуляции
Объясню подробнее. Итак, PC1 решает отправить пакет ICMP компьютеру PC2. Как правило, перед началом отправки, нужно узнать его MAC-адрес, и он пускает в ход ARP. Вспоминаем, как работают коммутаторы с ARP. Они отправляют его на все порты, кроме исходящего. Что происходит у нас.
Коммутатор, согласно своей логике, отправляет ARP на оба порта (fa0/2 и fa0/24). Но не отправляет его на fa0/1.
SW2 поступит точно также. Тот ARP, который он получил с порта fa0/24, он отправит на активный порт fa0/2. А второй ARP, полученный с порта fa0/2, отправит на fa0/24. Казалось бы, что мы уже получали с 24-ого порта ARP. Но тут нюанс. Мы получали ARP с другого порта и отдельным ARP сообщением. Поэтому для коммутатора — это 2 разных кадра и обрабатываются они независимо друг от друга. Ну а дальше по аналогии. SW2 отправит один из ARP-ов обратно на SW1, а тот, в свою очередь, обратно SW2. И гулять он будет так до бесконечности, пока не будет выдернут кабель или пока коммутатор не «захлебнется» кадрами и перестанет отвечать. Это и есть петля. Соответственно, чем больше коммутаторов, тем больше кадров будут создано, что приведет к быстрому отказу сети. Поэтому повышая избыточность соединений, мы повышаем вероятность получения петель. Кому интересно посмотреть на это мерцание у себя на компьютере, качайте отсюда.
Поняли ведущие умы, что это плохо и с этим нужно бороться. Задачу эту возложили на плечи выдающегося инженера Радию Перлман (Radia Joy Perlman) в 1985 году. В чем суть ее технологии. У вас есть N-ое количество коммутаторов, соединенных друг с другом. И перед тем, как передавать пользовательские данные, они ведут переговоры между собой на право стать корневым коммутатором или «root switch». Остальные коммутаторы оставляют включенными только те интерфейсы, которые ведут к корневому коммутатору, а остальные отключают. Тем самым, к каждому коммутатору можно попасть только по одному пути. Разберем этот процесс более подробно.
У нас есть 3 коммутатора, соединенных друг с другом.
Я условно дал им имена и MAC-адреса. На каждом коммутаторе включен классический протокол STP (о других поговорим чуть ниже). Как я говорил выше, им нужно определить, кто из них станет корневым коммутатором. Для этого они начинают обмениваться BPDU-кадрами. Посмотрим, что этот кадр из себя представляет.
Если плохо видно, можно кликнуть по ней и откроется оригинал изображения (открывайте изображение нажатием колеса мышки, либо правой кнопкой по «Открыть ссылку в новой вкладке», чтобы не закрывать саму статью).
Очень много непонятных полей. Ознакомимся с ними и приведем всю эту кашу в порядок.
- Идентификатор протокола (Protocol Identifier) — 2-х байтовое поле, которое всегда равно нулю.
- Версия STP протокола (Protocol Version Identifier) — поле размером в 1 байт, значение которого, всегда равно «0».
- Тип BPDU (BPDU type) — 1 байт, которые принимает значение «0», если это конфигурационный BPDU (CBPDU), или «1», если это TCN BPDU.
- CBPDU (Configuration Bridge Protocol Data Unit) — кадр, используемый для вычисления связующего дерева. То есть, когда значение = 0.
- TCNBPDU (Topology Change Notification Bridge Protocol Data Unit) — кадр, используемый, чтобы уведомить других о изменениях в топологии. То есть, когда значение = 1. Проще говоря, если коммутатор видит, что произошло, какое-то изменение в топологии (линк отвалился, «умер» сосед и т.д.), он пускает BPDU со значением «1» в поле BPDU Type. А дальше работают кадры со значением «0», чтобы заново перестроить дерево.
- Флаги (Flags) — в этом поле используются только 1 байт. Эти флаги используются при изменении топологии (бит «1») и при подтверждении топологии (бит «8»).
- Идентификатор корневого моста (Root Identifier) — в этом поле содержится информация о корневом коммутаторе, а именно его приоритет и MAC-адрес.
- Расстояние до корневого моста (Root Path Cost) — здесь содержится суммарная стоимость до корневого коммутатора. Приведу табличку, где указана стоимость.
Скорость канала | Стоимость |
---|---|
10 Гбит/с | 2 |
1 Гбит/с | 4 |
100 Мбит/с | 19 |
10 Мбит/с | 100 |
Во многих изданиях «цисковских» и сторонних, работу STP показывают на примере 3 коммутаторов, соединенных между собой. Не буду отходить от традиции и сделаю аналогично.
Условно я дал им имена и MAC-адреса, чтобы не засорять голову длинной адресацией. Двигаемся дальше.
И так как на коммутаторах работает протокол STP, им нужно выбрать того, кто будет главным в топологии или корневым (root). Для этого, они начинают обмениваться BPDU-кадрами. Вот тут как раз важны поля 5, 6 и 7. Я специально хочу остановиться на них. Изначально коммутаторы в поле 5 (Идентификатор корневого моста или Root Identifier) начинают записывать свой «приоритет + MAC-адрес». Если вручную ничего не менять, то приоритет равен 32678. Дальше коммутатор, который получит этот кадр от соседа, будет сравнивать свой «Root Identifier» с вновь прибывшим. Если он увидит, что у соседа этот Root ID ниже, то с этого момента он будет ретранслировать его BPDU. В результате в сети останется только один коммутатор, который будет генерировать BPDU.
В поле 6 «Root Path Cost» коммутатор запишет стоимость пути. При создании BPDU, корневой коммутатор записывает туда 0, так как это он и есть. А вот следующие коммутаторы уже начинают суммировать стоимость по таблице, представленной выше.
Ну и в поле 7 «Bridge Identifier» записывается связка «приоритет + MAC-адрес» самого коммутатора. То есть, если в «Root Identifier» всегда записывается связка корневого коммутатора, то в это поле, он всегда записывает свою. То есть при ретрансляции BPDU от соседа к соседу, коммутаторы сюда дописывают свой Bridge ID.
Скажу пару слов о связке «приоритет + MAC-адрес». Они ни в коем случае не суммируются. Знак «+» я вставил в том контексте, что они всегда работают вместе. Сначала коммутаторы, при проведении выборов, смотрят на приоритет. И если приоритеты равны (а по-умолчанию они равны), то начинает опираться на MAC-адреса. И тот, у кого MAC-адрес меньше, становится главным, корневым или root. Называйте как вам удобно. Вот приоритет нужен как раз для того, чтобы административно влиять на выбор корневого коммутатора. Представьте ситуацию, что у вас есть 2 коммутатора. Один из них новый и производительный, а второй старый, древний и в скором времени пойдет под списание. И тут выясняется, что у старого коммутатора MAC-адрес меньше, чем у нового коммутатора, а значит, при равных приоритетах, выигрывать всегда будет старый коммутатор. Вот для решения такой спорной задачи и нужен приоритет. Причем, когда вы меняете приоритет, он обязан быть кратным 4096 (то есть 32768, 28672, 24576 и так далее). Возвращаемся к схеме.
Ну и так как приоритеты у трех коммутаторов одинаковые, то выборы они начинают по MAC-адресам. Наименьший MAC-адрес у Switch 1 => он становится корневым.
Раз Switch 1 становится корневым, то он сразу переводит все свои интерфейсы в режим «Designated». То есть это порт, который имеет самый короткий путь до корневого коммутатора (в данном случае до самого себя).
Дальше Switch 2 и Switch 3 должны решить для себя, какой порт будет корневым. То есть тот порт, который имеет наименьшую стоимость пути до корневого коммутатора. Здесь все очевидно. Если вдруг получится, что стоимость по нескольким портам будет одинаковая, то он выберет порт с наименьшим порядковым номером или именем. Например, из портов fa0/1, fa0/2 и fa0/3, будет выбран fa0/1.
Root-порты определены, но что делать с линком между Switch 2 и Switch 3, ведь он может создать петлю?! Для ее предотвращения они договариваются, кто из них отключит свой порт.
Договариваться они будут также по Bridge ID. Приоритеты равны, поэтому смотрим по MAC-адресам. У Switch 2 MAC-адрес меньше, поэтому он переводит порт в режим «Designated», а Switch 3 в режим «Non-Designated». «Non-Designated» — такой режим, при котором порту запрещено передавать какие-либо данные, но разрешено слушать, что происходит в сети. То есть, если отвалится какой-то линк, он может включиться и полноправно работать.
Помимо ролей, у портов есть состояния, которые они должны пройти в обязательном порядке. Объясню на примере построенной топологии. Вот у нас построено выше дерево STP. Петель нет и все замечательно. Один из портов коммутатора Switch 3 находится в состоянии Blocking. Вот он слушает BPDU и никого не трогает. Но если вдруг отвалится где-то линк или произойдет изменение топологии, он сразу переходит в состояние Listening или Прослушивание. В этом состоянии он отправляет, слушает только BPDU кадры и обрабатывает полученную информацию. Если он видит, что у соседей параметры хуже, чем у него, то по истечении 15 секунд, переходит в следующее состояние Learning или Обучение. Эта фаза длится также 15 секунд. В «Learning» порт делает практически все тоже самое, что и в предыдущем состоянии, за исключением того, что теперь строит таблицу коммутации на основании полученных кадров. Если по истечении 15 секунд, он не получит BPDU с параметрами лучше, чем у него, то перейдет в последнее состояние Forwarding или Продвижение. Это такое финальное и полноправное состояние. Он обменивается не только служебной информацией, но и пользовательскими данными. То есть переход из состояния Listening в Forwarding длится 30 секунд.
Есть еще состояние Disable или Отключен, когда вручную отключаете порт, но я не считаю, что это состояние STP. В этом состоянии передаваться ничего не будет. Это, грубо говоря, физическое отключение порта.
Вышепоказанный пример — это работа классического протокола STP, который еще называют CST (Classic Spanning Tree). Одним из его минусов — это то, что он строит одно единственное дерево для всей топологии. А учитывая, что появились VLAN-ы, то нужно было модифицировать этот протокол под них. Cisco, как пионер, выпустила протокол PVST (Per-VLAN Spanning Tree). Он позволял строить отдельное дерево для каждого VLAN. Единственное, что он работал с ISL (проприетарный цисковский протокол, работающий с тегированными кадрами), который применялся только на устройствах данного производителя. Но с появлением открытого протокола 802.1q, они быстренько модернизировали PVST и дали ему имя PVST+. Работает он также, как и его предшественник, но с 802.1q. Нарисую схему и объясню более подробно.
Вот, к примеру, у меня есть 2 VLAN-а. И для каждого VLAN-а, протокол PVST+ строит отдельное дерево. В принципе — это его отличие от CST. Выборы и переходы проходят аналогично и с тем же интервалом по времени. К сожалению, или к счастью, современные Cisco-коммутаторы уже не поддерживают CST.
Поэтому попрактикуемся на PVST+. Тем более, что, при работе сети в одном VLAN-е (который является VLAN-ом по-умолчанию), он мало чем будет отличаться от классического STP.
Я уже быстренько собрал лабораторку из 3-х коммутаторов и сейчас все наглядно покажу.
И вот как только коммутаторы прошли все стадии, образуется STP-дерево.
Я думаю вы заметили, что один из портов коммутатора Switch3, горит оранжевым. Это означает, что данный порт находится в состоянии Blocking. Не путайте с Disabled. То есть он не касается пользовательского трафика, но слушает, что происходит в сети. И не важно сколько мы воткнем кабелей. В топологии всегда будет будет отрабатывать STP и закрывать петли.
Собственно, что и показано на рисунке.
Теперь покажу, что происходит с коммутаторами, когда дерево уже построено. По логике STP, корневой коммутатор должен отправлять Hello-кадр «подчиненным» коммутаторам с интервалом времени в 2 секунды.
Что он из себя представляет, вы видите на картинке выше. Прошу обратить внимание на поля кадра Ethernet 802.3. А именно «Source MAC-Address» и «Destination MAC-Address». В «Source MAC-Address» он записывает MAC-адрес своего порта (в данном случае FastEthernet 0/1). А в «Destination MAC-Address» мультикастовый адрес «0180.C200.0000», который посылается всем участникам, знающим, что такое STP и работающим с ним. Ну и сам кадр STP BPDU. Тут куча полей. Но заострю внимание на более важных, которые я отметил красным прямоугольником.
- Root ID — 32769 / 0009.7C94.0557. Это, как раз, та самая связка «приоритет + MAC-адрес». Но тут интересный момент. Если в классическом STP приоритет по-умолчанию равнялся 32768, то здесь мы видим 32769. В протоколе PVST+ и других, умеющих работать с VLAN, к приоритету добавляется параметр system ID extension. Этот параметр содержит в себе номер VLAN-а и по нему коммутатор понимает, к какому процессу STP его отнести. То есть в данном случае у нас VLAN №1 => приоритет = 32768 + 1 = 32769. Если бы мы настраивали для 10-ого VLAN-а, то приоритет равнялся 32778. Ну а после дробной черты, сам MAC-адрес интерфейса.
- Root Path Cost — стоимость пути. Мы изучаем кадр, когда он выходит из корневого коммутатора => там стоит 0.
- Bridge ID — идентификатор коммутатора, который ретранслирует данный BPDU. В данный момент он такой же, как и Root ID.
- Port ID — идентификатор порта. Такой же, как и приоритет — 32769.
- Message Age — интервал времени. Так как BPDU «свежий», то там стоит 0.
- Max Age — максимальное время жизни — 20 секунд.
- Hello Time — интервал посылки приветствия — 2 секунды.
- Forward Delay — указывает сколько секунд находиться в одной фазе (прослушивания или обучения) — 15 секунд.
Мы уже знаем, кто является корневым коммутатором и какой порт заблокирован для устранения петли. Но на экзамене и в повседневной жизни мы будем оперировать командами, при помощи которых можно будет узнать, кто в сегменте является корневым, у кого заблокирован порт и прочую информацию. Начнем с коммутатора Switch1 и с самой важной команды «show spanning-tree». Ее важно запомнить.
Switch1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Desg FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p
Данная команда выводит информацию о всех процессах STP (то есть за каждый VLAN), в которых участвует коммутатор. В нашем случае всего один VLAN. Теперь поговорим о том, что означают эти письмена.
Первое, что бросается в глаза — это блок Root ID.
Он содержит информацию о приоритете, MAC-адресе и таймерах корневого коммутатора. Здесь красуется еще одна важная строчка «This bridge is the root». Она говорит о том, что именно этот коммутатор является корневым за данный VLAN. Поэтому, если вам надо будет найти корневой коммутатор, то ищите эту надпись. На соседнем коммутаторе (не являющимся корневым) этой строчки не будет.
Следующий блок — Bridge ID.
Здесь, соответственно, информация о текущем коммутаторе. На корневом коммутаторе этот блок идентичен вышестоящему.
Ну и ниже располагается таблица.
В ней записаны интерфейсы, относящиеся к данному VLAN-у, их роли, статусы и прочее. Остановимся немного на ней.
Так как это корневой коммутатор, то порты автоматически переводятся в роль «Designated».
Статус «Forwarding» говорит о том, что порты прошли все стадии и сейчас находятся в активном режиме (пересылка).
Дальше идет стоимость, и она равна 19. FastEthernet работает на скорости 100 Мбит/с и для этой скорости стоимость равна 19 (выше приведена табличка).
Следом идет колонка Prio.Nbr или Priority Number. Это приоритет порта. По-умолчанию этот параметр равен 128, а после точки записывается порядковый номер порта. Соответственно для Fa0/1 — это 128.1, а для Fa0/2 — 128.2.
Тип «p2p» говорит о том, что порт коммутатора работает в режиме «full-duplex». Это означает, что порт может одновременно вести и передачу, и прием.
Если же там будет указан «shared», то это будет означать, что порт работает в режиме «half-duplex». То есть он либо передает, либо получает (не одновременно).
Перейдем к следующему коммутатору Switch2. Аналогично введу команду «show spanning-tree» и посмотрю, что он покажет.
Switch2#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 00D0.9776.B743 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p
Обратите внимание на блок Root ID.
Как говорилось ранее, здесь содержится информация о корневом коммутаторе. Но здесь уже нет надписи «This bridge is the root», так как этот коммутатор не корневой. Но есть другая запись Port. В ней указан порт, ведущий на корневой коммутатор, и это FastEthernet0/1. Выше есть строчка Cost и она равна 19. Не путайте эту строчку Cost с такой же строчкой в таблице интерфейсов ниже. Если в таблице интерфейсов стоимость указана за конкретный порт, то здесь записывается суммарная стоимость до корневого коммутатора. Например, если за коммутатором Switch2 будет еще один коммутатор с интерфейсом FastEthernet, то его стоимость будет выше.
То есть он сложит стоимость своего интерфейса со стоимостью интерфейса соседа.
Двигаемся дальше и натыкаемся на блок Bridge ID. Сюда он записывает информацию о себе. Можете заметить, что MAC-адреса отличаются. Далее идут таймеры. Это важный показатель и старайтесь про него не забывать. Лучше его не менять. Но, если все-таки появилась нужда это сделать, то меняйте и на соседних коммутаторах. Иначе это может привести к серьезным ошибкам и займет не мало времени на устранение.
Таблица интерфейсов отличается от корневого коммутатора тем, что роль FastEthernet0/1 не «Designated», а «Root». То есть этот порт ведет к корневому коммутатору.
Остался последний коммутатор Switch3
Switch3#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p
Здесь конфигурация аналогичная, за исключением порта FastEthernet0/2.
Он в роли Alternate. То есть, в качестве запасного. А статус Blocking говорит о том, что порт заблокирован, дабы «оборвать» петлю. Вот принцип работы классического STP. Прикладываю ссылку на скачивание данной лабораторки.
Но данный вид уже не очень актуален, так как вы не встретите серьезную организацию, у которой всего один VLAN. Соответственно, наша задача подружить STP с VLAN.
Поэтому создаем VLAN-ы на каждом коммутаторе. Можно, конечно, включить VTP и они автоматически синхронизируются, но я не сторонник этого протокола. Поэтому в блокноте подготовил шаблон команд, которые вставлю на каждый коммутатор.
Список команд
enable
configure terminal
vlan 2
exit
vlan 3
exit
interface range fastethernet 0/1-2
switchport mode trunk
И теперь проверю, что получилось на выходе командой «show spanning-tree».
Switch1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Desg FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p VLAN0002 Spanning tree enabled protocol ieee Root ID Priority 32770 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32770 (priority 32768 sys-id-ext 2) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Desg FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p VLAN0003 Spanning tree enabled protocol ieee Root ID Priority 32771 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32771 (priority 32768 sys-id-ext 3) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Desg FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p
Получилось длинное полотно текста, в котором описан процесс STP для каждого VLAN-а. Если внимательно посмотреть, то можно увидеть, что Switch1 является корневым для каждого VLAN-а. Но не всегда так бывает нужно.
Сейчас объясню. Например, у нас есть Switch3, который блокирует порт для устранения петли. Давайте взглянем на его обновленную конфигурацию.
Switch3#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p VLAN0002 Spanning tree enabled protocol ieee Root ID Priority 32770 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32770 (priority 32768 sys-id-ext 2) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p VLAN0003 Spanning tree enabled protocol ieee Root ID Priority 32771 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32771 (priority 32768 sys-id-ext 3) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p
Видим, что он блокирует интерфейс FastEthernet0/2 во всех 3-х VLAN-ах. И вот возникла ситуация, что нужно сделать Switch3 корневым коммутатором для VLAN 3. Как описывалось ранее, на помощь придет игра с приоритетом. Сейчас он равен 32771 (32786 + 3). Мне надо его уменьшить. Сделать это можно несколькими способами. Первый способ — это задать приоритет вручную. Захожу на Switch 3 и пишу:
Switch3(config)#spanning-tree vlan 3 priority 30000 % Bridge Priority must be in increments of 4096. % Allowed values are: 0 4096 8192 12288 16384 20480 24576 28672 32768 36864 40960 45056 49152 53248 57344 61440
Я решил задать приоритет 30000, так как он меньше 32768. Да, обратите внимание, что мы меняем именно приоритет без sys-id-ext. Но после ввода, выходит сообщение, что нужно ввести число кратное 4096. И ниже предлагает допустимый приоритет. Можно ввести одно из предложенных значений и приоритет изменится.
Но я покажу другой способ изменения приоритета.
Switch3(config)# spanning-tree vlan 3 root primary
При вводе этой команды, коммутатор смотрит, какой Bridge ID был у корневого коммутатора и меняет его на меньшее значение. Только отнимает он не 4096, а 8192. То есть делает меньше на 2 порядка. Я введу эту команду и посмотрю, что изменится.
Switch3#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p VLAN0002 Spanning tree enabled protocol ieee Root ID Priority 32770 Address 0009.7C94.0557 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32770 (priority 32768 sys-id-ext 2) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Root FWD 19 128.1 P2p Fa0/2 Altn BLK 19 128.2 P2p VLAN0003 Spanning tree enabled protocol ieee Root ID Priority 24579 Address 00D0.BA84.7C38 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 24579 (priority 24576 sys-id-ext 3) Address 00D0.BA84.7C38 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/1 Desg FWD 19 128.1 P2p Fa0/2 Desg FWD 19 128.2 P2p
И вижу, что секция VLAN 3 изменилась. Теперь там приоритет 24579 (24576 + 3) и красуется строчка «This bridge is the root», указывающая, что данный коммутатор теперь корневой для VLAN 3. Оба порта в роли «Designated» и статусе «Forward» (что верно для корневого коммутатора). Но две верхних секции с VLAN-ами остались без изменения и для них FastEthernet 0/2 останется по-прежнему заблокированным.
Теперь посмотрим, как отреагировал Switch 1 на то, что у него забрали корону.
Switch1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 32769 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/2 Desg FWD 19 128.2 P2p Fa0/1 Desg FWD 19 128.1 P2p VLAN0002 Spanning tree enabled protocol ieee Root ID Priority 32770 Address 0009.7C94.0557 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32770 (priority 32768 sys-id-ext 2) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/2 Desg FWD 19 128.2 P2p Fa0/1 Desg FWD 19 128.1 P2p VLAN0003 Spanning tree enabled protocol ieee Root ID Priority 24579 Address 00D0.BA84.7C38 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32771 (priority 32768 sys-id-ext 3) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/2 Desg FWD 19 128.2 P2p Fa0/1 Root FWD 19 128.1 P2p
Видим, что отреагировал он спокойно. Switch 1 по-прежнему является корневым для VLAN 1 и VLAN 2. И лишь для VLAN 3 он изменил свое состояние и состояния портов.
Вот таким образом можно управлять различными процессами STP для каждого из VLAN-ов. Прикладываю ссылку на скачивание.
Это все конечно хорошо, что коммутатор перед включением порта, всячески все перепроверяет. Но если мы знаем, что за портом коммутатора находится клиентский компьютер, который не создаст петли, то можно сразу перевести порт в режим «Forwarding», не дожидаясь 30 секунд. Для этого есть технология «Portfast».
Зайду на коммутатор Switch2 и продемонстрирую на примере порта FastEthernet 0/3:
Switch2(config-if)#spanning-tree portfast %Warning: portfast should only be enabled on ports connected to a single host. Connecting hubs, concentrators, switches, bridges, etc. to this interface when portfast is enabled, can cause temporary bridging loops. Use with CAUTION %Portfast has been configured on FastEthernet0/3 but will only have effect when the interface is in a non-trunking mode.
После ввода, он сразу переводит порт в режим Forwarding, но выводит предупреждение о том, что этот порт должен строго подключаться к одному пользовательскому хосту. Иначе, при подключении коммутаторов и прочих устройств, это может привести к появлению петли. Под спойлером ниже показано, как именно это работает.
Portfast
Как видите, он миновал все стадии и сразу перешел к режиму «Forwarding». Не забывайте про эту технологию, но и пользуйтесь ею с осторожностью, так как окажись там не пользовательский хост, а коммутатор или иное устройство, вы рискуете создать петлю.
Вот основной принцип работы PVST+. Как видите, он мало чем отличается от классического STP или CST.
Я думаю вы заметили какое полотно текста выводит команда «show spanning-tree». И чем больше VLAN-ов, тем больше этот вывод. И если вам нужно будет посмотреть информацию на коммутаторе за 10-ый VLAN, то придется прокручивать весь вывод с самого начала, пока не доберетесь до строчки с нужным VLAN-ом. Для облегчения данной ситуации, есть очень хорошая команда, позволяющая узнать информацию за конкретный VLAN. Это команда «show spanning-tree vlan X». Проверю эту команду.
Switch1#show spanning-tree vlan 3 VLAN0003 Spanning tree enabled protocol ieee Root ID Priority 24579 Address 00D0.BA84.7C38 Cost 19 Port 1(FastEthernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32771 (priority 32768 sys-id-ext 3) Address 0009.7C94.0557 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 20 Interface Role Sts Cost Prio.Nbr Type ---------------- ---- --- --------- -------- -------------------------------- Fa0/2 Desg FWD 19 128.2 P2p Fa0/1 Root FWD 19 128.1 P2p
И вот он мне по моей команде выводит информацию только за 3-ий VLAN. Очень удобная команда, поэтому берите на заметку.
Есть еще одна интересная команда «show spanning-tree summary».
Switch3#show spanning-tree summary Switch is in pvst mode Root bridge for: VLAN0003 Extended system ID is enabled Portfast Default is disabled PortFast BPDU Guard Default is disabled Portfast BPDU Filter Default is disabled Loopguard Default is disabled EtherChannel misconfig guard is disabled UplinkFast is disabled BackboneFast is disabled Configured Pathcost method used is short Name Blocking Listening Learning Forwarding STP Active ---------------------- -------- --------- -------- ---------- ---------- VLAN0001 1 0 0 1 2 VLAN0002 1 0 0 1 2 VLAN0003 0 0 0 2 2 ---------------------- -------- --------- -------- ---------- ---------- 3 vlans 2 0 0 4 6
Она показывает суммарную и краткую статистику. В каком STP режиме работает коммутатор, для какого VLAN-а он является корневым, какие функции на нем включены. И самое главное, тут есть таблица, содержащая имена VLAN-ов и количество интерфейсов в данном VLAN-е, находящихся в различных состояниях. Это очень полезно, когда надо быстро зайти и посмотреть есть ли на коммутаторе заблокированные порты и для какого VLAN-а они заблокированы.
В принципе из всех команд — эти часто используемые и для уровня CCNA их более, чем достаточно.
На самом деле STP и PVST+ не единственные протоколы предотвращения петель. Есть еще RSTP и MSTP. Если MSTP в программе CCNA практически не упоминается, за исключением того, что он такой есть, то про RSTP говорить открыто и подробно Cisco начала с новой версией программы CCNA 3.0. Поэтому разберу его поподробнее.
Наверное вы заметили, что классический STP, что PVST+ требуют время на сходимость. А именно 30 секунд, при отказе или отключении какого-либо линка. Это конечно не так много, но чем больше сеть, тем больше времени это занимает. И в большой корпоративной среде полная сходимость может занять несколько минут. И вот для разрешения такой ситуации, комитет IEEE выпустил стандарт 802.1w или протокол RSTP.
- генерация BPDU сообщений каждым устройством, независимо от корневого коммутатора;
- механизм proposal/agreement, при активации канала точка-точка, для быстрого перехода портов в состояние «Forwarding»
- механизм использования альтернативного порта, при потери связи через корневой порт (наподобие технологии UplinkFast);
- механизм немедленной реакции на получение BPDU с «худшим» корневым коммутатором от соседа, имеющего designated порты для данного сегмента сети (наподобие технологии backbonefast);
- более оптимальная схема рассылки и обработки сообщений TCN BPDU об изменениях в сети.
Switch2(config)#spanning-tree mode rapid-pvst
Я собрал лабораторку и включил на каждом коммутаторе RSTP и проверю, как быстро произойдет перестроение дерева.
Перестроение дерева протоколом RSTP
Как видите, перестроение происходит в считанные секунды. Для тех, кто захочет проверить это на себе, прикладываю файл с лабораторкой.
Вот и подошла к концу статья о протоколах STP. Теперь мы можем строить процессы STP для каждого VLAN-а, управлять приоритетом и много другого. А для быстроты сходимости можем применять протокол RSTP.
P.S. Постарался осветить все моменты, но из-за того, что статья писалась на протяжении полутора месяцев в различные промежутки времени, то мог что-то упустить. Если есть, что добавить, подчеркнуть или что-то осталось непонятным, смело пишите. И даже, если все понятно, то тоже пишите. Мне будет приятно! Успехов вам в обучении и до встречи в следующей статье.
- Системное администрирование
- IT-инфраструктура
- Cisco
- Сетевые технологии
Как сделать коммутатор корневым
Войти
Нет аккаунта? Зарегистрироваться
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Семестр 3. Глава 5. STP
- Mar. 3rd, 2012 at 4:25 PM
Для повышения надежности сети часто используют избыточные соединения между коммутаторами. Но эта избыточность может стать причиной следующих проблем:
— петли 2-го уровня
— широковещательный шторм
— дублирование одноадресных фреймов
STP (Spanning Tree Protocol) — протокол второго уровня, позволяющий в сети с избыточными соединениями использовать только один логический путь, блокируя избыточные пути, который могут привести к образованию петель.
В случае, если один из участков пути будет недоступен, протокол STP вычислит новый путь и разблокирует один из заблокированных участков.
STP использует Spanning Tree Algorithm (STA), чтобы определить, какой из портов коммутатора перевести в заблокированное состояние. Для этого STA определяет один из коммутаторов, как root bridge и использует его как точку отсчета для расчета всех путей. После того, как root bridge выбран, STA рассчитывает кратчайший путь к root bridge. Каждый коммутатор использует STA, чтобы определить, какой порт блокировать. Пока STA выбирает кратчайшие пути, коммутатор не имеет возможности передавать данные по сети. Для определения кратчайшего пути STA использует стоимость пути. Стоимость пути рассчитывается исходя из скоростей всех портов на протяжении пути. Сумма стоимостей участков в пути составляет стоимость пути. Если есть больше чем один путь, STA выбирает путь с меньшей стоимостью. Когда STA определил, какие пути оставить доступными, он назначает роли портам коммутаторов.
Роли портов
Root (корневые) порты — порты некорневых коммутаторов, через которые проходит трафик в сторону корневого коммутатора. Может быть только один корневой порт у коммутатора. MAC адреса источника фреймов, полученные на этот порт, заносятся в таблицу MAC адресов коммутатора.
Designated (назначенные) порты — могут быть и у корневых, и у некорневых коммутаторов. У корневых — это все порты. У некорневых — все некорневые порты, через которые разрешена передача трафика. В одном сегменте сети может быть только один назначенный порт. MAC адреса источника фреймов, полученные на эти порты, заносятся в таблицу MAC адресов коммутатора.
Non-designated (неназначенные) порты — порты, которые находятся в состоянии блокировки. Трафик через них запрещен.
Disabled (отключенные) порты — порты, которые выключены администратором командой shutdown.
Процесс выбора root bridge
Все коммутаторы в сети принимают участие в выборах. Для этого они обмениваются сообщениями BPDU. Эти сообщения содержат bridge ID и root ID. Bridge ID — идентификатор текущего коммутатора. Root ID — идентификатор корневого коммутатора. После загрузки коммутатор каждые 2 секунды начинает отправлять BPDU сообщение. Изначально root ID в сообщении равен локальному bridge ID. После того, как коммутатор принимает BPDU сообщение, он сравнивает root ID из сообщения со своим root ID. Если root ID из сообщения будет меньше, он заменяет свой root ID. Затем коммутатор начинает передавать BPDU сообщения с новым root ID. В конце концов, все BPDU сообщения, передаваемые коммутаторами, будут содержать наименьший root ID. Коммутатор с этим bridge ID и будет root bridge.
Изначально, после загрузки все порты коммутатора находятся в блокированном состоянии. По умолчанию — в течение 20 секунд (для диаметра сети 7). Они только передают и принимают BPDU.
Определение лучшего пути к root bridge
В BPDU сообщениях кроме bridge ID и root ID передается таже стоимость пути к root ID. После того, как root bridge был выбран, STA начинает процесс определения наилучшего пути к корневому мосту со всех направлений в широковещательном домен е. И нформация о путях определяется путем суммирования индивидуальных стоимостей портов на пути от коммутатора назначения до root bridge .
По умолчанию, стоимость портов коммутаторов следующая:
10 Гб/с — 2
1 Гб/с — 4
100 Мб/с — 19
10 Мб/с — 100
Для каждого порта можно задать стоимость вручную командой:
S1(config-if)#spanning-tree cost cost
Для отмены ручной настройки стоимости порта используется команда:
S1(config-if)#no spanning-tree cost
После подсчета стоимостей всех путей, выбирается путь с наименьшей стоимостью, а все резервные пути блокируются. Для проверки стоимостей портов, а также стоимости пути к root bridge используется команда:
S1#show spanning-tree
Для вывода более детальной информации используется команда:
S1#show spanning-tree detail
Bridge ID
Поле bridge ID в BPDU состоит из трех частей.
Bridge Priority — приоритет коммутатора при выборе root bridge. Может изменятся от 1 до 65536. По умолчанию равен 32768. Чем меньше значение, тем больше приоритет.
Extended System ID — номер VLANа. Используется в PVST. Добавляется к Bridge Priority для вычисления приоритета.
MAC Address. Когда все коммутаторы в сети сконфигурированы с одинаковыми приоритетом (Bridge Priority) и номером Extended System ID, рашающим фактором при выборе root bridge будет MAC адрес. Коммутатор с наименьшим MAC адресом будет выбран как root bridge.
Бывают случаи, когда необходимо, чтобы конкретный коммутатор был корневым. Для этого меняется приоритет коммутатора. Сделать это можно двумя способами.
1. Командой S1(config)#spanning-tree vlan vlan-id root primary. Коммутатору будет присвоен приоритет 24576 или на 4096 меньший, чем самый меньший обнаруженный приоритет в сети. Это будет основной корневой коммутатор.
Командой S1(config)#spanning-tree vlan vlan-id root secondary. Коммутатору будет присвоен приоритет 28672. Это будет запасной корневой коммутатор. Он станет корневым, если основной корневой станет недоступен и начнутся новые выборы, при условии, что у остальных коммутаторов приоритет установлен по умолчанию.
2. Командой S1(config)#spanning-tree vlan vlan-id priority value. Этим способом можно назначать конкретные значения приоритетов.
Определение роли порта
Выбор корневого порта. Коммутатор сравнивает стоимости всех возможных путей к корневому коммутатору. Порт коммутатора, у которого самая низкая стоимость пути, автоматически становится корневым. Если два и более портов имеют одинаковую стоимость пути, выбирается порт, имеющий больший приоритет. Если приоритеты тоже одинаковые, выбирается порт, имеющий наименьший номер (port ID). Приоритет порта настраивается командой S1(config-if)#spanning-tree port-priority value. Диапазон от 0 до 240 с шагом 16. По умолчанию равен 128.
Выбор назначенных и неназначенных портов. Корневой коммутатор автоматически определяет все свои порты как назначенные. На некорневых коммутаторах этор выбор происходит после выбора корневого порта. Выбор происходит на каждом сегменте. Коммутатор смотрит сообщение BPDU, приходящее на порт и решает: если bridge ID у него меньше, чем у соседа, порт становится назначенным, а если больше — неназначенным.
Проверить роли портов и их приоритеты можно командой S1#show spanning-tree
Состояния порта
Порты коммутатора при работе протокола STP могут находится в пяти состояниях.
Blocking (заблокированный) — неназначенный порт не участвует в процессе пересылки фреймов. Но передает принимает BPDU.
Listening (прослушивание) — порт принимает и передает только BPDU.
Learning (изучение) — порт готовится к началу пересылки фреймов. Порт принимает и передает BPDU, а также изучает MAC адреса из фреймов, приходящих на него.
Forwarding (пересылка) — порт принимает и передает изучает MAC адреса из фреймов, приходящих на него.
Disabled — порт отключен администратором командой shutdown.
Таймеры BPDU
Время, в течение которого порт находится в различных состояниях, зависит от таймеров BPDU. Только корневой коммутатор может рассылать сообщения по сети, которые настраивают таймеры. Существуют следующие таймеры изменения состояний:
Hello time — время между посылками сообщений BPDU на порт. По умолчанию равно 2 секунды. Можно изменять от 1 до 10 секунд.
Forward delay (задержка перед передачей) — время, в течении которого порт находится в каждом из состояний listening и learning. По умолчанию — 15 секунд. Можно изменить от 4 до 30 секунд.
Maximum age — время, в течение которого порт хранит информацию, полученную вместе с последним BPDU. По умолчанию — 20 секунд. Может изменяться от 6 до 40 секунд.
Изменять таймеры напрямую не рекомендуется. Таймеры по умолчанию установлены для сети с диаметром, равным 7. Поэтому, если администратор решит изменить время сходимости сети, лучше использовать команду задания диаметра сети. Коммутатор сам подстроит все таймеры.
S1(config)#spanning-tree vlan vlan id root primary diameter value
Технология Cisco PortFast
Для портов, к которым подключены не коммутаторы, конечные устройства (компьютеры, телефоны и др.), для быстрого перехода в состояние передачи (без прохода через состояния listening и learning), Cisco разработала технологию PortFast. Устройство, подключенное к порту с включенным PortFast, сразу может передавать данные. Для включения используется команда: S1(config-if)#spanning-tree portfast. Для выключения — S1(config-if)#no spanning-tree portfast. Проверка включения режима PortFast на интерфейсе — S1#show running-config.
Изменение топологии STP
После того, как выборы корневого коммутатора завершились и произошло назначение ролей портам коммутатора, все коммутаторы, за исключением корневого, прекращают генерацию своих BPDU. Только корневой коммутатор генерирует BPDU и рассылает из на широковещетельный адрес. Все осталные — только ретранслируют его.
При изменении топологии коммутатор, который это обнаружил, отправляет специальное сообщение BPDU, которое называется TCN (topology change notification), через корневой порт в направлении корневого коммутатора. Некорневые коммутаторы, которые принимают это сообщение, ретранслируют его через свой корневой порт, а также отправляют назад подтверждение о получении — TCA (topology change acknowledgement).
После того, как корневой коммутатор получил TCN, он сначала отправляет назад TCA. А затем широковещательно отправляет BPDU с установленным флагом TC (topology change). Таким образом, все коммутаторы сети узнают об изменении топологии сети и увеличивают время Maximum age до 35 секунд по умолчанию.
Варианты STP
Per-VLAN spanning tree protocol (PVST) — проприетарный протокол Cisco. Использует для организации транков свой протокол ISL. Связующее дерево строится отдельно для каждого VLANа. Это дает возможность балансировать трафик на 2-м уровне. Для PVST разработаны расширения настройки портов BackboneFast, UplinkFast и PortFast.
Per-VLAN spanning tree protocol plus (PVST+) — проприетарный протокол Cisco. Разработан для поддержки транкового протокола IEEE 802.1Q. Поддерживает все расширения PVST, а также введены дополнения BPDU guard и Root guard.
Rapid per-VLAN spanning tree protocol (rapid PVST+) — проприетарный протокол Cisco. основан на стандарте IEEE802.1w и имеет меньшее время сходимости по сравнению с STP. Поддерживает все расширения PVST и PVST+.
Rapid spanning tree protocol (RSTP) — общедоступный протокол. Включает расширения Cisco BackboneFast, UplinkFast и PortFast. Имеет меньшее время сходимости по сравнению с STP. Именно он сейчас и применяется. Т.е. STP = RSTP
Multiple STP (MSTP) — общедоступный протокол. Позволяет строить связующие деревья для нескольких VLANов. Т.е. позволяет уменьшать количество деревьев на коммутаторе. Предусматривает несколько путей для переадресации трафика и позволяет балансировать нагрузку.
PVST+
Это проприетарный протокол Cisco. Он строит связующие деревья для каждого VLANа и позволяет блокировать порты для каждого VLANа в отдельности. Поэтому более экономично используется полоса пропускания каждого порта (не простаивает).
Соответственно и настраивать приоритеты для коммутаторов и портов можно для каждого VLANа. Например, для половины VLANов корневым коммутатором настривается один коммутатор, а для второй половины — другой.
Но надо помнить, что если не настраивать приоритеты, все коммутаторы сети для всех VLANов будут принимать решения о корневом коммутаторе, основываясь на MAC адресах коммутаторов. И никкакой балансировки нагрузки не будет.
Настройки по умолчанию на коммутаторах Cisco:
Состояние — включено для VLAN1
Вариант протокола — PVST+ (Rapid PVST+ и MSTP are отключены)
Приоритет коммутатора — 32768
Приоритет порта (при STP на основе портов) — 128
Стоимость портов — 10 Гб/с — 2, 1 Гб/с — 4, 100 Мб/с — 19, 10 Мб/с — 100
Приоритет порта (при STP на основе VLANов) — 128
Таймеры — Hello time: 2 с, Forward-delay time: 15 с, Maximum-aging time: 20 с, Transmit hold count: — 6 BPDU
Порядок настройки
1. Выбираем коммутаторы, которые будут основными и резервными корневыми коммутаторами для каждого VLANа.
2. Конфигурируем эти коммутаторы:
S1(config)#spanning-tree vlan vlan-ID root primary
S2(config)#spanning-tree vlan vlan-ID root secondary
Также можно настроить приоритеты коммутаторов командой
S1(config)#spanning-tree vlan vlan-ID priority priority — где приоритет можно назначать в диапазоне от 0 до 61440 с шагом 4096. Коммутатор с более низким приоритетом и будет корневым.
Проверка настроенного протокола для активных интерфейсов осуществляется командой:
S2#show spanning tree active.
RSTP
Это развитие протокола STP. Большинство параметров не изменилось. Изменились лишь роли портов и их состояния. Из-за этого значительно уменьшилось время сходимости сети.
В RSTP, если коммутатор не принял три подряд BPDU (по умолчанию 6 секунд), считается, что связь потеряна.
Edge Ports — граничный порт относительно STP дерева. Это порт, к которому никогда не был подключен другой коммутатор, а подключены конечные устройства. То есть порт сразу же переходит в режим пересылки. Режим работы порта в этой роли похож на режим PortFast, но отличается тем, что порт при получении первого же BPDU становится STP портом.
Состояния портов
В отличии от STP, RSTP определяет всего три состояния портов коммутаторов.
Discarding (отброс фреймов) — состояние, в котором порт не передает данные. По аналогии с STP, это Blocking, Listening и Disabled состояния.
Learning (изучение) — так же, как и в STP
Forwarding — так же, как и в STP .
Роли портов
Корневой порт — порт некорневого коммутатора, имеющий лучшую стоимость для достижения корневого коммутатора. Для каждого некорневого коммутатора может быть только один. В стабильной сетевой топологии находится в состоянии Forwarding .
Назначенный порт — все порты корневого коммутатора. А также только по одному порту на сегмент, связывающий некорневые коммутаторы. В стабильной сетевой топологии находится в состоянии Forwarding .
Альтернативный порт — порт, предлагающий альтернативный путь к корневому коммутатору. Находится в состоянии Discarding.
Конфигурирование Rapid-PVST+
S1(config)#spanning-tree mode rapid-pvst
S1(config)#interface interface-id
S1(config-if)#spanning-tree link-type point-to-point
S1#clear spanning-tree detected-protocols