APRS Digipeaters
APRS Digipeater Background
APRS was designed as a new way of playing with packet radio. Instead of one to one communications Bob Bruninga created APRS as a one to many protocol. With that concept, new ways of getting the packets out beyond simplex range of the station was required. To fulfill the "Automatic" portion of the acronym, the operation of the station needed to be able to work without user intervention.
With the existing packet network, each station had a unique identifier, be it a callsign, or a unique alias. This wouldn't work for APRS if the station were mobile, and moving about the network. The idea of using a single generic alias that would be implemented in every digipeater solved this issue. If every digipeater responded to WIDE, then a station using an outgoing path of WIDE would get digipeated as it moved between digipeater coverage areas.
This works fine until you use a path with 3 or more of the same alias in a row. Running WIDE,WIDE,WIDE with just 2 digipeaters creates a ping-pong effect, where digi1 acts on the first WIDE, digi2 acts on the second WIDE, and the digi1 acts on the third WIDE. Adding more digipeaters compounds the issue. With just 3 digipeaters that can hear each other, you will end up with 27 digipeats of the packet.
UIFLOOD
In an effort to solve the ping-pong issue Kantronics implemented a routine in the KPC-3 line of TNCs. The algorithm in the KPC-3 was called UIFLOOD. This allows the operator to set up an alias that has a numbered suffix in the format ALIASn-N.
Each time a digipeater acts upon the packet, the 'N' value is decremented until 'N' equals 0. A checksum of the packet callsign and payload is kept by the digipeater to prevent redundant transmission.
The generic alias of WIDE was again used as the base alias for this routine, leading to some confusion when people talk about a digipeater path of WIDE versus WIDEn-N.
UITRACE
UITRACE is a close cousin to UIFLOOD, except that each digipeater that the packet passes through inserts its own callsign into the path portion of the packet, allowing one to observe the path the packet traveled through the digipeater network.
New n-N Paradigm
As APRS developed, a number of changes were made... RELAY, WIDE, and TRACE aliases came and went. New WIDEn-N and TRACEn-N routines were added. Eventually RELAY, WIDE, TRACE, and TRACEn-N were dropped, and the New Paradigm settings were introduced. The alias used became WIDEn-N, or optionally SSn-N (state-based).
APRS Packet Density
In early APRS, long paths were tolerated due to low usage. As APRS popularity grew, reliability decreased. Packet congestion mitigation was attempted using UIDIGI alias traps such as WIDE4-4, WIDE5-5, etc. This allows a single hop and replaces the path with the digipeater callsign.
However, it’s an imperfect solution. Combinations not trapped still go through. A more robust mechanism is needed.
FLOODING and TRAPS
For this discussion, UIFLOOD and UITRACE behave similarly—decrementing 'N'.
Without UIDIGI Traps
Initial | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop |
---|---|---|---|---|---|---|---|
WIDE7-7 | WIDE7-6 | WIDE7-5 | WIDE7-4 | WIDE7-3 | WIDE7-2 | WIDE7-1 | WIDE7* |
WIDE6-6 | WIDE6-5 | WIDE6-4 | WIDE6-3 | WIDE6-2 | WIDE6-1 | WIDE6* | |
WIDE5-5 | WIDE5-4 | WIDE5-3 | WIDE5-2 | WIDE5-1 | WIDE5* | ||
WIDE4-4 | WIDE4-3 | WIDE4-2 | WIDE4-1 | WIDE4* | |||
WIDE3-3 | WIDE3-2 | WIDE3-1 | WIDE3* | ||||
WIDE2-2 | WIDE2-1 | WIDE2* | |||||
WIDE1-1 | WIDE1* |
With UIDIGI Traps (WIDE4-4 and higher)
Initial | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop |
---|---|---|---|---|---|---|---|
WIDE7-7 | DIGINAME* | ||||||
WIDE6-6 | DIGINAME* | ||||||
WIDE5-5 | DIGINAME* | ||||||
WIDE4-4 | DIGINAME* | ||||||
WIDE3-3 | WIDE3-2 | WIDE3-1 | WIDE3* | ||||
WIDE2-2 | WIDE2-1 | WIDE2* | |||||
WIDE1-1 | WIDE1* |
Malformed or Non-Standard n-N
Initial | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop | Next Hop |
---|---|---|---|---|---|---|---|
WIDE7-7 | DIGINAME* | ||||||
WIDE6-7 | WIDE6-6 | DIGINAME* | |||||
WIDE5-7 | WIDE5-6 | WIDE5-5 | DIGINAME* | ||||
WIDE4-7 | WIDE4-6 | WIDE4-5 | WIDE4-4 | DIGINAME* | |||
WIDE3-7 | WIDE3-6 | WIDE3-5 | WIDE3-4 | WIDE3-3 | WIDE3-2 | WIDE3-1 | WIDE3* |
WIDE2-7 | WIDE2-6 | WIDE2-5 | WIDE2-4 | WIDE2-3 | WIDE2-2 | WIDE2-1 | WIDE2* |
WIDE1-7 | WIDE1-6 | WIDE1-5 | WIDE1-4 | WIDE1-3 | WIDE1-2 | WIDE1-1 | WIDE1* |