Nel packet radio amatoriale il protocollo di collegamento AX.25 non contiene alcuna nozione di instradamento fra reti: sa portare un frame fra due stazioni che si sentono in radiofrequenza, e nulla più. Tutto ciò che serve per attraversare una rete di nodi — scegliere il salto successivo, ricostruire un percorso, raggiungere una stazione fuori portata — è stato costruito sopra AX.25 da gruppi diversi, in anni diversi, con assunzioni diverse. Il risultato è che su una stessa frequenza, sullo stesso collegamento radio, viaggiano più protocolli di rete che non si parlano fra loro. Il lavoro vero di un nodo non è offrire un prompt: è terminare e tradurre questi piani di instradamento su una sola macchina.

Cosa fa, e cosa non fa, AX.25

AX.25 è la versione amatoriale di X.25 a livello di linea, derivata da LAPB. La specifica di riferimento è quella curata da TAPR e ARRL; la versione 2.2 è del 1998. Definisce frame, indirizzamento per nominativo radioamatoriale, instaurazione e abbattimento di una connessione, numerazione delle trame e ritrasmissione. Si ferma al livello 2 della pila OSI: collegamento dati e, per la parte fisica, l’aggancio al modem. Non ha indirizzi di rete, non ha tabelle di instradamento, non sa cosa sia un salto intermedio.

Questo basta per una conversazione diretta fra due stazioni in portata radio. Non basta per una rete. Una stazione a cento chilometri, dietro due o tre ripetitori digitali, con AX.25 puro si raggiunge solo concatenando manualmente le connessioni nodo per nodo — il digipeating di prima generazione, fragile e lento. Da qui in avanti comincia la parte interessante, perché il livello di rete che AX.25 non ha è stato aggiunto da fuori, e più di una volta.

Tre livelli di rete incompatibili

Sopra lo stesso AX.25 sono cresciuti tre schemi di instradamento, indipendenti l’uno dall’altro.

  • NET/ROM è il più diffuso. È un livello di rete che usa AX.25 come livello di collegamento e introduce nodi con alias, una tabella di nodi raggiungibili e l’instradamento dinamico: ogni nodo annuncia ai vicini chi sa raggiungere e con quale qualità, e i percorsi si ricostruiscono da soli. È nato come firmware commerciale per controller TNC; in Germania la sua reimplementazione aperta TheNet, e più tardi TheNetNode, ne ha esteso la diffusione.
  • ROSE porta su radio il livello pacchetto di X.25 vero e proprio, con indirizzamento secondo il piano di numerazione X.121. A differenza di NET/ROM non usa instradamento dinamico ma una tabella di commutazione statica: ogni nodo sa, per ciascun indirizzo di destinazione, su quale vicino inoltrare. È l’approccio della rete telefonica a commutazione di pacchetto applicato alla radio.
  • FlexNet, sviluppato dal gruppo di Darmstadt, sceglie l’instradamento automatico con misura continua della qualità dei collegamenti: l’autorouter conosce percorsi alternativi e devia il traffico quando una tratta cade, e i collegamenti sono reversibili per costruzione. È la rete a maglia fitta nata sotto i vincoli regolamentari tedeschi, dove ogni nodo non presidiato richiede autorizzazione e i collegamenti punto-punto sono coordinati a tavolino.

Tre modelli di instradamento — annuncio dinamico, commutazione statica X.25, autorouting con metrica — sullo stesso supporto fisico e sullo stesso livello di collegamento. Una stazione che parla solo NET/ROM non raggiunge una stazione ROSE; una rete FlexNet è un dominio a sé. La frammentazione non è un difetto di implementazione: discende dal fatto che AX.25 ha lasciato vuoto il livello 3, e quel vuoto è stato riempito tre volte.

Dove il nodo diventa difficile

Su Linux questi tre livelli sono famiglie di socket distinte nel kernel: AF_AX25, AF_NETROM, AF_ROSE. Il supporto nativo nasce dal lavoro di Alan Cox e poi di Jonathan Naylor (G4KLX), che ha aggiunto NET/ROM e ROSE alla pila AX.25 del kernel; ROSE deriva dall’implementazione FPAC del francese F6FBB. Ognuna espone un’interfaccia a socket Berkeley separata: per il programmatore sono tre stack diversi che condividono solo il livello 2.

Il punto critico per chi scrive un nodo è proprio questo. Il nodo non si limita a instradare dentro un singolo protocollo: deve fare da terminazione a tutti e da ponte fra loro. Un utente che si connette in AX.25 alla frequenza di accesso deve poter chiedere di proseguire verso una destinazione NET/ROM, oppure entrare in una rete ROSE, oppure agganciare un collegamento FlexNet — e il nodo deve mappare la richiesta sul piano di instradamento giusto, mantenere lo stato delle due connessioni (quella dell’utente in ingresso e quella di rete in uscita) e rilanciare i dati fra le due. Quando i protocolli hanno modelli di indirizzamento diversi — nominativo AX.25, alias NET/ROM, indirizzo X.121 di ROSE — la traduzione non è un dettaglio: è la funzione.

Si aggiunge che AX.25 è orientato alla connessione e con finestra limitata. La versione 2.0 lavora a modulo 8, con al più sette trame non riscontrate in volo; la 2.2 introduce il modulo 128 e la negoziazione di trame fino a dimensioni maggiori. Su un canale radio condiviso, half-duplex, con tempi di andata e ritorno di secondi attraverso più salti, ogni connessione attraversata dal nodo va gestita con i suoi tempi di ritrasmissione e la sua finestra. Un nodo che faccia da ponte fra due connessioni lente deve assorbire questa asimmetria senza far traboccare le code.

Implicazioni progettuali

La prima conseguenza è che un nodo è soprattutto un commutatore multiprotocollo, non un’applicazione interattiva. La parte che si vede — il prompt, l’elenco dei nodi raggiungibili, l’aggancio a una BBS o a un cluster DX — è sottile rispetto alla macchina a stati che tiene aperte le connessioni e instrada fra i tre livelli. Una declinazione concreta di questo è AWZNode, il software node per Linux che ho rilasciato a partire dall’aprile 1998 — il nominativo IZ5AWZ dà il nome al progetto — sopra LinuxNode e FlexNode, e che proprio per questo doveva terminare AX.25, NET/ROM, ROSE e FlexNet e farli convivere su una stessa stazione; il progetto, anteriore alla nascita di noze, è descritto nella scheda che noze ne pubblica: https://www.noze.it/open-source/awznode/.

La seconda conseguenza riguarda la natura aperta del codice. Tutta la pila — protocolli del kernel, strumenti di configurazione, software di nodo — è sotto GNU General Public License versione 2, ed era distribuita sugli archivi FTP dell’epoca, a partire da ftp.funet.fi dell’Università di Helsinki — il principale repository europeo del software open — da cui AWZNode è stato ripreso in distribuzioni Linux come Slackware e Debian. Non è un dettaglio di licenza: in una rete dove un frame attraversa stazioni gestite da persone diverse, con implementazioni diverse dello stesso protocollo, poter leggere il comportamento di ogni livello è l’unico modo per capire dove una connessione si rompe. La negoziazione di finestra fra AX.25 2.0 e 2.2, la conversione fra un indirizzo X.121 e un alias NET/ROM, la metrica di un autorouter FlexNet: sono cose che si verificano sul codice, non sulla documentazione.

Limiti

Tenere insieme tre livelli di rete su un nodo non li unifica. Restano tre domini di instradamento con tre modelli di indirizzamento, e il ponte funziona finché qualcuno gestisce a mano le tabelle di traduzione: una destinazione ROSE va dichiarata, una rotta NET/ROM scaduta va ripulita, un collegamento FlexNet va coordinato con l’altro capo. Non c’è un livello 3 comune che renda la rete amatoriale una sola rete, e la frammentazione che il nodo nasconde all’utente resta sotto la superficie. C’è poi il limite del supporto fisico: canale condiviso, banda stretta, tempi di accesso al mezzo che crescono con il traffico. Un nodo rende raggiungibile una stazione lontana; non rende la rete radio veloce, e su un collegamento mezzo-duplex a poche migliaia di bit al secondo nessuna astrazione di rete può fingere il contrario.


Immagine di copertina: logo del progetto AWZNode (noze).