5) Il livello tre (Network)

Il livello network è incaricato di muovere i pacchetti dalla sorgente fino alla destinazione finale, attraversando tanti sistemi intermedi (router) della subnet di comunicazione quanti è necessario.

Ciò è molto diverso dal compito del livello data link, che è di muovere informazioni solo da un capo all'altro di un singolo canale di comunicazione wire-like.

Le incombenze principali di questo livello sono:

Nel progetto e nella realizzazione del livello network di una architettura di rete si devono prendere decisioni importanti in merito a:

5.1) Servizi offerti

In merito ai servizi offerti al livello superiore, ci sono (come abbiamo già accennato) due tipologie fondamentali di servizi:

In proposito, ci sono due scuole di pensiero:

La prima scuola di pensiero afferma che il livello network deve fornire un servizio sostanzialmente affidabile e orientato alla connessione. In questa visione, succede che:

La seconda scuola di pensiero ritiene invece che la sottorete debba solo muovere dati e nient'altro:

Di fatto, il problema è dove mettere la complessità della realizzazione:

In realtà le decisioni sono due, separate:

Le scelte più comuni sono di offrire servizi connection oriented affidabili oppure servizi connectionless non affidabili, mentre le altre due combinazioni, anche se tecnicamente possibili, non sono diffuse.

5.2) Organizzazione interna della subnet

Questo è un problema separato ed indipendente da quello dei servizi offerti, anche se spesso c'è una relazione fra i due.

Una subnet può essere organizzata con un funzionamento interno:

Ognuna delle due organizzazioni della subnet sopra viste ha i suoi supporter e i suoi detrattori, anche sulla base delle seguenti considerazioni:

Subnet basata

su connessioni
Subnet

connectionless
Banda

trasmissiva

Minore

(piccole ID

in ogni pacchetto)
Maggiore

(intero indirizzo di dest.

in ogni pacchetto)
Spazio sui router
Maggiore

(strutture dati

per i circuiti virtuali)
Minore
Ritardo per il setup
Presente
Assente
Ritardo per il routing
Assente
Presente
Congestione
Minore

(risorse allocate

in anticipo)
Maggiore

(possibile in ogni momento)
Vulnerabilità
Alta
Bassa


Dev'essere chiaro che i servizi offerti sono indipendenti dalla realizzazione interna della subnet. E' possibile avere tutte le quattro combinazioni di servizio offerto e implementazione della subnet:

5.3) Algoritmi di routing

La funzione principale del livello network è di instradare i pacchetti sulla subnet, tipicamente facendo fare loro molti hop (letteralmente, salti) da un router ad un altro.

Un algoritmo di routing è quella parte del software di livello network che decide su quale linea di uscita instradare un pacchetto che è arrivato:

Da un algoritmo di routing desideriamo:

Purtroppo, gli ultimi due requisiti sono spesso in conflitto fra loro; inoltre, a proposito dell'ottimalità, non sempre è chiaro cosa si voglia ottimizzare. Infatti, supponiamo che si vogliano:

Si scopre facilmente che questi due obiettivi sono in conflitto fra loro, perché di solito aumentare il throughput allunga le code sui router e quindi aumenta il ritardo: questo è vero per qualunque sistema basato su code gestito in prossimità della sua capacità massima.

Gli algoritmi di routing si dividono in due classi principali:

Gli algoritmi adattivi differiscono fra loro per:

5.3.1) Il principio di ottimalità

E' possibile fare una considerazione generale sull'ottimalità dei cammini, indipendentemente dallo specifico algoritmo adottato per selezionarli.

Il principio di ottimalità dice che se il router j è nel cammino ottimo fra i e k, allora anche il cammino ottimo fra j e k è sulla stessa strada:


Figura 5-1: Principio di ottimalità

Se così non fosse, ci sarebbe un altro cammino (ad es. quello tratteggiato in figura) fra j e k migliore di quello che è parte del cammino ottimo fra i e k, ma allora ci sarebbe anche un cammino fra i e k migliore di quello ottimo.

Una diretta conseguenza è che l'insieme dei cammini ottimi da tutti i router a uno specifico router di destinazione costituiscono un albero, detto sink tree per quel router.

In sostanza, gli algoritmi di routing cercano e trovano i sink tree relativi a tutti i possibili router di destinazione, e quindi instradano i pacchetti esclusivamente lungo tali sink tree.

5.3.2) Algoritmi statici

Questi algoritmi, come abbiamo già accennato, sono eseguiti solamente all'avvio della rete, e le decisioni di routing a cui essi pervengono sono poi applicate senza più essere modificate.

Esamineremo i seguenti algoritmi statici:

Shortest path routing

L'idea è semplice: un host di gestione della rete mantiene un grafo che rappresenta la subnet:

All'avvio della rete (o quando ci sono variazioni permanenti della topologia) l'algoritmo:

Quale sia il cammino minimo dipende da qual'è la grandezza che si vuole minimizzare. Tipicamente si usano:

Flooding

La tecnica del flooding consiste nell'inviare ogni pacchetto su tutte le linee eccetto quella da cui è arrivato.

In linea di principio il flooding può essere usato come algoritmo di routing (ogni pacchetto inviato arriva a tutti i router) ma presenta l'inconveniente di generare un numero enorme (teoricamente infinito!) di pacchetti.

Ci sono delle tecniche per limitare il traffico generato:

Il flooding non è utilizzabile in generale come algoritmo di routing, però:

Flow-based routing

Questo algoritmo è basato sull'idea di:

Le informazioni necessarie per poter applicare l'algoritmo sono:

Vengono fatte le seguenti assunzioni:

Dai ritardi calcolati per le singole linee si può calcolare il ritardo medio dell'intera rete, espresso come somma pesata dei ritardi delle singole linee. Il peso di ogni linea è dato dal traffico su quella linea diviso il traffico totale sulla rete.

Il metodo nel suo complesso funziona così:

5.3.3) Algoritmi dinamici

Nelle moderne reti si usano algoritmi dinamici, che si adattano automaticamente ai cambiamenti della rete. Questi algoritmi non sono eseguiti solo all'avvio della rete, ma rimangono in esecuzione sui router durante il normale funzionamento della rete.

Distance vector routing

Ogni router mantiene una tabella (vector) contenente un elemento per ogni altro router. Ogni elemento della tabella contiene:

Per i suoi vicini immediati il router stima direttamente la distanza dei collegamenti corrispondenti, mandando speciali pacchetti ECHO e misurando quanto tempo ci mette la risposta a tornare.

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Quando un router riceve le nuove informazioni, calcola una nuova tabella scegliendo, fra tutte, la concatenazione migliore

se stesso -> vicino immediato -> router remoto di destinazione

per ogni destinazione.

Ovviamente, la migliore è la concatenazione che produce la minore somma di:

L'algoritmo distance vector routing funziona piuttosto bene, ma è molto lento nel reagire alle cattive notizie, cioè quando un collegamento va giù. Ciò è legato al fatto che i router non conoscono la topologia della rete.

Infatti, consideriamo questo esempio:

A     B     C     D     E   <- Router
*-----*-----*-----*-----*   <- Collegamenti (topologia lineare)
      1     2     3     4   <- Distanze da A

Se ora cade la linea fra A e B, dopo uno scambio succede questo:

A     B     C     D     E   <- Router
*     *-----*-----*-----*   <- Collegamenti
      3     2     3     4   <- Distanze da A (dopo uno scambio)

Ciò perché B, non ricevendo risposta da A, crede di poterci arrivare via C, che ha distanza due da A. Col proseguire degli scambi, si ha la seguente evoluzione:

A     B     C     D     E   <- Router
*     *-----*-----*-----*   <- Collegamenti
      3     4     3     4   <- Distanze da A (dopo due scambi)
      5     4     5     4   <- Distanze da A (dopo tre scambi)
      5     6     5     6   <- Distanze da A (dopo quattro scambi)
ecc.

A lungo andare, tutti i router vedono lentamente aumentare sempre più la distanza per arrivare ad A. Questo è il problema del count-to-infinity.

Se la distanza rappresenta il numero di hop si può porre come limite il diametro della rete, ma se essa rappresenta il ritardo l'upper bound dev'essere molto alto, altrimenti cammini con un ritardo occasionalmente alto (magari a causa di congestione) verrebbero considerati interrotti.

Sono state proposte molte soluzioni al problema count-to-infinity, ma nessuna veramente efficace.

Nonostante ciò, il distance vector routing era l'algoritmo di routing di ARPANET ed è usato anche in Internet col nome di RIP (Routing Internet Protocol), e nelle prime versioni di DECnet e IPX.

Link state routing

Sopratutto a causa della lentezza di convergenza del distance vector routing, si è cercato un approccio diverso, che ha dato origine al link state routing.

L'idea è questa:

I passi da seguire sono:

  1. scoprire i vicini e identificarli;
  2. misurare il costo (ritardo o altro) delle relative linee;
  3. costruire un pacchetto con tali informazioni;
  4. mandare il pacchetto a tutti gli altri router;
  5. previa ricezione degli analoghi pacchetti che arrivano dagli altri router, costruire la topologia dell'intera rete;
  6. calcolare il cammino più breve a tutti gli altri router.

Quando il router si avvia, invia un pacchetto HELLO su tutte le linee in uscita. In risposta riceve dai vicini i loro indirizzi (univoci in tutta la rete).

Inviando vari pacchetti ECHO, misurando il tempo di arrivo della risposta (diviso 2) e mediando su vari pacchetti si deriva il ritardo della linea.

Si costruisce un pacchetto con:

La costruzione e l'invio di tali pacchetti si verifica tipicamente:

La distribuzione dei pacchetti è la parte più delicata, perché errori in questa fase possono portare qualche router ad avere idee sbagliate sulla topologia, con conseguenti malfunzionamenti.

Di base si usa il flooding, inserendo nei pacchetti le coppie (source router ID, sequence number) per eliminare i duplicati. Tutti i pacchetti sono confermati. Inoltre, per evitare che pacchetti vaganti (per qualche errore) girino per sempre, l'età del pacchetto viene decrementata ogni secondo, e quando arriva a zero il pacchetto viene scartato.

Combinando tutte le informazioni arrivate, ogni router costruisce il grafo della subnet e calcola il cammino minimo a tutti gli altri router.

Il link state routing è molto usato attualmente:

5.3.4) Routing gerarchico

Quando la rete cresce fino contenere decine di migliaia di nodi, diventa troppo gravoso mantenere in ogni router la completa topologia. Il routing va quindi impostato in modo gerarchico, come succede nei sistemi telefonici.

La rete viene divisa in zone (spesso dette regioni):

Di conseguenza, ci solo due livelli di routing:


Figura 5-2: Routing gerarchico

I router interni mantengono nelle loro tabelle di routing:

I router di confine, invece, mantengono:

Non è detto che due livelli siano sufficienti. In tal caso il discorso si ripete su più livelli.


Torna al sommario | Vai avanti