Алгоритмы обнаружения топологии сети
CDP (cisco discovery protocol)
Важные переменные
cdpCacheTable, ifTable, ipAddrTable
Алгоритм
Весь алгоритм основан на анализе переменной cdpCacheTable. Как только сетевое устройство получает эту переменную, следующий набор инструкций выполняется для каждого отдельного ряда:
1. Получить значение cdpCacheIfIndex и сохранить его как исходный интерфейс для потенциальной связи;
2. Получить значение cdpCacheDevicePort и сохранить его как описание сетевого интерфейса для потенциальной связи;
3. Проверить значение поля cdpCacheAddressType. Если равно 1 (IP-адрес), получить фактический адрес из поля cdpCacheAddress и попытаться найти соответстующее сетевое устройство в системе;
4. Если устройство найдено, проверить наличие cdpCacheTable;
4.1. Если в наличии, попытаться найти IP-адрес начального сетевого устройства в любом cdpCacheAddress поле таблицы. Как только найдено, сохранить значение соответствующего поля cdpCacheIfIndex как целевой интерфейс для потенциальной связи;
4.2. В противном случае, проверить содержание переменной ifTable. Если описание сетевого интерфейса (шаг 2) присутствует в каком-либо ifDescr поле таблицы, использовать значение ifIndex того же ряда в качестве целевого интерфейса;
5. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
ARP (address resolution protocol)
Важные переменные
ipCidrRouteTable (or ipRouteTable), ipAddrTable
Алгоритм
Вся необходимая для алгоритма информация включена в переменную ipCidrRouteTable (или ipRouteTable при отсутствии).
1. Получить тип маршрута (ipCidrRouteType или ipRouteType). Для любого значения, отличного от 4 (непрямой маршрут), перейти к выполнению следующего шага;
2. Получить исходный интерфейс (ipCidrRouteIfIndex или ipRouteIfIndex);
3. Перейти к значению следующего шага трассировки (ipRouteIfIndex или ipRouteNextHop);
4. Для каждого устройства сети в системе проверить его переменную ipAddrTable. Если следующий шаг трассировки (шаг 3) присутствует в каком-либо поле ipAdEntAddr, сохранить соответствующее значение поля ipAdEntIfIndex как целевой интерфейс;
5. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
LLDP (link layer discovery protocol)
Важные переменные
lldpRemTable, lldpLocPortTable, ifXTable (or ifTable), lldpLocChassisId
Алгоритм
Для обработки при помощи данного алгоритма, сетевое устройство должно иметь как lldpRemTable, так и lldpLocPortTable переменные. Для каждого такого устройства выполняется следующий набор инструкций:
1. Получить тип шасси (поле lldpRemChassisIdSubtype в lldpRemTable);
2. Если это тип 4 (MAC-адрес), получить фактический адрес из поля lldpRemChassisId и попытаться найти соответствующее сетевое устройство в системе. Если устройство найдено, сохранить его как целевое устройство;
3. Получить номер локального порта (поле lldpRemLocalPortNum в lldpRemTable);
4. С использованием номера порта найти соответствующую запись в lldpLocPortTable (поле lldpLocPortNum) и проверить ID-подтип его порта (поле lldpLocPortIdSubtype);
5. В случае подтипа 3 (MAC-адрес) или 7 (локальный адрес), получить фактический адрес из поля lldpLocPortId и попытаться найти его в переменной ifXTable (или ifTable) (поле ifPhysAddress) и использовать значение соответствующего поля ifIndex как исходный интерфейс;
6. Если в таблице нет подходящей записи, просто использовать номер локального порта (шаг 3) как исходный интерфейс;
7. Получить ID подтип удаленного порта (поле lldpRemPortIdSubtype);
8. Используя подтип порта, вычислить целевой интерфейс, как описано в шаге 5;
9. Если все равно безрезультатно, попытаться найти ID локального устройства (переменная lldpLocChassisId) в lldpRemTable целевого устройства (поле lldpRemPortId). Использовать значение из поля lldpRemLocalPortNum как целевой интерфейс;
10. Если это невозможно, получить описание удаленного порта (поле lldpRemPortDesc в lldpRemTable) и попытаться найти соответствующую запись в переменной lldpLocPortTable целевого устройства (поле lldpLocPortDesc). Использовать значение из поля lldpLocPortNum как целевой интерфейс;
11. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
STP (spanning tree protocol)
Поддерживаются два STP режима: Classic STP и Multiple STP (MSTP)
Classic STP
Важные переменные
dot1dStpPortTable, dot1dBaseBridgeAddress, dot1dStpPriority, dot1dBasePortTable, ifXTable (or ifTable)
Алгоритм
Данный алгоритм доступен только для сетевых устройств, имеющих переменные dot1dStpPortTable и dot1dBaseBridgeAddress.
1. Получить основной адрес моста (dot1dBaseBridgeAddress);
2. Для каждой отдельной записи в dot1dStpPortTable получить ID соседнего моста (поле dot1dStpPortDesignatedBridge), ID соседнего порта (поле dot1dStpPortDesignatedPort) и соседний MAC-адрес (адрес извлекается из ID соседнего моста, начиная с 7-го символа);
3. Если основной адрес моста и соседний MAC-адрес не совпадают, перейти к следующему шагу;
4. Попытаться найти соседний коммутатор в системе. Он должен содержать соседний MAC-адрес в своей ifXTable (поле ifPhysAddress);
5. Получить исходный порт (поле dot1dStpPort);
6. Попытаться найти запись в переменной dot1dBasePortTable с указанием исходного порта (поле dot1dBasePort). Если такая запись имеется, использовать значение ее поля dot1dBasePortIfIndex как исходный интерфейс;
7. Проверить, содержит ли соседнее устройство переменную dot1dStpPortTable;
7.1. Если содержит, попытаться найти запись в переменной dot1dStpPortTable такую, чтобы значение ее поля dot1dStpPortDesignatedBridge совпадало с ID соседнего моста (шаг 2), а значение поля dot1dStpPortDesignatedPort совпадало с ID соседнего порта (шаг 2);
7.1.1. Получить значение поля dot1dStpPort записи и конвертировать его, как описано в шаге 6. Использовать вычисленное значение как целевой интерфейс;
7.2. В противном случае, разделить ID соседнего порта (шаг 2) при помощи разделителя в виде двоеточия (:) и использовать второй фрагмент как целевой интерфейс;
8. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
MSTP
Важные переменные
swMSTPMstPortTable, swMSTPPortTable, dot1dBaseBridgeAddress, ifXTable (or ifTable)
Алгоритм
Данный алгоритм доступен только для сетевых устройств, имеющих переменные swMSTPMstPortTable и dot1dBaseBridgeAddress.
1. Получить основной адрес моста (dot1dBaseBridgeAddress);
2. Для каждой отдельной записи в swMSTPMstPortTable, не имеющей статус "неактивный" (значение поля swMSTPMstPortStatus не равно 2), получить MAC-адрес заданного моста (адрес извлекается из заданного моста (поле swMSTPMstPortDesignatedBridge field), начиная с 7-го символа);
3. Если основной адрес моста и заданный MAC-адрес не совпадают, перейти к следующему шагу;
4. Попытаться найти заданный коммутатор в системе. Он должен содержать заданный MAC-адрес в его ifXTable (поле ifPhysAddress);
5. Получить исходный порт (поле swMSTPMstPort field). Использовать его как исходный интерфейс;
6. Проверить, содержит ли заданное устройство переменную swMSTPMstPortTable;
7. Если содержит, попытаться найти запись в переменной swMSTPMstPortTable такую, чтобы значение ее поля swMSTPMstPortDesignatedBridge совпадало с основным адресом моста (шаг 1);
8. Использовать значение ее поля swMSTPMstPort как целевой интерфейс;
9. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
AFT алгоритм (address forwarding tables)
Важные переменные
Отсутствуют
Алгоритм
1. Попытаться найти прямые связи;
1.1. Для каждого отдельного коммутатора в системе выполнить итерацию по его AFT;
1.2. Получить исходный интерфейс записи;
1.3. Для каждого сетевого устройства, связанного с этим интерфейсом, проверить, содержит ли его AFT обратную связь;
1.4. При обнаружении обратных связей, использовать ее интерфейс как целевой;
1.5. Если ни исходный, ни целевой интерфейсы еще не упоминались ни в одной другой связи топологии, сохранить новую связь с этими интерфейсами.
2. Попробовать найти связи через L1 коммутаторы;
Если кратко, этот шаг включает попытку найти пару сетевых устройств (или несколько пар) так, чтобы:
2.1. Набор устройств, связанных с определенным сетевым интерфейсом исходного устройства, имел некоторые общие элементы с набором устройств, связанных с определенным сетевым интерфейсом целевого устройства;
2.2. В то же время набор устройств НЕ связанных с одним и тем же сетевым интерфейсом исходного устройства, не должен иметь общих элементов с набором устройств, НЕ связанных с одним и тем же сетевым интерфейсом целевого устройства;
2.3. Если выполняются оба условия, проверить, упоминались ли исходный и целевой интерфейсы в какой-либо другой связи топологии. Если нет, сохранить новую связь с этими интерфейсами.
3. Попытаться предположить связи. Предположение связей - довольно сложный алгоритм, и в данном разделе не объясняется.