Jump to content
Калькуляторы

Построить дерево алгоритм

Есть база FDB по всей сети, в виде id-железки, ip-железки, mac, unit, port. Т.е. в базе есть все маки со всех коммутаторов в сети.

Вобщем то задача построить по этим данным дерево. Понятно что нужно выбрать корневую точку (id-железки), ну или любую начальную точку. Так же понятно что нужно выбрать какой-то MAC который у всех висит на аплинке, для того чтобы выцепить номер порта на аплинке. Дальше пока не понятно.

 

Возможно кто-то уже подобную задачу решал, расскажите варианты решения. Я уже нашел 2 варианта, но пока оба не очень быстрые.

 

Один из них, самый оптимальный пока, это перебирать все маки с порта и смотреть какой из них не входят в собственную FDB таблицу.

Edited by SokolovS

Share this post


Link to post
Share on other sites
Есть база FDB по всей сети, в виде id-железки, ip-железки, mac, unit, port. Т.е. в базе есть все маки со всех коммутаторов в сети.

Вобщем то задача построить по этим данным дерево. Понятно что нужно выбрать корневую точку (id-железки), ну или любую начальную точку. Так же понятно что нужно выбрать какой-то MAC который у всех висит на аплинке, для того чтобы выцепить номер порта на аплинке. Дальше пока не понятно.

 

Возможно кто-то уже подобную задачу решал, расскажите варианты решения. Я уже нашел 2 варианта, но пока оба не очень быстрые.

 

Один из них, самый оптимальный пока, это перебирать все маки с порта и смотреть какой из них не входят в собственную FDB таблицу.

Дальше считаешь сколько маков на каждой железке. Исходишь из того что что на конечных железках будет меньше маков чем на корневых. Берешь любой мак и удаляешь его(в смысле из базы) с тех свитчей на которых количество маков больше чем на выбранном ну и т.д.

Поподробнее попозже попробую изложить

Share this post


Link to post
Share on other sites

Исходишь из того что что на конечных железках будет меньше маков чем на корневых.

Это условие не всегда верное, т.к. на аплинке могут висеть маки с соседних веток.

Share this post


Link to post
Share on other sites
Исходишь из того что что на конечных железках будет меньше маков чем на корневых.
Это условие не всегда верное, т.к. на аплинке могут висеть маки с соседних веток.

Откиньте все аплинки(если в порту видим мак шлюза то он аплинк)

Share this post


Link to post
Share on other sites

Т.е. общее количество маков минус кол-во маков на аплинке, это брать за критейрий удаленности от центра. Так?

Share this post


Link to post
Share on other sites
Есть база FDB по всей сети, в виде id-железки, ip-железки, mac, unit, port. Т.е. в базе есть все маки со всех коммутаторов в сети.

Вобщем то задача построить по этим данным дерево. Понятно что нужно выбрать корневую точку (id-железки), ну или любую начальную точку. Так же понятно что нужно выбрать какой-то MAC который у всех висит на аплинке, для того чтобы выцепить номер порта на аплинке. Дальше пока не понятно.

 

Возможно кто-то уже подобную задачу решал, расскажите варианты решения. Я уже нашел 2 варианта, но пока оба не очень быстрые.

 

Один из них, самый оптимальный пока, это перебирать все маки с порта и смотреть какой из них не входят в собственную FDB таблицу.

Скажите, а зачем это надо ?

 

Просто давным давно, лет 7-8 назад, когда я был молодым и глупым, я тоже захотел прописать на всех коммутаторах все маки статически. Это было связано не только с безопасностью, ещё с другими проблемами, про которые долго рассказывать. Я даже написал программу на перле с интерактивным пользовательским интерфейсом на псевдографике, цветную :-). программа составляла FDB для всех коммутаторов сети, т.е. в базку заносились мутаторы, их топология (какой от которогоподключен) и маки абонов. На выходе получались команды для занесения на мутаторы. Как же хорошо, что хватило мозгов не применить это на практике ... зато на перле писать потренировался :-). Прогу ту я потерял.

Share this post


Link to post
Share on other sites
А колец(или случайных петель) у вас типа нет?
Нет

 

