E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
1
EE 586 Communication andSwitching Networks
Lecture 14
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
Principles of reliable data transfer
important in application, transport, link layers
top-10 list of important networking topics!
rdt_service
2
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
rdt_service
underline_base
Principles of reliable data transfer
important in application, transport, link layers
top-10 list of important networking topics!
3
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
characteristics of unreliable channel will determinecomplexity of reliable data transfer protocol (rdt)
rdt_service
important in application, transport, link layers
top-10 list of important networking topics!
underline_base
Principles of reliable data transfer
4
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
Reliable data transfer: getting started
rdt_part2
send
side
receive
side
rdt_send(): called from above,(e.g., by app.). Passed data to
deliver to receiver upper layer
udt_send(): called by rdt,
to transfer packet over
unreliable channel to receiver
rdt_rcv(): called when packetarrives on rcv-side of channel
deliver_data(): called byrdt to deliver data to upper
5
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
well:
incrementally develop sender, receiver sides ofreliable 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
state
1
state
2
event causing state transition
actions taken on state transition
state: when in thisstate next stateuniquely determinedby next event
event
actions
underline_base
Reliable data transfer: getting started
6
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
rdt1.0: reliable transfer over a reliable channel
underlying channel perfectly reliable
no bit errors
no loss of packets
separate FSMs for sender, receiver:
sender sends data into underlying channel
receiver reads data from underlying channel
Wait forcall fromabove
packet = make_pkt(data)
udt_send(packet)
rdt_send(data)
extract (packet,data)
deliver_data(data)
Wait forcall frombelow
rdt_rcv(packet)
sender
receiver
underline_base
7
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underlying channel may flip bits in packet
checksum to detect bit errors
the question: how to recover from errors:
acknowledgements (ACKs): receiver explicitly tells senderthat pkt received OK
negative acknowledgements (NAKs): receiver explicitlytells sender that pkt had errors
sender retransmits pkt on receipt of NAK
new mechanisms in rdt2.0 (beyond rdt1.0):
error detection
receiver feedback: control msgs (ACK,NAK) rcvr->sender
rdt2.0: channel with bit errors
underline_base
How do humans recover from errors
during conversation?
8
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underlying channel may flip bits in packet
checksum to detect bit errors
the question: how to recover from errors:
acknowledgements (ACKs): receiver explicitly tells senderthat pkt received OK
negative acknowledgements (NAKs): receiver explicitlytells sender that pkt had errors
sender retransmits pkt on receipt of NAK
new mechanisms in rdt2.0 (beyond rdt1.0):
error detection
feedback: control msgs (ACK,NAK) from receiver tosender
rdt2.0: channel with bit errors
underline_base
9
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
rdt2.0: FSM specification
Wait forcall fromabove
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
rdt_rcv(rcvpkt) &&
   notcorrupt(rcvpkt)
rdt_rcv(rcvpkt) && isACK(rcvpkt)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
   isNAK(rcvpkt)
udt_send(NAK)
rdt_rcv(rcvpkt) &&
  corrupt(rcvpkt)
Wait forACK orNAK
Wait forcall frombelow
sender
receiver
rdt_send(data)
10
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
rdt2.0 has a fatal flaw!
what happens ifACK/NAK corrupted?
sender does not knowwhat happened atreceiver!
cant just retransmit:possible duplicate
handling duplicates:
sender retransmitscurrent pkt if ACK/NAKcorrupted
sender adds sequencenumber to each pkt
receiver discards (doesntdeliver up) duplicate pkt
underline_base
stop and wait
sender sends one packet,
then waits for receiver
response
11
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
rdt2.1: sender, handles garbled ACK/NAKs
Wait forcall 0 fromabove
Wait forACK orNAK 0
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_send(data)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
rdt_send(data)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
Wait for
call 1 fromabove
Wait forACK orNAK 1
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
12
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
Wait for
0 frombelow
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
  && has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
Wait for
1 frombelow
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
  && has_seq0(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
rdt_rcv(rcvpkt) &&
   not corrupt(rcvpkt) &&
   has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
   not corrupt(rcvpkt) &&
   has_seq1(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
underline_base
rdt2.1: receiver, handles garbled ACK/NAKs
13
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
rdt2.1: discussion
sender:
seq # added to pkt
two seq. #s (0,1) willsuffice.
must check if receivedACK/NAK corrupted
twice as many states
state must rememberwhether expectedpkt should have seq #of 0 or 1
receiver:
must check if receivedpacket is duplicate
state indicates whether0 or 1 is expected pktseq #
note: receiver knowsif its last ACK/NAKreceived OK atsender based onduplicate packets
underline_base
14
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
rdt2.2: a NAK-free protocol
same functionality as rdt2.1, using ACKs only
instead of NAK, receiver sends ACK for last pktreceived OK
receiver must explicitly include seq # of pkt being ACKed
duplicate ACK at sender results in same action asNAK: retransmit current pkt
15
(modified by Cheung for EE586; based on K&R original)
E l e c t r i c a l    &   C o m p u t e r
Department of
Electrical & Computer Engineering
underline_base
rdt2.2: sender, receiver fragments
Wait forcall 0 fromabove
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_send(data)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
  isACK(rcvpkt,1) )
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
Wait forACK 0
sender FSM
fragment
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
  && has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
Wait for
0 frombelow
rdt_rcv(rcvpkt) &&
   (corrupt(rcvpkt) ||
     has_seq1(rcvpkt))
udt_send(sndpkt)
receiver FSM
fragment
16
(modified by Cheung for EE586; based on K&R original)