Un collegamento è detto ideale se tutto ciò che viene trasmesso arriva nello stesso ordine e viene correttamente interpretato a destinazione.
In un protocollo di ritrasmissione ciascuna trama ricevuta viene riscontrata da un messaggio di ACK
o NACK
. La mancanza di ACK
o la presenza di NACK
comportano la necessità di ritrasmettere il messaggio, e la procedura è ripetuta fino a quando la trama ricevuta non è corretta.
Queste procedure sono attivate a qualunque livello, è presente a livello trasporto per il recupero end-to-end.
I protocolli di ritrasmissione hanno come obiettivo l'integrità del messaggio, l'ordine della sequenza di pacchetti e evitare la duplicazione, usando i messaggi ACK
e NACK
e meccanismi come il timeout e la finestra di trasmissione
Questo protocollo utilizza soltanto gli ACK
e un contatore di timeout. Ogni messaggio ricevuto correttamente è riscontrato con un ACK
.
Il trasmettitore trasmette un pacchetto e inizializza un contatore di timeout, in base all'evento successivo decide cosa fare:
ACK
trasmette il pacchetto successivoIl protocollo ha funzionamento corretto se
Ogni pacchetto e ACK
viene numerato per evitare errori dati dalla trasmissione multipla di pacchetti. I pacchetti sono numerati con SN
, mentre gli ACK
sono numerati con AN
.
Quando il trasmettitore riceve un ACK
deve poterlo assegnare al pacchetto corretto.
L'efficienza del protocollo, cioè la frazione di tempo in cui il canale è usato per trasmettere informazione utile in assenza di errori, si calcola con la formula:
È spesso utilizzato in modalità half-duplex.
È una variante di Stop & Wait, dove si possono trasmettere fino a
Se il riscontro del primo pacchetto arriva prima della fine della finestra, la finestra viene fatta scorrere di una posizione.
Quando si verifica un errore si ricomincia a trasmettere la finestra dal primo pacchetto non riscontrato.
Il timeout funziona come nello Stop & Wait: raggiunto l'ultimo pacchetto della finestra, la trasmissione si blocca in attesa di un nuovo ACK
o della scadenza del timeout.
Questo sistema può causare la ritrasmissione di pacchetti corretti ma semplifica il funzionamento dato che permette al ricevitore di ignorare ricezioni fuori sequenza, in quanto per i pacchetti ignorati non è trasmesso alcun ACK
.
In caso il timeout non scada e i pacchetti non siano fuori sequenza un ACK
può essere collettivo.
La finestra ottima coincide con il Round Trip Time:
La finestra può essere dimensionata in tempo, in byte e in molti altri modi, tuttavia il dimensionamento si complica se i tempi di attraversamento della rete (
Per rimediare possiamo:
NACK
Gli ACK
possono essere inseriti negli header dei pacchetti che viaggiano in direzione opposta (Piggy-backing). Per farlo introduciamo i campi SN
e AN
, dove SN
è il numero di sequenza del pacchetto trasmesso e AN
è un riscontro cumulativo dei pacchetti fino a SN
Le regole del protocollo Go-back-N in modalità full duplex (canale di trasmissione doppio bidirezionale) per il trasmettitore, definendo
SN
pari a AN
ricevuto si pone AN
.L'intervallo della finestra di trasmissione è :
Analogamente, per il ricevitore, definendo AN
come stato dei riscontri corrente:
SN
AN
, questo viene inoltrato ai livelli superiori e si incrementa AN
di uno.AN
viene trasmesso al mittente utilizzando i pacchetti in direzione opposta.Per evitare errori è necessario inizializzare SN
e AN
e deve esistere un momento
Il buffer di ricezione è limitato a W
posizioni, e il ritmo di assorbimento dell'utente può essere arbitrario. L'obiettivo è regolare il ritmo di invio per evitare che i pacchetti vadano persi perché all'arrivo trovano il buffer pieno.
Per gestire il controllo di flusso si può utilizzare un meccanismo a finestra mobile, come il Go-Back-N. In questo schema, la sorgente non può inviare più di W
trame senza aver ricevuto il riscontro. I riscontri vengono inviati dal ricevitore solo quando i pacchetti vengono letti dal livello superiore e rimossi dal buffer.
Un problema significativo è quello delle ritrasmissioni. Se il ricevitore ritarda molto l'invio dei riscontri a causa della lentezza del livello superiore, il trasmettitore inizia la ritrasmissione perché scade il timeout. Questo dimostra come il controllo di flusso a finestra mobile e il controllo d'errore a finestra mobile siano fortemente legati. Tuttavia, aumentare il timeout non è una soluzione efficace, in quanto aumenterebbe i ritardi in caso di errore.
Una soluzione radicale per questo problema consiste nel separare i meccanismi di controllo d'errore e di controllo di flusso a finestra. Si può inserire nei riscontri, o nell'header dei pacchetti in direzione opposta, un campo finestra W
, oltre a quello del Go-Back-N. In questo modo, il ricevitore invia i riscontri sulla base dell'arrivo dei pacchetti e utilizza il campo W per indicare lo spazio rimanente nel buffer.
La gestione della finestra del controllo di flusso può essere ulteriormente ottimizzata. Non è necessario che il ricevitore dichiari esattamente lo spazio rimanente R
; può mantenere un margine di sicurezza (ad esempio, W
sia ricevuto. Inoltre, il ricevitore può aspettare che il buffer si svuoti per una frazione significativa (ad esempio, dichiarando W
in base alla situazione del buffer.
Questi accorgimenti permettono una gestione più efficiente del controllo di flusso e riducono la probabilità di perdita di pacchetti, migliorando la robustezza e l'affidabilità della comunicazione.