Files
cable-latency-survey/README.md
T

77 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cable Latency Survey
Measurements, code and data behind four sites:
| Site | Contents | Source |
|---|---|---|
| https://pingstats.aethercosmology.com | Measured round-trip times between cities, compared with the minimum propagation time along submarine-cable routes on a sphere, a North-pole azimuthal equidistant (AE) map, an AE map centred on 0°N 0°E ("dual-pole") and a flat Mercator map | `src/` |
| https://fe-map.aethercosmology.com | The best layout of 219 cities on a plane that a solver can find from timed flights, pings, rail and road lengths and satellite passes, and the same solve released into 3D | `femap/` |
| https://iss.aethercosmology.com | The Sync Test: the ISS at its published-orbit position on the globe and three flat maps, with a spoofed radio signal moving at the speed measured by SatNOGS stations | `satellites/` |
| https://distance.aethercosmology.com | The Shape of Distance: flights, triangles and satellite recordings | `src/handoff/The_Shape_of_Distance_PRESENTATION.html` |
- Code: MIT (`LICENSE`). Measurements and derived data: CC BY 4.0, with third-party terms (`LICENSE-DATA.md`).
- Corrections, new measurements and re-analyses: `CONTRIBUTING.md`. Issues and pull requests: https://git.aethercosmology.com/toby/cable-latency-survey.
## Files
| Path | Contents |
|---|---|
| `cable_latency_survey_data_v2.json` | **Current data hand-off.** 29,341 measurements, 305 sites, every routed path and cable geometry (`[lon, lat]`). The `revision` block lists the changes from v1. |
| `cable_latency_survey_data.json` | v1: the same measurements without coordinates. Kept for reference. |
| `cable_latency_survey_report.html` | The report, identical to the website. |
| `src/` | Pipeline code, raw logs and derived data (below). |
| `femap/` | fe-map: solver (`fit.py`), build (`build.py`, `template.html`), result (`data/femap.json`), page (`site/`). |
| `satellites/` | iss: build (`build.py`, `template.html`), orbital elements and SatNOGS timings (`data/`), page (`site/`). |
| `src/handoff/The_Shape_of_Distance_PRESENTATION.html` | The Shape of Distance as published; the flights, limits and triangles used by `femap/` and the SatNOGS timings used by `satellites/` are read from it. |
| `tests/` | Headless-browser checks of the sites (`tests/run.sh`). |
### Raw measurements
| Source | File |
|---|---|
| Globalping probes, runs 1 and 2 | `src/data/live_20261023T1812Z.json`, `src/data/live_run2.json` (each result with its Globalping measurement ID) |
| Vultr servers (8, 2026-10-23 21:23–22:30 UTC) | `src/data/vps/<server>/ping.log`, `src/data/vps/<server>/mtr.log` (traceroutes) |
| Residential connection, Michigan | `src/data/home/ping.log` (location withheld) |
| RIPE Atlas sea crossings | `src/data/trace.json` (hops, timings, measurement and probe IDs) |
| WonderNetwork, 2020-07-19/20 | per-pair statistics `src/data/wn_clean.json`; archive downloaded by `src/fetch_raw.sh` |
## Pipeline
Run from `src/`. The measurement steps contact external services and are not
needed to rebuild the report.
| Step | Script | Output |
|---|---|---|
| Distance on each model, constants | `models.py` | — |
| Globalping measurements | `measure.py` | `data/live_*.json` |
| Vultr servers: create, measure, collect, delete | `vps.py` | `data/vps/` |
| Vultr logs to measurements | `vps_analyze.py` | `data/vps_cells.json` |
| WonderNetwork archive: statistics, mislocated servers | `analyze_wn.py` | `data/wn_clean.json` |
| Published cable lengths on each model | `cables.py` | `data/cables.json` |
| RIPE Atlas sea crossings | `trace.py` | `data/trace.json` |
| Cable-and-land routing on each model | `network.py` | `data/network.json` |
| Best attainable flat arrangements | `flatfit.py` | `data/flatfit.json` |
| Network attribution from public BGP data | `asmap.py` | `data/asmap.json`, `data/rpki.json` |
| Shape fit without positions | `pingmap.py` | `data/pingmap.json` |
| North-pole AE longitude solver (hand-off only) | `solver.py` | `data/solver.json` |
| Report | `build.py` | `site/index.html`, `web/index.html` |
| Data hand-off | `export.py` | `handoff/cable_latency_survey_data_v2.json` |
## Reproduce
```bash
git clone https://git.aethercosmology.com/toby/cable-latency-survey.git
cd cable-latency-survey/src
pip install -r requirements.txt
./fetch_raw.sh # TeleGeography, WonderNetwork and BGP inputs (not redistributed)
python3 build.py # the report, from the files in data/
python3 flatfit.py # flat arrangements
python3 export.py # the data hand-off
```
`build.py` needs only `data/` and the TeleGeography files; it does not contact
any measurement service. `fetch_raw.sh` reports whether the TeleGeography data
it downloads matches the snapshot used (`src/raw/tg.sha256`).
Browser checks: `cd tests && npm install && CH=/path/to/chromium ./run.sh`.