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 3
-> Bit Error가 없는 Segment를 받았을 경우를 본다.
: Receiver로부터 ACK 응답을 받게 된다.
-> 응답 packet에 손상이 있는 경우를 본다.
: 이 때, ACK 응답이 손상된 상황이다.
-> 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 or NAK
: Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.
4_2. Receiver
-> Wait for 0 call from below
: 하위 Layer로부터 Sequence Number 0을 가진 Segment를 기다린다.
-> Evenet
: rdt_rcv(packet_%) && notcorrupt(packet_%) && has seq0(packet_%)
: 하위 Layer로부터 Segment(packet_%)을 받는다.
: Segment(packet_%)는 Bit Error가 발생하지 않았다는 것을 확인한다.
: 해당 Segment(packet_%)는 Sequence Number 0을 가진 것을 포함한다.
-> Actions
: packet_^ = make(ACK,checksum)
: 하위 Layer로 보낼 Segment(packet_^)를 생성한다.
: Sender에서 보낸 packet을 잘 받았다는 것에 대한 응답(ACK)을 하는 것이다.
: 또한, ACK의 훼손여부를 위한 checksum을 추가하여 Segment(packet_^)을 생성한다.
: udt_send(packet_^)
: 하위 Layer로 Segment(packet_^)을 전송한다.
-> Wait for 1 call from below
: 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.
: CASE2와는 다르다.
4_3. Sender
-> Wait for 0 ACK or NAK
: Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.
-> Event
: ----------------------------------응답 packet이 제대로 가지 않은 경우
: rdt_rcv(packet_^) && (corrupt(packet_^ || isACK(packet_^))
: 하위 Layer로부터 Segment(packet_^)를 받는다.
: 그런데 두 가지 경우의 수가 발생한다. (CASE3은 1번 포함)
: 첫번째는 응답 packet에 손상이 가는 경우
: 두번째는 Bit Error에 해당하는 NAK 응답을 받는 경우
-> Actions
: 해당 경우에는, Sender가 보낸 packet을 Receiver가 잘 받았음에도 불구하고
: ACK를 담은 packet이 손상되어서 알아 볼 수 없기 때문에
: udt_send(packet_%)
: Sender는 Buffer에 있는 Segment(packet_%)를 재전송을 하게 된다.
-> Wait for 0 ACK or NAK
: Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.
4_4. Receiver
-> Wait for 1 call from below
: 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.
: -----------------------------------------중복되는 상황을 보여주는 경우
: Receiver는 Sequence Number 0을 가진 Segment에 대한 응답 packet을 보냈기 때문에
: Sequence Number 1를 기다리고 있는 Event가 발생한다.
-> Event
: rdt_rcv(packet_$) && notcorrupt(packet_$) && has seq0(packet_$)
: 해당 Segment(packet_$)는 Sequence Number 0을 가진 packet이므로
: Receiver는 중복을 제어해야 한다.
: 이는 Sequence Number를 보고 판단하는데 내가 원하는 것은 1이기 때문에
: 0으로 들어온 해당 packet은 버린다.
-> Actions
: packet_& = make(ACK, checksum)
: 하위 Layer로 보낼 응답 Segment(packet_&)를 생성한다.
: 받은 packet은 버리지만, 해당 packet에 대한 응답 packet은 해준다.
: udt_send(packet_&)
: 하위 Layer로 응답 Segment(packet_&)를 전송한다.
-> Wait for 1 call from below
: 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.
4_5. Sender & Receiver
-> 다시 보냈을 때 응답 packet에 손상이 없고 제대로 된 통신을 한다면
: CASE 1
-> 다시 보냈을 떄 응답 packet에 손상(ACK 손상)이 된 경우
: CASE 2