Che cosa significa una riga in un set di dati VPN, e perché conta
Provider, endpoint, indirizzo di uscita e raggiungibilità sono quattro righe diverse. Scegli l’unità, conserva la provenienza, pubblica ciò che il set di dati non copre.
Chiedi che cosa rappresenta una riga di un set di dati VPN e le risposte si moltiplicano: un’azienda, un ascoltatore, un indirizzo di uscita pubblico, un risultato di raggiungibilità. Ognuna è legittima, e mescolarle senza etichette produce un totale che suona preciso e non significa nulla. L’unità è una decisione di progetto, e va presa prima del primo conteggio. La maggior parte della confusione nelle statistiche VPN pubblicate nasce dal saltare quel passaggio.
Una riga è un’affermazione, non una cosa
Ogni riga afferma qualcosa sul mondo, e l’affermazione ha un soggetto. È nominare il soggetto che rende la riga confrontabile con un’altra riga.
Una riga di provider afferma che un’organizzazione offre un servizio. Una riga di endpoint afferma che un certo indirizzo e una certa porta parlano un protocollo. Una riga di uscita afferma che il traffico ha lasciato un indirizzo in un dato momento. Una riga di misurazione afferma che una sonda da qualche luogo ha osservato un risultato. Quattro soggetti, quattro schemi, e un set di dati che li mescola senza un discriminante non può essere aggregato affatto.
Il discriminante è la parte più economica dello schema e quella più spesso omessa.
Scegli l’unità prima del conteggio
Scegli l’unità che risponde alla domanda che hai davvero. Contare gli endpoint risponde a quanti ascoltatori sono stati annunciati; contare i provider risponde a quante organizzazioni sono state coinvolte; contare gli indirizzi di uscita risponde a quante origini apparenti esistono.
Quei numeri non sono intercambiabili, e le differenze sono grandi. Un provider può gestire migliaia di indirizzi, e un indirizzo può ospitare diversi ascoltatori di protocollo per servizi diversi. Un conteggio di indirizzi non è quindi né un limite superiore né inferiore per un conteggio di provider. Indica l’unità nella stessa frase del numero, ogni volta. Un numero senza unità è un’opinione con un punto decimale.
| 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 |
Una directory pubblica fornisce i partecipanti annunciati in quel servizio. Non è un inventario di ogni distribuzione commerciale, organizzativa e privata del mondo, e trattarla come tale gonfia ogni statistica derivata.
La provenienza appartiene allo schema
Una riga senza provenienza non può essere ricontrollata. Registra il record di origine, il momento di raccolta con il suo fuso orario, il metodo di osservazione e uno stato di ultima visualizzazione.
Tieni separati gli attributi annunciati da quelli osservati, perché portano un peso diverso. L’etichetta di paese di una directory è un’affermazione annunciata, e non è prova della posizione fisica di un server. Un’assegnazione IP identifica un blocco di rete, non ogni inquilino al suo interno, né l’operatore attuale di un’applicazione sopra. Due colonne e una nota battono un campo unificato ogni volta.
{"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"}
Una sola riga JSON rende concreto lo schema ed è più facile da discutere di un paragrafo di descrizione. Nota che il timestamp porta un fuso orario e che il metodo è nominato anziché implicito.
Deduplica in base alla domanda
I duplicati dipendono dall’unità. Lo stesso indirizzo con due ascoltatori di protocollo è una coppia di endpoint e due servizi, e collassarlo in silenzio cambia il conteggio.
Deduplica al livello di cui parla la domanda, e registra quante righe grezze sono collassate in ogni riga conservata. Quel rapporto è di per sé un risultato, perché un collasso ampio di solito significa che la fonte pubblica record per ascoltatore. Un provider che gestisce molti indirizzi produce lo schema opposto. Entrambi sono corretti, e solo il rapporto registrato permette al lettore di distinguerli.
Poi conserva le righe grezze. Una tabella deduplicata è una vista, e la capacità di ricostruirla dall’input grezzo è ciò che rende il risultato riproducibile.
Pubblica la dichiarazione di copertura
Indica come sono state selezionate le fonti, quali regioni o reti coprono, e che cosa è deliberatamente assente.
Gli endpoint aziendali privati e le distribuzioni non annunciate non compaiono mai negli elenchi pubblici, quindi l’assenza in una directory prova solo che la directory non l’ha elencata. Controlla i termini della fonte e i permessi di ridistribuzione prima di pubblicare, e rimuovi i campi che non sono mai stati necessari. Uno studio sugli endpoint raramente richiede identità degli abbonati, credenziali o cronologie di navigazione. Pubblicarli sarebbe un altro progetto con un’altra giustificazione.
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
Quei tre comandi danno un conteggio di righe, una ripartizione per unità e uno schizzo di copertura per paese annunciato. Conserva istantanee datate quando la popolazione cambia, e distingui l’obsoleto dall’assenza confermata. Un set di dati delimitato con una popolazione chiara batte un’affermazione non supportata di contenere ogni VPN di Internet.