stop-and-wait

Lo stop-and-wait è un meccanismo orientato alla connessione, che implementa controllo del flusso e controllo degli errori.

  • mittente e destinatario usano una finestra di scorrimento di dimensione 1
  • il mittente invia un pacchetto alla volta e ne attende l’ACK prima di spedire il successivo
  • quando il pacchetto arriva al destinatario, viene calcolato il checksum
    • se il pacchetto è corrotto, viene scartato senza informare il mittente
  • per capire se un pacchetto è andato perso, il mittente usa un timer (in quanto non può aspettare all’infinito di ricevere un ACK)
    • se il timer scade e non ha ricevuto un ACK, il pacchetto viene rinviato
    • il mittente deve quindi tenere una copia del pacchetto spedito fino a quando non riceve il riscontro

Il controllo degli errori viene implementato quindi tramite il numero di sequenza e l’utilizzo di ACK e timer. Il controllo del flusso è intrinseco, in quanto non si spedisce più di un pacchetto alla volta.

numeri di sequenza e riscontro

Per gestire pacchetti duplicati, stop-and-wait utilizza i numeri di sequenza e .

  • Il numero di riscontro (ACK) indica quindi, in aritmetica modulo 2, il numero di sequenza del prossimo pacchetto atteso dal destinatario.
  • (se il destinatario ha ricevuto correttamente il pacchetto , invia un ACK con valore )

situazioni possibili

Supponiamo che il mittente abbia inviato il pacchetto con numero di sequenza . Si possono verificare 3 casi:

  1. Il pacchetto arriva correttamente al destinatario, che invia un riscontro ⟶ il riscontro arriva al mittente, che invia il pacchetto successivo numerato
  2. Il pacchetto risulta corrotto o non arriva al destinatario ⟶ il mittente, allo scadere del timer, invia nuovamente il pacchetto
  3. Il pacchetto arriva correttamente al destinatario, ma il riscontro viene perso o corrotto ⟶ scade il timer e il mittente rispedisce .

rappresentazione tramite FSM

mittente:

center

  • una volta inviato un pacchetto, il mittente si blocca e aspetta finché non riceve un ACK

destinatario:

center

  • il destinatario è sempre nello stato ready

diagramma di comunicazione:

center

Lo stop-and-wait è inefficiente quando il prodotto (ovvero il numero di bit che il mittente può inviare prima di ricevere un ack) è elevato

esempio

  • rate =
  • ritardo di andata e ritorno di 1 bit =
  • pacchetti di dimensione

Il mittente potrebbe quindi inviare nel tempo necessario per andare dal mittente al ricevente, ma ne invia solo (un solo pacchetto)

Il coefficiente di utilizzo del canale è

protocolli con pipeline

Con il pipelining, il mittente ammette più pacchetti in transito, ancora da notificare.

  • l’intervallo dei numeri di sequenza deve essere incrementato
  • i pacchetti devono essere memorizzati in un buffer presso mittente e/o ricevente

Ci sono due forme generiche di protocolli con pipeline: go-back-N e ripetizione selettiva.

