RDT 2.1 동작 방식 정리

rdt 2.1의 동작 방식을 ACK/NAK 손상, sequence number, 중복 packet 처리, sender/receiver 상태기계 기준으로 정리했습니다.

RDT 2.1 동작 방식 정리

rdt 2.1rdt 2.0에서 드러난 약점을 보완한 단계다. rdt 2.0은 data packet에 bit error가 생기는 상황은 ACK/NAK로 처리하지만, ACK나 NAK 자체가 손상되는 상황을 제대로 처리하지 못한다. sender가 손상된 feedback을 받으면 receiver가 data를 받았는지 받지 못했는지 알 수 없기 때문이다.

rdt 2.1은 이 문제를 해결하기 위해 data packet에 sequence number를 붙인다. sender가 같은 packet을 다시 보내더라도 receiver는 sequence number를 보고 "새 데이터"인지 "이미 처리한 데이터의 중복"인지 구분할 수 있다. 이 단계부터 신뢰적 전송에서 중복 전달 방지가 본격적으로 중요해진다.

rdt 2.1이 해결하려는 문제

문제rdt 2.0의 한계rdt 2.1의 보완
data packet 손상receiver가 NAK를 보내 재전송을 요청한다.동일하게 NAK를 사용한다.
ACK 손상sender가 성공 여부를 확정할 수 없다.sender가 재전송하고 receiver는 sequence number로 중복을 구분한다.
NAK 손상sender가 무엇을 해야 할지 애매하다.sender가 마지막 packet을 다시 보낸다.
중복 packetreceiver가 중복 데이터를 application에 넘길 위험이 있다.sequence number로 중복 packet을 폐기하고 ACK만 다시 보낸다.

사용하는 제어 정보

  • checksum: packet 또는 ACK/NAK가 손상되었는지 확인한다.
  • sequence number: 현재 data packet이 0번인지 1번인지 표시한다.
  • ACK: receiver가 현재 packet을 정상 처리했음을 알린다.
  • NAK: receiver가 손상된 packet을 받아 재전송이 필요함을 알린다.
  • sndpkt: sender가 재전송할 수 있도록 마지막으로 보낸 packet을 보관한 버퍼다.

Sender 상태: seq0 전송

sender는 application에서 데이터를 받으면 sequence number 0을 붙여 packet을 만들고, ACK 또는 NAK를 기다린다.

WAIT_DATA_0
 event:
 rdt_send(data)
 action:
 sndpkt = make_pkt(seq=0, data, checksum)
 udt_send(sndpkt)
 next:
 WAIT_ACK_OR_NAK_0

정상 ACK를 받으면 다음 데이터는 sequence number 1로 보내기 위해 상태를 바꾼다.

WAIT_ACK_OR_NAK_0
 event:
 rdt_rcv(rcvpkt) and notcorrupt(rcvpkt) and isACK(rcvpkt)
 action:
 none
 next:
 WAIT_DATA_1

NAK를 받거나 ACK/NAK packet 자체가 손상되면 sender는 마지막으로 저장한 sndpkt를 다시 보낸다.

WAIT_ACK_OR_NAK_0
 event:
 rdt_rcv(rcvpkt) and (corrupt(rcvpkt) or isNAK(rcvpkt))
 action:
 udt_send(sndpkt)
 next:
 WAIT_ACK_OR_NAK_0

Receiver 상태: seq0 대기

receiver가 seq0을 기다리는 상태에서 정상 seq0 packet을 받으면 data를 application에 넘기고 ACK를 보낸다.

WAIT_SEQ_0
 event:
 rdt_rcv(rcvpkt) and notcorrupt(rcvpkt) and has_seq(rcvpkt, 0)
 action:
 extract(rcvpkt, data)
 deliver_data(data)
 sndpkt = make_pkt(ACK, checksum)
 udt_send(sndpkt)
 next:
 WAIT_SEQ_1

packet이 손상되면 data를 넘기지 않고 NAK를 보낸다.

WAIT_SEQ_0
 event:
 rdt_rcv(rcvpkt) and corrupt(rcvpkt)
 action:
 sndpkt = make_pkt(NAK, checksum)
 udt_send(sndpkt)
 next:
 WAIT_SEQ_0

WAIT_SEQ_1 상태에서 seq0을 다시 받는다면 이미 처리한 packet의 중복이다. 이때 receiver는 data를 application에 다시 넘기지 않고 ACK만 재전송한다.

WAIT_SEQ_1
 event:
 rdt_rcv(rcvpkt) and notcorrupt(rcvpkt) and has_seq(rcvpkt, 0)
 action:
 udt_send(last ACK)
 next:
 WAIT_SEQ_1

정상 흐름

  1. sender가 application에서 data를 받는다.
  2. sender가 seq0, data, checksum을 담은 packet을 만든다.
  3. sender가 packet을 보내고 ACK/NAK for seq0을 기다린다.
  4. receiver가 정상 seq0 packet을 받는다.
  5. receiver가 data를 application에 전달한다.
  6. receiver가 ACK를 sender에게 보낸다.
  7. sender가 정상 ACK를 받으면 WAIT_DATA_1로 넘어간다.

ACK가 손상되는 경우

data packet은 정상 도착했고 receiver도 application에 data를 넘겼지만, ACK가 손상될 수 있다. sender는 ACK를 신뢰할 수 없으므로 seq0 packet을 다시 보낸다. receiver는 현재 seq1을 기다리는 상태인데 seq0이 다시 왔으므로 중복으로 판단한다. 그래서 data를 다시 넘기지 않고 ACK만 다시 보낸다.

sender sends seq0
receiver receives seq0 and delivers data
receiver sends ACK
ACK is corrupted
sender retransmits seq0
receiver detects duplicate seq0
receiver does not deliver duplicated data
receiver sends ACK again

NAK가 손상되는 경우

receiver가 손상된 data packet을 받아 NAK를 보냈는데, 이 NAK가 손상될 수도 있다. sender 입장에서는 손상된 feedback이므로 마지막 packet을 다시 보내는 것이 안전하다. receiver는 다시 받은 packet이 정상이라면 data를 전달하고 ACK를 보낸다. 다시 손상되어 있으면 NAK를 다시 보낸다.

rdt 2.1의 한계

rdt 2.1은 ACK/NAK 손상과 data packet 중복 문제를 처리할 수 있지만, packet loss는 아직 처리하지 못한다. data packet이나 ACK가 아예 사라지면 sender가 계속 기다릴 수 있다. 또 ACK와 NAK라는 두 종류의 feedback을 모두 사용하기 때문에 제어 메시지 종류가 많다. 이 중 NAK를 제거하고 ACK만으로 같은 의미를 표현한 것이 rdt 2.2다.

요약

  • rdt 2.1은 ACK/NAK가 손상되는 상황까지 고려한다.
  • data packet에 sequence number 0/1을 붙여 중복 packet을 구분한다.
  • sender는 손상된 feedback이나 NAK를 받으면 마지막 packet을 재전송한다.
  • receiver는 중복 packet을 application에 다시 전달하지 않고 ACK만 다시 보낸다.
  • loss 처리는 아직 없으며, timeout 기반 처리는 rdt 3.0에서 다룬다.
BGM EVER