🧩 Reliable data transfer protocol
데이터의 유실, 에러를 극복하면 신뢰성있는 데이터 전송 이라고 할 수 있다.
<RDT를 위한 메커니즘>
- Error detection
- Feedback
- Sequence numbering
🧩 RDT 1.0
- 하위 계층의 신뢰성이 보장될때 (에러도 없고, 패킷의 유실도 없다고 가정)
Sender는 전송의 역할, Receiver는 수신의 역할만 하면 된다.
-FSM 으로 나타낸 결과
(FSM 은 finite state machines 로 특정한 상태를 나타내기 위한 개념적 모델이다.)
🧩 RDT 2.0
- 패킷 전송
- Checksum 을 통해 에러를 감지한다.
- ACKs(긍정), NAKs(부정) 의 피드백을 Sender 에 Response
- Sender는 리스폰을 기다렸다가, 잘못된 경우 재전송
→ RDT 2.0의 경우 ACK 와 NAK 패킷의 손상을 고려하지 않았다.
- Sender가 보낸 패킷이 에러가 발생하였지만, ACK가 잘못 전송되어 패킷을 받을 수 없는 상태
- 에러가 발생하지 않았지만, NAK가 잘못 전송되어 중복된 패킷을 받는 상태
위와 같은 문제점이 발생할 수 있다.
🧩 RDT 2.1
- RDT 2.0의 문제를 보완하기 위해 Sequence number(0, 1)를 도입
Sequence number 0과 1을 통해 상태를 관리한다.
-
Sender
→ Sender의 경우, 만약 #0 패킷을 보낸경우 0 state를 기다리게 되고 ACK가 온 경우 #1 패킷을 전송하며 1 state 로 전환한다.
→ #0 패킷을 보내고 0 state 인데 NAK가 온 경우에는 #0 패킷을 재전송한다.
-
Reciver
→ Reciver가 0 state 인데, #0 패킷이 제대로 온 경우에는 ACK를 보내고 1 state 로 전환한다.
→ 만약 0 state 인데, #1 패킷이 온 경우에는 ACK는 보내지만 0 state 를 유지한다.
- 0,1을 이용해 패킷에 순서를 부여하고, 순서와 응답을 매치하여 RDT 2.0의 중복 패킷 전송을 방지 할 수 있다.
🧩 RDT 2.2
- NAK-free protocol 이라고 하며, NAK를 없애고 ACK와 sequence # 를 조합하여 사용한다.
- RDT2.1 보다 덜 복잡한 구조로 되어있으며 ACK와 Sequence #를 통해 NAK를 대체할 수 있다.
- 만약 #0 의 패킷을 보냈는데, ACK1 이 온다면 #0 패킷에 대한 NAK 역할을 한다고 볼 수 있다.
- 즉, ACK #을 통해 Sequence # 패킷을 제대로 전송 받았다는 메세지를 담는 것 이다.
🧩 RDT 3.0
- (a) 패킷이 유실이 발생하지 않은 경우 : RDT 2.2와 같이 동작한다. (타이머 설정 제외)
- (b) 타이머를 설정하여 유실된 패킷의 ack 가 도착하지 않더라도, 재전송을 하게 된다.
- (c) 제대로 전송이 되었지만, 응답인 ACK가 유실된 경우에 설정했던 타이머가 동작하여 재전송 하게 된다.
- (d) ACK가 설정했던 타임보다 늦게 온 경우에도 재전송 하게 된다.
🧩 RDT 3.0 까지의 문제점
- Stop-and-wait 프로토콜로, 하나의 패킷을 보내고 응답을 기다린다는 점은 실제 네트워크에서 사용되기에 상당히 느린편이다.
- 문제점을 해결하기 위해 나온 Pipelining 방식의 Go-Back-N, Selective repeat 방식이 있다.
여기까지가 RDT의 전체적인 내용이고, 다음 포스팅 에서 RDT3.0까지의 문제 해결을 위한 파이프라이닝 방식을 다룰 예정이다.
References
Computer Networking: A Top-Down Approach (6th Edition)