Il livello Data-Link e i suoi protocolli Modulo 5 (Integrazione) Livello Data-Link Abbiamo visto che il Livello Data link provvede a: o offrire servizi al livello network con un'interfaccia ben definita; o organizzare i dati in blocchi di lunghezza predefinita chiamati frame (framing) o gestire gli errori di trasmissione (effettuare i primi controlli sulla validità tramite CRC (Cyclic Redundancy Check)); o regolare il flusso della trasmissione fra sorgente e destinatario (evitare che siano inviati dati ad una velocità incompatibile alla capacità di acquisizione del destinatario, evitare che in una trasmissione bidirezionale i due nodi trasmettano contemporaneamente). E che il Data link layer è suddiviso in due sottostrati: LLC (Logical Link Control), il quale si occupa del controllo errori e lavora con il livello di Rete MAC (Media Access Control) che fornisce l'accesso al mezzo trasmissivo (il cavo) e lavora quindi a stretto contatto con il livello Fisico. Dunque, una cosa di cui si occupa è come delimitare un singolo frame. Framing Per delimitare i frame si devono usare degli appositi marcatori per designarne l'inizio e la fine del frame. Ci sono vari metodi: conteggio dei caratteri; caratteri di inizio e fine, con character stuffing; bit pattern di inizio e fine, con bit stuffing; Conteggio dei caratteri Si utilizza un campo nell'header, per indicare quanti caratteri ci sono del frame Figura 1: Il metodo del conteggio quando lo strato di collegamento dati del destinatario vede tale numero, sa quanti caratteri seguono e quindi può determinare la fine del frame. Il problema con questo algoritmo è che se durante la trasmissione si rovina il campo dell header che contiene il conteggio, diventa praticamente impossibile ritrovare l'inizio del prossimo frame e di conseguenza anche quello dei successivi. A causa della sua scarsa affidabilità questo metodo è usato assai raramente. 1
Caratteri di inizio e fine Ogni frame inizia e finisce con una particolare sequenza di caratteri ASCII. Una scelta diffusa è la seguente: inizio frame: o DLE (Data Link Escape), STX (Start of TeXt) fine frame: o DLE, ETX (End of TeXt) In questo modo, se la destinazione perde traccia dei confini di un frame la riacquista all'arrivo della prossima coppia DLE, STX e DLE, ETX. Esiste però un problema: nella trasmissione di dati binari, il byte corrispondente alla codifica di DLE può apparire dentro il frame, imbrogliando le cose. Per evitare questa evenienza, il livello due sorgente aggiunge nei dati, davanti a tale byte, un altro DLE, per cui in arrivo solo i singoli DLE segnano i confini dei frame. Naturalmente, il livello due di destinazione rimuove i DLE aggiunti dentro ai dati prima di consegnarli al livello tre. Questa tecnica si chiama character stuffing. Bit pattern di inizio e fine Un altra tecnica analoga e più recente è quella in cui ogni frame inizia e finisce con una specifica sequenza di bit (bit pattern), ad es.: 01111110 chiamata flag byte. Ovviamente esiste un problema analogo al caso precedente: tale sequenza di bit può infatti apparire all'interno dei dati che devono essere trasmessi. In questo caso: in trasmissione: ogni volta che il livello due incontra nei dati da trasmettere 5 bit consecutivi uguali a 1 inserisce uno zero aggiuntivo; in ricezione: quando nei dati ricevuti compaiono 5 bit uguali a uno, si rimuove lo zero che li segue. Dunque, il flag byte può apparire solo all'inizio ed alla fine dei frame. Questa tecnica va sotto il nome di bit stuffing. Esempio: si supponga che i dati utente siano i seguenti: 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 il livello data link effettuerà il bit stuffing inserendo un bit 0 dopo 5 bit 1 consecutivi: 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 la configurazione trasmessa in linea sarà pari alla precedente con la configurazione di inizio e fine frame: 0 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 Con questa tecnica, il confine tra due frame può essere riscontrato senza ambiguità. 2
Regolazione sequenza di trasmissione e flusso Dopo aver trovato il modo di delineare l'inizio e la fine dei frame e di gestire gli errori di trasmissione, bisogna trovare la maniera di informare opportunamente il mittente se i frame spediti sono anche arrivati, e senza errori, dall'altra parte: servizi connectionless non confermati: non c'è bisogno di alcuna conferma; servizi connectionless confermati: sono arrivati tutti e senza errori? servizi connection oriented confermati: sono arrivati tutti, senza errori e nell'ordine giusto? Per saperlo si introduce il concetto di acknowledgement, che è un messaggio inviato dal destinatario al mittente per informarlo che: il frame è arrivato correttamente (positive ack); il frame è errato (negative ack). Nel seguito, ove necessario per evitare ambiguità, col termine frame dati indicheremo un frame che trasporta informazioni generate nel colloquio fra le stazioni; col termine frame di ack indicheremo un frame il cui solo scopo è trasportare un acknowledgement. Protocolli di trasmissione per il livello Data-Link Fissate le interfacce, elettrica e meccanica, ed il canale di comunicazione, ad esempio la linea privata in cavo, in fibra ottica o la linea telefonica commutata o dedicata, resta da stabilire le modalità di trasferimento dei dati in ordine alla velocità di trasmissione, al numero di bit dei dati, alla presenza di bit di parità, di bit di stop, ai codici di correzione degli errori, alle procedure di inizializzazione, al sincronismo ed a tutta una serie di informazioni che il trasmettitore deve inviare al ricevitore affinché quest'ultimo sappia come sono organizzati i dati ricevuti e da chi li ha ricevuti. La risposta a questi interrogativi viene fornita dai protocolli di trasmissione noti anche come protocolli di secondo livello o protocolli di linea, tenendo conto dei livelli gerarchici previsti dal modello ISO/OSI. I protocolli di trasmissione rappresentano le regole che i terminali di elaborazione devono rispettare affinché la ricezione dei dati avvenga correttamente. Protocolli stop and wait I protocolli stop and wait sono dei tipi di protocolli in cui il mittente attende un OK dal destinatario per essere autorizzato all'invio del prossimo frame. Mittente: 1) attende un pacchetto dal livello network; 2) costruisce un frame dati; 3) passa il frame al livello fisico; 4) attende evento: * arriva frame di ack (vuoto): 5) torna ad 1). 3
Destinatario: 1) attende evento: * arriva frame dati da livello fisico: 2) estrae il pacchetto; 3) consegna il pacchetto al livello network; 4) invia un frame di ack (vuoto) al mittente; 5) torna ad 1). Assumiamo ora che il canale possa fare errori. I frame (dati o di ack) possono essere danneggiati o persi completamente. Se un frame arriva danneggiato, il controllo del checksum se ne accorge e informa il SW di livello data link; se il frame si perde del tutto, ovviamente, la cosa non si rileva. Si è pensato a uno schema seguente: 1. Il mittente spedisce il frame numerato con x e il destinatario risponde con il messaggio di conferma ACK. 2. Se il pacchetto di ACK arriva nel tempo previsto, il trasmittente continua ad inviare i pacchetti numerandoli progressivamente. 3. Nella seconda figura vediamo che, se dopo un certo tempo (Timeout) il mittente non riceve conferma, rinvia il messaggio. I frame sono numerati per individuare il frame o l ACK perduto. In assenza di errori il funzionamento è il seguente: Figura 1: Normale funzionamento Come abbiamo detto si può verificare che: 1. il frame dati si perde o si danneggia; 2. l'ack del frame x si perde completamente. Se ad esempio il mittente non riceve l ACK entro un certo tempo, ritrasmette il frame. Il ricevente potrebbe interpretare il frame ripetuto come un frame successivo, quindi per evitare tale problema viene introdotto un numero di sequenza: il destinatario passerà al livello network solo i frame con il numero di sequenza atteso. 4
I disegni seguenti illustrano varie eventualità che possono verificarsi durante il dialogo secondo il protocollo Stop and Wait. I numeri ai lati delle figure indicano i numeri di sequenza che, rispettivamente: il mittente usa per etichettare il frame dati da trasmettere; il destinatario usa per decidere se il prossimo frame che arriva va passato al livello network o no. Nel caso in cui un frame dati si perda o si danneggi, la situazione è la seguente: Figura 2: Perdita (o danneggiamento) di un frame Nel caso in cui invece si perda o si danneggi un frame di ack, la situazione è la seguente: Protocolli a finestra scorrevole Figura 3: Perdita (o danneggiamento) di un ack Anche se funziona, i protocolli Stop and Wait non sono completamente efficienti poichè sfruttano solo una piccola parte della larghezza di banda disponibile. Infatti il meccanismo rallenta la trasmissione, perché il trasmettitore deve attendere il riscontro (l ack) di ciascun pacchetto prima di inviare il successivo, quindi i pacchetti viaggiano in rete in una sola direzione per volta, e la rete è sottoutilizzata mentre le stazioni attendono le risposte, che possono ritardare. Un sistema molto più efficiente ed ugualmente affidabile, è il meccanismo a finestre scorrevoli, che rende molto più efficiente la trasmissione e quindi l'utilizzo della banda La tecnica delle finestre scorrevoli (Sliding Windows) permette al trasmettitore di poter continuare ad inviare un certo numero N (dimensione della finestra) di pacchetti successivi all ultimo per cui ha ricevuto il 5
riscontro, ovvero permette di trasmettere fino ad altri N pacchetti mentre si è in attesa di ricevere il riscontro di un pacchetto precedentemente inviato. In tal modo la rete viene utilizzata anche nei periodi di attesa. Il funzionamento è il seguente. Il mittente invia una "finestra" di pacchetti, da 1 a n, ma senza aspettare l'ack, inoltre fa partire un timer per ognuno di essi. Il numero n è detto ampiezza della finestra (la finestra contiene sempre n pacchetti). Il ricevente manda un Ack per ogni pacchetto. Il mittente sposta la finestra "in avanti" di un pacchetto per ogni Ack ricevuto nell'ordine. Cioè quando arriva l'ack del segmento 1, la finestra viene spostata in modo da coprire i pacchetti da 2 a n+1 e viene trasmesso il segmento n+1. Quando per un pacchetto P (trasmesso) nella finestra si riceve l ACK (e si è ricevuto anche i suoi precedenti) allora la finestra avanza fino al pacchetto successivo a P, consentendo di trasmettere i pacchetti che sono entrati nella finestra. le finestre continuano a scorrere finché si ricevono ACK permettendo di trasmettere i nuovi pacchetti che entrano nella finestra. Le prestazioni dei protocolli a finestra scorrevole dipendono dalla dimensione della finestra e dalla velocità della rete: se la dimensione della finestra è 1, si ritorna all algoritmo visto nel primo modo di procedere. All aumentare della dimensione della finestra diminuisce il periodo di non utilizzo della rete e con un opportuna scelta della dimensione della finestra è possibile mantenere la rete satura di pacchetti senza congestionarla. Abbiamo detto che per ogni pacchetto trasmesso viene comunque ancora fatto partire un timer, allo scadere del quale, se non è ancora stato ricevuto l ACK, il pacchetto deve essere ritrasmesso. Consideriamo ora qualche caso particolare. 1) Se il pacchetto 3 non arrivasse a destinazione, la finestra non verrebbe spostata oltre il pacchetto 2. Il destinatario manderebbe gli Ack dei pacchetti 4, 5... ma tutti uguali, cioè settati al valore 2, dato che è questo l'ultimo pacchetto valido, ricevuto nell'ordine di consegna. Ad un certo punto il timer per 3 scade e il pacchetto viene ritrasmesso. 6
Mittente Pacchetto 1 Pacchetto 2 Pacchetto 3 Pacchetto 4 Destinatario ACK 1 Pacchetto 5 Pacchetto 6 Ritrasmette pacchetto 3 ACK 6 2) il pacchetto 2 viene ricevuto correttamente, ma è l'ack che viene perso. Semplicemente, il mittente riceverà prima o poi un Ack con valore 3, questo indica che tutti i pacchetti fino al terzo sono arrivati a destinazione, quindi anche il secondo. Dopo l'ack 3 il mittente può spostare la finestra in avanti di 2 passi in una volta. La finestra ora coprirà i pacchetti da 4 a n+3. Nella realtà, per identificare i segmenti si usa un campo, il Sequence number, che si trova nell header del frame e non il numero di pacchetto. Le dimensioni della finestra possono variare fino ad un massimo di 64 Kbytes. Il meccanismo della finestra è molto importante anche perché fornisce al ricevente un mezzo per governare la mole di dati spediti dall'utente sorgente. Infatti, nell'header dei pacchetti esiste un campo specifico, detto "window", tramite il quale il ricevente indica al trasmittente la dimensione in byte della finestra che è disposto attualmente a ricevere (finestra del ricevente). Questo accordo avviene quando il ricevente spedisce un ACK nel quale specifica innanzitutto l'ultima posizione riconosciuta valida e, a partire da questa, il numero di byte che attualmente può accettare. In questi protocolli il livello data link ha più libertà nell'ordine di trasmissione, fermo restando che: i pacchetti devono essere riconsegnati al livello rete nello stesso ordine di partenza; il canale fisico consegna i frame nell'ordine di partenza. I protocolli data link più diffusi oggi sono: HDLC e PPP. 7