Reliable Data Transfer
Reliable Data Transfer
1
Agenda
1 Session Overview
2
What is the class about?
Textbooks:
» Computer Networking: A Top-Down Approach (6th Edition)
James F. Kurose, Keith W. Ross
Addison Wesley
ISBN-10: 0132856204, ISBN-13: 978-0132856201, 6th Edition (02/24/12)
3
Course Overview
4
Course Approach
6
Icons / Metaphors
Information
Common Realization
Knowledge/Competency Pattern
Governance
Alignment
Solution Approach
77
Agenda
1 Session Overview
8
Reliable Data Transfer Session in Brief
9
Principles of Reliable Data Transfer
11
Reliable Data Transfer: Getting Started
send receive
side side
12
Reliable Data Transfer: Getting Started
We’ll:
Incrementally develop sender, receiver sides of reliable
data transfer protocol (rdt)
Consider only unidirectional data transfer
But control info will flow on both directions!
Use finite state machines (FSM) to specify sender,
receiver event causing state transition
actions taken on state transition
state: when in this
state state
“state” next state event
1 2
uniquely actions
determined by next
event
13
Reliable Data Transfer Session in Brief
14
Rdt1.0 - Reliable Transfer Over a Reliable Channel
sender receiver
15
Rdt2.0: Channel with Bit Errors
16
Rdt2.0: FSM Specification
rdt_send(data)
snkpkt = make_pkt(data, checksum) receiver
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
17
Rdt2.0: Operation with No Error
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
18
Rdt2.0: Error Scenario
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
19
Rdt 2.0 Has a Fatal Flaw!
20
Rdt2.1: Sender Handles Garbled ACK/NAKs
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for Wait for
ACK or
isNAK(rcvpkt) )
call 0 from
NAK 0 udt_send(sndpkt)
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt) && notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
L
Wait for Wait for
ACK or call 1 from
rdt_rcv(rcvpkt) && NAK 1 above
( corrupt(rcvpkt) ||
isNAK(rcvpkt) ) rdt_send(data)
21
Rdt2.1: Receiver Handles Garbled ACK/NAKs
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
22
Rdt 2.1: Discussion
Sender: Receiver:
Seq # added to pkt Must check if received
Two seq. #’s (0,1) will packet is duplicate
suffice. Why? » State indicates whether
0 or 1 is expected pkt
Must check if received seq #
ACK/NAK corrupted
Note: receiver can not
Twice as many states know if its last
» state must “remember” ACK/NAK received OK
whether “current” pkt
has 0 or 1 seq. #
at sender
23
Rdt2.2: A NAK-Free Protocol
24
Rdt2.2: Sender, Receiver Fragments
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for Wait for
ACK isACK(rcvpkt,1) )
call 0 from
above 0 udt_send(sndpkt)
sender FSM
fragment rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
rdt_rcv(rcvpkt) && && isACK(rcvpkt,0)
(corrupt(rcvpkt) || L
has_seq1(rcvpkt)) Wait for receiver FSM
0 from
udt_send(sndpkt) below fragment
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
25
Rdt 3.0: Channels with Errors and Loss
26
Rdt3.0: Sender
rdt_send(data)
rdt_rcv(rcvpkt) &&
sndpkt = make_pkt(0, data, checksum) ( corrupt(rcvpkt) ||
udt_send(sndpkt) isACK(rcvpkt,1) )
rdt_rcv(rcvpkt) start_timer L
L Wait for Wait
for timeout
call 0from
ACK0 udt_send(sndpkt)
above
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt,1) && notcorrupt(rcvpkt)
stop_timer && isACK(rcvpkt,0)
stop_timer
Wait Wait for
timeout for call 1 from
udt_send(sndpkt) ACK1 above
start_timer rdt_rcv(rcvpkt)
rdt_send(data) L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) || sndpkt = make_pkt(1, data, checksum)
isACK(rcvpkt,0) ) udt_send(sndpkt)
start_timer
L
27
Rdt3.0 in Action
28
Rdt3.0 in Action
29
Performance of Rdt 3.0
sender receiver
first packet bit transmitted, t = 0
last packet bit transmitted, t = L / R
U L/R .008
sender
= = = 0.00027
RTT + L / R 30.008 microsec
onds
31
Reliable Data Transfer Session in Brief
32
Pipelined Protocols
sender receiver
first packet bit transmitted, t = 0
last bit transmitted, t = L / R
Increase utilization
by a factor of 3!
U 3*L/R .024
sender
= = = 0.0008
RTT + L / R 30.008 microsecon
ds
34
Go-Back-N
Sender:
k-bit seq # in pkt header
“window” of up to N, consecutive unack’ed pkts allowed
rdt_send(data)
if (nextseqnum < base+N) {
sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum)
udt_send(sndpkt[nextseqnum])
if (base == nextseqnum)
start_timer
nextseqnum++
}
L else
refuse_data(data)
base=1
nextseqnum=1
timeout
start_timer
Wait
udt_send(sndpkt[base])
rdt_rcv(rcvpkt) udt_send(sndpkt[base+1])
&& corrupt(rcvpkt) …
udt_send(sndpkt[nextseqnum-1])
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_timer
36
GBN: Receiver Extended FSM
default
udt_send(sndpkt) rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
L && hasseqnum(rcvpkt,expectedseqnum)
expectedseqnum=1 Wait extract(rcvpkt,data)
sndpkt = deliver_data(data)
make_pkt(expectedseqnum,ACK,chksum) sndpkt = make_pkt(expectedseqnum,ACK,chksum)
udt_send(sndpkt)
expectedseqnum++
38
Selective Repeat
39
Selective Repeat: Sender, Receiver Windows
40
Selective Repeat
sender receiver
Data from above: Pkt n in [rcvbase, rcvbase+N-
If next available seq # in 1]
window, send pkt Send ACK(n)
Timeout(n): Out-of-order: buffer
Resend pkt n, restart In-order: deliver (also
timer
deliver buffered, in-
ACK(n) in order pkts), advance
[sendbase,sendbase+N]:
window to next not-yet-
Mark pkt n as received received pkt
If n smallest unACKed
pkt, advance window Pkt n in [rcvbase-N,rcvbase-1]
base to next unACKed ACK(n)
seq #
Otherwise:
Ignore
41
Selective Repeat in Action
42
Selective Repeat: Dilemma
Example:
Seq #’s: 0, 1, 2, 3
Window size=3
Receiver sees no difference
in two scenarios!
Incorrectly passes duplicate
data as new in (a)
Q: what relationship
between seq # size and
window size?
43
Agenda
1 Session Overview
44
Summary
45
Assignments & Readings
Readings
» Chapter 3 (sections 3.1-3.4)
Assignment #6
46
Next Session: Networks - Part I
47