Технический отчёт · 10 октября 2026 г.

Colitu Adaptive Connect 2.0

Как Colitu находит путь, который действительно работает, и держит второй наготове, пока вы подключены.

Adaptive Connect 2.0 работает во всех приложениях Colitu: Android (включая TV), iOS, Windows и Linux.

Опубликовано
Автор
Colitu
Источники
RFC 8305 · RFC 9000 · RFC 5482
Относится к
Colitu для Android (включая TV), iOS, Windows и Linux

0Аннотация

Некоторые сети блокируют VPN-протоколы; другие позволяют соединению установиться, а через несколько десятков секунд тихо останавливают трафик. В такой сети «отвечает на пинг» и «передаёт трафик» — не одно и то же. Colitu Adaptive Connect 2.0 — набор механизмов, которыми приложения Colitu решают эту проблему: ранжирование серверов с учётом близости и приватности, память по сетям, которая хранится только на устройстве, подсказки сети на основе анонимных счётчиков, проверка при подключении по реальному трафику, переход на другой сервер, резервный канал внутри работающего соединения и наблюдение за каждым транспортом. В часовом тесте с 11 сбоями, внесёнными на стороне серверов, 98,8 % проверок трафика прошли успешно; когда используемый сервер был отрезан на 101 секунду, VPN остался включённым, а пользователь увидел паузу около 5 секунд.

1Проблема и модель сбоев

Первая задача VPN-приложения — добраться до нужного сервера в нужном режиме подключения. Серверы Colitu предлагают пять режимов из четырёх семейств протоколов: Hysteria2 (UDP/QUIC), VLESS Reality, VLESS XHTTP, Trojan и Shadowsocks 2022 (см. раздел о протоколах).

Классический подход сортирует серверы по пингу и выбирает самый быстрый. Но пинг — лишь подсказка: в некоторых сетях сервер отвечает на пинг и всё равно не передаёт трафик. Более сложный случай — тихое замораживание: соединение устанавливается, приложение пишет «Подключено», а через некоторое время трафик останавливается, хотя TCP-соединение выглядит открытым. Для пользователя VPN включён, а интернета нет.

Цель Adaptive Connect 2.0: при подключении найти путь, который действительно работает, во время подключения заметить, что путь сломался, по возможности перевести пользователя на другой путь, не выключая VPN, и делать всё это, не собирая данных о пользователе. Типы сбоев ниже основаны на поведении, замеченном в некоторых сетях и у некоторых мобильных операторов, а не в какой-либо конкретной стране.

СбойЧто происходит в сетиЧто видит пользователь
Блокировка протоколаСоединение по протоколу не устанавливаетсяНе удаётся подключиться
Тихое замораживаниеСоединение устанавливается, через N секунд трафик останавливается, TCP остаётся открытым«Подключено», но страницы не открываются
Блокировка UDPРежимы на основе UDP (Hysteria2) не работают, TCP работаетНе удаётся подключиться в режиме UDP
Отказ сервераСервер недоступен ни по одному протоколуНа этом сервере подключения нет
Смена сетиПереход между Wi-Fi и мобильными данными, пропадание Wi-FiКороткий обрыв; в другой сети другие блокировки

Отсюда три допущения: «работает» — свойство сети, а не сервера; сеть может заморозить сразу все TCP-режимы одного сервера, поэтому другой TCP-режим того же сервера бесполезен как резервный; а у самого устройства может пропасть интернет — тогда ни один режим нельзя винить.

2Устройство

Ранжирование серверов

Выбранная вами локация используется как есть; Colitu никогда сам не меняет ручной выбор. В автоматическом режиме («Самый быстрый сервер») порядок такой:

МестоКритерий
1Сервер, который последним работал в сети, где вы сейчас (запоминается на 24 часа)
2Наименьший измеренный пинг; пинг старше 10 минут или измеренный в другой сети не учитывается
3Серверы в других странах раньше серверов в вашей стране, ближние страны первыми (этот же порядок, пока пинга ещё нет)
4Сервер, не ответивший на пинг, уходит в конец
5Сервер, отказавший в этой сети за последние 30 минут, идёт последним

«Рекомендуемый» в списке серверов всегда показывает сервер, к которому подключится автоматический режим. Приватность: чтобы упорядочить список, панель определяет вашу страну и сеть вашего провайдера только по IP-адресу этого запроса. Ничего не сохраняется. Если запрос идёт через VPN, панель их не знает, и приложение использует последние известные значения.

