Я правильно понимаю, что:
- есть некая Mesh-сеть (все-со-всеми), предназначенная для обмена некими сообщениями
- канал связи между узлами - прямое TCP-соединение
- в случае обрыва прямого соединения, должна обеспечиваться возможность транзитного прохождения сообщения
- количество узлов может быть очень большим - возможно, тысячи узлов
Верно?
Тогда есть смысл реализовать схему маршрутизации, аналогичную принятой в BGP.
Я отойду от специфически сетевой терминологии и постараюсь передать суть.
Итак, у каждого узла есть свой идентификатор - имя.
Оно отвязано от его ip-адресации, и, по-хорошему, один и тот же узел может быть доступен по нескольким ip-адресам одновременно.
В момент установления нового соединения между узлами, каждый из них сообщает новому соседу как своё имя, так и список известных ему других узлов с наиболее коротким транзитным путём до каждого из них.
Пример:
Узел "Вася" подключается к узлу "Петя".
В момент подключения, "Вася" сообщает:
Я "Вася". Я знаю, как добраться до:
- "Вася", кратчайший путь: ""
- "Коля", кратчайший путь: "Вася"
- "Настя", кратчайший путь: "Вася, Коля" (Возможно, есть ещё более длинный маршрут, но нам достаточно сообщить наиболее короткий)
"Петя" делает следующее:
- отдаёт Васе аналогичный список известных ему узлов с маршрутами до них
- отбрасывает полученные от "Васи" маршруты, в кратчайшем пути до которых нашёл свой имя (во избежание петель маршрутизации)
Для того, чтобы понять, в какое соединение отправить сообщение для Насти, Пете достаточно из известных ему маршрутов до неё выбрать тот, у которого маршрут короче.
Потенциальные грабли, которые стоит учесть:
1. Не забывать сообщать соседям об изменении своей таблицы маршрутизации:
- при пропадании соседа
- при появлении нового соседа
- если для какого-то возможного получателя изменился наиболее короткий маршрут
2. Не забывать отбрасывать маршруты, в которых нашёл самого себя
3. Поскольку из-за некорректной работы некоторых узлов "закольцовывание" всё равно возможно, необходим аналогичный TTL механизм, ограничивающих количество транзитных узлов, которое может пройти сообщение перед своим уничтожением.