Академический Документы
Профессиональный Документы
Культура Документы
Agenda
11 Session
Session Overview
Overview
22 Reliable
Reliable Data
Data Transfer
Transfer
33 Summary
Summary and
and Conclusion
Conclusion
2
What is the class about?
Textbooks:
» Computer Networking: A Top-Down Approach (5th Edition)
James F. Kurose, Keith W. Ross
Addison Wesley
ISBN-10: 0136079679, ISBN-13: 978-0136079675, 5th Edition (03/09)
Course Overview
4
Reliable Data Transfer Session in Brief
Icons / Metaphors
Information
Common Realization
Knowledge/Competency Pattern
Governance
Alignment
Solution Approach
66
Agenda
11 Session
Session Overview
Overview
22 Reliable
Reliable Data
Data Transfer
Transfer
33 Summary
Summary and
and Conclusion
Conclusion
8
Principles of Reliable Data Transfer
10
Reliable Data Transfer: Getting Started
send receive
side side
11
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
12
Reliable Data Transfer Session in Brief
13
sender receiver
14
Rdt2.0: Channel with Bit Errors
15
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)
16
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)
17
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
Rdt 2.0 Has a Fatal Flaw!
19
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)
Λ
Λ
Wait for Wait for
ACK or call 1 from
rdt_rcv(rcvpkt) && NAK 1 above
( corrupt(rcvpkt) ||
isNAK(rcvpkt) ) rdt_send(data)
20
Rdt2.1: Receiver Handles Garbled ACK/NAKs
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
21
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
22
Rdt2.2: A NAK-Free Protocol
23
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) || Λ
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)
24
Rdt 3.0: Channels with Errors and Loss
25
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 Λ
Λ 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) Λ
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) || sndpkt = make_pkt(1, data, checksum)
isACK(rcvpkt,0) ) udt_send(sndpkt)
start_timer
Λ
26
Rdt3.0 in Action
27
Rdt3.0 in Action
28
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
d
30
Reliable Data Transfer Session in Brief
31
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
d
33
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++
}
Λ 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
35
default
udt_send(sndpkt) rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
Λ && 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++
37
Selective Repeat
39
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
40
Selective Repeat in Action
41
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?
42
Agenda
11 Session
Session Overview
Overview
22 Reliable
Reliable Data
Data Transfer
Transfer
33 Summary
Summary and
and Conclusion
Conclusion
43
Summary
44
Assignments & Readings
Readings
» Chapter 3
Assignment #4
» Due March 25 2010
45
46