0% found this document useful (0 votes)
12 views19 pages

ACCSE CSC2B10-Chapter 3 2

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
12 views19 pages

ACCSE CSC2B10-Chapter 3 2

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 19

CSC2B10/CSC02B2

Data Communications

Chapter 3.2
Chapter 3 outline

3.1 Transport-layer services 3.5 Connection-oriented transport:


TCP
3.2 Multiplexing and demultiplexing • segment structure
• reliable data transfer
3.3 Connectionless transport: UDP • flow control
• connection management
3.4 Principles of reliable data transfer
3.6 Principles of congestion control

3.7 TCP congestion control

2
Principles of Reliable data transfer
• important in app., transport, link layers
• top-10 list of important networking topics!

• characteristics of unreliable channel will determine complexity of


reliable data transfer protocol (rdt)

3
Principles of Reliable data transfer

• important in app., transport, link layers


• top-10 list of important networking topics!

• characteristics of unreliable channel will determine complexity of


reliable data transfer protocol (rdt)
4
Principles of Reliable data transfer

• important in app., transport, link layers


• top-10 list of important networking topics!

• characteristics of unreliable channel will determine complexity of


reliable data transfer protocol (rdt)
5
Reliable data transfer: getting started

rdt_send(): called from above, deliver_data(): called by


(e.g., by app.). Passed data to rdt to deliver data to upper
deliver to receiver upper layer

send receive
side side

udt_send(): called by rdt, rdt_rcv(): called when packet


to transfer packet over arrives on rcv-side of channel
unreliable channel to receiver

6
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” next state state state
1 event
uniquely determined 2
by next event actions

7
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 read data from underlying channel

Wait for rdt_send(data) Wait for rdt_rcv(packet)


call from call from extract (packet,data)
above packet = make_pkt(data) below deliver_data(data)
udt_send(packet)

sender receiver

8
Rdt2.0: channel with bit errors
• underlying channel may flip bits in packet
• checksum to detect bit errors

How do humans recover from “errors”


during conversation?

9
Rdt2.0: channel with bit errors
• underlying channel may flip bits in packet
• checksum to detect bit errors

• the question: how to recover from errors:


• acknowledgements (ACKs): receiver explicitly tells sender that pkt
received OK
• negative acknowledgements (NAKs): receiver explicitly tells 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

10
rdt2.0: FSM specification

rdt_send(data)
sndpkt = 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) && isACK(rcvpkt)


Wait for
Λ
call from
below
sender
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)

11
rdt2.0: operation with no errors

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) && isACK(rcvpkt)


Wait for
Λ call from
below

rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)

12
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) && isACK(rcvpkt)


Wait for
Λ call from
below

rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)

13
rdt2.0 has a fatal flaw!

What happens if ACK/NAK corrupted? Handling duplicates:


• sender retransmits current pkt if
• sender doesn’t know what happened at ACK/NAK garbled
receiver!
• sender adds sequence number to
• can’t just retransmit: possible duplicate each pkt

• receiver discards (doesn’t deliver


up) duplicate
stop andpktwait
Sender sends one packet,
then waits for receiver
response

14
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)
Λ
Λ
Wait for Wait for
ACK or call 1 from
rdt_rcv(rcvpkt) && NAK 1 above
( corrupt(rcvpkt) ||
isNAK(rcvpkt) ) rdt_send(data)

udt_send(sndpkt) sndpkt = make_pkt(1, data, checksum)


udt_send(sndpkt)

15
rdt2.1: receiver, handles garbled ACK/NAKs
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum) sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
Wait for Wait for
rdt_rcv(rcvpkt) && 0 from 1 from rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) && below below not corrupt(rcvpkt) &&
has_seq1(rcvpkt) has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum) sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)

extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)

16
rdt2.1: discussion

Sender: Receiver:
• seq # added to pkt • must check if received packet is duplicate
• state indicates whether 0 or 1 is expected pkt
• two seq. #’s (0,1) will suffice. Why? seq #

• must check if received ACK/NAK corrupted • note: receiver can not know if its last ACK/NAK
received OK at sender
• twice as many states
• state must “remember” whether “current” pkt
has 0 or 1 seq. #

17
rdt2.2: a NAK-free protocol

• same functionality as rdt2.1, using ACKs only

• instead of NAK, receiver sends ACK for last pkt received OK


• receiver must explicitly include seq # of pkt being ACKed

• duplicate ACK at sender results in same action as NAK: retransmit current


pkt

18
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
rdt2.2: sender, receiver fragments
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)

19

You might also like