Trasporto affidabile (principi)
• Di fondamentale importanza negli strati applicativi, di
trasporto e di collegamento!
• Le caratteristiche del canale determinano la
complessità del protocollo di trasporto affidabile –
reliable data transfer (rdt)
Trasferimento affidabile (generalità)
rdt_send(): chiamata da
deliver_data(): invocata
“sopra”, (es. app.). Dati da inviare
da rdt per consegnare i dati
Mittente
(sender)
udt_send(): chiamata da
rdt per trasferire i dati sul
canale non affidabile
Ricevente
(receiver)
rdt_rcv(): chiamata quando un
pacchetto arriva al lato ricezione
del canale
Generalità (2)
Sviluppo incrementale dei lati mittente e
ricevente del protocollo affidabile (rdt)
• Flusso unidirezionale dei dati (per
semplicità)
– Flusso di controllo in entrambe le direzioni!
• Macchina a stati finiti (FSM) per modellare
mittente e ricevente Evento che causa una transizione
Azioni corrispondenti
Stato: se in questo
“stato”, lo stato
successivo è
determinato solo da
evento
Stato
1
Evento
Azioni
Stato
2
Rdt1.0: canale affidabile
• ASSUNZIONE: Canale affidabile
– Nessun errore sui bit trasmessi
– Nessuna perdita di pacchetti
• FSM distinte per mittente e ricevente:
– Mittente invia dati nel canale
– Ricevente legge dati dal canale
Rdt2.0: canale con errori sui bit
(no perdita pacchetti)
• Il canale non affidabile può “invertire” bit
– Si ricordi: checksum UDP serve a individuare errori sui
bit
• Domanda: come reagire agli errori (scoperti):
– Acknowledgement (ACK): il ricevente comunica
esplicitamente che pacchetto OK
– Negative acknowledgement (NAK): il ricevente comunica
esplicitamente che pacchetto ha avuto errori
– Il mittente ritrasmette un pacchetto se riceve NAK
• Nuovi meccanismi in rdt2.0 (oltre rdt1.0):
– Individuazione di errori
– Riscontro del ricevente: messaggi di controllo
(ACK,NAK) ricevente->mittente (ARQ)
rdt2.0: specifica della FSM
FSM mittente
FSM ricevente
rdt2.0 in azione (no errori)
sender FSM
receiver FSM
rdt2.0 in azione (errori)
sender FSM
receiver FSM
rdt2.0 ha un difetto (flaw) fatale!
Cosa succede se
ACK/NAK corrotti?
• Il mittente non sa cosa è
successo al ricevente!
Cosa fare?
• Mittente riscontra ACK/NAK
del ricevente. Cosa succede
se questi ACK/NAK persi?
• La ritrasmissione potrebbe
causare il reinvio di un
pacchetto correttamente
consegnato!
Gestione duplicati:
• Il mittente aggiunge numero di
sequenza (sequence number)
a ciascun pacchetto
• Mittente ritrasmette pacchetto
se ACK/NAK con errori
• Il ricevente distrugge (non
consegna) pacchetti duplicati
stop and wait
Il mittente invia un
pacchetto e aspetta la
risposta
rdt2.1:(mittente): gestione errori negli ACK/NAK
rdt2.1 (ricevente): gestione errori negli ACK/NAK
rdt2.1: osservazioni
Mittente:
• # seq per ogni pacchetto
• Due # seq. (0,1 – 1 bit)
sono sufficienti. Perché?
• Controllo: ACK/NAK
ricevuto è corrotto?
• Numero doppio di stati
– Lo stato deve
“memorizzare” se il
pacchetto “corrente” ha #
seq. 0 o 1
Ricevente:
• Necessità di verificare se
un pacchetto ricevuto è
duplicato
– Lo stato indica se il # seq.
atteso sia 0 o 1
– Ritrasmissione: stesso
numero di sequenza in due
pacchetti successivi
– Altrimenti numero di
sequenza diverso
– Nota: il ricevente non sa se
l’ultimo ACK/NAK spedito
sia stato ricevuto senza
errori dal mittente
rdt2.2: protocollo privo di NAK
(NAK-free)
• Stesse funzionalità di rdt2.1,
ma solo ACK
• Invece di un NAK, il ricevente
invia ACK per l’ultimo
pacchetto ricevuto
correttamente
• Il ricevente deve
esplicitamente includere
nell’ACK # seq del pacchetto
confermato
• ACK duplicato al mittente ha
lo stesso significato di un
NAK: ritrasmetti il pacchetto
corrente
FSM
mittente
!
rdt3.0: canale con errori e perdita
Nuova assunzione: il canale Approccio: il mittente attende per
un intervallo “ragionevole”
può perdere pacchetti
l’arrivo di un ACK
(dati o ACK)
– checksum, # seq., ACK,
ritrasmissioni non bastano
•
•
D: come trattare la perdita?
– Il mittente aspetta fino ad
essere certo che il
pacchetto sia andato
perso, poi ritrasmette
– Svantaggi?
•
Ritrasmette se un ACK non è
ricevuto entro l’intervallo
Se il pacchetto (o ACK) solo
ritardato (non perso):
– La ritrasmissione sarà un
duplicato, ma l’uso di # seq
gestisce ciò
– Il ricevente deve indicare il #
seq del pacchetto riscontrato
È necessario un timer
rdt3.0 mittente
Nota: le ritrasmissioni
avvengono alla
frequenza del timer
rdt3.0 in azione
rdt3.0 in azione (cont.)
Prestazioni di rdt3.0
• rdt3.0 funziona, ma le prestazioni non sono buone
• Esempio: link da 1 Gbps, ritardo prop. end-to-end 15 ms,
pacchetto da 1KB:
T
trasm
Fatt. Uso = U =
=
8Kb/pkt
= 8 microsec
10^9 b/sec
% di tempo mitt.
occupato (busy)
8 microsec
=
= 0.00015
30.016 msec
– Pacchetto da 1KB ogni 30 msec -> throughput
33kB/sec su link da 1 Gbps!!!!
– Il protocollo limita l’ uso delle risorse fisiche!
Protocolli con pipeline (pipelined)
Pipelining: il mittente invia più pacchetti, senza
attendere l’acknowledgement dei pacchetti
precedenti
• L’intervallo dei numeri di sequenza va aumentato
– Buffering dei pacchetti al mittente e/o ricevente
• Sliding window: Go-Back-N, Selective Repeat
Go-Back-N
Mittente:
• Numero di sequenza a k-bit nell’ header del pacchetto
• “Finestra” (window) di (max.) N, pacchetti consecutivi non confermati
• ACK(n): conferma tutti i pacchetti, fino a (e incluso) quello con
numero di sequenza n - “ACK cumulativo”
• Timer unico per il blocco di pacchetti non confermati (“in-flight”)
• timeout(n): ritrasmetti il pacchetto n e tutti quelli con numero di
sequenza più alto nella finestra
GBN: FSM estesa (mittente)
Nota: timer associato alla variabile base
GBN: FSM estesa (ricevente)
Ricevente semplice:
• Solo ACK: si invia sempre l’ACK per il pacchetto con numero di
sequenza più alto (mod N) tra quelli correttamente ricevuti
• Si possono avere ACK duplicati
– È sufficiente memorizzare expectedseqnum al lato ricevente
• Pacchetti non in ordine (out-of-order):
– Getta (discard), nessun buffering al lato ricezione!
– ACK per il pacchetto con numero di sequenza più alto tra quelli
ricevuti in ordine
GBN in
azione
Selective Repeat
• Il ricevente conferma singolarmente tutti i pacchetti
correttamente ricevuti
– Memorizza i pacchetti ricevuti per l’invio in ordine verso gli
strati superiori
• Il mittente ritrasmette solamente i pacchetti per cui
non ha ricevuto acknowledgement
– Il mittente ha un timer per ogni pacchetto non confermato
• Finestra del mittente
– N numeri di sequenza consecutivi
– Come con Go-Back-N si limita il numero di pacchetti
trasmessi e non confermati
Selective repeat: finestre sender,
receiver
Selective repeat (cont.)
Mittente
Dati dall’alto :
Ricevente
n in [rcvbase, rcvbase+N-1]
• Se prossimo # seq. disponibile
cade nella finestra invia
pacchetto
• invia ACK(n)
• out-of-order: memorizza
(buffer)
• in-order: consegna tutti I
pacchetti in ordine, avanza
rcvbase fino al prossimo
pacchetto previsto
timeout(n):
• Rimanda pacchetto n, riavvia
timer pacchetto n
ACK(n) in [sendbase,sendbase+N]:
• Marca (mark) pacchetto n
come ricevuto
• Se n = sendbase, avanza
(slide) la base della finestra
fino al più piccolo pacchetto
non confermato
• n in [rcvbase-N,rcvbase-1]:
ACK(n)
Altrimenti:
• Ignora
Selective repeat in azione
Selective repeat:
dilemma
Esempio:
• # seq.: 0, 1, 2, 3
• Dim. Finestra (window
size)=3
• Il ricevente non nota
differenze tra i due casi!
• Erroneamente
considera il
pacchettoduplicato
come nuovo (a)
Q: che relazione tra
intervallo # seq. e
dimensione finestra?
TCP: generalità RFCs: 793, 1122, 1323,
2018, 2581
• Punto-punto:
• Full duplex:
– Flusso dati bi-direzionale
sulla stessa connessione
– MSS: Maximum Segment
Size
– Un sender, un receiver
• Affidabile, stream di byte
in ordine (in order):
– no “message boundaries”
• Connection-oriented:
– handshaking (scambio di
msg di controllo) inizializza
gli stati di mitt. e ricev. prima
dello scambio dei dati
• Pipelining:
– Dim. finestra dipende dal
controllo di flusso e
congestione di TCP
• Buffer invio & ricezione
socket
door
application
writes data
application
reads data
TCP
send buffer
TCP
receive buffer
segment
• Controllo di flusso (flow
control):
socket
door
– Il mittente non “inonda”
(flood) il ricevente
Struttura dei segmenti TCP
URG: dati urgnti
(di solito non usato)
ACK: # ACK
valido
PSH: push data now
(di solito non usato)
RST, SYN, FIN:
Controllo conness.
(comandi di inst.,
abbattimento)
Internet
checksum
(come in UDP)
32 bit
source port #
dest port #
sequence number
acknowledgement number
head not
UA P R S F
len used
checksum
rcvr window size
ptr urgent data
Opzioni (lunghezza variabile)
Dati
(lunghezza variabile)
Si contano i byte
di dati (non i
segmenti!)
# byte
rcvr disposto
ad accettare
# seq. e ACK in TCP
Numeri di sequenza:
– Numero del primo byte
presente nel segmento
ACK:
– # seq del prossimo
byte atteso dal lato
remoto
– ACK cumulativi
– D.: come il ricevente
tratta segmenti fuori
ordine
– R.: TCP non specifica,
dipende
dall’implementazione
Host A
L’utente
digita
‘C’
Host B
host dà
ACK di
ricezione,
trasmette
‘C’
host dà
ACK di
ricezione
Semplice scenario telnet
Tempo
TCP: trasferimento affidabile
evento: dati da
applicazione
Crea, invia segmento
wait
Attesa
for
evento
event
Versione semplificata del
sender, assumendo:
evento: timeout per il
segmento con # seq y
Ritrasmetti il segmento
evento: ricevuto ACK,
con # ACK y
Processamento ACK
•Trasferimento unidirezionale
•Nessun controllo di flusso e
congestione
TCP – generazione degli ACK [RFC
1122, RFC 2581]
Evento
Azione del ricevente
Arrivo segmento in ordine,
nessun buco, tutti i segmenti
precedeni confermati
ACK ritardato. Attendi il prossimo
segmento per al più 500ms.
Se non arriva invia ACK
Arrivo segmento in ordine,
nessun buco, un ACK ritardato
in attesa
Manda subito un ACK cumulativo
Arrivo segmento fuori ordine,
# seq maggiore di quello atteso,
individuato buco
Manda ACK duplicato, con numero
sequenza del prossimo byte atteso
Arrivo segmento che riempie un
buco parzialmente o totalmente
ACK immediato se il segmento
inizia all’estremità inferiore del
buco
TCP: possibili casi di
ritrasmissione
Host A
Host B
X
loss
Tempo Scenario 1: ACK perso
Host B
Seq=100 timeout
Seq=92 timeout
timeout
Host A
Tempo
Scenario2: timeout
prematuro, ACK cumulativi
TCP: Controllo del flusso
Controllo di flusso
Mitt. non riempie i
buffer del ricevente
inviando troppi dati
troppo velocemente
RcvBuffer = dim. del buffer di ricezione TCP
RcvWindow = spazio disponibile (spare) nel Buffer
Buffering in ricezione
Ricevente: informa
esplicitamente il mitt.
circa lo spazio ancora
disponibile nei buffer
– Campo RcvWindow
nel segmento TCP
Mittente: mantiene la
quantità di dati trasmessi
e non ancora confermati
(unACKed), al di sotto
del valore RcvWindow
più recente
TCP: Round Trip Time e Timeout
D: come stabilire il
valore di timeout?
• Almeno RTT
– nota: RTT può
variare
• Troppo breve:
timeout prematuro
– Ritrasmissioni
superflue
• Troppo lungo:
reazione lenta a
perdita di segmenti
D: come stimare il RTT?
• SampleRTT: tempo misurato tra
invio di un segmento e arrivo
dell’ACK corrispondente
– Si ignorano le ritrasmissioni e i
segmenti confermati da ACK
cumulativi
– SampleRTT varia rapidamente,
si vuole una stima più
“costante”
– Si usa l’ insieme delle stime più
recenti e non solo l’ultimo
valore di SampleRTT
(EstimatedRTT)
Generalità sul Controllo della
Congestione
Congestione:
• Informalmente: “troppe sorgenti mandano dati troppo
velocemente perché la rete possa smaltirle”
• Controllo di congestione diverso dal controllo di flusso!
• Sintomi:
– Pacchetti persi (overflow nei buffer dei router)
– Lunghi ritardi (accodamento nei buffer dei router)
• Un problema di primaria importanza!
Cause/costi della congestione:
scenario 1
• Due mittenti,
due riceventi
• Un router, buffer
infiniti
• Nessuna
ritrasmissione
• Grandi ritardi se
congestione
• Throughput
(ritmo di trasm.)
massimo
ottenibile
Cause/costi della congestione:
scenario 2
• Un router, buffer finiti
• Il mittente ritrasmette i pacchetti
persi
Cause/costi della congestione:
scenario 2
= l (goodput)
out
in
• Ritrasmissione “perfetta” solo in caso di perdita:
• Senza perdita:
l
l > lout
in
• La ritrasmissione dei pacchetti ritardati (non persi) rende
grande di
lout
nel caso perfetto
“Costi” della congestione:
• Più lavoro (ritrasmissioni) per un determinato rate effettivo
• Ritrasmissioni superflue: il link trasporta copie multiple del
pacchetto
l
più
in
Cause/costi congestione: scenario 3
• Quattro mittenti
D: che succede se il
• Cammini con più hop (salti)
traffico offerto da B
• Timeout/ritrasmissione
cresce a dismisura?
Cause/costi congestione: scenario 3
(cont.)
Un altro “costo” della congestione:
• Quando un pacchetto è scartato, tutta la
banda usata per consegnarlo è stata sprecata
Controllo della congestione in
TCP
• Controllo end-to-end
• Ritmo di trasmissione limitato da una finestra di
congestione, Congwin, sul numero di segmenti:
Congwin
• w segmenti, ciascuno con MSS byte inviati in
un RTT:
w * MSS
throughput =
RTT
Byte/sec
Controllo della congestione in
TCP (2)
• “Stima” della banda
disponibile:
– Idealmente: trasmissione
al massimo ritmo possibile
(Congwin max. possibile)
senza perdita
– Aumenta Congwin fino
alla perdita (congestione)
– Perdita: decrementa
Congwin, poi inizia
nuovamente la stima
(aumento)
• Due “fasi”
– Slow start (avvio lento)
– congestion avoidance
(evitare la congestione)
•
Variabili importanti:
– Congwin
– threshold: definisce la
soglia di passaggio da una
fase di slow start a quella
di controllo di congestione
successiva
TCP: Slow start
Host A
Iniz.: Congwin = 1
for (each segment ACKed)
Congwin=Congwin++
until (loss event OR
CongWin > threshold)
• Aumento esponenziale
della dim. finestra (per
RTT)
• Perdita: timeout (Tahoe
TCP) e/o tre ACK
duplicati (Reno TCP)
RTT
Algoritmo Slowstart
Host B
Tempo
TCP: controllo della
congestione
Controllo congestione
/* slowstart is over
*/
/* Congwin > threshold */
Until (loss event) {
every w segments ACKed:
Congwin++
}
threshold = Congwin/2
Congwin = 1
1
perform slowstart
1: TCP Reno non fa slowstart dopo
Ricezione di tre ACK duplicati
perché TCP è equo?
Due sessioni contemporanee:
• Aumento additivo dà pendenza 1, quando il throughput cresce
• Decremento moltiplicativo diminuisce il throughput in modo
proporzionale
R
Suddivisione equa della banda
Perdita: decr. Finestra di un fattore 2
Controllo congestione: incremento additivo
Perdita: decr. Finestra di un fattore 2
Controllo congestione: incremento additivo
Throughput connessione 1 R
Scarica

Principi di TCP