# Livello di collegamento dati

Modello OSI :
| 7. | Livello di applicazione |
| 6. | Livello di presentazione |
| 5. | Livello di sessione |
| 4. | Livello di trasporto |
| 3. | Livello di rete |
| 2. | Livello di collegamento dati Sottolivello LLC Sottolivello MAC |
| 1. | Livello fisico |
In telecomunicazioni il livello di collegamento dati (data link layer) è il secondo livello del modello OSI per le reti di calcolatori. Questo livello in trasmissione riceve pacchetti dati dal livello di rete e forma i frame che vengono passati al sottostante livello fisico con l'obiettivo di permettere il trasferimento affidabile dei dati attraverso il sottostante canale.

## Descrizione

Nello stack IP, in alcuni casi, il livello datalink consiste nell'utilizzo di una rete realizzata con un altro protocollo per il trasporto di pacchetti IP. Questo avviene ad esempio con X.25, Frame Relay, Asynchronous Transfer Mode. Alcuni esempi di protocolli del livello datalink sono:
* Ethernet (per le LAN)
* PPP, HDLC e ADCCP per le connessioni punto a punto (point-to-point), cioè tra due stazioni collegate direttamente, senza nodi intermedi.
Può essere o non essere affidabile: molti protocolli di data link non utilizzano conferme e alcuni potrebbero addirittura non controllare se sono stati commessi errori di trasmissione. In questo caso devono essere i livelli superiori ad effettuare il controllo di flusso, il controllo degli errori e gestire le conferme (e relative ritrasmissioni).
In alcune reti, come le LAN IEEE 802, questo livello è diviso nei sottolivelli MAC e LLC. Quest'ultimo è comune a tutti i livelli MAC, come token ring e IEEE 802.11 ma anche a livelli MAC che non fanno parte dello standard 802, come FDDI.

### Funzionalità

Il livello datalink deve quindi svolgere più funzioni specifiche:
* Nella fase di trasmissione raggruppa i bit provenienti dallo strato superiore e destinati al livello fisico in pacchetti chiamati frame (framing);
* Nella fase di ricezione controlla e gestisce gli errori di trasmissione (controllo di errore);
* Regola il flusso della trasmissione fra sorgente e destinatario (controllo di flusso).
* Nella fase di trasmissione opera una qualche forma di accesso multiplo/multiplazione per l'accesso condiviso tra più utenti al canale fisico che eviti collisioni tra pacchetti e interferenze in ricezione o sul canale.
Tutto ciò consente di far apparire in ricezione, al livello superiore, il mezzo fisico come una linea di trasmissione esente da errori.

### Sottolivello LLC

Il sottolivello superiore è Logical link control (LLC), e può fornire servizi di controllo di flusso, conferma, rilevazione (o correzione) degli errori. I protocolli PPP e HDLC fanno parte di questo sottolivello.
I protocolli di sottolivello LLC che forniscono il servizio di conferma o di garanzia di ricezione dei dati devono prevedere messaggi di conferma avvenuta ricezione (acknowledge, o ACK). Il trasmittente può attendere il riscontro di ciascun messaggio prima di trasmettere il successivo, oppure può continuare a trasmettere fino al raggiungimento di un numero massimo di messaggi non ancora confermati dal ricevente, nei cosiddetti protocolli finestrati.
Nei protocolli con finestra ciascun pacchetto trasmesso è identificato con un numero progressivo all'interno della finestra, detto numero di sequenza (sequence number); i messaggi di conferma devono riportare il numero di sequenza del pacchetto che riscontrano.
I messaggi di conferma possono essere cumulativi ("ricevuti i pacchetti fino a N"), o richiedere la ritrasmissione cumulativa ("ritrasmettere i pacchetti fino a N") o selettiva dei soli pacchetti non ricevuti correttamente. In alcuni casi il riscontro dei messaggi ricevuti utilizza un messaggio dedicato, in altri casi il riscontro viene inserito in campi specifici dei messaggi trasmessi in direzione opposta (piggyback) diminuendo le latenze di ritrasmissione.

### Sottolivello MAC

