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) Transport Layer 3-26
Transport Layer 3-26 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 Handling duplicates ACK/NAK corrupted? o sender adds sequence o sender doesnt know what number to each pkt happened af receiver 0 sender retransmits current o can't just retransmit kt讦fAcK/ NAK garbled possible duplicate o receiver discards(doesn't deliver up)duplicate pkt What to do? o sender ACKS/NAKs receivers AcK/Nak What stop and wait if sender acK/NaK lost? Sender sends one packet then waits for receiver g retransmit, but this might cause retransmission of response correctly received pkt Transport layer 3-27
Transport Layer 3-27 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 What to do? sender ACKs/NAKs receiver’s ACK/NAK? What if sender ACK/NAK lost? retransmit, but this might cause retransmission of correctly received pkt! Handling duplicates: sender adds sequence number to each pkt sender retransmits current pkt if ACK/NAK garbled receiver discards (doesn’t deliver up) duplicate pkt Sender sends one packet, then waits for receiver response stop and wait
rdt2.1: sender, handles garbled ACK/NAKs rdt send(data) sndpkt make_ pkt(o, data, checksum) udt send(sndpkt) rdt rcv(rcvpkt)&& Wait for ( corrupt( rcvpkt)‖ call o from Ack or visNAK(rcvpkt)) above NAK O udt send(sndpkt) rat rcv(rcvpkt & notcorrupt(rcvpkt) dt rcv(rcvpkt) & isACK(rcvpkt) & notcorrupt(rcvpkt) & isacK(rcvpkt) Wait for Wait for call 1 from rdt rcv(rcvpkt)&& NAK 1 above ( corrupt(rcvpkt)‖l ISNAK(rcvpkt)) rdt send( data) udt send(sndpkt) ndpkt = make_ _pkt (1, data, checksum) udt send(sndpkt) Transport layer 3-28
Transport Layer 3-28 rdt2.1: sender, handles garbled ACK/NAKs Wait for call 0 from above sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_send(data) Wait for ACK or NAK 0 udt_send(sndpkt) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isNAK(rcvpkt) ) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) rdt_send(data) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt) udt_send(sndpkt) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isNAK(rcvpkt) ) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt) Wait for call 1 from above Wait for ACK or NAK 1 L L
rdt2.1: receiver, handles garbled ACK/NAKs rdt rcv(rcvpkt)&& notcorrupt(rcvpkt) & has sego(rcvpkt tract(rcvpkt, data) deliver data(data sndpkt= make _pkt(ACK, chksum) rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)\ udt_send(sndpkt rdt rcv(rcvpkt)&& (corrupt(rcvpkt) sndpkt make_ pkt(NAK, chksum) sndpkt make_ pkt(NAK, chksum) udt send(sndpkt) udt send(sndpkt ait fo Wait fo rdt rcv(rcvpkt)&& 0 from 1 from rdt rcv(rcvpkt)&& not corrupt(rcvpkt)&& beloy beloy not corrupt(rcvpkt)&& has seg 1 (rcvpkt has sego(rcvpkt sndpkt make_pktACK, chksum) sndpkt make_pkt(ACK, chksum) udt send (sndpkt rdt rcv(rcvpkt)&& notcorrupt(rcvpkt) udt send(sndpkt) & has seq 1(rcvpkt) extract(rcvpkt, data) deliver data(data) sndpkt= make_pkt(ACK, chksum) dt send(sndpkt Transport Layer 3-29
Transport Layer 3-29 rdt2.1: receiver, handles garbled ACK/NAKs Wait for 0 from below sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq0(rcvpkt) 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 from below 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) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq1(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt)
rdt2: discussion Sender: Receiver: 口Seq# added to pkt g must check if received 口 two seq.#s(0,1)wil packet is duplicate suffice. Why? o state indicates whether g must check if received O or 1 is expected pkt seq # ACK/NAK corrupted o note: receiver can not o twice as many states know if its last o state must remember ACK/NAK received OK whether"current"pkt at sender hasO or 1 seq # Transport Layer 3-30
Transport Layer 3-30 rdt2.1: discussion Sender: seq # added to pkt two seq. #’s (0,1) will suffice. Why? must check if received ACK/NAK corrupted twice as many states state must “remember” whether “current” pkt has 0 or 1 seq. # Receiver: must check if received packet is duplicate state indicates whether 0 or 1 is expected pkt seq # note: receiver can not know if its last ACK/NAK received OK at sender