rdt2.0: FSM specification rdt send(data) snkpkt make_pkt(data, checksum) receiver udt send(sndpkt) rdt rcv(rcvpkt)&& Wait fo Wait for isNAK(〔 rcvpkt) rat rcv(rcvpkt)&& call from ACK or udt send(sndpkt) corrupt(rcvpkt above NAK Idt send(NAK) rdt rcv(rcvpkt)&& isACK(rcvpkt) Wait for sender below rat rcv(〔 cvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt, data deliver data(data) dt send(ACK)
Comp 361, Spring 2005 3: Transport Layer 26 rdt2.0: FSM specification Wait for call from above snkpkt = 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 for ACK or NAK Wait for call from below sender receiver rdt_send(data) L
rdt2.0: operation with no errors dt send(data) snkpkt=makepkt(data,checksum) udt send(sndpkt) rdt rcv(rcvpkt)&& Wait for lait for isNAK(〔 rcvpkt) dt rcv(rcvpkt)&& call from ACK or udt send (sndpkt corrupt(rcvpkt above NAK udt send(NAK) rdt rcv(rcvpkt)&& isACK(rcvpkt) ait for below rdt rcv(rcvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt, data deliver data( data) Idt send(ACK)
Comp 361, Spring 2005 3: Transport Layer 27 rdt2.0: operation with no errors Wait for call from above snkpkt = 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 for ACK or NAK Wait for call from below rdt_send(data) L
rdt2.0: error scenario dt send(data) snkpkt make _pkt(data, checksum) udt send(sndpkt) dt rcv(rcvpkt)&& isNAKrcvpk Wait for ait for rdt rcv(rcvpkt&& call from ACK or udt send(sndpkt) corrupt(rcvpkt above NAK udt send(NAK) rdt rcv(rcvpkt)&& isACK(rcvpkt) ait for below dt rcv(rcvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt, data deliver data( data) send(AcK)
Comp 361, Spring 2005 3: Transport Layer 28 rdt2.0: error scenario Wait for call from above snkpkt = 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 for ACK or NAK Wait for call from below rdt_send(data) L
rdt.0 has a fatal flaw! What happens if ACK/NAK Handling duplicates corrupted? o sender adds sequence number g sender doesn't know what (0/1) to each p kt happened at receiver! g sender retransmits current pkt if ACK/NA garbled o can't just retransmit: possible o receiver discards(doesn't duplicate deliver up) duplicate pkt But receiver waiting o Duplicate packet is one with same sequence as previous What to do? packet o sender Acks/NAKs receivers ACK/NA? What if sender ACK/NAK corrupted? stop and wait Sender sends one packet o retransmit, but this might cause retransmission of then waits for receiver correctly received pkt response g Receiver wont know about duplication!
Comp 361, Spring 2005 3: Transport Layer 29 rdt2.0 has a fatal flaw! What happens if ACK/NAK corrupted? sender doesn’t know what happened at receiver! can’t just retransmit: possible duplicate. But receiver waiting! What to do? sender ACKs/NAKs receiver’s ACK/NAK? What if sender ACK/NAK corrupted? retransmit, but this might cause retransmission of correctly received pkt! Receiver won’t know about duplication! Handling duplicates: sender adds sequence number (0/1) to each pkt sender retransmits current pkt if ACK/NAK garbled receiver discards (doesn’t deliver up) duplicate pkt Duplicate packet is one with same sequence # as previous packet Sender sends one packet, then waits for receiver response stop and wait
o Sender: whenever sender receives control message it sends a packet to receiver o A valid ACK: Sends next packet (if exists )with new sequence # o A NAK or corrupt response: resends old packet g Receiver: sends acK/naK to sender o If received packet is corrupt: send NAK o If received packet is valid and has different sequence #t as prev packet: send ACk and deliver new data up o If received packet is valid and has same sequence as prev packet, i. e, is a retransmission of duplicate: send ACK o Note: ACK/nak do not contain sequence
Comp 361, Spring 2005 3: Transport Layer 30 Sender: whenever sender receives control message it sends a packet to receiver. A valid ACK: Sends next packet (if exists) with new sequence # A NAK or corrupt response: resends old packet Receiver: sends ACK/NAK to sender If received packet is corrupt: send NAK If received packet is valid and has different sequence # as prev packet: send ACK and deliver new data up. If received packet is valid and has same sequence # as prev packet, i.e., is a retransmission of duplicate: send ACK Note: ACK/NAK do not contain sequence #