demystifying-router-late

Since the last guide on choosing the right role, a new role - ROUTER_LATE - has been added. Что именно делает эта роль, когда её следует использовать и как она вписывается в общую картину работы сети Meshtastic?

Meshtastic имеет большое количество ролей устройств, каждая из которых предназначена для разных целей. Хотя роль CLIENT по умолчанию является хорошей отправной точкой для простых сетей без сложных препятствий, для больших сетей с более сложными задачами маршрутизации важно выбрать правильную роль, чтобы обеспечить устойчивость всей сети, избежать её перегрузки и гарантировать надёжную передачу пакетов туда, куда они должны попасть.

{/ truncate /}

Для чего предназначена ROUTER_LATE?

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

Она предназначена для развёртывания в местах, которые не имеют очень большого радиуса покрытия, типичного для узлов ROUTER. Места, критически важные для надёжного прохождения трафика, но известные тем, что не оптимально расположены для обслуживания всей сети, должны использовать ROUTER_LATE.

Она не предназначена для использования в качестве узла на крыше, чтобы расширить радиус действия устройств внутри вашего дома. Использование её таким образом может быть отлично для вас, но поскольку ROUTER_LATE будет ретранслировать каждый пакет, который услышит, это может значительно увеличить общее использование эфира в вашем районе. Слишком много такого может быстро привести к деградации сети или её полной неработоспособности из-за перегрузки, вызывающей столкновения и потерю пакетов. Пожалуйста, воздержитесь от использования инфраструктурных ролей в местах, где они действительно не оправданы, особенно в сетях, использующих медленную модуляцию (например, LONG_FAST).

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

Время ретрансляции и как работает ROUTER_LATE

Из-за крайне ограниченной пропускной способности сети Meshtastic не использует сложные алгоритмы маршрутизации, полагающиеся на дополнительный обмен сообщениями между узлами. Здесь нет аналогов протоколам вроде OSPF, BGP и т. д. из мира IP-сетей (см. здесь для объяснения причин). Вместо этого Meshtastic использует комбинацию выбора ролей, случайных задержек и времени, основанного на силе сигнала полученного пакета, чтобы обеспечить, что любой данный пакет с большей вероятностью пройдёт по более эффективному пути через сеть, минимизируя ненужные ретрансляции, которые могут добавить перегрузку на единственную частоту, общую для всей сети.

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

Контеншн-окна

В Meshtastic есть три различных «контеншн-окна», в которых может быть отправлен пакет. Эти окна лучше всего рассматривать как временные интервалы после получения пакета. Они не пересекаются.

Window Duration Roles Description
Раннее Очень короткое ROUTER, REPEATER, CLIENT_BASE* Первый временной слот, в котором пакеты могут ретранслироваться. Имеет приоритет над другими ретрансляциями и может заставить неинфраструктурные роли отменить свою ретрансляцию.
Стандартное Обычное Все роли, кроме ранних Второй временной слот, в котором по умолчанию происходят все ретрансляции, если узел не использует специальную роль, заставляющую его использовать другое окно.
Позднее Обычное ROUTER_LATE Финальный временной слот, в котором ROUTER_LATE ретранслирует пакет, если услышит ретрансляцию этого пакета другим узлом раньше.

За исключением ROUTER_LATE все роли выполняют ретрансляцию только в окне, соответствующем их роли. ROUTER_LATE — особый случай: в нормальных обстоятельствах она ведёт себя идентично CLIENT и пытается ретранслировать в стандартном контеншн-окне, используя то же поведение задержек, что и CLIENT. Однако, если она услышит, что другой узел ретранслирует пакет первым (в любом предыдущем окне), то она отложит свою ретрансляцию этого пакета в позднее контеншн-окно. В этом позднем окне она всё равно использует то же поведение задержек, что и CLIENT.

Это обеспечивает то, что ROUTER_LATE вежливо «уступает» другим узлам, тем самым сохраняя нормальное поведение маршрутизации сети. Кроме очевидного большего использования эфира, влияние от развёртывания узла ROUTER_LATE идентично тому, как если бы в этом месте был развёрнут CLIENT.

*CLIENT_BASE будет ретранслировать только в раннем окне, если пакет адресован узлу из избранных или от него. В остальных случаях она ведёт себя как обычный CLIENT и использует стандартное окно.

Случайные задержки и смещение по SNR

В каждом контеншн-окне перед ретрансляцией пакета добавляется случайная задержка. Эта задержка затем корректируется на основе отношения сигнал/шум (SNR) пакета при получении: пакеты с худшим SNR (что обычно соответствует худшему или более дальнему соединению) получают более короткую задержку, а сигналы высокого качества — более длинную задержку.

Цель этого — обеспечить, чтобы при получении пакета несколькими узлами они в основном не пытались передавать одновременно, и чтобы узлы, находящиеся дальше, получали «право первого ретрасля». Хотя SNR не является идеальным индикатором расстояния, он имеет грубую корреляцию и в среднем приведёт к тому, что пакеты будут проходить дальше с каждым прыжком, чем при использовании только случайных задержек.

Отмена ретрансляции / перенос в позднее контеншн-окно

Чтобы избежать перегрузки единственной общей частоты, все роли, кроме ROUTER, REPEATER и ROUTER_LATE (а также CLIENT_BASE, когда пакет адресован узлу из избранных или от него), отменят ретрансляцию и отбросят пакет, если услышат ретрансляцию другого узла.

