Построение карты соединений

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Построение карты соединений

Сообщение alibek » 07.04.2012 (Сб) 10:41

Реальная задача имеет специфику, поэтому чтобы не вызывать путаницу, сформилирую ее на абстрактном примере.

Есть некие устройства, которые могут соединяться между собой. Для простоты можно считать эти устройства аналогами хабов/свитчей (или концентраторов/коммутаторов, кому какая терминология удобнее).
Устройства бывают разных типов, у каждого типа есть определенное количество портов.
Устройства соединяются между собой. Схема (топология) соединений может быть различной, но для простоты можно считать, что кольца отсутствуют и устройства соединяются звездой, либо лучами (каскадом).
Пример возможных соединений на рисунке (круглый элемент — корневое устройство, их может быть несколько):
sample.gif
(8.19 Кб) Скачиваний: 178


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

Т.е. задача разбивается на три этапа.
1. Просканировать все устройства, для каждого устройства определить его тип и идентификатор.
2. Получить список идентификаторов на каждом порту каждого устройства.
3. На основании полученных данных построить схему подключения.

Первые два пункта можно считать решенными.
Третий пункт решается следующим образом.

3.1. Определить "восходящий" порт (uplink), по которому устройство подключено ко всей сети. Для этого достаточно определить, в каком порту присутствует идентификатор корневого устройства.
3.2. Определить "нисходящие" порты (downlinks), к которым подключены остальные устройства. Это будут все порты, в которых присутствуют идентификаторы, за исключением uplink-порта.
3.3. Данные из п.3.2 дадут информацию о том, какие устройства подключены на каждом порту, но не о том, в каком порядке они следуют. Для этого итеративно (сверху вниз) по каждому порту выполняем следующее:
3.3.1. Для начала определим множество A (все идентификаторы с порта, включая идентификатор текущего устройства). Текущее устройство будем считать родительским, подключенные к порту устройства будем считать опрашиваемыми.
3.3.2. Для каждого опрошенного устройства определим uplink и для uplink получим список идентификаторов, ограничив их множеством A. Те устройства, у которых в результате на uplink будет присутствовать только идентификатор родительского устройства, являются устройствами первого уровня в текущей ветке.
3.3.3. Получив список всех устройств первого уровня в текущей ветке, повторим процедуры начиная с п.3.2.
(под опросами в разделе 3.3 подразумевается не реальный опрос, а использование ранее полученных в п.2 данных)

Это пока не готовое решение, а рассуждения. Но я возможно что-то упустил и есть более эффективные и быстрые способы построения схемы соединений.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Построение карты соединений

Сообщение Proxy » 07.04.2012 (Сб) 15:56

Получше бы описание устройств. Могут ли они по типу tracert что-то делать? Ну в простом случае корневое устройство может отправлять пакет со счётчиком, который далее каждое устройство убавляет, а по достижению нуля отправляет в ответ собственное описание (ид, тип, ещё что-нибудь)? Корневое устройство может отправить пакет (ну про пакет я может и зря, но по аналогии с IP) на конкретный порт или как хаб только на все и сразу? Возникнет ли коллизия, если два устройства одновременно отправят ответ в направлении корневого устройства или же при занятом канале один из пакетов будет размещаться в очереди? Как регулируется на какой порт будет отправлен пакет одним из аналогов свитча? Там помимо физических адресов ещё какая-то адресация присутствует?
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 08.04.2012 (Вс) 20:37

Устройства — это коммутаторы, соединенные на L2. Идентификаторы — MAC-адреса. Трассировки нет, т.к. это второй уровень, соединения непосредственные.
Все устройства поддерживают SNMP, но карту соединений по SNMP не получить. Протокол STP не применяется.
Могу дать дополнительную информацию по устройствам, но думаю, что это мало на что повлияет.
Суть вопроса — есть дерево и для каждого узла можно получить список потомков (без иерархии). По этим данным нужно восстановить структуру дерева.
Мое решение рабочее, но возможно неоптимальное.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение карты соединений

Сообщение Хакер » 08.04.2012 (Вс) 20:45

alibek, ты не мог бы ещё больше формализовать задачу? Что за входные данные (описание вида «множество элементов таки-то и таких-то») и что требуется получить на выходе?

Потому что непонятно:
alibek писал(а):Суть вопроса — есть дерево и для каждого узла можно получить список потомков (без иерархии). По этим данным нужно восстановить структуру дерева.

Есть дерево и нужно получить дерево?

Первый пост прочитал бегло.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 8:43

Ну можно и формализовать.

