Software Di Rete

Lezione 2 - La gerarchia dei protocolli e la base del software.

Con l’evoluzione delle reti e la loro crescente complessità il software ha assunto un ruolo di grande rilievo. Ad oggi, infatti, anche nelle reti il software è molto importante: una rete moderna è il frutto della sinergia tra hardware e software.

Uno degli scopi principali del software che governa le reti è quello di ridurre la loro complessità, organizzandole in livelli (o layer, come vengono chiamati in inglese). La quantità di questi livelli, la loro funzione e il modo in cui interagiscono sono caratteristiche che variano da rete a rete e che, ancora una volta, sono gestite dal software.

Protocolli

Il software di rete non è un unico e grande monolite: come dicevo, è organizzato in vari livelli. I diversi layer devono comunicare per poter funzionare; le regole che seguono per comunicare formano i protocolli: i protocolli, quindi, altro non sono che degli insiemi di regole accettate da tutte le parti.

Schema generale dell’architettura a livelli

Lo schema che ho disegnato esemplifica proprio l’architettura a livelli. Come si può vedere, ho tracciato una linea tratteggiata che “connette” ogni livello sull’host sorgente al medesimo layer sull’host destinatario.

In realtà, i dati non passano dal layer i di un host al layer i di un altro host. Ogni livello passa il controllo al livello immediatamente sotto, fino al mezzo fisico - e viceversa.

Tra un layer e l’altro ci sono delle interfacce, che garantiscono una corretta interoperazione.

La particolarità di quest’approccio è che i layer possono variare tra un’implementazione e l’altra, purché rispettino il protocollo e le interfacce che sono state definite.

Architetture di rete

L’insieme di livelli e protocolli che ne definiscono il comportamento costituisce un'architettura di rete.

La lista di protocolli usati da un sistema, invece, è uno stack di protocolli - o stack protocollare. Questa, probabilmente, è una delle espressioni preferite dai sistemisti 😁.

Header

Ogni layer aggiunge ai dati delle informazioni aggiuntive, dette header. In questo modo i layer dell’host ricevente, dopo averli esaminati, sanno cosa fare con il pacchetto che hanno ricevuto.

Ogni livello, prima di passare il contenuto del pacchetto al livello “sopra”, rimuove il proprio header. Al contrario, quando viene “costruito” il pacchetto, il livello prima aggiunge il proprio header e poi passa i dati al livello “sotto”.

Il layer più in alto è denominato applicazione e corrisponde, a grandi linee, al concetto che tutti conosciamo. Le applicazioni non hanno alcun limite sulle dimensioni dei dati che possono generare o ricevere. Trasportare un file da diverse centinaia di Megabyte, però, è problematico.

Proprio per questo il livello 3 (che, come vedremo più avanti, è il livello rete) li “spezzetta” in parti parti dalle dimensioni contenute, così da poterli trasmettere agevolmente. L’host ricevente, poi, li rimette in ordine sfruttando le informazioni contenute nell’header: in questo modo il messaggio originale viene “ricostruito”.

Error detection

Per garantire che la comunicazione si svolga correttamente è necessario poter identificare gli errori.

Uno dei meccanismi più semplici consiste nell’usare i codici d’errore: il destinatario, se intercetta un errore, chiede la ritrasmissione al mittente, finché non riceve i dati integri.

Questa tecnica ha un grave difetto, però: occupa - anzi, spreca - un sacco di banda. Una tecnica più avanzata consiste nell'error correction, che tenta di ricostruire il messaggio originale partendo da quello danneggiato.

Non sempre, però, è in grado di farlo: in queste situazioni, quindi, si può comunque richiedere la ritrasmissione.

Addressing

Proprio come accade con il recapito della posta e dei pacchi che compriamo su Amazon, anche i pacchetti dati devono adottare un metodo per indicare a chi vanno e chi li manda.

Per identificare il mittente e il destinatario ogni layer utilizza i suoi meccanismi, che prendono il nome di addressing o naming.

Internetworking

Un altro (grande) problema da affrontare nella comunicazione tra reti diverse è che le tecnologie impiegate sono spesso differenti (neanche a dirlo… 🙄). Per mettere in comunicazione reti che si appoggiano ad infrastrutture hardware e software diverse si impiegano diverse tecniche a cui, complessivamente, ci si riferisce con internetworking.

Scalabilità

