Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Betti
Reti di calcolatori
Lezione 8
Lez. 8 — 1 M. Cesati / E. Betti
Il modello di riferimento
5 Application
4 Transport
3 Network
2 Data Link
1 Fisico
Lez. 8 — 2 M. Cesati / E. Betti
Nei livelli Network, Data Link e Fisico esistono tre distinte entità indipendenti
(hardware o software) che comunicano tra loro scambiandosi messaggi tramite le
opportune interfacce
1. L’entità Fisico riceve una sequenza di bit dal canale di comunicazione e la passa
all’entità Data Link
3. L’entità Data Link calcola il checksum del frame e lo controlla con il checksum
nell’opportuno campo nella testata o nella coda del frame
Oltre alla costruzione dei frame ed alla rilevazione/correzione degli errori, il livello
Data Link può gestire
• il flusso dei frame (per evitare che il calcolatore ricevente sia sovraccaricato)
• la sequenza di trasmissione dei frame (soprattutto per evitare che frame duplicati
siano passati al livello Network ricevente)
• affidabile: controllo che i frame arrivino tutti, senza errori e senza duplicazioni
• non affidabile: controllo che i frame arrivati non contengano errori (quelli con
errori vengono semplicemente scartati; questo di solito è “gratis” perché imple-
mentato in hardware)
Si assume che il livello Data Link non ha mai necessità di spezzare un pacchetto del
livello Network in più frame
In pratica, i protocolli affidabili del livello Data Link sono anche connection-oriented
e garantiscono che i pacchetti raggiungono il livello Network della macchina destina-
zione nello stesso ordine in cui sono stati trasmessi dal livello Network al livello Data
Link della macchina sorgente
Lez. 8 — 6 M. Cesati / E. Betti
Acknowledgement
Soluzione: il trasmittente stabilisce, per ciascun frame dati, un termine utile entro il
quale deve arrivare il relativo ack. Se l’ack non arriva in questo periodo di tempo, il
frame dati viene ritrasmesso
Lez. 8 — 8 M. Cesati / E. Betti
Problema: un frame di ack scompare del tutto; il trasmittente, dopo aver aspettato in-
vano la conferma, invia un secondo frame di dati identico al precedente; il destinatario
riceve un frame dati duplicato
Una strategia per il controllo del flusso consiste nell’attesa di una autorizzazione
esplicita del destinatario all’invio di nuovi frame
Questa comunicazione può essere inserita all’interno di un frame ack che conferma
la corretta ricezione di un frame dati precedente
Lez. 8 — 10 M. Cesati / E. Betti
Protocolli unidirezionali
Prendiamo in considerazione alcuni schemi di protocolli del livello Data Link per il
controllo di trasmissione e flusso:
• Protocollo utopia
• Protocollo PAR
Lez. 8 — 12 M. Cesati / E. Betti
Protocollo utopia
while (true) {
receive_network(packet);
frame = build_frame(packet);
send_physical(frame);
}
Viene utilizzato il campo info del frame, non vengono utilizzati i campi di controllo
kind, ack, seq e chk
Lez. 8 — 14 M. Cesati / E. Betti
while (true) {
wait_data_physical(buffer);
frame = extract_frame(buffer);
packet = extract_packet(frame);
send_network(packet);
}
Notare che il canale di comunicazione deve essere wire-like: due bit spediti uno dopo
l’altro devono essere ricevuti nello stesso ordine
Lez. 8 — 15 M. Cesati / E. Betti
o equivalentemente:
Per risolvere il problema della congestione del ricevente si può introdurre un ritardo
fissato tra l’invio di un frame ed il successivo
Questo approccio è conveniente solo in casi molto particolari (ad esempio, reti di
comunicazioni sincrone con ricevente ben dimensionato)
In generale è da scartare:
• se il progettista della rete imposta il ritardo di trasmissione dei frame sul caso
peggiore, la rete di comunicazione è sotto-utilizzata
Lez. 8 — 17 M. Cesati / E. Betti
Si assume che:
• i dati sono spediti in una sola direzione (ma i frame devono poter viaggiare in
entrambe le direzioni!)
while (true) {
receive_network(packet);
frame = build_frame(packet);
send_physical(frame);
wait_data_physical(buffer);
}
Lez. 8 — 19 M. Cesati / E. Betti
while (true) {
wait_data_physical(buffer);
frame = extract_frame(buffer);
packet = extract_packet(frame);
send_network(packet);
frame = build_frameack();
send_physical(frame);
}
Lez. 8 — 20 M. Cesati / E. Betti
• se non arriva il relativo frame ack entro la scadenza del timer, il trasmittente invia
nuovamente il frame
• il ricevente invia un frame ack solo quando riceve un frame senza errori
Lez. 8 — 21 M. Cesati / E. Betti
Protocollo PAR
Il metodo più semplice per distinguere i frame dati consiste nel memorizzare nel
campo seq della testata del frame un numero di sequenza, incrementato automati-
camente dal livello Data Link trasmittente per ciascun diverso frame dati
Quando il destinatario riceve un frame dati con lo stesso numero di sequenza del
frame ricevuto in precedenza, riconosce un frame duplicato e lo scarta
Lez. 8 — 23 M. Cesati / E. Betti
Nel caso di protocolli di tipo PAR, un frame dati è inviato solo dopo la ricezione del
frame ack relativo al frame dati inviato prima
Se dunque il livello Data Link ha ricevuto un certo frame con numero di sequenza m,
il prossimo frame dati che riceverà potrà solo essere:
Sono sufficienti due soli numeri di sequenza, quindi seq può essere costituito da un
singolo bit
Lez. 8 — 24 M. Cesati / E. Betti
seq = 0; receive_network(packet);
while (true) {
frame = build_frame(packet,seq);
send_physical(frame);
timed_wait_data_physical(buffer);
if (frame_arrival) {
frame = extract_frame(buffer);
if (checksum(frame) && frame.ack == seq) {
receive_network(packet);
seq = 1 - seq;
}
}
}
Lez. 8 — 25 M. Cesati / E. Betti
seq = 0;
while (true) {
wait_data_physical(buffer);
frame = extract_frame(buffer);
if (checksum(frame)) {
if (frame.seq == seq) {
packet = extract_packet(frame);
send_network(packet);
seq = 1 - seq;
}
frame = build_frameack(1 - seq);
send_physical(frame);
}
}
Lez. 8 — 26 M. Cesati / E. Betti
Mittente Destinatario
1
x→
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack(1) 1
h
( ( ( ((((
((( (
(((((
((( ((((
(
(((((
0
→
hhhh
hhhh
hhhh
hhhh x+1
hh hhh
hhh
hhhh
← ack(0) 0
h
(((
((( (((
(((
(( (((
( (((
((((
(((
(
1
x+2 →
hhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
1
h
h
ecc.
Lez. 8 — 27 M. Cesati / E. Betti
Mittente Destinatario
1
x→
hhhh
hhhh
*
hhh
h
Timeout
A
A
A
A
1AA
x→
hhh
hhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack(1) 1
hh
h
(( (((
( (((((
((((
((((
(((
(((
(((
(
0
→
hhhh
hhhh
hhhh
hhhh x+1
hh hhhh
hhhh
0
hh
h
ecc.
Lez. 8 — 28 M. Cesati / E. Betti
Mittente Destinatario
1
x→
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack(1) 1
h
((((
Timeout
A
((((
((( ( ( ( (
(
A
(( ((((
((((
*
A
A
1AA
x→
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
ecc.
Lez. 8 — 29 M. Cesati / E. Betti
• se il valore del timer è troppo lungo, il protocollo è inefficiente perché ogni frame
ack perso provoca lunghi “stalli”
• se il valore del timer è troppo corto, il mittente può ri-trasmettere un frame dati
mentre il frame ack atteso sta per essere correttamente ricevuto
Perciò il campo ack del frame ack contiene il numero di sequenza del frame dati a
cui l’acknowledgement si riferisce
Lez. 8 — 30 M. Cesati / E. Betti
1
x→
hhhh
hhhh
hhhh
hhhh
hhhh
Timeout hhhh
hhhh
← ack() 1
A h
((((
A ( (
1 ( (
AA (((
((((
x→
hhhh (
hhhh
( ( ((((
(h
( h h
((((( hhhh
hhhh
0 hhhh
hhhh
x+1 →
hhhh
1 (non passato a liv. Network)
hhhh hh
(
((((
← ack()
hhh ( ( (
hhh (((
h (h
(h
( ((h hhh
*
( ( ( hh
( ( (
( ( (((
((
1
x+2 →
hhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack()
h
h
((((
(((
(( ( ( ( (
1 (non passato a liv. Network)
(((
((((
((((
((((
(
0
x+3 →
hhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
0
h
(h
(
((( ((((
ecc.
Lez. 8 — 31 M. Cesati / E. Betti
Mittente Destinatario
1
x→
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack() 1
h
((((
Timeout
A
((((
((( ( ( ( (
(
A
(( ((((
((((
*
A
A
1AA
x→
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
1 (non passato al liv. Network)
h
Timeout
A
A
A
A
1AA
x→
hhhh
hhhh
hhhh
hhh
hhhh
hhhh
hhhh
1 (non passato al liv. Network)
h
h
Timeout
A
AA
ecc.
Lez. 8 — 32 M. Cesati / E. Betti
1
x→
hhhh
hhhh
hhhh
hhhh
hhhh
Timeout hhhh
hhhh
← ack(1) 1
A h
((((
A ( (
1 ( (
AA (((
((((
x→
hhhh (
hhhh
( ( ((((
(h
( h h
((((
( hhhh
hhhh
0 hhhh
hhhh
x+1 →
hhhh
1 (non passato a liv. Network)
h hh
(
h h hhhh ((((
← ack(1) hhh ( ( (
h (h
(h(((
((h
Timeout
( hhh
*
( ( ( hh
( ( (
A ( ( (((
A (
(
0
x+1 →
AA
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
hhhh
← ack(0)
h
(
((( ( ( ( ( ( ( (((
0
( ( ((((
(
((((
((((
(
1
→
hhhh
hhhh
hhhh
hhhh x+2
hh hhhh
hhhh
1
hh
h
( ( ( (((
(((
ecc.