User Tools

Site Tools


provenance:design:ip_classification

This is an old revision of the document!


Provenance: design:ip_classification

Working notes behind ip_classification — every query, its population and its denominator, the report script and its unedited output, the folds and their residue, the quotes that were checked, and what could not be established. Corpus-level caveats that apply to every page on this site are on corpus and are not restated here.

Partly reconstructed. The content page was written on 2026-08-06/07, before this site had a provenance convention. This page was written on 2026-08-12, during the refresh to the extended corpus. Sections marked recorded were produced by the 2026-08-12 run. Sections marked reconstructed were rebuilt from the report script, its output and the page text. The page's long non-corpus half — the geolocation-accuracy literature, the anycast discussion, the vendor comparison, the classify_ips.py script — was written and verified by the original run and is not re-derivable here; it was not re-verified on 2026-08-12.

1. What this page is backing

Item Value
Content page ip_classification
Report script scripts/report_ip_classification.mjs (–wiki emits DokuWiki tables)
Folds scripts/ip_fold.mjs — ordered regex families, each tagged with the question it answers
Supporting script scripts/maxmind_version.mjs — full-text pass, not a schema field
Quote verification scripts/quote_check.mjs –classification ip-address
Data data/extract/run1/extractions.jsonl, 5,859 papers, 7 venues, 2010–2026
Refreshed 2026-08-12

2. Populations and denominators

Recorded.

Tag Definition N
ipClassified ≥1 classification[] tuple with target === “ip-address” 295
crawled crawlConfig !== null OR studyTypes contains automated-web-crawl 1,120
measuredFrom vantage.length > 0 3,908
names MaxMind (either field) folds to the MaxMind family in classification.resourceName where target is an IP, or in vantage.geolocationService 134
names a geolocation-task source ≥1 folded family whose task is geolocation 114

The two fields are different questions and the page keeps them apart. classification.resourceName with target = ip-address is “the paper classified somebody else's address”. vantage.geolocationService is “the paper located its own measurement point”. A paper doing only the second is not in the 295. 69 of the 134 MaxMind papers are of that second kind.

3. Running it

cd /workspace/artifacts/wiki
node scripts/ip_fold.mjs                                  # self-test, prints residue
node scripts/report_ip_classification.mjs                 # every figure
node scripts/report_ip_classification.mjs --wiki
node scripts/maxmind_version.mjs                          # the snapshot-reporting figure
node scripts/quote_check.mjs --classification ip-address --show 94
node scripts/check_page_numbers.mjs \
  pages/design_ip_classification.txt out/new/report_ip_classification.txt \
  '===== Use in Publications =====' '===== What to Report ====='

check_page_numbers.mjs left 11 figures unaccounted, all deliberate and all named here so the next run does not re-investigate them: 100 (“shares exceed 100%”), 26.9 (from maxmind_version.mjs, a different script), 4,322 (the old corpus size, quoted as history), and seven figures quoted from cited papers — 89.4 and 95.8 from Gharaibeh et al., 93 from Urban et al., 4,286 / 72 / 87 / 98.3 from Kumar et al., and 2012 inside the Benson et al. quote.

4. What the refresh changed

Recorded. Old = 4,322-paper corpus. New = 5,859-paper corpus.

Figure Old New
Papers classifying an IP 234 (5.4%) 295 (5.0%)
IMC 109 of 559 (19.5%) 124 of 638 (19.4%)
Other six venues 125 of 3,763 171 of 5,221
Third-party service 101 (43.2%) 124 (42.0%)
Curated database 86 (36.8%) 109 (36.9%)
Heuristic rules 74 (31.6%) 88 (29.8%)
Supervised ML 7 (3.0%) 7 (2.4%)
LLM — (enum never fired) 1 (0.3%)
No validation at all 154 of 234 (65.8%) 196 of 295 (66.4%)
Names a ground-truth source 97 (41.5%) 127 (43.1%)
Home-grown heuristic 83 (35.5%) 104 (35.3%)
MaxMind, in IP-classifying papers 56 (23.9%) 65 (22.0%)
MaxMind, both fields 111 134
MaxMind distinct spellings 41 50
MaxMind exact-string undercount 77% 79%
IPinfo 15 (6.4%) 26 (8.8%)
Other IP blocklists 25 (10.7%) 33 (11.2%)
Names ≥1 geolocation source 92 114
…of which ≥2 12 (13.0%) 14 (12.3%)
MaxMind papers with a date token 26 of 111 (23.4%) 36 of 134 (26.9%)
Crawling papers naming a geo service for their vantage 33 of 859 (3.8%) 45 of 1,120 (4.0%)
measuredFrom papers doing so 157 of 2,909 (5.4%) 194 of 3,908 (5.0%)
Crawling papers geolocating anything 57 of 859 (6.6%) 76 of 1,120 (6.8%)
MaxMind's share of vantage-geolocating papers 88 (56.1%) 108 (55.7%)
Distinct free-text names the fold covers 363 443
Families named by exactly one paper 5 9

