1. RDT 2.1

 -> RDT 2.0에는 치명적인 오류가 있다.

2. RDT 2.0의 치명적인 오류

 -> ACK/NAK가 깨졌을 때??

  : Receiver가 보낸 응답 packet에 손상이 있을 때는 어떻게 할 것인가??

  : Sender가 보낸 packet이 잘 받아졌는지 아닌지 알 수 없다.

 -> ACK가 깨졌을 때??

  : Sender는 다음 packet을 보내야할지 말아야할지 구별할 수 없다.

 -> NAK가 깨졌을 때??

  : Sender는 재전송을 해야할지 말아야할 지 구별할 수 없다.

 -> 응답 packet이 변형되면 Sender는 재전송하는 경우가 발생한다.

  : 그러면 Receiver는 중복된 packet을 받는다.

3. 치명적인 오류 해결방법

 -> ACK와 NAK에도 checksum을 통해 해결한다.

 -> 만약 Receiver에서 똑같은 packet을 받았을 때

  : Sender는 packet에 Sequence Number를 추가하여

  : Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.

4. CASE 1

 -> Bit Error가 없는 Segment를 받았을 경우를 본다.

 -> 응답 packet 손상이 없는 경우를 본다.

4_1. Sender

 -> Wait for 0 call from above

  : 현 상태는, 상위 Layer로부터 Data를 받기 위해 대기하는 단계이다.

  : Sequence Number 0을 추가할 Data를 대기하는 것이다.

 -> Event

  : rdt_send(data)

  : 상위 Layer로부터 Data를 받는다.

 -> Actions

  : packet_! = make(0,data,checksum)

  : 하위 Layer로 보낼 Segment(packet_!)을 생성한다.

  : Packet의 중복을 피하기 위한 Sequence Number 0

  : Bit Error를 판별하기 위한 Checksum을 추가하여 생성한다.

  : udt_send(packet_!)

  : 하위 Layer로 Segment(packet_!)을 전송한다.

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_!)에 대한 응답을 기다린다.

4_2. Receiver

 -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기하는 단계이다.

 -> Event

  : rdt_rcv(packet_!) && notcorrupt(packet_!) && has seq0(packet_!)

  : 하위 Layer로부터 Segment(packet_!)을 받는다.

  : Segment(packet_!)는 Bit Error가 발생하지 않았다는 것을 확인한다.

  : 해당 Segment(packet_!)는 Sequence Number 0을 가진 것을 확인한다.

 -> Actions

  : extract(pakcet_!,data)

  : Segment(packet_!)에 아무 문제가 없기 때문에 Message(data)를 추출한다.

  : deliver_data(data)

  : 추출한 Message(data)를 상위 Layer로 전송한다.

  : packet_@ = make(ACK, checksum)

  : Sender에서 보낸 Segment(packet_!)을 잘 받았다는 응답을 보내야 한다.

  : ACK 응답과 ACK의 훼손여부를 위한 checksum을 추가하여 Segment(packet_@)를 생성한다.

  : udt_send(packet_@)

  : Segment(packet_@)를 하위 Layer로 전송한다.

 -> Wait for 1 call from below

  : 하위 Layter로부터 Sequence Number 1을 가진 Segment를 대기하는 단계이다.

  : 앞에서 Sequnece Number 0의 작업이 모두 끝났기 때문이다.

4_3. Sender

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_!)에 대한 응답을 기다린다.

 -> Event

  : ----------------------------------응답 packet이 제대로 간 경우

  : rtd_rct(packet_@) && notcorrupt(packet_@) && isACK(packet_@)

  : 데이터의 손상도 가지 않고, ACK를 포함한 Segment(packet_@)를 받는다.

 -> Actions

  : 잘 받았기 때문에 아무런 행동을 취하지 않아도 된다.

 -> Wait for 1 call from above

  : Sequence Number 0에 대한 packet 처리를 모두 종료되었기 때문에

  : 상위 Layer로부터 Sequence Number 1을 추가할 data를 대기하는 단계이다.

'Transport_Layer > $_RDT' 카테고리의 다른 글

7_RDT_2.1_CASE3  (0) 2014.02.14
6_RDT_2.1_CASE2  (2) 2014.02.14
4_RDT_2.0_CASE2  (0) 2014.02.14
3_RDT_2.0_CASE1  (0) 2014.02.14
2_RDT_1.0  (0) 2014.02.14
Posted by 훈승오승훈
l