Как устроено
Один пакет, четыре перехода
PLY встраивается в систему, а не в приложение. macOS отдаёт целый IP-пакет системному Packet Tunnel, сервер возвращает ответ тем же защищённым трактом.
01 · Клиент
Приложение пишет в обычную сеть
Браузер, терминал, звонок или самописный протокол видят системный интерфейс и работают с ним как всегда. PLY не разбирает содержимое TCP и UDP и не подменяет их семантику, поэтому ломаться на уровне приложения нечему.
02 · Packet Tunnel
Система отдаёт сырой IP
Network System Extension поднимает
utunи передаёт целые IP-пакеты в Rust-клиент через локальный мост. Мост пускает только процесс того же пользователя.03 · Транспорт
Планировщик раскладывает пакеты по каналам
Шифрованные UDP-датаграммы уходят по путям, которые сервер подтвердил пробами. Планировщик решает, какому пути отдать пакет и сколько добавить избыточности. Подтверждения, FEC и контроль перегрузки продолжают работать, когда линия деградирует.
04 · Выход
Linux маршрутизирует или делает NAT
Постоянный TUN на сервере выпускает разрешённый трафик в маршрутизируемую сеть либо через выбранный аплинк с
MASQUERADE. Для внешнего мира трафик выходит с адреса сервера, а не с адреса Mac.
Детали тракта
Что происходит с пакетом внутри
MTU и фрагментация
Клиент выставляет явный MTU на
utun. Пакеты крупнее транспорт режет сам и собирает на другой стороне, поэтому канал с маленьким MTU не роняет соединение целиком.Шифрование
Каждая датаграмма уходит зашифрованной. Ключи живут эпохами и меняются на ходу, счётчик nonce в проекте один на всех, а повторную датаграмму приёмник отбрасывает по окну антиповтора.
Выбор пути и избыточность
Важность берётся только из заголовка пакета: DSCP, который уже проставило приложение или маршрутизатор, и роль пакета TCP, ведь потеря чистого подтверждения стоит целого таймаута, а потеря одного сегмента массовой передачи - одного повтора. В нагрузку не смотрит никто. Избыточность считается на каждое сообщение из этой важности, скоров путей и остатка дедлайна.
Обратный путь
Ответ возвращается тем же трактом. Сервер помнит, какому устройству выдан адрес, и не отдаёт чужой ответ по совпадению порта.
Отказ пути
Путь считается живым после проверки выхода
Привязать сокет к адресу мало. Система умеет увести трафик на другой интерфейс, и тогда две строки в интерфейсе окажутся одним физическим каналом, а вся многопутевость - бумажной. PLY шлёт пробы и смотрит, с какого публичного адреса они пришли на сервер. Пока адрес не подтверждён, путь не получает боевой трафик.
- ACTIVEВыход подтверждён, путь несёт трафик.
- PROBINGПробы идут, боевой трафик пока не отдаём.
- MUTEDПуть временно отставлен, проверки продолжаются.
- DEADПуть снят. Возврат только через новую проверку.