Reliable data transfer: getting started We'll D incrementally develop sender, receiver sides of reliable data transfer protocol (rdt) O consider only unidirectional data transfer o but control info will flow on both directions O use finite state machines(FSm) to specify sender receiver event causing state fransition actions taken on state transition state: when in this state next state state state uniquely determined event 2 by next event actions Transport layer 3-21
Transport Layer 3-21 Reliable data transfer: getting started We’ll: incrementally develop sender, receiver sides of reliable data transfer protocol (rdt) consider only unidirectional data transfer but control info will flow on both directions! use finite state machines (FSM) to specify sender, receiver state 1 state 2 event causing state transition actions taken on state transition state: when in this “state” next state uniquely determined by next event event actions
Rdt1.0: reliable transfer over a reliable channel O underlying channel perfectly reliable o no bit errors o no loss of packets O separate fsms for sender receiver: o sender sends data into underlying channel o receiver read data from underlying channel ait for send(data) rat 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-22
Transport Layer 3-22 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 O underlying channel may flip bits in packet o recall: UdP checksum to detect bit errors o 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 o human scenarios using ACKs, NAKs O new mechanisms in rdt2 o(beyond rdtl. o) o error detection o receiver feedback: control msgs(ACk, NAKrcvr->sender Transport Layer 3-23
Transport Layer 3-23 Rdt2.0: channel with bit errors underlying channel may flip bits in packet recall: UDP 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 human scenarios using ACKs, NAKs? 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 fo Wait for isNAK(〔 rcvpkt) rat rcv(rcvpkt)&& call from ACK or udt send(sndpkt) corrupt(rcvpkt above NAK udt send(NAK) rdt rcv(rcvpkt)&& isACK(rcvpkt) Wait for sender below rdt rcv(rcvpkt)&& notcorrupt(rcvpkt) extract(rcvpkt, data deliver data( data) dt send(ACK) Transport Layer 3-24
Transport Layer 3-24 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) send(AcK) Transport layer 3-25
Transport Layer 3-25 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