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 |