Moved by more than a rounding step:

  • IPinfo, 15 → 26 papers (6.4% → 8.8%). The largest proportional move among the named vendors, and the only one that changes the page's story: the geolocation market in this corpus is still a MaxMind monoculture, but IPinfo is now clearly second rather than joint-second with IP2Location.
  • The llm method fires for the first time — once. One paper, GPT-4o. The page says so explicitly, because a reader arriving from website_classification (where LLM classification is a real method) will otherwise assume it has spread here. It has not.
  • MaxMind date-token share, 23.4% → 26.9%, on a base that grew from 111 to 134. It is still an upper bound for the two reasons the page gives.
  • Papers classifying an IP, share of corpus 4.5% → 4.3% and flat into 2025–2026. The old page said the share “has since halved”; the sentence now says “flattened”, because the last two buckets are equal.

5. Folds

5.1 ip_fold.mjs went from zero residue to 18, and back to zero

Recorded. This is the clearest case on the site of a fold ageing silently. On the 4,322-paper corpus ip_fold.mjs had zero unmatched strings, and the page said so. On the 5,859-paper corpus it had 18. Every one was mappable; here is where each went, so the judgement calls are visible rather than buried in a regex:

Residue string Folded to Call
IPGeolocation.io Free geo-lookup APIs obvious
IPtoASN pyasn / iptoasn.com (family renamed) obvious
IANA IPv4 Special-Purpose Address Registry WHOIS / IRR / RIR delegation files registry reference data, same question
SpamCop, SinkDB and MISP Project sinkhole lists, public ASN block lists, BL-A, institutional list by Griffioen et al. Other IP blocklists BL-A is an anonymised list name; institutional list by Griffioen et al. is another paper's published list, and putting it with the blocklists rather than with Home-grown is a judgement call — it is not the citing paper's own list
manual R&E/commodity neighbor classification, I2 PERCEPTION live behavior correlation, ASN matching against b-MNO, v-MNO, and third-party providers, FACT architecture_detection plugin Home-grown heuristic or classifier all four are the paper's own rule
Criminal IP Censys / Shodan / Nmap / Snort / Suricata judgement call. Criminal IP markets itself as threat intelligence, which would put it under Is it known-bad?. It is an attack-surface search engine, which is what that family is. Filed under What is running on it? and flagged here because a reasonable person would file it the other way.
cloud-provider-ip-addresses new family: Cloud/hosting provider published IP ranges the provider's own list, not a third-party score
SPF verification new family: Email authentication (SPF/DMARC) not an IP classifier; the extraction files it here because the unit of analysis is the sending IP
Twilio, OpenCNAM new family: Phone-number reference (not IP-based) one paper whose unit was a phone number; parallels the existing non-IP geocoding reference family
GPT-4o new family: LLM (GPT-4o) kept separate from Home-grown on purpose, so it stays countable as the field's first

A second residue exists in the wider “name universe” section, which folds vantage.geolocationService too. It had 2 strings — Apple's WPS and Nominatim — both added to the Geocoding / positioning reference family. Both residues are now zero and both are printed on every run.

5.2 Two bugs in the report script itself

Recorded. Neither made the script throw; both would have produced a wrong published number.

  1. 234 was hardcoded in four table headings and their share labels. The percentages were computed against the live population, so on the new corpus the table read “Share of 234” above a column of shares out of 295. Replaced with ${ipClassified.length}.
  2. The last period bucket was (y) ⇒ y >= 2022, not 2022–2024. Under a corpus ending in 2024 that is correct; under one ending in 2026 it silently swallowed 2025 and 2026, and reported the 2022–2024 corpus size as 3,140 instead of 1,955. Split into 2022–2024 and a starred 2025–2026. Any figure copied from that row before 2026-08-12 is wrong.

6. Quotes checked

Recorded, 2026-08-12.

$ node scripts/quote_check.mjs --classification ip-address
484 quotes checked: 232 exact, 158 partial (>=60% of 5-word windows),
94 below threshold, 0 with no full text on disk.

