Differences between revisions 4 and 12 (spanning 8 versions)
Revision 4 as of 2014-12-05 08:58:08
Size: 13179
Editor: lukisi
Comment:
Revision 12 as of 2015-04-08 12:38:21
Size: 24501
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
<<TableOfContents(4)>>

== Concetti e termini ==
Questa prima parte non descrive quali messaggi vengano effettivamente passati da un nodo all'altro.

In questa prima parte esaminiamo i concetti generali e introduciamo alcuni termini, per avere una idea di quali considerazioni abbiano portato alla scelta dell'effettiva implementazione che sarà descritta più sotto.
Line 3: Line 10:
Un TP viene avviato da un nodo S, che ci scrive il suo ID e lo invia a tutti i suoi vicini. Un nodo che riceve il TP vi aggiunge il suo ID e poi lo inoltra a tutti i suoi vicini tranne quello da cui lo ha ricevuto.

Un nodo (N) che invia o inoltra un TP lo invia a più di un vicino, quindi invia in effetti un insieme di TP, detto bouquet di N. Il primo di questi TP a raggiungere un altro nodo M contiene la rotta più veloce che può usare M per raggiungere N (e qualsiasi altro nodo attraversato). Un nodo può ricevere più di una volta un TP proveniente da uno stesso flood, ma lo inoltra solo la prima volta. Quindi se un nodo S invia un TP, tutti i nodi scropriranno per ogni loro vicino la rotta migliore verso S.
Un TP ''flood'' viene avviato da un nodo ''s''. Per farlo ''s'' genera un TP, ci scrive il suo ID e lo invia a tutti i suoi vicini. Un nodo ''n'' che riceve il TP vi aggiunge il suo ID, un identificativo univoco dell'arco ''α'' attraverso il quale lo ha ricevuto e il costo dell'arco ''c ( α )'' e poi lo inoltra a tutti i suoi vicini tranne quello da cui lo ha ricevuto.

Quando un nodo invia un TP (questo vale sia per il nodo ''s'' che inizia il flood sia per il generico nodo ''n'' che lo inoltra) lo invia a più di un vicino, quindi invia in effetti un insieme di TP. Quando questi TP raggiungono un altro nodo ''v'' possono quindi aver compiuto percorsi diversi; grazie al loro contenuto il nodo ''v'' sa valutare per ogni percorso il suo costo, sommando i costi di ogni singolo arco attraversato.

Un nodo ''v'' può ricevere più di una volta un TP proveniente da uno stesso flood, ma lo inoltra solo se il percorso contenuto risulta essere il percorso con costo minore da ''v'' ad ''s''. Quindi se un nodo ''s'' inizia un TP flood, tutti i nodi scropriranno per ogni loro vicino il percorso migliore verso ''s''.
Line 8: Line 17:
Un ATP è un TP che, quando un nodo lo riceve lo inoltra a tutti i suoi vicini tranne quello da cui lo riceve, anche se il flood era già passato da lì. Un ATP non viene inoltrato da un nodo N se l'ID di N era già presente in esso. Questo lo rende aciclico. Quindi se un nodo S invia un ATP tutti i nodi scopriranno tutte le possibili rotte verso S, senza rotte in loop. Un ATP è un TP che, quando un nodo lo riceve lo inoltra a tutti i suoi vicini tranne quello da cui lo riceve, anche se il flood era già passato da lì. Un ATP non viene inoltrato da un nodo ''n'' se l'ID di ''n'' era già presente in esso. Questo lo rende aciclico. Quindi se un nodo ''s'' inizia un ATP flood tutti i nodi scopriranno tutti i possibili percorsi verso ''s'', senza cicli.
Line 11: Line 20:
Un CTP è un TP che, quando un nodo lo riceve lo inoltra sempre a tutti i suoi vicini tranne quello da cui lo riceve. Inoltre, se il nodo ricevente ha come unico vicino quello che glielo ha inoltrato allora svuota la lista di hops e lo inoltra di nuovo al nodo che glielo aveva inoltrato. Quindi un CTP non cessa mai di esplorare tutte le rotte della rete.

==== Information rule ====
La regola dell'informazione interessante può essere aggiunta alla decisione sull'inoltro di un generico TP (TP o ATP o CTP). Questa regola dice che un TP non va inoltrato se non contiene nessuna informazione interessante per il nodo. Ad esempio nel caso di rotte se tutte le rotte in esso presenti erano già note al nodo.

'''Nota''': una rotta verso una destinazione D che riporta un fingerprint F(D) diverso da quello che conoscevo è sempre una informazione interessante.
Un CTP è un TP che, quando un nodo lo riceve lo inoltra sempre a tutti i suoi vicini tranne quello da cui lo riceve. Inoltre, se il nodo ricevente ha come unico vicino quello che glielo ha inoltrato allora svuota la lista di ID e lo inoltra di nuovo al nodo che glielo aveva inoltrato. Quindi un CTP non cessa mai di esplorare tutti i percorsi della rete.

==== Interesting information rule ====
La regola dell'informazione interessante può essere aggiunta alla decisione sull'inoltro di un generico TP (TP o ATP o CTP). Questa regola dice che un TP non va inoltrato se non contiene nessuna informazione interessante per il nodo. Ad esempio nel caso di percorsi se tutti i percorsi in esso presenti erano già noti al nodo.
Line 19: Line 26:
Un ETP è un ATP che contiene una porzione di mappa (un set di rotte). Ad esso si associa la regola dell'informazione interessante, considerando tutte le rotte contenute come parte dell'informazione. Quindi un nodo che riceve l'ETP lo inoltra (a tutti i vicini tranne il mittente) se l'ETP non ha fatto già un ciclo (non c'è già il suo ID) AND le rotte contenute (la porzione di mappa nell'ETP) apportano qualche aggiornamento alla mappa del nodo.

== Esplorazione ==
Ci proponiamo ora di esaminare come si realizza l'esplorazione di una rete dinamica, ossia in un grafo che cambia nel tempo in termini di vertici o di archi o di costo degli archi.

Una rete è stabile se tutti i nodi hanno tutte le conoscenze di loro pertinenza. Lasciamo indefinito questo concetto di informazioni di pertinenza del nodo, facciamo qualche esempio di cosa può significare: conoscere tutte le rotte verso tutte le destinazioni; oppure tutte le migliori rotte per ogni gateway; oppure le migliori ''n'' rotte disgiunte.

Una rete inizia come singolo nodo. Quando inizia è quindi stabile e il nodo si considera maturo (vedi sotto).

Sia G una rete stabile. Consideriamo tutti i possibili eventi che cambiano il grafo e quindi rendono la rete non più stabile. Vediamo quali operazioni sono necessarie a farla ridiventare stabile.
Un ETP è un ATP che contiene una porzione di una mappa, cioè un set ''P'' di percorsi. Ad esso si associa la regola dell'informazione interessante, considerando tutti i percorsi contenuti come parte dell'informazione. Quindi un nodo ''n'' che riceve l'ETP lo inoltra (a tutti i vicini tranne il mittente) se l'ETP non ha fatto già un ciclo (non c'è già l'ID di ''n'') AND i percorsi contenuti in ''P'' hanno apportato qualche aggiornamento alla mappa di ''n''.

== Implementazione dell'esplorazione ==
Si descrive ora come viene implementata l'esplorazione di una rete. Affrontiamo subito il problema della dinamicità della rete, cioè operiamo in un grafo che cambia nel tempo in termini di vertici o di archi o di costo degli archi. Si noti invece che in questo capitolo non introduciamo subito l'aspetto della struttura gerarchica che viene imposta sugli indirizzi della rete per ridurre la quantità di informazioni memorizzate in ogni singolo nodo. Le implicazioni di questa strutturazione verranno descritte nel capitolo successivo.