Скажите, а зачем это надо ?
Как я понял Человек хочет построить дерево коммутаторов, что за чем идет и куда воткнуто.

 

2 SokolovS

1. Снимаем все маки со всех свитчей(получаем базу ip - port - маки за портом, для удобства маки преобразовать в ip)

2. находим аплинки и помечаем их (если в порту вижу мак шлюза считаю его аплинком)

3. считаем количество маков на свитче не учитывая аплинков и заносим в базу

4. удаляем с аплинков лишние маки

5. перебираешь все маки из базы и удаляешь этот мак с тех свитчей где он встречается И на которых количество маков больше чем на выбранном

6. в конце базе останется ip - port - 1 мак след. устройсва

7. Группируем по адресам и наносим на ГИС, по конкретному адресу прорисовываем в graphviz

 

А вообще извращение это =)))

Есть же замечательный протокол LLDP, куда проще и точнее

Share this post


Link to post
Share on other sites

А тебе ее именно рисовать надо или просто вычислять с какого коммутатора и через какие все идет?

Share this post


Link to post
Share on other sites
Скажите, а зачем это надо ?

 

Просто давным давно, лет 7-8 назад, когда я был молодым и глупым, я тоже захотел прописать на всех коммутаторах все маки статически. Это было связано не только с безопасностью, ещё с другими проблемами, про которые долго рассказывать. Я даже написал программу на перле с интерактивным пользовательским интерфейсом на псевдографике, цветную :-). программа составляла FDB для всех коммутаторов сети, т.е. в базку заносились мутаторы, их топология (какой от которогоподключен) и маки абонов. На выходе получались команды для занесения на мутаторы. Как же хорошо, что хватило мозгов не применить это на практике ... зато на перле писать потренировался :-). Прогу ту я потерял.

Мне нужна просто топология, не более :) Никакой статики в FDB мне не нужно!

Share this post


Link to post
Share on other sites
А колец(или случайных петель) у вас типа нет?
Нет

 

Скажите, а зачем это надо ?
Как я понял Человек хочет построить дерево коммутаторов, что за чем идет и куда воткнуто.

 

2 SokolovS

1. Снимаем все маки со всех свитчей(получаем базу ip - port - маки за портом, для удобства маки преобразовать в ip)

2. находим аплинки и помечаем их (если в порту вижу мак шлюза считаю его аплинком)

3. считаем количество маков на свитче не учитывая аплинков и заносим в базу

4. удаляем с аплинков лишние маки

5. перебираешь все маки из базы и удаляешь этот мак с тех свитчей где он встречается И на которых количество маков больше чем на выбранном

6. в конце базе останется ip - port - 1 мак след. устройсва

7. Группируем по адресам и наносим на ГИС, по конкретному адресу прорисовываем в graphviz

 

А вообще извращение это =)))

Есть же замечательный протокол LLDP, куда проще и точнее

Ок. Спс, попробую по данному алгоритму.

LLDP конечно клево, но не универсально, BRIDGE-MIB поддерживает любой мало-мальски управляемый L2, а вот LLDP есть далеко не везде, к тому же, какой плюс в нем если снимать данные нужно все равно по SNMP.

Share this post


Link to post
Share on other sites

Все получилось, алгоритм я немного оптимизировал. После того как я нашел все другие коммутаторы на которых встречается искомый МАК и откинул те, на которых он висит на аплинке, остаются только его прямые соседи, т.е. все те у кого он на даунлинке. Чтобы упорядочить использую простейший запрос:

SELECT COUNT(DISTINCT mac) AS prio FROM global_fdb WHERE mac IN ('neighbor_mac1', 'neighbor_mac2', 'neighbor_mac3');

 

Получаемое в результате запроса значение и есть приоритет для построения пути.

 

Вторая фишка в том что не нужно забивать в конфиги маки шлюзов для поиска аплинков, можно забивать IP или ID. Сами маки можно взять из той же FDB, только в состоянии SELF а не LEARN. Это облегчает поддержку, когда на шлюз добавляются новые сегменты.

 

Спс за подсказки!

Edited by SokolovS

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this