Una volta definito il mezzo fisico di trasmissione di una rete e la modalità con cui avviene la trasmissione su quel mezzo, si passa ad un secondo ordine di problemi, consistente nella ricerca di una trasmissione/ricezione affidabile ed efficiente tra le macchine connesse fisicamente da quel mezzo. Questo problema è gestito nel secondo livello dello schema OSI, il livello di Collegamento dei Dati o Data Link.
Le funzioni principali che sono raggruppate in questo ambito riguardano i seguenti aspetti:
Un funzionamento tipico che coinvolge questo livello è, ad esempio, la procedura eseguita da un router per lo smistamento di un pacchetto:
L'approccio usuale del livello due è, in generale, il seguente:
Un problema decisivo è dunque rappresentato dalla delimitazione dei frame. Le tecniche utilizzate per risolvere questo problema sono tutte legate ai caratteri o bit utilizzati (tecniche di natura temporale sarebbero molto rischiose):
Nella fase di codifica o durante la trasmissione dei dati si possono generare errori nei segnali, che quindi in fase di ricezione vengono interpretati in maniera non corretta. Questi errori sono generalmente dovuti a rumori di fondo, disturbi improvvisi (fulmini) e interferenze. Per riconoscere e correggere problemi di questo genere si possono implementare tecniche apposite, che consistono nell'utilizzazione di codici particolari. In generale esistono due tipologie di codici:
per la correzione degli errori, aggiungono informazioni aggiuntive e le utilizzano per ricostruire il messaggio originario; in pratica, riescono a capire esattamente quali informazioni sono state perdute
per il riconoscimento degli errori, aggiungono poca informazione ridondante, solo quella necessaria per comprendere che c'è stato un errore, senza essere in grado di correggerlo; in pratica, non riescono a capire il punto esatto in cui si è verificato l'errore.
Nella realtà uno stesso codice è in grado di correggere e/o riconoscere gli errori a seconda del numero di errori di cui viene inficiata l'informazione durante la trasmissione, fino ad arrivare alla situazione in cui gli errori sono tanti (ma la probabilità che accada è molto bassa) ed il codice non è in grado di comprendere nulla o addirittura correggere in modo sbagliato (ved. esempio).
Esempio.
Supponiamo di avere il codice binario formato dalle parole (o word)
P={0000, 1111} ed una probabilità di errore uguale per entrambi i simboli binari
0 e 1. Allora:
a) se nella trasmissione si verifica un errore singolo, ovvero viene modificato
il valore di un solo bit, il codice è in grado di correggere l'errore
attraverso il seguente meccanismo
0001, 0010, 0100, 1000 sono corretti in 0000
1110, 1101, 1011, 0111 sono corretti in 1111
b) se si verificano due errori (probabilità molto più bassa del caso singolo),
il codice è in grado solo di riconoscere che ci sono degli errori
0011, 0101, 0110, 1001, 1010, 1100 ---> 0000 oppure 1111 ? ---> nessuna
correzione
c) se si verificano tre errori (probabilità bassissima), il codice è in grado
di riconoscere la presenza dell'errore ed inoltre corregge in modo sbagliato,
come si può evincere dal meccanismo illustrato nel caso a)
d) se si verificano quattro errori, il codice non è in grado di riconoscere
alcun errore.
Assieme alle tecniche per comprendere la composizione dei frame e la presenza di errori, una fattore decisivo è dato dalla corretta gestione della sequenza di trasmissione e del flusso di dati dal mittente al destinatario.
In primo luogo introduciamo il concetto di acknowledgement che è un messaggio inviato dal destinatario al mittente (che a questo scopo invertono i ruoli) per informarlo sull'arrivo del frame: si parla di ack positivo se il frame è arrivato correttamente, di ack negativo se invece il frame è errato.
In secondo luogo è importante controllare la velocità con cui i dati sono inviati per evitare che il mittente spedisca i dati ad una velocità troppo alta perché il destinatario sia in grado di gestirla. Questo problema viene genericamente indicato con il termine controllo di flusso.
In
molti casi gli schemi di rilevazione degli errori implementano anche le
richieste da inviare al trasmettitore per chiedere l'invio delle informazioni
mancanti o per confermare il corretto arrivo a destinazione (nel caso di servizi
con conferma). I meccanismi che
vengono in genere combinati sono i seguenti:
- riconoscimento d'errore (error detection), per controllare le informazioni
ricevute;
- acknowledgement positivo (positive ack), consistente in un messaggio di conferma al trasmettitore:
"le
informazioni sono corrette!"
- acknowledgement negativo (negative ack) e ri-trasmissione, che consiste in un messaggio di mancato riconoscimento
dell'informazione al trasmettitore: "le informazioni sono sbagliate! (Invia di
nuovo!)"
- ri-trasmissione a tempo, se il trasmettitore non riceve conferma
dell'informazione entro un certo lasso di tempo (timeout) ripete la trasmissione
automaticamente.
L'insieme di questi metodi è detto ARQ (Automatic Repeat Request).
![]() |
![]() |
![]() |
| Normale funzionamento. | Perdita o
danneggiamento di un frame. |
Perdita o
danneggiamento di un ack. |
Per superare i problemi connessi alle procedure ARQ si usano i protocolli a finestra scorrevole (o sliding window). Prima dell'inizio della comunicazione viene assegnata al trasmettitore ed al ricevitore la dimensione della finestra, che supponiamo è di s pacchetti. Il trasmettitore confezione gli s frame e li invia al ricevitore senza attendere alcun messaggio di acknowledgement, quindi resta in attesa del messaggio di conferma da parte del ricevitore. Il messaggio di conferma del ricevitore contiene il numero di sequenza del successivo frame; ricevuto questo messaggio il trasmettitore invia i successivi s frame. Con questa tecnica il tempo necessario per trasmettere s frame è 2T, dove T è il tempo per inviare un frame in una sola direzione; se non si utilizzasse questa tecnica, invece, il tempo necessario per trasmettere gli s frame sarebbe 2sT (c'è un ritardo fra le trasmissioni dei singoli pacchetti ma, in un calcolo complessivo teorico, questo ritardo è trascurabile).
In alcune implementazioni la dimensione della finestra è fissa, in altre è variabile. Alcuni aspetti sono comuni a tutti gli algoritmi:
In questi protocolli il livello Data Link non ha più libertà nell'ordine di trasmissione, fermo restando il fatto che i pacchetti sono riconsegnati al livello di Rete nell'ordine giusto e i frame arrivano a destinazione nell'ordine con cui sono stati spediti.

I protocolli ad oggi più diffusi sono i seguenti:
Nelle reti broadcast uno dei problemi principali è l'accesso al mezzo trasmissivo che le unità condividono. I protocolli che si occupano della gestione dell'accesso appartengono in un sottolivello del livello Data Link detto sottolivello MAC (Medium Access Control). Di questo aspetto abbiamo già parlato.