Transport Layer Protocols are central piece of layered architectures, these provides the logical communication between application processes. These processes uses the logical communication to transfer data from transport layer to network layer and this transfer of data should be reliable and secure. The data is transferred in the form of packets but the problem occurs in reliable transfer of data.
The problem of transferring the data occurs not only at the transport layer, but also at the application layer as well as in the link layer. This problem occur when a reliable service runs on an unreliable service, For example, TCP (Transmission Control Protocol) is a reliable data transfer protocol that is implemented on top of an unreliable layer, i.e., Internet Protocol (IP) is an end to end network layer protocol.
In this model, we have design the sender and receiver sides of a protocol over a reliable channel. In the reliable transfer of data the layer receives the data from the above layer breaks the message in the form of segment and put the header on each segment and transfer. Below layer receives the segments and remove the header from each segment and make it a packet by adding to header.
The data which is transferred from the above has no transferred data bits corrupted or lost, and all are delivered in the same sequence in which they were sent to the below layer this is reliable data transfer protocol. This service model is offered by TCP to the Internet applications that invoke this transfer of data.
Similarly in an unreliable channel we have design the sending and receiving side. The sending side of the protocol is called from the above layer to rdt_send() then it will pass the data that is to be delivered to the application layer at the receiving side (here rdt-send() is a function for sending data where rdt stands for reliable data transfer protocol and _send() is used for the sending side).
On the receiving side, rdt_rcv() (rdt_rcv() is a function for receiving data where -rcv() is used for receiving side), will be called when a packet arrives from the receiving side of the unreliable channel. When the rdt protocol wants to deliver data to the application layer, it will do so by calling deliver_data() (where deliver_data() is a function for delivering data to upper layer).
In reliable data transfer protocol, we only consider the case of unidirectional data transfer, that is transfer of data from the sending side to receiving side(i.e. only in one direction). In case of bidirectional (full duplex or transfer of data on both the sides) data transfer is conceptually more difficult. Although we only consider unidirectional data transfer but it is important to note that the sending and receiving sides of our protocol will needs to transmit packets in both directions, as shown in above figure.
In order to exchange packets containing the data that is needed to be transferred the both (sending and receiving) sides of rdt also need to exchange control packets in both direction (i.e., back and forth), both the sides of rdt send packets to the other side by a call to udt_send() (udt_send() is a function used for sending data to other side where udt stands for unreliable data transfer protocol).