- 어느 layer에서나 필요함
- 신뢰성 있는 데이터 전송 : 데이터의 유실없이 전송되는 것
- FSM (Finite State Machine)
RDT 1.0 : Reliable transfer over a reliable channel
- Data의 오류나 손실이 없는 전송상태를 가정
- Sender

RDT2.0 : Channel with bit errors
- 전송은 완벽하지만 Data error가 있을 수 있음
- checksum, bits checking을 통해 오류를 검토하는 과정을 추가
- checking 결과를 sender에게 알려주는 ACK, NAK가 존재
- ACK : error가 없이 잘 전송되었음을 보내주는 신호
- NAK : data’s error가 발견됨, sender는 신호를 받은 후, retransmit

- 결함 : ACK, NAK에 대해서 오류가 발생하면 Sender는 하염없이 기다리는 상태가 됨
- 해결책 : 보내는 packet에 sequence number를 추가함
RDT 2.1 : Sender, handiling garbled ACK/NAKs
- Sender는 packet에 0, 1을 번갈아가며 sequence number를 붙여 packet 생성
- Sender


⇒ Sender, Receiver 둘 다 0, 1의 pkt에 대해서만 처리를 함
RDT 2.2 : a NAK-free protocol
- Receiver는 pkt를 받을 때 마다 ACK, NAK를 보내야 하므로 시간이 오래 걸림
⇒ Sender에게 ACK만 보내줌.

RDT 3.0 : channels with errors and loss
- error뿐만 아니라 pkt loss도 발생하는 채널
- 만약 pkt loss가 발생한다면 sender는 알지못한다.
- 해결책 : Packet을 보낼 때 Timer를 함께 설정. Timer가 지날 때 까지 응답이 오지 않으면 retransmit
- Sender

- Sender는 timer를 함께 설정하여 패킷을 보냄. 중간에 loss가 발생하거나 ACK가 timer보다 늦게올시, 패킷재전송을 함.
RDT 3.0 in actions
- 총 네 가지의 케이스가 존재함
- No errors, no loss
→ 정상적으로 문제 없이 통신함
- packet loss
→ sender가 보낸 pkt 자체가 loss, receiver는 pkt을 받지 않았으니 ACK를 보내줄 수가 없음. 결국 sender timeout이 발생해 resend
- ACK loss
→ receiver가 pkt을 받은 후 ACK를 보냈으나, loss 발생. 결국 timeout이 나서 resend. 하지만 receiver는 이미 확인한 pkt인걸 확인 후 자체적으로 처리. ACK 전달
- delayed ACK

-
RDT 모델들은 하나의 pkt을 보내고 그 응답을 기다리는 stop and wait 방식임
-
Utilization : 주어진 시간에 얼마만큼의 데이터를 전송했는가에 대한 비율, 0~1
-
RDT 모델의 Utilization을 구해보자

- Example
- 1Gbps link (throughput), 15ms prop (propagation delay), 8000 bits packet (packet’s size)

- Diagram
RTT : 하나의 패킷을 보내고 응답을 받을 때 까지의 텀. 위의 그림에서는 prop delay 15ms이니 RTT는 30ms
해당 rdt3.0의 U는 0.027%로 매우매우 효율이 낮음. 이는 하나의 pkt을 보내고 응답을 받을 때까지 기다리고 있기 때문임
RDT3.0 : pipeline protocols operation
- 해결책 : 앞의 프로토콜은 하나의 pkt을 보내고 응답을 받을 때까지 계속 기다리기만 하기 때문에 효율이 좋지 않음 → 파이프라이닝 기법을 사용하여 여러개의 pkt을 한 번에 보냄
- 조건
- sequence number의 확장
- sender, receiver의 buffering
- Pipelining: increased utilization
⇒ 3-pkts pipelining 기법은 stop and wait 방식보다 3배나 증가한 것을 볼 수 있다.
GBN(Go-Back-N):
Sender
- Window : Sender가 ACK를 받지 않고 한 번에 보낼 수 있는 pkt의 수, 파이프라이닝할 pkt의 수
- Base : ACK 받지 않은 가장 seq num가 작은 pkt

Receiver
- Receiver는 가장 최근의 수신받은 pkt의 seg num를 기억함
GBN in action

- 만약 3-pkts일 때, [0, 1]에 대한 ACK를 보내주고 2에 loss가 발생 → [4, 5]를 받아도 receiver는 이를 무시, 최근 수신받은 pkt인 1에 대한 ACK만 지속적으로 보냄 (pkt2 loss가 발생했음을 알림) → pkt2의 Timeout이 발생 → sender는 window에 있는 [2, 3, 4]를 한 번에 보냄
⇒ GBN은 위의 그림을 보다시피 pkt loss발생 시 sender의 pkt을 다 버리기 때문에 쓸데없는 데이터 전송이 잦아진다.
Selective repeat
- loss pkt만 다시 보내자 → receiver는 loss pkt을 받는다면 그 후에 오는 pkt들은 buffer에 따로 담아놓는다.
- loss pkt에 대한 timeout이 발생 시 sender는 해당 pkt만 retransmission
Selective repeat in action

- 위 그림을 보다시피 GBN과는 다르게 loss pkt에 대해서만 retransmission이 일어나고 있음
Selective Repeat: a dillema

⇒ Window’s maximize size : sequence number - 1
RDT : Interactive communication status
- Stop and Wait → half-duplex
- Go Back N → full-duplex
- Selective Repeat → full-duplex