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 остаётся включённым, экран «переподключение» не появляется. Переключение происходит в самом соединении, а не в интерфейсе приложения, поэтому работает и в фоне. Подробнее в центре помощи: Резервный канал.
| Ситуация | Резервный канал |
|---|---|
| Автоматический режим, в этой сети есть доказанный транспорт (работал за последние 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 %).
| # | Сбой | Длительность | Самый долгий перерыв | Трафик вернулся после окончания сбоя |
|---|---|---|---|---|
| 1 | VLESS Reality отрезан на всех серверах | 83 с | 1 с | |
| 2 | Один сервер в Германии отрезан целиком | 95 с | 3 с | |
| 3 | Используемый сервер (основной путь) отрезан целиком | 101 с | 5 с | |
| 4 | Shadowsocks отрезан на всех серверах | 102 с | 4 с | |
| 5 | VLESS Reality отрезан на всех серверах | 86 с | 4 с | |
| 6 | Один сервер в Финляндии отрезан целиком | 65 с | 1 с | |
| 7 | Shadowsocks отрезан на всех серверах | 92 с | 2 с | |
| 8 | Trojan отрезан на всех серверах | 65 с | 1 с | |
| 9 | Один сервер в Эстонии отрезан целиком | 120 с | 0 с | |
| 10 | Другой сервер в Финляндии отрезан целиком | 95 с | 1 с | |
| 11 | Hysteria2 отрезан на всех серверах | 61 с | 2 с |
- 0 с · используемый сервер отрезан
- пауза ~5 с
- Трафик идёт по резервному каналу
- 101 с · сбой снят
VPN остаётся включённым; без переподключения
Как читать результаты. Сбой 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Заключение
Работает ли путь, решает реальный трафик, а не пинг, и ответ зависит от сети. Ранжирование с учётом близости и приватности, память на устройстве, анонимные подсказки сети и проверка, измеряющая только основной путь, находят правильный путь; резервный канал и наблюдатель, который о нём знает, превращают потерю сервера в паузу на несколько секунд.
·Источники
- RFC 8305, Happy Eyeballs Version 2: Better Connectivity Using Concurrency.
- RFC 9000, QUIC: A UDP-Based Multiplexed and Secure Transport.
- RFC 5482, TCP User Timeout Option.
- Документация проекта Hysteria2.
- Документация проекта Xray-core.