=== Rete completamente esplorata ===
Una rete si dice ''completamente esplorata'', per brevità diciamo ''esplorata'', se tutti i nodi hanno tutte le conoscenze di loro pertinenza. L'obiettivo che ci siamo prefissati è descritto nel dettaglio nel documento di analisi funzionale: in sintesi, ogni nodo deve avere per ogni destinazione un numero di percorsi rapidi e tra loro disgiunti. I dettagli sulle informazioni per ogni percorso verranno man mano esplicitati in questo documento. In seguito nel documento indicheremo questo insieme di conoscenze di un nodo con il termine ''mappa'' di ''n''.

Una rete inizia come singolo nodo. Quando inizia è quindi ''esplorata'' e il nodo si considera ''maturo'' (questa definizione verrà chiarificata sotto).

Sia G una rete ''esplorata''. Consideriamo tutti i possibili eventi che cambiano il grafo e quindi rendono la rete non più ''esplorata''. Vediamo quali operazioni sono necessarie a farla ridiventare ''esplorata''.
Line 32: Line 40:
'''''Evento added-link''''': Sia il nodo A ∈ G. A rileva la nascita di un nuovo arco con un vicino B ∈ G.

Il nodo A chiede a B un nuovo ETP completo (vedi sotto). La richiesta può venire rifiutata perché B non è ancora maturo; in questo caso A aspetta un po' e riprova. Con le informazioni in questo ETP il nodo A aggiorna la sua mappa. A prepara tutte le rotte della sua mappa che hanno subito una variazione e le mette in un set R. Mette R e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini tranne B. Poi A prepara un nuovo ETP completo e lo invia a B.

'''''Evento changed-link''''': Sia il nodo A ∈ G con un arco verso B. A rileva che l'arco verso B cambia il suo costo.

Il nodo A chiede a tutti i suoi vicini un nuovo ETP completo. Con la somma delle informazioni da tutti questi ETP e i costi dei link ai suoi vicini (di cui uno è cambiato), il nodo A aggiorna la sua mappa. A prepara il set R con tutte le rotte della sua mappa che hanno subito una variazione. Mette R e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini.

'''''Evento removed-link''''': Sia il nodo A ∈ G con un arco verso B. A rileva che l'arco viene rimosso.

A si comporta come per il caso di cambio di costo dell'arco.

'''''Evento hooked''''': Sia A un nodo appena entrato nella rete G grazie ad un set di archi verso nodi vicini.

Il nodo A si considera non maturo. In questo stato se A riceve la notifica di eventi — di modifica dei suoi archi e/o ricezione di ETP — li accoda per processarli in seguito. Inoltre se riceve la richiesta di produrre un ETP la rifiuta "perché non maturo".

A chiede a tutti i suoi vicini un nuovo ETP completo. Se un vicino rifiuta perché non è ancora maturo, A lo rimuove dai suoi archi così da interrogarlo nuovamente dopo. Può succedere come caso estremo che A rimuove così tutti i suoi archi: in questo caso non è entrato in G; riproverà più tardi.

Con la somma delle informazioni da tutti gli ETP ricevuti, il nodo A aggiorna la sua mappa. Poi A prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini.

Da questo momento A è maturo. A processa gli eventi accodati.

'''''Evento requested-etp''''': Quando un nodo A riceve da un vicino B la richiesta di un nuovo ETP completo.

A considera B come il g-nodo di più alto livello a cui appartiene il nodo B ma non appartiene il nodo A.

A prepara in R tutte le rotte della sua mappa che non contengono B, né come gateway né come hop né come destinazione. A mette in un ETP R e il suo ID e lo invia solo a B.
'''''Evento hooked''''': Sia ''n'' un nodo appena entrato nella rete G grazie ad un set di archi verso nodi vicini.

Il nodo ''n'' si considera ''non maturo''. In questo stato se ''n'' riceve la notifica di eventi — di modifica dei suoi archi e/o ricezione di ETP — li accoda per processarli in seguito. Inoltre se riceve la richiesta di produrre un ETP la rifiuta "perché non maturo".

''n'' chiede a tutti i suoi vicini un nuovo ETP completo; vedremo fra poco come viene preparato un ETP completo. Se un vicino ''v'' rifiuta perché non è ancora maturo, ''n'' lo ignora, confidando che sarà lo stesso nodo ''v'', una volta divenuto maturo, ad iniziare un flood di ETP verso ognuno dei suoi vicini. Può succedere come caso estremo che ''n'' non riceve nessun ETP: in questo caso ''n'' non è entrato in G; la procedura di hook nella rete è da considerarsi fallita e occorrerà riprovare da capo.

Con la somma delle informazioni da tutti gli ETP ricevuti, il nodo ''n'' aggiorna la sua mappa.

Da questo momento ''n'' è ''maturo''. Il nodo ''n'' prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini. ''n'' processa gli eventi accodati.

'''''Evento added-link''''': Sia il nodo ''n'' ∈ G. ''n'' rileva la nascita di un nuovo arco con un vicino ''v'' ∈ G.

Il nodo ''n'' chiede a ''v'' un nuovo ETP completo.

La richiesta di un ETP potrebbe venire rifiutata da ''v'' perché non è ancora maturo. In questo caso ''n'' rinuncia all'aggiornamento, confidando che sarà lo stesso nodo ''v'', una volta divenuto maturo, ad iniziare un flood di ETP verso ognuno dei suoi vicini.

Altrimenti, con le informazioni in questo ETP il nodo ''n'' aggiorna la sua mappa. ''n'' prepara tutti i percorsi della sua mappa che hanno subito una variazione e li mette in un set ''P''. Se si tratta di un percorso nuovo o cambiato basta memorizzare in ''P'' il percorso con i valori correnti. Se si tratta di un percorso rimosso dalla mappa lo si memorizza nella lista ''P'' con costo ''dead''.

Inoltre il nodo ''n'' aggiorna tutte le informazioni relative ai suoi g-nodi, cioè fingerprint e numero di nodi interni, sulla base delle conoscenze aggiornate nella sua mappa. Controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se ''P'' risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, il nodo ''n'' mette ''P'' e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini tranne ''v''.

Poi ''n'' prepara un nuovo ETP completo e lo invia a ''v''.

'''''Evento changed-link''''': Sia il nodo ''n'' ∈ G con un arco verso ''v''. ''n'' rileva che l'arco verso ''v'' cambia il suo costo.

Il nodo ''n'' chiede a tutti i suoi vicini un nuovo ETP completo. Con la somma delle informazioni da tutti questi ETP e i costi dei link ai suoi vicini (di cui uno è cambiato), il nodo ''n'' aggiorna la sua mappa. ''n'' prepara il set ''P'' con tutti i percorsi della sua mappa che hanno subito una variazione.

Inoltre il nodo ''n'' aggiorna tutte le informazioni relative ai suoi g-nodi e controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se ''P'' risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, il nodo ''n'' mette ''P'' e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini.

'''''Evento removed-link''''': Sia il nodo ''n'' ∈ G con un arco verso ''v''. ''n'' rileva che l'arco viene rimosso.

Il nodo ''n'' rimuove dalla sua mappa tutti i percorsi che iniziavano con l'arco rimosso e li scrive nel set ''P'' con costo = ''dead''. Poi ''n'' si comporta come per il caso di cambio di costo dell'arco.

'''''Preparazione di un nuovo ETP completo''''': Quando un nodo ''n'' prepara un nuovo ETP completo, il suo contenuto dipende se lo sta preparando per tutti i suoi vicini o per un vicino in particolare.

Se il destinatario è un nodo particolare ''v'', il nodo ''n'' prepara in ''P'' tutti i percorsi della sua mappa che non contengono ''v'', né come gateway né come hop né come destinazione. ''n'' mette ''P'' e il suo ID in un ETP e lo invia solo a ''v''.

Se l'ETP va inviato a tutti i vicini, il nodo ''n'' prepara in ''P'' tutti i percorsi della sua mappa. ''n'' mette ''P'' e il suo ID in un ETP e lo invia a tutti i vicini.

