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의 출발점이다. |
| feedback | ACK와 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_NAKACK를 받으면 전송이 성공한 것으로 보고 다시 application data를 기다린다.
WAIT_ACK_OR_NAK
event:
rdt_rcv(rcvpkt) and isACK(rcvpkt)
action:
none
next:
WAIT_DATANAK를 받으면 receiver가 data packet 손상을 감지한 것이므로 저장해 둔 sndpkt를 다시 보낸다.
WAIT_ACK_OR_NAK
event:
rdt_rcv(rcvpkt) and isNAK(rcvpkt)
action:
udt_send(sndpkt)
next:
WAIT_ACK_OR_NAKReceiver 동작
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 처리 흐름
- sender가 data와 checksum을 담은 packet을 보낸다.
- 전송 중 bit error가 발생한다.
- receiver가 checksum mismatch를 감지한다.
- receiver는 data를 application에 전달하지 않는다.
- receiver가 NAK를 보낸다.
- sender는 NAK를 받고 마지막 packet을 다시 보낸다.
- 재전송 packet이 정상 도착하면 receiver가 data를 전달하고 ACK를 보낸다.
정상 packet 처리 흐름
- sender가 data packet을 보낸다.
- receiver가 checksum을 검사한다.
- 손상이 없으면 receiver가 data를 추출한다.
- receiver가 application에 data를 전달한다.
- receiver가 ACK를 보낸다.
- 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 문제는 아직 해결하지 못한다.