Escolar Documentos
Profissional Documentos
Cultura Documentos
Transport Layer
Computer Networking: A
Top Down Approach
4th edition.
Jim Kurose, Keith Ross
Addison-Wesley, July
2007.
send
side
deliver_data(): called by
rdt to deliver data to upper
layer
receive
side
rdt_send(data)
packet
=make_pkt(data)
udt_send(packet)
Sender
Wait for
call from
below
rdt_rcv(packet)
extract
(packet,data)
deliver_data(data)
Receiver
Rdt2.0: FSM
Specification
rdt_send(data)
snkpkt = make_pkt(data,
checksum)
udt_send(sndpkt)rdt_rcv(rcvpkt)
&&
Wait for
Wait for
isNAK(rcvpkt)
call from
ACK or
udt_send(sndpk
above
NAK
t)
rdt_rcv(rcvpkt) &&
isACK(rcvpkt)
sender
receiver
rdt_rcv(rcvpkt)
&&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt)
&&
extract(rcvpkt,data)
notcorrupt(rcvpk
deliver_data(data)
t)
udt_send(ACK)
Rdt2.0
rdt2.0 is a stop and wait
protocol
Sender sends one packet, then
waits for receiver response
Handling Duplicates:
Sender retransmits current
packet if ACK/NAK garbled
Sender adds sequence
number to each packet
Receiver discards (doesnt
deliver up) duplicate packet
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
Wait for
ACK or
NAK 1
Wait
for
call 1
from
rdt_send(data) above
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt))
sndpkt = make_pkt(NAK,
chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq1(rcvpkt)
sndpkt = make_pkt(ACK,
chksum)
udt_send(sndpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt))
sndpkt = make_pkt(NAK,
Wait
for
0 from
below
Wait
for
1 from
below
chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq0(rcvpkt)
sndpkt = make_pkt(ACK,
chksum)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
udt_send(sndpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
call 0 from
above
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt))
udt_send(sndpkt)
Wait for
0 from
below
Sender FSM
Fragment
Receiver FSM
Fragment
udt_send(sndpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
Rdt3.0
Sender
Wait for
call 0 from
above
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
stop_timer
stop_timer
timeout
udt_send(sndpkt)
start_timer
Wait
for
ACK 0
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
rdt_rcv(rcvpkt)
rdt_send(data)
Wait
for
ACK1
Wait for
call 1 from
above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
Rdt3.0 Receiver?
rdt_rcv(rcvpkt)
Solution
recovery:
Go-Back-N, Selective Repeat
Go-Back-N (GBN)
Sender:
Sender is allowed to transmit multiple packets without waiting
for an acknowledgement
Constrained to a certain maximum number N.
Base or send_base
Sequence number of oldest unacknowledged packet
Nextseqnum
Sequence number of next packet to be sent
The range of sequence numbers for transmitted but not
acknowledged packets can be viewed as a window of size N.
This window slides forward as the protocol operates
Go-Back-N
GBN sender must respond to three types of events
Invocation from above (rdt_send() is called):
If window is full, returns data to upper layer
Maintain synchronization mechanism
Receipt of an ACK:
ACK for packet with seq # n is taken asCumulative ACK
More shortly in receiver
Time out event:
Sender has timer for oldest unacknowledged packet
If timer expires, retransmit all unacknowledged packets
Go-Back-N
Receiver:
If a packet with seq # n is received correctly and is in
order
GBN in
action
http://www.eecis.udel.edu/~amer/450/TransportApplets/GBN/GBNindex.html