SWITCHING AND ROUTING AA 2013-2014 Prof. Guido Mayer
REALIZZATO DA: TREMOLADA DENNY TROIA SEBASTIAN MOLA ANDREA
INDICE INTRODUZIONE 1. ARCHITETTURE DI INTERNET 1.1 IL PRESENTE 1.2 IL FUTURO 2. ARCHITETTURE DEI ROUTER 2.1 DESIGN DEI CORE ROUTER 3. IP ADDRESS LOOKUP 3.1 INTRODUZIONE 3.1.1 CLASSI DI INDIRIZZAMENTO 3.2 ALGORITMI DI LOOKUP BASATI SUGLI ALBERI 3.2.1 Binary trie 3.2.2 Path compressed trie 3.2.3 Multibit trie 3.2.4 Level compressed trie 3.2.5 Trie bitmap 3.2.6 Ricerca binaria basata sulla lunghezza dei prefissi 3.2.7 Ricerca binaria basata sull‟intervallo dei prefissi 3.3 ALGORITMI DI LOOKUP BASATI SULL‟HARDWARE 3.3.1 DIR-24-8 3.3.2 BC-16-16 3.3.3 Ternary CAM 3.3.3.1 Prefix pruning 3.3.3.2 Estensione della maschera 4. PACKET CLASSIFICATION 4.1 CLASSIFICAZIONE BASATA SUI TRIE 4.1.1 Trie gerarchici 4.1.2 Set pruning trie 4.1.3 Greed of tries 4.1.4 Schemi a due dimensioni 4.2 ALGORITMI GEOMETRICI 4.2.1 Cross-producting scheme 4.2.2 Bitmap intersection 4.3 ALGORITMI EURISTICI 4.3.1 Classificazione a flusso ricorsivo (RFC) 4.4 ALGORITMI BASATI SULLE TCAM 5. PACKET SWITCHING 5.2 SWITCH FABRIC 5.2.1 Time division switching (TDS) 5.2.2 Space division switching (SDS)
5.2.2.1 Single-path switches 5.2.2.1.1 Crossbar switch 5.2.2.1.2 Fully interconnected switches 5.2.2.1.3 Banyan-based switches 5.2.2.2 Multiple-path switches 5.2.2.2.1 Augmented Banyan Switches 5.2.2.2.2 Three-stage Clos Network 5.2.2.2.3 Multiplane switches 5.2.2.2.4 Recirculation switches 5.3 STRATEGIE DI BUFFERING 5.3.1 Shared-memory queuing 5.3.2 Output queuing (OQ) 5.3.3 Input queuing (IQ) 5.3.4 Virtual Output Queuing (VOQ) 5.3.5 Combined Input and Output Queuing (CIOQ) 5.3.6 Crosspoint Queuing 5.4 PERFORMANCE 6. SWITCHING-NETWORK THEORY 6.1 FULLY CONNECTION MULTISTAGE NETWORK 6.2 PARTIAL CONNECTION MULTISTAGE NETWORK 7. REARRANGEABLE NON BLOCKING NETWORK (RNB) 8. STRICTLY NON BLOCKING NETWORK (SNB) 9. INPUT-BUFFERED SWITCHES – VIRTUAL OUTPUT QUEUING 9.1 SCHEDULING IN VOQ-BASED SWITCHES 9.2 MAXIMUM MATCHING 9.2.1 Matching di peso massimo 9.2.2 Matching di peso massimo approssimato 9.2.3 Maximum Size Matching 9.3 MAXIMAL MATCHING 9.3.1 Parallel Iterative Matching (PIM) 9.3.2 Iterative Round-Robin Matching (iRRM) 9.3.3 Iterative Round-Robin con SLIP (iSLIP)
INTRODUZIONE Lo switching è un‟operazione di trasformazione eseguita su un dato dominio di multiplazione (tempo, frequenza, etc..). Lo switch è un elemento della rete che opera al livello 2 del modello ISO/OSI ed esegue una trasformazione dal dominio di multiplazione in ingresso al dominio in uscita. La complessità dello switching aumenta con la complessità del dominio di multiplazione (numero di ingressi, numero di uscite). Si comincia a parlare di multiplazione con la diffusione della rete telefonica che deve supportare conversazioni multiple nello stesso tempo (multiplazione a
divisione di spazio, prima centraliniste poi sistemi
automatizzati). Con il telefono digitale si è passati a una multiplazione gerarchica (PCM, PDH, SDH, etc..) digitale, e un dominio di multiplazione in spazio e tempo. Oggigiorno le reti ottiche moderne usano una multiplazione a divisione di lunghezza d‟onda (WDM), e un dominio a divisione di spazio e lunghezza d‟onda. In futuro si richiederanno sempre più accessi a Internet, e quindi una quantità di dati sempre maggiore. I limiti sono rappresentati dal consumo energetico e dal tempo di elaborazione dei dati che diminuisce all‟aumentare della capacità [bit/s]. All‟inizio c‟erano differenti reti sviluppate in modo indipendente (da università, centri di ricerca, etc..), usando protocolli e architetture differenti. Il compito di Internet è quello di interconnettere ogni tipo di rete, basandosi su protocolli interni e meccanismi di indirizzamento. Ci sono milioni di computer (detti host) connessi alla rete, e su questi vengono eseguite le applicazioni. Ci sono infrastrutture di comunicazione che supportano le applicazioni distribuite come web, file sharing e protocolli di comunicazione per inviare e ricevere messaggi. Questo può avvenire secondo 2 modelli: modello client-server, in cui il client chiede un servizio e il server glielo fornisce, e modello peer-to-peer, in cui tutti i terminali cooperano senza distinzioni di ruolo.
1. ARCHITETTURE DI INTERNET 1.1 IL PRESENTE Oggi Internet è un insieme di centinaia di provider di reti commerciali e di servizio per le reti. Non è ammissibile per un singolo provider connettere due nodi distanti in Internet. Pertanto, i provider spesso fanno affidamento uno con l‟altro per connettere i punti. Il loro operato dipende dalla dimensione operativa della rete, quindi gli Internet Service Provider (ISP) possono essere suddivisi in 3 grandi categorie, secondo un‟organizzazione gerarchica:
Tier-1 (copertura internazionale)
Tier-2 (copertura nazionale)
Tier-3 (copertura regionale)
Tra ISP dello stesso livello ci sono “peering link”, che consentono l‟interconnessione senza uno scambio di denaro. Al contrario, tra livelli di differente gerarchia ci sono “customer-provider link”, dove il Tier superiore fornisce il servizio al Tier inferiore dietro un pagamento in denaro instaurando quindi rapporti commerciali di tipo “customer-provider”).
Tier-1: sono gli ISP di grandi compagnie di telecomunicazione, come AT&T, Sprint e SEABONE (Telecom). Questi ISP hanno reti ad alta velocità che formano il backbone (collegamenti o dorsale) di Internet; sono situati al centro di Internet e hanno una copertura a livello internazionale, sono interconnessi tra loro mediante i “peering link” ed operano multiplando con IP/MPLS (Multi-Protocol Label Switching) e in alcuni casi ATM, con backbone fino a 10 Gbps; Tier-2: sono gli ISP più piccoli ed esterni a Internet, come Vodafone. Questi ISP sono collegati tramite “customer-provider link” ai Tier-1 per accedere a Internet e sono a livello nazionale; Tier-3: sono ISP regionali e vengono usati dalle imprese per connettersi a Internet, molto più vicini ai sistemi finali.
Un pacchetto che viaggia tra 2 client può attraversare tutte le tipologie di ISP. Questa è l‟architettura fisica di Internet:
A fianco degli ISP, che forniscono accesso ad Internet agli utenti, ci sono i BSP (Backbone Service Provider), i quali forniscono accessi alle linee di trasmissione agli ISP, permettendo a questi di offrire i loro servizi. Gli ISP hanno accesso alla rete tramite un POP (Point of Presence), ovvero un insieme di router in grado di instradare il traffico agli utenti finali, ovvero
le “Customer Network”, attraverso una varietà di protocolli di Livello 2 (Gigabit Ethernet, frame relay). Ogni POP è connesso agli altri POP dello stesso ISP, ai POP di altri ISP per formare un peering e ad almeno 1 router del backbone.
Il POP è caratterizzato da un‟infrastruttura complessa e costosa: i motivi principali sono la mancanza nei router di porte e capacità di switching rispetto alle richieste dei POP. L‟inaffidabilità dei router, che comporta la necessità di avere dei router di riserva (ridondanti), è la mancanza di un servizio di prenotazione nelle reti IP. La conseguenza di tutto ciò è che oltre il 50% della capacità e diverse porte dei router sono utilizzate per le interconnessioni, e quindi rappresentano risorse che non possono essere vendute ai clienti. Questo problema diventa sempre più importante se applicato al concetto di scalabilità, in quanto all‟aumentare dei router connessi le risorse destinate all‟interconnessione saranno in percentuale sempre maggiori. I diversi ISP possono scambiare traffico tra loro grazie ai NAP (Network Access Point), che connettono i loro Autonomous System attraverso accordi di peering. Un NAP serve a permettere alle reti degli ISP di interconnettersi tra loro direttamente, senza affidarsi a provider esterni. E‟ formato da uno o più switch, a cui vengono collegati i router degli ISP, che stabiliscono peering attraverso il protocollo BGP. La parte di rete gestita da un‟organizzazione (ad esempio un ISP) è detta Autonomous System (AS). I router interni di un AS sono detti Interior Gateway (IG), quelli di collegamento con altri AS sono detti Exterior Gateway (EG).
1.2 IL FUTURO Le prossime generazioni di router saranno guidate dalle richieste dai provider, i quali richiedono riduzione dei costi delle infrastrutture e del mantenimento, mentre allo stesso tempo un aumento della capacità e affidabilità. In seguito alla riduzione dei costi delle tecnologie ottiche, molti network designer punteranno su edge router IP di media dimensione, connessi a optical crossconnect (OXC), disposotovi in grado di instradare traffico ip ad alta velocità su fibre ottiche, i quali saranno a loro volta interconnessi mediante dispositivi di trasmissione basati su DWDM. Il problema di questo approccio è che le connessioni con OXC sono solitamente ad alto rate (oggi 10Gbps, in futuro fino a 40Gbps), e quando gli edge router vogliono comunicare con gli altri router hanno bisogno o di collegamenti diretti, ma ciò implica che i link vengano poco utilizzati, o di collegamenti multi-hop, ma ciò comporta un‟alta latenza. Per risolvere questo problema, alcuni network designer credono che sia meglio costruire router di grandi dimensioni, quindi una soluzione “single box”, che aggregano il traffico dagli edge router in un unico link ad alta velocità, connesso direttamente ai router di differenti POP attraverso meccanismi basati su DWDM. Questo approccio diminuisce la latenza, visto che non si usa più la tecnica multi-hop, e riduce i costi di numerose schede di rete e collegamenti: così facendo si ha un router di larga capacità, scalabile, affidabile ed efficiente.
La rete fornisce un servizio di comunicazione per le applicazioni trasportando informazioni tra processi remoti. Il servizio di trasporto fornito alle applicazioni può essere di diverso tipo, ad esempio mediante commutazione di circuito: vengono riservate risorse per ogni chiamata, non c'è condivisione di risorse ed è richiesta una fase di set-up. Ogni nodo della rete si occupa di funzionalità limitate al livello 1 (livello fisico), in quanto i nodi non elaborano l‟informazione. Un‟alternativa alla commutazione di circuito è rappresentata dalla
commutazione di pacchetto. Lo strato di rete (livello 3) trasferisce TPDU (Transport Protocol Data Unit) attraverso la rete, mascherando i dettagli sulla rete e la modalità di commutazione. Ha la funzione di instradare pacchetti, multiplare diversi flussi di livello 3 in un collegamento di livello 2 e fa controllo di flusso e di congestione. La commutazione di pacchetto può avvenire in 2 modi: Datagramma: i pacchetti sono inviati sulla base di una tabella di routing (che si trova in ogni nodo) e un indirizzo di destinazione nell‟header del datagramma. E‟ connectionless, quindi i pacchetti possono essere persi, duplicati o arrivare fuori sequenza (se i vari pacchetti di una connessione prendono percorsi differenti). Circuito virtuale: modalità di trasferimento a circuito fisso dedicato tra 2 nodi, in cui il trasporto informativo consiste in una sequenza di pacchetti a richiesta o domanda dell‟utente. Diverse connessioni logiche (canali virtuali) condividono la stessa connessione fisica. I pacchetti vengono etichettati con una label associata alla connessione. Tutti i pacchetti di una connessione arrivano in ordine e seguono lo stesso percorso. Il router è un dispositivo che gestisce funzioni fino al livello 3 (network layer): Physical layer: gestisce le porte in ingresso e in uscita; Data-link layer: gestisce i frame, in ingresso si occupa di controllare e delimitare il frame (ne trova l‟inizio), in uscita genera e trasmette il frame. Prima dell‟invio fa anche controllo del frame per evitare errori; Network-layer: si occupa di funzioni che per essere svolte richiedono del tempo. Infatti mette in un buffer il pacchetto in ingresso, processa l‟header leggendone l‟indirizzo IP, fa il routing di pacchetti e datagrammi (leggendo dalla tabella di routing va a identificare il link di uscita), invia il pacchetto sul link corretto e fa controllo di flusso e di congestione (anche se a volte queste funzioni avvengono a livello 4); Control-plane: fa funzionare algoritmi e protocolli distribuiti che riempiono le tabelle di routing (RIP, OSPF, BGP, etc..) e le mantengono aggiornate;
2. ARCHITETTURE DEI ROUTER Le funzioni dei router IP possono essere classificate in due categorie: funzioni datapath e funzioni del piano di controllo (control plane). Le funzioni di datapath vengono eseguite ogni volta che arriva un datagramma. Un esempio sono le decisioni di inoltro, eseguite dal motore di inoltro quando arriva un pacchetto, che lo analizza e lo inoltra tramite l‟utilizzo del longest prefix matching; oppure, in altre applicazioni, si ha la packet classification, basata su 104 bit (5-tupla), per cui, a seconda del risultato, il pacchetto ha una priorità di inoltro o viene scartato.
Le funzioni di controllo includono invece le configurazioni di sistema, gestione e scambio di informazioni delle routing table. Il route controller (RC) scambia le informazioni sulla topologia con altri router e costruisce la routing table basata su un protocollo di routing (RIP, OSPF, BGP). Può anche creare forwarding table per il forwarding engine. Queste azioni non sono effettuate all‟arrivo di ogni pacchetto. Le architetture dei router generalmente si suddividono in due categorie, entrambe con un route controller e un management controller (MC): centralizzate e distribuite. Architettura centralizzata: si hanno interfacce di rete, forwarding engine, un RC e un MC interconnessi con la switching fabric. Le interfacce di input inviano l‟header dei pacchetti ai forwarding engine attraverso la switch fabric. I forwarding engine, a turno, determinano su quale interfaccia di uscita dovrebbe essere inviato il pacchetto. Questa informazione è restituita all‟interfaccia di ingresso corrispondente, che invia il pacchetto all‟interfaccia di output corretta. L‟unica funzione del forwarding engine è processare l‟header dei pacchetti, ed è condiviso tra tutte le interfacce. Tutte le altre funzioni, come prendere parte ai protocolli di routing, riservare le risorse, gestire i pacchetti che richiedono un‟attenzione aggiuntiva e tutti gli altri compiti amministrativi e di manutenzione, sono gestite da RC e MC.
Architettura distribuita: le funzioni del forwarding engine sono integrate nelle interfacce stesse. Molti router ad alte performance usano questa architettura. Il RC mantiene una routing table e la aggiorna in base ai protocolli di routing (scambiando informazioni con altri router). La tabella di routing viene usata per generare una forwarding table, che viene poi scaricata dal RC nei forwarding engine nelle interfacce. Non è necessario scaricare una nuova forwarding table per ogni aggiornamento delle route. Gli aggiornamenti delle route possono essere frequenti, ma i protocolli di routing richiedono tempo, fino a minuti, per convergere. Il RC richiede una tabella di routing dinamica studiata per aggiornamenti
veloci, e una generazione veloce delle forwarding table, che possono essere ottimizzate e non per forza dinamiche. Ogni interfaccia di rete ha il suo forwarding engine, formando così una line card, e di conseguenza c‟è un solo flusso in uscita, quello del pacchetto. Pertanto questa tecnologia è molto più performante ed è la più usata. Questa è la tipica architettura di un router:
Ci sono diverse line cards, un RC e un MC, interconnessi attraverso una switch fabric. La comunicazione tra i vari componenti può avvenire attraverso la switch fabric o una rete di interconnessione separata, ad esempio uno switch Ethernet. Le linecards sono i punti di ingresso e uscita da e verso un router. Queste forniscono l‟interfaccia dal layer fisico e da quelli più alti verso la switch fabric. I compiti eseguiti dalle linecards sono diventati più complessi a causa dello sviluppo di nuove applicazioni e dell‟evoluzione dei protocolli. Ogni linecard supporta almeno una connessione in fibra full-duplex sul lato di rete, e almeno una connessione di ingresso e una di uscita verso il backplane della switch fabric. In generale, per applicazioni che richiedono tanta banda, le connessioni di rete supportano la canalizzazione per aggregare linee a velocità minore in un collegamento a velocità maggiore, e le connessioni nella switch fabric forniscono meccanismi di controllo di flusso per diverse migliaia di code in ingresso e in uscita per regolare l‟ingresso e l‟uscita del traffico da e verso la switch fabric. Una line card è composta da diversi componenti, che permettono di gestire diverse funzioni, tra cui:
Gestione del sistema;
Gestione delle eccezioni;
Gestione dei fallimenti e degli allarmi;
Configurazione dei sistemi;
Manutenzione e aggiornamento delle routing table;
I diversi componenti sono: Transponder/transceiver: fa conversione elettrico/ottico (E/O) e O/E; Framer (L2): sincronizzazione, packet delineation, scrambling (viene cambiata la posizione dei bit secondo un pattern predefinito in modo da distribuire gli eventuali errori); Central Processing Unit: esegue funzioni di control plane, come aggiornamento delle table, gestione del buffer e delle eccezioni; Network Processor: fa table lookup, packet classification e modifica dell‟header, raccoglie statistiche e si occupa della frammentazione dei pacchetti IP, si affida a memorie molto veloci (SRAM, DRAM, CAM). Esistono 2 architetture di implementazione del network processor: Configurabile: è composta da molteplici coprocessori special-purpose. Programmabile: è composta da molteplici processori RISC (Reduced Instruction Set Computer, indica microprocessori con un‟architettura semplice e lineare). Si riscontra la difficoltà di programmare il Network Processor al fine di supportare differenti applicazioni: infatti esistono start-up specializzate nel creare codici basati sulla struttura NP. Traffic manager: fa azioni di gestione dei buffer [EPD (Early Packet Discard), REPD (Random EPD), weighted REPD e PPD (Partial PD)], scheduling dei pacchetti e controllo di accesso del traffico. Questo consiste in una collezione di tecniche specifiche e meccanismi che definiscono le caratteristiche e i requisiti del traffico (tolleranza alle perdite, rate di picco, …), eseguono operazioni di policing e shaping se il traffico devia dalle sue specifiche. Il controllo dei parametri di utilizzo (UPC) in ATM e il servizio differenziato (Diffserv) in IP effettuano funzioni simili di controllo di accesso. Lo scheduling dei pacchetti assicura che i pacchetti vengono trasmessi rispettando i requisiti di banda e ritardo. Gli schemi proposti sono deficit round-robin e WFQ (Weighted Fair Queuing). Inoltre si occupa di risolvere le contese tra gli input nelle switch fabric. La classificazione degli switch si può basare sul numero di stage. Ad esempio si può parlare di: Switch a singolo stage (ad esempio lo switch cross-point), caratterizzato da un singolo percorso tra ogni coppia input-output, in cui non ci sono pacchetti fuori sequenza, è facile da progettare ma soffre la scalabilità;
Switch a multistage (ad esempio le reti di Clos), in cui sono possibili diversi percorsi tra ogni coppia input-output, molto scalabili e tolleranti agli errori. Possono essere memory-less (con uno scheduling centralizzato, in cui non ci sono pacchetti fuori sequenza) e buffered (con uno scheduling distribuito, per cui i pacchetti possono arrivare fuori sequenza). Il ritardo nel trasferimento dei pacchetti (Dtot) è dato dalla somma di tanti componenti: Wp (tempo di attesa nel buffer in ingresso), Tp (tempo di elaborazione del percorso), Wt (tempo di attesa nel buffer di uscita) e Tt (tempo di trasmissione). Il tempo di trasmissione è pari al rapporto tra la lunghezza media del pacchetto (L) e la capacità (bit/s) del link di uscita. Per ipotesi i primi 2 componenti (layer 2) sono trascurabili, pertanto Dtot = Wt + Tt, i pacchetti sono distribuiti uniformemente in tutte le code, i buffer hanno capacità infinita e le code seguono un modello M/M/1. Ipotizzando che i processi di arrivo e servizio dei pacchetti nei nodi sono indipendenti, si ha che il ritardo totale è pari a 1/μ(1-ρ) : μ = 1/Tt;
ρ = Λ∙Tt = M∙λ∙L/C;
M = numero di code;
λ = Λ/M.
In realtà, poiché i buffer sono in un numero finito, c‟è una probabilità che i pacchetti vadano persi. La dimensione tipica del buffer per flusso è pari al RTT∙C/√N (N = numero di flussi multiplati). I router attuali presentano un‟architettura distribuita. Nelle line card in ingresso ci sono le forwarding table, cioè copie decentralizzate delle tabelle di routing, che, anche se vengono aggiornate più raramente, permettono di effettuare il lookup in modo più efficiente, in quanto ciò avviene in modo locale piuttosto che centralizzato. In ingresso avviene uno switching decentralizzato, in cui, dato un datagramma di destinazione, si cerca il link di uscita nelle forwarding table, con l‟obiettivo che ciò avvenga a velocità wire-speed. Se i datagrammi arrivano con una velocità maggiore rispetto a quella con cui viene effettuato il processo di lookup, si genera una coda. In uscita invece può essere necessario utilizzare un buffer, se la velocità con cui arrivano i datagrammi dalla switching fabric è maggiore del rate di trasmissione. In questo caso si usa un meccanismo di scheduling per scegliere quale datagramma inviare.
Esistono 3 architetture per le switching fabric: Switching via memory: tipica della 1° generazione di router, la CPU controlla direttamente lo switching, il pacchetto viene copiato nella memoria del sistema (RAM), c‟è un bus che connette i vari componenti (memoria, porte, …), è un meccanismo lento perché limitato dalla banda di memoria;
Switching via bus: tutte le line cards in ingresso sono connesse grazie a un bus (dedicato), ci sono sistemi per evitare collisioni, il bus condiviso ha limitazioni in velocità dovute alla contesa di accesso al bus. Ogni line-card ha CPU e memoria, quindi alcune funzioni sono svolte lì;
Switching via interconnection network (crossbar): supera le limitazioni della banda del bus, se c‟è più di un pacchetto con la stessa destinazione (intesa come port), vengono
memorizzarti nel buffer dell‟output port (ciò comporta ritardo e possibile perdita di pacchetti, quindi perdita di efficienza). Questo comporta la soluzione del problema della contesa alla porta di uscita, in quanto, se il buffer è sufficientemente capiente, si possono memorizzare i pacchetti nel buffer in uscita mentre se ne processa uno. Se la fabric processa più lentamente delle porte in ingresso, si può verificare il fenomeno dell‟Head Of Line blocking (HOL), in cui pacchetti verso una determinata uscita non possono essere inviati e processati in quanto bloccati da un pacchetto in attesa in cima alla coda. 2.1 DESIGN DEI CORE ROUTER I core router sono progettati per muovere il traffico più velocemente possibile. Con l‟introduzione di diversi servizi ai bordi della rete e un rapido aumento della richiesta di banda, i core router devono essere progettati in modo da essere molto più flessibili e scalabili del passato. Per avere questo abbiamo delle categorie a cui riferirci: Packet Forwarding Performance: devono fornire l‟inoltro di centinaia di milioni di pacchetti per secondo, questo requisito serve per supportare i servizi richiesti, la possibile crescita dei servizi nel futuro e facilitare la consegna di servizi rigenerati; Scalabilità: il traffico ai bordi cresce rapidamente, quindi i provider sono forzati ad aggiornare i loro sistemi ogni 3/5 anni. Gli ultimi core router sono progettati per aggiungere matrici di routing per aumentare la banda mantenendo le infrastrutture correnti; Bandwith Density: un altro problema con i core router è la crescita di utilizzo dei dispositivi e il conseguente aumento dei consumi. Gli ultimi core router aumentano la densità di banda creando dispositivi più piccoli, così da consumare meno; Service Delivery Features: per garantire un servizio, i core router richiedono di fornire servizi come DiffServ classes, packet filtering, policing, rate-limiting e monitoraggio del traffico ad alta velocità; questi servizi dovranno essere forniti senza impattare le performance del packet forwarding; Availability: richiedono alta disponibilità nei picchi del traffico e possibile manutenzione senza fermare il servizio, ovvero ridondanza, componenti hardware hot-swappable (aggiornabile con sistema attivo) e progettazione software modulare; Security: resistere ad attacchi Denial of Service (DDoS) e altre vulnerabilità, forniscono un rate-limitato, filtering, tracing e logging per controllare i servizi di sicurezza ai bordi della rete; Memory Speed: la velocità delle porte di una switch fabric è solitamente doppia della velocità del collegamento per non avere problemi con overhead per il routing, flow control e informazioni di QoS. Come risultato si ha circa 120Gbps di banda per la memoria tra I/O; considerando 40B per pacchetto, il ciclo di vita di memoria nel buffer è meno di 2.66ns. Questa è una delle sfide, perché si potrebbe usare memoria più grande, ma non è possibile implementarla negli ASIC. Inoltre, il numero di pin per la memoria del buffer può essere di alcune centinaia, così da limitare il numero di memorie esterne da connettere all‟ASIC;
Packet Arbitration: un arbitro è usato per risolvere contesa della porta d‟uscita dalla porta d‟ingresso. Data una porta di uno switch a 40Gbps con pacchetti da 40B e uno speedup pari a due, l‟arbitro ha solo 4ns per risolvere la contesa. Questo può essere implementato con architettura centralizzata, dove le interconnessioni tra arbitro e tutte le line card d‟ingresso possono essere complesse e costose, oppure con architettura distribuita, dove ogni
line
card
e
switch
card
sono
coinvolte
arbitrariamente.
Questa
seconda
implementazione può degradare il throughput e il ritardo a causa di una mancanza di disponibilità delle informazioni sugli stati di tutti gli ingressi e le uscite. Concludendo, è richiesta un‟alta velocità nella switch fabric per migliorare le performance; QoS Control: simile al problema sopra, all‟aumentare della velocità delle linee aumenta l‟esecuzione di policy sulle porte d‟ingresso, packet scheduling e buffer management sulle porte d‟uscita; Optical Interconnection: l‟utilizzo di tecniche ottiche è molto costoso, consuma molta potenza e la riconfigurazione è molto difficile. Il layout delle fibre è progettato per ridurre le possibili interruzioni causate da un errore umano; Power Consumption: per dissipare i sistemi si devono calcolare anche i costi dell‟aria condizionata, e si va anche incontro ai limiti della dissipazione; Flexibility: devono essere modulari e adattabili a requisiti futuri, ovvero non devono essere basati solo su operazioni veloci su ASIC hardware, ma devono avere una struttura bilanciata con ASIC programmabili. L‟accesso a Internet può avvenire: Dial-up via modem: connessioni tra computer mediante modem, sfruttando la banda fonica a bassa frequenza (fino a 56 kb/s); ADSL (Asymmetric Digital Subscriber Line): fino a 1 Mb/s in upload, fino a 20 Mb/s in download, condividono il doppino telefonico fino alla centrale, l‟accesso al router del provider è mediante rete dati ad alta velocità di Telecom; Reti locali: LAN, che collegano i terminali al router, Ethernet; Reti radio: consentono l‟accesso radio condiviso per la connessione tra terminali e router, attraverso un punto d‟accesso (stazione base); Wireless LAN; Cellulari: GPRS (56 kb/s), UMTS (384 kb/s), HSDPA/HSUPA (2/14 Mb/s); Internet è gestita dall‟Internet Society (ISOC), organizzazione internazionale per lo sviluppo e la diffusione di Internet. ISOC esplica le sue attività mediante l‟IAB (Internet Architecture Board), diviso in IETF (Internet Engineering Task Force) e IRTF (Internet Research Task Force), che si occupano tra l‟altro di definire i nuovi standard (i documenti sono pubblici e sono detti RFC, Request For Comments).
3. IP ADDRESS LOOKUP 3.1 INTRODUZIONE Il compito principale dei router (L3) è quello di inoltrare pacchetti verso la loro destinazione finale. A questo proposito un router deve decidere dove dev‟essere inoltrato ogni pacchetto in ingresso: questo vuol dire trovare l‟indirizzo del next-hop router e associare la porta d‟uscita su cui inviare il pacchetto. Le informazioni per l‟inoltro sono immagazzinate in una forwarding table, che il router raccoglie attraverso un protocollo di routing. L‟utilizzo della forwarding table si ha attraverso un‟operazione chiamata address lookup, ovvero il router usa l‟indirizzo di destinazione del pacchetto come chiave. Una volta recuperata l‟informazione per l‟inoltro, il router può trasferire il pacchetto dal link d‟ingresso al link d‟uscita appropriato. 3.1.1 CLASSI DI INDIRIZZAMENTO L‟indirizzo IPv4 è composto da 32 bit, organizzati in gruppi da 8 (byte), divisi tra loro da punti. L‟indirizzo IP è composto da 2 livelli: il primo contiene l‟indirizzo IP della rete, il secondo contiene l‟indirizzo IP dell‟host. La parte di rete, che corrisponde ai primi n bit, è chiamata prefix address. Le possibili notazioni per indicarla sono una sequenza di 0 e 1, una codifica decimale/la lunghezza dell‟indirizzo o mediante una netmask, composta da un numero di 1 pari alla lunghezza dell‟indirizzo, e da 0 fino ad arrivare a 32 bit. Quest‟ultima notazione è quella che è realmente utilizzata nelle macchine, mentre le altre 2 si usano per comodità. Una IP NET (solitamente un layer-2 network, ad esempio Ethernet LAN), identificata da un ID, è un insieme di host connessi direttamente, e c‟è almeno un router con una porta collegata all‟IP NET per mettere in comunicazione gli host con quelli delle altre IP NET. L‟inoltro (forwarding) dei pacchetti può avvenire in 2 modi: Diretto: viene fatto se sorgente e destinatario appartengono alla stessa rete (ad esempio LAN). Un host A che deve mandare un pacchetto all‟host B confronta l‟indirizzo IP di B con il proprio, verificando che fanno parte della stessa rete. A questo punto controlla nella propria tabella la corrispondenza tra indirizzo IP e indirizzo MAC (indirizzo locale) (la tabella viene riempita con appositi protocolli, come ARP). Lo strato IP invia il pacchetto (formato da payload e header contenente indirizzi IP di sorgente e destinatario) al livello 2, che lo incapsula in un frame avente MAC-B come indirizzo di destinazione (è scritto nell‟header, oltre all‟indirizzo MAC-A). Come detto, i router fanno forwarding diretto se la destinazione appartiene a una delle reti delle loro interfacce: il controllo viene fatto tramite operazioni di AND bit a bit tra indirizzo dell‟interfaccia e indirizzo di destinazione (ognuno con la propria netmask). Se i risultati coincidono, allora il pacchetto viene inviato direttamente su quella
interfaccia. Indiretto: viene fatto se sorgente e destinatario appartengono a reti differenti. A confronta il proprio indirizzo IP con quello di B, e scopre che non appartengono alla stessa rete. Perciò deve mandare un pacchetto a un router (per questo compito viene solitamente identificato un router, detto default router): per fare ciò legge dalla tabella l‟indirizzo MAC di un‟interfaccia del router e lo comunica al layer-2, che costruisce il frame e lo invia verso questa interfaccia (nell‟header del pacchetto IP ci sono il proprio indirizzo IP e quello dell‟host destinatario, nell‟header del frame ci sono il proprio indirizzo MAC e quello dell‟interfaccia del default router). L‟inoltro indiretto viene fatto dai router se i controlli su tutte le interfacce danno esito negativo. A questo punto il router controlla nella propria tabella di routing: se trova più di una corrispondenza positiva, sceglie il dato con la netmask più lunga (cioè con più 1). Poiché il routing avviene a livello di rete (network layer, livello 3), nelle forwarding table dei router tutti gli host di una singola rete sono identificati da un unico indirizzo IP di rete. L‟architettura di indirizzamento di Internet usava uno schema detto indirizzamento classful, che divideva le reti in 3 categorie (classi) di dimensione differente dette: A: la classe A è composta da reti aventi 0 come primo bit del prefisso di rete e gli altri 7 bit del prefisso variabili (sono identificabili da 1 a 127), e 24 bit per gli host; B: la classe B è composta da reti aventi 10 come primi bit del prefisso di rete e gli altri 14 bit del prefisso variabili (sono identificabili da 128 a 191), e 16 bit per gli host; C: la classe C è composta da reti aventi 110 come primi bit del prefisso di rete e gli altri 21 bit del prefisso variabili (sono identificabili da 192 a 223), e 8 bit per gli host. Ci sono poi indirizzi di classe D (1110, usati per il multi cast) ed E (1111, riservati per uso futuro). Alcuni indirizzi sono riservati per determinati usi, come 0 in tutti i bit dell‟indirizzo host (usato per definire la rete) o tutti 1 nell‟indirizzo host (usato per il broadcast). Ci si è accorti che la divisione in classi era poco efficiente, perché molti avevano bisogno di un valore intermedio, in termini di host, tra quelli delle classi B e C. Oltre a ciò è sorto il problema per cui gli indirizzi di classe B stavano terminando, e inoltre organizzazioni con molti host avevano router con tabelle immense, oltre a ID differenti per descrivere ogni link. Perciò si sono adottate 2 soluzioni: il subnetting (VLSM), usato internamente nelle organizzazioni per organizzare la propria rete, e il CIDR (Classless Interdomain Routing, detto anche supernetting). I vantaggi delle sottoreti sono sia per l‟amministratore locale, che può creare
nuove reti senza richiedere indirizzi classful, sia per Internet, in quanto basta un solo valore per identificare tutte le sottoreti. Il subnetting consiste nell‟utilizzare parte dei bit del campo host per identificare la sottorete, è solo per uso interno e i pacchetti non portano informazioni sul subnetting. Il subnetting può essere ottimizzato usando il Variable Length Subnet Masking (VLSM), che consente di avere più di una maschera di sottorete (subnet mask) nella stessa rete (sub-sub-…-sub netting). VLSM: permette la route aggregation, così si riducono le informazioni richieste per il routing. E‟ necessario che le routing tables abbiano un campo per indicare le subnet mask, e che i protocolli di routing trasportino le informazioni sui prefissi di rete ogni volta che pubblicizzano un cammino. Partendo da un indirizzo di una certa classe si aggiungono bit. CIDR: l‟indirizzo IP è diviso in segmenti, ognuno descritto da un prefisso (nella forma x/y, in cui x è il prefisso di tutti gli indirizzi del segmento e y indica la lunghezza del segmento). Prefissi di rete differenti possono condividere il set iniziale di bit (ad esempio 128.9/16; 128.9.16/20; 128.9.19/24). Partendo da un indirizzo di una certa classe si aggiungono bit. Il prefisso con il matching più lungo indica il cammino più specifico. CIDR elimina il concetto di classi negli indirizzi, quindi hanno bisogno di un prefisso esplicito per dividere il campo di rete da quello di host (non si basano più sul primo bit come nell‟indirizzamento a classi), è necessario che il protocollo di routing possa pubblicizzare i prefissi e che i router abbiano un algoritmo di instradamento basato sul “longest prefix match”. Per salvare spazio in memoria nelle routing tables, differenti prefissi di rete possono essere aggregati. Ad esempio, le reti da 208.12.16/24 a 208.12.31/24 hanno gli stessi primi 20 bit, e quindi le 16 reti in questione possono essere rappresentate da un prefisso a 20 bit, cioè 208.12.16/20. Ci sono casi in cui aggregare indirizzi non riduce le voci nelle forwarding tables dei router: supponiamo che un cliente possieda la rete 208.12.21/24 e cambi il service provider, senza però voler cambiare il numero di rete. Tutte le reti da 208.12.16/24 a 208.12.31/24 possono essere raggiunte attraverso lo stesso service provider, tranne la rete 208.12.21/24. In questo caso non si può fare l‟aggregazione degli indirizzi, ma bisogna salvare in tabella 16 voci. In alternativa si può comunque aggregare, ma poi bisogna aggiungere le voci delle eccezioni (in questo caso 208.12.21/24). CIDR presenta ancora problemi non risolti: esistono router che sono precedenti a CIDR e quindi non supportano questa tecnologia, e quindi devono affidarsi alle default routes per mantenere routing tables di dimensioni accettabili, e perciò non fanno un routing ottimo. Rimane il problema della carenza nel numero di indirizzi IP, e inoltre negli ultimi anni sta crescendo di molto il numero delle eccezioni. Infatti, se un‟organizzazione cambia il proprio ISP, non è possibile ottenere un nuovo blocco di indirizzi e rinumerare (non si può fare per organizzazioni complesse o che rivendono sottoreti), per cui mantiene lo stesso blocco di indirizzi che verrà pubblicizzato dal nuovo ISP: questo comporta una nuova voce nelle
routing tables, che verrà valutata con il longest prefix match. Esistono diversi parametri per valutare le performance degli algoritmi di lookup: Velocità di lookup: se si considera una trasmissione a 10Gbit/s e un pacchetto di lunghezza pari a 40 byte, si ha che la singola operazione di lookup deve avere una durata inferiore a 32 ns; Requisiti di spazio: uno spazio piccolo comporta un accesso ad alta velocità; Tempo di aggiornamento: BGP fa centinaia di aggiornamenti al secondo, quindi la frequenza di aggiornamento deve essere maggiore; Scalabilità: ogni anno nelle forwarding tables vengono aggiunte 25000 nuove voci; Flessibilità nell‟implementazione: questa può avvenire via software o via hardware (più veloce), utilizzando un ASIC (Application Specific Integrated Circuit, un circuito integrato creato appositamente per uno specific purpose, molto costoso), un network processor (microprocessore caratterizzato dal possedere un set di istruzioni specifico per il networking) o un processore generico. 3.2 ALGORITMI DI LOOKUP BASATI SUGLI ALBERI 3.2.1 Binary trie E‟ un albero multi-via in cui ogni nodo contiene informazioni sul next-hop e da 0 a 2 puntatori ai nodi figli. Se a un nodo corrisponde una voce nel database dei prefissi, allora è detto grigio, mentre quando ha almeno un nodo figlio è detto bianco. Durante il lookup è necessario ricordare l‟ultimo nodo grigio visitato (che corrisponde all‟ultimo prefisso valido se non se ne trova uno più specifico). Per aggiungere un prefisso si seguono i puntatori fino a dove dovrebbe essere nell‟albero, se non esistono puntatori per quel prefisso si aggiungono e si crea il nodo, mentre se esiste già il nodo gli si aggiunge l‟etichetta (così diventa grigio). Per togliere un prefisso invece, se il nodo non ha nodi figli, si cancellano il nodo e il puntatore a questo (il nodo genitore si cancella in modo ricorsivo fino a che si trova un nodo grigio o uno bianco con un altro figlio), se invece ha un altro figlio, si mantiene il nodo ma si cancella l‟etichetta. Detti N il numero di prefissi e W la lunghezza massima dei prefissi, si ha:
complessità di lookup = O(W); aggiornamento = O(W); archiviazione = O(N∙W);
Varianti: il binary trie si può espandere per ottenere il Complete Binary Trie, in cui ogni nodo rappresenta un prefisso. Di conseguenza non si fa più longest prefix match, ma si fa accesso diretto al prefisso con l‟indirizzo completo. Detta W la lunghezza massima dei prefissi, la memoria richiede 2W voci (per limitare la quantità di dati salvati in memoria, W è al massimo pari a 5).
L‟albero completo richiede troppa memoria, quindi può essere ridotto utilizzando il DisjointPrefix Binary Trie, che non usa la regola del longest prefix e cerca le informazioni di forwarding più specifiche. I prefissi sono sulle foglie e non sui nodi esterni: per ottenerlo si aggiungono foglie ai nodi che hanno un solo figlio (“leaf pushing”).
3.2.3 Path-compressed trie Vengono rimossi i nodi bianchi con un solo figlio. Per memorizzare i nodi che mancano, si usano 2 valori: skip, che indica quanti bit si saltano, e segment, che indica la stringa di bit mancanti dall‟ultima operazione di skip.
La path compression riduce la profondità di un albero binario con rami sparsi: un albero completo senza più compressioni è un albero binario.
complessità di lookup = O(W); aggiornamento = O(W); archiviazione = O(N);
3.2.4 Multi-bit trie Invece che un bit alla volta, per ogni accesso in memoria si controllano più bit. Ogni nodo ha 2 array: il primo contiene il next-hop per ogni voce, e il secondo contiene i puntatori figli. Si richiede una grande quantità di memoria.
complessità di lookup = O(W/k); aggiornamento = O(W/k + 2k); archiviazione = O(2k∙N∙W/k);
Per ridurre la memoria occupata si può fare un‟operazione di leaf pushing, per cui ogni nodo ha un solo array, che contiene o un puntatore a un figlio o informazioni sul next-hop.
Questo metodo tuttavia si dimostra poco efficiente per quanto riguarda l‟aggiornamento dei dati. 3.2.5 Level compression-trie Trasforma un path-compressed trie (utile quando i nodi sono sparsi) in uno multi-bit (utile quando il trie è densamente popolato). Si comincia con un disjoint-prefix binary trie (si ottiene con il leaf pushing), si fa una path compression, quindi si fa la level compression.
Ad esempio si considera il caso in cui il destination address è 11100000: si comincia dal nodo radice, che presenta i campi di informazione “stride“ = 3 (si usano 3 bit per identificare uno degli 8 possibili rami) e “skip” = 0 (non c‟è stata compressione). I primi 3 bit dell‟indirizzo di destinazione sono 111, quindi si prende l‟ottavo ramo. Il nodo successivo presenta
l‟informazione “stride” = 1 (quindi sono possibili 2 rami), “skip” = 3 (quanti bit ho compresso) e “segment” = 000 (la compressione è stata fatta sui rami 000). Si saltano i successivi 3 bit (per la compressione) e si considera il settimo bit, che è pari a 0. Prendendo il ramo a sinistra, si arriva correttamente al ramo 13. Esistono casi in cui il metodo non porta a nessun risultato: si considera il caso in cui l‟indirizzo di destinazione è pari a 11101000. I primi 3 bit sono 111, quindi prendo l‟ottavo ramo. A questo punto avrei uno skip di 3 bit, pari a 000, ma l‟indirizzo presenta 010, quindi non si ha match. Questo caso è possibile in via teorica, ma irrealistico. Detti N il numero dei prefissi, W la lunghezza massima del prefisso e k la lunghezza dello stride di lookup, si ha che la complessità del lookup è O(W/k), l‟aggiornamento O(W/k + 2k) e l‟archiviazione O(2k∙N∙W/k) (i valori sono uguali al multibit trie). complessità di lookup = O(W/k); aggiornamento = O(W/k + 2k); archiviazione = O(2k∙N∙W/k); 3.2.6 Tree bitmap algorithm Si basa su uno schema di lookup basato sui multi-bit expanded trie, senza leaf pushing né bitmap compression. In questo algoritmo, un nodo contiene un puntatore al blocco dei nodi figli, 2 bitmap (una dei figli e una per I prefissi interni) e un puntatore all'array esterno delle informazioni sui next hop associati ai prefissi salvati nel nodo. Per la definizione dei nuovi nodi dobbiamo creare un binary trie associato ai prefissi e impostare uno stride (al massimo uguale a 3 e non più di 8 stride nell'albero). Es: stride=3
le ramificazione definiscono I nodi. Adesso bisogna scrivere le due bitmap per ogni nodo: Bitmap dei figli(nodo root):
Si parte dall'ultimo nodo a sinistra del nodo di root e si individuano I figli. Poniamo 1
nella bitmap se ha un figlio, 0 altrimenti.
Si va avanti con i nodi dello stesso livello (anche se non ci sono). In questo caso il nodo non c'è, quindi non ha figli né sul ramo dello 0 né su quello dell'1.
Si continua cosi fino a completare la bitmap, quindi fino a completare tutti I 2^stride posizioni dell'array( o bitmap).
Bitmap interna(nodo root):
Partiamo dal primo nodo in cima e controlliamo se è un prefisso. Se lo è scrivo 1 nella bitmap altrimenti 0.
Si continua scendendo a sinistra e andando verso destra.
Eseguiamo l'algoritmo cercando l'indirizzo: 100001101.
Dividiamo l'indirizzo in base allo stride: 100|001|101.
Traduciamo il 1° blocco in decimale: 100=4.
Cerchiamo il 4° bit (partendo da zero) sulla bitmap dei figli e controlliamo se è zero o uno.
Se è zero la ricerca termina nel nodo corrente e si continua con il procedimento A,
altrimenti si va avanti nell'altro nodo e si continua con il procedimento B (anche se ueseguiamo comunque il procedimento A per memorizzare un prefisso valido perché non è detto che troviamo un prefisso valido più avanti). PROCEDIMENTO A:
Eliminiamo il bit più a destra del primo blocco: 100=>10.
Scorriamo l'albero dal primo nodo del nodo root: 1 → 0.
Se il nodo che troviamo è un prefisso lo registriamo altrimenti ripetiamo tutto il procedimento eliminando il bit più a destra.
PROCEDIMENTO B:
Scriviamo le bitmap del nodo a cui punta il primo blocco: 100. Oppure lo calcoliamo tramite una formula.
Adesso prendiamo il secondo blocco:001 e ripetiamo il procedimento fino a quando non troviamo il bit zero nella bitmap dei figli. Le informazioni sul next hop si ottengono dall'array dei risultati.
3.2.7 Ricerca binaria basata sulla lunghezza dei prefissi L‟operazione di longest prefix matching può essere ridotta a una serie di operazioni di exact match, eseguite su prefissi della stessa lunghezza. I prefissi di una forwarding table sono salvati in base alla lunghezza, in sotto-tabelle dette H1, H2, … HW. Per ridurre il tempo per eseguire l‟exact match, si usa una funzione di hash, diversa per ogni sotto-tabella. Se 2 o più prefissi hanno lo stesso valore di hash, si parla di collisione. Dato un indirizzo di destinazione e W hash tables, una ricerca lineare richiede W operazioni di hash e W accessi in memoria. Per ridurli, l‟algoritmo cerca in Hw/2. Se trova un nodo in questa tabella di hash, non è necessario controllare anche H1, H2, … Hw/2-1 (si cerca il longest prefix match). Invece se non si trova, non serve cercare in HW/2+1, … HW. A questo punto le altre tabelle vengono indagate con una ricerca binaria. Questo meccanismo permette di avere una complessità pari a O(log 2W), invece che O(W) della ricerca lineare. Questo metodo in realtà può dare un risultato errato: ipotizzo di avere un indirizzo di destinazione pari a 1100. Poiché il prefisso più lungo è pari a 7 bit, le sotto-tabelle vanno da H1 a H7. Prendo H4: poiché non ha un nodo compatibile con l‟indirizzo cercato, controllo H2. In H2 c‟è P1 = 10*, non compatibile, e quindi controllo in H1, dove ci sono P4 = 1*, compatibile, e P5 = 0*, non compatibile. Pertanto il prefisso risultante è P4, anche se in realtà dovrebbe essere P3 = 11001*. Per risolvere questo problema si aggiungono delle voci, dette markers, alle tabelle. In particolare, i marker consistono in voci che indicano parte di un prefisso di lunghezza maggiore e che rimandano a questi, e
servono a segnalare una possibile corrispondenza che altrimenti non si riuscirebbe a vedere. Infatti, ipotizzando di cercare l‟indirizzo 11001, si trova il marker di lunghezza 4 con il rimando al prefisso P3 (11001*, che diventa 1100* in quanto deve avere lunghezza pari a 4), quindi si cerca a destra e si trova correttamente il prefisso P3. Poiché si effettua una ricerca binaria, è necessario aggiungere un numero di voci pari a log2W. In alternativa si può utilizzare il meccanismo dell‟espansione dei prefissi: invece che avere prefissi di ogni lunghezza, si scelgono solo alcune lunghezze, e si adattano i prefissi a queste, con un metodo simile al leaf pushing. In questo modo aumenta il numero delle voci in tabella, ma diminuisce il numero dei marker da utilizzare. Ovviamente il metodo dei marker può portare a scegliere il percorso non corretto, se il prefisso che viene segnalato dai marker non coincide con l‟indirizzo di destinazione. Per risolvere questo problema, c‟è un meccanismo che permette di tornare indietro a cercare il percorso corretto. Detti N il numero di prefissi e W il numero di hash tables, la complessità del lookup e dell‟aggiornamento è O(log2W) (non considerando le collisioni), mentre l‟archiviazione è O(N∙log2W) (si provano log2W marker invece che W).
3.2.8 Ricerca binaria basata sull’intervallo dei prefissi Questo metodo funziona con prefissi di lunghezza costante, quindi se si hanno lunghezze differenti si aggiungono 0 oppure 1 in modo da avere la stessa lunghezza. Ad esempio P1 = 1*, P2 = 101* e P3 = 10101* vengono utilizzati con indirizzi a 6 bit, quindi diventano rispettivamente 100000, 101000 e 101010. L‟idea di fondo è quella di dividere tutti i possibili indirizzi in intervalli, identificati dal prefisso più basso (L, parte fissa costante e tutti 0) e quello più alto (H, parte fissa costante e tutti 1). In questo modo 3 prefissi sono identificati da 6 endpoint, descrivendo 5 intervalli. Dato un indirizzo A, bisogna cercare l‟indirizzo L più vicino ad A tale per cui non si è ancora raggiunto H.
Tuttavia questo meccanismo può richiedere una ricerca lineare: per risolvere il problema, si usa una tecnica di pre-calcolo (precomputation), per cui a ogni regione tra 2 voci consecutive corrisponde un unico prefisso (il primo L non abbinato al corrispondente H). Ci sono 2 colonne: la prima, identificata con “=”, indica a quale intervallo appartiene l‟endpoint, mentre la seconda, quella con “>”, indica quale intervallo comincia. Di conseguenza l‟inserimento o la cancellazione di un prefisso può essere lenta. Dopo aver definito gli intervalli, si costruisce una pila di prefissi: partendo dalla voce più piccola, se è una L, si pone il prefisso in cima alla pila e lo si assegna sia a “=” sia a “>”, se è un‟H, si assegna il prefisso a “=”, lo si rimuove dalla pila e si assegna il prefisso in cima alla pila a “>”. Si continua così fino alla fine delle voci. Ad esempio considero i prefissi P1 = 1*, P2 = 1001*, P3 = 101*, P4 = 101001*, P5 = 10101*. Usando 6 bit gli intervalli diventano rispettivamente 100000 (L) – 111111 (H), 100100 (L) – 100111 (H), 101000 (L) – 101111 (H), 101001 (L,H), 101010 (L) – 101011 (H). Ordinandoli si ottiene 100000 (L), 100100 (L), 100111 (H), 101000 (L), 101001 (L,H), 101010 (L), 101011 (H), 101111 (H), 111111 (H). Comincio a costruire la pila: la prima voce è 100000 (L), quindi la inserisco nella pila e pongo P1 sia nella colonna „=‟ sia in quella „>‟. Poi prendo
100100 (L), la metto in cima alla pila e aggiungo P2 nella colonna „=‟ e in quella „>‟. Quindi prendo 100111 (H), tolgo P2 dalla pila e aggiungo P1 nella colonna „>‟. Continuo così finché termino gli intervalli.
A questo punto il processo di lookup consiste in una ricerca lineare nelle forwarding tables del limite sinistro più vicino all‟indirizzo di destinazione: comparando la voce E con l‟indirizzo di destinazione A, se AE cerco nell‟intervallo destro. Continuo così finché trovo le voci che racchiudono meglio l‟indirizzo cercato: a questo punto il prefisso „>‟ è quello cercato. Considero P1 = 1*, P2 = 101* e P3 = 1101*, che con l‟espansione diventano 100000-111111, 101000-101111, 110100-110111. Ordinandoli si ha 100000, 101000, 101111, 110100, 110111, 111111. L‟indirizzo di destinazione è 101011: lo confronto con la voce in posizione 3 (101111, è in posizione pari a numero di voci totali/2). Poiché questa è maggiore, allora controllo nell‟intervallo sinistro. In posizione 2 (3/2 diventa 2) ho 101000, che è minore dell‟indirizzo di destinazione, quindi significa che l‟indirizzo è tra la seconda e la terza voce. A questo punto, poiché nel campo „>‟ della seconda voce (101000) ho P2, significa che l‟indirizzo di destinazione ha longest match con il prefisso P2. Il tempo di lookup è pari a O(log2N), l‟aggiornamento e la memorizzazione sono pari a O(N) (se N è la dimensione del database).
3.3 ALGORITMI DI LOOKUP BASATI SULL’HARDWARE 3.3.1 DIR 24-8 BASIC E‟ un meccanismo di lookup che permette un lookup a ogni accesso in memoria, se applicato con un meccanismo in pipeline nell‟hardware. Negli ultimi anni i costi delle memorie si sono notevolmente ridotti (16MB costano 50 $), e sono veramente pochi i router del backbone con prefissi più lunghi di 24 bit. Il DIR 24-8 BASIC fa 2 ricerche su 2 livelli: il primo usa i primi 24 bit, il secondo (se necessario) usa una combinazione di indice e degli 8 bit rimanenti. Sono usate 2 tabelle, entrambe salvate in DRAM: la prima è detta TBL24, e contiene tutti i prefissi fino a 24 bit (ha 224 voci, con indirizzi da 0.0.0 a 255.255.255), mentre la seconda (TBLlong, 20 bit, è un valore che permette di riservare abbastanza spazio per tutti i casi, poteva ad esempio andare bene anche 21 bit, 22 bit, …) contiene i prefissi più lunghi di 24 bit. Se un prefisso X è lungo fino a 24 bit, viene salvato solo nella TBL24: il primo bit è posto a 0 per indicare che gli altri indicano l‟informazione sul next hop. Se invece X è più lungo, si usa una voce nella tabella TBL24 indirizzata dai primi 24 bit di X, e si pone il primo bit pari a 1 per indicare che i rimanenti contengono un puntatore a voci della tabella TBLlong. I prefissi che sono più corti di 24 bit vengono espansi (ad esempio un prefisso /16 diventa 256 prefissi /24), in modo da poter trovare l‟informazione con un solo accesso in memoria. Se un prefisso è più lungo di 24 bit, viene salvato un puntatore nella TBL24 alla posizione xx.yy.zz, mentre le informazioni sul next hop sono salvate in alcune delle 256 voci puntate da xx.yy.zz. Per ogni indirizzo più lungo di 24 bit, indipendentemente dalla lunghezza, vengono allocate 256 voci. Ogni voce nella TBLlong corrisponde a uno dei 256 prefissi più lunghi che condividono il prefisso a 24 bit nella TBL24. Questa può avere profondità di 1 byte se si assume che ci siano meno di 255 router di nexthop.
L‟operazione di lookup viene fatta leggendo i primi 2 byte, usando i primi 24 bit dell‟indirizzo come indice della tabella TBL24: se il primo bit è 0, gli altri 15 bit descrivono l‟informazione sul next hop. Se invece è pari a 1, si moltiplicano i rimanenti 15 bit per 256, si aggiunge il prodotto agli ultimi 8 bit dell‟indirizzo di destinazione originale e si usa il valore ottenuto come indice della TBLlong, che contiene l‟informazione sul next hop. Considero il caso con tre prefissi: 10.54/16 (A), 10.54.34/24 (B), 10.54.34.192/26 (C). Il prefisso A viene salvato nella tabella TBL24 (perché ha meno di 24 bit), dopo essere stato espanso fino a raggiungere 24 bit per voce. A questo punto, per tutti i risultati ottenuti, si pone il primo bit uguale a 0 (questo non vale per 10.54.34). I prefissi B e C richiedono l‟uso anche della seconda tabella, perché hanno gli stessi primi 24 bit e C ha una voce con più di 24 bit. Nella tabella TBL24 si inserisce un 1 seguito da un indice (ad esempio 123). Nella seconda tabella vengono allocate 256 voci partendo da 123∙256 (cioè da 123∙256+0 a 123∙256+255), e vengono riempite con l‟informazione sul next hop corrispondente a B, tranne quelle corrispondenti a 10.54.34.192 (da 123∙256+192 a 123∙256+255), che contengono l‟informazione sul next hop di C.
I vantaggi sono che si richiedono 2 accessi in memoria (quelli in TBL24 e TBLlong), il supporto di un numero illimitato di cammini (se non si considera il limite rappresentato dai cammini più lunghi di 24 bit con parte fissa di 24 bit) e il costo totale, tuttavia la memoria è usata in modo inefficiente e l‟inserimento e rimozione di cammini può richiedere differenti accessi in memoria.
3.3.2 BC -16-16 Il modo più diretto per implementare uno schema di lookup consiste nell‟avere una tabella di forwarding in cui viene designata una voce per ogni indirizzo IP a 32 bit. Ciò richiede un solo accesso in memoria per ogni lookup, ma la dimensione della forwarding table, detta next-hop array (NHA, cioè una tabella contenente un elenco di indici di next hop), è enorme (232 bytes = 4GB).
Per ridurre la dimensione della memoria si può impiegare un lookup indiretto. Ogni indirizzo IP è diviso in 2 parti: segmento (i primi 16 bit) e offset (gli ultimi 16 bit). La tabella di segmentazione (Seg Table) ha 216 voci, e ogni voce (32 bit) registra o l‟informazione sul nexthop o un puntatore all‟NHA (next hop array) associato. Ogni NHA contiene 2 16 voci, e ogni voce (8 bit) registra il next hop (numero di porta) dell‟indirizzo IP di destinazione. Per un indirizzo IP di destinazione a.b.x.y, a.b sono usati come indice nella tabella di segmentazione, mentre x.y sono usati come indice dell‟NHA associato (se necessario). Per un segmento a.b, se la lunghezza del prefisso più lungo appartenente al segmento è ≤ 16, allora le voci corrispondenti nella tabella di destinazione contengono direttamente la porta di output, e quindi non è necessario accedere al NHA associato. D‟altra parte, se la lunghezza del prefisso più lungo appartenente al segmento è > 16, allora è necessario accdere al NHA associato. In questo modo, per un lookup del percorso IP si richiedono al massimo 3 accessi in memoria. Sebbene lo schema di lookup indiretto fornisca un lookup veloce (fino a 3 accessi in memoria), non tiene conto della distribuzione dei prefissi che appartengono a un segmento. Si richiede un NHA di 64 KB se la lunghezza del prefisso più lungo appartenente al segmento è > 16. La dimensione del NHA associato può essere ridotta ulteriormente considerando la distribuzione dei prefissi all‟interno del segmento.
Il meccanismo di lookup richiede 4 tabelle: la tabella di segmentazione (Seg Table), composta da 216 voci, il Code Word Array (CWA), il Compressed Next Hop Array (CNHA) e il Next Hop Array (NHA), cioè una forwarding table. In modo simile a quanto avviene con il DIR-24-8, la tabella dei segmenti (Seg Table) nel meccanismo BC-16-16 ha dimensione pari a 64 KB, e ogni voce (32 bit) è divisa in 3 campi:
F (Flag, 1 bit): indica se il secondo campo contiene un puntatore alla tabella del livello successivo (se pari a 1) o un indice di next hop (se pari a 0); pointer/next hop (27 bit): registra o il next hop (se il valore è ≤ 255) del percorso, o un puntatore (se il valore è > 255) che punta al NHA associato o a una tabella di secondo livello CWA; lunghezza offset (4 bit): indica la dimensione della tabella NHA, in termini di potenze di 2. Se la dimensione non è più grande di 8 (cioè il valore di campo k è ≤ 3), il puntatore punta all‟ingresso di un comune NHA. Se la dimensione è > di 8 (cioè il valore di campo è > 3), il puntatore punta a un campo del CWA che a sua volta punta a un campo del CNHA e trovare infine il next hop. Ogni parola di codice (Code Word, CW) nel CWA è composta da 2 parti: Map (16 bit) e Base (16 bit).
Map indica la distribuzione dei next hop, mentre Base è la somma degli 1 nei Maps precedenti. Ogni bit nei Maps corrisponde a una voce nel NHA, e gli 1 nella bitmap indicano l‟inizio di un‟area di prefissi. Il NHA con 228 voci è compresso nel CHNA nel modo seguente:
Contando gli 1 nella bitmap, si può trovare il next hop nel CHNA. I primi 16 bit (segmento) di un indirizzo IP in ingresso sono usati per il lookup nella Segment Table. Se il bit più significativo (campo F) è 0, che indica che il campo successivo contiene un indice al next hop (cioè un numero di porta di output), allora il processo di lookup si interrompe e viene restituito l‟indice al next hop. Altrimenti, se il campo F è pari a 1, si esamina il campo “lunghezza offset”(gli ultimi 4 bit): se la lunghezza dell‟offset è ≤ 3, si usano il campo puntatore come indirizzo base, e i bit dal 17esimo al (16 + lunghezza offset)esimo dell‟indirizzo IP come indirizzo dell‟offset, per fare il lookup nella tabella NHA, e restituire il risultato associato. Se invece la lunghezza dell‟offset è > 3, bisogna fare un lookup nella tabella CWA in questo modo:
si usa il campo puntatore come indirizzo base, e i bit dal 17esimo al 28esimo come offset dell‟indirizzo per trovare la corrispondente CW nella tabella CWA, e prendere i
corrispondenti “Map” e “Base”;
definendo i bit dal 29esimo al 32esimo come “p”, si calcola il numero, detto x, degli “1” dei p bit più significativi nel campo “Map” della CW;
si usa “Base” come indirizzo base e x come indirizzo offset per fare un lookup nella tabella CNHA, che restituisce il risultato associato (cioè l‟indice di next hop).
La differenza principale tra BC-16-16 e l‟algoritmo Lulea è che BC è basato sull‟hardware, mentre Lulea è basato sul software. BC-16-16 richiede solo una minima quantità di SRAM, e può facilmente essere implementato in hardware. Infatti una tabella di forwarding con 40000 voci può essere compattata in una tabella di 450-470 kbyte. La maggior parte dei lookup di indirizzo può essere fatta con un solo accesso in memoria. Nel caso peggiore, per un lookup si richiedono 3 accessi in memoria. Questo algoritmo non supporta aggiornamenti incrementali: quando una tabella CWA necessita un aggiornamento, l‟intera tabella di secondo livello, che include il CWA associato e il CHNA, dovrebbe essere ricostruita. Esempio:
3.3.3 Ternary CAM La CAM (Content Addressable Memory) è una memoria specializzata nell‟abbinamento (matching) che effettua confronti in parallelo. La CAM restituisce la posizione (o l‟indirizzo) in cui viene trovata una corrispondenza (match). Le CAM convenzionali possono soltanto effettuare matching esatto, se è presente una parola parallela all‟ingresso. Una CAM ternaria (TCAM, Ternary Content Addressable Memory) registra ogni voce con una coppia (val, mask) (entrambi i valori val, mask sono numeri a W bit). Ad esempio, se W = 6, un prefisso 110* viene salvato come la coppia (110000, 111000). Il matching di ogni elemento TCAM con una data chiave in ingresso viene fatto controllando se i bit di val per i quali i bit della mask sono 1 combaciano con quelli della chiave.
Se si attiva un‟operazione di matching, l‟indirizzo IP di destinazione a 32 bit viene confrontato, bit a bit, con tutte le voci della TCAM. Poiché possono esserci più matching allo stesso tempo, si usa un metodo di risoluzione basato sulla priorità e si sceglie il match con priorità più alta. Molte TCAM sono basate sull‟ordine, cioè la priorità è determinata dalla posizione di memoria: più bassa è la posizione, più alta è la priorità (la i-esima TCAM ha priorità maggiore della j-esima, se i < j). L‟unità di arbitraggio delle priorità sceglie dalle TCAM l‟output con priorità più alta. Ad esempio, nella figura precedente, l‟indirizzo IP 192.168.0.177 porta a 4 match, alle posizioni 1, 1003, 1007 e 65535: viene scelta la posizione 1 (più bassa è la posizione, più alta è la priorità). La tabella di forwarding viene salvata nella TCAM in ordine decrescente delle lunghezze dei prefissi, in modo che il prefisso più lungo viene scelto dal codificatore delle priorità. Il gruppo di prefissi di 32 bit è in fondo alla TCAM: ci sono spazi vuoti in alcuni gruppi, riservati per aggiungere prefissi in futuro. La default route è posizionata
in cima alla TCAM: il valore della mask è 0, quindi fa match con tutti gli indirizzi IP in ingresso, e viene scelta se non c‟è matching con nessun valore sottostante. L‟output dalla TCAM viene usato per accedere alla RAM, in cui sono salvate le informazioni sul next hop nella stessa posizione dei prefissi nelle TCAM. TCAM restituisce il risultato del matching più lungo in un solo accesso in memoria, indipendentemente dalla profondità della chiave di ricerca. L‟implementazione di schemi di lookup basati su TCAM è usata comunemente in quanto è più semplice di quella di algoritmi basati su trie. Le TCAM disponibili sul mercato integrano 18 Mbit in un singolo chip, che lavora a 133 MHz, quindi si possono effettuare fino a 133 milioni di lookup al secondo, tuttavia è una soluzione costosa, anche in termini di consumi energetici. Pertanto sono stati introdotti 2 schemi di semplificazione, al fine di ridurre la dimensione delle TCAM: 3.3.3.1 Prefix pruning Considero 2 prefissi P1 = 01*, e P2 = 011*. Assumendo che P1 e P2 abbiano le stesse informazioni di instradamento, P2 risulta ridondante, in quanto la sua cancellazione non influisce sui risultati di lookup. Quindi un lookup che dovrebbe terminare a P 2, allora cancellandolo terminerà a P1. In generale, il 20-30% dei prefissi è ridondante, e quindi può essere cancellato.
3.3.3.2 Estensione della maschera Le TCAM sono usate per matching ternari, e non solo per matching di prefissi. La differenza principale tra i 2 tipi di matching è che il matching di prefissi richiede che la maschera sia composta da tutti “1” nei bit più significativi, e tutti “0” nei rimanenti bit meno significativi. Invece il matching ternario usa tipi liberi di maschere: l‟idea dell‟estensione della maschera è quella di estendere le maschere del tipo prefix-match a maschere del tipo ternary-match. In alcuni casi, diverse voci delle TCAM, in modalità prefix-match, possono essere rappresentate con una sola voce, in modalità ternary-match. In generale, il 20-30% delle voci originali nelle TCAM può essere risparmiato, adottando una tecnica di estensione della maschera.
Le forwarding tables reali possono essere rappresentate utilizzando voci di un numero molto basso di TCAM, generalmente il 50-60% della dimensione originale, usando le tecniche precedenti.
Il
prefix
pruning
non
comporta
cambiamenti
nella
complessità
dell‟aggiornamento dei prefissi, cosa che invece avviene con l‟estensione della maschera, in quanto questa comporta l‟associazione tra prefissi differenti, e quindi ostacoli nell‟effettuare aggiornamenti incrementali.
4. PACKET CLASSIFICATION Tradizionalmente i router fornivano solo servizi di tipo best effort, processando tutti i pacchetti in ingresso allo stesso modo. Con l‟emergere di nuove applicazioni, gli ISP richiedono router che forniscono differenti QoS (Quality of Service) alle diverse applicazioni. Per soddisfare i requisiti nei termini di QoS, i router hanno bisogno di implementare nuovi meccanismi, ad esempio controllo di accesso, prenotazione di risorse, accodamento per flusso e politiche di scheduling. Per fare ciò, è necessario che il router sia in grado di distinguere e classificare il traffico in ingresso in flussi differenti. I router in grado di farlo sono detti flow-aware. Un router flow-aware si distingue da uno tradizionale in quanto è in grado di tenere traccia dei flussi che passano e di applicare differenti classi di servizio a ogni flusso. I flussi sono specificati da regole, e ogni regola consiste in operazioni di confronto di campi dei pacchetti con alcuni valori. Un insieme di regole è detto classificatore, che è formato basandosi sui criteri da applicare per classificare i pacchetti rispetto a una data applicazione di rete. Dato un classificatore che definisce contenuti e attributi di un pacchetto, la classificazione dei pacchetti è il processo di identificazione della regola (o delle regole) a cui è conforme il pacchetto.
Un classificatore C è composto da N regole, Rj, 1 ≤ j ≤ N, dove Rj è composta da 3 parti:
Un‟espressione Rj[i], 1≤ i ≤ d, su ognuno dei d campi dell‟header del pacchetto [l‟header consiste in indirizzo IP di sorgente (32 bit), indirizzo IP di destinazione (32 bit), numero di porta sorgente (16 bit), numero di porta del destinatario (16 bit) e tipo di protocollo (8 bit)];
Un numero Pri(Rj), che indica la priorità della regola nel classificatore;
Un‟azione, detta azione(Rj);
Un pacchetto in arrivo P, avente header composto da una d-upla (P1, P2, …, Pd), fa match con Rj se e solo se Pi coincide con Rj[i], dove 1≤ i ≤ d Dato un pacchetto in ingresso P, e quindi una d-upla, il problema di classificazione ddimensionale del pacchetto consiste nel trovare la regola R m con la priorità maggiore, tra tutte le Rj regole che fanno matching con la d-upla. Si sceglie quindi la regola con la priorità maggiore, e viene applicata al pacchetto l‟azione corrispondente.
In questo esempio, ogni regola ha 5 espressioni, su 5 campi dell‟header del pacchetto (dal layer di rete a quello applicativo). Ogni espressione può essere una specifica del tipo prefisso/lunghezza (come nei lookup IP), oppure del tipo operatore/numero (può indicare un valore specifico, un intervallo o un limite inferiore). Inoltre si può utilizzare una wildcard, che combacia con ogni valore. Considero un insieme di regole C = Rj (1 ≤ j ≤ N), in cui ogni regola Rj ha d campi. I campi sono etichettati come Fi (1 ≤ i ≤ d), e Rj è indicata come .
Considero ad esempio un classificatore come la figura precedente, avente 7 regole su 4 campi. I primi 2 campi, F1 e F2, sono specificati attraverso prefissi, mentre gli altri 2, F 3 e F4, attraverso intervalli. L‟ultima colonna indica l‟azione associata alle regole. F 1 e F2 possono essere trattati in modo più efficiente utilizzando trie oppure TCAM, mentre F3 e F4 esprimendo i singoli numeri in intervalli ed eseguendo un lookup dell‟intervallo. Per confrontare e analizzare gli algoritmi, possono essere usati diversi criteri: Velocità di ricerca: i collegamenti ad alta velocità richiedono una classificazione rapida. Ad esempio, assumendo un pacchetto IP di 40 byte, i collegamenti a 10Gbps possono trasmettere fino a 31,25 milioni di pacchetti al secondo, quindi il tempo di classificazione è pari a 32 ns; Requisiti di memoria: memoria ridotta significa accesso rapido alla memoria e basso consumo energetico, che è importante per algoritmi software basati su cache e algoritmi hardware basati su SRAM; Scalabilità nella dimensione del classificatore: la dimensione del classificatore dipende dalle applicazioni. Per un router di confine che effettua operazioni su flussi ridotti, il numero di flussi è tra 128000 e 1000000. Ovviamente, il numero aumenta all‟aumentare della velocità del collegamento; Scalabilità nel numero di campi dell‟header: se si forniscono servizi più complessi, può essere necessario includere più campi dell‟header; Tempo di aggiornamento: se cambia il classificatore (per l‟aggiunta o la rimozione di una voce) è necessario aggiornare la struttura dati. Alcune applicazioni, come il riconoscimento dei flussi, richiedono che il tempo dell‟operazione sia breve, pena la diminuzione delle performance; Flessibilità nelle specifiche: l‟abilità di un algoritmo di gestire un‟ampia gamma di specifiche(prefisso/lunghezza, operatore/numero, wildcard, …) permette di utilizzarlo in
diverse circostanze; L‟algoritmo più semplice per la classificazione dei pacchetti è la ricerca lineare. L‟insieme di regole può essere organizzato in un array. Dato l‟header di un pacchetto in ingresso, le regole vengono esaminate una a una, finché non si trova una corrispondenza. Per un classificatore a N regole, sia la memorizzazione sia il tempo di ricerca hanno complessità O(N), rendendo questo schema irrealizzabile per grandi insiemi. Esistono perciò altri schemi di classificazione. 4.1 CLASSIFICAZIONE BASATA SUI TRIE 4.1.2 Trie gerarchici Un trie gerarchico è una semplice estensione di un albero a una dimensione in un albero a dimensioni multiple, in cui ogni dimensione rappresenta un campo (è anche noto come trie multilivello e trie of tries).Considero un trie gerarchico bidimensionale, che rappresenta i primi 2 campi dell‟insieme di regole C seguente:
Considero per comodità solo F1 e F2, poiché in quanto prefissi possono essere gestiti facilmente usando i trie: i nodi a forma di ellisse appartengono al trie di F1, mentre i nodi a forma di cerchio appartengono al trie di F2. I nodi in grassetto rappresentano il puntatore al trie successivo. Ci sono 4 trie di F2 perché ci sono 4 prefissi differenti nel campo F1 di C. Ogni nodo grigio è etichettato con una regola Rj: ciò significa che se quel nodo è raggiunto durante una ricerca, c‟è un match con la regola Rj. In generale, un trie gerarchico può
essere costruito in questo modo: si costruisce un trie binario radice, detto trie di F1, per l‟insieme di prefissi RJ1 che appartengono a F1 per tutte le regole. In seguito, per ogni prefisso p nel trie di F1, si costruisce un trie gerarchico Tp a (d-1) dimensioni in modo ricorsivo, per quelle regole che specificano correttamente p in 1 (cioè l‟insieme di regole Rj|Rj1 = p). Il trie Tp è connesso a p tramite un puntatore al trie successivo, salvato nel nodo p. La classificazione di un pacchetto in ingresso avente header (v 1, v2, …, vd) avviene in questo modo: l‟algoritmo di ricerca attraversa il trie di F1 basato su v1. Se incontra un puntatore al trie successivo, l‟algoritmo segue il puntatore e cerca in modo ricorsivo nel trie gerarchico a (d-1) dimensioni. Nel caso precedente, dato un pacchetto in ingresso (001, 110), il processo di ricerca comincia dal trie di F1 per trovare il prefisso con corrispondenza migliore con 001. Dopo aver raggiunto il nodo D nel trie di F1, si usa il puntatore al trie successivo per guidare la ricerca nel trie di F2 per trovare tutte le corrispondenze con 110: si raggiungono sia il nodo R1 sia il nodo R2, ma viene registrato solo R1, perché ha la priorità più alta. Ora risalgo fino al nodo B, cioè il predecessore più basso del nodo D nel trie di F 1. Ancora una volta uso il puntatore al trie successivo per cercare nel trie di F2. Il procedimento si ripete finché non esistono più nodi predecessori di D da cercare. In questo caso il processo di ricerca termina al nodo x, e l‟intero processo di attraversamento è indicato in figura dalla linea tratteggiata. Durante il percorso si trovano 3 corrispondenze: R1, R2 e R6. R1viene restituito come la regola a priorità più alta. Il processo di risalita è necessario poiché 001 può avere match con parecchi prefissi nel primo campo, e non si conosce a priori se il trie di F2 contiene uno o più prefissi che coincidono con 110. Inoltre bisogna cercare tutte le corrispondenze per essere sicuri di aver trovato quella con priorità massima. Il trie gerarchico è uno degli algoritmi più economici in termini di memoria: per un insieme di N regole, ognuna con d sottocampi e con lunghezza massima di ogni campo W, la complessità di memorizzazione è O(N∙d∙W). La struttura dei dati è diretta e facile da mantenere, ai danni di un tempo di ricerca più lungo. La complessità del tempo di ricerca è O(Wd). Aggiornamenti incrementali possono essere implementati in O(d2W), poiché ogni campo è memorizzato in esattamente una posizione, alla profondità massima O(d∙W).
4.1.2 Set-pruning trie Il set-pruning trie è una versione modificata del trie gerarchico, che evita la risalita (backtracking) durante il processo di ricerca. In un set-pruning trie, ogni nodo del trie (con un prefisso valido) duplica tutte le regole dei set delle regole dei suoi predecessori nel suo set di regole, e quindi costruisce la nuova dimensione del trie, basata sul nuovo set di regole.
Considero un set-pruning trie a 2 dimensioni, basato sui campi F1 e F2 del set di regole C. I nodi A, B e D del trie di F1 diventano {R7}, {R4, R5, R6, R7} e {R1, R2, R4, R5, R6, R7}, poiché sono state duplicate le regole. Il processo di ricerca di una d-upla consiste in d matching consecutivi del matching più lungo per ogni dimensione del set-pruning trie. Data una 2-upla (001, 110), il percorso di ricerca è evidenziato in figura dalla linea tratteggiata. R 1viene restituita come la regola matchata con priorità massima. Si possono incontrare differenti regole lungo il cammino, e viene salvata quella con la priorità più alta. Il nodo R 2 include le regole R2 e R6, ma si mantiene solo R2 perché ha priorità più alta. Il set-pruning trie non ha la necessita di backtracking, e quindi il tempo di ricerca ha complessità O(d∙W), anche se il costo di memorizzazione è O(Nd∙d∙W) (una regola può dover essere duplicata fino a Nd volte). La complessità di aggiornamento è O(Nd).
4.1.3 Greed of tries E‟ una struttura dati per la classificazione bidimensionale, che riduce la complessità di memorizzazione a O(N∙d∙W) (come il trie gerarchico), e mantiene il tempo di ricerca a O(d∙W) attraverso un precalcolo e la memorizzazione dei cosiddetti puntatori switching (switching pointers) in alcuni nodi del trie di F2. Il nodo del trie di F1 in un set-pruning trie duplica le regole appartenenti ai suoi predecessori. Ciò è analogo a dire che il nodo del trie di F1 unisce i trie di F2 dei suoi predecessori nel proprio trie di F2.
Ad esempio R7 nel nodo A del trie di F2 è duplicato 3 volte. Chiamando trie di F2-B il trie di F2 che appartiene al nodo B, l‟unica differenza tra i trie di F 2-B nelle 2 figure seguenti (trie gerarchico e set-pruning trie) è che nel set-pruning trie, il nodo R7 è duplicato.
Invece che duplicare i nodi, viene incorporato al nodo x‟ un puntatore switching etichettato con „0‟, che punta al nodo R7 nel trie di F2-A (i puntatori switching sono rappresentati dalle linee tratteggiate).
In pratica il puntatore switching etichettato con 0 al nodo x‟ sostituisce il puntatore a 0 nel set-pruning trie. Se, per un classificatore C, vengono costruiti il trie gerarchico e il set-pruning trie, la struttura a griglia di trie di C può essere costruita aggiungendo puntatori switching ai trie di F2 del trie gerarchico, o al trie del set-pruning trie. Un puntatore switching, ps, etichettato con 0/1 viene inserito al nodo y ogni volta che la sua controparte nel set-pruning trie contiene un puntatore a 0/1 a un altro nodo z, mentre y non lo contiene. Il nodo z può avere parecchie controparti nel trie gerarchico, ma ps punta a quello contenuto nel trie di F2 che è il più vicino al trie di F2 che contiene il nodo y. Ad esempio i nodi x e x‟ nelle 2 figure precedenti sono entrambi controparti del nodo x‟‟. Comunque il puntatore switching al nodo y punta al nodo x‟, poiché il nodo B è più vicino al nodo D rispetto al nodo A. Se i puntatori switching sono visti come puntatori 0/1, il processo di ricerca è identico a quello nel set-pruning trie. La struttura a griglia di trie ha un buon comportamento in termini di tempo di ricerca, pari a O(d∙W), e complessità di memorizzazione, pari a O(N∙d∙W), ma gli aggiornamenti incrementali sono complessi perché parecchi puntatori possono puntare a un singolo nodo. Se viene rimosso un nodo, deve esserne creato un altro, e quindi bisogna aggiornare i puntatori affinché puntino al nuovo nodo. 4.1.4 Schemi a 2 dimensioni L‟idea è quella di usare le caratteristiche dei database di regole per ridurre la complessità della ricerca multi-dimensionale a quella di una ricerca bidimensionale (2D). Si è osservato che ogni pacchetto matcha al massimo con poche coppie di prefissi sorgente-destinatario (SIP, DIP) presenti nel set di regole. In altre parole, se limitiamo il set di regole soltanto ai campi sorgente e destinatario, nessun pacchetto matcha con più di poche regole del nuovo set di regole. Questo non si verifica per i singoli campi, a causa delle wildcard: un pacchetto
può
combaciare
con
centinaia
di
regole,
considerando
un
campo
singolarmente. Pertanto è stata presentata l‟idea di un semplice metodo di classificazione 2D.
L‟idea è quella di usare un qualunque schema di matching 2D per trovare tutte le coppie diverse di prefissi sorgente-destinatario (S1, D1), …, (St, Dt) che matchano con l‟header. Per ogni coppia (Si, Di) c„è un array lineare, o una lista, con tutte le regole che contengono (S i, Di) nei campi sorgente e destinatario. Nella figura precedente, (S 1, D1) contiene le regole R5, R6, R2 e R4. Ogni regola può essere associata soltanto a una coppia sorgente-destinatario (forse perché a ogni regola è associata una priorità…). D‟altra parte, si può voler replicare le regole per ridurre le coppie di prefissi sorgente-destinatario considerate durante la ricerca, per ridurne il tempo. Durante la ricerca di una regola per una data chiave, parecchie coppie di prefissi sorgente-destinatario possono coincidere con la chiave. Ad esempio, (*, 000) e (1*, 0*) coincidono con una chiave (111, 000). Di conseguenza, le regole di ogni coppia matchata (S, D) verranno indagate più in profondità, con il resto della chiave. Ad esempio, se (S1, D1) è matchata, tutte le sue regole R5, R6, R2 e R4 vengono indagate, ad esempio con i numeri di porta della chiave. Nel caso peggiore, il tempo di ricerca è W∙(H+2) (W = ampiezza delle parole di classificazione; H = profondità del trie). 4.2 ALGORITMI GEOMETRICI Ogni campo di un classificatore può essere specificato o con una coppia prefisso/lunghezza o come operatore/numero. Dal punto di vista geometrico, entrambi i metodi possono essere interpretati come un intervallo sulla linea dei numeri. Ad esempio, una regola con 2 campi rappresenta un rettangolo nello spazio euclideo a 2 dimensioni, mentre una regola su d campi rappresenta un iperrettangolo nello spazio d-dimensionale. L‟header di un pacchetto (d-upla) rappresenta un punto P nello spazio d-dimensionale. Il problema della classificazione del pacchetto diventa quello di trovare l‟iperrettangolo a priorità massima che contiene P.
Dato il punto P(0010, 1100), si trova facilmente che la regola a priorità più alta è R 1. Ci sono diversi problemi nel campo della geometria computazionale che ricordano la classificazione dei pacchetti. Uno è il problema della posizione del punto, cioè trovare la regione che racchiude un punto, dato un insieme di regioni non sovrapposte. I limiti teorici della posizione di un punto in N regioni iperrettangolari e d>3 dimensioni sono un tempo O(logN) per uno spazio O(Nd), o un tempo O(logN)(d-1) per uno spazio O(N).
La classificazione diventa più difficile se gli iperrettangoli si possono sovrapporre. Ciò implica che la classificazione è estremamente complessa nel caso peggiore. Gli algoritmi di classificazione dei pacchetti implicano l‟interpretazione degli intervalli su certi campi del classificatore. Se i prefissi o gli intervalli di un campo sono rappresentati sulla linea di numeri [0, 2W -1], si ottiene un set di intervalli disgiunti, e la concatenazione di questi intervalli forma l‟intera linea dei numeri.
Ad esempio, ci sono 4 intervalli nella dimensione F1 e 5 nella dimensione F2. Dato un numero Z sulla linea di numeri, il problema del lookup degli intervalli consiste nel trovare l‟intervallo che contiene Z. Un metodo consiste nell‟usare la ricerca a k vie vista in precedenza. Un prefisso rappresenta un intervallo sulla linea di numeri. D‟altra parte, un intervallo arbitrario può richiedere fino a 2W-2 prefissi per rappresentarlo. Questa è una conclusione utile per analizzare come sia più alta la complessità di memorizzazione per alcuni algoritmi che supportano solo la specificazione dei prefissi. Il processo di trasformazione di un intervallo arbitrario in uno o più prefissi è detto splitting dell‟intervallo (range splitting). 4.1.2 Cross-producting scheme E‟ stato proposto uno schema cross-producting, possibile per un numero arbitrario di campi e per qualsiasi tipo di specificazione di campi. Lo schema funziona effettuando d operazioni di lookup degli intervalli, una per campo, e componendo i dati ottenuti per indicizzare una
tabella precalcolata che restituisce la regola matchata con più alta priorità. Considero F1 e F2 del classificatore C della tabella precedente: come primo passo, le specificazioni delle regole nei campi F1 e F2 sono proiettate a vicenda su 2 linee verticali di numeri, in modo da ottenere 2 insiemi di intervalli, {r1[0], ...,r1[3]} e {r2[0], ...,r2[4]}.
Ogni coppia di intervalli (r1[i], r2[ j]) corrisponde a un rettangolo, che contiene la regola matchata meglio, calcolata in precedenza („-„ significa che non ci sono regole che
matchano). Perciò, data una coppia (p1, p2), vengono effettuati 2 lookup degli intervalli su ogni insieme di intervalli e i 2 intervalli restituiti vengono composti per indicizzare la tabella precalcolata. Ad esempio, se p1 = 0010 e p2 = 1100, i 2 intervalli restituiti (r1[0], r2[3]) dicono che R1 è la regola matchata meglio. Per quanto riguarda il generico classificatore ddimensionale, si ottengono d insiemi di intervalli proiettando le specificazioni delle regole su ogni dimensione, e ogni elemento della tabella d-dimensionale può essere precalcolato nel modo visto prima. Lo schema cross-producting ha un tempo di ricerca di O(d∙tRL), dove tRL è il tempo di trovare un intervallo in una dimensione, tuttavia soffre di un problema di esplosione della memoria: nel caso peggiore, la tabella può avere O(Nd) voci. Perciò è stato proposto uno schema cross-producting con un sistema di cache. Gli aggiornamenti incrementali richiedono la ricostruzione della tabella cross-product, quindi non supporta bene classificatori dinamici. 4.2.2 Bitmap intersection Lo schema bitmap-intersection si applica alla classificazione multidimensionale dei pacchetti per qualsiasi tipo di specificazione in ogni campo. Lo schema si basa sul fatto che l‟insieme di regole, S, che matchano un pacchetto è l‟intersezione di d insiemi S i, dove Si è l‟insieme di regole che matchano singolarmente il pacchetto nella i-esima dimensione.
4 regole di un classificatore 2D sono rappresentate come 4 rettangoli e proiettate su 2 linee di numeri. Ciò permette di derivare 2 insiemi di intervalli {X1, …, X6} e {Y1, …, Y6} in ogni dimensione. Ogni intervallo è associato a una bitmap precalcolata di 4 bit, in cui ogni bit rappresenta una regola (se avessi n regole, avrei n bit). Un „1‟ nella bitmap di Xk/Yk indica che la regola matcha con gli intervalli Xk/Yk nella dimensione X/Y. Dato un pacchetto P(p1, p2), vengono effettuati 2 lookup di intervallo in ogni insieme di intervalli, e vengono determinati 2 intervalli, Xi e Yj, che contengono p1 e p2. Quindi la bitmap risultante, ottenuta dall‟intersezione (cioè un‟operazione di „AND‟ tra bit) delle bitmap di Xi e Yj, mostra tutte le regole matchate per P. Se le regole sono ordinate in ordine decrescente in base alla priorità,
il primo „1‟ nella bitmap indica la regola con priorità più alta. Si può espandere lo schema e applicarlo a una classificazione multidimensionale.
Poiché ogni bitmap ha un‟ampiezza di N bit, e ci sono O(N) intervalli in ognuna delle d dimensioni, lo spazio di memorizzazione è O(dN2). Il tempo di ricerca è O(d·tRL + dN/w), dove tRL è il tema per effettuare un lookup dell‟intervallo e w è la profondità della memoria. La complessità del tempo può essere ridotta di un fattore d eseguendo il lookup di ogni dimensione in parallelo. Gli aggiornamenti incrementali non sono supportati bene. Lo schema funziona bene per un numero piccolo di regole, ma ha un aumento quadratico nella memorizzazione e lineare nel tempo di classificazione dipendenti dalla dimensione del classificatore. 4.3 ALGORITMI EURISTICI 4.3.1 Classificazione a flusso ricorsivo (RFC) Si applica a una classificazione su campi multipli. Classificare un pacchetto implica mappare l‟header (H bit) in un identificatore di azione a T bit (T = log N, T << H) per un classificatore a N regole. Un metodo semplice ma poco pratico è quello di precalcolare l‟azione per ognuno dei 2H differenti header e salvare il risultato in un array di dimensione 2H∙2T. Ciò richiede ovviamente un solo accesso in memoria per ottenere il risultato richiesto, ma anche troppa memoria. L‟obiettivo principale del RFC è eseguire il mapping, ma in diverse fasi.
Il mapping è ottenuto in modo ricorsivo: a ogni passaggio, l‟algoritmo esegue una riduzione, mappando un insieme di valori in uno più piccolo. In ogni fase, un insieme di memoria restituisce un valore più piccolo (in termini di bit) dell‟indice dell‟accesso in memoria.
Le tabelle precalcolate sono costruite in questo modo: Si dividono i d campi dell‟header in pezzi (chunks), che sono usati per indicizzare in parallelo memorie multiple. Nel caso precedente ci sono 8 chunks. Un modo per formare i chunks è il seguente:
Ogni lookup parallelo mapperà il chunk su un equal ID (eqID) secondo determinate regole. Considero un chunk di b bit: la sua mapping table è di 2b voci, e ognuna contiene un eqID per quel valore del chunk. L‟eqID è determinato da quelle componenti delle regole nel classificatore che corrispondono a quel chunk. Si usa il termine CES (Chunk Equivalence Set)
per indicare tutti i valori con lo stesso eqID. Considero ad esempio il chunk 3 (Protocol) del classificatore in questa tabella:
Se ci sono 2 pacchetti aventi valori di protocollo che giacciono nello stesso insieme e con header identico, le regole del classificatore non li distinguerebbero. Quindi il CES per i chunk 3 (protocol) sarebbe: {TCP}, {UDP}, {tutti i numeri rimanenti nell‟intervallo 0-255}. Ogni CES può essere costruito in questo modo. Per un chunk di b bit, si proiettano le regole sulla linea di numeri [0, 2b -1]. Ogni componente viene proiettato su un insieme (non per forza contiguo, ad esempio se non c'è una regola, tipo default, cioè con*, che copre tutti i casi non specificati dalle altre regole) di intervalli sulla linea di numeri. I punti finali (end-points) di tutti gli intervalli proiettati dalle componenti formano un insieme di intervalli non sovrapposti. Due punti nello stesso intervallo appartengono allo stesso insieme di equivalenza. 2 intervalli sono nello stesso insieme di equivalenza se sono stati proiettati esattamente dalle stesse regole. In questa figura c‟è un esempio di chunk 2 (Port Number) del classificatore nella tabella precedente con gli end-points degli intervalli (I0, …, I4) e gli insiemi di intervalli (E0, …, E3):
I 4 CES possono essere decodificati usando 2 bit: ad esempio assegno „00‟ a E1, „01‟ a E0, „10‟ a E2 e „11‟ a E3. A questo punto la tabella RFC per questo chunk viene riempita con gli eqID corrispondenti, ad esempio: table (20) =„01‟, table (23) =„11‟, ecc. Nei passi successivi un chunk è formato dalla combinazione di 2 (o più) chunks ottenuti dai lookup di memoria negli step precedenti, con il CES corrispondente. Se ad esempio il chunk risultante ha ampiezza di b bit, si possono creare insiemi di equivalenza tali che 2 numeri di b bit, che non sono distinti dalle regole del classificatore, appartengano allo stesso CES. Quindi (20, UDP) e (21, UDP) saranno nello stesso CES del classificatore al secondo step di questa tabella:
Per determinare i nuovi insiemi di equivalenza per questa fase, si calcolano tutte le possibili intersezioni degli insiemi di equivalenza, ottenute combinando gli step precedenti. Ogni intersezione distinta è un insieme di equivalenza per il chunk appena creato. Ad esempio, se si combina il chunk 2 (numero di porta) con il 3 (protocollo), si ottengono 5 chunks: (a) { ({80}, {UDP})}
// http ha 80 come porta
(b) { ({20 − 21}, {UDP})} (c) { ({80}, {TCP})} (d) { ({gt1023}, {TCP})} (e) {tutte le altre possibili combinazioni}. Ciò può essere espresso con eqID di 3 bit
Da ciò si può vedere che il numero di bit si è ridotto da 4 a 3 durante il primo step e il secondo step. Dalla combinazione dei 2 step, il numero è calato da 24 (16 bit per port number e 8 per protocol) a 3. La classificazione di un pacchetto viene quindi divisa in parecchi chunks, usati come indice: quindi gli eqID richiesti sono combinati in chunks della seconda fase. La procedura continua fino a che si raggiunge l‟ultima fase, quando tutti gli eqID rimanenti sono stati combinati in un unico chunk. La tabella corrispondente manterrà le azioni per quel pacchetto. I contenuti di ogni memoria sono scelti affinché il risultato del lookup sia più ristretto dell‟indice. Differenti combinazioni dei chunk possono produrre differenti requisiti di memoria. I classificatori reali 4D che hanno fino a 1700 regole possono usare RFC in modo pratico per linee a 10Gbps in hardware e 2,5 Gbps in software. Tuttavia lo spazio di memorizzazione e il tempo di precalcolo crescono rapidamente per classificatori aventi più di 6000 regole. Una possibile ottimizzazione riduce lo spazio richiesto da un
classificatore a 4 campi e 15000 regole fino a 4Mbytes. 4.4 ALGORITMI BASATI SULLE TCAM Gli algoritmi basati sulle TCAM stanno avendo una popolarità sempre maggiore nella classificazione
rapida
dei
pacchetti.
In
generale,
un
coprocessore
(tipologia
di processore che si contraddistingue per essere ausiliaria a un altro processore, ad esempio GPU) TCAM lavora come un processore associato per la classificazione dei pacchetti per conto di un‟unità di elaborazione di rete (NPU), detta processore di rete (network processor). Appartengono alla famiglia degli ASIP e sono caratterizzati da grossa versatilità e da ottime prestazioni in termini di throughput. Quando un pacchetto deve essere classificato, una NPU genera una chiave di ricerca basata sulle informazioni estratte dall‟header e le passa al coprocessore
TCAM
per
la
classificazione,
attraverso
un‟interfaccia
NPU/TCAM. Il
coprocessore TCAM trova una regola matchata in O(1) cicli di clock, e perciò offre la miglior performance.
Una CPU locale aggiorna le tabelle delle regole attraverso un‟interfaccia CPU-TCAM separata. Nonostante le performance nel lookup, uno dei problemi più critici nell‟uso delle TCAM per la classificazione dei pacchetti è il range matching, cioè come effettivamente gestire le regole di filtraggio con gli intervalli. La difficoltà nasce dal fatto che devono essere allocate voci multiple nelle TCAM per rappresentare una regola con intervalli. Un intervallo si dice esattamente implementato in una TCAM se è espresso in una TCAM senza essere codificato. Ad esempio, sono necessarie 6 voci (cioè i primi 6 bit) per esprimere un intervallo {> 1023} = {> 0000 0011 1111 1111} in una TCAM, se l‟intervallo è implementato esattamente, come in questo caso (mediante 6 sottointervalli):
Le attuali tabelle di policy/firewall di filtraggio (PF) implicano una quantità significativa di regole con intervalli. L‟efficienza di memorizzazione TCAM può essere bassa (16%) a causa di un numero significativo di regole con intervalli di porte. L‟efficienza ridotta, oltre al costo e al consumo energetico, rende il problema ancora più serio. Una soluzione per trattare gli intervalli è quella di effettuare una preelaborazione degli intervalli, mappandoli in una sequenza di bit (bit-mapping). L‟idea è quella di vedere una regola,espressa con una dupla, come una regione in uno spazio d-dimensionale di regole, e codificare ogni regione distinta sovrapposta tra tutte le regole, in modo che ogni regola può essere tradotta in una sequenza di bit (rule encoding). Di conseguenza, una chiave di ricerca, che è basata sulle informazioni estratte dall‟header, viene preprocessata per generare una chiave di ricerca codificata (search key encoding). Quindi, la chiave codificata viene confrontata con tutte le regole codificate per trovare la regola che matcha meglio. A differenza del rule encoding, che può essere preprocessata in software, il search key encoding viene effettuato in hardware a wire-speed. Quando si usa la specificazione degli intervalli per i campi senza codifica degli intervalli, bisogna eseguire il range splitting per convertire gli intervalli in formati di prefissi per adattarli ai limiti dei bit. Ciò aumenta il numero di voci, e potrebbe rendere le TCAM irrealizzabili per alcuni classificatori che usano la specificazione degli intervalli. Esiste un efficiente schema di codifica per i classificatori di intervalli nelle TCAM. L‟algoritmo espande le TCAM orizzontalmente (usando più bit per la ricerca), e per un‟applicazione limitata in ampiezza, viene proposto un algoritmo che permette un‟espansione verticale e orizzontale. Per ogni intervallo di campo, si usa un vettore di n bit B = b1, b2, …, bn per rappresentarlo (n = numero di intervalli distinti specificati per ogni campo). Il vettore B per l‟intervallo Ei ha 1 nella posizione di bit i (cioè bi = 1), mentre tutti gli altri bit sono „don‟t care‟. Ciò si basa sull‟osservazione che anche se il numero di regole in un classificatore può essere grande, il numero di intervalli distinti specificati per un qualsiasi intervallo nel campo è limitato, e anche l‟esatta specificazione degli intervalli avviene frequentemente per un campo. Nelle prossime 2 figure ci sono una tabella e la sua rappresentazione dei vettori di bit (n = 5). Ad esempio l‟intervallo di valori più grandi di 1023 in R1è rappresentato da „xxxx1‟.
Una chiave di lookup v ∈ [0, 2k] viene tradotta in un vettore di n bit V = v 1, v2, …, vn. Il bit viviene settato a 1 se la chiave v cade nell‟intervallo corrispondente Ei, altrimenti viene posto a 0. La traduzione delle chiavi di lookup può essere implementata con un lookup diretto di memoria, poiché la maggior parte degli intervalli di campo ha ampiezza minore di 16 bit. Una tabella completa di traduzione delle chiavi di lookup per il classificatore, per ogni possibile chiave di lookup, è mostrata in questa figura:
Ad esempio il vettore di bit più a destra è settato a „1‟ per tutte le posizioni oltre il 1024 (incluso). Inoltre, il secondo bit da destra tra le posizioni 50 e 2000 (incluse) viene anch‟esso settato a „1‟. Possono essere fatte alcune ottimizzazioni per il match esatto. Si può ridurre il numero di bit usati fino a log2 (m+1), dove m è il numero di match esatti. La rappresentazione in bit conterrà2 parti : Be per i match esatti, e B per gli altri. Be = b1, b2, …, bt è un vettore di t bit, dove t ≥ log2 (m + 1). Per un normale intervallo (ad esempio 502000), e la sua porzione B è la stessa di prima. Per un match esatto (ad esempio 80), , se questo è l‟i-esimo match esatto. Nell‟esempio precedente, se si usano i bit 2 e 3 come Be (dove il bit 1 è il bit significativo più a sinistra), il classificatore salvato nelle TCAM è questo:
Le regole che hanno exact match sono le 3regole R3, R4 e R5: quindi sono necessari t = log2(3+1) bit, quindi ne prendo 2. Perciò codifico, attraverso i bit 2 e 3, le 3 regole rispettivamente mediante la codifica 01, 10 e 11. Di conseguenza la tabella della traduzione delle chiavi di lookup ha bisogno di essere cambiata. La chiave di lookup contiene anche 2 parti : Ve corrisponde a tutti i match esatti, e V al resto. Ve = {v1, v2, …, vt} è un vettore di t bit (ad esempio b2 e b3 della colonna di destra della figura precedente), e Ve = i se la chiave di lookup v è uguale all‟i-esimo match esatto, altrimenti Ve = 0. Assumo che il classificatore sia salvato in una TCAM come nell‟esempio precedente: arriva un pacchetto con indirizzo di destinazione 192.169.10.1 e numero di porta 80. Prima viene indicizzato il numero di porta nella tabella di traduzione delle chiavi di lookup: risulta V = 10, perché 80 cade nell‟intervallo 50-2000 ma non in quello > 1023. Il Ve risultante è 01, poiché 01 è il valore assegnato per matchare esattamente il valore 80. Insieme all‟indirizzo IP di destinazione, il risultato finale è 3. Questo schema richiede meno spazio di memorizzazione TCAM. Ciò permette di ospitare un numero maggiore di regole in una singola tabella TCAM, e quindi ridurre costi e consumi energetici. Nel frattempo, ciò ha il vantaggio di avere un tempo di esecuzione deterministico sui dispositivi TCAM. Detto ciò, l‟aggiunta o la rimozione di regole causa il cambiamento dei vettori di bit, e quindi può richiedere il ricalcolo dell‟intera tabella di traslazione, che è un processo che richiede tempo.
5. PACKET SWITCHING Un router IP è un nodo di rete vitale per l‟attuale rete di packet switching. Esso consiste in diverse porte di input/output. I pacchetti arrivano alle porte di ingresso di un router IP da molteplici sorgenti. Questi sono inviati alle porte di uscita appropriate da una switch fabric secondo una forwarding table, aggiornata da protocolli di routing (RIP, BGP, …). In una rete a commutazione di pacchetto, pacchetti da diverse porte di ingresso possono essere destinati allo stesso momento alla stessa porta di uscita, dando vita a una contesa per la porta. La gestione di queste contese è una sfida importante nella realizzazione delle switch fabric. Le reti telefoniche tradizionali usano tecniche di commutazione di circuito per stabilire connessioni: in questo schema, c‟è solitamente un processore centralizzato che determina tutte le connessioni tra le porte di ingresso e uscita. Ogni connessione rimane attiva in media per 3 minuti. Per uno switch NxN, ci sono contemporaneamente al massimo N connessioni, e il tempo richiesto per realizzare ogni connessione è 180 secondi/N. Se ad esempio ci sono 1000 connessioni, il tempo per realizzarne una è al massimo 180 ms, abbastanza comodo per la maggior parte degli switch che usano le attuali tecnologie (come i chip CMOS). Tuttavia per i router IP il tempo necessario per configurare le connessioni è molto più rigido, e normalmente è basato su un time-slot di lunghezza fissa. Ad esempio il timeslot potrebbe essere quello impiegato per la trasmissione di 64 byte, in modo da coprire i 40 byte del più piccolo pacchetto: in un collegamento a 10 Gbit/s, il timeslot è pari a 50 ns. All‟aumentare del bit rate o del numero delle porte, il tempo richiesto per ogni connessione viene ridotto ulteriormente. Di conseguenza, non è pratico assumere processori centralizzati per le connessioni tra input e output. Perciò per i router IP non si usa un processore centralizzato, ma piuttosto uno schema self-routing, per stabilire connessioni input-output in maniera distribuita. In altre parole, la switch fabric ha un‟intelligenza per instradare pacchetti alle porte opportune, basata sugli indirizzi fisici delle porte di uscita, scritti su ogni pacchetto. Una switch fabric che ha questa capacità di self-routing è lo switch Banyan. In aggiunta all‟instradamento dei pacchetti nei router IP, un‟altra importante funzione è quella di risolvere le contese. Ci sono diversi schemi proposti per questo scopo: un metodo è quello di permettere a tutti i pacchetti destinati alla stessa porta di giungere simultaneamente. Poiché può essere trasmesso un solo pacchetto alla volta, gli altri rimangono in coda alla porta di uscita. Uno switch con queste caratteristiche è detto output-buffered switch. Per questo schema, bisogna gestire switch fabric e memoria con una velocità di N volte quella del collegamento, dove N è la dimensione dello switch. Se aumentano il numero di porte o la velocità del collegamento, questo schema diventa impossibile da realizzare. Tuttavia, se non si permette a tutti i pacchetti di raggiungere la stessa porta allo stesso tempo, si richiede uno schema di scheduling (detto schema di arbitrato) per gestire i pacchetti destinati alle stesse porte. I pacchetti che perdono la contesa devono attendere in un buffer all‟ingresso: un‟architettura di questo tipo è detta input-buffered switch. Il modo di gestire le contese
influisce su costo e performance. Alcuni schemi sono implementati in maniera centralizzata, altri in maniera distribuita: i primi sono solitamente più semplici e piccoli, gli altri permettono la scalabilità in termini di velocità di collegamento e dimensione di switch. Lo scheduling dei pacchetti può essere applicato anche all‟output dei pacchetti, per schedulare la trasmissione dei pacchetti in base alle priorità e alla banda allocata per soddisfare determinati requisiti (QoS, …). Switching and routing: l‟obiettivo principale di switching e routing è lo stesso, trasferire informazione da un punto all‟altro. Tuttavia, il routing normalmente rappresenta una prospettiva a larga scala, dove le informazioni sono scambiate tra 2 nodi che possono essere molto distanti tra loro. Invece lo switching si riferisce di solito alle informazioni scambiate all‟interno di un nodo di rete. In particolare, il routing necessita solitamente della cooperazione di altri nodi, ed è basato su protocolli di routing, mentre lo switching è solo una funzione di un singolo dispositivo, ed è basato su forwarding table, architetture di switching e algoritmi di scheduling. Le 2 figure seguenti sono un esempio rispettivamente di routing e switching.
Unicast e multicast: la maggior parte delle connessioni di rete sono punto-punto (dette unicast). Di conseguenza tutto il traffico che entra in una porta di ingresso di una switch fabric è destinato solo a una porta di uscita. Tuttavia, per applicazioni come broadcasting di dati e video-conferenze, il traffico da una sorgente è inviato a parecchie destinazioni differenti. Per supportare il multicast, sono necessari meccanismi di switching extra per copiare i dati da una singola porta a differenti porte in uscita.
Throughput e speedup: il throughput di una switch fabric è definito come il rapporto tra la velocità media del traffico totale in uscita e la velocità media del traffico in ingresso quando tutte le porte in ingresso trasportano traffico pari al 100% della capacità del collegamento. E‟ un valore positivo e < 1.
Un‟accelerazione (speedup) di k significa che la velocità di forwarding interna è k volte quella del collegamento in ingresso. Quindi, quando k > 1, significa che bisogna usare dei buffer nelle porte di uscita. Lo speedup permette di inviare più di un pacchetto nello stesso timeslot, per attenuare le contese per le porte, causando un throughput maggiore.
Blocking e contese sugli output: nello switching a divisione di spazio, il problema principale è il matching tra porte in ingresso e uscita. Se c‟è sempre la possibilità di stabilire una connessione tra una porta in ingresso e una in uscita, entrambe non attive (idle), si parla di “nonblocking”. Una porta idle è una porta né connessa né richiesta. D‟altra parte, “blocking” significa che è possibile che non si possa stabilire una connessione tra una porta idle in ingresso e una portaidle in uscita.
Questa è la rappresentazione di un blocking interno in uno switch di Clos a 3 stage, quando la porta in ingresso idle 9 richiede una connessione alle porte in uscita 4 oppure 6, idle, che non può essere realizzata a causa del blocking.
In quest‟altro caso, una rete delta, la porta in ingresso 0 richiede una connessione con la porta di uscita 5, e la porta 2 richiede una connessione alla porta 4, ma entrambe necessitano della stessa porta di uscita nel secondo stage per stabilire le connessioni, e ciò causa un blocking interno. Una tipica architettura nonblocking è il crossbar switch. Un altro problema che abbassa il throughput di una switching fabric è la contesa dell‟output, dovuto alla natura “burst” del traffico IP.
Se h porte in ingresso richiedono la stessa porta di uscita, e lo speedup è k, allora k pacchetti sono mandati al buffer di output, in attesa della trasmissione. Poiché si può trasmettere un solo pacchetto per timeslot, allora(h-k) pacchetti non possono attraversare lo switch fabric e devono attendere nei buffer d‟ingresso. Switching cell-mode e packet-mode: nelle reti ATM (protocollo di livello 2), l‟informazione è impacchettata in celle di dimensione fissa, quindi, in uno switch ATM, lo scheduling avviene per un tempo di cella, quindi un timeslot. Invece nelle reti IP si adottano pacchetti di dimensione variabile, e quindi gli algoritmi dei router IP operano sulla base del pacchetto (packet-mode switching). A causa della distribuzione casuale della lunghezza dei pacchetti, lo scheduler diventa troppo complesso per essere utilizzato in router su larga scala. Per implementare la tecnologia di switching di cella ATM nei router IP, è stata proposta un‟architettura come questa:
In ogni porta di ingresso, si impiega un modulo di segmentazione di ingresso (ISM) per convertire il pacchetto IP di lunghezza variabile in celle di lunghezza fissa. Se il pacchetto rimanente è più corto di un‟intera cella, questa viene riempita (“stuffing”) in modo opportuno. Quindi le celle sono bufferizzate nelle code di celle (CQ), ad esempio le code di uscita virtuali (VOQ), ognuna associata a un output. Ci sono specifici algoritmi di scheduling per estrarre le celle dalle VOQ e switcharle alla porta di uscita corretta. Si richiede quindi un modulo di riassemblaggio in uscita (ORM) per riassemblare assieme le celle dello stesso
pacchetto. Dopo l‟ORM, si usa una coda di pacchetti FIFO (detta PF) per bufferizzare i pacchetti riassemblati se l‟ORM ha uno speedup. Questa strategia è detta cell-mode switching in router IP. 5.2 SWITCH FABRIC Le switch fabric possono essere classificate in base alle loro tecniche di switching: timedivision switching (TDS), a sua volta diviso in shared-memory e shared-medium, e spacedivision switching (SDS), a sua volta diviso in single-path e multiple-path. 5.2.1 Time division switching (TDS) Le celle provenienti dai diversi input sono multiplate e inviate attraverso un percorso che connette tutti gli input e tutti gli output. Questa struttura è limitata dalla banda di comunicazioni interne che dovrebbe raggiungere la banda complessiva di invio di tutte le porte input. Tuttavia, questa classe di switch fornisce un vantaggio: poiché ogni cella scorre attraverso la singola struttura di comunicazione, può essere facilmente ampliata per supportare operazioni multicast/broadcast. In uno switch shared-medium, le celle che arrivano alle porte input vengono multiplate a divisione di tempo in un mezzo comune ad alta velocità, ad esempio un bus o un anello, di banda pari a N volte la frequenza di linea di ingresso. Un filtro di indirizzi (AF) e un buffer di uscita FIFO vengono usati in ogni linea di uscita che connette al mezzo condiviso. L‟AF esamina l‟header di ogni cella in arrivo e quindi accetta solo le celle destinate a essa. In questo modo, le celle in ingresso multiplate sono demultiplate verso le porte di output corrette. A causa del buffer FIFO separato per ogni porta di uscita, l‟utilizzo della memoria dello switch shared-medium è minore della struttura shared-memory. Per uno switch shared-medium, la dimensione dello switch è limitata dal tempo di accesso in lettura/scrittura in memoria, poiché bisogna accedere a N celle in ingresso e 1 in uscita in un time-slot. Se il tempo di un time-slot è TS e il tempo di accesso a memoria e Tmem, la dimensione N dello switch è data dalla formula (N+1) ≤ TS/Tmem. In uno switch memory-shared, così come negli switch shared-medium, le celle provenienti da tutte le porte di input vengono multiplate a divisione di tempo nella logica centrale. Tuttavia, non vengono inviate immediatamente agli output, così come avviene nella struttura sharedmedium, ma vengono bufferizzate in una memoria centrale, e quindi schedulate al demultiplatore, dove le celle destinate alle differenti porte vengono separate. La struttura shared-memory è migliore nell‟utilizzo della memoria rispetto alla struttura FIFO separata nella struttura shared-medium, ma richiede una velocità di memoria doppia.
5.2.2 Space division switching (SDS) Rappresenta una struttura dove sono possibili diversi path di dati tra le porte input e output, e le celle delle diverse connessioni input-output possono essere inviate contemporaneamente, se non è presente blocking. La capacità totale è quindi il prodotto della banda di ogni path e il numero di path che possono trasmettere celle simultaneamente. Tuttavia, in pratica, la capacità dello switch è limitata dai limiti fisici di implementazione. Gli switch SDS sono classificati in base al numero di path possibili tra ogni coppia input-output. Negli switch single-path, esiste un solo path per ogni coppia input-output, mentre negli switch multiplepath possono essercene di più. Il primo ha un controllo di routing più semplice, ma il secondo ha una migliore flessibilità di connessione e tolleranza agli errori. 5.2.2.1 Single-path switches 5.2.2.1.1 Crossbar switch Uno switch crossbar NxN consiste in array bidimensionali di N2 crosspoint, che corrispondono alle coppie input-output. Ogni crosspoint ha 2 possibili stati: cross (default) e bar. Una connessione tra la porta input i e la porta output j viene stabilita settando l‟(i,j)esimo crosspoint allo stato bar, e lasciando allo stato cross gli altri crosspoint lungo la connessione. Lo stato bar può essere attivato individualmente da ogni cella in ingresso, quando la sua destinazione coincide con l‟indirizzo di output. Non è richiesta nessuna informazione globale a proposito delle altre celle e delle altre destinazioni (proprietà di self-routing), e ciò riduce notevolmente la complessità del controllo, poiché la funzione di controllo è distribuita tra tutti i crosspoint. Il crossbar switch permette di trasferire fino a N celle con differenti porte input e output nello stesso timeslot. I crossbar switch hanno 3 proprietà: nonblocking interno, architettura semplice e modularità. Tuttavia, il numero di crosspoint cresce come funzione di N2, o come N∙logN, se si costruiscono switch multistage più grandi con moduli di crossbar switch più piccoli. In un crossbar switch non c‟è blocking interno.
5.2.2.1.2 Fully interconnected switches Un altro tipo di single-path SDS sono i fully interconnected switches. La connettività completa tra input e output viene di solito raggiunta usando N bus broadcast separati, da ogni porta di input a tutte le porte output. Sono richiesti N buffer separati, uno per ogni porta output. Tuttavia, se ognuno di questi N buffer viene partizionato e dedicato a ogni linea input, producendo N2 buffer dedicati, diventa topologicamente identico allo switch crosspointbuffered, e quindi fornisce esattamente le stesse performance e la stessa complessità di implementazione. Questo switch opera in maniera simile allo switch shared-medium. Una cella da una qualsiasi porta input viene inviata in broadcast a ogni porta output. La differenza è che celle multiple da parecchie porte input possono essere inviate in broadcast contemporaneamente a ogni porta output. Perciò sono richiesti filtri e buffer dedicati, uno per ogni porta output, per filtrare le celle inviate alla porta sbagliata e memorizzare temporaneamente le celle inviate correttamente. Inoltre, lo switch fully interconnected è diverso dallo switch shared-medium nel fatto che il requisito di speedup dovuto alla trasmissione sequenziale nel mezzo condiviso è rimpiazzato da un overhead di spazio dovuto ai N2 bus di broadcast separati. I vantaggi sono invece una semplice struttura non-blocking, simile a uno switch crossbar-based.
5.2.2.1.3 Banyan-based switches Sono gli SDS single-path. Sono una famiglia di switches self-routing, costruiti da elementi di switching 2x2 con un singolo path tra ogni coppia input-output. Ci sono 3 topologie isomorfe: delta, omega e banyan, che appartengono alla famiglia banyan-based. Tutti questi offrono performance equivalenti.
5.2.2.2 Multiple-path switches 5.2.2.2.1 Augmented Banyan Switches In uno switch NxN regolare, le celle passano attraverso logN stage di elementi di switching prima di raggiungere le destinazioni.
Questo schema si riferisce al banyan switch che ha più stage rispetto al banyan switch classico (regular). In uno switch banyan classico, una volta che una cella viene deviata verso un link sbagliato, e quindi deviata dall‟unico path predeterminato, non è garantito che la cella raggiunga l‟output richiesto. In questo schema, alle celle deviate sono fornite più chance per essere indirizzate alle loro destinazioni. Quando le celle deviate non raggiungono le destinazioni dopo l‟ultimo stage, vengono scartate. Il vantaggio è dovuto al fatto che, aggiungendo stage, si riduce il rate di perdita di celle, aumentando le performance. Lo svantaggio è invece uno schema di routing complicato. Le celle sono esaminate a ogni stage per determinare se sono arrivate alle porte di output richieste. Se è così, verranno mandate al modulo di interfaccia di output, altrimenti sono inviate allo stage successivo ed esaminate ancora. Un altro svantaggio è che il numero di stage deve essere sufficientemente grande per soddisfare le performance richieste, e ciò aumenta la complessità hardware. 5.2.2.2.2 Three-stage Clos Network La struttura consiste in 3 stage di moduli switch. Il primo è usato per distribuire traffico, nel secondo parecchi moduli paralleli di switch forniscono cammini multipli attraverso gli switch, e nell‟ultimo le celle da differenti moduli switch sono switchate alle corrette porte di output.
5.2.2.2.3 Multiplane switches Si riferiscono a switch che hanno multipli piani di switch, spesso identici. Questo schema è proposto come un modo per aumentare il throughput del sistema, e usando meccanismi per distribuire il carico di traffico in ingresso è possibile ridurre le collisioni. Inoltre, può essere trasmessa più di una cella alla stessa porta output, usando ogni piano di switch, così le linee di output non devono per forza operare a una velocità maggiore di quella delle linee di input. Un altro vantaggio è che sono usati per raggiungere l‟affidabilità, poiché la perdita di un intero piano di switch ridurrà la capacità ma non la connettività dello switch.
5.2.2.2.4 Recirculation switches Questi switch sono disegnati per gestire il problema della contesa delle porte di uscita. Facendo ricircolare le celle che non raggiungono la porta output nel timeslot, può essere ridotto il rate di perdita di celle, e ciò comporta un aumento di throughput del sistema. Lo svantaggio è rappresentato dal fatto che è richiesta una dimensione maggiore dello switch per permettere la ricircolazione, che può causare errori nell‟ordine di sequenza. Si richiedono perciò meccanismi per preservare la sequenza delle celle nella stessa connessione.
5.3 STRATEGIE DI BUFFERING Poiché gli arrivi burst di traffico probabilmente si contendono le porte di uscita e/o i collegamenti interni, si richiedono buffer per ospitare temporaneamente le celle che perdono la contesa. Esistono quindi varie strategie di buffering: 5.3.1 Shared-memory queuing La memoria contiene N code logiche, una per porta di uscita, e ogni coda salva le celle destinate alla porta corrispondente. La memoria è condivisa da tutte le porte in uscita e l‟utilizzo della memoria è massimo. Tuttavia, lo svantaggio è che in ogni timeslot la memoria deve ospitare N accessi concorrenti a scrittura e N accessi concorrenti a lettura, e ciò limita lo switch ad avere piccole dimensioni.
5.3.2 Output queuing (OQ) Le celle sono inviate immediatamente alle porte di uscita destinate una volta arrivate alle porte di ingresso. Poiché la frequenza di arrivo in ogni porta di arrivo è maggiore della capacità del collegamento in uscita, sono necessari buffer alle porte di uscita. La struttura OQ trae vantaggio da un‟abilità migliore nel controllo del QoS, poiché le celle sono sempre disponibili alle porte di uscita per essere schedulate, in base ai livelli di priorità, alla banda allocata e ai requisiti nei termini di QoS. Tuttavia questa struttura soffre i limiti della velocità di memoria e quindi ha limitazioni nella dimensione dello switch. Questo accade perché ci possono essere fino a N celle, da differenti porte di ingresso, destinate alla stessa porta di uscita nello stesso tempo di cella. L‟utilizzo della memoria non è buono come nella sharedmemory queuing.
5.3.3 Input queuing (IQ) A causa della limitazione nella dimensione dello switch nella struttura OQ, negli ultimi anni la struttura input queuing ha attratto una maggiore attenzione. L‟input queuing ha una sola coda FIFO per ogni porta di ingresso per bufferizzare le celle. Un algoritmo di scheduling viene utilizzato per matchare le porte di ingresso con quelle di uscita, poiché solo una cella può essere inviata alla porta per ogni timeslot. Un problema in questo caso è il cosiddetto head-of-line (HOL) blocking.
In questo caso, la porta di ingresso 0 non può mandare la sua cella in testa alla lista verso la porta di uscita 2, avendo perso la contesa contro la porta di ingresso 3. Tuttavia, la cella dietro la HOL nella porta di ingresso 0 non può essere trasmessa, anche se la porta di uscita 1 è idle. Ciò comporta una diminuzione del throughput (in condizioni normali, il throughput diventa il 58,6%). 5.3.4 Virtual Output Queuing (VOQ) Per eliminare l‟HOL blocking, si usa la struttura virtual output queuing(VOQ). Le celle sono bufferizzate alle porte di ingresso, tuttavia il buffer è diviso in N code logiche, dette VOQ, che ospitano le celle destinate alla porta di uscita associata. La cella HOL di ogni VOQ viene schedulata nel tempo di cella corrente, confrontata con la struttura di input queuing, e solo una cella HOL di ogni ingresso può essere inviata. Tuttavia, poiché il numero di code logiche è N volte la struttura di input queuing, l‟algoritmo di scheduling è molto più complicato. Sono stati proposti parecchi algoritmi di scheduling: l‟obiettivo principale è scegliere gli HOL inputoutput da una matrice NxN.
5.3.5 Combined Input and Output Queuing (CIOQ) Un altro modo per combattere l‟HOL blocking è permettere a ogni porta di uscita di ricevere più di una cella in ogni timeslot. In questo modo la switch fabric opera a S volte la velocità del collegamento, dove 1 < S < N. Poiché la switch fabric opera più velocemente del collegamento, devono essere messi buffer sia alle porte di ingresso sia in quelle di uscita, per coprire le 2 velocità differenti.
Questa è la struttura del CIOQ: ogni porta ha una coda FIFO. Con uno speedup di 4, lo switch CIOQ può avere un throughput del 99% in condizioni normali di traffico. Esiste una struttura CIOQ migliorata:
Questa ha N code VOQ nel buffer di ingresso, mentre ogni porta di uscita ha una singola coda FIFO. In condizioni di traffico leggermente confinato, la struttura CIOQ può emulare uno switch a coda di uscita FIFO (FIFO-OQ, fornisce il miglior rapporto ritardo/throughput) con uno speedup pari a 2 con un ritardo limitato.
5.3.6 Crosspoint Queuing Per una crossbar switch fabric, si può mettere un buffer a ogni crosspoint. Le celle in ingresso sono inizialmente messe nel buffer del crosspoint corrispondente (XB), in attesa di essere trasmesse nelle porte di uscita. Un arbitrato di ogni output sceglie una cella tra gli XB sulla stessa colonna in base ad alcuni schemi di scheduling, ad esempio round robin. Questo switch può raggiungere le stesse performance degli switch OQ, poiché non c‟è HOL blocking. Tuttavia, poiché ci sono N2 differenti buffer, l‟effetto di condivisione è molto ridotto. Avendo uno spazio di chip limitato, possono essere implementate solo poche celle. Di conseguenza, questo switch solitamente aggiunge VOQ a ogni ingresso.
5.4 PERFORMANCE Modelli di traffico: le celle arrivano alle porte di input slot-by-slot. Secondo gli arrivi di Bernoulli, la probabilità di arrivo in ogni timeslot è indipendente dagli altri slot, ed è detta carico offerto all‟input. Se ogni cella ha la stessa probabilità di essere inviata a ogni output, il traffico diventa uniformemente distribuito nello switch. Considero una disciplina di servizio FIFO per ogni input. Solo le celle HOL si contendono l‟accesso agli output dello switch. Se ogni cella è destinata a un output differente, lo switch permette di inviare ai rispettivi output. Se k celle HOL sono destinate allo stesso output, una passa e le altre k-1 devono attendere il successivo timeslot. Mentre una cella attende il suo turno per accedere a un output, altre celle dietro di lei sono bloccate e non possono raggiungere output idle. Se N è piccolo, può essere utilizzato un modello di Markov per valutare il throughput. Quando N è grande, il numero di celle HOL per slot destinate a un particolare output diventa un processo di Poisson. I limiti di blocking HOL limitano il throughput fino a 0.586, per N-> ∞.
Modello on-off e traffico bursty: ogni input alterna periodi di attività e di idle di durata geometricamente distribuita. Una sorgente di traffico continua a inviare celle in ogni timeslot durante il periodo di attività, e si ferma dal farlo durante il periodo idle. La durata del periodo di attività (burst) è determinata da una variabile casuale X ∈ {1, 2, …}, che si assume distribuita geometricamente in β celle (lunghezza media del burst). In modo analogo, la lunghezza del periodo off è determinata da una variabile casuale Y ∈ {0, 1, 2, …}, che si assume distribuita geometricamente in α celle. Si definisce q la probabilità di iniziare un burst in ogni timeslot, e p la probabilità di terminare il burst. Si suppone che le celle in arrivo su una porta input siano destinate allo stesso output. Perciò, la probabilità che un periodo abbia durata pari a i timeslot è P{X = i} = p(1-p)i-1, i≥1, quindi la lunghezza media di burst è β = E[X] =1/p. La probabilità che un periodo di off duri j timeslot è P{Y = j} = q(1-q)j-1, i≥0, e quindi α = E[Y] = (1-q)/q. Il traffico offerto ρ è pari al tempo in cui un timeslot è attivo: ρ = q/(q+p-pq). Input-buffered switch: si considera un buffer FIFO per calcolare le performance. Si assume che solo le celle in testa ai buffer possano contendere gli output, quindi se una cella perde la contesa, quelle dietro di lei devono attendere anche se sono destinate a porte idle (c‟è quindi un problema di HOL blocking). Di conseguenza, il throughput massimo è limitato e non può essere il 100%. Si ipotizza che tutte le code in ingresso siano sature (quindi ci sono sempre celle in attesa di essere inviate): se ci sono k celle in testa alle code di ingresso e destinate allo stesso output, una verrà scelta a caso per passare attraverso lo switch. Di conseguenza ogni cella HOL ha probabilità 1/k di essere scelta. Considero tutte le N celle in testa ai bufferdi ingresso al timeslot m. In base alla destinazione, queste possono essere classificate in N gruppi: alcuni possono avere più elementi, altri possono essere vuoti. Per quelli che hanno almeno una cella, una viene inviata attraverso lo switch e le altre rimangono in attesa. Si indica come Bim il numero di celle rimaste, destinate all‟output i nel m-esimo timeslot, Bi la variabile casuale nello stato stazionario, Aim il numero di celle che si muovono in testa ai buffer di ingresso durante il m-esimo timeslot e destinate all‟output i e Ai la corrispondente variabile casuale. Una cella può muoversi in testa a una coda di ingresso solo se la cella HOL al timeslot precedente è stata rimossa e trasmessa. Di conseguenza, la transizione di stato di Bim può essere rappresentata come il massimo tra 0 e (Bim-1 +Aim-1). Si assume che ogni nuovo arrivo di celle in testa a una coda di ingresso abbia la stessa probabilità 1/N di essere destinato a un dato output. Di conseguenza, Aim ha la seguente distribuzione binomiale:
Fm-1 = numero totale di celle trasmesse attraverso lo switch durante il (m-1)esimo timeslot = ΣNi=1 Aim. Considero il seguente esempio:
Considero il 1° timeslot (m = 1):
F1 = numero di celle trasmesse nel primo timeslot = 2 (celle nella coda 1 e 2); B11 = 1 (mando una cella alla coda di uscita 1, e me ne rimane 1); B21 = 0 (non mando nessuna cella alla coda 2, e quindi non me ne rimangono); B31 = 0 (non mando nessuna cella alla coda 3, e quindi non me ne rimangono); B41 = 1 (mando una cella alla coda di uscita 4, e me ne rimane 1); Considero il 2° timeslot:
A12 = 1 (si muove una cella in testa alla coda 1 al timeslot 2);
A22 = 1 (si muove una cella in testa alla coda 2 al timeslot 2); A32 = 0 (non si muove nessuna cella in testa destinata alla coda 3 al timeslot 2); A42 = 0 (non si muove nessuna cella in testa destinata alla coda 4 al timeslot 2); F2 = 3 (invio dalla coda 1, 2 e 3); B12 = 1 (la coda 4 ha perso la contesa, e quindi non ha inviato la cella all‟uscita 1); B22 = 0 (non ho celle destinate all‟uscita 2 e non inviate); B32 = 0 (non ho celle destinate all‟uscita 3 e non inviate); B42 = 0 (non ho celle destinate all‟uscita 4 e non inviate); Considero il 3° timeslot:
A13 = 1 (la cella della coda 2); A23 = 0 (nessuna cella); A33 = 0 (nessuna cella); A43 = 0 (le celle della coda 1 e 3); F3 = 2 (ho inviato 2 celle); B13 = 1 (la cella della coda 4); B23 = 0; B33 = 0; B43 = 1 (la cella della coda 3); Per definizione, il numero totale di celle trasmesse in un timeslot (F m) è pari a N-il numero di HOL bloccate dopo aver perso la contesa. Ai, Bi e Fi sono le variabili casuali di stato
stazionario (steady-state) che corrispondono a Aim, Bim e Fim. Quando N -> ∞, Aim ha una distribuzione di Poisson con rate ρim = Fm-1/N. Nello stato stazionario, anche Ai ha una distribuzione di Poisson con rate ρ0 = F /N ( F è il numero medio di celle che passano attraverso lo switch). ρ0 è l‟utilizzo dei collegamenti di uscita (cioè è il throughput dello switch normalizzato). La transizione di stato di Bi si deriva dai processi di Markov allo stesso modo delle code M/D/1 nello stato steady. Per N-> ∞, si ottiene che
In uno stato stazionario, si ha che
Per simmetria, si ottiene che
Di conseguenza si dimostra che ρ0 =(2-√2) = 0.586. Se N è piccolo e finito, il throughput dello switch può essere calcolato modellizzando il sistema come una catena di Markov (il throughput converge rapidamente a 0.586 all‟aumentare di N). Di conseguenza se il rate di ingresso è > 0.586, lo switch si satura e quindi il throughput diventa 0.586. Se invece l‟input rate è < 0.586, allora il throughput è pari al 100%, e ogni cella verrà inviata attraverso lo switch dopo un qualche ritardo. Per caratterizzare il ritardo, si può usare il modello G/G/1, per ottenere la formula esatta del tempo di attesa per N->∞. Il risultato si basa su 2 ipotesi: la prima è che il processo di arrivo a ogni porta input sia di Bernoulli, cioè la probabilità che una cella arrivi in ogni timeslot sia identica e indipendente rispetto agli altri slot. Questa probabilità è indicata come p, ed è detta carico offerto. La seconda è che il carico è destinato a ogni porta con la stessa probabilità. Il tempo di servizio per una cella HOL è il tempo di attesa finchéviene scelta, più un timeslot per la trasmissione attraverso lo switch. Per N->∞ e in uno stato stazionario, il numero di celle che arrivano in testa alle code input e indirizzate a un particolare output (detto j) ha una distribuzione di Poisson con rate p. Quindi, la distribuzione del tempo di servizio per il modello a tempo discreto G/G/1 è la distribuzione del ritardo di un altro sistema di coda: una coda a tempo discreto M/D/1, con gli utenti serviti in maniera casuale. Per calcolare il ritardo, si può costruire un modello a coda virtuale (VQ i): è un insieme delle posizioni HOL nelle diverse code in ingresso che hanno una cella indirizzata alla porta i (i = 0,
…, M-1). La capacità di ogni VQ è di N (celle), e la quantità totale su tutte le VQ non supera mai N. Nelle code di ingresso si adotta una politica FIFO, mentre nella VQ si adotta una politica FIFO oppure RO (Random Order). Se N-> ∞, le celle che entrano nelle VQ si avvicinano a un numero infinito. La cella che raggiunge ogni coda viene scelta in modo casuale e indipendente. Il processo di arrivo alla coda virtuale diventa asintoticamente trascurabile, e il tempo di interarrivo da una coda di ingresso a una coda virtuale diventa sufficientemente lungo. Le code virtuali, così come le code in ingresso, formano un sistema tempo-discreto indipendente. Si può assumere una generica coda “tagged” in ingresso (o virtuale) come rappresentativa di ogni altra coda in ingresso (o virtuale).Poiché deriva da un processo di Bernoulli di arrivo di un pacchetto su ogni “inlet” dello switch con probabilità p, la coda “tagged” si comporta come una coda G/G/1: il tempo di servizio θ i è il tempo impiegato dal pacchetto HOL per vincere la contesa e quindi essere trasmesso, cioè il tempo trascorso nella coda virtuale. Se N -> ∞ e ogni “outlet” è indirizzato con la stessa probabilità 1/M, allora il numero di pacchetti allo stato stazionario che entra nella coda virtuale tagged diventa poissoniano. La VQ tagged si comporta come una coda sincrona M/D/1 con un servente interno: il rate di arrivo medio è pv = p, il tempo di servizio θv è uguale a 1 slot, e il tempo di attesa ηv è il tempo impiegato da un pacchetto (generico) per vincere la contesa del canale. Il ritardo nella coda nella VQ M/D/1 rappresenta il tempo di servizio della coda G/G/1: quindi ϴi = ηv + θv. Il ritardo totale medio T è il tempo medio speso nella coda in ingresso.
I momenti del primo e del secondo ordine del tempo di attesa ηv possono essere trovati assumendo 2 tipi di servizi nella coda virtuale M/D/1: FIFO: priorità nella contesa di canale alle celle più vecchie, cioè quelle che hanno trascorso più tempo in posizione HOL; Random Order: la cella che vince la contesa è sempre scelta in modo casuale. I risultati sono riportati in questa figura:
La linea continua rappresenta risultati analitici: il ritardo medio dei pacchetti cresce senza limiti se p si avvicina alla capacità dello switch.
Uno switch con code in ingresso ha un throughput massimo di 0.586, un crossbar switch senza buffer ha invece un throughput massimo di 0.632. Il vantaggio di aggiungere code all‟ingresso è quello di permettere il controllo della perdita di performance per ρ < ρ max. Infatti, mentre con un buffer si possono ottenere probabilità di perdita <10-9 con un traffico offerto di 0.5, con un crossbar switch la probabilità risulta > 10-2 anche con un traffico di 0.05. Output-buffered switch: con l‟output queuing, le celle sono bufferizzate solo alle uscite, e in ognuna è mantenuta una coda FIFO. Si considera una particolare coda di uscita (ad esempio quella “tagged”): si definisce la variabile casuale A come il numero di arrivi di celle destinate a tale uscita in un dato timeslot. Si ha quindi che
Se N -> ∞, allora
Detti Qm il numero di celle della coda tagged alla fine del m-esimo timeslot, Am il numero di arrivi di celle durante l‟m-esimo timeslot e b la capacità del buffer di uscita, si ha che Q m è il minimo tra b e il massimo tra 0 e (Qm-1 + Am-1). Se Qm-1 = 0 e Am> 0, non ci sono celle in attesa all‟inizio del m-esimo timeslot, ma ci sono Am celle in arrivo. Si assume che una cella, tra quelle in arrivo,viene trasmessa immediatamente durante il m-esimo timeslot, cioè passa attraverso lo switch senza ritardo, mentre le altre sono bufferizzate. Per valori di N e b finiti, questo può essere modellizzato come una catena di Markov a stati finiti e a tempo discreto, con probabilità di transizione di stato Pij date da
La dimensione della coda allo stato stazionario si può calcolare in modo ricorsivo dalle balance equations della seguente catena di Markov:
dove
Non vengono trasmesse celle sul collegamento tagged di uscita durante il m-esimo timeslot se e solo se Qm-1 = 0 e Am = 0. Di conseguenza, il throughput dello switch ρ0 è dato da: Una cella può andare persa se, quando emerge dalla switch fabric, trova che il buffer di uscita contiene già b celle. La probabilità di perdita di una cella può essere calcolata
come:
dove p è il carico offerto. Se lo speedup S della switching matrix è uguale a N, allora il throughput con OQ è sempre 1.
I 2 grafici rappresentano la probabilità di perdita delle celle con output queuing in funzione del buffer di uscita b, della dimensione dello switch N e del carico offerto p: con p = 0.8 (80%), un buffer di dimensione b = 28 permette di avere una probabilità di perdita di cella <
10-6 per un N arbitrario grande. In generale la curva per valori di N finiti e > 32.
N -> ∞ può essere un limite superiore
La figura rappresenta la perdita di celle quando N-> ∞ in funzione della dimensione del buffer b e del traffico offerto p. L‟output queuing raggiunge risultati ottimi nel rapporto throughput/ritardo: le celle vengono ritardate se non è inevitabile che 2 o più celle che arrivano da input differenti sono destinate alla stessa uscita. Si può calcolare il tempo medio di attesa usando la legge di Little (il numero medio di clienti in un sistema è uguale al tasso medio di arrivo moltiplicato per il tempo medio nel sistema):
Se N e b -> ∞, allora il tempo medio di attesa si ottiene da una coda M/D/1:
La figura rappresenta il tempo medio di attesa in funzione del traffico offerto p e della dimensione del buffer b, per N -> ∞:
Completely Shared-Buffered Switches: con la condivisione completa dei buffer, tutte le celle sono salvate in un buffer comune condiviso da tutti gli ingressi e le uscite. A causa della natura statistica degli arrivi delle celle, questo metodo richiede un buffer minore per ottenere una data probabilità di perdita di cella. L‟output queuing può essere mantenuto logicamente con liste collegate, cosicché nessuna cella sarà bloccata dal raggiungere una porta idle, e quindi si può sempre raggiungere il risultato ottimale nel rapporto throughput/ritardo che si ha con un output queuing dedicato.
Queste 2 figure rappresentano la probabilità di perdita di celle con un buffer completamente condiviso, in funzione della dimensione b del buffer per l‟uscita e della dimensione N dello switch, rispettivamente offrendo un traffico pari a 0.8 (80%) e 0.9. Detto Qim il numero di celle destinate all‟output i nel buffer alla fine del m-esimo timeslot, il numero totale di celle nel buffer condiviso alla fine del m-esimo timeslot è pari alla sommatoria di Qim per ogni i. Se il buffer ha dimensione infinita, allora:
dove Aim è il numero di celle indirizzate all‟output i che arrivano durante il m-esimo timeslot. Se il buffer ha dimensione finita, le celle in arrivo possono riempire il buffer condiviso, e l‟overflow del buffer rende solo un‟approssimazione. Tuttavia siamo solo interessati alla regione con bassa probabilità di perdita di cella (ad esempio <10 -6), in cui l‟approssimazione è ancora buona. Se N è finito, Ai, il numero di arrivi destinati all‟output i nello stato stazionario, non è indipendente da Aj (j≠i). Ciò avviene perché al massimo N celle arrivano allo switch, e un grande numero di celle verso una porta output comporta un basso numero verso le altre. Se N->∞, tuttavia, Ai diventa una VC indipendente di Poisson (con valor medio p). Quindi Qi, il numero di celle nel buffer destinate all‟output i nello stato stazionario, diventa indipendente da Qj (i≠j). Si può usare questa approssimazione di Poisson per N finito e ≥ 16. 6. SWITCHING-NETWORK THEORY Lo studio delle reti è stato perseguito negli ultimi decenni dai ricercatori in 2 differenti campi: comunicazione e informatica. I primi hanno studiato strutture inizialmente definite “connecting network” usate per sistemi di switching e quindi caratterizzate da un numero molto grande di inlet e outlet e da un controllo centralizzato che stabilisce le permutazioni richieste.Gli altri hanno invece considerato le cosiddette “interconnection networks”, usate in sistemi multiprocessore per la connessione reciproca di memoria e unità di elaborazione, e quindi caratterizzate da un numero ragionevolmente piccolo (qualche decina) di N inlet e
M outlet, e sono state ideate per essere basate sulla possibilità di elaborazione distribuita, permettendo di stabilire la permutazione in maniera distribuita. I 2 campi sono confluiti in un unico obiettivo, lo sviluppo di grandi reti di interconnessione per sistemi di switching in cui è possibile l‟elaborazione distribuita per stabilire le permutazioni richieste. Le ragioni principali che hanno portato a questo scenario sono la richiesta di switching fabric in grado di trasportare traffico dell‟ordine di centinaia di Gb/s, valore tipico di uno switch broadband di medie dimensioni, e il tremendo progresso raggiunto dalla tecnologia CMOS VLSI, che rende possibile l‟elaborazione distribuita delle interconnection networks anche per grandi reti. La capacità di connessione di una rete è solitamente espressa da due indici, che si riferiscono alla presenza o meno di traffico trasportato dalla rete: Accessibilità: una rete è completamente accessibile quando ogni inlet può essere connesso con ogni outletse non ci sono connessioni già attive nella rete, altrimenti si parla di accessibilità limitata. La piena accessibilità è oggi richiesta in tutte le interconnection networks, in quanto la tecnologia permette di fornirla facilmente; Blocking: si parla di blocking se almeno una connessione I/O tra un generico inlet idle e un generico outlet idle non può essere stabilità dalla rete a causa di congestione interna dovuta a connessioni I/O già presenti, altrimenti si parla di non-blocking. In base alle tecniche usate per stabilire le connessioni, le reti non-blocking possono essere di 3 tipi: Strict-sense non-blocking (SNB): se una rete può sempre connettere un inlet idle con un outlet idle indipendentemente dalla permutazione della rete, cioè indipendentemente da eventuali connessioni I/O già presenti e dalla politiche di allocazione delle connessioni; Wide-sense non-blocking (WNB): se una rete può sempre connettere un inlet idle con un outlet idle prevendendo situazioni di blocking attraverso un‟opportuna politica di allocazione delle connessioni; Rearrangeable non-blocking (RNB): se una rete può sempre connettere un inlet idle con un outlet idle applicando, se necessario, un riarrangiamento interno delle connessioni già attive;
Perciò solo le reti SNB sono senza stati di blocking, mentre WNB e RNB non lo sono. Da ora in poi con nonblocking si intende SNB. Possono esserci stati di blocking nelle reti RNB durante l‟evoluzione dinamica
della rete, ma nuove connessioni possono essere stabilite
riarrangiando le connessioni già esistenti.Le reti non-blocking sono caratterizzate da un costo decrescente (SNB ha costo massimo). In generale, l‟indice di costo di una rete era il numero dei suoi crosspoint. Oggi si usa ancora questo criterio, anche se ha perso di significato a causa degli sviluppi tecnologici a vantaggio di indici come i gates per chip, i chip per board, … a causa dell‟estremo grado di integrazione dei componenti elettronici in un singolo chip permesso dalle tecnologie VLSI. La rete di riferimento è la rete crossbar NxM: il costo di questa rete, cioè il numero dei crosspoint, riferito a una struttura quadrata (N = M) è N2.
Poiché ogni crosspoint è dedicato a una specifica connessione I/O, la rete crossbar è implicitamente non-blocking. Una rete crossbar quadrata (N = M) permette di settare una permutazione di rete arbitraria, cioè un insieme di N connessioni I/O: se P indica l‟insieme di tutte le permutazioni stabilite da una generica rete, in generale P ≤ N!, dove P=N! è una rete crossbar. Si è cercato di identificare una struttura di rete non-blocking più economica della rete crossbar. La linea guida è stata quella di costruire reti multistage, in cui ogni stage include matrici di switching che sono reti crossbar (quindi non-blocking). Il modello generale di una rete multistage include s stage con ri matrici nimi allo stage i (i = 1, … s), cosicchéN = n1r1, M = msrs.La caratteristica chiave per classificare le reti multistage è il tipo di schema di
interconnessione tra stage adiacenti. L‟ovvia condizionemiri = ni+1ri
+ 1
vale sempre, cioè il
numero di outlet minello stage i è pari al numero di inlet ni+1nello stage (i+1).
Si può definire uno schema specifico di connessione, l‟EGS (Extended Generalized Shuffle), che include come sottocasi un numero significativo di schemi. La coppia (j i, ki) rappresenta il generico inlet (outlet) j della matrice k del generico stage i, con j i = 0, …, n-1 (ji = 0, …, m-1) e ki = 1, …, ri. Lo schema EGS è tale che l‟outlet ji della matrice ki, cioè l‟outlet (ji, ki), è connesso all‟inlet (ji+1, ki+1), con:
In pratica connetto gli m1 outlet della prima matrice con le prime m1 matrici dello stage successivo, poi gli m2 outlet della seconda matrice con le m2 matrici dello stage successivo partendo dalla m1 +1, e così via. Se terminano le matrici dello stage successivo, si riparte dalla prima (come con il modulo).
Una rete costituita da stage interconnessi mediante pattern EGS è detta rete EGS. Le reti multistage che includono s stage saranno descritte secondo il seguente tipo di configurazione di pattern interstage: Full connection (FC): se ogni matrice nello stage i (i = 2, 3, …, s-1) è connessa a tutte le matrici negli stage(i-1) e (i+1); Partial connection (PC): se ogni matrice nello stage i (i = 2, 3, …, s-1) non è connessa a tutte le matrici negli stage (i-1) e (i+1); Una rete EGS con mi ≥ ri+1 è una rete FC (quindi ho più outlet che matrici dello stage successivo), mentre è una rete PC se mi< ri+1. Considero una rete quadrata NxN e numero gli inlet e gli outlet da 0 a N-1 in modo sequenziale, dall‟inizio alla fine. Se la rete include più di uno stage e la generica matrice include b outlet, essendo etichettato ogni outlet della matrice da 0 a b-1, può essere identificato un grafo di fondo per la rete: ogni matrice è mappata su un nodo di un grado, e ogni collegamento interstage su un arco del grafo. I nodi e gli archi del grafo non sono etichettati, quindi inlet e outlet della rete non devono per forza essere mappati sugli archi, in quanto non portano informazioni. Di conseguenza, gli elementi più esterni del grafo sono i nodi che rappresentano la matrice del primo e dell‟ultimo stage della rete. 2 grafi A e B sono detti isomorfi se il grafo A può essere reso identico al grafo B muovendo i suoi nodi, e quindi i suoi archi. Il mapping così ottenuto tra i nodi nella stessa posizione nei 2 grafi originali esprime l‟isomorfismo dei grafi. Una rete è una struttura più complessa di un grafo, in quanto un percorso I/O è descritto in generale non solo da una sequenza di nodi (matrici), ma anche attraverso una serie di etichette che identificano gli outlet di una matrice. Pertanto un isomorfismo tra le reti può essere definito considerando l‟etichettatura della matrice di output. 2 reti A e B sono dette isomorfe se, rietichettando inlet, outlet e matrici della rete A
con le rispettive etichette della matrice B, la rete A può essere resa identica alla rete B muovendo le sue matrici, e di conseguenza i suoi collegamenti. Rietichettare significa aggiungere un‟opportuna permutazione di inlet e outlet alla rete A. L‟isomorfismo richiede che la topologia della rete modificata A abbia le stesse etichette della matrice di output della rete B per matrici nella stessa posizione, cioè un isomorfismo che mantiene le etichette. Il mapping così ottenuto tra inlet, outlet e matrici nelle 2 reti esprime l‟isomorfismo delle reti. In pratica, poiché le permutazioni esterne da aggiungere sono arbitrarie, l‟isomorfismo delle reti può essere provato semplicemente muovendo le matrici, e i collegamenti, in modo che le topologie delle 2 reti tra il primo e l‟ultimo stage siano identiche. Facendo riferimento alla proprietà di rete, possono essere definiti 3 tipi di relazione: Isomorfismo: 2 reti sono isomorfe se si mantiene tra loro un isomorfismo che conserva le etichette; Equivalenza topologica: 2 reti sono topologicamente equivalenti se esiste un isomorfismo tra i grafi sottostanti delle 2 reti; Equivalenza funzionale: 2 reti A e B sono funzionalmente equivalenti se effettuano le stesse permutazioni, cioè PA = PB. Due reti isomorfe sono anche topologicamente equivalenti (mentre non vale il viceversa). In generale 2 reti isomorfe non sono funzionalmente equivalenti, ma lo diventano se sono anche non-blocking (poiché entrambe effettuano le stesse N! permutazioni). In 2 reti isomorfe si richiede lo stesso numero di componenti, non in 2 reti funzionalmente equivalenti. Considero 2 reti A e B:
Queste sono topologicamente equivalenti, poiché il loro grafo sottostante è lo stesso, ma non sono isomorfe, poiché non esiste un isomorfismo che mantiene le etichette tra A e B.
Infatti, se vengono mosse le matrici nella rete A, si possono ottenere le due reti A‟ e A‟‟, che sono simili a B ma non uguali: A‟ ha i nodi con la stessa etichetta, ma i link in uscita da H sono scambiati, se confrontati con gli analoghi in uscita da Y, mentre A‟‟ ha la stessa topologia di B, ma con le etichette di H scambiate rispetto a Y. D‟altra parte le reti A‟ e A‟‟ sono isomorfe alla rete B.
Le 2 reti A e B non sono funzionalmente equivalenti, poiché, ad esempio, le connessioni (0,0) e (1,1) possono appartenere alla stessa permutazione nella rete A, ma non è vero per la rete B. Le seguenti sono 2 reti isomorfe e funzionalmente equivalenti:
Le reti isomorfe hanno lo stesso numero di elementi di rete, mentre le reti topologicamente equivalenti hanno lo stesso numero di matrici. Un metodo utile per l‟analisi delle reti multistage è il grafo del canale (channel graph). Il grafo del canale è associato con ogni coppia inlet/outlet ed è dato dalla sequenza di elementi di rete che sono attraversati per raggiungere l‟outlet scelto dall‟inlet desiderato. Le matrici vengono rappresentate da nodi,
e i collegamenti da archi. Pertanto il numero di cammini I/O nel grafo rappresenta il numero di modi differenti in cui un outlet può essere raggiunto da un inlet. Una rete in cui un singolo grafo è associato con tutte le coppie inlet/outlet è detta rete regolare. In un grafo regolare tutti i nodi che appartengono allo stesso stage hanno lo stesso numero di archi in ingresso e in uscita.
I grafi associati alle 2 reti isomorfe a sinistra sono rappresentati nella figura a destra. In particolare, il primo grafo è associato, nella rete A, con le coppie inlet/outlet che terminano sugli outlet e o f (y o z nella rete B), mentre il secondo grafo rappresenta il percorso I/O che conduce agli outlet g o h nella rete A (w o x nella rete B). Infatti 3 matrici sono attraversate nel caso precedente, coinvolgendo entrambe le 2 matrici middle-stage, mentre un single path connette inlet e outlet attraversando solo 2 matrici nel caso precedente. Vale la pena esaminare come può essere costruita una rete crossbar mediante blocchi più piccoli, sfruttando speciali elementi di connessione detti splitter (di dimensione 1xK) e combiner (Kx1), entrambi di costo K. Entrambi sono in grado di stabilire una connessione alla volta. La rete crossbar-tree è una rete di interconnessione funzionalmente equivalente alla rete crossbar, ed è SNB: include N splitter e N combiner, interconnessi mediante uno schema EGS e con costo C= 2N2.
L‟albero di crossbar può essere costruito anche usando splitting multistage e strutture di combinazione basate sull‟uso di splitter 1x2 e combiner 2x1.
L‟indice di costo di tale struttura, detta crossbar binary trie network, è C = 4N2-4N. Lo splitter ha in generale una struttura di questo tipo:
In un‟implementazione single-stage, ha un costo pari al numero di crosspoint, mentre in una multistage composta da splitter binari ha un costo pari al numero di switch. Questo è uno schema a splitter binario completo:
In uno schema di questo tipo, sXP vale 1, e il numero di crosspoint è pari a N, mentre s SE vale log2N, e il numero di switch è (N-1). Questo è invece uno schema di splitter binario incompleto:
In uno schema di questo tipo, sXP vale 1, e il numero di crosspoint è pari a N, mentre s SE vale l‟approssimazione per eccesso di log2N, e il numero di switch è (N-1).
Il combiner ha invece questa struttura:
Gli splitter 1xK e i combiner Kx1 permettono la costruzione di reti multistage non-blocking, come ad esempio la crossbar tree, in cui non vengono condivisi elementi tra le differenti coppie I/O. Una crossbar tree può essere costruita utilizzando splitter e combiner più piccoli mediante uno stage centrale di switching. L‟obiettivo è quello di avere uno stage centrale con il costo minore e che garantisce una piena accessibilità input/output, e ciò suggerisce un insieme di matrici crossbar, ognuna con la minima dimensione possibile. In generale, se si ha uno stage di espansione di dimensione 1xK, con K = 2k[k = 1, …, log2(N-1), quindi K = 2, …, N-1], ogni inlet ha accesso a K matrici di switching, da cui tutti gli N outlet possono essere raggiunti, cosicché ogni matrice di switching ha un numero di outlet (e inlet) almeno pari a N/K (ogni matrice nello stage di switching è connessa a splitter e combiner con al massimo un link).Adottando lo schema EGS per le 2 connessioni interstage, che fornisce una connessione ciclica per gli elementi dello stage successivo, segue che la dimensione di tale matrice è sufficiente a garantire piena accessibilità:
Poiché il numero di tali matrici è KN/(N/K) = K2, il numero di crosspoint (e quindi il costo C) è N2 + 2NK. Gli elementi condivisi sono non-blocking, e quindi la rete è SNB. 6.1 FULLY CONNECTION MULTISTAGE NETWORK La descrizione delle reti FC (Fully Connection) assume come regola generale che le matrici (reti crossbar) negli stage adiacenti sono sempre connesse da un link singolo. Quindi il modello generale di una rete multistage NxM FC è rappresentato in questa figura [n i = ri-1, mi1 = ri
(i = 2, …, s)]:
Le reti FC sono un sottocaso delle reti EGS con mi = ri+1 (i = 1, …, s-1). Considero ora i casi di reti a 2 e 3 stage (cioè s = 2, 3). Questa è una rete 2-stage:
La rete ha chiaramente piena accessibilità, ma è allo stesso tempo blocking. Infatti non può esserci più di una connessione tra 2 matrici in stage differenti. Solo l‟utilizzo di collegamenti multipli tra ogni coppia di matrici negli stage differenti può fornire assenza di blocking. Questa è invece una rete a 3 stage:
Adottando 3 stage in una rete multistage, rispetto a una disposizione a 2 stage, si introduce un nuovo importante concetto: sono possibili differenti cammini I/O tra una qualsiasi coppia
di matrici nel primo e nel terzo stage, ognuna coinvolgendo una differente matrice nel secondo stage. La piena connessione dei 2 schemi interstage garantisce la piena accessibilità. Dati N e M, bisogna studiare come realizzare le reti interstage per minimizzare i costi. In particolare, il numero di matrici nel secondo stage determina la condizione di nonblocking. Il controllo di reti FC multistage richiede in generale un dispositivo di memorizzazione centralizzato, che mantiene le informazioni riguardo gli stati occupato/idle di tutte le terminazioni di rete e dei linkinterstage. Così una nuova connessione tra un inlet idle e un outlet idle di una rete non-blocking può essere facilmente trovata visitando in modo appropriato la mappa di connessioni di rete, mentre si richiedono in generale algoritmi più complessi nelle reti rearrangeable per scegliere le connessioni da muovere e il loro nuovo path. 6.2 PARTIAL CONNECTION MULTISTAGE NETWORK La classe di reti Partial Connection (PC), in cui ogni matrice degli stage intermedi è connessa solo a un sottoinsieme delle matrici dei 2 stage adiacenti, sta diventando sempre più importante nelle reti odierne basate su packet switching. Le interconnection networks di questi scenari devono trasportare grandi quantità di traffico, e le permutazioni di rete devono avvenire con un rate molto alto, nell‟ordine di pochi microsecondi. Quindi un requisito obbligatorio per costruire tali reti di interconnessione di dimensione significativa sembra essere la possibilità di un alto grado di elaborazione parallela nella rete. Il risultato è raggiunto mediante reti PC multistage, in cui le matrici di ogni stage sono in generale molto piccole, di solito tutte della stessa dimensione, e sono fornite di una capacità di elaborazione autonoma. Queste matrici, dette switching elements (SE), hanno in generale dimensioni che sono potenze di 2. Se non segnalato altrimenti, in seguito si farà riferimento a SE di dimensione 2x2. Facendo riferimento alla loro capacità elaborativa, ogni SE è in grado di fare il routing dei pacchetti in modo autonomo. Tale proprietà è detta self-routing dei pacchetti. Le reti che eseguono tale compito sono strutture blocking dette reti banyan. Tali reti, che forniscono un singolo path per ogni coppia inlet-outlet, possono essere adeguatamente promosse, per ottenere reti RNB e SNB. Le reti di smistamento (sorting) hanno un ruolo chiave nello switching di pacchetti ad alta velocità, poiché la classe di reti RNB include anche strutture ottenute mettendo in cascata una rete sorting e una rete banyan. Banyan networks: si definiscono 4 permutazioni base, cioè il mapping uno a uno tra inlet e outlet in una generica rete NxN, che sarà usata come blocco di base per le reti self-routing. Indichiamo come a = an-1 … a0(n = log2N) un generico indirizzo con cifre in base 2, dove an-1 è il bit più significativo. Si definiscono ora 4 permutazioni base di rete, che saranno usate per definire le reti banyan base. L‟outlet di rete connesso al generico inlet a è specificato da una delle seguenti funzioni:
Le permutazioni σ e σ-1 sono dette rispettivamente h-shuffle e h-unshuffle, e una è lo specchio dell‟altra, (se l‟inlet a è connesso all‟outlet b nello shuffle, l‟inlet b è connesso all‟outlet a nell‟unshuffle). La permutazioneh-shuffle (h-unshuffle) consiste in uno shift circolare a sinistra (destra) di una posizione degli h+1 bit meno significativi dell‟indirizzo dell‟inlet. Se h = n-1, allora lo shift circolare è sull‟intero indirizzo dell‟inlet e le due permutazioni sono dette shuffle e unshuffle perfetto. β è detta permutazione a farfalla e j permutazione identità. Si ha che σ0 = β0 = j. Si può verificare che σh corrisponde a k = 2n-h-1 permutazioni perfect shuffle, ognuna applicata a N/k inlet/outlet di rete adiacenti (solo gli h+1 bit meno significativi sono ruotati in σh). Si possono esprimere le permutazioni di shuffle e unshuffle perfetti usando indirizzi in base 10:
Possono essere definite altre 2 permutazioni:
La prima è detta bit switch, la seconda è detta bit reversal. Un esempio di reti PC sono le reti banyan: sono strutture multistage di semplici elementi di switching, con un singolo percorso I/O con piena accessibilità, con b x b elementi di switching -> ci sono n stage, con n = logbN. Gli elementi di switching hanno dimensione b∙b, con b = 2k, tipicamente k = 1:
Una rete banyan ha un‟alta capacità di elaborazione in parallelo: ogni pacchetto è preceduto da un‟etichetta (tag) per il self-routing, che codifica l‟indirizzo dell‟outlet. Un indirizzo di inlet e un tag determinano in modo univoco un percorso attraverso la rete. Il descrittore del percorso per un dato outlet è sempre lo stesso, e non dipende dallo specifico inlet. Le regole di routing in ogni elemento dipendono dalla topologia della rete. Ciò
nonostante, bisogna prevenire i conflitti nei percorsi I/O dei diversi pacchetti.
7. REARRANGEABLE NON BLOCKING NETWORK (RNB) (Noi facciamo solo le FC, ci sarebbero anche le PC ma non le facciamo…) In una rete FC a 2 stage non ha senso parlare di riarrangiabilità, poiché ogni connessione I/O tra un inlet di rete e un outlet di rete può essere settata in un solo modo (coinvolgendo uno dei collegamenti tra le 2 matrici nel primo e nel secondo stage, che collegano inlet e outlet di rete). Pertanto la condizione di riarrangiabilità in questo tipo di rete è la stessa delle reti nonblocking. Considero ora una rete a 3 stage:
Una rappresentazione utile e sintetica dei percorsi nella rete è rappresentata tramite la notazione a matrice detta matrice di Paull. Una matrice di Paull ha r1 righe e r3 colonne, rispettivamente tante quante le matrici nel primo e nell‟ultimo stage.
Le voci della matrice sono i simboli dell‟insieme {1, 2, …, r2}, di cui ogni elemento rappresenta una delle matrici dello stage centrale. Il simbolo a nella voce (i, j) significa che un inlet della matrice i del primo stage è connessa a un outlet della matrice j dell‟ultimo stage attraverso la matrice a dello stage centrale. Ogni voce della matrice può contenere da 0 a r 2 elementi distinti. Questo è un esempio:
In base alla sua definizione, una matrice di Paull soddisfa sempre le seguenti condizioni: -
Ogni riga contiene al massimo il minimo tra (n, r2) simboli distinti;
-
Ogni colonna contiene al massimo il minimo tra (r2, m) simboli distinti;
Infatti, il numero di connessioni attraverso una matrice del primo stage (ultimo stage) non può superare o il numero degli inlet (outlet) della matrice, o il numero dei percorsi (uguale al numero delle matrici dello stage centrale) possibili per raggiungere gli outlet (inlet) della rete. Inoltre, ogni simbolo non può apparire più di una volta in una riga o in una colonna, poiché solo un collegamento connette le matrici di stage adiacenti. Il più importante risultato teorico sulle reti riarrangiabili a 3 stage è dato dal teorema di Slepian-Duguid: una rete a 3 stage è riarrangiabile se e solo se r2 ≥ max (n, m). Dimostrazione: assumiamo, senza perdere di generalità, che la connessione da stabilire sia
tra un inlet della matrice i del primo stage e un outlet della matrice j dell‟ultimo stage. Quando viene settata una connessione, le matrici i e j stanno già supportando al massimo rispettivamente (n-1) e (m-1) connessioni. Se
r2> max (n-1, m-1), allora manca
almeno uno degli r2simboli nella riga i e nella colonna j. D‟altra parte, per settare una nuova connessione i-j, una delle 2 condizioni deve essere vera: ●
C‟è un simbolo a non trovato sia nella riga i che nella colonna j (viene scelta la
matrice a per i-j); ●
C‟è un simbolo a nella riga i non trovato nella colonna j, e c‟è un simbolo b
nella colonna j non trovato nella riga “i” (connessioni conflittuali possono essere riarrangiate partendo da a oppure b per settare la connessione i-j attraverso a oppure b). Se vale la prima condizione, la nuova connessione viene settata attraverso la matrice del middle-stage a. Quindi a è scritto nella voce (i,j) della matrice di Paull, e le connessioni stabilite non devono essere ristabilite. Se è vera solo la condizione 2, la nuova connessione i-j può essere settata solo dopo aver riarrangiato alcune connessioni già esistenti. Ciò è realizzato scegliendo in modo arbitrario uno dei 2 simboli a e b (scelgo a) e costruendo una catena di simboli in questo modo.
Cerco il simbolo b nella stessa colonna (j2) in cui appare il simbolo a nella riga i. Se lo trovo (ad esempio nella riga i3), allora cerco a nella stessa riga. Se trovo a nella stessa riga (ad esempio j4), allora cerco b nella stessa colonna. Continuo così finché non riesco a trovare un simbolo a oppure b. A questo punto posso riorganizzare le connessioni identificate dalla catena i, j2, i3, j4, … sostituendo il simbolo a con b nelle righe i, i3, … e il simbolo b con a nelle colonne j2, j4, … Con questo approccio i simboli a e b appaiono al massimo una sola volta in ogni riga e colonna, e il simbolo a non appare più nella riga i. Così la connessione i-j può avvenire attraverso la matrice a del middle-stage.
L‟algoritmo di riarrangiamento funziona solo se si può dimostrare che la catena non termina in un elemento della matrice di Paull che appartiene o alla riga i o alla colonna j, poiché ciò renderebbe impossibile il riarrangiamento. Si può rappresentare la catena di simboli nella matrice di Paull come un grafo, in cui i nodi rappresentano le matrici del primo e terzo stage, e gli archi rappresentano le matrici del secondo stage.
Nella figura precedente, c e k rappresentano l‟ultima matrice attraversata dalla catena nel secondo e nel primo/terzo stage. Bisogna dunque dimostrare che k ≠i, j. Definisco catena apertauna catena in cui il primo e l‟ultimo nodo appartengono a stage differenti, e chiusa se appartengonoallo stesso. E‟ facile verificare che una catena aperta (chiusa) attraversa le matrici del secondo stage un numero dispari (pari) di volte. Di conseguenza, una catena aperta (chiusa) include un numero dispari (pari) di archi. Infatti se c = a, k≠j per la condizione 2, e k≠i, poiché risulterebbe in una catena chiusa C1 con un numero dispari di archi, o una catena aperta C2 con un numero pari di archi, che è impossibile. Analogamente, se c = b, k≠i, per la condizione 2, e k≠j, poiché k≠j risulterebbe in una catena aperta C 1 con un numero pari di archi, o una catena chiusa C2 con un numero dispari di archi, che è impossibile. In una rete quadrata a 3 stage, r1 = r3 = N/n, e la regola di Slepian-Duguid per una rete riarrangiabile diventa r2 = n. Il costo C per questa rete risulta pari a:
La condizione per avere il costo minimo si ottiene ponendo uguale a 0 la derivata del costo C rispetto a n: in questo modo si ottiene che la condizione per avere il costo minimo è n = √(N/2). Ciò fornisce un costo C per una rete RNB a 3 stage pari a 2N√(2∙N). Quindi una rete
RNB Slepian-Duguid ha un costo di circa la metà di una rete Clos SNB.Dal teorema di Slepian–Duguid segue che il numero massimo di riarrangiamenti al set-up di ogni nuova connessione è pari a r1 + r3 – 2. Infatti la catena che si crea visita al massimo r1 -1 righe e r3 – 1 colonne. Di conseguenza il numero massimo di simboli nella catena è 2 min(r1, r3) – 2. Questa funzione ha valore massimo quando r1 = r3 = r, quindi il numero massimo è 2r-2. Il teorema di Paull stabilisce che il numero massimo di connessioni da riarrangiare in una rete Slepian– Duguid è φm = min (r1, r3) -1. Dimostrazione: assumo che r1 ≥ r3,cioè che le righe siano più delle colonne nella matrice di Paull. A questo punto possono essere costruite 2 catene di simboli: (a, b, a, b, …) partendo da a nella riga i, e (b, a, b, a, …) partendo da b nella colonna j. Si ottengono quindi rispettivamente le catene i, j2, j3, j4, … e j, i2, i3, i4, … Le catene crescono in modo alternato (la lunghezza delle catene ha differenza di massimo un‟unità), e la catena che smette di crescere viene riarrangiata. Il numero massimo di step di crescita è r3 -2, poiché a ogni step viene visitata una colonna da entrambe le catene, e le colonne di partenza che includono simboli iniziali a e b non sono visitate. Quindi il numero massimo di connessioni da riarrangiare è r3 -1. Se si ripete il ragionamento analogo per r1≤ r3, si trova che il numero massimo è pari al minimo tra (r1, r3) -1. Quindi, se r1 = r3 = r, allora il numero massimo diventa r-1. Considero un esempio:
L‟esempio mostra una matrice di Paull per una rete a 3 stage 24x25, con r1 = 4 e r3 = 5, m (outlet) = 5, n = 6 (inlet). La condizione di riarrangiabilità dice che r 2≥ 6 [r2 ≥ max (n, m)]. Rappresento queste matrici con i simboli {a, b, c, d, e, f}. Nello stato di rete rappresentato dalla figura, si richiede una nuova connessione tra le matrici 1 e 1 del primo e dell‟ultimo stage. Le matrici c e d dello stage centrale sono scelte per operate il riarrangiamento. Se la procedura di riarrangiamento si basa soltanto su una catena, e il simbolo di partenza è c nella riga 1, si ottiene lo stato finale, rappresentato dalla figura seguente, con 5 riarrangiamenti.
Tuttavia, applicando il teorema di Paull, e quindi generando 2 catene alternative di simboli, si realizza che la catena che comincia dal simbolo d nella colonna 1 si ferma dopo il primo step. In questo modo il numero totale di riarrangiamenti è 2.
Si poteva scegliere il simbolo e piuttosto che d, poiché entrambi mancano nella colonna 1. 8. STRICTLY NON BLOCKING NETWORK (SNB) Sono reti in cui è sempre possibile stabilire una nuova connessione tra un inlet idle e un outlet idle, indipendentemente dalle permutazioni della rete al momento del set-up. Considero come le reti FC, includendo 2 o 3 stage di piccole matrici crossbar, possano essere fatte nonblocking. Il modello di rete FC a 2 stage include r1 matrici n∙r2 al primo stage e r2 matrici r1∙m al secondo stage. La rete è pienamente accessibile, ma è nel contempo blocking. Infatti, se scegliamo una coppia di matrici arbitrarie al primo e al secondo stage, dette Ai e Bj, non può essere stabilita più di una connessione tra gli n inlet di Ai e gli m outlet di Bj in un dato tempo. Poiché questo limite è dovuto al singolo link tra le matrici, si può ottenere una rete FC non-blocking a 2 stage dilatando in modo appropriato lo schema di connessione interstage, cioè fornendo d collegamenti tra una qualsiasi coppia di matrici nei 2 stage.
Una rete FC di questo tipo è un sottocaso di una rete EGS con mi = d∙ri+1 (i = 1, …, s-1). Il fattore minimo d di dilatazione del collegamento richiesto per una rete non-blocking è dato da d =min (n, m), poiché non possono esserci più di d connessioni tra Ai e Bj allo stesso tempo. Il costo della rete per una rete non-blocking a 2 stage è ovviamente d volte il costo di una rete a 2 stage non dilatata. Nel caso di una rete quadrata (N = M,n = m, r1 = r2 = r), si
ottiene un indice di costo:
Quindi una rete non-blocking a 2 stage ha un costo doppio della rete crossbar. Lo schema generale di una rete a 3 stage è il seguente, in cui n e m indicano il numero di inlet e outlet delle matrici del primo (A) e del terzo (C) stage.
L‟adozione di 3 stage in una rete multistage introduce un‟importante caratteristica: sono possibili percorsi I/O differenti tra qualsiasi coppia di matrici Ai e Cj, ognuna occupata con una differente matrice nel secondo stage (B). 2 percorsi I/O possono condividere i collegamenti interstage, ad esempio quando 2 inlet (outlet) appartengono alla stessa matrice A (C). Quindi si richiede un algoritmo di controllo per la rete per stabilire il percorso I/O per le nuove connessioni, in modo da non influire sulle connessioni I/O già esistenti. La piena accessibilità è garantita implicitamente della piena connessione dei 2 schemi interstage. Perciò, r2 = 1 descrive la condizione di piena accessibilità. La regola più generale a proposito delle reti FC non-blocking a 3 stage con valori n1 = n e m3 = m è dovuta al teorema di Clos: una rete a 3 stage è SNB se e solo se r2 ≥ n+m-1 (se n = m,r2 = 2n – 1). Dimostrazione: considero 2 matrici “tagged” nel primo (A) e ultimo (C ) stage con la massima occupazione, ma che permettono di stabilire una nuova connessione. Sono già stabilite (n-1) e (m-1) connessioni nelle matrici A e C, e deve essere stabilita una connessione addizionale tra gli ultimi input e output idle nelle matrici tagged:
La peggior condizione di caricamento della rete corrisponde ad assumere un pattern delle matrici del secondo stage per quei (n-1) e (m-1) path in modo che le n-1 matrici del secondo stage, che supportano le (n-1) connessioni attraverso la matrice A, siano diverse dalle m-1 matrici del secondo stage che supportano le (m-1) connessioni attraverso la matrice C. Questo significa che non viene stabilita nessun‟altra connessione tra le matrici A e C. Poiché serve un‟altra matrice del secondo stage per stabilire la nuova connessione richiesta, sono necessarie (n-1) + (m-1) + 1 = n+m-1 matrici nel secondo stage per rendere strettamente non-blocking la rete a 3 stage. Il costo C di una rete quadrata non-blocking (N = M, n = m, r1 = r3) è:
Il costo della rete per un dato N dipende quindi dal numero r 1 delle matrici del primo stage, cioè dal numero di inlet per la matrice del primo stage, poiché N = n∙r 1. Il costo minimo si ottiene ponendo uguale a 0 la derivata del costo C rispetto a n: si dimostra che n = √(N/2). Perciò il minimo costo C di una rete SNB a 3 stage risulta pari a:
A differenza di una rete a 2 stage, una rete SNB a 3 stage può diventare più economica di una rete crossbar (a 1 stage): questo si verifica per una rete a 3 stage a costo minimo quando il numero N di inlet di rete soddisfa la condizione √N > 2+2√2. A partire da N = 24, gli inlet sono un numero sufficiente per avere una rete a 3 stage più economica di una rete crossbar. Il costo di una rete non-blocking è circa il doppio di una rete riarrangiabile [che ha costo 2N√(2N)].
Reti con più di 3 stage possono essere costruite iterando la costruzione di reti standard a 3 stage: ad esempio una rete a 5 stage non-blocking a senso stretto può essere costruita in modo ricorsivo progettando ogni matrice del secondo stage come una rete non-blocking a 3 stage. La ricorsione, che può essere ripetuta un numero arbitrario di volte per generare reti con un numero dispari di stage s, permette la costruzione di reti che diventano meno costose quando N cresce oltre una data soglia. In generale una rete quadrata (quindi simmetrica rispetto allo stage centrale) con un numero dispari di stage s (s ≥ 3) richiede che siano specificati(s-1)/2 parametri, cioè n1 = ms, n2 = ms-1, …, n(s-1)/2 = m(s+3)/2. (in base alla regola di Clos:mi = 2ni -1 [i = 1, …, (s-1)/2]). Per una rete a 5 stage (s = 5), la scelta ottima dei 2 parametri n1, n2 può essere determinata ponendo pari a 0 la derivata prima del costo totale rispetto a n1 e n2. Le due condizioni sono:
Poiché una tale procedura è difficilmente espandibile a valori grandi di s, esiste un‟altra procedura generale ricorsiva che parte da una struttura a 3 stage, e che espande ogni matrice dello stage centrale, secondo la regola di Clos, in una struttura a 3 stage, e così via. Questa struttura non minimizza il costo di rete, ma richiede soltanto il verificarsi di una sola condizione, cioè il parametro n1 = N2/(s+1). Una rete a 3 stage ha costo:
Uno schema a 5 stage ha invece costo pari a:
Questa procedura può essere iterata per costruire una rete di Clos ricorsiva a s stage (s dispari), con indice di costo pari a:
9. INPUT-BUFFERED SWITCHES – VIRTUAL OUTPUT QUEUING La tecnologia di switching a lunghezza fissa è largamente accettata come un approccio efficiente per raggiungere alta efficienza di switching per switch di pacchetto ad alta velocità. I pacchetti IP di lunghezza variabile sono segmentati in celle di lunghezza fissa agli ingressi e sono riassemblati alle uscite. Quando sono stati costruiti per la prima volta switches di pacchetto ad alta velocità, vennero usati o buffer interni condivisi o buffer di ingresso, e si è sofferto il problema della limitazione del throughput. Come risultato, storicamente la maggior parte della ricerca si è focalizzata sull'architettura di buffering in uscita. Poiché l‟iniziale domanda di capacità degli switch era nell'intervallo di poche centinaia di Mbit/s fino a pochi Gbit/s,gli switch con buffer all‟uscita sembravano una buona scelta a causa della loro alta performance throughput/ritardo e del loro utilizzo della memoria (per gli switch a memoria condivisa). Nei primi anni di sviluppo degli switch ATM, gli switch con buffer all‟uscita (compresi gli switch a memoria condivisa) dominavano il mercato. Tuttavia, poiché la domanda di switch ad alta capacità è cresciuta rapidamente (aumentava o il rate di linea o il numero di porte dello switch), di conseguenza è aumentato il requisito di velocità per la memoria. Ciò limita la capacità degli switch con buffer all‟uscita. Sebbene gli switch con buffer all‟uscita hanno un‟ottima performance ritardo/throughput per tutte le distribuzioni di traffico, lo speed-up di N volte per la velocità di operazioni in memoria limita la scalabilità di tale architettura. Per questo motivo, al fine di costruire switch a larga scala e
con velocità maggiore, ci si è focalizzati su switch con buffer all‟ingresso, o con buffer combinati ingresso-uscita, con scheduling avanzato e tecniche di routing. I buffer all‟ingresso sono richiesti per switching ad alta velocità, poiché la velocità di operazioni interne è solo poco più alta della velocità di input. Ma ci sono 2 problemi: la limitazione del throughput dovuta all‟HOL blocking (58,6 % con buffering FIFO) e la necessità di celle di arbitrato (“arbitrating cells”) a causa della contesa sulla porta di uscita. Il primo problema può essere aggirato aumentando moderatamente la velocità di operazione della switch fabric o il numero di routing path per ogni porta di output (cioè permettendo a più celle di arrivare alla stessa output port nello stesso timeslot). Il secondo problema è risolto da schemi veloci di arbitrato (scheduling). Secondo la legge di Moore, la densità di memoria raddoppia ogni 18 mesi. Ma la velocità di memoria aumenta con un rate molto più lento. Ad esempio, la velocità di memoria è 4 ns per la RAM statica CMOS, rispetto a 5 ns di un paio di anni fa. D‟altra parte, la velocità dei circuiti logici è aumentata con un rate molto maggiore di quella della memoria. Recentemente, la maggior parte della ricerca ha riguardato l‟ideazione di schemi di scheduling più veloci per arbitrare le celle dalle porte di ingresso a quelle di uscita. Alcuni schemi di scheduling considerano perfino lo scheduling per flusso alle porte di ingresso, per soddisfare i requisiti di ritardo/throughput per ogni flusso, e ciò ovviamente aumenta la complessità e il costo dell‟implementazione. Lo scheduling delle celle basato su flussi alle porte di ingresso è molto più difficile di quello alle porte di uscita. Ad esempio, in una porta di output, celle (o pacchetti) possono essere etichettati con valori basati sulla banda allocata e trasmessi in ordine crescente in base al valore dell‟etichetta. Tuttavia, in una porta di input, lo scheduling delle celle deve tenere conto della contesa delle porte di uscita. Ciò rende il problema così complicato che non è ancora stato ideato uno schema possibile. 9.1 SCHEDULING IN VOQ-BASED SWITCHES Il modello di switch con buffer all‟ingresso è mostrato in figura.
Una coda FIFO viene implementata di fronte a ogni input della switch fabric, ed è usata per memorizzare i pacchetti in ingresso. A causa dell‟HOL blocking, il throughput totale è limitato al 58,6% per il traffico uniforme, e ancora peggiore nel caso di traffico non uniforme. A causa delle limitazioni del throughput nella struttura di coda FIFO, si usa una struttura a coda output virtuale (VOQ) per eliminare l‟HOL blocking e quindi aumentare il throughput del sistema.
In ogni buffer di ingresso ci sono N code FIFO (N è la dimensione dello switch), ognuna corrispondente a una porta output, o N2 code totali. In altre parole, i pacchetti/celle che arrivano alla porta input i e destinate alla porta output j sono salvate nella VOQ i,j. La cella HOL di ogni VOQ può essere schedulata per la trasmissione in ogni timeslot. Tuttavia, sarà scelta per la trasmissione al massimo una cella tra le N VOQ di ogni buffer. L‟arrivo della cella alla porta input i è un processo stocastico Ai(t). All‟interno di ogni timeslot, c‟è al massimo un arrivo per ogni porta di input. La cella che arriva alla porta i e destinata alla porta output j viene messa nella coda Qij. Al timeslot t, la lunghezza della coda Qij è indicata come Lij(t). Aij(t) indica il processo di arrivo dall‟input i all‟output j con un rate di arrivo λ ij, e A(t) = {Aij(t), 1 ≤ i ≤ N e 1 ≤ j ≤ N}. Se gli arrivi a ogni porta di input e output sono ammissibili, cioè
allora il set A(t) è ammissibile, altrimenti non lo è. La matrice di rate di arrivo si indica con Λ = [λij]. La matrice di servizio S(t) = [s ij(t)]N×N rappresenta i matching al timeslot t con ogni elemento:
L‟arrivo di una cella, che è un processo indipendente, soddisfa le seguenti condizioni: - Gli arrivi delle celle a ogni porta di ingresso sono indipendenti e identicamente distribuiti; - Gli arrivi a una porta sono indipendenti rispetto alle altre porte di input. Se i rate di arrivo sono uguali, e le distribuzioni sono uniformemente distribuite tra tutte le porte, allora la distribuzione è detta uniforme. Per valutare le performance dello switch si analizzano throughput e ritardo. Il throughput è il numero medio di celle trasmesse in un timeslot, e il ritardo è il tempo trascorso da una cella dall‟arrivo alla partenza. Uno switch è detto stabile se la lunghezza attesa della coda è limitata (<∞). Se uno switch è stabile sotto
qualunque input di traffico ammissibile e indipendente, allora lo switch può raggiungere un throughput del 100%. Si richiedono sofisticati algoritmi di scheduling per schedulare le celle nella switch fabric in ogni timeslot. Questi schemi possono essere modellizzati come un grafo bipartito. L‟arco tra una porta input e una portaoutput indica che ci sono richieste per trasmettere celle tra questi. Uno scheduler sceglie un insieme di archi (detti matches), fino a N2, dove ogni input è connesso al massimo a un output, e ogni output è connesso al massimo a un input. Un matching input-output può essere rappresentato come una matrice di permutazione M = (Mi, j), i, j ≤ N, dove Mi,j = 1 se l‟input i è matchato con l‟output j. Per scegliere un appropriato algoritmo di scheduling, bisogna considerare parecchi fattori: Efficienza: l‟algoritmo dovrebbe ottenere un alto throughput e basso ritardo, cioè scegliere l‟insieme di match con più archi in ogni timeslot; Correttezza: l‟algoritmo dovrebbe evitare la starvation (impossibilità di ottenere le risorse desiderate di ogni VOQ); Stabilità: l‟occupazione attesa di ogni VOQ dovrebbe rimanere finita per ogni pattern di traffico ammissibile; Complessità implementativa: l‟algoritmo dovrebbe poter essere implementato facilmente in hardware. Un‟alta complessità causerà un lungo tempo di scheduling, che limita ulteriormente la velocità dello switch. Con questi obiettivi, sono stati proposti diversi algoritmi di scheduling.
9.2 MAXIMUM MATCHING 9.2.1 Matching di peso massimo In un grafo bipartito, si definisce wi,j come il peso dell‟arco ei,j dall‟input i all‟output j. Il peso della VOQ si riferisce di solito alla lunghezza (numero di pacchetti nel backlog) della VOQ. Il matching di peso massimo (MWM) M per un grafo bipartito è quello che massimizza wi,j per tutti gli archi ei,jche appartengono a M. Un algoritmo MWM raggiunge un throughput pari al 100% per ogni traffico ammissibile. MWM può essere risolto in un tempo O(N3), che è troppo grande per uno switch ad alta velocità. Scegliendo con attenzione il peso di ogni arco, o utilizzando approssimazioni di MWM, si può ridurre la complessità nel calcolo dei MWM. Gli algoritmi proposti sono LQF (longest queue first) e OCF (oldest cell first). LQF usa la lunghezza della coda Lij(t) come peso wij(t), mentre OCF usa il tempo di attesa della cella HOL. Sotto un traffico ammissibile, può verificarsi starvation per LQF, ma non per OCF. Per ridurre la complessità di LQF, si propone l‟algoritmo LPF (longest port first), con il peso w ij(t) definito come l‟occupazione della porta:
dove Ri(t) = ∑j=1N Lij(t), Cj(t) ∑i=1N Lij(t). Poiché il peso di LPF non è uguale alla lunghezza della coda, questo ha il vantaggio del matching di dimensione massima (MSM) e MWM. 9.2.2 Matching di peso massimo approssimato E‟ stata proposta una classe di approssimazione, 1-APRX. Il peso di uno schedule ottenuto da un algoritmo B sia WB. Sia W* il peso del MWM per lo stesso stato di switch. B è un 1-APRX per MWM se vale la seguente proprietà: WB ≥ W* − f (W*), dove f(·) è una funzione sub-lineare, cioè limx→∞ [ f (x)/x] = 0 per ogni stato di switch. TEO: Sia W*(t) il peso del MWM al tempo t, rispetto allo stato di switch Q(t)(dove Q(t) = [Qi, j(t)]) e Qi,j(t) indica il numero di celle nella coda VOQi,j. Sia B un 1-APRX per MWM e WB(t) indica il peso al tempo t. B ha una proprietà per cui:
Allora, l‟algoritmo di scheduling B è stabile sotto ogni traffico di input ammissibile di variabili indipendenti e identicamente distribuite di Bernoulli. 9.2.3 Maximum Size Matching Il matching di dimensione massima (MSM) trova il match con il massimo numero di archi. Ovviamente, MSM è un caso speciale per MWM, quando il peso di ogni arco è pari a 1. La complessità di tempo di MSM è O(N2.5). Si è dimostrato che MSM porta al 100% del throughput quando il traffico è uniforme. Tuttavia, sotto un traffico non uniforme, può portare a una situazione di instabilità e di non correttezza, e addirittura alla starvation per alcune porte. 9.3 MAXIMAL MATCHING Un algoritmo di matching maximal porta al match maximal aggiungendo connessioni in modo incrementale, senza rimuovere le connessioni messe in precedenza. In un match maximal, se un input non vuoto non è matchato con un qualsiasi output, tutti gli output di destinazione delle celle in attesa in questo input devono essere matchati con gli altri input. In generale, il match massimo ha meno archi matchati rispetto al MSM, ma è più semplice da implementare.
Gli
algoritmi
di
matching
maximal
hanno
una
complessità
di
implementazione più bassa rispetto a MWM. Tuttavia, i risultati delle simulazioni mostrano che il matching maximal raggiunge un throughput del 100% con un traffico uniforme, ma non sotto un traffico non uniforme.E‟ necessario uno speedup per garantire un throughput del 100% quando si usa un algoritmo di matching maximal. Uno switch con uno speedup di s può trasferire fino a s celle da ogni input e fino a s celle a ogni output in un singolo timeslot.
Uno switch a coda in uscita ha uno speedup di N, e uno switch a coda di ingresso ha uno speedup di 1. Di solito, quando 1
Step 1: Request. Ogni input non matchato invia una richiesta a tutti gli output per cui ha una cella in coda; Step 2: Grant. Se un output non matchato riceve richieste multiple, ne accetta uno scegliendo in modo casuale una richiesta tra tutte quelle che gli sono arrivate. Ogni richiesta ha la stessa probabilità di essere accettata; Step 3: Accept. Se un input riceve accettazioni multiple, ne sceglie una da accettare, in modo fair, e informa l‟output.
Nello step 1, input 1 invia la richiesta agli output 1 e 2, l‟input 3 invia la richiesta agli output 2 e 4, l‟input 4 invia la richiesta all‟output 4. In step 2, l‟output 1 accetta solo la richiesta dall‟input 1, l‟output 2 accetta l‟input 3 e l‟output 4 sceglie l‟input 3. Nell‟ultimo step 3, input 1 accetta solo dall‟output 1 e l‟input 3 sceglie casualmente l‟output 2 da accettare. Si è mostrato che ogni iterazione risolve, in media, almeno il 25% delle richieste rimanenti. Quindi, l‟algoritmo converge a O(logN) iterazioni, dove N indica il numero di porte. Non si usa memoria per tenere traccia di come è stata fatta la connessione, poiché, all‟inizio di ogni timeslot, il match ricomincia da capo, indipendentemente dai match fatti nei timeslot precedenti. D‟altra parte, PIM non si comporta bene in una singola iterazione. Il throughput per un‟iterazione è di circa 63% con traffico uniforme. Il motivo è questo: assumiamo che ogni VOQ di uno switch NxN sia non vuota. Con PIM, ogni output riceverà N richieste, una per ogni input. La probabilità che un output scelga e accetti un particolare input è 1/N, quindi la probabilità che un input non sia scelto da un output è 1-(1/N). Se un input viene accettato da almeno un output, questo input sceglie casualmente uno di questi. In altre parole, se un input non riceve nessun accettazione, non viene matchato. Questo avviene quando nessun output sceglie questo input per accettarlo, con probabilità 1-(1/N)N, cioè 11/e per N-> ∞. Quindi il throughput tende a 0.63 per N->∞. Perciò, con un traffico uniforme, PIM raggiunge il 63% e il 100% del throughput rispettivamente per 1 e N iterazioni. Quando lo switch viene usato troppo, PIM porta a un‟ingiustizia tra le connessioni.
In figura, la porta 1 ha celle verso gli output 1 e 2 in ogni timeslot, e analogamente l‟input 2
ha celle verso l‟output 1. Con PIM, l‟input 1 accetterà solo l‟output 1 per un quarto del tempo, poiché l‟output 1 dovrebbe prima accettare l‟input 1 e poi l‟input 1 dovrebbe accettare l‟output 1. Tuttavia, poiché nessuna porta ha contesa con l‟input 1 verso l‟output 2, l‟input 1 accetterà l‟output 2 durante gli altri 3 quarti del tempo. Ciò porta a un‟ingiustizia tra l‟input 1 verso l‟output 1 e l‟input 1 verso l‟output 2. Inoltre, implementare una funzione casuale ad alta velocità può essere costoso. 9.3.2 Iterative Round-Robin Matching (iRRM) Lo schema iRRM lavora simile a PIM, ma usa invece lo scheduler round-robin invece di una selezione casuale. Ogni scheduler mantiene un puntatore alla porta con la priorità massima. Tale puntatore è detto puntatore acceptaiall‟input i e puntatore grant gj all‟output j. Gli step dell‟algoritmo sono i seguenti: Step 1: Request. Ogni input non matchato invia una richiesta a ogni output per cui ha una cella in coda; Step 2: Grant. Se un output non matchato riceve multiple richieste, sceglie quella che è la successiva nello schedule round-robin partendo dall‟elemento con la priorità più alta. L‟output notifica a ogni input se la sua richiesta è stata accettata o meno. Il puntatore gi è incrementato (modN) di una posizione oltre l‟input accettato; Step 3: Accept. Se un input riceve accettazioni multiple, accetta quella che appare successiva nel suo schedule round-robin partendo dall‟elemento con priorità massima. In modo analogo, il puntatore ajviene incrementato (modN) di una posizione oltre l‟output accettato.
In questo esempio, supponiamo che il valore iniziale di ogni puntatore di grant sia input 1 (cioè gi = 1). In modo analogo, ogni puntatore accept è inizialmente puntato all‟output 1 (cioè aj = 1). Durante lo step 1, gli input richiedono la trasmissione a tutti gli output che hanno una cella destinata a questi.
Nello step 2, tra tutte le richieste ricevute, ogni scheduler di grant sceglie l‟input, tra quelli che hanno richiesto, che è più vicino a quello che è attualmente puntato. L‟output 1 sceglie l‟input 1, l‟output 2 sceglie l‟input 1, l‟output 3 non ha richieste e l‟output 4 sceglie l‟input 3. Quindi, ogni puntatore grant si muove di una posizione oltre quello scelto: in questo caso g1 = 2, g2 = 2, g3 = 1, e g4 = 4.
Nello step 3, ogni puntatore accept decide quale grant viene accettato in modo analogo a come è stato fatto dai puntatori grant. Nell‟esempio, l‟input 1 accetta l‟output 1, e l‟input 3 accetta l‟output 4; quindi a1 = 2, a2 = 1, a3 = 1 e a4 = 1. Bisogna notare che il puntatore a3 ha accettato il grant dall‟output 4, quindi il puntatore ritorna alla posizione 1. Sebbene
iRRM
porta una buona giustizia usando una policy round-robin, in realtà non raggiunge un throughput molto più alto rispetto a PIM in un‟iterazione. Ciò è principalmente dovuto al meccanismo di aggiornamento del puntatore dell‟output. Considerando la situazione in cui l‟input i con il puntatore accept che punta a j ha celle verso tutte le porte dell‟output, e i puntatori grant in tutti gli output puntano a i, con una iterazione, solo una cella verrà trasferita nel sistema dall‟input i all‟output j. Questo fenomeno è detto sincronizzazione di
output. Ciò degrada significativamente il throughputdi iRRM. Lo switch 2x2 con un‟iterazione iRRM raggiungerà solo il 50% del throughput sotto un carico pesante. 9.3.3 Iterative Round-Robin con SLIP (iSLIP) Gli step per questo schema sono i seguenti: Step 1: Request. Ogni input non matchato invia una richiesta a ogni output per cui ha una cella in coda; Step 2: Grant. Se un output non matchato riceve richieste multiple, sceglie quella che è la successiva nello schedule fisso round-robin partendo dall‟elemento con la priorità più alta. L‟output notifica a ogni input se la sua richiesta è stata accettata o meno. Il puntatore g i è incrementato (modN) a una posizione oltre l‟input accettato se e solo se il grant è stato accettato nello step 3 della prima iterazione. Step 3: Accept. Se un input riceve accettazioni multiple, accetta quella che appare successiva nel suo schedule round-robin partendo dall‟elemento con priorità massima. In modo analogo, il puntatore ajviene incrementato (modN) di una posizione oltre l‟output accettato. I puntatori accept aisono aggiornati solo nella prima iterazione. La differenza principale rispetto a iRRM è che in iSLIP i puntatori grant aggiornano la loro posizione solo se le loro grant sono accettate. Inoltre, i puntatori grant in uscita e accept in ingresso sono aggiornati solo durante la prima iterazione, poiché se i puntatori venissero aggiornati in ogni iterazione, allora qualche connessione potrebbe restare in uno stato di starvation in modo indefinito.
Ciò rappresenta un grafo di richiesta nel primo timeslot. Assumiamo che il puntatore accept della porta input 1 punti all‟output 1, e che il puntatore grant dell‟output 2 punti all‟input 1. Durante la prima iterazione del timeslot, l‟input 1 accetterà l‟output 1, e durante la seconda iterazione, l‟output 2 accetterà solo l‟input 2, poiché l‟input 1 è stato connesso. Quando l‟input 2 finalmente accetta l‟output 2, il puntatore grant nell‟output 2 sarà aggiornato oltre l‟input 1 fino alla porta 3. Così la connessione tra l‟input 1 e l‟output 2 può essere rinviata in
modo indefinito. Tuttavia, in questo schema di aggiornamento dei puntatori solo alla prima iterazione, si evita la starvation poiché ogni coppia di richieste viene servita entro 2N timeslot, e alla coppia connessa più recente è assegnata la priorità minore. A causa del movimento round-robin dei puntatori, l‟algoritmo fornisce un‟allocazione giusta di banda tra tutti i flussi. Questo schema contiene 2N arbitri, dove ogni arbitro è implementabile con bassa complessità. Il throughput offerto con tale algoritmo è pari al 100% con traffico uniforme per un qualsiasi numero di iterazioni a causa dell‟effetto di desincronizzazione.
Inizialmente tutti i puntatori aj e gi sono settati a 1.
Nello step 2 di iSLIP, l‟output accetta la richiesta che è più vicina all‟input puntato in senso orario: tuttavia, in maniera differente rispetto a iRRM, i puntatori gi non sono aggiornati in questo step, ma attendono l‟accettazione dei risultati.
Nello step 3, gli input accettano il grant che è più vicino a quello puntato da ai. I puntatori accept cambiano fino alla posizione oltre quello accettato, a1 = 2, a2 = 1, a3 = 1 e a4 = 1. Allora, dopo che i puntatori accept decidono quale richiesta accettare, i puntatori grant cambiano di una posizione oltre il grant accettato (cioè un grant non accettato non produce cambiamento nella posizione del puntatore grant). I nuovi valori per questi puntatori sono g1 = 2, g2 = 1, g3 = 1 e g4 = 4. Nelle successive iterazioni, solo gli input e output non matchati vengono considerati, e i puntatori non vengono modificati (cioè l‟aggiornamento avviene solo nella prima iterazione). iSLIP può raggiungere un throughput del 100% con una singola iterazione sotto un traffico di Bernoulli composto da arrivi indipendenti e uniformemente distribuiti. Ciò avviene perché, in un tempo finito, il puntatore di ogni arbitro di output punterà verso un input diverso dagli altri puntatori output, cosicché ogni input avrà una cella da servire in ogni timeslot. Sotto traffico pesante, l‟algoritmo di scheduling iSLIP si riduce alle seguenti regole: - In ogni timeslot, ogni input invia richieste a tutti gli output; - In ogni output, se il puntatore g punta a k in un timeslot, questo output accetta la richiesta dal k-esimo input. Se la richiesta viene scelta e accettata dal k-esimo arbitro input, nel successivo timeslot il puntatore punta a (k+1) modN; se non viene scelta, nel successivo timeslot il puntatore rimarrà sempre a k; - In ogni input k, se solo un puntatore output punta a k, questo output sarà scelto dall‟input k, se ci sono m puntatori output che puntano all‟input k, uno di questi verrà scelto; Definiamo un vettore Xi = (x1,i, . . ., xk,i, . . ., xN,i) per esprimere lo stato degli arbitri input: nel timeslot i ci sono xk,ipuntatori arbitri output che puntano all‟input k, con k = 1, . . ., N, 0 ≤ xk,i ≤
N, ∑k=1N xk,i = N. Se, al timeslot i,
xk,i = 1, k = 1, . . ., N, che indica che ogni input è puntato
da un puntatore arbitro output, allora il throughput sarà pari al 100% in questo timeslot. Mostriamo ora che Xi = (1, 1, . . ., 1) per tutti gli i ≥ N − 1. Quindi un throughput del 100% può essere prolungato in modo indefinito dopo N-1 timeslot. Per semplificare la notazione, scartiamo il modN, cioè (k+1)modN sarà rappresentato da k+1. Usando le regole di arbitrato iSLIP al vettore Xi, abbiamo:
Facendo scorrere ciclicamente Xi a sinistra di uno slot ogni timeslot, abbiamo un altro vettoreYi = (y1,i, . . ., yk,i, . . ., yN,i). Yi è definito in questo modo: nel timeslot 0 Y0 = X0, cioè yk,0 = xk,0, k = 1, . . ., N, e nei timeslot m ≥ 0, yk,m = xk+m,m, k = 1, ..., N. In ogni timeslot, yk,i rappresenta lo stato di un arbitro di input. Se e solo se, nel timeslot i, y k,i = 1 per ogni k = 1, …,N, allora xk,i è uguale a 1 per ogni k. Quindi è sufficiente mostrare che Yi = (1, 1, …, 1) per ogni i≥ N − 1 per dimostrare un throughput del 100% con iSLIP con un traffico uniforme. Si ha che:
Considerando la terza e la quarta condizione, si può concludere che ogni volta che y k è > 0, dopo ciò sarà più grande di 0. Secondo questa condizione, se nel timeslot i yk,i = 1 per ogni k = 1, …, N, allora per ogni timeslot j>i, tutti gli yk,i saranno più grandi di 0. Poiché ci sono N input e N output, e ∑ Nk=1 yk = N, dopo il timeslot i, yk = 1, k = 1, …,N, che indica che xk = 1 per tutti i k e il throughput sarà sempre pari al 100%. Dimostreremo che qualunque sia lo stato iniziale Y 0, in un numero finito di timeslot M, con M < N-1, avremo sempre yk,M = 1, k = 1, …,N.
Il vettore dello stato Y e le sue transizioni di stato può essere espresso come nella figura precedente. Abbiamo N palle in N scatole. Nel timeslot i, ci sono yk,i palle nella k-esima scatola, con k = 1, …,N. Mostreremo che non importa quante siano le palle in ogni scatola all‟inizio, dopo al massimo N-1 timeslot, ogni scatola conterrà esattamente una palla. Nel timeslot i, se la scatola k è occupata e ha m palle, con m>0, allora nel timeslot i+1 una delle m palle rimarrà nella scatola k e le altre (se ce ne sono) si muoveranno nella scatola k-1. Se arriva più di una palla in una scatola vuota, una di queste viene scelta arbitrariamente per restare. Quindi se una palla arriva in una scatola vuota, rimarrà lì per sempre. In figura, le palle nere sono quelle che occupano una scatola per sempre, mentre quelle bianche continuano a muoversi finché trovano una scatola vuota e la occupano, e a questo punto diventano nere. Ognuna delle N palle troverà una scatola da occupare in modo permanente in meno di N-1 timeslot, così ogni scatola avrà al suo interno una palla. Seguendo le regole, e sapendo quante palle ci sono nella scatola k e nella scatola k+1 nel timeslot i (yk,i e yk+1,i), possiamo sapere il numero di palle nella scatola k nel timeslot i+1 (yk,i+1). Condizione 1: se nel timeslot i la scatola k è vuota e la scatola k+1 ha al massimo una palla, allora la scatola k sarà sempre vuota nel timeslot i+1; Condizione 2: se nel timeslot i la scatola k è vuota e la scatola k+1 ha j palle (j>1), allora una della j palle rimarrà nella scatola k+1 e nella scatola k ci saranno le altre j-1 palle; Condizione 3: se nel timeslot i la scatola k ha j palle, con j>1, e la scatola k+1 ha al massimo una palla, allora nel timeslot i+1 nessuna palla si muoverà dalla scatola k+1 alla scatola k, e solo una palla (che occupa permanentemente la scatola k) rimarrà nella scatola k; Condizione 4: se nel timeslot i ci sono m palle nella scatola k e j palle nella scatola k+1, con
m>1 e j>1, allora nel timeslot i+1 una delle m palle (che occupano la scatola k) resta nella scatola k e le altre si muovono nella scatola k-1, e una delle j palle (che occupano la scatola k+1) resta nella scatola k+1 e j-1 palle si muovono nella scatola k; la scatola k avrà allora j palle. Nel timeslot 0, se una palla solitaria occupa una scatola, significa che ha già trovato la sua scatola definitiva. Dobbiamo dimostrare che se una palla non occupa una scatola nel timeslot 0, troverà la sua scatola entro N-1 timeslot. Supponiamo che nel timeslot 0 la scatola k è occupata e c‟è una palla bianca (detta B) al suo interno; allora nel successivo timeslot, la palla B deve muoversi nella scatola k-1. Usiamo ora una dimostrazione per assurdo: assumiamo che fino al timeslot N-1 la palla B non trova la sua scatola da occupare; ciò significa che si è mossa in ogni timeslot e ha viaggiato per N-1 scatole, tutte occupate. Poiché la scatola k è già occupata, tutte le N scatole sono occupate da N palle. Con la palla B, c‟è un totale di N+1 palle nel sistema, che è impossibile. Quindi l‟ipotesi è sbagliata e la palla B troverà una scatola da occupare entro N-1 timeslot. Quindi concludiamo che ogni palla può trovare una scatola da occupare entro N-1 timeslot, e dal timeslot N-1 ogni scatola ha una palla al suo interno. Quindi Yi,yk,i = 1, k = 1, …,N, i ≥ N − 1, per ogni Y0, che indica che dopo il timeslot N-1, ogni puntatore output arbitro punterà a un input differente, e ciò continuerà in modo indefinito. Ciò garantisce un throughput del 100%.