Stuart Longland
unread,Mar 17, 2026, 8:05:08 AMMar 17Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to emergency_co...@perens.com
So, I've been thinking about this for the past couple of days. The
routing infrastructure is what will make or break this system. This is
long, it's basically a brain dump of ideas that have been kicking around.
Going between nodes that have direct contact with one another is easy.
Going through a central hub is not much more difficult.
The challenge is when two nodes wish to exchange information, but have
no direct path, and no designated central point. They must invoke one
or more intermediate nodes to relay information on their behalf.
Ideally, the system should be able to discover this automatically
without end-user intervention and with optimal efficiency. This implies
a dynamic routing system that can detect new nodes as they appear, and
expire them when they appear to have gone away.
At the same time, it is useful to have a way to "preference" a given
route above others even if the dynamic data may suggest otherwise.
We need to work out how frequent they should make their presence known,
and how long we should wait before we consider them "dead".
There are three types of node we really need to consider:
- Permanent
- Temporary
- Mobile
Permanent nodes are ones that are fixed in a single spot, and will be
there for a long time, typically months or years. Examples would
include repeater sites, radio club houses, home stations. They'll be
installed, and continued to be maintained in that location for the
foreseeable future.
Temporary nodes are ones that will be deployed in a location for any
time period between a few hours up to a week or so. They'll be stood up
in response to some activity, operated for the duration, then torn down
and packed up at the end of the activity. Examples would be a base or
checkpoint station at an emergency communications exercise.
Mobile nodes are practically in constant motion. They might stop for an
hour or two at a location, but then they'll move on, and they may
communicate whilst in motion as well. Examples would be nodes mounted
to vehicles (cars, bicycles, ships…) or satellites.
The nodes may be interconnected by any one of:
- Internet protocol links: WiFi, Cellulcar, Ethernet, or a wide area
network (Internet)
- Radio links: AX.25, D-Star… possibly others too
- Point-to-point Optical
- Sneakernet (dump it on portable mass storage and transport it)
Sneakernet is high-latency, and high-MTU but as Andrew S Tanenbaum
pointed out, can be surprisingly high bandwidth.
Optical links like IR and laser beams can be used for point-to-point
links across a clear channel of high bandwidth -- but may be occluded by
fog and temporary obstructions.
Radio links will fade with band conditions, can be subject to
interference and are inherently broadcast, however are the most
practical means of communication for temporary set-ups or long-distance.
Internet Protocol is useful for linking isolated nodes and clusters over
the Internet, as well as for allowing for example, a mobile node to
collect data from a temporary or fixed node for transportation to a
different part of the network. (A form of drive-by sneakernet.)
These nodes all act as the routing backbone, passing traffic labelled
for specific groups to their destination. Radio in particular, is
inherently a broadcast medium: assuming multiple nodes are in earshot,
it is not possible to communicate with only one of them without the
others necessarily decoding the signal. We can "steer" it through
repeater nodes, but the signal effectively "beams" toward all nodes in a
given direction. This makes multicast communication far more efficient
than unicast.
In that context, it makes less sense to think of addressing in terms of
specific nodes, and instead makes more sense to think of specific
"topics". Here, existing solutions like UUCP fall down: UUCP is a
strictly point-to-point protocol, tailored for dial-up modems and fixed
serial links. While it supports Internet protocol, it exclusively uses
TCP connections, treating the TCP/IP stack like a glorified dial-up modem.
NNCP does better, it has a concept of groups (it calls them "areas").
Both UUCP and NNCP however statically configure routes (and groups in
the case of NNCP).
From the user perspective, a single user may be in possession of a
smartphone or tablet, and/or a laptop. Hypothetically, it may be
desirable that the user can access recent messages from the
smartphone/tablet, but that copies of all messages, both going in and
out, are kept on the laptop which has more mass storage available. This
is a key area where Winlink falls down: a user might have multiple
Winlink stations set up, and their messages get "scattered" between them.
In this story, the user effectively operates one or more "user agents",
these are the leaves on the network. They connect with a nearby node,
and via that node send and receive traffic. The user agents for a given
user effectively form a multicast "group", all agents effectively
listening for messages sent to that group address. The agents need not
be connected to the same node. They register their interest in a given
"group", and they then receive all traffic sent to that group within a
configured "hop limit".
Through the network, the agents synchronise messages: the user may
configure their collection of agents to forward all incoming and
outgoing messages to one or more specific agents of theirs (e.g. a
laptop or two), and only retain messages that are specifically flagged
as "keep" or are newer than some maximum age limit.
This implies a need on radio networks to differentiate between a node
address, and a group address.
AX.25 address fields are 7-bytes, with 6 bytes of "shifted" 7-bit ASCII.
Each character in the call-sign is left-shifted by one. The final
byte stores the SSID, extension bit, reserved bits, and the C/H bit: in
source/destination fields, this is the "command" bit, and in digipeater
fields, this is the "has been repeated" bit. The source and destination
fields each have a C/H bit, and AX.25 uses the following convention for
their usage:
- Source and destination C/H bits match: legacy AX.25 1.0 frame
- Source and destination C/H bits are opposite: AX.25 2.x frame
The actual value of the C/H bit for the "frame" is taken from the
destination field.
The C/H bit is meaningful when in connected mode, but in "unproto" mode
(using UI frames) has no special meaning. Now AX.25 connected mode is
inherently point-to-point, and can only be used to link two AX.25
stations, for multicast activities, we can only rely on UI frames as the
transport medium. Nominally in UI frames, the C/H bit is set to 0: if
we designate UI with C/H=1 as meaning "multicast", then we can
effectively address a multicast "group".
"VK4MSL-3" might be an AX.25 station (in hex: ac 96 68 9a a6 98 60)
implementing a user agent for the operator "VK4MSL"; it would then
listen for the group "VK4MSL" (in hex: ac 96 68 9a a6 98 e0) to receive
message traffic.
The nodes would need to relay an agent's desire to subscribe to a given
group for a given hop radius. This would need to be broadcast in a
manner similar to the APRS WIDEn-N scheme and the subscription would
have an expiry time reflective of the probability of the agent's current
movement velocity. (An agent travelling at speed should subscribe for a
shorter period than one that is stationary.) Subscriptions may also be
cancelled early to free up resources.
Routing needs to be decided fundamentally based on the following criteria:
1. explicit user preference (e.g. a user might choose to route traffic
via a mobile node that is currently stationed near them but will be
travelling to a location in proximity to the target node)
2. measured link quality
3. administrative preference (e.g. "cheaper" or "higher capacity" links
may be preferred over more expensive or constrained links)
Let's start at the bottom:
Administrative preference is used to "fudge" the preference of a given
route above or below others. An example might be a link that, rather
than going over a radio network, instead is routed through a commercial
satellite with timed and billed connections. It may provide a
high-quality link, but you want to avoid using it because it'll get
expensive fast. Alternatively, you might have nodes that have
point-to-point WiFi links that are high-speed and free, using those
frees up narrowband radio links.
Measured link quality uses packet loss statistics to try and gauge the
"quality" of a point-to-point link between two nodes. This is analogous
to Net/ROM's "quality" field, and serves a similar purpose. The concept
being, all other things being equal, we should choose the best quality
link available.
Each node should, keep a tally of the number of packets it has sent, and
the number of those that are re-transmissions. These should be stored
in a rolling series of time buckets, so that the "average packet loss"
over the past N minutes can be computed. Similarly, if it is known how
many packets the remote node received from us; that too can be compared
to our "total" count of packets we actually sent, and used to gauge how
well they are receiving us.
If however, a user decides they know better, we should not stand in
their way (and they may proceed to shoot any one of their toes). An
example might be if a big payload of data is to be delivered to a
far-off node at a checkpoint, and a mobile node is installed on a
vehicle that's presently being loaded up with equipment (or perhaps the
operators' meals) for that same checkpoint, the automatic routing system
won't "know" that mobile node's itinerary will bring it in close
proximity to the target. So we override the automatic route selection,
specify an explicit route via that node, and the message gets delivered
in a timely manner by way of the mobile node.
Another example would be two "sneakernet" linked nodes: link quality
would suggest the link is dead, however the humans know better.
Node discovery implies a periodic "heartbeat" to check liveliness. In
Net/ROM, stations broadcast a "NODES" manifest as a series of UI frames
to that address that effectively described all the network nodes the
sender knew of, and their relative qualities. This was typically sent
hourly (configurable). Each entry in the "NODES" manifest was 21 bytes,
so on big networks, this would generate quite a bit of traffic.
Under some jurisdictions, a station is required to identify themselves
periodically. ACMA rules here in Australia require identification "at
the start of transmission, and every 10 minutes afterwards". A periodic
"heartbeat" packet, with a listing of the most recently heard nodes (and
the tally of received packets from each) could be used by receiving
nodes to not only build up a list of immediate neighbours, but also
measure link quality by comparing the "received" count with their own
total transmit counter. For the sake of brevity, we should limit
ourselves to a single packet each heartbeat.
To find nodes that are a hop or more beyond, we need to engage the
"knowledge" of our neighbours. A "where is" packet, broadcast in a
similar manner to APRS WIDEn-N, could be used to query all nodes within
a given hop radius if they know of a route to a given node. It is
tempting that the response be sent back along that route, but that
assumes bi-directional routes. The response therefore should probably
go via WIDEn-N unless the responding node "knows" a better alternative.
The response should include an expiry time, each node in the route
should have an expiry reflective of the node type (permanent, temporary
or mobile) and the route expiry shall be the minimum of these node
expiry times. Similarly, the link quality shall be the minimum observed
along that route.
This handles currently "online" nodes, with offline nodes disregarded.
For "sneakernet" and offline nodes, the above system would require the
user know of the possibility of a route via a given path, and explicitly
provide the said path. I'm not sure there's a way to automatically
consider such routes.
A lot here assumes AX.25 as the underlying layer, but many of these
concepts will likely translate to other systems. In the case of TCP/IP,
nodes sharing an Ethernet segment or WiFi network could utilise
multicast UDP as the link layer to "discover" each-other, then either
use unicast or ad-hoc multicast to communicate from there. mDNS could
also play a role here.
As for cryptography: some of the routing/identification packets could be
digitally signed, but for actual transfers of payloads between nodes,
the payload itself should be signed as a whole. As the payload passes
between nodes (store-and-forward style), each node can hash the existing
payload, sign the hash, and append that attestation block to the end of
the payload.
Onion routing for privacy is probably not going to work in such a
context as the above assumes it's the "same" payload at each hop, and on
amateur radio is likely undesirable for legal reasons. It also would
mandate a source-routed path, which is the norm for UUCP/NNCP, but not
the approach taken above.
Anyway, that's some ideas that I had. Some of it pie-in-the-sky stuff,
but maybe in amongst it, there's something practical.
Regards,
--
Stuart Longland (aka Redhatter, VK4MSL)
I haven't lost my mind...
...it's backed up on a tape somewhere.
--
Stuart Longland (aka Redhatter, VK4MSL)
I haven't lost my mind...
...it's backed up on a tape somewhere.