Rdt1.0:reliable transfer over a reliable channel underlying channel perfectly reliable o no bit errors o no loss of packets separate FSMs for sender,receiver: o sender sends data into underlying channel o 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 Transport Layer 3-26
Transport Layer 3-26 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 call from above packet = make_pkt(data) udt_send(packet) rdt_send(data) extract (packet,data) deliver_data(data) Wait for call from below rdt_rcv(packet) sender receiver
Rdt2.0:channel with bit errors underlying channel may flip bits in packet o checksum to detect bit errors the question:how to recover from errors: o acknowledgements(ACKs):receiver explicitly tells sender that pkt received OK o negative acknowledgements(NAKs):receiver explicitly tells sender that pkt had errors o sender retransmits pkt on receipt of NAK new mechanisms in rdt2.0 (beyond rdt1.0): o error detection o receiver feedback:control msgs (ACK,NAK)rcvr->sender Transport Layer 3-27
Transport Layer 3-27 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
rdt2.0:FSM specification rdt_send(data) snkpkt make_pkt(data,checksum) receiver udt_send(sndpkt) rdt_rcv(rcvpkt)&& Wait for Wait for isNAK(rcvpkt) 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 sender below rdt_rcv(rcvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ACK) Transport Layer 3-28
Transport Layer 3-28 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 rdt send(data) snkpkt make_pkt(data,checksum) udt send(sndpkt) rdt rcv(rcvpkt)&& Wait for Wait for isNAK(rcvpkt) 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) Transport Layer 3-29
Transport Layer 3-29 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 rdt_send(data) snkpkt make pkt(data,checksum) udt send(sndpkt) rdt rcv(rcvpkt)&& isNAK(Tevpkt) 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) Transport Layer 3-30
Transport Layer 3-30 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