1. RDT 1.0 ~ RDT2.2
-> RDT 1.0
: 완전 신뢰하는 통신
-> RDT 2.0
: 보내는 data에 Bit Error가 있는 통신
: Checksum을 통해 해결
-> RDT 2.1
: 응답 packet의 변형이 일어나는 경우
: 재전송을 했을 때, 중복packet이 발생하는 경우
-> RDT 2.2
: RDT 2.1과 같은 환경
: 다른점은, 응답 packet중에 ACK만 있는 경우
2. RDT 3.0
-> 새로운 가정을 추가한다.
-> Channel Error 또는 Packet Loss가 일어나는 경우
3, 새로운 접근방식
-> Sender는 합리적인 시간만큼 ACK를 기다린다.
-> 합리적인 시간만큼 ACK가 오지 않는 경우
: 재전송을 한다.
-> 만약, RTT가 합리적인 시간보다 길어진 경우
: 즉, ACK가 지연된 것이라면???
: Receiver는 중복된 packet을 받게된다.
: 중복제어는 이전에 배웠던 것으로 처리한다.
-> **** 합리적인 시간, 즉 Timer가 필요하다.****
4. Sender
-> Wait for 0 call from above
: 상위 Layer로부터, Sequence Number 0을 추가할 data를 대기한다.
-> Event
: rdt_send(data)
: 상위 Layer로부터, Message(data)를 받는다.
-> Actions
: packet_$ = make(0, data, checksum)
: 중복된 packet을 피하기 위한 Sequence Number 0을 추가
: Bit Error를 위한 checksum 추가하여 Segment(packet_$)를 생성한다.
: udt_send(packet_$)
: 하위 Layer로 Segment(packet_$)를 전송한다.
: start_timer
: 합리적인 시간을 위해(ACK를 기다리는 시간) Timer를 작동시킨다.
-> Wait for 0 ACK
: Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.
5. CASE 1
-> Receiver로부터 응답을 받았을 경우
-> Wait for 0 ACK
: Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.
-> Event
: rdt_rcv(rcvpkt) && corrupt(rcvpkt) || isACK(rcvpkt,1)
: Receiver로부터 응답 packet을 받았다.
: 응답 packet이 깨진 경우
: 제대로 된 응답 packet이 오지만 Sequence Number 1이 오는 경우
- 즉, 내가 기다리고 있는 응답 packet이 오지 않는 경우
-> Actions
: 내가 원한 응답이 아니기 때문에 아무것도 하지 않는다.
: Timer는 지속적으로 흘러가고 있다.
-> Wait for 0 ACK
: 내가 원하는 응답이 오지 않았기 때문에 계속 응답 packet을 대기한다.
6. CASE 2
-> 제대로 된 packet이 온 경우
-> Wait for 0 ACK
: Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.
-> Event
: rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)
: 하위 Layer로부터 Segment(rcvpkt)를 받는다.
: Segment는 손상되지 않았다.
: Sender가 대기하고 있던 Sequence Number 0에 대한 응답 packet을 받았다.
-> Actions
: stop_timer
: 정상적인 응답 packet을 받았으므로 timer를 종료한다.
-> Wait for 1 call from abve
: Sequence Number 0에 대한 처리는 끝났기 때문에 1로 돌아간다.
7. CASE 3
-> ACK가 훼손된 경우 && ACK 지연이 되는 경우
: 즉 Timer가 끝날때까지 응답 packet이 안오는 경우
-> Wait for 0 ACK
: Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.
-> Event
: Timeout
: start_timer에서 작동한 Timer가 중지된 상태이다.
-> Actions
: udt_send(packet_$)
: buffer에 저장되고 있던 Segment(packet_$)을 다시 재전송한다.
: start_timer
: 다시 ACK를 기다리기 위한(합리적인 시간)시간을 작동한다.
-> Receiver
: CASE3에서 Receiver는 중복된 packet을 받는 경우
: 마지막 수신한 Packet에 대한ACK를 보낸 Sequence를 담아서 보내준다.
-> Wait for 0 ACK
'Transport_Layer > $_RDT' 카테고리의 다른 글
9_RDT_2.2_CASE2 (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 |