# Commutazione di pacchetto

La commutazione di pacchetto (in inglese packet switching), nelle telecomunicazioni, è una tecnica di accesso multiplo a divisione di tempo, specificamente concepita per il trasporto di dati, utilizzata per condividere un canale di comunicazione tra più nodi in modo non deterministico, suddividendo l'informazione da trasferire in pacchetti trasmessi individualmente e in sequenza, seguendo un meccanismo di instradamento dettato da relative tabelle di instradamento. La commutazione di pacchetto trova applicazione nelle reti di calcolatori e più in generale nelle reti di telecomunicazione. Esempi di reti basate sulla commutazione di pacchetto sono le reti locali di calcolatori e Internet.

## Descrizione

Storicamente la commutazione di pacchetto fu concepita nei primi anni sessanta, in un contesto di guerra fredda, come soluzione al problema di garantire la sopravvivenza di una rete di telecomunicazioni in seguito ad un attacco nucleare. L'idea di base consiste nel suddividere l'informazione in entità elementari (i pacchetti) che poi vengono trasmesse e instradate individualmente e teoricamente ognuna in modo indipendente per essere poi riassemblate nel punto di destinazione. L'instradamento dei pacchetti avviene usando in ogni nodo della rete apposite tabelle di tipo dinamico, dette tabelle di routing, che ad ogni pacchetto ricevuto su una interfaccia associano la corrispondente interfaccia di uscita verso il nodo successivo. La determinazione dell'interfaccia di uscita viene stabilita in base a meccanismi di auto-apprendimento oppure tramite appositi protocolli di routing: in questo modo, nel caso in cui determinati collegamenti o link trasmissivi diventino inoperativi o inutilizzabili, è possibile individuare un instradamento alternativo che assicuri la continuità e l'integrità della trasmissione.
Questo approccio consente anche un utilizzo più efficiente della capacità trasmissiva di una rete rispetto alla commutazione di circuito, dove la comunicazione per poter avere luogo richiede l'instauramento preliminare di un circuito fisico la cui capacità è interamente dedicata alla specifica comunicazione. Nella commutazione di pacchetto invece i circuiti fisici sono utilizzati solo per il tempo strettamente necessario alla trasmissione di un singolo pacchetto e sono subito disponibili per poter trasmettere un altro pacchetto appartenente a un segnale diverso. Ciò consente un livello di condivisione del mezzo più elevato.
Di contro, a differenza delle reti a commutazione di circuito, nelle reti a commutazione di pacchetto il ritardo di trasferimento complessivo non è fisso, ma varia a seconda del percorso seguito dal pacchetto e delle condizioni istantanee del traffico, inoltre non è del tutto predicibile a priori il percorso che seguirà il pacchetto. Oltre a ciò, data la natura non continuativa della trasmissione e l'utilizzo condiviso, insorge anche la necessità di controllare la congestione nel caso di concorrenza trasmissiva da sorgenti differenti o di richiesta elevata di banda da parte di più sorgenti contemporaneamente.
Per le sue caratteristiche, la commutazione di pacchetto pone quindi un problema nel caso sia necessaria una disponibilità garantita di banda o nelle trasmissioni real time come le comunicazioni vocali tipiche della telefonia (che richiedono ritardi molto limitati e prossimi allo zero) o quelle audio-video. Per affrontare questo aspetto viene sfruttata la possibilità, già prevista negli standard relativi, di assegnare livelli di priorità ai pacchetti, definendo in questo modo classi di qualità di servizio. Con questo meccanismo, i pacchetti a priorità più elevata hanno la precedenza nell'accesso alla banda rispetto a quelli di priorità inferiore, che vengono quindi accodati e, in situazioni estreme, scartati in caso di forte congestione. Assegnando le priorità più elevate ai pacchetti relativi alle informazioni più sensibili ai ritardi o alla perdita di banda disponibile si possono in questo modo mantenere ritardi e perdite dei pacchetti entro i limiti accettabili dalle relative applicazioni.

## Funzionamento
### Struttura generale del pacchetto

