Complementi sul controllo
d’errore (parte III)
Selective Repeat (richiesta esplicita)
• Come nello schema Idle RQ, per velocizzare
la ritrasmissione di un pacchetto difettoso, il
mittente M può inviare al ricevente R il
pacchetto NAK di not-acknowledgment.
• Alternativamente, dopo un NAK, R può
smettere di inviare ACK.
Selective Repeat [richiesta esplicita]
Frame N+1 corrotto
Usando
l’explicit
request,
ACK(N) notifica
la ricezione di
tutti i frame
fino ad N
compreso!
ACK(N+4)
X
Dopo l’invio di
un NAK, R
smette di
inviare ACK.
Altrimenti un
NAK corrotto
porterebbe
alla perdita
del pacchetto!
Go-Back-N
(1)
Il metodo Selective Repeat è molto costoso in termini di
buffer al ricevente. Viene utilizzato soprattutto:
• quando l’ordine di ricezione dei pacchetti non è
importante (per esempio, quando i pacchetti sono molto
piccoli);
• quando i pacchetti vengono riassemblati direttamente dal
ricevente, prima di essere inviati al livello superiore (bit
rate elevati, pacchetti piccoli).
Nei casi in cui i pacchetti possono essere più grandi, viene
preferito lo schema Go-Back-N.
Go-Back-N è lo schema usato per TCP/IP
Frame N+1 corrotto
Go-Back-N
(2)
ACK N e N+1 corrotti
Go-Back-N
(3)
ACK(N)
notifica la
ricezione
di tutti i
frame fino
ad N
compreso!
Go-Back-N lato mittente
[V(S) = 0]
[RL] = retransmission list;
start:
switch(evento) {
case ‘arriva pacchetto dal livello superiore’ :
assegnagli il numero V(S); V(S)++; mettilo in [RL];
trasmettilo; Timer pacchetto V(S) start;
case ‘ACK[N]’ :
if(corretto)
Elimina pacchetti <= N da [RL], Stop Timers;
else
Trascura ACK;
case ‘NAK[N]’ :
case ‘scade timer pacchetto’ :
for(i=1; i<=numero pacchetti in [RL], i++)
trasmetti pacchetto i in [RL]; Timer pacchetto start;
}
goto start;
Go-Back-N lato destinatario
[V(R) = 0]
stato = "normale"
start:
switch(evento) {
case ‘pacchetto[N]’ :
if(corretto)
if(N == V(R))
stato = "normale"; timer NAK stop;
manda ACK[V(R)];
passa pacchetto al livello superiore, V(R)++;
else if( (N > V(R)) && (stato == "normale") )
invia NAK[V(R)]; Timer NAK start; stato = "nak";
else
manda ACK[V(R)], elimina pacchetto;
else
elimina pacchetto;
case ‘scade timer nak’ :
invia NAK[V(R)]; Timer NAK start;
}
goto start;
Commenti
• Con lo schema Go-Back-N, al ricevente è richiesta
una finestra di ricezione di solo 1 frame.
• Il mittente invece deve avere una retransmission
list abbastanza grande da contenere tutti i
pacchetti in attesa di un ACK dal secondario.
• La lista deve quindi contenere almeno (Tix+2Tp)/Tix
pacchetti.
Piggybacking
Nei tre schemi ARQ considerati abbiamo sempre
supposto che la comunicazione fosse half-duplex.
• In genere, le connessioni sono full-duplex e ciascuno
dei due host si comporta sia da mittente che da
ricevente.
• In ciascuna delle due direzioni fluiscono quindi sia
pacchetti che ACK e NAK.
Per ridurre il flusso di pacchetti si utilizza una tecnica
detta piggyback (portare sulla schiena).
Tutti i pacchetti contengono un codice I(N) che indica il loro
ordine nella sequenza di spedizione e un codice di ACK o NAK
N(R) che indica l’ ordine per la direzione opposta.
FINE
Scarica

parte 3