In entrambi i casi, il set ''P'' potrebbe risultare vuoto, ma l'ETP viene comunque prodotto e inviato, perché l'ETP contiene il percorso intrinseco verso lo stesso nodo ''n''.
Line 62: Line 86:
'''''Evento etp-received''''': Quando un nodo A riceve un ETP da un vicino B.

Con le informazioni dell'ETP il nodo A aggiorna la sua mappa. Elenchiamo le possibili variazioni alla mappa:

 * Una nuova rotta verso una destinazione. Questa a sua volta può essere divisa in due casi:
  * La destinazione era sconosciuta finora.
  * La destinazione era nota, ma questa rotta contiene degli hop intermedi diversi dalle rotte già note.
 * Una rotta già nota cambia. Può cambiare il suo costo, il fingerprint riportato, il numero di nodi interni riportato. Se si tratta di un cambio di fingerprint la modifica viene apportata. Se il fingerprint non cambia, allora si valuta se almeno una delle altre variazioni supera una data soglia (ad esempio il 30% del costo o il 10% del numero di nodi) per decidere se apportare la modifica nella propria mappa.
 * Una rotta viene rimossa. Può accadere perché nelle rotte scritte nell'ETP vedo una rotta (che avevo già nella mia mappa) con costo DeadREM: significa che un arco nella path è venuto a mancare. Oppure può accadere perché altre rotte verso la stessa destinazione sono state scoperte con costo inferiore e questa è diventata non disgiunta o oltre il numero massimo di rotte da memorizzare (vedi documento [[Netsukuku/ita/docs/ModuloQSPN/RotteDisgiunte|rotte disgiunte]]).

Per ogni modifica che apporta alla sua mappa il nodo A memorizza questa modifica in una lista R. Se si tratta di una rotta nuova o cambiata basta memorizzare i nuovi valori. Se si tratta di una rotta rimossa dalla mappa la si memorizza nella lista R con costo DeadREM.

Se R ≠ ∅, A produce un ETP con R, la lista di hop attraversati dall'ETP ricevuto da B più l'ID di A. Il nuovo ETP viene inviato in broadcast a tutti i vicini tranne B.

'''''Evento periodical-update''''': Sia il nodo A ∈ G. Sono passati 10 minuti dal momento in cui A è diventato maturo in G oppure dal precedente evento periodical-update.

Questo evento di fittizia variazione del grafo è aggiunto come misura di sicurezza. Se un vicino ha perso qualche informazione interessante questa è una occasione per rivederla.

Il nodo A prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini.
'''''Evento etp-received''''': Quando un nodo ''n'' riceve un ETP da un vicino ''v''.

Con le informazioni dell'ETP il nodo ''n'' aggiorna la sua mappa. ''n'' prepara il set ''P'' con tutti i percorsi della sua mappa che hanno subito una variazione.

Inoltre il nodo ''n'' aggiorna tutte le informazioni relative ai suoi g-nodi e controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se ''P'' risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, ''n'' produce un ETP con ''P'', la lista di hop attraversati dall'ETP ricevuto da ''v'' più l'ID di ''n''. Il nuovo ETP viene inviato in broadcast a tutti i vicini tranne ''v''.

'''''Evento periodical-update''''': Sia il nodo ''n'' ∈ G. Sono passati 10 minuti dal momento in cui ''n'' è diventato maturo in G oppure dal precedente evento periodical-update.

Questo evento di fittizia variazione del grafo è aggiunto come misura di ridondanza. Se un vicino ha perso qualche informazione interessante questa è una occasione per rivederla.

Il nodo ''n'' prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini.
Line 83: Line 101:
Quando tutti gli ETP finiscono il loro ciclo di vita la rete è di nuovo stabile.

<<Anchor(LetturaETP)>>

== Lettura delle informazioni in un ETP ==
==== Liste di hop percorsi ====
Un ETP contiene alcune liste di hop percorsi: una lista indica il percorso che ha seguito l'ETP da quando è stato generato a quando ci ha raggiunto; inoltre per ogni path contenuta come informazione dentro l'ETP, una lista indica il contenuto stesso della path.

In entrambi i casi queste liste sono espresse in forma di coordinate gerarchiche che sono valide per il nodo che ha prodotto l'oggetto ETP.

Come conseguenza del fatto che non possono essere rilevate rotte cicliche a nessun livello della gerarchia, le liste di hop percorsi sono sempre in una forma in cui i livelli salgono man mano che si avanza. Infatti nel momento in cui un ATP esce da un g-nodo non può più rientrarvi. Ad esempio potrei avere la path (0, 2) - (0, 5) - (1, 3) - (1, 7) - (2, 2) - (4, 2) - (4, 3) - (5, 3) - (5, 6). In questa rappresentazione delle coordinate il primo numero indica il livello e il secondo l'identificativo.

==== Definizione di grouping rule ====
Pensiamo ora ad un ETP che viene trasmesso da un nodo N ad un suo vicino A. Definiamo la grouping rule come l'elaborazione che il nodo A deve fare su una lista di hop contenuta nell'ETP affinché tale lista, dapprima coerente con i g-nodi a cui appartiene N nei vari livelli, diventi coerente con i g-nodi a cui appartiene A.

Il nodo N è all'interno di un g-nodo N~-^1^-~ a sua volta all'interno di N~-^2^-~, e così via fino a N~-^l^-~.

Il nodo A ha in comune con N (almeno N~-^l^-~) fino ad un certo g-nodo N~-^i^-~. Se ''i>1'' questo significa che N ed A sono bordernodi di g-nodi diversi, cioè che le informazioni del percorso interno al g-nodo di N distinto dal g-nodo di A non sono interessanti per A. Quindi A potrà rimuovere tutti gli hop iniziali che hanno livello inferiore ad ''i-1'' e sostituirli con il solo hop ottenuto come rappresentazione in coordinate gerarchiche dell'indirizzo di N.

Se invece il minimo comune g-nodo tra A e N è N~-^1^-~, cioè A ed N sono nello stesso g-nodo di livello 1, allora tutti gli indirizzi che sono nella mappa gerarchica di N possono essere nella mappa gerarchica di A. Quindi A non rimuove nessun hop nella lista, ma solo vi aggiunge in testa l'hop ottenuto come rappresentazione in coordinate gerarchiche dell'indirizzo di N, che sarà del tipo (0, x).

==== Interpretazione dei dati nell'ETP ====
Sia ''m'' un ETP che il nodo A riceve.

A esamina la lista di hop percorsi da ''m''. Per prima cosa esegue la Grouping Rule su tale lista per renderla coerente con i cluster a cui il nodo A appartiene. Poi esegue la Acyclic Rule sulla lista, cioè se ''m'' era già passato per il mio nodo (o cluster) lo ignoro del tutto.

Infine A esamina il set di rotte R contenuto in ''m'', ma deve renderle coerenti con i cluster a cui il nodo A appartiene. Come avviene questo:

 * ''m'' arriva ad A da un certo suo vicino N interno ad un g-nodo N~-^1^-~ a sua volta interno a N~-^2^-~ ... N~-^l^-~. Questo ETP è prodotto da N anche se N lo sta inoltrando, cioè potrebbe essere stato originato da un altro nodo in conseguenza di variazioni nei suoi link. L'ETP ''m'', oltre alle rotte così come sono viste da N, contiene per i g-nodi da N~-^0^-~ a N~-^l^-~ il fingerprint e il numero di nodi interni.
 * Il nodo A ha in comune con N (almeno N~-^l^-~) fino ad un certo g-nodo N~-^i^-~. Il nodo A elimina dal set R tutte le rotte che, come sono viste da N, si riferiscono a destinazioni di livello inferiore a ''i-1''. Si tratta infatti di rotte interne ad un g-nodo a cui N appartiene ma A non appartiene. Il nodo A considera invece tutte le altre rotte del set R.
 * Per ogni rotta nel set R ora la destinazione è espressa come coordinata gerarchica valida per il nodo A; il nodo A esegue la Grouping Rule sulla lista di hop intermedi di ogni singola rotta.
 * Il nodo A rimuove dal set R le rotte che contengono nella lista di hop intermedi il suo identificativo a livello ''i''. Questa situazione dovrebbe in teoria essere possibile solo per ''i'' = livello del minimo comune g-nodo tra il nodo A e il vicino N. Questa è la Acyclic Rule.
 * Il nodo A aggiunge al set R la rotta verso N~-^i-1^-~ con costo NullREM e fingerprint e numero di nodi così come riportati in ''m'' per N~-^i-1^-~.
 * Per tutte le rotte del set R al costo della path viene sommato il costo dell'arco con N.