Un’ulteriore caratteristica di fondamentale importanza è la scalabilità: è la capacità di crescere in dimensioni per rispondere alle esigenze. Il numero di utenti è in costante aumento così come, soprattutto, il traffico generato. È sufficiente pensare, ad esempio, al traffico prodotto dallo streaming video: la loro risoluzione è passata, in pochi anni, dal 480p o 720p al 4k@60fps, magari HDR.

Insomma, per quante tecniche di compressione si adottino, i dati da trasportare crescono. E bisogna essere in grado di prevedere queste crescite, soprattutto se si vuole evitare il collasso della rete.

Divisione delle risorse

Il problema, quindi, è in parte anche quello di decidere come gestire le risorse. Tra i tanti metodi che sono stati ideati, uno è il multiplexing statistico, che assegna ad ogni host una frazione di tempo per trasmettere. L’host, se deve inviare delle informazioni, può farlo nel tempo assegnatogli.

Ci sono poi altre tecniche, “sparpagliate” tra i vari livelli. Le esamineremo a tempo debito 😉.

Congestione

L’incubo di ogni sistemista, perciò, è la congestione della rete: si verifica quando troppi host si connettono e il traffico cresce così tanto che la rete rallenta o, nei casi peggiori, si blocca.

Caratteristiche

Una rete, inoltre, deve soddisfare alcune caratteristiche, che variano in base alle esigenze. Solitamente, ad esempio, si integrano dei meccanismi in grado di “accontentare tutti”: sono meccanismi di Quality of Service (QoS).

Le reti moderne, poi, devono fornire meccanismi di confidenzialità, autenticazione e integrità. Esploreremo tutte queste caratteristiche nelle future lezioni.

Connection-oriented e connectionless

Torniamo ai layer di cui ho parlato poco fa; ogni livello può offrire, ai layer superiori, un servizio connection-oriented oppure connectionless.

I servizi connection-oriented consistono nel stabilire una connessione con il destinatario, usarla e, infine, chiuderla. La connessione inizia con una fase di negoziazione, in cui vengono accordati, da entrambe le parti, i parametri da utilizzare per comunicare.

I servizi connectionless, al contrario, assomigliano di più alle… poste! Tutti i messaggi, infatti, devono contenere l’indirizzo del destinatario e vengono instradati indipendentemente gli uni dagli altri. È proprio per questo motivo che, come ho già accennato, il messaggio originale deve essere riassemblato a destinazione: i pacchetti potrebbero arrivare in un ordine diverso da quello di invio, seguendo strade diverse.

Una questione di nomi

I messaggi assumono nomi diversi in contesti diversi: al livello di rete, ad esempio, si chiamano pacchetti. Fino ad ora ho utilizzato i termini “pacchetto” e “messaggio” come sinonimi. Nell’ambito delle reti, però, indicano cose diverse: nelle prossime lezioni, quindi, li userò secondo il loro significato corretto, a costo di qualche ripetizione 😁.

Accenni di forwarding

I pacchetti attraversano spesso vari nodi prima di giungere a destinazione. Quando un nodo intermedio attende tutto il pacchetto prima di inoltrarlo, si parla di store-and-forward switching. Se, invece, l’inoltro inizia prima di aver ricevuto l’intero pacchetto, si parla di cut-through switching.

Servizi non affidabili

I servizi connectionless vengono chiamati anche datagram service e sono classificati come “non affidabili”. Questa dicitura, però, può risultare fuorviante: non significa affatto che perdano spesso i pacchetti.

Un servizio inaffidabile è, semplicemente, un servizio che:

  • fa “del suo meglio” per consegnare a destinazione il messaggio;
  • se la consegna dovesse fallire, per qualsiasi motivo, non avvisa il mittente né ritenta la trasmissione.

Servizi vs protocolli

È fondamentale, infine, comprendere la differenza tra servizio e protocollo:

  • un servizio è un set di primitive (in altre parole, operazioni) che un layer fornisce ad un altro;
  • un protocollo, invece, è un insieme di regole che definiscono il contenuto, il formato e il significato dei pacchetti.

Software di rete

Questa terza lezione del corso prosegue lungo il sentiero che ho iniziato a tracciare con la precedente lezione sul software di rete. È l’ultima lezione introduttiva di questo corso, poiché dalla prossima inizieremo ad esplorare i modelli di riferimento 🤩.