Источники данных
У лаборатории два источника, которые везде показаны раздельно:
- Точки измерения — точки измерения, которые по расписанию проверяют каждый транспорт до каждого публичного сервера Colitu. Каждый результат сохраняется и публикуется отдельно, как был измерен. Это основной источник лаборатории.
- Данные приложений — результаты транспортов, которые приложения Colitu и так передают при подключении. Лаборатория хранит только почасовые счётчики по странам и сетям и публикует их с задержкой и только там, где за ними стоит достаточно устройств (см. Данные приложений). На страницах они помечены «Данные приложений (с задержкой)».
Кроме того, команда может записывать заметки: наблюдения, написанные вручную, которые показываются среди событий с пометкой «Заметка». Заметки никогда не создаются автоматически и не входят ни в какую долю.
Точки измерения
Точка измерения — это программа (labprobe), которая работает на хосте и отправляет отчёты в лабораторию. У каждой точки есть короткое имя, место (страна и город), тип сети — дата-центр, домашняя или мобильная — и оператор хоста. Сегодня каждая точка работает на хосте, которым управляет Colitu; страница точек измерения перечисляет их.
- Список серверов. Точка измерения получает серверы так же, как VPN-приложение: из подписки отдельной учётной записи лаборатории. Поэтому она проверяет то, что предлагают пользователям, с теми же настройками.
- Расписание. Один раунд каждые 20 минут. Результаты, которые не удалось доставить, хранятся на диске и отправляются со следующим отчётом; лаборатория принимает результаты возрастом до 6 часов.
- Сеть. Сеть точки измерения (её ASN и название сети) определяется по адресу, с которого приходят её отчёты. Сам адрес не хранится.
- В сети. Точка измерения считается онлайн, если она отчиталась за последние 90 минут. «Отчётность, 7 дн.» — доля часов за последние 7 дней (или с момента добавления точки), в которые есть хотя бы один сохранённый результат.
Тесты
Раунд состоит из трёх видов тестов. На каждый отведено 12 секунд.
1. Базовые тесты — сеть без VPN
- DNS поверх UDP и DNS поверх TCP: запрос
example.com, отправленный напрямую на публичные резолверы 1.1.1.1 и 8.8.8.8. - HTTPS к трём нейтральным сайтам: wikipedia.org, google.com и cloudflare.com. Ответ со статусом ниже 500 считается успехом.
Если не проходит ни один базовый тест, значит, у самой точки пропало соединение: раунд передаёт базовые результаты и пропускает тесты туннеля, так что сбой на точке не выглядит как отказ VPN-транспортов.
2. Доступность — удаётся ли вообще достучаться до порта сервера?
Обычное TCP-соединение с портом транспорта на сервере, закрываемое сразу. Тест доступности есть только у транспортов на TCP; Hysteria2 и TUIC используют QUIC поверх UDP, у которого нет аналогичного соединения для открытия.
3. Туннель — идёт ли трафик на самом деле?
Точка измерения запускает настоящее ядро клиента для транспорта — Xray для VLESS, Trojan и Shadowsocks, клиент Hysteria для Hysteria2 — с настройками из подписки, ждёт его локальный SOCKS-порт до 5 секунд и запрашивает через него https://www.google.com/generate_204. Каждый запрос использует новое соединение. Ответ со статусом ниже 500 — успех; записывается время от отправки запроса до получения ответа («время до первого ответа»), поэтому оно включает рукопожатие туннеля.
После успешного теста туннеля точка скачивает через туннель файл 2 МБ с speed.cloudflare.com не более 10 секунд и записывает пропускную способность, если пришло не менее 64 КБ. Это грубая оценка, а не тест скорости: на неё влияют канал самой точки, загрузка сервера и маршрут.
Сравнение доступности и туннеля на одном порту — основа метода. Если порт отвечает, а туннель через него не работает, это указывает на инспекцию трафика; если порт не отвечает — на блокировку адреса или на упавший сервер, который тогда видят и остальные точки измерения.
Время
Медианы берутся только по успешным тестам: время туннеля для тестов туннеля, время соединения для тестов доступности и базовых тестов.
Сбои
У неудачного теста один класс сбоя, определяемый по ошибке, которую увидела точка измерения:
| Код | Показано как | Значение |
|---|---|---|
timeout | Таймаут | Нет ответа за отведённое время (12 с на тест). |
reset | Соединение сброшено | Соединение было сброшено дальним концом или чем-то на пути. |
refused | Отклонено | Порт активно отклонил соединение. |
unreachable | Недоступно | Нет маршрута до хоста или сети. |
tls | Ошибка TLS | Рукопожатие TLS или проверка сертификата не удались. |
dns | Сбой DNS | Не удалось разрешить имя. |
eof | Закрыто раньше времени | Соединение было закрыто до получения ответа. |
other | Сбой | Всё остальное, включая ошибку HTTP (статус 500 и выше) через туннель. |
probe_error | Ошибка точки измерения | Проблема на самой точке измерения, например не запустившееся ядро клиента. Не входит ни в одну долю. |
auth | Учётные данные отклонены | Сервер отклонил учётные данные аккаунта лаборатории — проблема с нашей стороны. Не входит ни в одну долю. |
probe_error / auth ничего не говорят о сети, поэтому они сохраняются и публикуются в сырых данных, но исключаются из любой доли, медианы, статуса, события и отпечатка. Все остальные сбои учитываются. Классы сбоев — подсказка, а не диагноз: фильтр может вызвать таймаут или сбросить соединение, и перегруженный сервер тоже.
Доли и статус
Доля успеха — это успешные тесты, делённые на все тесты в выборке (кроме двух классов выше). Если на странице не сказано иное, она считается по всем серверам, а для страны — по всем точкам измерения в ней. Статус переводит долю в пятиступенчатую шкалу:
| Статус | Доля успеха |
|---|---|
| Доступно | 98–100 % |
| Снижено | 90–98 % |
| Ограничено | 50–90 % |
| Сильно ограничено | ниже 50 % |
| Недостаточно данных | менее 6 тестов |
Выборка менее чем из 6 тестов получает статус «Недостаточно данных» независимо от доли. Изменения рядом с долей — в процентных пунктах относительно предыдущего окна той же длины; они показываются, только если в том окне не менее 6 тестов.
Графики группируют тесты в интервалы — 1 час для окон до 48 часов, 2 часа до 8 дней, 6 часов до 31 дня и 1 день дальше — и оставляют разрыв там, где в интервале нет тестов. Разрыв означает «не измерялось», а не «0 %».
События
Каждые 10 минут детектор отдельно рассматривает каждую точку измерения и транспорт, объединяя все серверы. Он сравнивает последние 2 часа с предыдущих 7 дней:
- Нужно не менее 8 тестов за последние 2 часа и 30 за предыдущую неделю; иначе детектор ничего не делает.
- Событие открывается, когда недельная доля была не ниже 60 %, а недавняя ниже не менее чем на 25 процентных пунктов. Это отказ, если недавняя доля 10 % или ниже, иначе снижение качества. Началом считается начало двухчасового окна.
- Пока событие продолжается, оно оценивается по доле до его начала, сохраняет худшее значение и становится отказом, если доля падает до 10 % или ниже.
- Оно закрывается, когда недавняя доля возвращается в пределы 10 процентных пунктов от прежней.
Поскольку серверы объединены, отказ одного сервера обычно составляет слишком малую долю тестов, чтобы открыть событие; этот случай показывают таблицы по местам серверов на страницах протоколов. Событие говорит, что транспорт перестал работать с точки измерения, но не почему: базовые тесты и отпечаток помогают отличить вмешательство от отказа.
Отпечаток сети
Страницы сетей считывают пять видов поведения по результатам сети в выбранном окне. Каждое сравнивает два вида тестов из одной и той же сети, чтобы отказ сервера — при котором не работают оба — не выглядел как вмешательство. Отрицательные разницы считаются нулём.
| Сигнал | Значение | Наблюдается при | Не наблюдается при |
|---|---|---|---|
| Адреса серверов недоступны (блокировка по IP или порту) | Доля сбоев тестов доступности | ≥ 20 % | ≤ 5 % |
| TCP-транспорты не работают, хотя порт отвечает | Доля сбоев туннеля у TCP-транспортов минус доля сбоев их доступности | ≥ 15 п. п. | ≤ 3 п. п. |
| QUIC/UDP-транспорты сбоят чаще, чем TCP | Доля сбоев туннеля у Hysteria2 и TUIC минус доля у TCP-транспортов | ≥ 15 п. п. | ≤ 3 п. п. |
| DNS поверх UDP к публичным резолверам нарушен | Доля сбоев DNS поверх UDP минус DNS поверх TCP, те же резолверы | ≥ 15 п. п. | ≤ 3 п. п. |
| HTTPS к нейтральным сайтам не работает без VPN | Доля сбоев базовых HTTPS-тестов | ≥ 10 % | ≤ 2 % |
За сигналом должно стоять не менее 12 тестов (для разницы — 12 с меньшей стороны); при меньшем числе или при значении между двумя порогами он неопределённым. Пороги намеренно грубые. «Наблюдается» означает, что измерения согласуются с таким поведением, а не что выявлен конкретный фильтр.
Данные приложений
Когда приложение Colitu подключается, оно сообщает сервису, какие транспорты пробовало на каком сервере и шёл ли трафик, — приложения используют это для автоматического переключения транспортов. Когда данные приложений включены, лаборатория превращает эти отчёты в счётчики:
- Адрес. Определяются страна и сеть (ASN) адреса, с которого пришёл отчёт; затем адрес отбрасывается и никогда не сохраняется.
- Счётчики. Лаборатория добавляет отчёт в почасовые счётчики по стране, сети, транспорту и стране сервера: попытки, успехи и сумма времён соединения (на страницах показано среднее).
- Устройства. Чтобы посчитать, сколько разных устройств стоит за ячейкой, идентификатор устройства превращается в псевдоним с помощью HMAC-SHA256 и случайного ключа, созданного на этот день UTC. Сам идентификатор не хранится. При ежедневном подведении итогов псевдонимы подсчитываются и удаляются вместе с ключом дня, поэтому псевдонимы разных дней нельзя связать.
- Порог публикации. День по стране публикуется, только если в этот день данные прислали не менее 5 разных устройств (для страницы сети — не менее 5 в этой сети).
- Эмбарго. Публикуются только дни, закончившиеся не менее 7 дн. назад, поэтому данные приложений никогда не говорят, что работает где-то прямо сейчас. Страницы показывают 30 дней до эмбарго; экспорт полевых данных по дням уходит на срок до года.
- Через туннель. Отчёты, присланные с собственного адреса сервера Colitu, не описывают сеть доступа и игнорируются, как и отчёты о серверах в местах, которых нет на сайте.
- Отказ от учёта. Запрос приложения с заголовком
X-Colitu-Lab: offникогда не учитывается. Переключатель для этого в настройках приложений запланирован.
Смещение выборки. Приложения пробуют следующий транспорт только после неудачи предыдущего, поэтому ранние в очереди транспорты пробуют гораздо чаще, а поздние — в основном в сетях, где предыдущие уже не сработали. Поэтому доли успеха по данным приложений нельзя сравнивать между транспортами так, как доли по точкам измерения; они полезны, чтобы видеть изменения одного транспорта в одной стране во времени.
Охват и смещение
- Точки измерения. Сейчас точек измерения: 22, стран: 17. Все на хостах, которыми управляет Colitu. Соединение из дата-центра фильтруется реже, чем домашнее или мобильное, поэтому такая точка может не заметить вмешательство, нацеленное на потребительские сети. Каждый результат содержит тип сети точки измерения.
- Серверы. Проверяются только публичные серверы Colitu и только те транспорты, которые они предлагают (TUIC сейчас не предлагается). Результат описывает транспорт на этих серверах из данной сети, а не транспорт вообще.
- Одна цель. Тест туннеля запрашивает один небольшой URL. Он показывает, переносит ли туннель трафик, а не то, доступен ли через него каждый сайт, и не является мерой веб-цензуры вообще.
- Страны без точки измерения появляются только через данные приложений, и только когда они включены и превышают пороги.
Конфликт интересов
Colitu управляет и точками измерения, и проверяемыми ими серверами, и предлагает VPN, использующий эти транспорты. Мы говорим об этом прямо, потому что это важно для того, как читать результаты:
- Результаты описывают транспорты на этих серверах из этих сетей. Они — не рейтинг VPN-провайдеров, и никакие другие провайдеры не измеряются.
- Ни один транспорт не получает особого отношения. Каждый транспорт проверяется одинаково, в одном и том же раунде, с теми настройками, которые получают пользователи, и каждый сбой учитывается, кроме двух классов, возникающих по нашей вине (ошибки точек измерения и отказ в учётных данных) — они всё равно публикуются.
- Всё публикуется в сыром виде: каждый результат точек, события, суточные агрегаты и этот метод. Любой может пересчитать каждую цифру на этом сайте по данные и проверить её.
Что публикуется — и что не публикуется никогда
Публикуется: каждый сохранённый результат точки измерения — время, точка, её страна, сеть и тип сети, тест, транспорт, страна сервера, цель базового теста, результат, класс сбоя, времена и скорость загрузки — а также события, суточные агрегаты и счётчики данных приложений, прошедшие пороги.
Не публикуется никогда:
- идентификаторы и адреса серверов (имена, IP-адреса, порты, ключи) — только страна сервера;
- IP-адреса хостов точек измерения;
- IP-адреса или идентификаторы устройств пользователей, которые лаборатория никогда не хранит;
- данные приложений в реальном времени или для любой ячейки ниже порога по устройствам.
Тесты, дошедшие до сервера в месте, которого нет на сайте, вообще не сохраняются — и для точек измерения, и для данных приложений, поэтому они не могут просочиться через экспорт.
Хранение
- Измерения точек и почасовые счётчики данных приложений: 2 года, затем удаляются.
- Суточные псевдонимы устройств и их ключи: удаляются при ежедневном подведении итогов, так что псевдоним существует не дольше примерно суток; отдельная очистка в качестве страховки удаляет любые псевдонимы старше 2 дней.
- IP-адреса и идентификаторы устройств пользователей, а также адреса точек измерения: не хранятся.
Лицензия и ссылки
Данные и графики лицензированы под Creative Commons Attribution 4.0 (CC BY 4.0). Используйте их свободно, в том числе в коммерческих целях, и ссылайтесь как “Colitu Lab, lab.colitu.com”. На страница «Данные и API» есть пример ссылки и запись BibTeX. Названия сетей взяты из DB-IP ASN Lite, также под CC BY 4.0. На карте используется Natural Earth.
Изменения
| Версия | Дата | Изменение |
|---|---|---|
| 1.0 | 6 октября 2026 | Первая опубликованная методика. |
Вопросы и исправления: hello@colitu.com. Действующие сейчас настройки (пороги, эмбарго) есть и в API: overview, поле field.