QUIC load balancing можно вынести в data plane без хранения состояния. Это снижает latency и устраняет зависимость от middlebox-логики.
Первый узкий момент классического load balancing — поддержание per-connection consistency (PCC). В software-подходе это решается хранением соответствия flow → backend. Но при переносе логики в programmable data plane возникает ограничение: память ограничена, а обработка должна идти на line rate. Как только пул серверов меняется или включается load-aware логика, hash перестаёт гарантировать стабильный mapping, и система начинает терять согласованность. В TCP это усугубляется отсутствием встроенного механизма передачи server identity, что вынуждает либо хранить state, либо модифицировать пакеты.
Решение строится вокруг особенностей QUIC. В отличие от TCP, QUIC допускает смену IP и UDP-порта без разрыва сессии. Это позволяет использовать гибридную модель: только первый пакет обрабатывается балансировщиком, а все последующие идут напрямую к backend. При этом нет необходимости модифицировать Connection ID (CID), что важно для соблюдения спецификации и работы в multi-tenant среде. Компромисс здесь очевиден: мы убираем state и latency, но открываем возможность обхода балансировщика, так как клиент узнаёт реальный адрес сервера.
Реализация опирается на programmable data plane (PISA) и deep packet parsing. Балансировщик принимает только initial QUIC packet, направленный на Virtual IP (VIP), и выбирает backend через ECMP hashing. Далее сервер отвечает напрямую клиенту со своего IP и порта, и клиент продолжает общение без участия балансировщика. Ключевая сложность — отличить первый пакет QUIC-сессии от последующих. В QUIC это неочевидно из-за packet coalescing: несколько заголовков могут находиться в одном UDP datagram. Простая проверка packet type не работает.
Для этого используется lookahead-парсинг в data plane. Система анализирует наличие второго QUIC long header внутри datagram. Первый пакет содержит только один header типа Initial. Последующие могут содержать coalesced headers, включая Handshake. Это позволяет точно определить начало новой сессии. Если initial packet направлен напрямую на backend, минуя VIP, он отбрасывается. Таким образом предотвращается полный bypass load balancer.
Отдельный слой — защита от 0-RTT атак. QUIC позволяет отправлять данные без полного handshake, используя ранее выданный TLS session ticket. Это создаёт вектор атаки: злоумышленник может подменить source IP и инициировать поток ответов на жертву. В предложенной архитектуре защита снова переносится в data plane. Через deep parsing определяется наличие 0-RTT пакетов (по второму заголовку), после чего применяется счётчик с порогом (rate limiting). При превышении threshold пакеты отбрасываются. Важно, что защита работает на уровне сети, а не отдельного сервера.
Результаты показывают два эффекта. Во-первых, без deep parsing нагрузка распределяется неравномерно: часть клиентов обращается напрямую к backend, создавая hotspot. Во-вторых, при включении анализа трафик выравнивается за счёт принудительного прохождения initial packet через балансировщик. Метрики точного прироста не приведены, но показано улучшение распределения нагрузки. Также указано, что deep parsing не даёт измеримого увеличения latency даже в эмулированной среде.
Итоговая архитектура — это компромиссное, но прагматичное решение. Она убирает необходимость хранить состояние в switch и минимизирует участие load balancer в потоке данных. При этом безопасность и корректность достигаются за счёт более сложного анализа пакетов. Подход хорошо ложится на современные cloud-native кластеры и Kubernetes-инфраструктуру, где контроль над data plane становится ключевым инструментом оптимизации.
Источник информации
arXiv — крупнейший открытый репозиторий препринтов (с 1991 года, под эгидой Корнелла), где исследователи оперативно размещают рабочие версии статей; материалы общедоступны, но не проходят полное рецензирование, поэтому результаты следует считать предварительными и, по возможности, сверять с обновленными версиями или рецензируемыми журналами. arxiv.org