Ретранслятор кажется простым устройством: услышал пакет — повторил. На этом описания обычно и заканчиваются, а дальше начинается то, что видно только на работающей сети. Ниже — как пересылка устроена в MeshTRX, во что она обходится и почему сеть из трёх ретрансляторов не собирается сама собой.
Две защиты от лавины
Если ретранслятор просто повторяет всё услышанное, сеть умирает на втором устройстве: два ретранслятора начинают повторять друг друга, и один пакет ходит по кругу, пока кто-нибудь не выключится. Поэтому защит две, и они разные.
TTL — счётчик жизни пакета. В заголовке едет число, ретранслятор уменьшает его на единицу, и пакет с нулём дальше не идёт. В MeshTRX начальное значение равно двум: пакет проходит через два ретранслятора и останавливается. Это ограничивает глубину сети, но не защищает от дублей: два ретранслятора, слышащие один и тот же пакет, оба его повторят, и каждый повтор будет законным.
Память о переданном. От дублей спасает второе: ретранслятор помнит, что он уже пересылал, и повтор того же самого отбрасывает. Ключ памяти — отправитель, номер пакета и тип. Кольцевой кеш на 128 записей, срок жизни записи — тридцать секунд для текста и файлов и три секунды для голоса.
Почему для голоса срок другой, лучше всего объясняет ошибка, которую мы на этом допустили.
Как счётчик съедал каждую вторую фразу
Номер голосового пакета — один байт, и он сбрасывался в ноль на каждом нажатии кнопки. Казалось, что так удобнее: приёмник видит нулевой номер и понимает, что началась новая фраза.
Для ретранслятора это выглядело иначе. Он помнил переданные пакеты полминуты. Вы сказали фразу — в его памяти осели номера 0, 1, 2 и дальше. Через десять секунд сказали вторую — и её пакеты пришли с теми же номерами, от того же отправителя, того же типа. Совпадение по всем полям ключа. Вторая фраза отбрасывалась целиком, как дубль.
На стенде, где голос идёт редкими пакетами и потери исключены, это выглядит недвусмысленно:
| переслано | отброшено | |
|---|---|---|
| первая фраза | 10 из 10 | 0 |
| вторая через 5 секунд | 0 из 10 | 10 |
| четвёртая через 40 секунд | 10 из 10 | 0 |
В живой сети эффект прятался за обычными потерями, и жалоба звучала как «через ретранслятор голос доходит через раз» — формулировка, по которой ничего не найдёшь.
Лечится это двумя правками. Номер стал сквозным: начало фразы приёмник узнаёт по отдельному флагу, а не по нулю. И память о голосе сократилась до трёх секунд — пакет живёт в сети доли секунды, трёх достаточно, чтобы отсечь эхо, и мало, чтобы забыть живую речь. Тридцать секунд для голоса опасны ещё и потому, что восьмибитный номер при двенадцати пакетах в секунду обходит круг за двадцать: в длинном разговоре свежий пакет совпал бы со старой записью.
Арифметика, которую стоит посчитать заранее
Теперь главное — во что пересылка обходится эфиру.
Голосовой пакет MeshTRX — 39 байт. На рабочих параметрах (SF7, полоса 250 кГц, избыточность 4/7) он занимает эфир около 53 миллисекунд. Отправляется такой пакет каждые 80 миллисекунд — этого требует кодек.
Отсюда всё и следует:
| Кто в эфире | Занято канала |
|---|---|
| одна говорящая станция | 67% |
| она же + один ретранслятор | 133% |
| + два ретранслятора | 200% |
| + три ретранслятора | 267% |
Одна станция забирает две трети канала. Один повтор — и передача уже не помещается: на стенде через ретранслятор проходит около половины голосовых пакетов, и это не дефект прошивки, а деление ста тридцати трёх процентов на доступные сто.
Для речи потеря терпима: пропуск в 80 мс слышен как щелчок, а не как дыра в слове. Для файла это было бы катастрофой, поэтому файлы идут с подтверждением и дозапросом потерянных кусков — время растёт, зато доходит всё.
Почему три ретранслятора не собираются в сеть
В сообществе обсуждают треугольник: три ретранслятора на высотках, ребро четыре километра, между ними прямая видимость. Идея правильная — покрытие получается на порядок больше. Но если поставить три ретранслятора в один канал и включить, произойдёт не сеть, а взаимное глушение: 267 процентов в таблице выше.
Память о переданном здесь не поможет. Она убирает дубли, но не создаёт ёмкость: каждый ретранслятор всё равно обязан повторить чужой пакет хотя бы раз, а канал один на всех.
Значит нужно другое, и оно из двух частей.
Зоны. Станция принадлежит своему ретранслятору, и ретранслятор повторяет только своих. Тогда соседний ретранслятор не подхватывает чужой трафик, и лавина исчезает по построению, а не по счастливому стечению обстоятельств. Технически это идентификатор группы в пакете — то же поле, которое понадобится для «свой–чужой» при шифровании.
Магистраль вне общего канала. Зоны без связи между собой — это три независимые сети. Соединить их можно тремя способами, и они сильно разной цены:
- по интернету. Ретранслятор на высотке почти наверняка окажется в сети — и тогда туннель между ретрансляторами не занимает эфир вообще и не имеет ограничений по ёмкости. Самый дешёвый вариант и самый неспортивный: сеть, которая задумывалась как независимая от инфраструктуры, в этом месте на неё опирается;
- вторым радиомодулем. Отдельный приёмопередатчик на другом канале, направленная антенна на соседа. Честный off-grid, но это доработка железа, а не прошивки;
- разделением по времени на одном радио. Ретранслятор часть времени слушает магистральный канал. Для текста, позиций и маяков сгодится; для голоса нет — поток непрерывный, и пропуски в нём складываются в шум.
Первый вариант проверяется за вечер, третий — тоже, второй требует железа. Начинать имеет смысл с того, что можно измерить.
Что из этого следует для практики
Три вывода, которые стоит держать в голове, ставя ретранслятор.
Он увеличивает охват, но не ёмкость. Если в вашей сети и так тесно — голос идёт, файлы ходят, — ретранслятор сделает хуже, а не лучше.
Он полезнее всего там, где иначе связи нет вовсе: на краю слышимости, за домом, в низине. Ровно поэтому его и поднимают на высокую точку — не чтобы усилить, а чтобы увидеть тех, кто друг друга не видит.
И он не бесплатен для тех, кто и так слышит друг друга напрямую: их пакеты он тоже повторит, отняв у канала те самые проценты. Зоны нужны в том числе поэтому.
Как включить ретранслятор и что показывает его страница — в документации. Числа выше получены на стенде из двух плат; замеры в поле, споры о треугольнике и всё остальное — в группе.