신뢰성 있는 데이터 전달(RDT, Reliable Data Transfer)

- 네트워크에서 신뢰성은 무엇보다 중요하다. 여기서 신뢰성은
메시지가 변경되지 않고(packet error), 메시지가 유실되지 않는 것(packet loss)을 말한다.
- 전송계층(Reliable Channel)에서는 데이터가 제대로 전송되므로 문제가 생기지 않지만, 네트워크 계층(Unreliable Channel)에서는 데이터에 문제가 생길 수 있다.
유한 상태 기계(FSM, Finite State Machine)
- 간단한 상태부터 RDT를 구현하기 위해
유한 상태 기계(FSM, Finite State Machine) 개념을 도입한다.
- FSM이란 컴퓨터 내에
유한한 상태를 가지는 기계가 있다고 가정하고, 컴퓨터는 오로지 하나의 상태만 갖고 있을 수 있으며 각 상태별 동작과 전이에 대한 내용을 설계하게 된다.
- 배가 고프면 -> 식사, 배가 부르면 -> 잠, 잠에서 깨어나면 -> 생각한다.
- FSM을 사용하면, 직관적이라 이해하기 쉽고, 새로운 상태나 사건을 추가하기 쉽기에 확장성이 있다.
RDT의 구현
RDT 1.0
packer error와 packet loss는 없다고 생각한다.
안정적인 상태만을 가정하므로 별다른 처리가 필요 없다.
RDT 2.X
packet error가 발생한다고 생각한다.
- 이를 세 가지 동작을 통해 처리한다.
- 오류를 감지한다(Error detection)
- checksum bits를 통해 데이터의 무결성을 확인한다.
- 피드백(Feedback)
- ACKs(오류가 없이 잘 받았음)
- NAKs(오류가 있음)
- 재전송(Retransmission)
- Sender가 NAKs를 받게 되면 재전송한다.
- 만약, ACKs 또는 NAKs에 에러가 있다면 어떻게 될까?
- Sender는 Receiver가 제대로 받은지 모르기 때문에 해당 패킷을 재전송한다.
- Receiver는 해당 패킷이 중복된 패킷이라면 이를 버리고, ACKs를 전송한다.
- 그럼, 해당 패킷이 중복된 패킷인지 어떻게 알 수 있을까?
sequence number를 보고 알 수 있다.
- 여기서 sequence number는
1bit면 충분하다.
- NAKs 대신 ACK만으로도 표현 가능하다.
- PKT(0) - ACK(0), PKT(1) - ACK(1), 서로 다른 번호라면 error 발생한 것.
RDT 3.0
packet error와 packet loss가 둘 다 발생한다.
- 패킷 유실(packet loss)에 대한 처리는 어떻게 할 수 있을까?
타이머(Timer)를 사용한다!
- Sender가 ACK를 합리적인 시간동안 기다렸지만, 신호가 오지 않을 경우 재전송한다.
- 기다리는 시간이 짧아질수록 패킷 유실에 대한 처리는 빠르지만 그만큼 더 많은 중복 패킷이 발생한다.
ACK가 유실된 경우

- 유실된 패킷에 대한 재전송을 하고 Receiver는 이를 받는다.
Timer가 성급히 터진 경우(RDT 3.0의 가장 큰 문제점)

- 계속해서 중복 패킷에 대한 ACK 신호를 받고 이에 대한 중복 패킷을 보낸다.
- 이러한 문제점의 해결 방안으로
pipelined protocol이 등장하게 되었다.
참고자료
- computer networking a top down approach
- kocw 이석복, 컴퓨터네트워크