Il sottolivello inferiore è Media Access Control o Medium Access Control. Il suo scopo è quello di disciplinare l'accesso multiplo di molteplici nodi ad un canale di comunicazione condiviso evitando o gestendo l'occorrenza di collisioni. Una collisione si verifica quando due o più nodi trasmettono simultaneamente dati sul canale condiviso. Ciò comporta l'inevitabile perdita dei dati trasmessi con conseguente spreco di banda.
Esistono molteplici algoritmi e protocolli standard per il controllo dell'accesso multiplo. Ad esempio, il MAC IEEE 802.3 adotta l'algoritmo CSMA/CD mentre il MAC IEEE 802.11 si basa sull'algoritmo CSMA/CA. Il primo è comunemente adottato in LAN cablate, il secondo in WLAN.
Due sono le principali tipologie di algoritmi di accesso multiplo: casuale e ordinato. Nell'accesso multiplo casuale è possibile che si verifichino delle collisioni ma vengono implementati degli opportuni meccanismi per ridurne la probabilità di occorrenza e per ritrasmettere le trame collise. Nell'accesso ordinato, invece, l'evenienza di una collisione è del tutto impossibile poiché i nodi seguono un preciso ordine di accesso al canale (stabilito nella fase di inizializzazione della rete) che li rende utilizzatori esclusivi del mezzo trasmissivo (a meno di guasti o malfunzionamenti).
A livello MAC, inoltre, si definisce il formato della trama, che tipicamente conterrà i campi di inizio/fine, i campi di indirizzo MAC mittente/destinatario, il pacchetto incapsulato di livello LLC, il codice per la rilevazione degli errori (FEC), ed opzionalmente dei byte di padding per garantire che la dimensione della trama non scenda al di sotto di una soglia minima.

### Interfacce

Il livello di data link è spesso implementato come un driver della scheda di rete. Il sistema operativo avrà una certa interfaccia software tra questo livello e quello superiore (di rete). Questa interfaccia non è un livello, ma più uno standard per la comunicazione tra livelli.
Alcuni esempi:
* ODI
* NDIS
* SANA II - Standard Amiga Networking Architecture, versione 2

## Funzionalità sottolivello LLC
### Trasmissione sincrona e asincrona

La trasmissione seriale può avvenire in modo sincrono o asincrono.
Nella trasmissione asincrona ogni carattere trasmesso viene preceduto e seguito da segnali che indicano appunto l'inizio e la fine del carattere; tali segnali vengono detti segnali di start e stop. La trasmissione asincrona perciò viene detta anche trasmissione start-stop. Con tale metodo ogni carattere può essere considerato indipendente dagli altri, l'intervallo di tempo tra l'invio di due caratteri è imprecisato.
Nella trasmissione sincrona i caratteri da inviare vengono raggruppati in messaggi (frame). Ogni frame viene fatto precedere da caratteri di sincronizzazione che servono a far sì che la stazione ricevente si sincronizzi sulla velocità di trasmissione della stazione che invia il messaggio. La trasmissione sincrona è più veloce perché i tempi morti di trasmissione vengono ridotti, ma un errore anche in un singolo bit può danneggiare l'intero messaggio inviato. I protocolli di trasmissione sincrona si suddividono in BCP (Byte Control Protocol) o orientati al byte, in cui viene mantenuta la suddivisione in caratteri del messaggio da trasmettere, e BOP (Bit Oriented Protocol) o orientati al bit, in cui i messaggi sono visti come una successione di bit (in questo modo non si è legati alla codifica ASCII a 8 bit).
Un'operazione importante nella trasmissione sincrona è il framing, cioè la suddivisione in frame delle informazioni da trasmettere.

### Framing