In una rete a commutazione di pacchetto (PBN, Packet Based Network) l'informazione da trasmettere viene suddivisa in pacchetti di dimensione abbastanza piccola; ad ognuno di essi viene aggiunta un'intestazione (header) che precede il contenuto informativo vero e proprio, detto payload. L'header contiene tutta l'informazione necessaria affinché il pacchetto possa essere identificato e inoltrato fino alla sua destinazione finale, ovvero l'indirizzo del destinatario, la sua posizione (numero di pacchetto) all'interno del flusso dell'informazione che viene trasferito più tutta una serie di informazioni aggiuntive come ad esempio il livello di priorità del singolo pacchetto, la lunghezza del campo informativo, il tipo di informazione trasportata (per distinguere per esempio i pacchetti che trasportano contenuto informativo dai pacchetti che trasportano informazioni di protocollo o di altro tipo). I pacchetti vengono inviati individualmente attraverso la rete e grazie al numero di pacchetto vengono poi riassemblati nell'ordine originale quando arrivano sul nodo destinatario.
Ad ogni pacchetto viene inoltre aggiunta, tipicamente in coda al campo informativo vero e proprio, una parola di controllo individuale, calcolata sulla sequenza di bit che compongono il pacchetto stesso sfruttando un algoritmo il cui risultato consente di evidenziare la presenza di eventuali errori trasmissivi. Il nodo ricevente elabora i bit del pacchetto usando lo stesso algoritmo per calcolare autonomamente la parola di controllo e confrontarla con quella trasmessa insieme al pacchetto: se i risultati non coincidono, il pacchetto è stato corrotto da errori trasmissivi e tipicamente viene scartato e non ritrasmesso verso il nodo successivo. La caratteristica comune a tutti gli algoritmi di controllo utilizzati è che la probabilità che la parola di controllo ricevuta in presenza di errori trasmissivi coincida con la parola di controllo ricalcolata dal nodo ricevente è praticamente nulla. Esistono alcuni algoritmi di controllo più sofisticati che oltre alla rilevazione degli errori sono in grado di correggerli, entro certi limiti: se è possibile correggerli tutti, il pacchetto viene ricostruito nella sua integrità e una volta eliminati gli errori trasmesso verso il nodo successivo. Esempi di questi algoritmi sono il Cyclic redundancy check (CRC), che è in grado di identificare la presenza di errori, e il Forward Error Correction (FEC) che è anche in grado di correggere tali errori.
Il meccanismo della trasmissione a pacchetti è ricorsivo, nel senso che il campo informativo di un pacchetto può essere a sua volta un altro pacchetto, consentendo così di realizzare una pila gerarchica a più livelli.

### Meccanismo di instradamento

Quando un nodo intermedio detto commutatore di pacchetto riceve un pacchetto, esso decide qual è il percorso migliore che il pacchetto può prendere per raggiungere la sua destinazione in base alle informazioni presenti nelle tabelle di routing e ai risultati delle elaborazioni da parte dei protocolli di routing (se attivi). Questa strada può cambiare da pacchetto a pacchetto dipendentemente dalle condizioni della rete (congestione, malfunzionamento del link o del nodo, capacità massima dei link ecc.), per cui pacchetti appartenenti a uno stesso messaggio possono intraprendere anche percorsi distinti.

## Problematiche
### Ritardo

