Для закрепления материала рассмотрим подробно работу протокола STP на следующем примере. Предположим, имеется сетевая топология из трех коммутаторов A, B, C. Коммутаторы связаны между собой через разделяемые сетевые сегменты X, Y и Z.
Сконфигурируем их следующим образом: приоритет коммутатора A установим 8192, приоритет B и C по 32768. Стоимость портов 1 и 2 коммутатора B установим 100. Стоимость портов 1 и 2 коммутатора C установим 50.
После включения STP (или коммутаторов с включенным STP) начинаются выборы корневого коммутатора. Все коммутаторы начинают рассылать BPDU с идентификатором корневого коммутатора в качестве которого вначале считают себя. После того, как коммутатор получает BPDU с идентификатором корневого коммутатора меньшим, чем он сам, он перестает считать себя корневым. В итоге выборов корневым становится коммутатор с наименьшим идентификатором. Мы этого намеренно добивались для коммутатора A, установив его приоритет заведомо меньше, чем у B и C. Корневой коммутатор в сети – единственный. Желательно, чтобы им становился наиболее мощный коммутатор ядра сети.
Непосредственно после выборов корневой коммутатор начинает генерировать (передавать) на всех своих портах BPDU с определенным периодом (период можно настраивать, обычно это 1-2 секунды). Все остальные коммутаторы только ретранслируют получаемые от корневого BPDU, изменяя в них только некоторые параметры (например, стоимость пути до корня).
Таким образом, BPDU от корневого коммутатора достигают всех коммутаторов в сети. В нашем случае корневой коммутатор A посылает в сторону B и C на портах 1 и 2 пакеты BPDU, содержащие RBID=[MAC A + A Priority] и RPC = 0, так как A является корневым и следовательно путь до корня от самого A равен 0. Коммутатор B при получении на порту 1 BPDU от A добавляет входную стоимость порта (которая равна 100) к RPC, содержащейся в BPDU (0). Коммутатор B запоминает стоимость пути к корню через порт 1 (RPC = 100) и посылает в сторону C пакет BPDU с RBID=A и RPC=100. Коммутатор C получает от A BPDU с RBID A, RPC=0 через порт 2 и BPDU от B с RBID = A , RPC=100 через порт 1. Коммутатор С добавляет к полученным RPC свои входные стоимости портов и в итоге получает RPC через порт 1 = 150 и RPC через порт 2 = 50. Он выбирает путь к корню с наименьшей стоимостью (а это RPC=50 через порт 2) и в соответствии с этим назначает корневой порт – 2. Тот же коммутатор С посылает в сторону B BPDU с RBID=A и RPC=50. Коммутатор B уже имеет информацию о достижении корня (порт 1, RPC=100) и, получив BPDU от С (RBID=A и RPC=50), и добавив к нему свою входную стоимость (100), выполняет несложный выбор – корневым (с наименьшим RPC=100) становится порт номер 1.
После выбора корневых портов коммутаторами решается какой коммутатор (Designated Bridge) и его порт (Designated Port) будет обслуживать каждый конкретный сегмент сети. Это происходит аналогично выбору корневых портов – для каждого сегмента просчитывается кратчайший путь до корня.
Последним этапом работы STP является блокирование на всех коммутаторах портов, не являющихся корневыми или назначенными. Заметим, что блокировка STP работает только для передаваемых данных – BPDU через блокируемые порты пропускаются и линк будет по-прежнему активным.
Кроме основной задачи построения беспетлевой топологии STP решает еще одну дополнительную – изменение времени хранения MAC адресов в таблицах коммутаторов в случае изменения состояния портов. Происходит это следующим образом: коммутатор, на котором произошло изменение (например, отключился и снова включился порт), посылает в сторону корневого специальный BPDU Topology Change Notification (TCN). Корневой после его получения рассылает TCN для всех коммутаторов и они изменяют время хранения MAC адресов в своих таблицах с целью обеспечения коммутации пакетов с учетом возможных изменений (например, на порту изменился MAC адрес клиента, а коммутатор по умолчанию продержит соответствующую запись в таблице слишком долго).