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하나당 하나의 채널을 사용해서 각자 문제를 해결하는 방식이다.
'ComputerScience > Network' 카테고리의 다른 글
컴퓨터통신 - 16. 토큰링, 무선랜 (0) | 2021.11.10 |
---|---|
컴퓨터통신 - 15. 이더넷(유선LAN) (0) | 2021.11.03 |
컴퓨터통신 - 13. Sliding Window 프로토콜 구현 1 (0) | 2021.11.03 |
컴퓨터 통신 - 12. 오류복구2 (0) | 2021.10.25 |
컴퓨터 통신 - 11. 오류 복구 (0) | 2021.10.12 |