Quando tutti gli ETP finiscono il loro ciclo di vita la rete è di nuovo ''esplorata''.

== Struttura gerarchica degli indirizzi ==
In questo capitolo prendiamo in esame il fatto che ogni singolo nodo mantiene informazioni sulla rete che sono limitate ad una visione gerarchica. Quindi anche quando le trasmette esse hanno questo limite. Vedremo cosa questo comporta in termini di informazioni che devono essere trasmesse in ogni ETP in aggiunta al set di percorsi che abbiamo prima introdotto. Essendo questo l'ultimo aspetto affrontato, descriveremo di seguito nel dettaglio come è fatto un messaggio di ETP.

=== Rappresentazione gerarchica degli ID ===
Abbiamo già detto che un generico TP contiene la lista degli ID dei nodi che ha percorso, e per ognuno di questi nodi contiene anche l'identificativo dell'arco attraverso il quale il nodo seguente ha ricevuto il TP. Un percorso non è altro che questa lista letta al contrario.

Abbiamo già detto, inoltre, che un messaggio di ETP contiene, oltre alla lista di ID dei nodi e archi che ha percorso, anche un set ''P'' di percorsi; ognuno dei percorsi è a sua volta una lista di ID di nodi e archi fino ad un certo nodo destinazione.

Aggiungiamo ora che ogni ID può in effetti rappresentare o un singolo nodo oppure un g-nodo, diciamo genericamente un g-nodo di livello ''i'' da 0 a ''l-1''. Anche la destinazione di ognuno dei percorsi nel set ''P'' è un g-nodo.

Ogni percorso ''p'' è composto di due sequenze di ''k'' elementi:

 * ''p.hops'' : sequenza di k g-nodi.
 * ''p.arcs'' : sequenza di k identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo corrente a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].

Ogni g-nodo in queste liste è espresso in forma di coordinate gerarchiche che sono valide per il nodo che ha prodotto l'oggetto ETP. Gli identificativi degli archi in queste liste sono gli effettivi archi che collegano un border-nodo del g-nodo precedente ad un border-nodo del g-nodo successivo.

=== Informazioni aggiuntive sulla destinazione ===
Aggiungiamo inoltre che ogni percorso del set ''P'' contiene alcune informazioni aggiuntive riguardo il g-nodo che è la sua destinazione. Contiene il suo fingerprint e il numero di nodi stimati nel suo interno.

=== Minimo comune g-nodo e massimo distinto g-nodo ===
Introduciamo due definizioni che ci saranno utili nel resto del capitolo. Siano due nodi distinti ''n'' e ''v''.

Il nodo ''v'' ha indirizzo ''v~-,,l-1,,-~·...·v~-,,1,,-~·v~-,,0,,-~''. Vale a dire che ''v'' ha identificativo ''v~-,,0,,-~'' all'interno del suo g-nodo di livello 1, il quale ha identificativo ''v~-,,1,,-~'' all'interno del suo g-nodo di livello 2, ... fino al suo g-nodo di livello ''l-1'' che ha identificativo ''v~-,,l-1,,-~'' all'interno dell'unico g-nodo di livello ''l'' che costituisce l'intera rete.

Il nodo ''n'' ha indirizzo ''n~-,,l-1,,-~·...·n~-,,1,,-~·n~-,,0,,-~'' con analogo significato.

Sia ''i'', con ''i'' < ''l'', il più grande intero tale che ''v~-,,i,,-~'' ≠ ''n~-,,i,,-~'', cioè il livello più alto a cui ''v'' ed ''n'' non appartengono allo stesso g-nodo.

Definiamo ''minimo comune g-nodo'' tra ''v'' e ''n'' il g-nodo ''v~-,,i+1,,-~'' = ''n~-,,i+1,,-~'', cioè il più piccolo g-nodo che contiene sia ''n'' sia ''v''. Potrebbe trattarsi del g-nodo a livello ''l'' che costituisce l'intera rete. Siccome si tratta di uno dei g-nodi di ''n'' e anche uno dei g-nodi di ''v'', per entrambi i nodi questo può essere rappresentato semplicemente con l'intero ''i+1''.

Definiamo ''massimo distinto g-nodo di v per n'' il g-nodo ''v~-,,i,,-~'', cioè il più grande g-nodo che contiene ''v'' ma non contiene ''n''. Per il nodo ''n'' questo può essere rappresentato come coordinata gerarchica a livello ''i''. Invece per il nodo ''v'' può essere rappresentato semplicemente con l'intero ''i''.

Simmetricamente abbiamo che il ''massimo distinto g-nodo di n per v'' è il g-nodo ''n~-,,i,,-~'', cioè il più grande g-nodo che contiene ''n'' ma non contiene ''v''.

=== Percorso a livelli crescenti ===
Si consideri che un ETP è un ATP, cioè è aciclico. Quando il nodo ''n'' riceve dal nodo ''v'' un ETP ''m'' che contiene già il suo ID nella lista del percorso seguito, subito ''n'' ignora l'ETP ''m''. Bisogna considerare che in questa frase con il termine ID di ''n'' si intende l'identificativo del massimo distinto g-nodo di ''n'' per ''v''.

Come conseguenza del fatto che non possono essere mantenuti o trasmessi percorsi ciclici a nessun livello della gerarchia, le liste di hop percorsi sono sempre in una forma in cui i livelli salgono man mano che si avanza. Infatti nel momento in cui un ATP esce da un g-nodo non può più rientrarvi. Ad esempio potrei avere il percorso (0, 2) - (0, 5) - (1, 3) - (1, 7) - (2, 2) - (4, 2) - (4, 3) - (5, 3) - (5, 6). In questa rappresentazione delle coordinate il primo numero indica il livello e il secondo l'identificativo.

<<Anchor(GroupingRule)>>

=== Definizione di grouping rule ===
Sia ''m'' un ETP che il nodo ''n'' riceve dal nodo ''v''. Sia ''lst'' una lista di hop contenuta in ''m'', vale a dire o la lista che rappresenta un percorso ''p'' ∈ ''P'' oppure la lista di hop percorsi dallo stesso ETP ''m''.

Definiamo la ''grouping rule'' come l'elaborazione che il nodo ''n'' deve fare su ''lst'' affinché tale lista, dapprima coerente con i g-nodi a cui appartiene ''v'' nei vari livelli, diventi coerente con i g-nodi a cui appartiene ''n''.

Sia ''i'' con ''i'' ≤ ''l'' il livello del minino comune g-nodo tra ''n'' e ''v''.

Se ''i'' = 1, cioè se il minimo comune g-nodo tra ''n'' e ''v'' è ''v~-,,1,,-~'', cioè ''n'' e ''v'' sono nello stesso g-nodo di livello 1, allora tutti gli indirizzi che sono nella mappa gerarchica di ''v'' possono essere nella mappa gerarchica di ''n''. Quindi ''n'' considera validi tutti gli hop della lista; inoltre vi aggiunge in testa l'hop composto dal massimo distinto g-nodo di ''v'' per ''n'' - che sarà del tipo (0, v~-,,0,,-~) - e dall'arco tramite il quale ''n'' ha ricevuto l'ETP.

