100 likes | 233 Views
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.
E N D
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
Go-Back-N (2) Frame N+1 corrotto
Go-Back-N (3) ACK N e N+1 corrotti 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.
FINE 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.