Il problema del framing — trovare i confini nel flusso di bit
Il livello fisico riceve dal livello Data Link un frame e lo trasmette sul mezzo fisico come una sequenza continua di bit. Al ricevitore arrivano esattamente quei bit — ma il livello fisico non conosce dove inizia un frame e dove finisce il successivo. È il livello Data Link del ricevitore che deve ricostruire i confini.
Questo è il problema del framing: identificare in modo affidabile l’inizio e la fine di ogni frame in un flusso continuo di bit, anche in presenza di disturbi che possono corrompere alcuni bit o causare la perdita di sincronizzazione.
Esistono diverse tecniche per risolvere questo problema. Le due più diffuse nella pratica sono il character stuffing (orientato al byte) e il bit stuffing (orientato al bit). Le analizziamo in dettaglio.
Tecnica 1 — Character Stuffing
Il character stuffing è una tecnica usata nelle trasmissioni orientate al byte: il flusso di bit è già diviso in byte e il frame mantiene questa struttura. La tecnica utilizza caratteri ASCII speciali come delimitatori per segnalare l’inizio e la fine di ogni frame.
I delimitatori: DLE STX e DLE ETX
Sono due sequenze di due byte ciascuna che il ricevitore impara a riconoscere:
STX = Start of TeXt (0x02)
Insieme segnalano l’inizio del campo dati
ETX = End of TeXt (0x03)
Insieme segnalano la fine del campo dati
Se durante la trasmissione il frame si corrompe e il ricevitore perde la sincronizzazione, basta attendere il prossimo DLE STX o DLE ETX per ritrovare i confini. La risincronizzazione avviene automaticamente al frame successivo.
Il problema: DLE può comparire nei dati
La sequenza DLE ha il valore ASCII 0x10 — un byte come tanti altri. Può comparire casualmente all’interno del campo dati del frame, non come delimitatore ma come parte del contenuto informativo. Se il ricevitore trovasse un DLE nei dati lo interpreterebbe erroneamente come inizio di un delimitatore, perdendo la sincronizzazione.
↑ Il DLE all’interno dei dati verrebbe scambiato per un delimitatore!
La soluzione: character stuffing
La soluzione è inserire un ulteriore DLE immediatamente prima di ogni DLE che compare all’interno del campo dati. In questo modo:
- Un DLE singolo viene interpretato come parte di un delimitatore
- Una coppia DLE DLE viene interpretata come un singolo DLE appartenente ai dati
Questo meccanismo di “escape” si chiama appunto character stuffing — letteralmente “imbottitura con caratteri”.
Tecnica 2 — Bit Stuffing
Il bit stuffing è una tecnica più moderna, usata nelle trasmissioni orientate al bit: opera direttamente sul flusso di bit senza preoccuparsi della struttura a byte. È la tecnica usata in protocolli come HDLC (High-level Data Link Control) e PPP (Point-to-Point Protocol).
Il flag di delimitazione: 01111110
Il bit stuffing usa una sequenza speciale di 8 bit chiamata flag per delimitare ogni frame:
Il problema: 01111110 può comparire nei dati
Come nel character stuffing, il problema è che la sequenza 01111110 (sei 1 consecutivi tra due 0) potrebbe comparire casualmente all’interno dei dati del frame, venendo erroneamente interpretata come delimitatore.
La soluzione: inserire uno 0 dopo cinque 1 consecutivi
La regola del bit stuffing è semplice e asimmetrica:
Dopo ogni sequenza di cinque 1 consecutivi nei dati, viene inserito automaticamente uno 0, indipendentemente dal valore del bit successivo.
Dopo ogni sequenza di cinque 1 consecutivi, viene rimosso automaticamente lo 0 che segue. Questo de-stuffing ripristina i dati originali.
Il flag è 0|111111|0 — contiene sei 1 consecutivi tra due 0. Se nei dati compaiono cinque 1 e poi un altro 1, la sequenza diventerebbe sei 1 e potrebbe confondersi con il flag. Inserendo uno 0 dopo cinque 1, ci si assicura che nei dati non possa mai comparire una sequenza di sei 1 consecutivi — che è la parte caratteristica del flag.
Esempio passo per passo
Gestione del flag: come il ricevitore distingue dati da delimitatore
Grazie al bit stuffing, nei dati trasmessi non può mai comparire una sequenza di sei 1 consecutivi. Quindi il ricevitore può applicare la seguente logica:
Confronto tra le due tecniche
Il character stuffing lega il protocollo alla codifica ASCII — non funziona correttamente se i dati usano una codifica diversa (Unicode, binary, ecc.). Il bit stuffing opera a livello di bit puri, è indipendente da qualsiasi codifica del contenuto e introduce un overhead minore. Per questi motivi è diventato lo standard nei protocolli di rete moderni come HDLC e PPP.
- Il framing risolve il problema di identificare dove inizia e finisce ogni frame in un flusso continuo di bit trasmesso dal livello fisico.
- Character stuffing (orientato al byte): usa DLE STX come inizio e DLE ETX come fine. Quando il byte DLE (0x10) compare nei dati, viene raddoppiato in DLE DLE. Il ricevitore interpreta DLE singolo come parte del delimitatore, DLE DLE come un singolo DLE dei dati.
- Bit stuffing (orientato al bit): usa il flag 01111110 (sei 1 tra due 0) come delimitatore. In trasmissione, dopo ogni cinque 1 consecutivi nei dati viene inserito uno 0. In ricezione, lo 0 dopo cinque 1 viene rimosso. Questo garantisce che il flag non possa mai comparire all’interno dei dati.
- Il bit stuffing è lo standard moderno: usato in HDLC, PPP, Frame Relay. Il character stuffing è considerato obsoleto perché dipende dalla codifica ASCII e introduce overhead variabile.