Что означает одна строка в наборе данных о VPN и почему это важно
Провайдер, конечная точка, адрес выхода и достижимость — это четыре разные строки. Выберите единицу, сохраняйте происхождение, публикуйте то, что набор не охватывает.
Спросите, что представляет одна строка набора данных о VPN, и ответы множатся: компания, слушатель, публичный адрес выхода, результат достижимости. Каждый законен, а их смешение без пометок даёт сумму, которая звучит точно и не означает ничего. Единица — это проектное решение, и его нужно принять до первого подсчёта. Большая часть путаницы в опубликованной статистике VPN возникает из-за пропуска этого шага.
Строка — это утверждение, а не вещь
Каждая строка утверждает что-то о мире, и у утверждения есть субъект. Именно называние субъекта делает строку сравнимой с другой строкой.
Строка провайдера утверждает, что организация предлагает услугу. Строка конечной точки утверждает, что определённый адрес и порт говорят по протоколу. Строка выхода утверждает, что трафик в какой-то момент покинул адрес. Строка измерения утверждает, что зонд откуда-то наблюдал результат. Четыре субъекта, четыре схемы, и набор данных, который смешивает их без различителя, вообще невозможно агрегировать.
Различитель — самая дешёвая часть схемы и та, которую чаще всего опускают.
Выберите единицу до подсчёта
Выберите единицу, которая отвечает на вопрос, который у вас действительно есть. Подсчёт конечных точек отвечает, сколько слушателей было объявлено; подсчёт провайдеров — сколько организаций участвовало; подсчёт адресов выхода — сколько кажущихся источников существует.
Эти числа не взаимозаменяемы, и различия велики. Один провайдер может держать тысячи адресов, а один адрес может принимать несколько протокольных слушателей для разных услуг. Поэтому число адресов не является ни верхней, ни нижней границей для числа провайдеров. Каждый раз называйте единицу в том же предложении, что и число. Число без единицы — это мнение с десятичной запятой.
| Unit | The row asserts | What a count of it means |
|---|---|---|
| Provider | An organisation offers a service | How many operators appear |
| Endpoint | An address and port speak a protocol | How many listeners were advertised |
| Exit address | Traffic left from an address | How many apparent origins exist |
| Observation | A probe saw a result | How many tests ran, not how many servers |
Публичный каталог даёт объявленных участников в этой услуге. Он не является инвентарём каждого коммерческого, организационного и частного развёртывания в мире, и обращение с ним как с таковым раздувает любую производную статистику.
Происхождение входит в схему
Строку без происхождения нельзя перепроверить. Записывайте исходную запись, время сбора с его часовым поясом, метод наблюдения и статус последнего обнаружения.
Держите объявленные атрибуты отдельно от наблюдаемых, потому что они несут разный вес. Метка страны в каталоге — это объявленное утверждение, а не доказательство физического расположения сервера. Распределение IP определяет блок сети, а не каждого арендатора внутри него и не текущего оператора приложения сверху. Два столбца и примечание каждый раз лучше одного объединённого поля.
{"endpoint": "203.0.113.10:1194/udp", "unit": "endpoint", "advertised_country": "NL",
"observed_at": "2026-11-03T02:15:00Z", "method": "udp_probe", "last_seen": "2026-11-03"}
Одна строка JSON делает схему конкретной, и спорить о ней легче, чем об абзаце описания. Обратите внимание, что отметка времени несёт часовой пояс, а метод назван, а не подразумевается.
Удаляйте дубликаты по вопросу
Дубликаты зависят от единицы. Тот же адрес с двумя протокольными слушателями — это одна пара конечных точек и две услуги, и его тихое слияние меняет подсчёт.
Удаляйте дубликаты на том уровне, о котором спрашивает вопрос, и записывайте, сколько сырых строк слилось в каждую сохранённую строку. Это отношение само по себе является находкой, потому что большое слияние обычно означает, что источник публикует записи по каждому слушателю. Провайдер со множеством адресов даёт обратную картину. Оба варианта верны, и только записанное отношение позволяет читателю их различить.
Затем сохраняйте сырые строки. Таблица без дубликатов — это представление, и возможность заново собрать её из сырого ввода делает результат воспроизводимым.
Опубликуйте заявление об охвате
Укажите, как отбирались источники, какие регионы или сети они охватывают и что намеренно отсутствует.
Частные корпоративные конечные точки и необъявленные развёртывания никогда не появляются в публичных списках, поэтому отсутствие в каталоге доказывает лишь то, что каталог его не указал. Проверьте условия источника и разрешения на перераспространение перед публикацией и уберите поля, которые никогда не были нужны. Исследование конечных точек редко требует личностей абонентов, учётных данных или истории просмотров. Их публикация была бы другим проектом с другим обоснованием.
wc -l vpn-endpoints.jsonl
jq -r '.unit' vpn-endpoints.jsonl | sort | uniq -c
jq -r '.advertised_country' vpn-endpoints.jsonl | sort | uniq -c | sort -rn | head
Эти три команды дают число строк, разбивку по единицам и набросок охвата по объявленной стране. Сохраняйте датированные снимки, когда популяция меняется, и отличайте устаревшее от подтверждённого отсутствия. Ограниченный набор с ясной популяцией лучше неподтверждённого утверждения, что он содержит каждый VPN в интернете.