Se invece ''i'' > 1 questo significa che il nodo ''v'' e il nodo ''n'' sono bordernodi di g-nodi diversi, cioè che le informazioni del percorso interno al g-nodo di ''v'' distinto dal g-nodo di ''n'' non sono interessanti per ''n''. Quindi ''n'' rimuoverà tutti gli hop iniziali che rappresentano un g-nodo di livello inferiore ad ''i-1''; di seguito vi aggiunge in testa l'hop composto dal massimo distinto g-nodo di ''v'' per ''n'' e dall'arco tramite il quale ''n'' ha ricevuto l'ETP.

Bisogna aggiungere, in questa seconda situazione, che la rimozione degli hop iniziali che rappresentano un g-nodo di livello inferiore ad ''i-1'' può portare al completo svuotamento di ''lst''. Se si verifica questo caso, bisogna distinguere se ''lst'' è un percorso ''p'' ∈ ''P'' oppure è la lista di hop percorsi da ''m''. Si consideri che un percorso verso una destinazione interna ad un g-nodo ''g'' non è interessante per il nodo ''n'' ∉ ''g''. Invece un ETP originato in ''g'' può essere che porti variazioni a percorsi che escono da ''g'', quindi può essere nel complesso interessante per il nodo ''n'' ∉ ''g''.

Se non resta alcun elemento in ''lst'', dove ''lst'' è un percorso ''p'' ∈ ''P'', allora l'intera lista viene scartata.

Se non resta alcun elemento in ''lst'', dove ''lst'' è la lista di hop percorsi da ''m'', allora la lista viene sostituita con una lista contenente solo l'hop composto dal massimo distinto g-nodo di ''v'' per ''n'' e dall'arco tramite il quale ''n'' ha ricevuto l'ETP.

<<Anchor(AcyclicRule)>>

=== Definizione di acyclic rule ===
Sia ''lst'' una lista di hop coerente con i g-nodi a cui appartiene ''v''. Definiamo la ''acyclic rule'' come l'elaborazione che permette al nodo ''v'' di stabilire se in ''lst'' è presente l'identificativo di uno dei suoi g-nodi, cioè se questo percorso è ciclico a qualsiasi livello della gerarchia.

L'implementazione è banale. Va effettuata su tutti i livelli. Il nodo ''v'' sa di aver ricevuto questo percorso dal nodo ''n'', quindi, avendo calcolato ''i'' il livello del minimo comune g-nodo tra ''n'' e ''v'', potrebbe limitarsi a verificare il livello ''i-1'', poiché in teoria il nodo ''n'' ha già rimosso i percorsi con cicli nei livelli superiori. Comunque il nodo ''v'' non si fida di questo e verifica tutti i livelli da ''i-1'' in su. Quelli inferiori a ''i-1'' sono stati rimossi dalla grouping rule.

Se la regola non è soddisfatta, cioè se il percorso è ciclico, bisogna di nuovo distinguere se ''lst'' è un percorso ''p'' ∈ ''P'' oppure è la lista di hop percorsi da ''m''. Se si tratta di un percorso ''p'' ∈ ''P'' tale percorso viene scartato. Se si tratta della lista di hop percorsi da ''m'' allora l'intero ETP viene ignorato.

=== Contenuto e forma di un messaggio ETP ===
Un messaggio ETP ''m'' inviato da un nodo ''v'' deve contenere:

 * L'indirizzo del nodo ''v'', come elenco ''v~-,,l-1,,-~·...·v~-,,1,,-~·v~-,,0,,-~''.
 * La lista dei g-nodi percorsi dall'ETP sotto forma di due sequenze:
  * hops: sequenza di k g-nodi sotto forma di coordinate gerarchiche valide per il nodo ''v''.
  * arcs: sequenza di k identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo v a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].
 * Un set di percorsi ''P'' che il nodo ''v'' intende comunicare ai suoi vicini. Per ogni percorso ''p'' ∈ ''P'':
  * La lista dei g-nodi del percorso ''p''; questa comprende il g-nodo destinazione ''d''; anche questa lista è espressa come due sequenze:
   * p.hops: sequenza di k~-,,p,,-~ g-nodi sotto forma di coordinate gerarchiche valide per il nodo ''v''.
   * p.arcs: sequenza di k~-,,p,,-~ identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo v a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].
  * Il fingerprint del g-nodo ''d'' come riportato dal percorso ''p''.
  * Il numero di nodi stimato nel g-nodo ''d'' come riportato dal percorso ''p''.
  * Il costo totale del percorso da ''v'' a ''d''.

==== Informazioni aggiuntive riguardo gli archi ====
Quando un ETP abbandona un g-nodo ''g'' di livello ''i'' esso deve perdere tutte le informazioni interne al g-nodo ''g''. Infatti ogni nodo ''n'' che lo riceverà in seguito con ''n'' ∉ ''g'', considera tutti i nodi interni a ''g'' come raggruppati in un unico vertice. Ogni percorso noto a ''n'', che tocca il vertice ''g'', avrà come successivo hop un altro vertice ''h'', di livello ''i'' o maggiore. Il passaggio da ''g'' ad ''h'' avviene attraverso un arco che è un arco realizzato da uno dei border-nodi di ''g''.

Come fa il nodo ''n'' a distinguere i diversi possibili percorsi che toccano in sequenza i vertici ''g'' ed ''h''? Il nodo ''n'' può distinguere tanti diversi percorsi che toccano prima ''g'' e poi ''h'' quanti sono gli archi che congiungono border-nodi di ''g'' a border-nodi di ''h''. Se però un percorso ''p1'' e un percorso ''p2'' sono composti da hops diversi internamente al g-nodo ''g'' per raggiungere uno stesso arco ''α'' che collega il g-nodo ''g'' al g-nodo ''h'', allora i 2 percorsi ''p1'' e ''p2'' sono indistinguibili per il nodo ''n''.

Di conseguenza, il nodo ''n'' ∉ ''g'' è interessato a ricevere informazioni su percorsi che toccano ''g'' e poi escono da ''g'' attraverso l'arco ''α'' solo se si tratta del miglior percorso (con costo minore) che esce da ''g'' attraverso l'arco ''α''. Quindi il messaggio ''m'' prodotto da ''v'' deve contenere anche:

 * Per ogni percorso ''p'' ∈ ''P'':
  * Per ogni livello ''i'' da 1 a ''l-1'':
   * Un booleano che dice se ''p'' è interessante per il nodo ''n'' ∉ ''v,,i,,''.

La valorizzazione di questo booleano procede così:

 * Per ogni percorso ''p'' ∈ ''P'':
  * Per ogni livello ''i'' da 1 a ''l-1'':
   * Se la destinazione di ''p'' ha livello maggiore o uguale a ''i'', cioè p.hops.last().lvl ≥ i:
    * Sia ''j'' il più piccolo valore tale che p.hops[j].lvl ≥ i.
    * Il booleano vale True se e solo se è questo il miglior percorso da ''v'' verso p.hops[j] tramite p.arcs[j].
   * Altrimenti:
    * Il booleano vale False. Infatti il percorso ''p'' verrà comunque scartato da ''n'' per la grouping rule.

==== Informazioni aggiuntive riguardo la destinazione ====
Si consideri il nodo ''n'' vicino di ''v'' che riceve questo messaggio ''m'' tramite un suo arco. Oltre al set di percorsi ''P'' contenuto in ''m'', il nodo ''n'' intrinsecamente riceve un percorso verso il massimo distinto g-nodo di ''v'' per ''n''. Sia ''i'' il livello di questo g-nodo, indichiamo questo g-nodo con ''v~-,,i,,-~''. Il nodo ''n'' vorrà memorizzare nella sua mappa questo percorso e dovrà quindi essere informato sulle informazioni aggiuntive di cui abbiamo parlato in precedenza, cioè il fingerprint di ''v~-,,i,,-~'' e il numero di nodi all'interno di ''v~-,,i,,-~''. Siccome il nodo ''v'' quando trasmette l'ETP ''m'' non conosce il livello ''i'' (poiché il messaggio ''m'' potrebbe essere inviato in broadcast e raggiungere diversi vicini) allora ''v'' dovrà aggiungere ad ''m'' queste informazioni per tutti i g-nodi a cui appartiene ad ogni livello. Quindi il messaggio ''m'' prodotto da ''v'' deve contenere anche:

 * Per ogni livello ''i'' da 0 a ''l-1'':
  * Il fingerprint del g-nodo ''v~-,,i,,-~''.
  * Il numero di nodi stimato all'interno del g-nodo ''v~-,,i,,-~''.

