Modulo QSPN - Analisi Funzionale

Il modulo realizza lo scambio di ETP con i vicini del nodo per l'esplorazione della rete (vedi documento esplorazione). Il dialogo avviene soltanto fra nodi che hanno già costituito degli archi; il modulo ignora i messaggi ricevuti da un nodo con il quale non è stato costituito un arco. Questo comporta che il dialogo avviene solo fra nodi che appartengono alla stessa rete.

L'obiettivo è di mantenere per ogni destinazione dst fino a n percorsi disgiunti, che siano i più rapidi (vedi documento rotte disgiunte). Inoltre occorre mantenere per ogni destinazione dst e per ogni proprio vicino v, 1 percorso, se esiste, verso dst che non contiene v tra i suoi passaggi.

Struttura gerarchica della rete

La rete è strutturata gerarchicamente in l livelli. Il livello 0 rappresenta il singolo nodo. Nel livello più alto l è presente un solo gruppo che costituisce tutta la rete.

Ogni gruppo di livello i contiene un numero massimo fissato di gruppi di livello i-1.

Il numero massimo di elementi di un gruppo è detto gsize. Ogni livello da 0 a l-1 può avere un valore gsize diverso. Chiamiamo gsize(i) il numero massimo di elementi in un gruppo di livello i+1.

Ogni gruppo di livello i ha un identificativo che lo individua univocamente all'interno del suo gruppo di livello i+1. Tale identificativo è un numero intero da 0 a gsize(i) - 1.

(vedi documento livelli e bits)

Mappa gerarchica della rete

Il modulo genera e mantiene una mappa a topologia gerarchica della rete.

Per ogni livello della rete in tale mappa sono memorizzati tutti i g-nodi di quel livello (e il cui g-nodo di livello direttamente superiore coincide con il nostro) di cui il nodo conosce l'esistenza (e di conseguenza almeno una rotta).

Per ogni g-nodo la mappa mantiene queste informazioni:

Se per un g-nodo vengono rilevate due path che differiscono per il loro fingerprint e se questa situazione si mantiene per un certo lasso di tempo, questo è sintomo dello split del g-nodo in questione. Il modulo lo segnala con un evento.
Il tempo di tolleranza è direttamente proporzionale alla somma dei costi associati alle due path che differiscono. Ma essendo l'oggetto costo non del tutto noto al modulo qspn, viene fornita una callback al modulo per tradurre questo costo somma in un lasso temporale.
Le path che riportano il fingerprint con minore anzianità sono mantenute nella mappa del modulo e trasmesse tramite ETP, ma soltanto quelle con il fingerprint più anziano sono segnalate all'esterno del modulo. Inoltre, per non perdere informazioni cruciali, quando si viene a conoscenza di una path che riporta un fingerprint diverso da tutte le altre path per la stessa destinazione, non si considera la regola del numero massimo di path e delle path disgiunte.

Per un g-nodo G di livello l possono venire rilevate diverse path che differiscono per il "numero di nodi nel g-nodo" e questa situazione si può mantenere stabile. Questo non indica che il g-nodo G sia splittato, infatti le variazioni nel numero di nodi possono venire ignorate se il cambiamento non è massiccio (per evitare eccessivo traffico). In questi casi il nodo prende per buono il numero di nodi come riportato dalla rotta più veloce. Userà questa informazione per calcolare il numero di nodi (stimato) all'interno del suo g-nodo di livello l+1.

Netsukuku Address

Il Netsukuku address è l'indirizzo di una risorsa all'interno della rete, ad esempio un nodo o un g-nodo. Devono essere noti i parametri della topologia gerarchica della rete:

Dati questi parametri, un indirizzo di nodo è composto da un identificativo per ogni livello da levels a 0.
Invece, un indirizzo di g-nodo di livello l è composto da un identificativo per ogni livello da levels a l.

Per convenienza, diciamo che i parametri della topologia fanno parte dell'indirizzo.

Per rappresentare gli indirizzi di nodi e g-nodi definiamo la classe Naddr. Gli indirizzi di g-nodi li chiamiamo PartialNaddr anche se la classe che li istanzia è la stessa.

Un nodo conosce, per requisito, il suo indirizzo e da questo può costruire gli indirizzi che rappresentano ognuno dei g-nodi di cui fa parte.

Un nodo può venire a conoscenza di Naddr e PartialNaddr di qualsiasi punto della topologia, cioè che non hanno necessariamente in comune il livello direttamente superiore con uno dei g-nodi di cui il nodo è membro.

Nel caso però, in cui un Naddr o PartialNaddr abbia il suo livello direttamente superiore in comune con il nodo corrente, tale indirizzo può essere espresso sotto forma di HCoord (coordinate gerarchiche).