go-back-N

  • I numeri di sequenza sono calcolati modulo con dimensione del campo “numero di sequenza” in bit.
  • L’ACK indica il numero di sequenza del prossimo pacchetto atteso
  • L’ACK è cumulativo: se si invia un ack, vuol dire che tutti i pacchetti fino al numero di sequenza indicato nell’ACK sono stati ricevuti correttamente
    • (esempio: ack# = 7 significa che i pacchetti fino al 6 sono stati ricevuti correttamente, e il destinatario attende il 7)

finestre di invio e ricezione

La finestra di invio definisce una porzione immaginaria di dimensione massima con tre variabili:

  • rappresenta il primo pacchetto non riscontrato (primo = più vecchio)
  • rappresenta il prossimo pacchetto da inviare
  • rappresenta la dimensione della finestra di invio

center

La finestra di invio può scorrere di una o più posizioni quando viene ricevuto un riscontro privo di errori con (in aritmetica modulo ).

  • (ovvero si riceve un ACK per un pacchetto con un numero minore di quelli ancora da inviare, e maggiore del primo inviato e non riscontrato (ovvero parte di quelli in sospeso))

esempio di scorrimento

center

dimensione della finestra di invio

La dimensione della finestra di invio deve essere perché:

Consideriamo . I numeri di sequenza dei pacchetti sono .

Se il mittente ha una finestra di dimensione , allora:

  • può inviare al massimo 3 pacchetti prima di ricevere un ACK (es. ).
  • non potrà mai inviare un pacchetto “nuovo” con lo stesso numero di sequenza di un pacchetto vecchio che è ancora in attesa di ACK, quindi il destinatario saprà sempre distinguere se un pacchetto è nuovo o una copia

Invece, con una finestra di dimensione :

  • il mittente può inviare i pacchetti e poi ritrasmettere . Ma il destinatario, che riceve , non può sapere se sia il vecchio pacchetto mai arrivato o un nuovo pacchetto .

center


La finestra di ricezione ha dimensione 1, perché il destinatario è sempre in attesa di uno specifico pacchetto. Qualsiasi pacchetto arrivato fuori sequenza viene scartato.

center

La finestra può scorrere di una sola posizione:

timer e rispedizione

Il mittente mantiene un timer per il più vecchio pacchetto non riscontrato. Allo scadere del timer si ha il “go bACK N”, ovvero tutti i pacchetti in attesa di riscontro vengono rispediti (poiché la finestra di ricezione ha dimensione 1, il destinatario non può bufferizzare i pacchetti fuori sequenza)

schemi

FSM mittente

center

FSM destinatario

center

ripetizione selettiva

Il problema principale di go-back-n è che, se si perde un solo pacchetto, è necessario ritrasmettere tutti i successivi già inviati. Nella ripetizione selettiva, il mittente ritrasmette soltanto i pacchetti per cui non ha ricevuto un ACK.

  • il mittente mantiene un timer per ogni pacchetto non riscontrato

Il ricevente invia riscontri specifici per tutti i pacchetti ricevuti correttamente (in ordine o anche fuori sequenza) e, se necessario, mantiene un buffer dei pacchetti per eventuali consegne in sequenza al livello superiore.

schema generale

center

invio e ricezione

Le finestre di invio e di ricezione hanno la stessa dimensione.

center

  • la finestra di invio può muoversi solo quando c’è una sequenza in ordine di pacchetti confermati (quindi, in questo esempio, aspetta almeno e )
  • c’è un timer per ogni pacchetto in attesa di riscontro - quando scade, si rinvia solo quel pacchetto

center

  • l’ACK non è cumulativo ma individuale: indica il numero di sequenza di un pacchetto ricevuto correttamente (e non il prossimo atteso: non avrebbe senso per questo modello)

FSM mittente

center

FSM destinatario

center

dimensione delle finestre

Per questo meccanismo, la dimensione delle finestre non può essere , ma deve essere .

esempio esplicativo

Infatti, se si usasse una finestra con dimensione , potrebbe accadere una situazione come questa:

  • il mittente spedisce i pacchetti , che vengono ricevuti correttamente (quindi la finestra di accettazione scorre)
  • gli ACK vengono però persi, quindi il mittente pensa di doverli rispedire
  • il mittente rispedisce quindi il pacchetto , che viene erroneamente accettato come il primo della sequenza successiva

center

Invece, con una finestra di dimensione , anche se la finestra scorresse, il pacchetto verrebbe correttamente scartato:

center

go-back-n vs selective-repeat

Se il prodotto banda-ritardo della rete è grande, l’affidabilità è buona e il ritardo è basso, conviene utilzzare il protocollo go-back-n, che permette di usare più della capacità della rete.

Se invece il prodotto banda-ritardo è piccolo, la rete non è molto affidabile, o introduce lunghi ritardi, conviene usare il selective-repeat.

protocolli bidirezionali: piggybacking

In realtà, i pacchetti non viaggiano in maniera unidirezionale, ma in entrambe le direzioni. Per migliorare l’efficienza dei protocolli bidirezionali, viene usata la tecnica del piggybacking: quando un pacchetto trasporta dati da a , può trasportare anche i riscontri relativi ai pacchetti ricevuti da e viceversa.

riassunto dei meccanismi

MeccanismoUso
checksumper gestire errori nel canale
acknowledgementper gestire errori nel canale
timeoutACK con errori, perdita pacchetti
finestra scorrevole, pipeliningmaggior utilizzo della rete