Un pacchetto che attraversa una rete subisce un ritardo, legato a quattro componenti fondamentali, non tutte deterministiche:
* Tempo di elaborazione, dipendente dal nodo: è il tempo necessario a ciascun nodo per processare il pacchetto e deciderne l'interfaccia di uscita. Se un nodo agisce a diversi livelli di pacchetto, ciascun livello aggiungerà una sua componente di ritardo.
* Tempo di trasmissione, dipendente dalla velocità di trasmissione: è il tempo necessario per trasmettere il pacchetto alla velocità della linea di trasmissione (link). È dato dal rapporto tra la lunghezza in byte del pacchetto e la velocità o capacità di linea.
* Tempo di latenza o di accodamento (queuing delay), dipendente dall'ingegneria del nodo: è dovuto al fatto che i pacchetti in uscita o in entrata non sempre vengono trasmessi/ricevuti immediatamente. Infatti la linea in uscita può essere occupata da altri pacchetti in corso di trasmissione/ricezione. In questo caso, il pacchetto viene salvato in una memoria temporanea del commutatore detta coda o buffer, per venir trasmesso appena possibile. Il tempo atteso dal pacchetto nella coda, detto anche ritardo di latenza, non ha una durata predefinita poiché cambia dinamicamente in funzione della dimensione della coda e della quantità momentanea di pacchetti da trasferire. Il ritardo di latenza può però essere caratterizzato statisticamente tramite distribuzione di probabilità e i modelli della teoria delle code.
* Tempo di propagazione, dipendente dal mezzo fisico: è il tempo necessario al segnale fisico per propagarsi lungo la linea di trasmissione fino al nodo successivo e da qui alla destinazione finale. Nei mezzi trasmissivi come rame o fibra ottica, i segnali si propagano a velocità confrontabili a quella della luce.
Le problematiche legate al ritardo sono sostanzialmente due:
* Alcune forme di comunicazione richiedono che il ritardo complessivo di trasferimento dei pacchetti (ritardo end-to-end) rimanga strettamente entro un limite massimo, pena effetti indesiderati se non distruttivi della comunicazione stessa. È il caso per esempio della trasmissione di telefonate su pacchetto (VoIP), in cui un ritardo eccessivo comporterebbe delle pause indesiderate durante la conversazione (l'ascoltatore percepisce nettamente un istante di silenzio prima di sentire la voce dell'interlocutore) e la necessità di ricorrere a circuiti di compensazione.
* Le variazioni del ritardo nel tempo (jitter), ossia il fatto che per un certo pacchetto il ritardo potrebbe essere diverso rispetto a un altro pacchetto appartenente alla stessa comunicazione, hanno una ripercussione nel nodo destinazione per la ricostruzione dell'integrità dell'informazione. Anche in questo caso, per alcune applicazioni, una variazione eccessiva può comportare distorsioni o perdite temporanee non accettabili. È il caso per esempio della trasmissione video su pacchetto, dove una variazione di ritardo eccessiva potrebbe risultare in forme di fermo immagine temporanee o in un degrado di qualità dell'immagine.
Esistono diversi meccanismi per cercare di attenuare o rendere controllabili gli effetti del ritardo. Per esempio, per ridurre o limitare il tempo di trasmissione, si può ricorrere a tecniche di tipo store and forward, per cui all'interno del nodo si attende il completamento della ricezione e dell'elaborazione del pacchetto prima di inviarlo alla coda di trasmissione.

### Perdita di pacchetti

