Differences between revisions 8 and 9
Revision 8 as of 2014-12-02 19:01:02
Size: 16347
Editor: lukisi
Comment:
Revision 9 as of 2014-12-05 08:57:33
Size: 14498
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 77: Line 77:
  * relativamente ad un g-nodo a cui il nodo non appartiene, vale a dire dato un HCoord, tutte le path a disposizione per raggiungerlo, con i relativi costi. La path fornita dal metodo pubblico del modulo non è necessariamente l'oggetto usato internamente. L'interfaccia nota all'esterno del modulo (IQspnPath) consente di:   * dice se il nodo è maturo nella rete.
* relativamente ad un g-nodo a cui il nodo non appartiene, vale a dire dato un HCoord, tutte le path a disposizione per raggiungerlo, con i relativi costi. Se il nodo non è maturo lancia eccezione !QspnNotMatureError. La path fornita dal metodo pubblico del modulo non è necessariamente l'oggetto usato internamente. L'interfaccia nota all'esterno del modulo (IQspnPath) consente di:
Line 84: Line 85:
   * il fingerprint del g-nodo.
   * una stima del numero di nodi al suo interno.
   * il fingerprint del g-nodo. Se il nodo non è maturo lancia eccezione !QspnNotMatureError.
   * una stima del numero di nodi al suo interno. Se il nodo non è maturo lancia eccezione !QspnNotMatureError.
Line 147: Line 148:
Un ETP è un oggetto serializzabile che il modulo Qspn deve poter produrre.

