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이 완성되면 버퍼를 비우고 전달하게 된다.
'ComputerScience > Network' 카테고리의 다른 글
컴퓨터통신 - 14. Sliding Window 프로토콜 구현 2 (0) | 2021.11.03 |
---|---|
컴퓨터통신 - 13. Sliding Window 프로토콜 구현 1 (0) | 2021.11.03 |
컴퓨터 통신 - 11. 오류 복구 (0) | 2021.10.12 |
컴퓨터통신 - 10. Framming, 오류검출 (0) | 2021.10.12 |
컴퓨터 통신 - 9. Modulation (디지털데이터->디지털신호) (0) | 2021.10.12 |