reliable data transfer protocol

- rdt_send(): application layer에 의해 호출되고, data를 transport layer에 전송한다.
- udt_send(): rdt에 의해 호출되고, packet을 unrliable channel을 넘어 reciver에게 전송한다.
- rdt_rcv(): packet이 reciver의 channal에 도착할 때 호출된다.
- deliver_data(): rdt에 의해 호출되고, data를 전달한다.
rdt 1.0
channal이 완벽하게 reliable하다고 생각한 모델이다. 즉 bit errors와 packets의 loss가 없다고 생각한다.
FSM

rdt 2.0
channal에서 packet들이 bit errors만 일어난다고 생각한 모델이다.
acknowledgement(ACKs): reciver가 sender에게 packets이 bit error가 없다고 알려준다.
negative acknowledgement(NAKs): reciver가 sender에게 packets이 bit error가 일어났다고 알려준다.
FSM

sender
reciver
한계
1. 만약에 reciver에서 ACK이나 NAK이 잘못 전달되면 sender는 reciver에서 무슨 일이 일어났는지 모른다.
2. ack이 잘못되어 nak을 받는 경우에는 reciver는 같은 packet을 여러번 받을 수 있는 문제가 생긴다.
3. ack, nak 모두 받지 못하면 sender는 무한정 ack,nak을 기다리게 된다.
rdt 2.1
rdt 2.0의 같은 packet을 여러번 받을 수 있는 문제를 해결하기 위한 모델이다.
nck이나 ack에 sequence를 붙여 해결한다.
FSM sender

sender
FSM reciver

reciver
rdt 2.2

rdt 3.0
rdt 1.0, rdt 2.1, rdt 2,2는 데이터가 channal에서 loss될 때의 대처가 없다.
rdt 3.0은 loss에 대한 해결방법을 추가한 프로토콜이다.
FSM

rdt 2.2에 Timer를 추가한 모델이다.
time out이 되면 packet을 다시 보낸다.


[참고] Computer Networking A Top-Down Approach EIGHTHEDITION/Kurose.Ross/Pearson