3.3.4) Protocolli a finestra scorrevole |
Nei casi precedenti i frame dati viaggiano
in una sola direzione e i frame di ack nella direzione contraria,
quindi esistono dei frame che viaggiano in entrambe le direzioni.
Dunque, volendo stabilire una comunicazione dati bidirezionale
è necessario disporre di due circuiti, il che ovviamente
è uno spreco di risorse. Un'idea migliore è usare
un solo circuito, nel quale far convivere tutte le esigenze.
Supponendo che la comunicazione sia fra A e B, si avrà che:
Però c'è un'idea ancora migliore: se, quando si
deve inviare un ack da B ad A, si aspetta un pò fin che
è pronto un frame dati che B deve inviare ad A, si può
"fare autostop" e mettere dentro tale frame dati anche
le informazioni relative all'ack in questione. Questa tecnica
si chiama piggybacking
(letteralmente, portare a spalle).
Il campo ack serve proprio
a questo scopo, infatti è il campo in cui viene trasportato,
se c'è, un ack.
Questa tecnica consente un notevole risparmio di:
Infatti, con questa tecnica le informazioni di ack non richiedono
la costruzione di un apposito frame (e quindi il tempo necessario
alla creazione ed al riempimento della struttura, al calcolo del
checksum, ecc.) né la sua trasmissione (e quindi l'uso
di banda).
Però c'è un aspetto da non trascurare: per quanto
si può aspettare un frame su cui trasportare un ack che
è pronto e deve essere inviato? Non troppo, perché
se l'ack non arriva in tempo il mittente ritrasmetterà
il frame anche se ciò non è necessario. Dunque si
stabilisce un limite al tempo di attesa di un frame sul quale
trasportare l'ack; trascorso tale tempo si crea un frame apposito
nel quale si mette l'ack.
I protocolli che vedremo ora appartengono alla classe dei protocolli
sliding window (finestra scorrevole), sono full-duplex
(per i dati), sfruttano il piggybacking e sono più robusti
di quelli precedenti.
Differiscono fra loro per efficienza, complessità e capacità
dei buffer. Alcuni aspetti però sono comuni a tutti gli
algoritmi:
In questi protocolli il livello data link ha più libertà nell'ordine di trasmissione, fermo restando che:
Protocollo a finestra scorrevole di un bit
In questo protocollo sia mittente che destinatario usano una finestra
scorrevole di dimensione uno. Di fatto questo è un protocollo
stop-and-wait.
Non c'è differenza di comportamento fra mittente e destinatario,
tutt'e due usano lo stesso codice (questo vale anche per i protocolli
successivi).
Il funzionamento, molto semplice, è il seguente:
Qui sta la principale novità rispetto al protocollo 3:
l'ack è etichettato col numero di sequenza del frame a
cui si riferisce. I valori dell'etichetta possono solo essere
0 e 1, come nel protocollo 3.
Il peggio che può succedere è la ritrasmissione
inutile di qualche frame, ma questo protocollo è sicuro.
Protocolli go-back-n e selective repeat
Se il tempo di andata e ritorno del segnale (round-trip
time) è alto, come ad esempio nel caso dei
canali satellitari nei quali è tipicamente pari a 500 +
500 msec, c'è un enorme inefficienza coi protocolli stop-and-wait,
perché si sta quasi sempre fermi aspettando l'ack.
Per migliorare le cose, si può consentire l'invio di un
certo numero di frame anche senza aver ricevuto l'ack del primo.
Questa tecnica va sotto il nome di pipelining.
Ciò però pone un serio problema, perché se
un frame nel mezzo della sequenza si rovina molti altri frame
vengono spediti prima che il mittente sappia che qualcosa è
andato storto.
Il primo approccio al problema è quello del protocollo go-back-n:
Si noti che il mittente deve mantenere in un apposito buffer tutti
i frame non confermati per poterli eventualmente ritrasmettere.
Se il buffer si riempie, il mittente deve bloccare il livello
network fino a che non si ricrea dello spazio. Inoltre, vi è
spreco di banda se il tasso d'errore è alto e/o il time-out
è lungo.
Il secondo approccio è più efficiente, ed è chiamato selective repeat:
Alcune considerazioni a proposito del protocollo selective repeat:
Infine, si noti che per entrambi i precedenti protocolli:
3.4) Esempi di protocolli data link |
I protocolli data link più diffusi
oggi sono discendenti del protocollo SDLC
(Synchronous Data Link Control),
nato nell'ambito dell'architettura SNA. Nel seguito verranno illustrate
brevemente le caratteristiche di tre diffusi protocolli: HDLC
(standard ISO), SLIP
(architettura TCP/IP) e PPP
(suo successore).
3.4.1) HDLC (High Level Data Link Control) |
E' un protocollo bit oriented, e quindi usa
la tecnica del bit stuffing. Il formato del frame HDLC è
illustrato nella figura seguente.
I campi del frame hanno le seguenti funzioni:
Address | utilizzato nelle linee multipunto, dove identifica i diversi terminali (il protocollo offre funzioni per il dialogo fra un concentratore e diversi terminali) |
Control | contiene numeri di sequenza, ack, ecc. |
Dati | contiene i dati da trasportare |
Checksum | è calcolata con CRC-CCITT |
Le caratteristiche salienti sono le seguenti:
3.4.2) SLIP (Serial Line IP) |
E' nato nel 1984 ed è il più
vecchio protocollo di livello data link dell'Internet Protocol
Suite.
Molto semplice, nacque per collegare via modem macchine Sun ad
Internet. Spedisce sulla linea pacchetti IP terminati col byte
0xC0
. Usa character stuffing.
Ha diverse limitazioni:
3.4.3) PPP (Point to Point Protocol) |
Per migliorare le cose, IETF ha prodotto uno
standard ufficiale, il Point to Point
Protocol (RFC 1661, 1662 e 1663). Esso è
adatto sia a connessioni telefoniche che a linee router-router.
Esso fornisce le seguenti funzionalità:
Il traffico derivante (nelle fasi iniziali e finali della connessione)
dall'uso dei protocolli LCP e NCP viene trasportato dentro i frame
PPP.
Il protocollo è modellato su HDLC, ma con alcune differenze:
Il formato del frame PPP è il seguente.
I campi del frame hanno le seguenti funzioni:
Flag | come in HDLC |
Address | sempre 11111111: di fatto non ci sono indirizzi, in quanto non c'è più l'idea di gestire linee multipunto |
Control | il default (00000011) indica un unnumbered frame, quindi relativo ad un servizio non affidabile |
Protocol | indica il protocollo relativo al pacchetto che si trova nel payload (LCP, NCP, IP, IPX, Appletalk, ecc.) |
Payload | è di lunghezza variabile e negoziabile, il default è 1500 byte |
Checksum | normalmente è di due byte (quattro sono negoziabili) |