본문 바로가기

ComputerScience/Network

컴퓨터 통신 - 12. 오류복구2

728x90

1. Sliding Window

- stop&wait 방식에서의 단점은 ack가 오는 시간동안 일을 하지 않는다는 것이다.

- 아직 ack를 받지 않은 상태에서 보내지는 프레임을 outstanding frame이라고 한다. 위 그림에서는 frame 0 이 여기에 해당한다.

- 그러면 이 outstanding frame을 복수개 사용해서 전달하면 어떨까?

- 무작정 무한대로 개수를 늘리는 건 아니고 제한된 window size만큼만 늘린다. 

 

- 즉 그림처럼 복수개의 frame을 연속으로 날리는 것이다. 

- stop&wait과 마찬가지로 각각의 frame#에 해당하는 ack#를 받아서 오류를 처리한다.

* 그림에서는 수신받은 frame마다 ack를 보내지만 세개의 frame을 다 받고 한번에 ack를 보내도록 할 수도 있다. 

- 이 방식으로 파이프의 사용 효율을 높일 수 있지만 주 목적이 오류 제어라는 사실을 잊어서는 안된다.  (오류 제어 프로토콜이다)

- ack를 받고 다음 메시지가 전달되는 순간을 살펴보자.

- frame 0를 보낸다. -> 수신자가 frame 0를 받고 ack 0 를 보낸다. -> 송신자가 ack0을 받는 순간 window size는 하나가 줄었으니(하나의 프레임이 전송완료기 때문에 더 이상 outstanding frame이 아니다) 다음 frame3을 보낸다.

- 즉 사용 효율은 3*t(frame) / {t(frame) + 2*t(prop)} 이 된다.

- 오류가 발생하지 않은 상황을 가정해서 송신자와 수신자의 입장을 살펴보면 위와 같다.

- 순서번호를 붙이는 규칙이나 frame들을 다 받고 ack를 보내거나 등은 정하기 나름이다.

Source System A
1. 0-6 프레임을 전송할 수 있다. window size는 7이다. 
2. f0,1,2,를 보낸 후의 모습
3. ack3를 받은 모습
4. f3,4,5,6을 보낸 후의 모습
5. ack4를 받은 모습
Source System B
1. 초기 상태
2. 0,1,2를 받은 상태
3. ack3를 날릴때 상태 (3번 달라는 소리)
4. f3 받았을 때 모습 & 바로 ack4를 보낼 때 모습
5. f6까지 받았을 때 직후 모습

2. Sliding Window 오류 복구 

- stop&wait 처럼 버퍼와 타임아웃을 활용하여 재전송으로 오류를 복구한다.

- Go-Back-N, Selective-Repeat 두가지 방법이 있다.

3. Go-Back-N

- 오류가 발생한 지점부터 새 출발

- ack0,1까지는 잘 전송되었는데 ack2가 전송중에 유실된 상황이다. 

- ack2를 기다리는 time-out범위 내에 ack2가 도달하지 않았기 때문에 송신자는 2번부터 다시 전송한다.

- go-back-n에서는 ack2라고 하면 2번까지는 잘 받았다(cumulative ack) 라는 뜻이다.

 

- 만약 수신자 쪽에서 f0, 1, 2, 3이 순서대로 도달해야하는데 2번만 오류가 발생했다면, 이런 상황을 out of order frame이라고 한다.

- 이 out of order frame을 처리하는 방식에 따라 다양한 구현이 가능하다. 

- 오류가 발생한 프레임 2에 대해서 ack를 "안보냄/ 보낸다" 할 수도 있고 

- 그동안 정상적으로 받은 0, 1, 3을 "버린다/ 안버리고 저장한다." 할 수도 있다.

- 구현이 어떻든 결국은 기본적으로 cumulative ack를 사용하기 때문에 그 다음 번호부터 다시 보내주게 된다.

- 2번이 timeout안에 도달하지 못했기 때문에 2부터 다시 보낸다.

- 위 그림에서는 pkt3를 받았지만 pkt2번을 아직 받지 못했기 때문에 가장 최근까지 순서대로 받은 ack1을 보내게 된다. (중복 ack)

- 이렇게 해야 송신자가 1번까지는 out of order frame이 발생하지 않았음을 알 수 있다.

- pkt2를 다시 보낼때 2부터 5까지 다시 묶어서 한방에 보낼수도 있지만 그냥 2만 보낼 수도 있다. 왜냐하면 어차피 pkt3 timeout도 걸려있기 때문에 이어서 pkt3을 보내게 되어있다.

4. Selective-Repeat

- 오류가 발생한 프레임만 재전송

- 부하가 더 적지만 구현이 어렵다.

- ack0,1까지는 잘 전송되었는데 ack2가 전송중에 유실된 상황이다.

- ack2를 기다리는 time-out범위 내에 ack2가 도달하지 않았기 때문에 송신자는 2번을 보낸다. 뒤이어 ack3, 4...들이 수신될 수 있다.

- go-back-N과는 달리 cumulative ack(누적ack)를 사용하지 않는다.

- 송신자는 수신자가 어느 pkt들을 받은 상태인지 알아야 하기 때문에 개별(individual)/선택(selective) ack를 사용한다.

- ack3라면 3번은 받았다는 뜻이다.

- 수신쪽에서는 반드시 buffering으로 받은 frame들을 저장해야 하고

- pkt 2 timeout안에 ack2가 도달하지 않았기 때문에 2번만 다시 보내준다. 그 다음은 ack4가 도달했으니 6번을 보내고 ack5도 도달했으니 ptk7을 보낸다.

- Out or order frame이 완성되면 버퍼를 비우고 전달하게 된다.

728x90
반응형