1. 프로토콜 구현
- 오류제어 이전까지는 NIC같은 어댑터에서 하드웨어로 구현하였다.
- 오류제어는 소프트웨어로 구현된다.
- 송신자, 수신자의 서로 다른 쓰레드가 concurrent를 유지하면서도 distributed한 program으로 구현되어야 한다.
2. 슬라이딩윈도우(GoBackN)
- 여러가지 파생 버전이 있지만 우리가 구현할 알고리즘을 먼저 정리하자.
- 송신자가 Fi를 보내면 수신자는 Ack(i+1)을 보낸다고 하자.
- 송신자는 복수개의 frame을 보냈다는 신호를 보낸다.
- 수신자는 F2까지 받았으니 ack3을 보내서 F3번을 달라는 신호를 보낸다.
3. 송신자 알고리즘
- 각 프레임에 순서번호를 할당해야 하고
- 윈도우크기는 SWS로 상수로 정해준다.
- 현재 윈도우의 시작과 끝을 가리키는 포인터 LAR, LFS가 존재한다. 항상 그 거리가 SWS를 넘지 않도록 한다.
- LAR 왼쪽은 이미 전송을 완료해서 더이상 outstanding frame들이 아니다.
- LAR, LFS사이의 frame들이 아직 전송완료를 장담할 수 없는 outstanding frame들이다. 버퍼에 담아놓고 혹시모를 상황들에 대비를 해야한다.
- LFS 오른쪽은 아직 보내지도 않은 frame들이다.
- LFS부터 SWS범위 끝까지가 윈도우가 가리키는 영역이 된다.
1. 송신자 입장에서는 high-level에서 보낼데이터가 생겼다 하면 데이터를 보내는 일을 시작한다.
-> LFS하나 증가, 증가가 불가능하면 wait
-> 타임아웃 설정
-> 프레임 전송
2. ack가 도달하면 다음 데이터를 보내기 위해 일을 시작한다.
-> 타임아웃 해지
-> LAR증가
-> sws가 하나 증가하면 새로운 전송이 가능하게 된다.
3. timeout이 발생하면 다시 재전송을 위해 일을 시작한다.
-> 타임아웃 다시 설정
-> 프레임 재전송, buffer에 담아뒀던 녀석들을 다시 보내는 것.
4. 수신자 알고리즘
- GoBackN중에 Out-of-order 프레임을 저장하는 알고리즘을 구현할 것이다.
- 마찬가지로 수신창의 크기를 상수로 나타내는 RWS가 있다
- 수신이 예상되는 프레임을 가리키는 포인터 NFE, 수신이 가능한 마지막 프레임을 가리키는 LFA가 있다.
- i를 받았으면 ack(i+1)을 보내야 하기 때문에 next frame expected라고 한다. 즉 NFE왼쪽까지는 이미 잘 받았다는 뜻이다. NFE부터 오른쪽으로가 받을 예정인 프레임들이다.
- NFE와 LFA사이까지 도착하는 순서가 다르더라도 받을 수 있는 공간이다.
- out of order방식이기 때문에 2번을 못받고 3번을 받았더라도 3번을 버퍼에 저장한다. 최대 윈도우사이즈 RWS범위 내에서 저장할 수 있다.
- NFE는 2번을 못 받았으니 3번을 받았더라도 2번을 가리키고 있게 된다.
1. 수신자는 프레임이 도착할때만 일을 시작한다.
-> seqNum을 받으면 NFE, LFA범위 안에 있는지 확인하고 받아들인다. 송수신자의 윈도우크기가 다를 수도 있고 항상 수신자는 자신의 윈도우 크기에 맞는지를 확인한다.
-> 범위를 벗어나면 그냥 오는 내용을 버린다. 단 seqNum <NFE의 경우는 ACk를 보낸다. 내가 이전에 보낸 ack가 도달이 안됐을 수도 있기 때문이다.
-> 올바른 버퍼구간에 도달하면 중간에 구멍이 없는 연속된 버퍼의 내용들만 상위계층으로 전달해주고 누적 ack를 송신자에게 보낸다.
'ComputerScience > Network' 카테고리의 다른 글
컴퓨터통신 - 15. 이더넷(유선LAN) (0) | 2021.11.03 |
---|---|
컴퓨터통신 - 14. Sliding Window 프로토콜 구현 2 (0) | 2021.11.03 |
컴퓨터 통신 - 12. 오류복구2 (0) | 2021.10.25 |
컴퓨터 통신 - 11. 오류 복구 (0) | 2021.10.12 |
컴퓨터통신 - 10. Framming, 오류검출 (0) | 2021.10.12 |