Modulo QSPN - Esplorazione della rete

Concetti e termini

Questa prima parte non descrive quali messaggi vengano effettivamente passati da un nodo all'altro.

In questa prima parte esaminiamo i concetti generali e introduciamo alcuni termini, per avere una idea di quali considerazioni abbiano portato alla scelta dell'effettiva implementazione che sarà descritta più sotto.

TP - Tracer Packet

Un TP flood viene avviato da un nodo s. Per farlo s genera un TP, ci scrive il suo ID e lo invia a tutti i suoi vicini. Un nodo n che riceve il TP vi aggiunge il suo ID, un identificativo univoco dell'arco α attraverso il quale lo ha ricevuto e il costo dell'arco c ( α ) e poi lo inoltra a tutti i suoi vicini tranne quello da cui lo ha ricevuto.

Quando un nodo invia un TP (questo vale sia per il nodo s che inizia il flood sia per il generico nodo n che lo inoltra) lo invia a più di un vicino, quindi invia in effetti un insieme di TP. Quando questi TP raggiungono un altro nodo v possono quindi aver compiuto percorsi diversi; grazie al loro contenuto il nodo v sa valutare per ogni percorso il suo costo, sommando i costi di ogni singolo arco attraversato.

Un nodo v può ricevere più di una volta un TP proveniente da uno stesso flood, ma lo inoltra solo se il percorso contenuto risulta essere il percorso con costo minore da v ad s. Quindi se un nodo s inizia un TP flood, tutti i nodi scropriranno per ogni loro vicino il percorso migliore verso s.

ATP - Acyclic Tracer Packet

Un ATP è un TP che, quando un nodo lo riceve lo inoltra a tutti i suoi vicini tranne quello da cui lo riceve, anche se il flood era già passato da lì. Un ATP non viene inoltrato da un nodo n se l'ID di n era già presente in esso. Questo lo rende aciclico. Quindi se un nodo s inizia un ATP flood tutti i nodi scopriranno tutti i possibili percorsi verso s, senza cicli.

CTP - Continuous Tracer Packet

Un CTP è un TP che, quando un nodo lo riceve lo inoltra sempre a tutti i suoi vicini tranne quello da cui lo riceve. Inoltre, se il nodo ricevente ha come unico vicino quello che glielo ha inoltrato allora svuota la lista di ID e lo inoltra di nuovo al nodo che glielo aveva inoltrato. Quindi un CTP non cessa mai di esplorare tutti i percorsi della rete.

Interesting information rule

La regola dell'informazione interessante può essere aggiunta alla decisione sull'inoltro di un generico TP (TP o ATP o CTP). Questa regola dice che un TP non va inoltrato se non contiene nessuna informazione interessante per il nodo. Ad esempio nel caso di percorsi se tutti i percorsi in esso presenti erano già noti al nodo.

ETP - Extended Tracer Packet

Un ETP è un ATP che contiene una porzione di una mappa, cioè un set P di percorsi. Ad esso si associa la regola dell'informazione interessante, considerando tutti i percorsi contenuti come parte dell'informazione. Quindi un nodo n che riceve l'ETP lo inoltra (a tutti i vicini tranne il mittente) se l'ETP non ha fatto già un ciclo (non c'è già l'ID di n) AND i percorsi contenuti in P hanno apportato qualche aggiornamento alla mappa di n.

Implementazione dell'esplorazione

Si descrive ora come viene implementata l'esplorazione di una rete. Affrontiamo subito il problema della dinamicità della rete, cioè operiamo in un grafo che cambia nel tempo in termini di vertici o di archi o di costo degli archi. Si noti invece che in questo capitolo non introduciamo subito l'aspetto della struttura gerarchica che viene imposta sugli indirizzi della rete per ridurre la quantità di informazioni memorizzate in ogni singolo nodo. Le implicazioni di questa strutturazione verranno descritte nel capitolo successivo.

Rete completamente esplorata

Una rete si dice completamente esplorata, per brevità diciamo esplorata, se tutti i nodi hanno tutte le conoscenze di loro pertinenza. L'obiettivo che ci siamo prefissati è descritto nel dettaglio nel documento di analisi funzionale: in sintesi, ogni nodo deve avere per ogni destinazione un numero di percorsi rapidi e tra loro disgiunti. I dettagli sulle informazioni per ogni percorso verranno man mano esplicitati in questo documento. In seguito nel documento indicheremo questo insieme di conoscenze di un nodo con il termine mappa di n.

Una rete inizia come singolo nodo. Quando inizia è quindi esplorata e il nodo si considera maturo (questa definizione verrà chiarificata sotto).

Sia G una rete esplorata. Consideriamo tutti i possibili eventi che cambiano il grafo e quindi rendono la rete non più esplorata. Vediamo quali operazioni sono necessarie a farla ridiventare esplorata.

Tali eventi, come si può vedere dall'elenco che segue, sono riconducibili alla nascita/variazione/morte di archi tra due nodi vicini. Questi eventi sono tutti notificati al modulo QSPN, come si è detto nei requisiti dell'analisi funzionale.

Evento hooked: Sia n un nodo appena entrato nella rete G grazie ad un set di archi verso nodi vicini.

Il nodo n si considera non maturo. In questo stato se n riceve la notifica di eventi — di modifica dei suoi archi e/o ricezione di ETP — li accoda per processarli in seguito. Inoltre se riceve la richiesta di produrre un ETP la rifiuta "perché non maturo".

n chiede a tutti i suoi vicini un nuovo ETP completo; vedremo fra poco come viene preparato un ETP completo. Se un vicino v rifiuta perché non è ancora maturo, n lo ignora, confidando che sarà lo stesso nodo v, una volta divenuto maturo, ad iniziare un flood di ETP verso ognuno dei suoi vicini. Può succedere come caso estremo che n non riceve nessun ETP: in questo caso n non è entrato in G; la procedura di hook nella rete è da considerarsi fallita e occorrerà riprovare da capo.

Con la somma delle informazioni da tutti gli ETP ricevuti, il nodo n aggiorna la sua mappa.

Da questo momento n è maturo. Il nodo n prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini. n processa gli eventi accodati.

Evento added-link: Sia il nodo n ∈ G. n rileva la nascita di un nuovo arco con un vicino v ∈ G.

Il nodo n chiede a v un nuovo ETP completo.

La richiesta di un ETP potrebbe venire rifiutata da v perché non è ancora maturo. In questo caso n rinuncia all'aggiornamento, confidando che sarà lo stesso nodo v, una volta divenuto maturo, ad iniziare un flood di ETP verso ognuno dei suoi vicini.

Altrimenti, con le informazioni in questo ETP il nodo n aggiorna la sua mappa. n prepara tutti i percorsi della sua mappa che hanno subito una variazione e li mette in un set P. Se si tratta di un percorso nuovo o cambiato basta memorizzare in P il percorso con i valori correnti. Se si tratta di un percorso rimosso dalla mappa lo si memorizza nella lista P con costo dead.

Inoltre il nodo n aggiorna tutte le informazioni relative ai suoi g-nodi, cioè fingerprint e numero di nodi interni, sulla base delle conoscenze aggiornate nella sua mappa. Controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se P risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, il nodo n mette P e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini tranne v.

Poi n prepara un nuovo ETP completo e lo invia a v.

Evento changed-link: Sia il nodo n ∈ G con un arco verso v. n rileva che l'arco verso v cambia il suo costo.

Il nodo n chiede a tutti i suoi vicini un nuovo ETP completo. Con la somma delle informazioni da tutti questi ETP e i costi dei link ai suoi vicini (di cui uno è cambiato), il nodo n aggiorna la sua mappa. n prepara il set P con tutti i percorsi della sua mappa che hanno subito una variazione.

Inoltre il nodo n aggiorna tutte le informazioni relative ai suoi g-nodi e controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se P risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, il nodo n mette P e il suo ID in un nuovo ETP. Invia l'ETP in broadcast a tutti i vicini.

Evento removed-link: Sia il nodo n ∈ G con un arco verso v. n rileva che l'arco viene rimosso.

Il nodo n rimuove dalla sua mappa tutti i percorsi che iniziavano con l'arco rimosso e li scrive nel set P con costo = dead. Poi n si comporta come per il caso di cambio di costo dell'arco.

Preparazione di un nuovo ETP completo: Quando un nodo n prepara un nuovo ETP completo, il suo contenuto dipende se lo sta preparando per tutti i suoi vicini o per un vicino in particolare.

Se il destinatario è un nodo particolare v, il nodo n prepara in P tutti i percorsi della sua mappa che non contengono v, né come gateway né come hop né come destinazione. n mette P e il suo ID in un ETP e lo invia solo a v.

Se l'ETP va inviato a tutti i vicini, il nodo n prepara in P tutti i percorsi della sua mappa. n mette P e il suo ID in un ETP e lo invia a tutti i vicini.

In entrambi i casi, il set P potrebbe risultare vuoto, ma l'ETP viene comunque prodotto e inviato, perché l'ETP contiene il percorso intrinseco verso lo stesso nodo n.

Evento etp-received: Quando un nodo n riceve un ETP da un vicino v.

Con le informazioni dell'ETP il nodo n aggiorna la sua mappa. n prepara il set P con tutti i percorsi della sua mappa che hanno subito una variazione.

Inoltre il nodo n aggiorna tutte le informazioni relative ai suoi g-nodi e controlla se tali informazioni sono effettivamente cambiate rispetto a prima.

Se P risulta non vuoto, oppure se sono state apportate variazioni alle informazioni relative ai propri g-nodi, n produce un ETP con P, la lista di hop attraversati dall'ETP ricevuto da v più l'ID di n. Il nuovo ETP viene inviato in broadcast a tutti i vicini tranne v.

Evento periodical-update: Sia il nodo n ∈ G. Sono passati 10 minuti dal momento in cui n è diventato maturo in G oppure dal precedente evento periodical-update.

Questo evento di fittizia variazione del grafo è aggiunto come misura di ridondanza. Se un vicino ha perso qualche informazione interessante questa è una occasione per rivederla.

Il nodo n prepara un nuovo ETP completo e lo invia in broadcast a tutti i vicini.


Quando tutti gli ETP finiscono il loro ciclo di vita la rete è di nuovo esplorata.

Struttura gerarchica degli indirizzi

In questo capitolo prendiamo in esame il fatto che ogni singolo nodo mantiene informazioni sulla rete che sono limitate ad una visione gerarchica. Quindi anche quando le trasmette esse hanno questo limite. Vedremo cosa questo comporta in termini di informazioni che devono essere trasmesse in ogni ETP in aggiunta al set di percorsi che abbiamo prima introdotto. Essendo questo l'ultimo aspetto affrontato, descriveremo di seguito nel dettaglio come è fatto un messaggio di ETP.

Rappresentazione gerarchica degli ID

Abbiamo già detto che un generico TP contiene la lista degli ID dei nodi che ha percorso, e per ognuno di questi nodi contiene anche l'identificativo dell'arco attraverso il quale il nodo seguente ha ricevuto il TP. Un percorso non è altro che questa lista letta al contrario.

Abbiamo già detto, inoltre, che un messaggio di ETP contiene, oltre alla lista di ID dei nodi e archi che ha percorso, anche un set P di percorsi; ognuno dei percorsi è a sua volta una lista di ID di nodi e archi fino ad un certo nodo destinazione.

Aggiungiamo ora che ogni ID può in effetti rappresentare o un singolo nodo oppure un g-nodo, diciamo genericamente un g-nodo di livello i da 0 a l-1. Anche la destinazione di ognuno dei percorsi nel set P è un g-nodo.

Ogni percorso p è composto di due sequenze di k elementi:

  • p.hops : sequenza di k g-nodi.

  • p.arcs : sequenza di k identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo corrente a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].

Ogni g-nodo in queste liste è espresso in forma di coordinate gerarchiche che sono valide per il nodo che ha prodotto l'oggetto ETP. Gli identificativi degli archi in queste liste sono gli effettivi archi che collegano un border-nodo del g-nodo precedente ad un border-nodo del g-nodo successivo.

Informazioni aggiuntive sulla destinazione

Aggiungiamo inoltre che ogni percorso del set P contiene alcune informazioni aggiuntive riguardo il g-nodo che è la sua destinazione. Contiene il suo fingerprint e il numero di nodi stimati nel suo interno.

Minimo comune g-nodo e massimo distinto g-nodo

Introduciamo due definizioni che ci saranno utili nel resto del capitolo. Siano due nodi distinti n e v.

Il nodo v ha indirizzo vl-1·...·v1·v0. Vale a dire che v ha identificativo v0 all'interno del suo g-nodo di livello 1, il quale ha identificativo v1 all'interno del suo g-nodo di livello 2, ... fino al suo g-nodo di livello l-1 che ha identificativo vl-1 all'interno dell'unico g-nodo di livello l che costituisce l'intera rete.

Il nodo n ha indirizzo nl-1·...·n1·n0 con analogo significato.

Sia i, con i < l, il più grande intero tale che vini, cioè il livello più alto a cui v ed n non appartengono allo stesso g-nodo.

Definiamo minimo comune g-nodo tra v e n il g-nodo vi+1 = ni+1, cioè il più piccolo g-nodo che contiene sia n sia v. Potrebbe trattarsi del g-nodo a livello l che costituisce l'intera rete. Siccome si tratta di uno dei g-nodi di n e anche uno dei g-nodi di v, per entrambi i nodi questo può essere rappresentato semplicemente con l'intero i+1.

Definiamo massimo distinto g-nodo di v per n il g-nodo vi, cioè il più grande g-nodo che contiene v ma non contiene n. Per il nodo n questo può essere rappresentato come coordinata gerarchica a livello i. Invece per il nodo v può essere rappresentato semplicemente con l'intero i.

Simmetricamente abbiamo che il massimo distinto g-nodo di n per v è il g-nodo ni, cioè il più grande g-nodo che contiene n ma non contiene v.

Percorso a livelli crescenti

Si consideri che un ETP è un ATP, cioè è aciclico. Quando il nodo n riceve dal nodo v un ETP m che contiene già il suo ID nella lista del percorso seguito, subito n ignora l'ETP m. Bisogna considerare che in questa frase con il termine ID di n si intende l'identificativo del massimo distinto g-nodo di n per v.

Come conseguenza del fatto che non possono essere mantenuti o trasmessi percorsi ciclici a nessun livello della gerarchia, le liste di hop percorsi sono sempre in una forma in cui i livelli salgono man mano che si avanza. Infatti nel momento in cui un ATP esce da un g-nodo non può più rientrarvi. Ad esempio potrei avere il percorso (0, 2) - (0, 5) - (1, 3) - (1, 7) - (2, 2) - (4, 2) - (4, 3) - (5, 3) - (5, 6). In questa rappresentazione delle coordinate il primo numero indica il livello e il secondo l'identificativo.

Definizione di grouping rule

Sia m un ETP che il nodo n riceve dal nodo v. Sia lst una lista di hop contenuta in m, vale a dire o la lista che rappresenta un percorso pP oppure la lista di hop percorsi dallo stesso ETP m.

Definiamo la grouping rule come l'elaborazione che il nodo n deve fare su lst affinché tale lista, dapprima coerente con i g-nodi a cui appartiene v nei vari livelli, diventi coerente con i g-nodi a cui appartiene n.

Sia i con il il livello del minino comune g-nodo tra n e v.

Se i = 1, cioè se il minimo comune g-nodo tra n e v è v1, cioè n e v sono nello stesso g-nodo di livello 1, allora tutti gli indirizzi che sono nella mappa gerarchica di v possono essere nella mappa gerarchica di n. Quindi n considera validi tutti gli hop della lista; inoltre vi aggiunge in testa l'hop composto dal massimo distinto g-nodo di v per n - che sarà del tipo (0, v0) - e dall'arco tramite il quale n ha ricevuto l'ETP.

Se invece i > 1 questo significa che il nodo v e il nodo n sono bordernodi di g-nodi diversi, cioè che le informazioni del percorso interno al g-nodo di v distinto dal g-nodo di n non sono interessanti per n. Quindi n rimuoverà tutti gli hop iniziali che rappresentano un g-nodo di livello inferiore ad i-1; di seguito vi aggiunge in testa l'hop composto dal massimo distinto g-nodo di v per n e dall'arco tramite il quale n ha ricevuto l'ETP.

Bisogna aggiungere, in questa seconda situazione, che la rimozione degli hop iniziali che rappresentano un g-nodo di livello inferiore ad i-1 può portare al completo svuotamento di lst. Se si verifica questo caso, bisogna distinguere se lst è un percorso pP oppure è la lista di hop percorsi da m. Si consideri che un percorso verso una destinazione interna ad un g-nodo g non è interessante per il nodo ng. Invece un ETP originato in g può essere che porti variazioni a percorsi che escono da g, quindi può essere nel complesso interessante per il nodo ng.

Se non resta alcun elemento in lst, dove lst è un percorso pP, allora l'intera lista viene scartata.

Se non resta alcun elemento in lst, dove lst è la lista di hop percorsi da m, allora la lista viene sostituita con una lista contenente solo l'hop composto dal massimo distinto g-nodo di v per n e dall'arco tramite il quale n ha ricevuto l'ETP.

Definizione di acyclic rule

Sia lst una lista di hop coerente con i g-nodi a cui appartiene v. Definiamo la acyclic rule come l'elaborazione che permette al nodo v di stabilire se in lst è presente l'identificativo di uno dei suoi g-nodi, cioè se questo percorso è ciclico a qualsiasi livello della gerarchia.

L'implementazione è banale. Va effettuata su tutti i livelli. Il nodo v sa di aver ricevuto questo percorso dal nodo n, quindi, avendo calcolato i il livello del minimo comune g-nodo tra n e v, potrebbe limitarsi a verificare il livello i-1, poiché in teoria il nodo n ha già rimosso i percorsi con cicli nei livelli superiori. Comunque il nodo v non si fida di questo e verifica tutti i livelli da i-1 in su. Quelli inferiori a i-1 sono stati rimossi dalla grouping rule.

Se la regola non è soddisfatta, cioè se il percorso è ciclico, bisogna di nuovo distinguere se lst è un percorso pP oppure è la lista di hop percorsi da m. Se si tratta di un percorso pP tale percorso viene scartato. Se si tratta della lista di hop percorsi da m allora l'intero ETP viene ignorato.

Contenuto e forma di un messaggio ETP

Un messaggio ETP m inviato da un nodo v deve contenere:

  • L'indirizzo del nodo v, come elenco vl-1·...·v1·v0.

  • La lista dei g-nodi percorsi dall'ETP sotto forma di due sequenze:
    • hops: sequenza di k g-nodi sotto forma di coordinate gerarchiche valide per il nodo v.

    • arcs: sequenza di k identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo v a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].
  • Un set di percorsi P che il nodo v intende comunicare ai suoi vicini. Per ogni percorso pP:

    • La lista dei g-nodi del percorso p; questa comprende il g-nodo destinazione d; anche questa lista è espressa come due sequenze:

      • p.hops: sequenza di kp g-nodi sotto forma di coordinate gerarchiche valide per il nodo v.

      • p.arcs: sequenza di kp identificativi di arco, dove arcs[0] indica l'arco che congiunge il nodo v a hops[0], e arcs[j] indica l'arco che congiunge hops[j-1] a hops[j].

    • Il fingerprint del g-nodo d come riportato dal percorso p.

    • Il numero di nodi stimato nel g-nodo d come riportato dal percorso p.

    • Il costo totale del percorso da v a d.

Informazioni aggiuntive riguardo gli archi

Quando un ETP abbandona un g-nodo g di livello i esso deve perdere tutte le informazioni interne al g-nodo g. Infatti ogni nodo n che lo riceverà in seguito con ng, considera tutti i nodi interni a g come raggruppati in un unico vertice. Ogni percorso noto a n, che tocca il vertice g, avrà come successivo hop un altro vertice h, di livello i o maggiore. Il passaggio da g ad h avviene attraverso un arco che è un arco realizzato da uno dei border-nodi di g.

Come fa il nodo n a distinguere i diversi possibili percorsi che toccano in sequenza i vertici g ed h? Il nodo n può distinguere tanti diversi percorsi che toccano prima g e poi h quanti sono gli archi che congiungono border-nodi di g a border-nodi di h. Se però un percorso p1 e un percorso p2 sono composti da hops diversi internamente al g-nodo g per raggiungere uno stesso arco α che collega il g-nodo g al g-nodo h, allora i 2 percorsi p1 e p2 sono indistinguibili per il nodo n.

Di conseguenza, il nodo ng è interessato a ricevere informazioni su percorsi che toccano g e poi escono da g attraverso l'arco α solo se si tratta del miglior percorso (con costo minore) che esce da g attraverso l'arco α. Quindi il messaggio m prodotto da v deve contenere anche:

  • Per ogni percorso pP:

    • Per ogni livello i da 1 a l-1:

      • Un booleano che dice se p è interessante per il nodo nvi.

La valorizzazione di questo booleano procede così:

  • Per ogni percorso pP:

    • Per ogni livello i da 1 a l-1:

      • Se la destinazione di p ha livello maggiore o uguale a i, cioè p.hops.last().lvl ≥ i:

        • Sia j il più piccolo valore tale che p.hops[j].lvl ≥ i.

        • Il booleano vale True se e solo se è questo il miglior percorso da v verso p.hops[j] tramite p.arcs[j].

      • Altrimenti:
        • Il booleano vale False. Infatti il percorso p verrà comunque scartato da n per la grouping rule.

Informazioni aggiuntive riguardo la destinazione

Si consideri il nodo n vicino di v che riceve questo messaggio m tramite un suo arco. Oltre al set di percorsi P contenuto in m, il nodo n intrinsecamente riceve un percorso verso il massimo distinto g-nodo di v per n. Sia i il livello di questo g-nodo, indichiamo questo g-nodo con vi. Il nodo n vorrà memorizzare nella sua mappa questo percorso e dovrà quindi essere informato sulle informazioni aggiuntive di cui abbiamo parlato in precedenza, cioè il fingerprint di vi e il numero di nodi all'interno di vi. Siccome il nodo v quando trasmette l'ETP m non conosce il livello i (poiché il messaggio m potrebbe essere inviato in broadcast e raggiungere diversi vicini) allora v dovrà aggiungere ad m queste informazioni per tutti i g-nodi a cui appartiene ad ogni livello. Quindi il messaggio m prodotto da v deve contenere anche:

  • Per ogni livello i da 0 a l-1:

    • Il fingerprint del g-nodo vi.

    • Il numero di nodi stimato all'interno del g-nodo vi.

Netsukuku/ita/docs/ModuloQSPN/EsplorazioneRete (last edited 2016-07-28 08:52:21 by lukisi)