We want to have a reliable protocol built on top of an unreliable channel.

The interfaces for reliable data transfer are as follows:
rdt_send - pass data from application to deliverudt_send - called by rdt to transfer packet of unreliable channel to receieverdeliver_data - called by rdt to deliver data to upper layerrdt_rcv - called when packet arrives on receiever side of channel
We consider unidirectional data transfer, but control info will flow in both directions.
Sender/receiver actions can be specified by finite state machines.
rdt1.0 - reliable transfer over a reliable channel
Assumption is that underlying channel is perfectly reliable.
Very simple FSMs for sender/receiver:

