1. RDT 2.1
-> RDT 2.0에는 치명적인 오류가 있다.
2. RDT 2.0의 치명적인 오류 & 해결
-> ACK와 NAK가 깨졌을 때??
: ACK와 NAK에도 checksum을 통해 해결한다.
-> 즉, 응답 packet의 변형이 발생하면 Sender는 재전송하게 된다.
: 그런데 Receiver가 보낸 응답 packet이 ACK였다면??
: Sender는 Receiver가 받은 이전 packet을 재전송을하게 되면서
: Receiver는 중복된 packet을 받는다.
-> 중복된 packet을 구별하기 위해서
: Sender는 packet에 Sequence Number를 추가하여
: Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.
3. RDT 2,2
-> RDT 2.1과 똑같은 상황이다.
-> 차이점은 NAK packet이 없는 RDT이다.
4. CASE 2
-> Bit Error가 있는 Segment를 받았을 경우를 본다.
: Receiver로부터 ACK 응답을 받게 된다.
-> Wait for 0 call from below 상태에서
: 중복 Pakcet을 받았을 경우이다.
-> Wait for 0 ACK 상태에서
: 응답 packet이 이전 Sequence Number 정보를 담고있는 경우를 본다.
: 즉, Sender가 보낸 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
: 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_#) || has seq1(packet_#)
: 하위 Layer로부터 Segment(packet_#)을 받는다.
: 해당 packet이 훼손되어 알아 볼 수 없게 되는 경우
: 또는, 받은 packet이 Sequence Number 1일 경우
: 이전에 통신이 이루어져 있을 때, 이전 Sequence Nubmer가 1인 경우
: 즉, 중복된 packet이 들어올 때 하는 방법
-> Actions
: packet_$ = make(ACK1, checksum)
: 첫 data부터 오류시 : 하위 Layer로 보낼 응답 packet을 생성한다.
: 그 다음, Wait for [이전 Sequence Number] from below에서 만들었던 응답 packet
: 이는 처음에 생성해 놓고 다음 packet이 정상적으로 들어올 때 까지 buffer에 저장한다.
: udt_send(packet_$)
: 하위 Layer로 Segment(packet_$)를 보낸다.
-> Wait for 0 call from below
: 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기하는 단계이다.
4_3. Sender
-> Wait for ACK 0
: Sequence Number 0을 가진 Segment에 대한 응답을 기다린다.
-> Event
: rdt_rcv(packet_$) && corrupt(packet_$) || isACK(packet_$,1)
: 하위 Layer로부터 Segment(packet_$)을 받는다.
: 응답 packet을 못 알아보는 경우
: 응답 packet을 확인한 결과, 이전 Sequence Number가 있는 경우
-> Actions
: udt_send(packet_#)
: 해당 Buffer에 저장되어 있던 이전 Segment(packet_#)를 재전송하게 된다.
4_4. Receiver & Sender
-> 재전송을 한 경우 제대로 된 통신을 한다면
: CASE 1
-> 다시 Bit Error가 발생, 응답 packet이 손상, 중복딘 packet을 받는 경우
: CASE 2
'Transport_Layer > $_RDT' 카테고리의 다른 글
10_RDT_3.0 (0) | 2014.02.17 |
---|---|
8_RDT_2.2_CASE1 (1) | 2014.02.17 |
7_RDT_2.1_CASE3 (0) | 2014.02.14 |
6_RDT_2.1_CASE2 (2) | 2014.02.14 |
5_RDT_2.1_CASE1 (0) | 2014.02.14 |