Framing: delimitare le trame nel flusso di bit

// obiettivi di apprendimento
Spiegare il problema del framing: perché il ricevitore deve sapere dove inizia e finisce ogni frame in un flusso continuo di bit
Descrivere la tecnica del character stuffing: delimitatori DLE STX / DLE ETX, il problema del carattere DLE nei dati e come viene risolto
Descrivere la tecnica del bit stuffing: il flag 01111110, la regola di inserimento dello zero in trasmissione e di rimozione in ricezione, con esempio passo per passo
Confrontare le due tecniche indicando vantaggi, svantaggi e contesti di utilizzo
📄
Slides
Framing — tecniche di delimitazione dei frame nel flusso di bit

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.

// il problema in pratica
Flusso di bit ricevuto (senza framing):
01001000 01100101 11010010 01001000 01100101 11010010 01001000…
→ Il ricevitore non sa dove inizia un frame e dove finisce il successivo. Senza un meccanismo di delimitazione, i dati sono illeggibili.

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:

INIZIO FRAME
DLE STX
DLE = Data Link Escape (0x10)
STX = Start of TeXt (0x02)
Insieme segnalano l’inizio del campo dati
FINE FRAME
DLE ETX
DLE = Data Link Escape (0x10)
ETX = End of TeXt (0x03)
Insieme segnalano la fine del campo dati
// struttura del frame con character stuffing
DLE STX dati del frame DLE ETX
// vantaggio della ridondanza del delimitatore

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 problema
Frame da trasmettere: DLE STX | A B DLE C D | DLE ETX
↑ 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”.

Character Stuffing — esempio completo
// dati originali da trasmettere (contengono un DLE)
AB DLE CD
// trasmittente: aggiunge delimitatori e stuffing DLE
DLE STX AB DLE DLE CD DLE ETX
↑ Il DLE nei dati è diventato DLE DLE (coppia di escape)
// ricevitore: rimuove i delimitatori e de-stuffa le coppie DLE DLE
AB DLE CD
✓ Dati ripristinati correttamente — il DLE è tornato singolo

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:

01111110
Flag di inizio e fine frame — la stessa sequenza per entrambi
// struttura del frame con bit stuffing
01111110 bit del frame (dopo stuffing) 01111110

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:

📤 IN TRASMISSIONE

Dopo ogni sequenza di cinque 1 consecutivi nei dati, viene inserito automaticamente uno 0, indipendentemente dal valore del bit successivo.

📥 IN RICEZIONE

Dopo ogni sequenza di cinque 1 consecutivi, viene rimosso automaticamente lo 0 che segue. Questo de-stuffing ripristina i dati originali.

// perché cinque 1 e non sei?

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

Bit Stuffing — esempio numerico completo
// dati originali da trasmettere
0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1
↑ Due sequenze da cinque 1 consecutivi evidenziate in rosso
// dopo bit stuffing (trasmittente inserisce 0 dopo ogni cinque 1)
0 1 1 1 1 1 1 10 1 0 1 1 1 1 1 1 10 0 1
↑ Bit inseriti per stuffing evidenziati in arancione
// frame completo trasmesso (flag + dati stuffed + flag)
0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 10 0 1 1 1 1 1 1 1 10 0 1 0 1 1 1 1 1 1 0
// ricevitore: de-stuffing — rimuove lo 0 dopo ogni cinque 1
0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1
✓ Dati originali ripristinati perfettamente

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:

cinque 1 → poi 0
Bit di stuffing — va rimosso. Appartiene ai dati originali. La sequenza continua normalmente.
sei 1 → poi 0
Flag completo 01111110 — delimita l’inizio o la fine di un frame.
sette o più 1
Errore o abort del frame — il frame viene scartato e si attende il prossimo flag.

Confronto tra le due tecniche

CaratteristicaCharacter StuffingBit Stuffing
OrientamentoAl byte (8 bit)Al bit (indipendente dal byte)
DelimitatoriDLE STX / DLE ETX01111110 (flag)
Overhead medioVariabile — dipende da quanti DLE compaiono nei datiBasso — max 1 bit ogni 5 bit di dati a 1
Protocolli che la usanoBISYNC (IBM), protocolli legacyHDLC, PPP, Frame Relay
Dipendenza da ASCIISì — lega il protocollo alla codifica ASCIINo — trasparente alla codifica del contenuto
Adottato oggiQuasi obsoletoStandard de facto nelle reti moderne
// perché il bit stuffing ha vinto

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.

📌 Riepilogo — Punti chiave
  • 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.

Lascia un commento