rdtl.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 reads 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 Layer3-26
Transport Layer3-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 reads 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 checksum to detect bit errors the question:how to recover from errors: How do humans recover from "errors" during conversation? Transport Layer3-27
Transport Layer3-27 ▪ 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: channel with bit errors How do humans recover from “ errors ” during conversation?
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 feedback:control msgs(ACK,NAK)from receiver to sender Transport Layer3-28
Transport Layer3-28 ▪ 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 • feedback: control msgs (ACK,NAK) from receiver to sender rdt2.0: channel with bit errors
rdt2.0:FSM specification rdt_send(data) sndpkt 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 A call from sender below rdt_rcv(rcvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt,data) deliver data(data) udt_send(ACK) Transport Layer3-29
Transport Layer3-29 rdt2.0: FSM specification Wait for call from above sndpkt = 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 isNAK(rcvpkt) 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 Layer3-30
Transport Layer3-30 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