1 minute read

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

Screen Shot 2022-12-21 at 9 14 04 PM

  • 네트워크에서 신뢰성은 무엇보다 중요하다. 여기서 신뢰성은 메시지가 변경되지 않고(packet error), 메시지가 유실되지 않는 것(packet loss)을 말한다.
  • 전송계층(Reliable Channel)에서는 데이터가 제대로 전송되므로 문제가 생기지 않지만, 네트워크 계층(Unreliable Channel)에서는 데이터에 문제가 생길 수 있다.

유한 상태 기계(FSM, Finite State Machine)

RDT를 어떻게 구현할 수 있을까?
  • 간단한 상태부터 RDT를 구현하기 위해 유한 상태 기계(FSM, Finite State Machine) 개념을 도입한다.
  • FSM이란 컴퓨터 내에 유한한 상태를 가지는 기계가 있다고 가정하고, 컴퓨터는 오로지 하나의 상태만 갖고 있을 수 있으며 각 상태별 동작과 전이에 대한 내용을 설계하게 된다.
    • 배가 고프면 -> 식사, 배가 부르면 -> 잠, 잠에서 깨어나면 -> 생각한다.
  • FSM을 사용하면, 직관적이라 이해하기 쉽고, 새로운 상태나 사건을 추가하기 쉽기에 확장성이 있다.

RDT의 구현

RDT 1.0

  • packer errorpacket loss는 없다고 생각한다.
  • 안정적인 상태만을 가정하므로 별다른 처리가 필요 없다.

RDT 2.X

  • packet error가 발생한다고 생각한다.
  • 이를 세 가지 동작을 통해 처리한다.
    1. 오류를 감지한다(Error detection)
      • checksum bits를 통해 데이터의 무결성을 확인한다.
    2. 피드백(Feedback)
      • ACKs(오류가 없이 잘 받았음)
      • NAKs(오류가 있음)
    3. 재전송(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 errorpacket loss가 둘 다 발생한다.
  • 패킷 유실(packet loss)에 대한 처리는 어떻게 할 수 있을까?
    • 타이머(Timer)를 사용한다!
    • Sender가 ACK를 합리적인 시간동안 기다렸지만, 신호가 오지 않을 경우 재전송한다.
      • 기다리는 시간이 짧아질수록 패킷 유실에 대한 처리는 빠르지만 그만큼 더 많은 중복 패킷이 발생한다.

ACK가 유실된 경우

Screen Shot 2022-12-21 at 9 14 30 PM

  • 유실된 패킷에 대한 재전송을 하고 Receiver는 이를 받는다.

Timer가 성급히 터진 경우(RDT 3.0의 가장 큰 문제점)

Screen Shot 2022-12-21 at 9 15 06 PM

  • 계속해서 중복 패킷에 대한 ACK 신호를 받고 이에 대한 중복 패킷을 보낸다.
  • 이러한 문제점의 해결 방안으로 pipelined protocol이 등장하게 되었다.

참고자료

  • computer networking a top down approach
  • kocw 이석복, 컴퓨터네트워크