ROUTER_LATE вместо отмены ретрансляции отложит её в позднее контеншн-окно, если услышит ретрансляцию другого узла.

Когда пакеты отбрасываются

Хотя ROUTER_LATE обычно ретранслирует всё, что услышит, есть некоторые специфические исключения:

  1. Если пакет приходит с лимитом прыжков равным нулю. Такие пакеты считаются достигшими конца пути и не должны передаваться дальше.
  2. Если очередь передачи (TX) заполнена, и приходит другой пакет, который подходит для ретрансляции и имеет более высокий приоритет, чем пакет с наименьшим приоритетом в очереди TX, то пакет с наименьшим приоритетом отбрасывается. Это обычно происходит в загруженных сетях или сетях с более медленной конфигурацией модуляции. ROUTER_LATE особенно подвержена этому, поскольку хранит отложенные пакеты в очереди TX, ожидая возможности передать их в позднем контеншн-окне.

Часто задаваемые вопросы

Почему я не могу использовать это на своей крыше?

Потому что ROUTER_LATE пытается ретранслировать всё, что услышит, она добавляет заметный объём трафика на единственную общую частоту, используемую сетью. Это может вызвать проблемную перегрузку, столкновения и потерю пакетов. Если общий объём трафика станет слишком высоким, это может значительно повлиять на производительность сети, иногда до полной неработоспособности.

Если вы всё равно настаиваете на использовании этой роли в качестве узла на крыше, пожалуйста, внимательно следите за статистикой ChUtil (общее использование эфира) и AirTXUtil (использование эфира только этим узлом) на вашем узле. Если ChUtil превысит 25%, или AirUtilTX выше примерно 7-8%, пожалуйста, прекратите использование этой роли, чтобы сохранить общую функциональность сети.

Обратите внимание, что ROUTER и REPEATER также не подходят для использования на крыше (на самом деле, даже в большей степени, поскольку они имеют приоритет над другими узлами). Эти роли предназначены только для очень хорошо расположенной инфраструктуры.

Почему мой пакет прошёл через обычный CLIENT, а не через узел ROUTER_LATE?

Потому что ROUTER_LATE — «вежливый» ретранслирующий узел, если другой узел CLIENT расположен более выгодно в этот конкретный момент или просто выигрывает в гонке случайных задержек, он может ретранслировать пакет первым. ROUTER_LATE всё равно ретранслирует, но вы можете этого не заметить, поскольку пакет может уже прибыть в назначение по другому пути.

Почему мой пакет прошёл через узел ROUTER или REPEATER, а не через ROUTER_LATE в моём районе?

Узлы ROUTER и REPEATER имеют приоритет над всеми другими ролями для ретрансляции. Если такой узел в зоне действия, пакеты пройдут через него раньше всего остального. Если узлы ROUTER или REPEATER развёрнуты в субоптимальных местах, это может привести к превышению лимита прыжков слишком рано.

Почему я не вижу узел ROUTER_LATE в результате traceroute?

См. два предыдущих ответа.

Почему трафик через узел ROUTER_LATE медленный?

Потому что ROUTER_LATE откладывает ретрансляцию пакетов, если услышит ретрансляцию другого узла первым, это может привести к дополнительным задержкам. Это особенно заметно при более медленных настройках модуляции (например, LONG_FAST), где такие задержки могут стать довольно значительными.

Почему трафик, который должен идти через узел ROUTER_LATE, пропадает?

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

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

Я запускаю ROUTER или REPEATER в субоптимальном месте. Стоит ли мне изменить его на ROUTER_LATE?

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

Мой узел — единственный ROUTER поблизости, но он не на высоте 10 000 футов. Стоит ли мне изменить его на ROUTER_LATE?

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

Пожалуйста, обратите внимание, что узлы ROUTER и REPEATER заставят все роли ретрансляции, кроме ROUTER, REPEATER, ROUTER_LATE и CLIENT_BASE (только для пакетов к/от предпочтительных узлов) в зоне их покрытия отменить свои собственные ретрансляции — поэтому размещайте узлы ROUTER только в местах, которые действительно подходят для такого поведения.

Мой узел в $LOCATION может принимать, но никто не слышит меня при передаче. Стоит ли мне разместить ROUTER_LATE для помощи?

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

Этот сценарий довольно распространён для устройств с повреждённой внутренней антенной (например, T1000-E).

Стоит ли мне установить ROUTER_LATE на свой автомобиль?

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

Если вы всё же разместите ROUTER_LATE на своём автомобиле для такой цели, пожалуйста, помните переключить его обратно на более подходящую роль после завершения временной активности.

Если вы хотите иметь ретранслирующий узел на своём автомобиле специально для обслуживания вашего собственного узла, пока вы находитесь внутри ближайших зданий, пожалуйста, используйте CLIENT (если вы можете принимать, но не передавать) или CLIENT_BASE (если вашему узлу нужна помощь в обоих направлениях).

Поможет ли постоянно установленный ROUTER_LATE на моём автомобиле mesh?

Нет. Пожалуйста, не делайте этого — ROUTER_LATE не предназначен для мобильной роли, и использование его таким образом обычно вызывает больше проблем, чем решает.