Il termine framing fa riferimento alle seguenti operazioni:
* Incapsulamento dei dati con una intestazione (header) e una eventuale coda (tail).
* Interpretazione dei bit presenti nelle intestazioni (ed eventualmente nelle code).
Al fine di fornire servizi al livello di rete, il livello data link deve usufruire dei servizi fornitigli dal livello fisico. L'approccio consueto del livello data link è quello di dividere il flusso dei bit in pacchetti (adattati appunto ad una trasmissione su una rete a pacchetto), e calcolarne la Checksum.
Vari metodi vengono utilizzati per la suddivisione dei bit in pacchetti o frame:
* Conteggio dei caratteri.
* Caratteri di inizio e fine.
* Indicatori (flag) di inizio e fine.
Il metodo del conteggio di caratteri (ottenuto specificando nel campo d'intestazione del pacchetto il numero di caratteri del frame) è raramente utilizzabile poiché, se il campo che contiene il numero di caratteri si rovina (altera) durante la trasmissione, non si può più individuare dove comincia il frame successivo; vengono quindi utilizzate le altre tecniche.
Nella trasmissione orientata al byte (il frame mantiene la suddivisione in byte) il frame viene preceduto dalla sequenza di caratteri ASCII DLE STX (Data Link Escape Start of TeXt) e finisce con la sequenza DLE ETX (Data Link Escape End of TeXt). Se un frame si rovina e la destinazione perde la sincronizzazione basta trovare il successivo DLE STX o DLE ETX. Il carattere DLE però può comparire casualmente dentro al frame quando vengono trasmessi dati binari come programmi oggetto o numeri in virgola mobile; perché questi caratteri non interferiscano viene aggiunto un ulteriore DLE (che viene rimosso a destinazione prima di passare al frame al livello di rete) in modo che solo i DLE singoli vengano interpretati come delimitatori; questa tecnica si chiama character stuffing.
Nella trasmissione orientata al bit (il frame può contenere un numero qualsiasi di byte) ogni frame inizia e finisce con la sequenza 01111110 chiamata flag: questa sequenza può comparire casualmente nei dati, perciò in trasmissione dopo cinque 1 consecutivi viene sempre inserito uno 0 nel flusso di bit, indipendentemente dal fatto che il bit successivo sia 1 o 0, mentre in ricezione bisogna provvedere ad eliminare i bit inseriti, rimuovendo sempre uno 0 dopo cinque 1; questa tecnica è chiamata bit stuffing.

### Controllo di errore

Come detto, la stazione mittente del livello data-link riceve i dati dal livello superiore e li suddivide in frame prima di affidarli al livello fisico per la trasmissione su canale, aggiungendo ad esso un codice per il controllo degli errori (integrità dati) di trasmissione in ricezione (checksum).
Quando un pacchetto arriva a destinazione, la checksum viene ricalcolata dallo stesso livello data-link del sistema ricevente. Se il risultato è diverso da quello contenuto nel pacchetto, il livello data-link riconosce che è stato commesso un errore e prende adeguati provvedimenti (come ad esempio scartare il pacchetto e spedire un messaggio di errore in risposta al mittente).
In generale si hanno due tipi di codici di controllo, i codici rilevatori che permettono soltanto di capire che il frame non è corretto ed eventualmente richiedere la ritrasmissione del pacchetto (ARQ Automatic Repeat-reQuest) e i codici correttori che permettono non solo di capire se si è verificato un errore, ma anche di individuare la posizione dell'errore e di conseguenza correggerlo (FEC Forward Error Correction). Questi ultimi codici richiedono molti più bit dei codici rilevatori e quindi sprecano ampiezza di banda; di solito perciò vengono usati i codici a sola rilevazione.
In caso di errore, se il servizio è inaffidabile il frame può essere semplicemente scartato; se la linea deve essere affidabile bisogna che tutti i frame arrivino correttamente; se si usa un codice rilevatore il ricevente deve richiedere la ritrasmissione dei frame errati.
La scelta tra codici rilevatori e correttori può dipendere anche dalla velocità delle linee (per linee a bassa velocità, aspettare la ritrasmissione potrebbe richiedere troppo tempo) o affidabilità (se il tasso di errore sulla linea è molto basso non vale la pena sprecare molta banda per un codice correttore) o dal tipo di servizio richiesto (real-time o meno).
Il modo consueto per assicurare una consegna affidabile è quello di fornire al mittente un riscontro di quello che sta accadendo all'altro capo della linea. Tipicamente il protocollo richiede che il ricevente rispedisca alcuni speciali pacchetti di controllo con valore positivo o negativo a seconda dei pacchetti ricevuti. Se il mittente riceve un riscontro positivo su di un pacchetto spedito, sa che esso è arrivato correttamente. Se invece ottiene un riscontro negativo significa che qualcosa è andata male e che occorre ritrasmettere il pacchetto.
Una complicazione aggiuntiva potrebbe derivare dalla possibilità che i problemi hardware causino la sparizione totale del pacchetto. Se un pacchetto non arriva a destinazione, il mittente non aspetterà all'infinito, infatti viene utilizzato un timer, che viene avviato quando i dati vengono trasmessi, se il timer supera la soglia limite (programmata) senza ricevere l'ACK (Acknowledgment o conferma), rimanderà di nuovo i pacchetti. Tuttavia, se il pacchetto o il messaggio di riscontro vengono persi, il timer scade (time-out), e la stazione mittente, non ricevendo conferma, è costretta a reinviare i dati, ma a questo punto il mittente potrebbe ricevere due o più volte lo stesso pacchetto. Per risolvere questo problema, i pacchetti inviati vengono numerati, così il sistema ricevente, nel caso in cui riceva un numero di pacchetto uguale al precedente, cioè una copia del pacchetto, lo scarta. Questa tecnica è nota come Stop and wait; le altre tecniche maggiormente utilizzate per il controllo degli errori sono il Codice di Hamming e il CRC (Controllo a Ridondanza Ciclica). Di fatto però funzionalità di controllo dell'errore sui singoli pacchetti vengono espletate non solo a livello datalink, ma in ogni altro strato del protocollo per garantire la correttezza dei dati di servizio (header) dei protocolli destinati ai rispettivi strati.

### Controllo di flusso

Un altro importante problema di progettazione che si ritrova nel livello di data link è quello di gestire una linea condivisa quando più nodi vogliono inviare messaggi nello stesso tempo e inoltre deve decidere cosa fare di un mittente che sistematicamente tende a trasmettere pacchetti più velocemente di quanto il ricevente possa accettarli. Questa situazione può facilmente essere riscontrata quando il mittente è dislocato su una macchina veloce e il ricevente su una macchina lenta. Il mittente continua a spedire pacchetti ad alta velocità, fino a quando il ricevente non è completamente sopraffatto. Anche se la trasmissione è esente da errori, a un certo punto il ricevente non sarà in grado di gestire i pacchetti in arrivo e inizierà a perderli (buffer overflow).
La tipica soluzione è quella di introdurre un controllo di flusso per obbligare il mittente a rispettare la velocità del ricevente nello spedire i pacchetti. Questa imposizione solitamente richiede un certo tipo di meccanismo di riscontro (feedback) in modo che il mittente possa essere avvisato se il ricevente è in grado di ricevere o meno.
Nel caso in cui invece più nodi vogliono inviare contemporaneamente dei messaggi, si tende ad introdurre un controllo centralizzato, creando un singolo nodo di controllo, responsabile di determinare chi ottiene la priorità all'interno della rete; il nodo successivo quindi, controllerà quando la rete non sarà più occupata, così da poter inviare il messaggio appena questa diventerà libera. Può accadere però, che più nodi monitorizzano la rete e che appena questa sia libera, inviano immediatamente i messaggi, in questo caso si avranno dei problemi di collisione; per ovviare a questo problema, i nodi che monitorano la rete saranno regolati da un protocollo di accesso multiplo attendendo ad esempio un tempo casuale prima di inviare i messaggi, poiché è improbabile che i nodi scelgano lo stesso istante per inviare i dati.

## Funzionalita sottolivello MAC

In telecomunicazioni, nell'ambito delle reti di calcolatori, il MAC (acronimo di Medium Access Control o Media Access Control) è un sottolivello del modello architetturale standardizzato ISO/OSI, definito nello standard IEEE 802, che contiene funzionalità di controllo dell'accesso al mezzo fisico per canali broadcast, funzionalità di framing e controllo di errore.
Fa parte del livello datalink, di cui rappresenta il sottolivello inferiore sovrastato dal sottolivello LLC e limitato inferiormente dal livello fisico. Le varie caratteristiche di questo strato vengono descritte dalla terza parte dello standard in poi. È il livello a cui trova sede l'indirizzo MAC o indirizzo fisico del calcolatore. Questo strato ha principalmente due funzioni, quella di incapsulamento dati e quella dell'accesso al mezzo.
La prima funzione si occupa dell'incapsulamento dei frame prima della loro trasmissione e del decapsulamento alla loro ricezione; inoltre si occupa della rivelazione degli errori di trasmissione e di delimitare il frame per favorire la sincronizzazione tra il trasmettitore e il ricevitore. La seconda funzione controlla l'accesso ai media, comunicando direttamente con in livello fisico.