Память по сетям

«Сеть» — это тип подключения (Wi-Fi, мобильные данные, Ethernet) вместе с сетью вашего провайдера, поэтому домашний Wi-Fi и мобильные данные запоминаются отдельно. Память хранится только на устройстве: последний работавший сервер (24 часа), последний работавший режим для каждого сервера (24 часа), режим, не передававший трафик («отметка зависания», 6 часов), и сервер, на котором всё отказало (30 минут). Старые записи удаляются, хранится не более 200. Поэтому режим, заблокированный в мобильной сети, дома по Wi-Fi всё равно пробуется первым.

Подсказки сети без идентификации

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

  • Подписанный токен сети. Панель выдаёт приложению токен со страной и номером сети (ASN), подписанный HMAC и действительный 48 часов. С ним приложение сообщает результаты по каждому протоколу; IP-адрес запроса для наблюдений никогда не используется (во время подключения это всё равно адрес VPN-сервера).
  • Анонимные почасовые счётчики. Панель хранит только почасовые счётчики по стране, сети и протоколу: успехи, отказы и число разных устройств. Устройства считаются через почасовые псевдонимы с ключом, которые удаляются по окончании часа; счётчики хранятся 7 дней.
  • Пороги. Протокол считается заблокированным в сети, если за 24 часа его пробовали не менее 5 устройств и успехов меньше 20 %; при нехватке данных используется уровень страны (не менее 20 устройств, меньше 10 %). Все предлагаемые протоколы никогда не отмечаются как заблокированные.
  • Использование. Приложение пробует заблокированные протоколы последними, если только протокол не работал на этом устройстве в этой сети за последние 24 часа.

Проверка и проверочный путь

Режим считается рабочим, только когда идёт реальный трафик. Проверка обращается через туннель к распространённым адресам проверки связи (Cloudflare, Google, Microsoft), а не к серверам Colitu, — примерно 4–6 секунд на режим. Прежде чем винить режим, приложение проверяет, есть ли у устройства интернет вообще. Бюджет времени: примерно 8 секунд на режим, примерно 20 секунд на сервер, не более примерно 45 секунд на всё подключение; обычно хватает нескольких секунд.

Проверочный путь. При каждом запуске VPN-ядра закрытый проверочный вход, доступный только с самого устройства (случайный порт и учётные данные), первым правилом направляется прямо в основной путь. Поэтому проверка при подключении измеряет только основной путь: сломанный основной путь не может спрятаться за резервным, и при следующем подключении его избегают.

Переход на другой сервер

В автоматическом режиме, если ни один режим сервера не прошёл проверку, приложение переходит к следующему серверу в списке — не более 3 серверов за подключение — и показывает «Пробуем другой сервер…». Отказавший сервер остаётся в конце списка в этой сети на 30 минут. При включённом kill switch Windows и Linux повторяют попытку дальше по списку, а не на том же сервере. Если на сервере, выбранном вручную, отказали все режимы, в ошибке предлагается «Попробовать самый быстрый сервер» одним нажатием.

Резервный канал

Во время подключения приложение держит наготове второй путь внутри работающего соединения. Трафик идёт через балансировщик: пока основной путь исправен, всё идёт по нему; если он перестал работать, новый трафик сам переходит на резервный. VPN остаётся включённым, экран «переподключение» не появляется. Переключение происходит в самом соединении, а не в интерфейсе приложения, поэтому работает и в фоне. Подробнее в центре помощи: Резервный канал.

Рисунок 1. Основной путь и резервный канал внутри одного соединения. Пока основной путь исправен, балансировщик отправляет трафик по нему, иначе — по резервному.
СитуацияРезервный канал
Автоматический режим, в этой сети есть доказанный транспорт (работал за последние 24 часа на любом сервере)Этот транспорт на следующем сервере в рейтинге
Автоматический режим, доказанного транспорта пока нетДругое семейство на следующем сервере (UDP ↔ TCP)
Сервер выбран вручнуюТот же сервер, другое семейство; зависшие режимы пропускаются, Shadowsocks последним; ваша локация не меняется
Маршрут multihop или сервер с одним режимомРезервного канала нет

