본문 바로가기

ComputerScience/Network

컴퓨터통신 - 14. Sliding Window 프로토콜 구현 2

728x90

1. 자료구조

- SWPHdr이 헤더의 실체이다. 하위 계층으로 data를 보낼때 붙이는 그 헤더이다.

- 이 헤더가 두 node간의 peer to peer interface가 된다.

- 헤더는 당연히 송신자의 경우는 SeqNum, 수신자의 경우에는 AckNum를 알고 있어야한다.

- 보내는 header가 ack인지 data인지 type을 나타내는 flag를 사용한다.

- 송신, 수신자의 역할을 모두 포함할 수 있는 자료구조 형태이다.

- SwpState 윗부분이 송신자, 아랫부분이 수신자를 위한 코드이다.

- 송신자부터 살펴보면 sendQ에서 보낼 메시지와 타임아웃을 저장하고 있다. SWS크기만큼만 슬롯 공간이 있으면되기 때문에 크기가 정해진 원형큐로 구현되어있다.

- semaphore는 운영체제에서 접한적이 있을 것이다. window크기를 이미 다 쓰고 있다면 lfs가 증가할 수 없기 때문에 wait하는 동작이 구현되어야 한다. 나중에 ack가 도달하면 잠자던 lfs증가를 깨워준다.

- 이처럼 concurrency 구현을 위해 세마포어를 활용한다. 여러 쓰레드의 동기화를 위한 방법이다.

 

- 수신자입장을 살펴보자.

- 마찬가지로 RWS크기만큼 원형큐로 구현되어있고 수신받은 메시지 내용과 몇번 frame을 받았는지 표시하기 위한 int received가 있다. (out of order를 알 수 있게 해준다)

2. 송신자 동작 구현 : 상위계층에서 전송요청 받았을 때

- sendSWP가 procedure call 형태로된 service interface의 구체적인 예이다.

- 상위 계층으로부터 msg를 받으면 헤더를 추가해 하위 계층(LINK)으로 전달한다. msgAddHdr, send(LINK,frame)

 

-> semWait으로 쓸 수 있는 윈도우 공간이 있는지 wait하며 확인

-> LFS 증가

-> 헤더 붙이기

-> slot의 메시지를 재전송 버퍼에 저장, savecopy

-> timeout설정, timeout

-> 하위계층으로 전달

3. 송신자 동작 구현 : ACK가 왔을 때

- Ack를 받으면 바로 다음 frame을 보내주는 동작이다.

-> 하위 계층으로부터 ack가 오면(msg deliver) hbuf = msgStripHdr로 헤더를 떼어낸다.

-> ack인지 data를 담고있는 flag인지 확인, if()

-> lar을 한칸 전진

-> timeout을 취소하고

-> msgDestroy, 더이상 outstanding frame이 아니니까 이제 제거

-> window한칸을 늘릴 수 있다고 semSignal로 알려준다. 이 signal을 받아야 lfs가 전진할 수 있게 된다.

* 참고로 while문인 이유는 0, 1, 2를 보내고 ack3을 받았다면 0,1,2 모두 timeout을 제거해야 하기 때문이다.

4. 수신자 동작 구현 : 메시지 수신

- 첫부분이 받은 message들을 slot에 저장하는 동작을 수행한다.

- deliver를 통해 high layer로 msg를 올려준다. 수신한 연속된 frame들을 올려보내다. 펑크가 난 순간 멈춘다.

- 그럼 멈춘 순간의 위치로 ack를 보낼 준비를 하고

- 하위 계층으로 ack를 날린다. 

5. 순서번호 공간

- 오류제어를 위해서는 각각의 frame들을 식별하기 위한 순서번호가 매우 중요하다고 했다.
- header의 한정된 공간에 순서번호를 저장한다. 
- 너무 공간을 크게 잡으면 오버헤드가 되기 때문에 한정된 공간이 제공하는 번호를 순환하며 사용해야 한다.
- ex) 4비트 -> 0부터 15까지 돌아가면서 사용해야 한다.
- 그럼 적정한, 안전한 순서번호는 얼마일까? 그에 맞는 windowsize는 얼마가 되어야 할까?
- 이런 규칙이 필요하다.

- 안전을 위해서는 SWS <= 순서번호공간 크기 여야 하지만 이것만으로는 부족하다

- a의 경우는 pkt0을 수신자가 받았을 때 재전송된 0이다.

- 반면 b는 다음 두번째 pkt0을 보내고 수신자가 받은 것이다.

- 우리는 송신,수신 그림을 모두 보고있기 때문에 상황을 알 수 있지만 수신자 입장에서는 pkt0을 받았을 때 이게 재전송된건지, 다음번 pkt0인지 구분을 할 수가 없다.

- 이는 out of order receive를 하기 때문에 구별이 불가능한 것이다.

- 그래서 "SWS < 순서번호공간 크기 / 2" 규칙을 적용한다.

6. 동시 논리 채널

- sliding window protocol은 오류, 버퍼링, 순서문제를 한꺼번에 해결하고자 한다. 여기서 복잡성이 생긴다.

- 이 문제를 분리해서 해결하고자 하는 방식이다.

- 링크를 여러 논리 채널로 나누고 동시/다중 송신한다.

- swp처럼 한번에 전부다 채우는게 아니라 각각 pkt하나당 하나의 채널을 사용해서 각자 문제를 해결하는 방식이다.

728x90
반응형