Как устроено

Один пакет, четыре перехода

PLY встраивается в систему, а не в приложение. macOS отдаёт целый IP-пакет системному Packet Tunnel, сервер возвращает ответ тем же защищённым трактом.

  1. 01 · Клиент

    Приложение пишет в обычную сеть

    Браузер, терминал, звонок или самописный протокол видят системный интерфейс и работают с ним как всегда. PLY не разбирает содержимое TCP и UDP и не подменяет их семантику, поэтому ломаться на уровне приложения нечему.

  2. 02 · Packet Tunnel

    Система отдаёт сырой IP

    Network System Extension поднимает utun и передаёт целые IP-пакеты в Rust-клиент через локальный мост. Мост пускает только процесс того же пользователя.

  3. 03 · Транспорт

    Планировщик раскладывает пакеты по каналам

    Шифрованные UDP-датаграммы уходят по путям, которые сервер подтвердил пробами. Планировщик решает, какому пути отдать пакет и сколько добавить избыточности. Подтверждения, FEC и контроль перегрузки продолжают работать, когда линия деградирует.

  4. 04 · Выход

    Linux маршрутизирует или делает NAT

    Постоянный TUN на сервере выпускает разрешённый трафик в маршрутизируемую сеть либо через выбранный аплинк с MASQUERADE. Для внешнего мира трафик выходит с адреса сервера, а не с адреса Mac.

Детали тракта

Что происходит с пакетом внутри

  • MTU и фрагментация

    Клиент выставляет явный MTU на utun. Пакеты крупнее транспорт режет сам и собирает на другой стороне, поэтому канал с маленьким MTU не роняет соединение целиком.

  • Шифрование

    Каждая датаграмма уходит зашифрованной. Ключи живут эпохами и меняются на ходу, счётчик nonce в проекте один на всех, а повторную датаграмму приёмник отбрасывает по окну антиповтора.

  • Выбор пути и избыточность

    Важность берётся только из заголовка пакета: DSCP, который уже проставило приложение или маршрутизатор, и роль пакета TCP, ведь потеря чистого подтверждения стоит целого таймаута, а потеря одного сегмента массовой передачи - одного повтора. В нагрузку не смотрит никто. Избыточность считается на каждое сообщение из этой важности, скоров путей и остатка дедлайна.

  • Обратный путь

    Ответ возвращается тем же трактом. Сервер помнит, какому устройству выдан адрес, и не отдаёт чужой ответ по совпадению порта.

Отказ пути

Путь считается живым после проверки выхода

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

  • ACTIVEВыход подтверждён, путь несёт трафик.
  • PROBINGПробы идут, боевой трафик пока не отдаём.
  • MUTEDПуть временно отставлен, проверки продолжаются.
  • DEADПуть снят. Возврат только через новую проверку.