Режимы и серверы, отказавшие в этой сети, никогда не становятся резервными. При подключённом резервном канале TCP-пути используют тайм-аут пользователя TCP в 10 секунд (RFC 5482), чтобы мёртвые соединения закрывались, а не зависали. Обнаружение и переключение обычно занимают около 8 секунд на компьютерах и в среднем около 10–13 секунд на телефонах (в худшем случае около 23 секунд). Проверка основного пути стоит примерно 0,3–2 МБ в час на телефонах и 4–7 МБ в час на компьютерах; сам резервный канал подключается, только когда используется. Резервный канал тоже проверяется примерно раз в минуту через собственный проверочный вход; мёртвый резервный канал заменяется только когда туннель простаивает, никогда во время звонка. Резервный канал включён по умолчанию, его можно выключить в Расширенном режиме (Простой и Расширенный режим).

Наблюдение и правило с учётом резервного канала

Во время подключения наблюдается каждый транспорт (Adaptive Connect 1.x наблюдал только Hysteria2): каждые 5 секунд первые 90 секунд, затем каждые 30 секунд. Три неудачи подряд, пока устройство в сети, означают, что основной путь мёртв. При подключённом резервном канале наблюдатель отдельно проверяет только основной путь и обычный путь:

Основной путьОбычный путь (с резервным)Результат
РаботаетРаботаетНичего не происходит
МёртвРаботает: трафик идёт по резервномуПереподключения нет; основной путь отмечается, в следующий раз первыми идут транспорт и сервер резервного канала
МёртвМёртвПереподключение

Телефоны также сами переподключаются после неожиданного обрыва (примерно через 2, 5 и 15 секунд, затем показывается ошибка) и когда сеть возвращается — но никогда после нажатия «Отключить», выхода из аккаунта или когда тариф или устройство приостановлены.

Отметки зависания не могут заблокировать сеть

Ошибочные отметки зависания могли бы оставить сеть без вариантов. Это предотвращают два правила: если отметки оставили бы не больше одного из предлагаемых транспортов, в этом раунде они игнорируются; отметки, полученные в раунде, где всё отказало, действуют только 10 минут. Срок 6 часов применяется, только если после этого другой транспорт передал трафик в той же сети, то есть проблема действительно была в этом режиме.

Параллельное подключение

При подключении два лучших кандидата проверяются одновременно, и побеждает тот, кто первым передаст трафик, — по идее Happy Eyeballs из RFC 8305.

Нагрузка на серверы

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

3Оценка

Методика

ПунктПодробности
УстройствоОдин телефон на Android 11
СетьОдна домашняя сеть Wi-Fi с активной глубокой инспекцией пакетов (DPI)
Даты9–10 октября 2026 года
Внесение сбоевНа сервере, отбрасывая пакеты только этого клиента: один протокол на всех серверах или один сервер целиком
БезопасностьПравила помечаются и снимаются самоудаляющимися таймерами; другие пользователи не затрагиваются
Проверка трафикаHTTP-запрос через туннель каждые 5–10 секунд

Эксперименты на устройстве

Ранжирование. У сервера в собственной стране пользователя был самый низкий пинг (13–15 мс), но он правильно встал после ближнего зарубежного сервера (16–17 мс). В Adaptive Connect 1.x список шёл в порядке базы данных, и «Рекомендуемым» показывался сервер примерно с 222 мс на другом континенте.

Тихое замораживание. В этой сети все TCP-транспорты к одному ближнему серверу (VLESS Reality, VLESS XHTTP, Trojan) замерзали примерно через 30–50 секунд после подключения, а Hysteria2 продолжал работать. Старый наблюдатель, охватывавший только Hysteria2, продолжал показывать «Подключено» без трафика. Новый наблюдатель для всех транспортов заметил замораживание и сменил транспорт примерно за 1,3 секунды.

#КонфигурацияРезультат
1Тот же сервер, резервный Trojan, отрезан Hysteria2Резервный канал передавал трафик на +12 с; затем старый наблюдатель перезапустил соединение и сломал его. Исправлено правилом с учётом резервного канала
2Тот же сервер, после исправленияВ этой сети на этом сервере не выжил ни один TCP-путь; восстановление примерно через 48 с после окончания блокировки, потому что во время неё рабочего пути не было
3Автоматический режим, резервный на следующем сервере как «другое семейство» (Trojan)Trojan тоже замёрз; это привело к правилу доказанного транспорта
4Автоматический режим, доказанный транспорт: Hysteria2 на сервере A, резервный Hysteria2 на сервере B, основной путь отрезан на 120 сОдна неудачная проверка на +5 с, трафик с +10 с до конца, без переподключения, VPN остался включённым. Перерыв ≈ 5–10 с

Часовой тест с внесением сбоев