Per questo l'interfaccia del proprio indirizzo è distinta dalla interfaccia di un comune Naddr o PartialNaddr, perché solo partendo dal proprio indirizzo per il nodo corrente ha senso fare operazioni che coinvolgano le HCoord.

Requisiti

Deliverables

Classi e interfacce

La classe HCoord è nota a questo modulo. Una sua istanza contiene le coordinate gerarchiche di un g-nodo nella mappa del nodo: livello e identificativo nel livello.

Con tali coordinate e l'istanza di IQspnMyNaddr del proprio nodo si può ottenere una istanza di IQspnPartialNaddr che rappresenta il g-nodo.


In vari casi è necessario rappresentare una serie di hops percorsi da un TP, oppure una rotta nota verso una destinazione. Questa serie di hop la chiamiamo TP-List. Si tratta di una lista di HCoord. Include in testa la coordinata che rappresenta il vicino che usiamo come gateway e in coda la coordinata che rappresenta la destinazione.

Una TP-List è sempre in termini di g-nodi che hanno il g-nodo superiore in comune con questo nodo.

Non viene definita una classe per contenere questa informazione: si usa una lista di HCoord.


L'oggetto che rappresenta le path scritte in un ETP (Npath) non è del tutto noto a questo modulo, che conosce la sua interfaccia IQspnPath. Una istanza di IQspnPath rappresenta una path e contiene i dati che sono scritti in un ETP. L'interfaccia ci consente di leggere:


La classe NodePath è nota a questo modulo. Una sua istanza rappresenta una path da questo nodo alla destinazione comprensiva dell'arco dal nodo al vicino che ha pubblicizzato la destinazione. Contiene:


L'oggetto che rappresenta gli indirizzi (Naddr) non è del tutto noto a questo modulo, che conosce alcune sue interfacce a seconda dell'uso che può farne.

Per il proprio indirizzo il nodo conosce l'interfaccia IQspnMyNaddr, per gli indirizzi di altri nodi conosce l'interfaccia IQspnNaddr, per gli indirizzi di g-nodi conosce l'interfaccia IQspnPartialNaddr.

Questi i metodi delle interfacce note al modulo:


Un arco è un oggetto il cui contenuto non è del tutto noto al modulo qspn. L'interfaccia di questo oggetto nota al modulo (IQspnArc) gli consente di:


Il costo di un arco (come il costo di una path) è un oggetto non del tutto noto a questo modulo. La sua interfaccia nota al modulo (IQspnREM) gli consente di:


Il fingerprint di un g-nodo è un oggetto che il modulo non istanzia da solo; gli viene passato il suo fingerprint di nodo (a livello 0) e il modulo ne conosce l'interfaccia IQspnFingerprint.

Fondamentalmente il fingerprint di nodo (a livello 0) è composto da un identificativo del nodo e da una lista di valori che rappresentano l'anzianità ai vari livelli. L'identificativo è generato dal nodo come random in modo che sia presumibilmente univoco a livello di rete. L'anzianità a livello 0 indica quanto è vecchio il nodo rispetto agli altri nodi del suo stesso g-nodo di livello 1; a livello i indica quanto è vecchio il suo g-nodo di livello i rispetto agli altri g-nodi di livello i del suo stesso g-nodo di livello i+1. Questi valori sono comunicati al nodo dal Coordinator del g-nodo in cui fa hook quando entra nella rete.

Il fingerprint di un g-nodo di livello 1 ha come identificativo l'identificativo del nodo più anziano in esso contenuto e i suoi stessi valori di anzianità dal livello 1 in su (valori che dovrebbero risultare gli stessi per tutti i nodi del g-nodo).

Il fingerprint di un g-nodo di livello i ha come identificativo l'identificativo del g-nodo di livello i-1 più anziano in esso contenuto e i suoi stessi valori di anzianità dal livello i in su (valori che dovrebbero risultare gli stessi per tutti i g-nodi di livello i-1 del g-nodo).

Il fingerprint a livello levels è l'identificativo della rete.

Questo meccanismo di costruzione del fingerprint di un g-nodo a partire da quelli dei g-nodi in esso contenuti (sulla base della conoscenza del nodo corrente) fa in modo che al variare della rete ogni nodo conosca immediatamente come comportarsi davanti a scenari cruciali come lo split di un g-nodo o lo split dell'intera rete in due reti distinte (che dopo devono avere identificativi diversi).

L'interfaccia IQspnFingerprint consente di:


Un ETP è un oggetto serializzabile che il modulo Qspn deve poter produrre. Si veda il relativo documento.