RDT 2.0 동작 방식 정리

rdt 2.0의 동작 방식입니다. bit error, checksum, ACK/NAK feedback, sender 재전송 버퍼, ACK/NAK 손상 한계까지 정리했습니다.

RDT 2.0 동작 방식 정리

rdt 2.0은 하위 채널에서 packet loss는 없지만 bit error는 발생할 수 있다고 가정한다. rdt 1.0은 하위 채널이 완전히 신뢰적이라고 보고 별도의 오류 처리를 하지 않았지만, 실제 네트워크에서는 전송 중 bit가 손상될 수 있다. 그래서 rdt 2.0부터는 checksum과 receiver feedback이 필요해진다.

이 단계의 핵심은 receiver가 data packet을 검사하고, 정상 packet이면 ACK, 손상 packet이면 NAK를 sender에게 돌려보내는 것이다. sender는 NAK를 받으면 마지막 packet을 재전송해야 하므로 보낸 packet을 버퍼에 보관한다.

rdt 2.0의 가정

항목가정
data packet corruption발생할 수 있다. checksum으로 감지한다.
packet loss발생하지 않는다고 가정한다.
ACK/NAK corruption아직 고려하지 않는다. 이 한계가 rdt 2.1의 출발점이다.
feedbackACK와 NAK를 사용한다.
sequence number사용하지 않는다.

ACK와 NAK

  • ACK: acknowledgement. receiver가 packet을 정상적으로 받았다는 응답이다.
  • NAK: negative acknowledgement. receiver가 packet 손상을 감지했으므로 같은 packet을 다시 보내라는 응답이다.
  • checksum: packet 내용이 전송 중 손상되었는지 확인하기 위한 값이다.
  • sndpkt: sender가 재전송할 수 있도록 마지막으로 보낸 packet을 저장해 둔 값이다.

Sender 동작

sender는 application에서 data를 받으면 checksum을 붙인 packet을 만들고, unreliable channel로 보낸다. 보낸 뒤에는 바로 다음 data를 받지 않고 receiver의 ACK 또는 NAK를 기다린다.

WAIT_DATA
 event:
 rdt_send(data)
 action:
 sndpkt = make_pkt(data, checksum)
 udt_send(sndpkt)
 next:
 WAIT_ACK_OR_NAK

ACK를 받으면 전송이 성공한 것으로 보고 다시 application data를 기다린다.

WAIT_ACK_OR_NAK
 event:
 rdt_rcv(rcvpkt) and isACK(rcvpkt)
 action:
 none
 next:
 WAIT_DATA

NAK를 받으면 receiver가 data packet 손상을 감지한 것이므로 저장해 둔 sndpkt를 다시 보낸다.

WAIT_ACK_OR_NAK
 event:
 rdt_rcv(rcvpkt) and isNAK(rcvpkt)
 action:
 udt_send(sndpkt)
 next:
 WAIT_ACK_OR_NAK

Receiver 동작

receiver는 packet을 받으면 checksum으로 손상 여부를 판단한다. 손상되었으면 data를 application에 넘기지 않고 NAK를 보낸다.

WAIT_PACKET
 event:
 rdt_rcv(rcvpkt) and corrupt(rcvpkt)
 action:
 udt_send(NAK)
 next:
 WAIT_PACKET

손상되지 않았으면 data를 추출해 application에 전달하고 ACK를 보낸다.

WAIT_PACKET
 event:
 rdt_rcv(rcvpkt) and notcorrupt(rcvpkt)
 action:
 extract(rcvpkt, data)
 deliver_data(data)
 udt_send(ACK)
 next:
 WAIT_PACKET

손상 packet 처리 흐름

  1. sender가 data와 checksum을 담은 packet을 보낸다.
  2. 전송 중 bit error가 발생한다.
  3. receiver가 checksum mismatch를 감지한다.
  4. receiver는 data를 application에 전달하지 않는다.
  5. receiver가 NAK를 보낸다.
  6. sender는 NAK를 받고 마지막 packet을 다시 보낸다.
  7. 재전송 packet이 정상 도착하면 receiver가 data를 전달하고 ACK를 보낸다.

정상 packet 처리 흐름

  1. sender가 data packet을 보낸다.
  2. receiver가 checksum을 검사한다.
  3. 손상이 없으면 receiver가 data를 추출한다.
  4. receiver가 application에 data를 전달한다.
  5. receiver가 ACK를 보낸다.
  6. sender가 ACK를 받으면 다음 data를 받을 준비 상태로 돌아간다.

rdt 2.0의 결정적인 한계

rdt 2.0은 data packet의 손상은 처리할 수 있지만 ACK/NAK 자체가 손상되는 경우를 다루지 못한다. 예를 들어 receiver가 정상적으로 data를 받고 ACK를 보냈는데 ACK가 손상되면 sender는 이 feedback을 신뢰할 수 없다. sender가 재전송하면 receiver는 같은 data를 다시 받을 수 있는데, rdt 2.0에는 이것이 중복인지 구분할 sequence number가 없다.

따라서 rdt 2.0은 "bit error가 있는 채널에서 ACK/NAK가 왜 필요한가"를 보여주는 단계로 이해하면 좋다. 하지만 실전적인 신뢰적 전송으로 가려면 ACK/NAK 손상과 중복 packet 처리를 위한 sequence number가 필요하고, 그 보완이 rdt 2.1이다.

요약

  • rdt 2.0은 data packet의 bit error를 고려한다.
  • receiver는 checksum으로 packet 손상을 검사한다.
  • 정상 packet이면 ACK, 손상 packet이면 NAK를 보낸다.
  • sender는 NAK를 받으면 마지막 packet을 재전송한다.
  • ACK/NAK 손상과 중복 packet 문제는 아직 해결하지 못한다.
BGM EVER