Есть некая сеть, построенная на L2-коммутаторах.
Схема их подключений считается неизвестной.
Есть доступ к каждому коммутатору, с помощью которого можно определить собственный MAC-адрес коммутатора и получить содержимое таблицы MAC-адресов (в таблице MAC-адресов хранится соответствие между портами и доступными на этих портах MAC-адресами).
Нужно на основании этой информации (таблица MAC-адресов на каждом устройстве) построить схему соединений устройств.

Есть дерево и нужно получить дерево?

Есть дерево, о котором известно только, что это дерево, его структура неизвестна.
Нужно получить структуру.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение карты соединений

Сообщение Хакер » 09.04.2012 (Пн) 9:06

То есть известен список узлов графа, но неизвестна смежность узлов графа?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 10:33

Да, частный случай графа (дерево).
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение карты соединений

Сообщение Хакер » 09.04.2012 (Пн) 10:44

Список идентификаторов, получаемых с одного порта: содержит идентификаторы только непосредственно подключённых к порту устройств, или содержит список и непосредственно, и косвенно подключенных устройств?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 10:53

Второе. Если было бы первое, то задача бы решалась тривиально (аналогично рекурсивному поиску файлов).
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение карты соединений

Сообщение Хакер » 09.04.2012 (Пн) 10:58

Так тебе нужен гиперграф, а не просто граф, правильно?

Если три «умных» свитча включены в один «глупый» хаб. С гиперграфом это будет три узла соединённых одним ребром, а простым графом это будет граф-кольцо с тремя рёбрами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 11:22

Нет, хабов у меня нет, гиперграфов у меня не будет.
Хотя теоретически, если хабы все же будут, тогда граф будет выглядеть так, как в аттаче.
Верхний вариант для параллельного подключения, нижний для последовательного.
Справа нарисованы узлы графа и их соединения между собой (в таком виде их мне нужно получить).
Первой строкой в узлах указан собственный идентификатор, второй идентификаторы на uplink, третьей идентификаторы на downlink (в этом примере только один downlink).
Вложения
sample2.gif
(42.96 Кб) Скачиваний: 124
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Построение карты соединений

Сообщение Proxy » 09.04.2012 (Пн) 18:05

В нижней схеме из sample2.gif опечатка или это какая-то хитрость?

Ну и бегло осмотрев схемы могу предложить рассмотреть такой вариант:
Ищем корневой узел (совсем пустяк)
Строим все возможные связи между парами (если не противоречит описанию смежных узлов у обоих, то регистрируем связь)
Определяем иерархический уровень для каждого узла (от самого младшего к корневому; точно не скажу как, но мысль опять таки имеется, об этом отдельно)
Ассоциируем связи между узлами с уровнем иерархии для одного (старшего, если возможно) из узлов
Ищем аномалии и удаляем повторные связи (оставляем связанные со старшим из смежных узлов)

Просто поток сознания, первое что в голову пришло. Возможно где-то что-то абсолютно некорректно.
Последний раз редактировалось Anonymous 09.04.2012 (Пн) 18:19, всего редактировалось 1 раз.
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 18:17

Где опечатка?
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Построение карты соединений

Сообщение Proxy » 09.04.2012 (Пн) 18:22

alibek писал(а):Где опечатка?
Вложения
Qsn.jpg
Qsn.jpg (25.95 Кб) Просмотров: 4186
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 09.04.2012 (Пн) 21:34

Да, это опечатка, должно быть 4.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Построение карты соединений

Сообщение Proxy » 09.04.2012 (Пн) 21:41

Ок. Я немного отредактировал прошлый пост.
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Построение карты соединений

Сообщение alibek » 10.04.2012 (Вт) 7:55

Proxy писал(а):Ну и бегло осмотрев схемы могу предложить рассмотреть такой вариант:
Ищем корневой узел (совсем пустяк)
Строим все возможные связи между парами (если не противоречит описанию смежных узлов у обоих, то регистрируем связь)
Определяем иерархический уровень для каждого узла (от самого младшего к корневому; точно не скажу как, но мысль опять таки имеется, об этом отдельно)
Ассоциируем связи между узлами с уровнем иерархии для одного (старшего, если возможно) из узлов
Ищем аномалии и удаляем повторные связи (оставляем связанные со старшим из смежных узлов)

Не вижу выгоды в таком алгоритме.
Мое решение гарантированно строит карту соединений за N проходов (N — число узлов). Можно даже еще быстрее, если не делать последний проход, предположив, что оставшиеся узлы уже не имеют потомков.
У твоего решения в худшем случае будет N^2 проходов (если брать связь «все со всеми»), в лучшем случае (брать только связи «родитель со всеми потомками») будет зависеть от реальной схемы, но все равно больше, чем N.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList