Struttura router

Pasted image 20231004094529.png
La figura sopra mostra la struttura di un router.
A sinistra abbiamo le porte di input, mentre a destra abbiamo le porte di output. In alto abbiamo il processore di instradamento e al centro la struttura di commutazione.

  • Porte di input: svolgono funzioni a livello fisico di terminazione di un collegamento in ingresso al router; svolgono anche funzioni a livello di collegamento (i riquadri in azzurro nelle porte di ingresso e uscita). Svolgono anche la funzione di ricerca (riquadri in rosso nelle porte di input), in modo che il pacchetto inoltrato nella struttura di commutazione del router esca sulla porta di uscita corretta. (Con porta ci riferiamo alle porte fisiche del router e non alle porte dei servizi che abbiamo discusso nei capitoli 2 e 3).
  • Struttura di commutazione: connette fisicamente le porte di ingresso e uscita.
  • Porte di uscita: memorizzano i pacchetti che provengono dalla struttura di commutazione e li trasmettono sul collegamento in uscita, operando le funzionalità necessarie del livello di collegamento e fisico. Nei collegamenti bidirezionali, alla porta di uscita su un collegamento è affiancata anche una porta di ingresso.
  • Processore di instradamento: esegue le funzioni del piano di controllo. Nei router tradizionali, esegue i protocolli di instradamento, gestisce le tabelle di inoltro e le informazioni sui collegamenti attivi, ed elabora la tabella di inoltro per il router. Nei router SDN il processore di instradamento è responsabile della comunicazione con il controller remoto, in modo da ricevere le tabelle di inoltro da installare alle porte di ingresso. Inoltre effettua operazioni di gestione della rete che vedremo nel capitolo 5.

Un router è implementato via hardware. Il tempo di risposta del piano dei dati di un router opera nell'ordine dei nanosecondi. Mentre il piano di controllo soprattutto nel caso di SDN opera nell'ordine dei millisecondi/secondi.

Vediamo una analogia che ci aiuta a comprendere bene i compiti dei componenti del router.
Immaginiamo che una vettura debba recarsi ad un certa destinazione e che conosca solo la destinazione finale, e non il percorso. Giunto ad un rotonda, ad un casello, mostra all’operatore la sua destinazione, l’operatore gli consiglia l’uscita adatta alla sua destinazione (inoltro basato su destinazione). Bisogna sapere che l’inoltro può anche essere stabilito in base anche ad altri fattori: provenienza della vettura, marca, targa, stato di produzione, ecc. (Questo sarebbe l'inoltro generalizzato).
Strada di entrata al casello: porte di ingresso
Rotonda: struttura di commutazione
Strada di uscita dalla rotonda: porte di uscita
L’addetto: processore di instradamento.

Elaborazione alle porte di ingresso e inoltro basato su indirizzo di destinazione
...

Pasted image 20231004100901.png
La figura sopra fornisce una visione dettagliata delle funzionalità delle porte di ingresso. Come abbiamo già detto, la funzione di terminazione (elettrica) delle linea e l'elaborazione a livello di collegamento implementano rispettivamente il livello fisico e di collegamento associati ad un singolo collegamento di ingresso ai router. L'elaborazione effettuata alla porta di ingresso è centrale per la funzionalità del router: è qui che, utilizzando le informazioni della tabella di inoltro, viene determinata la porta di uscita a cui dirigere un pacchetto attraverso la struttura di commutazione. La tabella di inoltro viene elaborata e aggiornata dal processore di instradamento o ricevuta da un controller SDN remoto. Una sua copia conforme è di solito memorizzata su ciascuna porta di ingresso. La tabella di inoltro è copiata sulla line card (modulo rosso nella porta) dal processore di instradamento attraverso un bus separato (vedi immagine precedente, vi è una freccia che va dal processore di instradamento alle line card).
Consideriamo il caso più semplice in cui l’inoltro è basato sull’indirizzo di destinazione. Supponiamo che tutti gli indirizzi di destinazione siano a 32 bit. Una implementazione elementare della tabella di inoltro presenterebbe una riga per ogni possibile indirizzo di destinazione, ma dato che esiste un vasto range di indirizzi, questa idea non viene presa in considerazione. Supponiamo che il router che stiamo considerando abbia 4 uscite, una tabella di inoltro sarebbe simile alla seguente:
Pasted image 20231004101847.png
Ad ogni porta di uscita è associato un range di indirizzi.
Nell'ultima porta, la 3, vengono inoltrati tutti i pacchetti con indirizzo di destinazione che non corrispondono con i range stabiliti per le altre porte (0, 1, 2).
Potremmo avere anche qualcosa del genere:
Pasted image 20231004102235.png
La figura chiede di stabilire l'interfaccia per due indirizzi:

  • il primo indirizzo deve essere inviato all'uscita 0, il terzo gruppo di bit ha 00010 che è l'unico presente tra gli indirizzi della tabella della figura
  • il secondo indirizzo corrisponde a più porte: 1 e 2. Quale va scelta? Va scelta la prima poiché nell'interfaccia 1 vi è una corrispondenza con l'indirizzo specificato di 24 bit, mentre nella seconda di 21.
    In questi casi i router fanno valere la regola della corrispondenza a prefisso più lungo.

Una volta determinata la porta di uscita di un pacchetto, esso viene inviato alla struttura di commutazione. Un pacchetto può essere fermato prima di entrare nella struttura di commutazione, se essa è utilizzata da altre porte di ingresso. Esso verrà accodato sulla porta di input e schedulato sulla struttura di commutazione più tardi. A questo punto vengono fatte anche tante altre operazioni come il controllo del tempo di vita, del checksum, ecc.

Chiudiamo la discussione sull'elaborazione alle porte di ingresso notando che l'azione di cercare la corrispondenza tra l'indirizzo IP di destinazione (match) e poi inviare il pacchetto verso la porta di uscita specificata attraverso la struttura di commutazione (action), fa parte di un'astrazione più generale match-action che viene eseguita in molti dispositivi di rete non solo i router.

Struttura di commutazione
...

La commutazione può avvenire in diversi modi:

  • Commutazione in memoria: i primi e semplici router funzionavano come dispositivi di I/O. Quando sopraggiungeva un pacchetto, la porta di ingresso ne segnalava l’arrivo con un interrupt, lo copiava nella memoria del processore di instradamento che procedeva a estrarre dall’intestazione del datagramma l’indirizzo di destinazione. Tramite la tabella di inoltro veniva individuata la porta di uscita nel cui buffer veniva copiato il pacchetto. Notiamo che con questo sistema due pacchetti non possono essere inoltrati contemporaneamente anche se giungono su due porte di ingresso differenti e destinate a porte di uscita differenti, poiché il processore può effettuare una operazione per volta.
  • Commutazione tramite bus: le porte di ingresso trasferiscono i pacchetti direttamente alle porte di uscita tramite un bus condiviso e senza l’intervento del processore di instradamento. Questo viene fatto aggiungendo un campo con la porta d’uscita su cui deve essere trasferito una volta trasmesso sul bus. Tutte le porte di uscita sono raggiungibili dai pacchetti che partono dalle porte di ingresso, ma solo una porta di uscita è designata per il ricevimento del pacchetto in questione, il campo aggiunto viene rimosso nella struttura di commutazione. Il bus viene interamente occupato da un pacchetto per l’inoltro, quindi se ci sono più pacchetti sulle porte di ingresso tutti tranne uno dovranno aspettare.
  • Commutazione attraverso rete di interconnessione: supera i limiti imposti dal bus condiviso.

Pasted image 20231004111550.png
Quella che vediamo sopra è un matrice di commutazione derivata da una rete di interconnessione.
Abbiamo un bus per ogni porta. Le porte di ingresso (A, B, C) immettono i pacchetti nel bus e una porta di uscita (X, Y, Z) prende il pacchetto. Se è il numero di porte di ingresso/uscita allora ci sono bus che collegano porte di ingresso a porte di uscita.
Ogni bus verticale, interseca tutti gli altri bus orizzontali.
Se A vuole raggiungere Y, il controller chiude l'incrocio AY, la porta A invia il pacchetto sul suo bus e solo il bus Y lo riceverà. Gli altri bus possono inoltrare pacchetti non diretti a Y, dunque i bus X e Z possono ricevere da B o C.
La velocità con cui i pacchetti vengono trasferiti dalle porte di input a quelle di output può essere migliorata utilizzando diverse (N) strutture di commutazione in parallelo. La porta di ingresso suddivide il pacchetto in K pezzi (chunk) più piccoli, e li invia (spray) attraverso K di queste N strutture di commutazione in parallelo alla porta di uscita selezionata, che li riassemble nel pacchetto originale.

Elaborazione alle porte di uscita
...

L'elaborazione alle porte di uscita prende un pacchetto dalla memoria delle porte di uscita e li trasmette sul collegamento in uscita.
Quella di seguito è una porta di uscita.
Pasted image 20231004124627.png
É ovvio che si possono formare code di accodamento sia sulle porte in ingresso, sia in quelle in uscita. Gli accodamenti dipendono dal traffico di rete, dalle velocità relative della struttura di commutazione e dalla linea. Quando le code crescono, la memoria del router può esaurirsi e può avvenire una perdita di pacchetti, che si verifica effettivamente in questo contesto.
Supponiamo che le velocità di linea di input e output abbiano tutte lo stesso tasso di trasmissione pacchetti al secondo e che ci siano porte di input e di output. Per semplicità diciamo che tutti i pacchetti abbiano la stessa dimensione e arrivino in modo sincrono in tutte le porte di input. Questo vuol dire che se è uguale per le porte in ingresso e quelle in uscita e che se i pacchetti hanno la stessa dimensione e arrivano tutti insieme (in gruppo, uno per porta), la velocità con cui entrano nelle porte di ingresso è uguale alla velocità con cui escono dalle porte di uscita. Nell'intervallo di processamento dalla struttura di commutazione possono arrivare su un collegamento di input un pacchetto o nessun pacchetto. Definiamo il tasso di trasferimento della struttura di commutazione. Se è volte più veloce di , l'accodamento alle porte di input sarà trascurabile, poiché anche nel caso peggiore in cui i pacchetti arrivino su tutte le linee di input e debbano essere inoltrati alla medesima porta di output, ogni gruppo di pacchetti, uno per porta di input, può essere elaborato dalla struttura di commutazione prima dell'arrivo del successivo gruppo di pacchetti.

Accodamento in ingresso
...

Ma cosa avviene se la struttura di commutazione non è abbastanza rapida?
In questo caso si verifica accodamento alle porte di ingresso.
Per illustrare le conseguenze di questo evento, consideriamo una struttura di commutazione facente uso di una rete di interconnessione e supponiamo che:

  1. le velocità di tutti i collegamenti siano identiche,
  2. un pacchetto possa essere trasferito da qualsiasi porta di ingresso ad un data porta di uscita nello stesso intervallo di tempo richiesto affinché un pacchetto sia ricevuto su un collegamento in ingresso (porta di ingresso),
  3. I pacchetti in ingresso vengono inviati sulle porte di uscita desiderate in modalità FCFS (First come first served)
    Sappiamo che con una rete di interconnessione possiamo trasferire più pacchetti in modo parallelo se hanno porte di destinazione differenti. Tuttavia se due pacchetti in ingresso, su due porte differenti, sono destinati alla stessa porta in uscita, un pacchetto verrà processato, mentre l'altro rimarrà bloccato in attesa di essere processato.
    La parte superiore della figura in basso mostra proprio questo caso.
    Supponiamo che la struttura di commutazione scelga di trasferire il primo pacchetto della coda in alto a sinistra (la prima). In questo caso, il pacchetto nella coda in basso a sinistra (la terza) deve attendere, così come quello dietro di lui, anche se quel pacchetto non deve andare nella prima porta di uscita a destra. Questo fenomeno è noto come HOL (head of the line blocking).
    Pasted image 20231004130709.png
Accodamento in uscita
...

Immaginiamo ancora che sia volte più veloce di e che i pacchetti che giungono alle porte di ingresso siano tutti destinati alla stessa porta di uscita; quindi, nel tempo richiesto per ricevere (o inviare) un singolo pacchetto, in questa porta di uscita arriveranno nuovi pacchetti (uno da ogni porta di ingresso). Dato che la porta di uscita può trasmettere un solo pacchetto in un intervallo prestabilito (tempo di trasmissione del pacchetto), gli pacchetti in arrivo dovranno mettersi in coda per la trasmissione sul collegamento in uscita. Di conseguenza, è possibile che giungano altri pacchetti nel periodo necessario per trasmettere solo uno degli pacchetti già accodati e così via. Quindi è possibile che si formino code di pacchetti alle porte di uscita anche quando la struttura di commutazione è volte più rapida delle velocità delle linea delle porte. Il numero dei pacchetti in coda può continuare a crescere fino a esaurire lo spazio di memoria sulla porta di uscita. In assenza di sufficiente memoria per inserire nel buffer il nuovo pacchetto in ingresso, occorrerà stabilire se scartarlo (politica drop-tail, eliminazione in coda) o se rimuoverne uno o più tra quelli in coda per far posto al nuovo arrivato.
Si osservi la figura in basso, in cui è esemplificato l'accodamento alle porte di uscita.
All'istante , a ciascuna delle porte di ingresso giunge un pacchetto destinato alla prima porta di uscita a destra. Ipotizzando velocità di linea identiche e un commutatore che opera al triplo di questa velocità, nell'unità di tempo dopo, cioè dopo il tempo richiesto per ricevere o inviare un pacchetto, i tre pacchetti originali sono stati trasferiti sulla porta in uscita e sono accoda in attesa di trasmissione. Il motivo dell'accodamento è il seguente: arrivano in ciascuna unità di tempo 3 pacchetti con una certa velocità, diciamo , i pacchetti vengono processati dal commutatore con velocità il che vuol dire che si riesce e dirigere tutti e tre i pacchetti verso la loro porta di uscita di destinazione. La velocità con cui vengono processati i pacchetti nella porta di uscita è la stessa di quella delle porte in ingresso: . Questo vuol dire che prima ancora che i pacchetti saranno stati processati ce ne saranno altri in arrivo.
Pasted image 20231004132051.png
Quando vi sono più pacchetti accodati sulle porte di uscita uno schedulatore di pacchetti (packet scheduler) deve stabilire in quale ordine trasmetterli.

Schedulazione di pacchetti
...

Non ci addentreremo nella discussione di tali algoritmi di scheduling, dato che per il lettore dovrebbe già essere stati ampiamente trattati nel corso di sistemi operativi.

  • FIFO (FCFS): il primo ad entrare è il primo ad uscire
  • Code con priorità: i pacchetti con informazioni di rete per esempio hanno la priorità sul traffico utenti, o ancora i pacchetti che trasportano dati di applicazioni VoIP (chiamate di rete) che devono essere prossime al trasferimento in tempo reale, hanno priorità sui pacchetti di app non in tempo reale (SMTP, IMAP).
    Pasted image 20231009185953.png
    Nel grafico mostrato sopra, la priorità dei pacchetti più scuri è maggiore di quella dei pacchetti più chiari. Come si vede dal grafico, il pacchetto numero 1 è il primo ad arrivare ed è il primo ad essere servito, arrivano poi il pacchetto 2 e 3. Il pacchetto 3 ha una priorità maggiore del pacchetto 2, dunque il pacchetto 3 viene processato prima del pacchetto 2. Nella modalità di accodamento non-preemptive non è possibile interrompere la trasmissione di un pacchetto verso un collegamento di uscita a favore di un nuovo arrivato con priorità più alta.
  • Round Robin e accodamento equo ponderato (WFQ): i pacchetti sono suddivisi in classi, le classi non hanno delle priorità, servono solo per avere una sequenza ciclica. Se ci sono due classi: A e B, prima viene inviato un pacchetto della classe A, poi B, poi A e poi B, e così via.
    Nella modalità conservativa, round robin non è mai inattivo, ogni volta che una classe non ha pacchetti da trasmettere, viene subito controllata la classe seguente, finché non se ne trova una con qualche pacchetto.
    Nella modalità di accodamento equo-ponderato (weighted fair queuing) ci sono sempre le classi. Anche WFQ ha una modalità conservativa, come quella descritta sopra.
    Pasted image 20231009190453.png
    Ciascuno dei buffer (3 in figura) sono le classi e sono indicate con la lettera .
    I pacchetti in arrivo vengono classificati in base alla classe.
    Prima vengono spediti i pacchetti della classe , poi quelli di e poi quelli di , dopo di ciò, si ricomincia da capo.
    Diversamente da round robin, in WFQ le classi possono ricevere un servizio differenziato. In particolare a ciascuna classe è assegnato un peso . In qualsiasi momento in cui nella coda sono presenti pacchetti che debbano essere spediti, WFQ garantisce che questi ricevano una frazione di servizio pari a: Dove denominatore è indicata la somma effettuata su tutte le classi che hanno pacchetti da trasmettere. Anche nel caso peggiore, quando tutti i gruppi hanno pacchetti accodati, la classe avrà garanzia di ricevere una certa frazione di larghezza di banda. Quindi per un collegamento con capacità trasmissiva , la classe avrà sempre un rendimento pari a: La descrizione di WFQ è idealizzata poiché i pacchetti, essendo delle unità discrete, e il loro invio non può essere interrotto per iniziare un'altra trasmissione.