# data[].attributes.body
Un grafo può essere rappresentato dalla sua matrice di adiacenze A, di dimensione |V|x|V| (In cui V = numero di nodi) in cui il generico elemento aij indica la distanza tra i due nodi

# data[].attributes.body
Infine si esegue un cotrollo calcolando in senso opposto il percorso migliore

# data[].attributes.body
Si continua a ripetere l'operazione fino ad aver calcolato tutti i percorsi, senza lasciare nessun nodo fuori

# data[].attributes.body
Si esegue il  calcolo dei pesi tra tutti i nodi collegati, sommandoli  a quello del nodo scelto.

# data[].attributes.body
Si calcola, facendo un salto, il peso con i nodi collegati. Poi si sceglie il percorso con il peso minore

# data[].attributes.body
Per creare i nodi si suddivide il lavoro in fasi per istanti di tempo(t0-t1-t2..ecc...) in ogni fase si migliora i percorsi dei nodi.

# data[].attributes.body
Utilizzando i dati della matrice si determina un percorso migliore per creare dei nodi.

# data[].attributes.body
Si crea una matrice (tabella) dove al suo interno si inseriscono tutti i percorsi minimi della rete.

# data[].attributes.body
Il grafo ad Albero è un grafo non orientato, connesso e aciclico (privo di cicli)

# data[].attributes.body
Per trovare il percorso giusto bisogna tener conto non del numero di salti fra i vari host ma della somma dei pesi. La somma minore

# data[].attributes.body
Il Minimum spanning sono un insieme di operazioni necessarie per trovare il "percorso minimo" del grafo. Viene eseguito su grafi pesati, non orientato e connesso.

# data[].attributes.body
Gli archi vengono associati da un'etichetta, solitamente rappresentata come un numero reale

# data[].attributes.body
Gli archi non hanno un verso di percorrenza, quindi il percorso A-B è identico a B-A

# data[].attributes.body
Gli archi hanno un verso di percorrenza.
Quindi il percorso A-B è diverso da B-A

# data[].attributes.body
È una coppia di nodi collegati
Un grafo è un insieme di archi

# data[].attributes.body
È una rappresentazione matematica di una rete

# data[].attributes.body
Insieme di nodi di Commutazione interconnessi da collegamenti

# data[].attributes.body
Si sceglie un nodo da cui partire

# data[].attributes.body
Trovare il shortest path partendo da un determinato nodo.

# data[].attributes.body
IP : 131.175.123.132
eth0 : 131.175.123.235    NM1 : 255.255.255.0
eth1 : 130.175.123.129    NM1 : 255.255.255.0

Network           Netmask           Port
IP1 130.170.0.0     255.255.0.0       1
IP2 130.171.0.0     255.255.0.0       2
0.0.0.0              0.0.0.0       3    [DEFAULT GATEWAY]
Per prima cosa si esegue l' operazione di AND tra ogni porta  eth e di Network con le rispettive NM (convertendo tutti gli indirizzi in binario).

eth0 and NM1
eth0 10000011.10101111.01111011.11101011
NM1 11111111.11111111.11111111.00000000
res1   10000011.10101111.01111011.00000000
131.            175.           123.               0

eth1 and NM2
130.175.123.0

IP1 and NM3
130.170.0.0

IP2 and NM4
130.171.0.0

Il matching dell' indirizzo IP può corrispondere a una porta eth o ad una o più porte di Network, e in caso non venisse trovato alcun matching in entrambi i casi il pacchetto verrà instradato nell' ultima porta chiamata di default gateway (in questo caso la 3).

Per verificare il matching occorre effettuare l' operazione di AND tra il nostro indirizzo e la NM della porta eth e (se non c' è alcuna corrispondenza) delle porte Network di cui vogliamo eseguire il matching (dalla porta eth0 alla IP2).
Il matching avverrà quando entrambe le operazioni di AND (porta eth/Network AND NM e IP AND NM) daranno lo stesso risultato.

IP and NM1
IP       10000011.10101111.01111011.10000100
NM1  11111111.11111111.11111111.00000000
131.           175.           123.                0
Eth0 and NM1 = IP AND NM1  -----> C' è matching: pacchetto instradato verso la porta 1

N.B. : Non è necessario continuare il matching quando si è gia trovata una corrispondenza con un indirizzo eth, ma è corretto farla su tutti gli indirizzi di Network per avere più porte a disposizione.

# data[].attributes.body
Determinare il percorso minimo tra due nodi della rete .

# data[].attributes.body
Supponiamo di avere 3 indirizzi :
N                              M                       NH
80.10.2.138  255.255.255.0   80.10.2.130
80.10.0.0       255.255.255.0   80.10.2.130

80.10.1.0       255.255.255.0  80.10.2.130
Per aggregarle prendiamo i numeri comuni all'indirizzo N e trasformiamo il numero dopo in binario.
80.10.00000010
80.10.00000000
80.10.00000001
L'indirizzo in comune a tutti e tre è:
80.10.000000.
Ora procediamo a cambiare la subnet mask ponendo i bit dell' ip 80.10.000000
a 1 nella nuova subnet mask così facendo otteniamo :
Sm: 255.255.11111100 = 255.255.252;
L'indirizzo posto nella tabella finale sarà quindi  :
N                          M                           NH
80.10.0.0      255.255.252.0       80.10.2.130

# data[].attributes.body
Data una tabella di routing in cui sono specificati Network, Netmask, Next Hop e Porta. Possono esserci anche delle porte eth in cui possono essere inoltrati i pacchetti.

# data[].attributes.body
Quando più indirizzi nella tabella di routing contengono lo stesso next hop  si può decidere di aggregarle, lo facciamo per diversi motivi.

Abbiamo più spazio nella tabella di routing.

Il router esegue i calcoli più velocemente

# data[].attributes.body
Il routing (o instradamento) è l'operazione che permette la comunicazione tra un mittente e un destinatario. Viene eseguito da: router, switch e hub.

È basato sul funzionamento del livello Network della TCP/IP. Questo, infatti, è in grado di:
1. riconoscere la topologia di rete;
2. scegliere l'instradamento migliore;
3. gestire il flusso di dati, le congestioni di rete e l'internetworking.

Il routing può essere di tipo implicito (Instradamento diretto) o di tipo esplicito (Instradamento indiretto).
L'instradamento diretto avviene all'interno della stessa rete e, quindi, il pacchetto viene spedito direttamente al destinatario.
L'instradamento indiretto, invece, è una comunicazione tra più reti e si esegue il Next-Hop da un router all'altro.

Per distinguere tra instradamento diretto e indiretto si esegue l'operazione AND tra gli indirizzi IP del mittente e del destinatario e la Subnet Mask.

# data[].attributes.body
Il router è un computer dedicato, progettato per eseguire compiti specifici.

Il router  ha le stesse componenti base del PC (CPU, memoria, system bus, interfaccia I/O).
I componenti principali del router sono:

1. Porte d'ingresso (#≥2);

2. Porte d'uscita (#≥2);

3. Matrice di commutazione (collega ogni porta d'ingresso a ogni porta d'uscita);

4. Processore di controllo (RAM, ROM, NVRAM, Flash Memory).

Il router svolge 2 funzioni fondamentali:

1. Crea e gestisce le tabelle di routing (Routing Table) e comunica (tramite il Routing Protocol) ogni sua variazione di stato agli altri router (tutti i router aggiornano la topologia di rete);

2. Determina il percorso d'instradamento di un pacchetto tramite le Routing Table (gestita dalla ROM).

I router cisco hanno 3 modalità:

1. ROM Monitor: esegue il Bootstrap che comprende le funzionalità di basso livello, recupera il sistema in caso di System Failure e si può accedere solo da console;

2. Boot ROM: permette di effettuare operazioni di scrittura sulla flash memory e può sostituire l'IOS;

3. Cisco IOS: esegue tutte le funzionalità del router, sia semplici che complesse.

Lo startup del router è simile a quello di un computer. Carica il Bootstrap, il sistema operativo e il file di configurazione. All'accensione, il router compie un Power-On-Self-Test(POST), eseguendo i test di diagnostica su ROM e su tutti i componenti hardware, verificando anche le operazioni base della memoria, della CPU e delle interfacce. Se i test hanno esito positivo, esegue il caricamento del Bootstrap. Il Bootstrap testa l'hardware e legge dal campo boot la locazione da usare per caricare l'IOS.
Il file di configurazione caricato nella memoria principale viene letto dalla NVRAM (Non-Volatile Ram) avviando il processo di routing e definendo altre caratteristiche del router. Se il file nella NVRAM non è valido si cerca nel server Trivial File Transfer Protocol(TFTP), in caso di ulteriore fallimento si entra nella Setup Mode (che permette all'amministatore di rete di crearne uno).

Il Setup iniziale ha lo scopo di permettere all'amministratore di installare una configurazione base del router.

# data[].attributes.body
Opzionale. Rappresenta il costo che il router deve affrontare per inviare il pacchetto. Basato su logiche "Best Effort" e sulla priorità del pacchetto. Può variare con l'aggiunta o l'eliminazione di alcuni router.

# data[].attributes.body
Indica il "prossimo balzo" che il pacchetto deve fare per raggiungere la destinazione. Può rappresentare l'indirizzo dell'host o di un altro router. Può variare con l'aggiunta o l'eliminazione di alcuni router.

# data[].attributes.body
È la porta d'uscita del router che il pacchetto deve prendere per eseguire il Next-Hop

# data[].attributes.body
La maschera di rete dipende dalla classe dell'indirizzo di destinazione (es. Classe A=255.0.0.0; Classe B=255.255.0.0; Classe C=255.255.255.0).

# data[].attributes.body
Ogni pacchetto, per giungere a destinazione, può percorrere percorsi diversi. In questo caso può essere presente più volte lo stesso indirizzo di destinazione ma rappresenterà più percorsi diversi.

# data[].attributes.body
Tramite le tabelle di routing, il router è in grado di compiere l'operazione di instradamento. Le tabelle di routing vengono aggiornate dal router ad ogni cambiamento della mappatura di rete (es. ad ogni spegnimento e/o accensione).
Ogni tabella è composta da diverse "entries" (o righe).
In alcune tabelle si ha, come ultima entry, un Default Gateway che serve per inoltrare i pacchetti in un'altra sottorete per consentire al destinatario di tornare operativo.

Ogni entry ha i seguenti elementi: