Inter-satellite links
What you will accomplish
An end-to-end latency for traffic routed through the constellation rather than bounced off a single satellite, and a sweep that shows how much of that answer depends on an assumption the default leaves unstated.
Prerequisites
- The API running, with a constellation registered.
- Two ground stations that a single satellite cannot see at once.
Steps
Route between two stations
curl -s -X POST localhost:8080/isl \
-H 'content-type: application/json' \
-d '{
"constellation_id": "ph1",
"duration_hours": 2,
"step_seconds": 60,
"ground_stations": [
{"id":"nyc","name":"New York","latitude_deg":40.7,"longitude_deg":-74.0,"altitude_km":0.01},
{"id":"ldn","name":"London","latitude_deg":51.5,"longitude_deg":-0.13,"altitude_km":0.02}
],
"latency_pair": ["nyc","ldn"]
}'{
"satellite_count": 60,
"sample_count": 121,
"sample_index": 0,
"edges": [/* 230 feasible crosslinks at this sample */],
"availability": [/* 540 pairs over the window */],
"latency": {
"latency_ms": 32.878924630913104,
"hops": 4,
"route": ["nyc", "ph1-s0-p04-sat03", "ph1-s0-p05-sat02", "ph1-s0-p00-sat03", "ldn"]
},
"latency_unreachable": false
}New York to London in 32.9 ms across three satellites.
Look at what those crosslinks are
230 edges: min 316, median 4175, max 5015 km
edges within 1000 km: 6
edges within 2000 km: 22
edges within 3000 km: 48
edges within 4000 km: 102
edges within 5000 km: 222The default has no range limit
max_range_km is optional, and omitting it means range-unlimited.
Feasibility is then decided only by geometry and the Earth-limb grazing
constraint.
The median crosslink in that mesh is 4175 km and the longest is 5015 km. Those are not modest links. The 32.9 ms figure assumes terminals that can close them.
Nothing in the response flags this. The number is correct for the model and the model contains an assumption nobody stated.
Sweep the constraint
# repeat with "max_range_km": 5000, 4500, 4200, 4000, 3500, 3000max_range_km | Edges | Latency | Hops |
|---|---|---|---|
| unlimited | 230 | 32.88 ms | 4 |
| 5000 | 222 | 32.99 ms | 4 |
| 4500 | 186 | 32.99 ms | 4 |
| 4200 | 118 | 40.43 ms | 5 |
| 4000 | 102 | 40.43 ms | 5 |
| 3500 | 74 | 40.43 ms | 5 |
| 3000 | 48 | unreachable | - |
| 2000 | 22 | unreachable | - |
Three regimes, and the transitions between them are abrupt.
Latency is a step function of the range constraint, and then it stops existing.
From unlimited down to 4500 km the answer barely moves, 32.88 to 32.99 ms. It cannot move smoothly, because latency is dominated by hop count and hops are integers.
Between 4500 and 4200 km the route loses a shortcut and takes 5 hops instead of 4, jumping 23 percent to 40.43 ms.
Between 3500 and 3000 km the mesh stops spanning the Atlantic and the route ceases to exist. Not slower. Absent.
This is why sweeping matters and why a single run reassures you wrongly. Tightening the assumption by 10 percent produced no visible change three times in a row, and then produced total failure.
Reading it as a design result
The honest statement about this constellation is not “New York to London in 32.9 ms”. It is:
A 60-satellite Walker shell at 550 km can route New York to London only with crosslink terminals good for at least about 3500 km. Below that the mesh does not span the ocean. Between 3500 and 4500 km the path costs 5 hops and 40.4 ms. Above 4500 km it costs 4 hops and 33.0 ms.
That sentence is a requirement on the terminal. The original number was a latency figure that quietly contained one.
If the terminals you can actually buy fall below the threshold, no amount of routing cleverness helps. The fix is orbital: more planes, more satellites per plane, or a different altitude. That is a constellation-design decision arriving from a link-hardware constraint, and it is better found now than after the bus is selected.
The other parameters
| Field | Default | Effect |
|---|---|---|
max_range_km | unlimited | Terminal range. The dominant assumption |
min_grazing_altitude_km | see reference | How far a link must clear the limb |
sample_index | 0 | Which instant edges describes |
step_seconds | 60 | Resolution of the availability statistics |
sample_index deserves attention. The edges array is the mesh at one
instant, while availability covers the whole window. A route reported at
sample 0 is not a route that exists continuously, and latency_unreachable is
likewise a statement about the sampled instant rather than a guarantee about the
window.
For a service-level claim, sweep sample_index across the window and report the
worst case, in the same spirit as converging a coverage grid.
What this model does not include
The latency is propagation delay along the routed path. It excludes processing and queueing at each hop, modulation and coding delay, protocol overhead, and any switching or buffering in the payload.
Real per-hop overhead in a regenerative payload is not negligible, and a 5-hop route pays it five times. Treat this figure as a lower bound on end-to-end latency, not an estimate of it.
The same caution appears in the design solver, where the ISL topology option reports an optimistic bound rather than a predicted latency.
Checklist
- Did you set
max_range_kmto something a real terminal achieves? - Did you sweep it, rather than trusting one value?
- Did you check more than one
sample_index? - Are you quoting propagation delay as though it were end-to-end latency?
- Does the route survive at the worst instant, not just the first one?
Next steps
- ISL API reference for the full schema.
- Closing a link for whether the individual hops close at all, which this analysis assumes rather than checks.
main (pre-release)