LINUX.ORG.RU

Небольшой вопрос про мешсети

 , ,


0

1

Допустим, есть N устройств, которые могут общаться друг с другом через общий радиоканал. Вполне очевидно, что в каждый момент времени передавать данные может только один, а остальные должны его слушать. Если это условие не будет соблюдено, то данные будут повреждены.

В централизованных вариантах типа Wi-Fi или GSM всё очень просто - есть базовая станция (базовые станции связанны проводами или радиоканалом типа «точка-точка», где проблем меньше), которая всё регулирует. Она может либо опрашивать клиентские устройства по очереди (в таком случае самовольная передача данных клиентом исключена, а поскольку запросить за раз можно данные лишь с одного клиента, проблем никаких нет), либо вводить понятия всяких тайм-слотов и прочего, делая так, чтобы каждый клиент мог передавать лишь в определённое время.

Но что делают в случае децентрализованных систем? Можно сделать так:

while (ЭфирЗанят()) НичегоНеДелать(); ПередатьПакет();

Но тут возникает классическая ситуация гонки. Если производительность устройств соизмерима, то при свободном эфире каждое из них выполнит проверку эфира и пойдёт на ветвление передачи данных. Хотя в ситуации малой загрузки сети может и прокатить.

Можно слушать эфир во время передачи и вычитать из сигнала то, что передаём мы сами. В таком случае если устройств только 2, то можно получить полнодуплексный канал и не париться. Но если устройств больше двух, то такой метод уже не подходит.

Можно выбрать главное устройство (по какому принципу?) и использовать классические схемы, но ещё надо быстро среагировать на его уход из зоны приёма (при этом само главное устройство может и не узнать об этом, так что никого не предупредит). К тому же нормальная сеть должна давать возможность связаться узлам, которые не видят друг-друга напрямую, а лишь через несколько посредников. В итоге при достаточной удалённости узлов не будет ни одного узла, который бы видел все остальные, а значит «главных» потребуется несколько, но при этом они не должны друг-другу мешать (и встаёт задача построения таки одноранговой сети, просто уже из «главных»). В общем, тоже не то.

Так что делают то? Меня уже давно мучает этот вопрос и я решил спросить у ЛОРа.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

CSMA/CA и если произойдет коллизия, то повторы. Никаких чудес.

В некоторых случаях делают меш с TDMA, но это сложно и в общем случае не возможно.

alexru ★★★★
()

Ну и представление о времени детектирования тоже не верное. В ZigBee может пройти несколько секунд пока не стает ясно, что маршрут поломан и еще до 30 секунд на поиск нового.

alexru ★★★★
()

надо быстро среагировать на его уход из зоны приёма

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

Кстати, ты не в курсе как в netsukuku было?

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Ну избыточность маршрутов не обязательна. Можно применять подтверждение получения. Отправляем пакет и ждём ответа. Ретранслятор ретранслирует его и тоже ждёт ответа. И так далее, пока не дойдёт до получателя, который пошлёт ответ. В итоге заметные проблемы должны быть только при массовом пропадании узлов из сети. Ну и ещё есть шанс дублирования пакета (пакет прошёл по маршруту, затем один из промежуточных узлов пропал и подтверждение не дошло), но это будет опять лишь в момент пропадания узлов и легко игнорируется программно.

Но это уже другой вопрос (как строить и перестраивать маршруты), тоже сложный, конечно же. А мне интересно именно как не допустить коллизий при передаче. То есть более низкий уровень.

KivApple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.