Si vedano le note sulla [[Netsukuku/ita/docs/ModuloQSPN/EsplorazioneRete#LetturaETP|lettura di un ETP]].

Quando un nodo A riceve un ETP da un suo vicino N deve per prima cosa esaminare la lista di hop percorsa dallo stesso ETP. Quindi l'oggetto ETP deve contenere questa lista, e poiché tale lista non deve essere troppo lunga essa deve essere espressa non in termini assoluti di nodi ma in termini di cluster. Inoltre per ridurre ancora lo spazio, poiché come vedremo subito l'oggetto deve contenere l'indirizzo del nodo N che glielo ha passato, possiamo rappresentare i singoli cluster percorsi in forma di coordinate gerarchiche significative per il nodo N. Questo implica che un nodo che inoltra un ETP dovrà cambiare questa lista affinché le coordinate siano sempre significative per il nodo che lo passa.

Quando un nodo A riceve un ETP deve essere in grado di sapere chi lo ha prodotto. Precisamente, deve calcolare quale sia il g-nodo che esso stesso (il nodo A) ha in comune con il nodo che lo ha prodotto (chiamiamolo nodo N) e anche l'identificativo del g-nodo direttamente inferiore. In conclusione deve leggere dall'ETP una istanza di IQspnNaddr da passare al metodo i_qspn_get_coord_by_address del suo indirizzo (IQspnMyNaddr) per avere le coordinate gerarchiche del g-nodo che contiene N. Quindi l'oggetto ETP deve contenere l'indirizzo del nodo N.

Una volta noto il livello di queste coordinate, cioè quello direttamente inferiore al g-nodo comune, A deve poter leggere per quel g-nodo quali siano i valori del fingerprint e del numero di nodi stimato. Quindi l'oggetto ETP deve contenere questi valori per tutti i g-nodi di cui è parte il nodo N che lo ha prodotto.

Infine l'oggetto ETP deve contenere il set di rotte R da comunicare. Ognuna di tali rotte deve a sua volta contenere:

 * Il g-nodo destinazione e la lista di g-nodi hop intermedi, tutti sempre espressi come coordinate gerarchiche significative per il nodo che lo passa.
 * Il numero di nodi stimato e il fingerprint del g-nodo destinazione come riportati da questa path.
 * il costo totale della rotta dal nodo che passa l'ETP fino alla destinazione.
Un ETP è un oggetto serializzabile che il modulo Qspn deve poter produrre. Si veda il relativo [[Netsukuku/ita/docs/ModuloQSPN/StrutturaETP|documento]].

Modulo QSPN - Analisi Funzionale

Il modulo realizza lo scambio di ETP con i vicini del nodo per l'esplorazione della rete (vedi documento esplorazione).

L'obiettivo è di mantenere per ogni destinazione fino a n percorsi disgiunti, che siano i più rapidi (vedi documento rotte disgiunte).

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:

  • livello (level) e identificativo all'interno di quel livello (pos : numero da 0 a gsize(level) - 1). Il modulo qspn lo rappresenta con una istanza dell'oggetto HCoord.
    (Con tali coordinate e l'istanza di IQspnMyNaddr del proprio identificativo (IQspnNodeData) si può ottenere una istanza di IQspnPartialNaddr che rappresenta il g-nodo)

  • tutti i percorsi (paths) che il nodo sa di poter percorrere per raggiungere quel g-nodo.
    La classe Path (nota a questo modulo) contiene queste informazioni:

    • l'arco da usare come primo hop (istanza dell'interfaccia IQspnArc)
    • tutti i successivi hop del percorso in termini di g-nodi che hanno il g-nodo superiore in comune con questo nodo (istanze di HCoord)
    • il costo della path dal primo hop alla destinazione (escluso il costo dell'arco dal nodo al primo hop)
    • il fingerprint del g-nodo come riportato da questa path;
    • il numero di nodi nel g-nodo come riportato da questa path.

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.

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:

  • numero di livelli in cui la rete è suddivisa;
  • per ogni livello l, numero di posizioni in quel livello;

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

  • Identificativo del proprio nodo.
  • Numero massimo di percorsi per destinazione da memorizzare e ratio massimo di disgiunzione.
  • Archi che esistono tra il nodo e i suoi vicini; per ogni arco si conosce l'identificativo del vicino e il costo associato all'arco.
    Viene informato alla costituzione di un nuovo arco; alla rimozione di un arco; al cambio di costo di un arco. Allo stesso tempo questo modulo può segnalare che rimuove un arco perché non funziona, di modo che chi lo aveva fornito (modulo Neighborhood) lo sappia e lo rimuova dalla sua lista; questo lo fa con un segnale.
    Se all'inizio delle operazioni non ci sono archi significa che il nodo sta generando una nuova rete, quindi il modulo si considera da subito maturo. Se invece ci sono degli archi il modulo si considera non maturo e chiede ai vicini di comunicargli le loro mappe con un ETP completo. Se riceve uno o più ETP li elabora e poi si considera maturo. Infine, se all'inizio ci sono degli archi ma nessuna delle richieste di un ETP ritorna con successo allora il modulo emette il segnale 'fallito hook' affinché il nodo consideri fallito l'ingresso nella rete e riprovi da capo.

  • Il suo fingerprint come nodo (istanza di IQspnFingerprint). Fino alla ricezione degli ETP dei vicini il nodo non è 'maturo' e pertanto non produce ETP. Una volta ricevuti gli ETP il nodo è in grado di calcolare il fingerprint di tutti i g-nodi di cui è parte; si tratta di un array di l+1 istanze di IQspnFingerprint. In seguito tale array per intero sarà passato in ogni messaggio ETP in broadcast.

  • Callback per ottenere da un arco l'oggetto per la chiamata di un metodo remoto sul nodo collegato. Gli archi che il modulo riceve sono istanze di IQspnArc ma anche istanze di INeighborhoodArc. Così da poterli usare sui metodi esposti dal modulo Neighborhood attraverso l'interfaccia INeighborhoodArcToStub.
  • Callback per ottenere l'oggetto per l'invio di un messaggio broadcast a tutti i propri vicini (con callback per gli archi in cui il messaggio fallisce)
  • Callback analoga per inviare il messaggio broadcast a tutti i vicini tranne quello collegato ad un dato arco.
  • Callback per ottenere dalla somma dei costi di due path discordi (sul fingerprint del g-nodo) il lasso temporale di tolleranza prima di emettere il segnale di split.

Deliverables

  • Emette un segnale per:
    • fallito hook nella rete.
    • il modulo è ora maturo.
    • rimosso un arco (per segnalare che non funzionava)
    • nuovo g-nodo, rimosso g-nodo.
    • nuova path, path cambiata o path rimossa per un certo g-nodo.
    • rilevamento di un g-nodo splittato.
  • Fornisce on demand:
    • dice se il nodo è maturo nella rete.
    • relativamente ad un g-nodo a cui il nodo non appartiene, vale a dire dato un HCoord, tutte le path a disposizione per raggiungerlo, con i relativi costi. Se il nodo non è maturo lancia eccezione QspnNotMatureError. La path fornita dal metodo pubblico del modulo non è necessariamente l'oggetto usato internamente. L'interfaccia nota all'esterno del modulo (IQspnPath) consente di:

      • leggere la destinazione come IQspnPartialNaddr
      • leggere l'arco come IQspnArc
      • leggere gli hops successivi come IQspnPartialNaddr
      • leggere il costo
      • leggere il numero di nodi
    • relativamente ad uno dei g-nodi a cui appartiene il nodo, vale a dire dato un livello da 0 a l compresi:

      • il fingerprint del g-nodo. Se il nodo non è maturo lancia eccezione QspnNotMatureError.

      • una stima del numero di nodi al suo interno. Se il nodo non è maturo lancia eccezione QspnNotMatureError.

Classi e interfacce

L'identificativo del proprio nodo, come anche l'identificativo di ogni vicino, è un oggetto il cui contenuto non è del tutto noto al modulo qspn. L'interfaccia di questo oggetto nota al modulo (IQspnNodeData) gli consente di:

  • verificare se due identificativi sono identici (metodo 'i_qspn_equals').
  • verificare se due identificativi appartengono alla stessa rete (metodo 'i_qspn_is_on_same_network')
  • leggere il Naddr (Netsukuku address) del nodo (metodo 'i_qspn_get_naddr'); l'oggetto Naddr non è del tutto noto a questo modulo, che ne conosce l'interfaccia IQspnNaddr;
  • leggere il Naddr del nodo come proprio (metodo 'i_qspn_get_naddr_as_mine'); da usare solo sull'identificativo del proprio nodo; ottiene l'interfaccia IQspnMyNaddr;
  • leggere il netid della rete (metodo 'i_qspn_get_netid'); il modulo non conosce del tutto questo oggetto, l'interfaccia che il modulo conosce (IQspnNetworkID) gli consente di:
    • verificare se due netid si riferiscono alla stessa rete (metodo 'i_qspn_is_same_network')
    • ...


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:

  • IQspnNaddr
    • leggere levels e gsize(l) della rete;
    • leggere pos(l) di questo indirizzo;
  • IQspnMyNaddr (che richiede IQspnNaddr)
    • dato un HCoord ottenere il IQspnPartialNaddr (nodo o g-nodo) riferito; il metodo 'i_qspn_get_address_by_coord' restituisce un IQspnPartialNaddr che quindi è anche un IQspnNaddr.
    • dato un IQspnNaddr (nodo o g-nodo) ottenere il HCoord riferito al g-nodo che lo contiene; come effetto collaterale ottengo anche il minimo livello comune; il metodo 'i_qspn_get_coord_by_address' prende come argomento un IQspnNaddr che accetta quindi anche un IQspnPartialNaddr.
  • IQspnPartialNaddr (che richiede IQspnNaddr)
    • leggere il livello del g-nodo; può essere 0 se questa istanza potrebbe rappresentare sia un g-nodo sia un nodo.


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:

  • verificare se due archi sono identici (metodo 'i_qspn_equals');
  • leggere l'identificativo del vicino (metodo 'i_qspn_get_node_data');
  • leggere il costo associato all'arco (metodo 'i_qspn_get_cost').


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:

  • sommare il costo di una path a quello di un arco (metodo 'i_qspn_add_segment');
  • comparare il costo di due path, valutando quale sia il minore (metodo 'i_qspn_compare_to');


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:

  • confrontare due fingerprint per stabilire se sono identici (metodo 'i_qspn_equals').
  • leggere il livello del g-nodo a cui appartiene (proprietà 'i_qspn_level').
  • dati i fingerprint di tutti i g-nodi di livello i-1 contenuti in un g-nodo G di livello i, ottenere l'istanza di fingerprint del g-nodo G (metodo 'i_qspn_construct').


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

Netsukuku/ita/docs/ModuloQSPN/AnalisiFunzionale (last edited 2016-07-28 08:51:31 by lukisi)