94 below threshold is too many to read individually and they were not all read. Six were sampled and checked by hand against paper.cols.txt with whitespace normalised — 2012/IMC/breaking-for-commercials, 2012/USENIX/aurasium, 2014/CCS/autoprobe, 2015/NDSS/mind-your-blocks, 2010/IMC/demystifying-service-discovery, 2013/NDSS/automatically-inferring-the-evolution — and all six are present in the paper. The failure mode is always the column repair, e.g. the MaxMind quote in breaking-for-commercials reads in the source as:

commer- Other apps related to sport, TV/cinema or social networking, such
cial database provided by MaxMind3 that maps an IP address to as Grindr,
instead require network access to perform properly. As the name of the organizat

Open, and stated as such on this page rather than on the content page: the other 88 have not been read. A 19% below-threshold rate is higher than the –tools checks produce (15%), which is what you would expect from classification quotes being longer and more often spliced, but it has not been demonstrated. Reading them is the obvious next piece of work on this page.

Reconstructed: the original run recorded that it re-read “the quotes behind the accuracy figures” against paper.cols.txt, and the workdir README records that eight of twelve quotes checked on this page “failed” verification until whitespace was normalised. Which twelve is not recoverable.

7. External and industry sources

Reconstructed. The non-corpus half of this page — which is most of it — was researched and verified by the original run on 2026-08-06/07 and not re-verified on 2026-08-12. Its “checked 2026-08-xx” dates are accurate as of then. What is recorded:

  • The geolocation-accuracy claims are all cited to papers in bibliography; Gharaibeh et al. and Darwich et al. carry the two figures the page leans on hardest (89.4% best country accuracy; a 34-point city-level spread between two free databases).
  • MaxMind's release cadence is from MaxMind's own documentation, not from a secondary source.
  • vallina2020_misshapes-style problems apply here too: at least one cited paper had to be read from the author's own copy.
  • The workdir README records one methodological trap found on this page specifically: a detection[].prevalence value asserted a city-level result its own evidence.quote only supported at country level. The claim turned out to be true — it is in the paper's abstract — but it was true by luck. The rule that came out of it, and that applies to every page: grep the full text for any prevalence figure you publish, not just the attached quote.

Rejected: not recorded for the original run.

8. What could not be established

  • Whether the 88 unread below-threshold quotes check out. See §6.
  • Free vs paid MaxMind. The fold does not separate GeoLite2 from GeoIP2, and most papers do not say which they used. The page says so. Nothing in the extraction can close this; only reading the 134 papers can.
  • Whether “no validation” is a reporting gap or a real one. 41.0% of the 295 are not-applicable, and looking up an ASN genuinely does not need a test set. The page argues that this is also where unvalidated lookups hide, but the extraction cannot separate the two cases.
  • Venue coverage is worse for this page than for any other on the site. PAM, TMA, ANRW, SIGCOMM and ACM CCR are where much IP-geolocation work appears and none of them is in the corpus. The seven-venue caveat is not a formality here; it is the page's main limitation, and it is stated on the page.
  • Criminal IP's family. See §5.1. One paper, and it could reasonably go under Is it known-bad?.

9. Run log

Date 2026-08-12
Corpus at the time data/extract/run1, 5,859 papers, 2010–2026, IEEE S&P complete at 780/780
Model Claude Opus 5, no sub-agents used for this page
Scope Mechanical re-derivation. Prose, structure and method selection were not revisited; two sentences changed because the numbers no longer supported them (“has since halved” → “flattened”; the addition of the llm sentence).
Script changes ip_fold.mjs (5 new families, 6 extended patterns, §5.1), report_ip_classification.mjs (two bugs fixed, §5.2; new closing section printing the figures the page carried but the script did not), quote_check.mjs (gained –classification)
Caveats deleted “IEEE S&P is only 43% retrieved (paywall)” — 780 of 780 selected papers are now retrieved. “The corpus ends in 2024.”
Mistake caught in review The hardcoded 234 would have shipped a table headed “Share of 234” with shares computed out of 295. It was caught by diffing the report output against the committed one, which is the whole argument for keeping the old output on disk.

← back to the content page · corpus-level provenance

provenance/design/ip_classification.1786526634.txt.gz · Last modified: by karel.kubicek.claude

Except where otherwise noted, content on this wiki is licensed under the following license: CC BY-NC-SA 4.0
CC BY-NC-SA 4.0 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki