신뢰성 있는 데이터 전달(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 이석복, 컴퓨터네트워크