Il meccanismo della commutazione di pacchetto non può generalmente garantire che tutti i pacchetti inviati arrivino a destinazione. La perdita di pacchetti può avvenire in seguito a diverse condizioni:
* Guasti di nodo o di collegamento: i pacchetti in trasmissione durante l'evento di guasto vengono perduti e fino a quando il processo di reinstradamento non è terminato i pacchetti non giungono a destinazione.
* Errori di trasmissione: un pacchetto che è stato distorto durante la trasmissione e che non supera la verifica tramite la parola di controllo viene scartato.
* Problemi di congestione (traffico superiore alla capacità del nodo), che a loro volta si possono distinguere tra:
** Congestione in ingresso, quando un nodo riceve più pacchetti rispetto a quanto è in grado di accumularne nella coda di ingresso, saturandola: i nuovi pacchetti in ingresso, non potendo essere accodati, vengono scartati.
** Congestione in uscita, quando i pacchetti da trasmettere arrivano a un ritmo o a una quantità tali da saturare completamente la coda di trasmissione: anche in questo caso, i pacchetti che non possono essere accodati per la trasmissione vengono scartati.
* Perdita deliberata per motivi di sicurezza ed efficienza di rete, ossia:
** Violazione nell'allocazione di risorse (policing): dove è possibile stabilire dei limiti per la quantità di risorse assegnate a una determinata comunicazione tra pacchetti (es. una certa quantità di banda), i pacchetti in eccesso rispetto alle risorse assegnate vengono scartati, anche in presenza di capacità di banda che potrebbe consentirne la trasmissione.
** Controllo di accesso (security): sulle interfacce dove sono stabilite regole aggiuntive per accettare un pacchetto in ingresso (per esempio, la provenienza da una determinata sorgente o altre caratteristiche individuabili nell'header del pacchetto), i pacchetti che non soddisfano tali regole non devono poter accedere alla rete e quindi vengono scartati.
Escludendo i casi in cui la perdita di pacchetti è un effetto desiderato, in tutti gli altri casi è necessario compensare o limitare l'effetto delle perdite di pacchetti. Nel caso di guasti di nodo o di collegamento, opportuni protocolli di routing (o con funzionalità equivalenti) possono intervenire per individuare un percorso alternativo che aggiri il punto di guasto. Nel caso di errori di trasmissione, l'uso di algoritmi di correzione di errore può riparare entro certi limiti i pacchetti corrotti, riducendo così la perdita solo ai pacchetti affetti da una quantità considerevole di errori. Nel caso delle congestioni, opportuni meccanismi di priorità possono fare in modo che il traffico più "prezioso" (a priorità più alta) venga favorito rispetto al traffico meno prioritario, concentrando lo scarto di pacchetti in eccesso su quest'ultimo. Ancora, il dimensionamento e la gestione delle code di ingresso e uscita può esser realizzata in modo da dilazionare meglio la trasmissione dei picchi di pacchetto, sfruttando i momenti di minor congestione per mantenere la trasmissione a un ritmo più costante nel tempo (traffic shaping), con effetti positivi a cascata sui nodi successivi.
La possibilità di gestire una comunicazione a pacchetti in modo gerarchico a più strati (come nel caso della pila ISO-OSI) fornisce un ulteriore strumento per la gestione delle perdite, per esempio prevedendo meccanismi di controllo dell'integrità dell'informazione e di eventuale richiesta di ritrasmissione della parte di informazione perduta (è il caso per esempio del protocollo TCP).

### Capacità di monitoraggio

La tecnologia a commutazione di pacchetto rispetto alla tecnologia a commutazione di circuito presenta dei limiti per quanto riguarda il monitoraggio e il controllo della corretta funzionalità della rete. Essendo stata concepita inizialmente per il trasferimento di dati con modalità best-effort o comunque con esigenze limitate di reattività in tempo reale, non prevedeva i meccanismi di reazione rapida tipici delle reti di telefonia basate su commutazione di circuito (come per esempio la capacità di dirottare il traffico su un circuito alternativo entro 50 millisecondi dalla rilevazione di un guasto distruttivo). Con l'estensione della commutazione di pacchetto anche alle reti telefoniche, questa ridotta capacità ha richiesto la definizione di meccanismi aggiuntivi come per esempio l'utilizzo di pacchetti speciali (i cosiddetti pacchetti di Operation, Administration and Maintenance, abbreviate in OAM) che consentono, per esempio sulla base di una loro trasmissione periodica, di controllare in tempo reale lo stato della rete e dei collegamenti, di trasferire tra i nodi informazioni di malfunzionamenti, di generare sui nodi segnalazioni di guasto di rete e di stabilire percorsi alternativi (normalmente precalcolati) con tempi confrontabili con quelli delle reti telefoniche a commutazione di circuito. Questi stessi pacchetti di OAM consentono inoltre il monitoraggio in tempo reale del livello di qualità del servizio, in particolare dei servizi per cui aspetti quali ritardo di propagazione o variazioni eccessive del ritardo di propagazione possono avere effetti negativi per l'utente finale (è il caso per esempio del Voice over IP), rendendo così possibile l'impiego affidabile di tali reti anche per servizi ad elevate richieste di qualità.