1. RDT 2.1

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

2. RDT 2.0의 치명적인 오류

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

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

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

 -> ACK가 깨졌을 때??

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

 -> NAK가 깨졌을 때??

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

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

  : 그렇게 되면 Receiver는 중복된 packet을 받는다.

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

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

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

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

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

4. CASE 2

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

  : Receiver로부터 NAK 응답을 받게 된다.

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

  : 이 때는 NAK 응답이 손상된 상황이다.

4_1. Sender

 -> Wait for 0 call from above

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

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

 -> Event

  : udt_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_#) && corrupt(packet_#)

  : 하위 Layer로부터 Segment(packet_#)를 받는다.

  : Segment(packet_#)은 Bit Error가 발생했다는 것을 확인한다.

 -> Actions

  : packet_$ = make(NAK,checksum)

  : Sender로부터 받은 Segmnet(packet_#)에 Bit Error가 있기 때문에

  : 제대로 받지 못했다는 응답을 날리기 위해 NAK를 포함한 데이터를 보낸다. 

  : 또한, NAK의 훼손여부를 위한 checksum을 추가하여 Segment(packet_$)을 생성한다.

  : udt_send(packet_$)

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

 -> Wait for 0 call from below

  : 잘못된 packet이 왔기 때문에 다시 Sequence Number 0을 가진 Segment를 대기한다.

4_3. Sender

 -> Wait for 0 ACK or NAK

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

 ->Event

  : rdt_rcv(packet_$) && (corrupt(packet_$) || isNAK(packet_$))

  : ----------------------------------응답 packet이 제대로 가지 않은 경우

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

  : 그런데 두 가지 경우의 수가 발생한다. (CASE2는 둘 다 포함)

  : 첫번째는 응답 packet에 손상이 가는 경우

  : 두번째는 Bit Error에 해당하는 NAK 응답을 받는 경우

 -> Actions

 : udt_send(packet_#)

  : Buffer에 저장하고 있던 Segment(packet_#)를 하위 Layer에 보낸다.

 -> Wait for 0 ACK or NAK

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

  : 즉, 재전송을 했기 때문에 Segment(packet_#)에 대한 응답을 다시 기다리게 된다.

4_4. Receiver & Sender

 -> 재전송을 한 경 제대로 된 통신 한다면

  : CASE 1

 -> 다시 한 번 Bit Error가 발생하거나 응답 packet이 손상된 경우

  : CASE 2

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

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