10 октября 2026 года сборка со всеми механизмами 2.0 работала 60 минут в автоматическом режиме на том же телефоне и в той же сети. Внутренний инструмент «лаборатория сбоев» внёс 11 сбоев на 8 серверах в случайном порядке, с интервалом 2–5 минут и длительностью 60–120 секунд каждый: либо для этого клиента отрезался один протокол на всех серверах, либо один сервер целиком. Каждые 5 секунд через туннель шла HTTP-проверка. 741 из 750 проверок прошли успешно (98,8 %).

#СбойДлительностьСамый долгий перерывТрафик вернулся после окончания сбоя
1VLESS Reality отрезан на всех серверах83 с0 с1 с
2Один сервер в Германии отрезан целиком95 с0 с3 с
3Используемый сервер (основной путь) отрезан целиком101 с5 с5 с
4Shadowsocks отрезан на всех серверах102 с0 с4 с
5VLESS Reality отрезан на всех серверах86 с0 с4 с
6Один сервер в Финляндии отрезан целиком65 с0 с1 с
7Shadowsocks отрезан на всех серверах92 с0 с2 с
8Trojan отрезан на всех серверах65 с0 с1 с
9Один сервер в Эстонии отрезан целиком120 с0 с0 с
10Другой сервер в Финляндии отрезан целиком95 с0 с1 с
11Hysteria2 отрезан на всех серверах61 с40 с2 с
Таблица: 11 сбоев часового теста, в секундах. Полоса показывает самый долгий перерыв.
  1. 0 с · используемый сервер отрезан
  2. пауза ~5 с
  3. Трафик идёт по резервному каналу
  4. 101 с · сбой снят

VPN остаётся включённым; без переподключения

Рисунок 2. Сбой 3: используемый сервер пропал на 101 секунду. Пользователь увидел паузу около 5 секунд, остальное время трафик шёл по резервному каналу.

Как читать результаты. Сбой 3 — ключевой случай: используемый сервер пропал на 101 секунду, пользователь увидел паузу около 5 секунд, а VPN всё время оставался включённым. Сбои на неиспользуемых протоколах и серверах ожидаемо показывают 0 секунд: сбой в другом месте не мешает сессии. В сбое 11 все TCP-протоколы в этой сети уже замораживались DPI, поэтому, когда Hysteria2 был отрезан везде, рабочего протокола не осталось вовсе; трафик вернулся через 2 секунды после окончания сбоя.

4Ограничения

  • Узкая оценка. Одно устройство, одна сеть, один час; сбои вносились на сервере, а не реальным фильтром. Результаты нельзя обобщать на все сети. Переключение между Wi-Fi и мобильными данными и отдельные измерения на устройствах iOS, Windows и Linux ещё впереди.
  • Открытые TCP-потоки. При переходе на резервный канал звонки продолжаются после короткого сбоя, страницы и сообщения переподключаются сами, но большая загрузка, идущая в этот момент, может начаться заново.
  • Смена выходного IP принудительно использует один протокол на одном сервере и выключает резервный канал; в измеренной сети это означало повторяющиеся замораживания.
  • Резервного канала нет у маршрутов multihop и на серверах с одним режимом.
  • Устаревший ключ сети. Пока VPN включён, панель не видит, из какой сети пришёл запрос; приложение использует последнюю известную сеть, пока список не будет снова получен с выключенным VPN.

5Дальнейшая работа: сессионный уровень CSL

Colitu Session Layer (CSL) — черновой сессионный уровень, который планируется поверх резервного канала; сроки и результаты не обещаются. Сегодня резервный канал переводит новые соединения; открытые загрузки по TCP могут оборваться. С CSL приложение откроет одну сессию, которая переживёт смену туннеля под ней. В лабораторном прототипе самая долгая пауза составила 0,08–1,75 секунды, а загрузки продолжались без обрыва. Сессия CSL привязана к одному серверу, поэтому CSL решает проблемы в пределах сервера (смена сети, блокировка протокола, короткий обрыв), а от падения сервера по-прежнему защищает резервный канал; они работают вместе. Функция появится как необязательная «Бесшовная сессия (бета)» в Расширенном режиме.

6Заключение

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

·Источники

  1. RFC 8305, Happy Eyeballs Version 2: Better Connectivity Using Concurrency.
  2. RFC 9000, QUIC: A UDP-Based Multiplexed and Secure Transport.
  3. RFC 5482, TCP User Timeout Option.
  4. Документация проекта Hysteria2.
  5. Документация проекта Xray-core.