
Инициализация топологии
Для автоматического определения начальной активной конфигурации дерева все коммутаторы сети после их инициализации начинают периодически обмениваться специальными пакетами, называемыми протокольными блоками данных коммутатора - BPDU (Bridge Protocol Data Unit).
Пакеты BPDU помещаются в поле данных кадров канального уровня, например, кадров Ethernet. Все коммутаторы должны поддерживать общий групповой адрес, с помощью которого кадры, содержащие пакеты BPDU, передаются одновременно всем коммутаторам сети.
Пакет BPDU имеет следующие поля:
Идентификатор версии протокола STA - 2 байта. коммутаторы должны поддерживать одну и ту же версию протокола STA, иначе может установиться активная конфигурация с петлями.
Тип BPDU - 1 байт. Существует два типа BPDU - конфигурационный BPDU, то есть заявка на возможность стать корневым коммутатором, на основании которой происходит определение активной конфигурации, и BPDU уведомления о реконфигурации, которое посылается коммутатором, обнаружившим событие, требующее проведение реконфигурации - отказ линии связи, отказ порта, изменение приоритетов коммутатора или портов.
Флаги - 1 байт. Один бит содержит флаг изменения конфигурации, второй бит - флаг подтверждения изменения конфигурации.
Идентификатор корневого коммутатора - 8 байтов.
Расстояние до корня - 2 байта.
Идентификатор коммутатора - 8 байтов.
Идентификатор порта - 2 байта.
Время жизни сообщения - 2 байта. Измеряется в единицах по 0.5 с, служит для выявления устаревших сообщений. Когда пакет BPDU проходит через коммутатор, тот добавляет ко времени жизни пакета время его задержки данным коммутатором.
Максимальное время жизни сообщения - 2 байта. Если пакет BPDU имеет время жизни, превышающее максимальное, то он игнорируется коммутаторами.
Интервал hello, через который посылаются пакеты BPDU.
Задержка смены состояний - 2 байта. Минимальное время перехода портов коммутатора в активное состояние. Такая задержка необходима, чтобы исключить возможность временного возникновения альтернативных маршрутов при неодновременной смене состояний портов во время реконфигурации.
У
Рис.
2.6. Формат пакета BPDU
После инициализации каждый коммутатор сначала считает себя корневым. Поэтому он начинает через интервал hello генерировать через все свои порты сообщения BPDU конфигурационного типа. (Далее под BPDU понимается везде конфигурационный BPDU, если тип BPDU точно не указан.) В них он указывает свой идентификатор в качестве идентификатора корневого коммутатора (и в качестве данного коммутатора также), расстояние до корня устанавливается в 0, а в качестве идентификатора порта указывается идентификатор того порта, через который передается BPDU.
В исходном состоянии каждый коммутатор не только передает BPDU через все свои порты, но и принимает через все порты BPDU, передаваемые другими коммутаторами. Коммутатор в течение интервала установления начальной конфигурации фиксирует значения нескольких своих внутренних переменных:
RI (Root Identifier) - идентификатор корневого коммутатора, в начальный момент работы алгоритма STA каждый коммутатор присваивает этой переменной свой собственный идентификатор.
minRPCi (min Root Path Cost) - наименьшее значение расстояния до корня, встретившееся в пакетах BPDU, принятых от корневого коммутатора по i-му порту. Для каждого порта коммутатора имеется своя переменная minRPCi, начальное значение этой переменной равно максимально допустимому значению расстояния, определяемому форматом переменной.
minBi и minPi - идентификаторы коммутатора и порта, от которого поступил пакет, на основании которого присвоено значение расстояния до корня переменной minRPCi - по две переменные на каждый порт.
Коммутатор обрабатывает поступающие на порты сообщения BPDU следующим образом.
Сначала коммутатор сравнивает значение идентификатора корневого коммутатора из BPDU с текущим значением переменной RI.
Если это значение больше текущего значения RI, то принятый пакет просто уничтожается, так как он не несет никакой информации о расстоянии до корневого коммутатора - он пришел от коммутатора, который не является корневым.
Если оно равно текущему значению RI, то значит принят пакет от уже известного корня. Находящееся в пакете расстояние до корня сравнивается с найденным ранее минимальным расстоянием minRPCi, и если новое значение меньше, то оно переписывается в переменную minRPCi данного порта. Затем коммутатор наращивает значение поля расстояния до корня на величину условного времени сегмента, по которому пришел пакет, помещает в поле идентификатора коммутатора свой идентификатор и передает этот пакет на все свои порты, кроме того порта, от которого получен пакет. В переменные minBi и minPi записываются идентификаторы коммутатора, от которого получен пакет BPDU, и его порта.
Если же значение идентификатора корневого коммутатора у принятого BPDU меньше текущего, то это значит, что обнаружен коммутатор, у которого больше прав претендовать на звание корневого. Его идентификатор фиксируется в переменной RI, а все значения переменных minRPCi устанавливаются в исходное значение, так как они были вычислены ранее на основании расстояний до коммутатора, на самом деле корнем не являющегося. Затем пакет BPDU обрабатывается точно по тому же алгоритму, что и в предыдущем случае.
По мере распространения пакетов BPDU по всей сети у всех коммутаторов накапливается информация, необходимая для фиксации корневого коммутатора, а также для определения того, какой из портов коммутатора является корневым портом, какие порты являются назначенными для сегментов, а какие не входят ни в первую, ни во вторую категории.
После истечения времени установления активной конфигурации у всех коммутаторов происходит фиксация идентификатора корневого коммутатора. Коммутатор, который в течение всего времени процесса установления конфигурации считал себя корневым, окончательно удостоверяется в этом. Все его порты устанавливаются в состояние назначенных.
Коммутаторы, знающие, что они не корневые, определяют свой корневой порт как порт, имеющий минимальное расстояние до корневого коммутатора. Для этого для каждого порта вычисляется расстояние RPCi как сумма переменной minRPCi и условного времени сегмента, с которым связан данный порт, так как в переменной minRPCi это время учтено не было. Затем выбирается корневой порт, как порт с минимальным значением RPCi. После этого данное значение называется расстоянием до корня данного коммутатора - RPC.
Затем коммутатор проверяет все оставшиеся порты как претендентов на звание назначенных портов сегментов, к которым они подключены. Он сравнивает значение minRPCi данного порта со значением RPC, то есть сравнивает расстояния до корня от других коммутаторов данного сегмента со своим собственным. Если его собственное расстояние оказывается меньше по каждому порту, то он фиксируется как назначенный. Если же оно больше, то порт переводится в заблокированное состояние, в котором он не будет ни принимать, ни передавать информационные пакеты в рабочем режиме, после установления активной конфигурации. Если же расстояния оказываются равными, то коммутатор сравнивает сначала свой идентификатор с идентификатором minBi коммутатора-конкурента, а если и они равны (то есть конкурируют его собственные порты), то сравниваются в конце концов идентификаторы портов.
После того, как все коммутаторы определяют статус своих портов, процесс установления активной конфигурации завершен. Корневые и назначенные порты начинают участвовать в передаче кадров протокола канального уровня, то есть для них устанавливается активное состояние, в отличие от заблокированных портов.
Принцип
действия протокола STP рассмотрим на
примере сети на рис. 2.7. Предположим, что
станция А генерирует широковещательное
сообщение. Оно будет получено коммутаторами
Б и В и передано соответственно друг
другу, как показано стрелками. После
получения сообщения эти коммутаторы
вновь перешлют его коммутатору А, и весь
цикл повторится вновь. Похожая проблема
возникает и в случае не широковещательного
трафика, если коммутаторы еще не построили
своих адресных таблиц. Решением проблемы
является удаление всех петель из сетевой
топологии с сохранением только одного
пути между каждыми двумя станциями.
В примере коммутаторы Б и В добавляют свои стоимости портов - числа 25 и 30 соответственно - и пересылают сообщения друг другу. После анализа этих сообщений коммутатор с наибольшей стоимостью пути до корня переводит свой порт в блокированное состояние. В примере этим коммутатором является коммутатор В с портом 2. Порт, находящийся в блокированном состоянии, не передает кадры через себя, однако он продолжает принимать и обрабатывать пакеты BPDU. У коммутатора Б порт 2 становится назначенным, и только через него происходит передача кадров в подключенный сегмент сети. Таким образом, хотя коммутатор Б будет продолжать передавать кадры данных через свой порт 2, они не пройдут дальше коммутатора В, который будет их отсекать, устраняя петлю, существовавшую ранее.