Reliable data transfer (rdt 1.0/3.0)
1. Reliable Data Transfer
신뢰성 있는 데이터 교환(이하 RDT)은 한마디로 "송/수신하는 데이터가 오류없이 온전히 전송되는 것" 이다.
Transport Layer 에서는 신뢰성 있는 데이터 교환을 하고싶어 하지만, 그 아래의 레이어에서는 신뢰성을 보장할 수 없기 때문에 신뢰성 있는 통신에 문제가 생길 수 있다.
이러한 문제상황 속에서 Transport Layer 에서 적용 가능한 방식이 바로 RDT 프로토콜을 이용하는 것이다. 아래 그림을 살펴보자.
우선 패킷을 송신하는 경우,
상위레이어에서 보내려는 데이터가 있을 경우 rdt_send() 시스템 콜을 호출하여 RDT 프로토콜로 전송한다.
RDT 프로토콜에서 신뢰할 수 없는 채널인 하위 레이어로 보낼 때 udt_send() 를 호출해 패킷을 전송한다.
또한 패킷을 수신하는 경우,
하위 레이어에서 보내려는 패킷이 있을 경우 rdt_rcv() 시스템 콜을 호출하여 RDT 프로토콜로 전송한다.
RDT 프로토콜에서 상위 레이어로 데이터를 보낼 경우 deliver_data() 를 호출해 데이터를 전송한다.
이처럼 데이터는 프로토콜 레이어들끼리 상호작용하며 전달된다. 이렇게 상호작용하는 과정을 설명하기 위해서 FSM을 활용하는데 자세히 알아보자.
2. FSM(Finite State Machine)
FSM(Finite State Machine)은 유한한 개의 상태(state)가 존재할 때, 어떠한 상태(state)가 다른 상태(state)로 변화할 때 생기는 일을 event와 action으로 나누어 설명하는 방식이다.
여기서 event는 상태를 변화시키는 원인이 되는 일을 말하고, action은 상태가 변화하며 생기는 변화를 말한다.
예를들어 고등학생이 대학생이 될 때, event는 '대학교에 입학을 함' 이 되고, action은 '등록금을 내고, 등교를 함' 이 되는 것이다. (올바른 예인지는 잘 모르겠다;;)
아무튼 FSM을 위와 같이 그림으로 표현할 수 있는데, state가 변할때 직선을 긋고 직선 위에는 event를, 아래는 action을 적어주는게 국룰이다.
3. rdt 1.0
그럼 앞서 살펴본 RDT를 FSM을 이용해 나타내보자.
먼저 네트워크의 모든 채널이 완벽하게 신뢰성 있다고 가정할때이다. 이를 FSM으로 나타내보면 아래 그림과 같다.
이처럼 네트워크의 모든 채널이 완벽하게 신뢰성 있을 경우 간단하게 나타낼 수 있는데, 이를 rdt 1.0 모델이라고 한다. 데이터 손상이나 손실의 우려가 없는 네트워크에서 사용할 수 있는 모델이다.
이 외에도 rdt 2.0, rdt 2.1, rdt 2.2 모델 등이 존재하지만, 모든걸 다 살펴보기엔 지치므로 바로 rdt 3.0을 살펴보자
4. rdt 3.0
rdt 3.0 모델은 데이터 전송 과정에서 다음과 같이 여러가지 문제가 발생할 수 있다고 가정한다.
1) 전송 도중에 flip bit, 즉 데이터가 손상되는 경우가 발생할 수 있다.
- bit의 에러를 탐지하기 위해서 checksum을 이용한다.
- checksum을 통해 에러를 탐지하면 기본적으로 재전송을 요청한다.
- 수신자는 패킷이 손상되었으면 송신자에게 이를 알려주고, 손상되지 않았으면 ACK을 보낸다.
2) 전송 도중에 패킷이 유실될 수 있다.
- 모종의 이유로 데이터 패킷이나 ACK이 유실될 수 있다.
- 유실되는 패킷을 확인하고 처리하기 위해 ACK, sequence number를 활용한다.
결론적으로, rdt 3.0 에서 이러한 문제들을 해결하기 위한 방법은 다음과 같다.
송신자가 데이터를 전송하고 일정 시간을 기다린다. 만약 시간 내에 올바른 ACK이 안오면 재전송 한다.
결국 위의 파란색 한줄이 rdt 3.0의 전부이다. rdt 3.0의 sender 측을 FSM으로 나타내면 아래 그림과 같다.
우선 위의 그림에서 검은색 글씨들은 올바르게 패킷들이 교환되었을 경우이다. 이 경우 호출된 함수를 정상적으로 수행하게 된다.
위의 그림에서 빨간색 글씨들은 패킷 전송 과정에서 무언가 문제가 발생한 것이다. 패킷이 손상되었거나(corrupt), 손실되었을 때(wrong ACK) 그냥 이를 무시한다. 그러면 결국 timeout이 발생해 재전송을 하게 된다.
다음으로 rdt 3.0의 receiver 측을 FSM 모델로 나타내보면 아래 그림과 같다.
우선 위의 그림에서 검은색 글씨들은 올바르게 패킷들이 교환되었을 경우이다. 이 경우 호출된 함수를 정상적으로 수행하게 된다.
위의 그림에서 빨간색 글씨들은 패킷 전송 과정에서 receiver가 보낸 ACK이 sender에게 제대로 가지 않아 문제가 발생한 경우이다. 이 경우 다시 ACK을 만들어 sender에게 재전송 해주어야 한다.
rdt 3.0 모델은 패킷이 유실된 경우, ACK이 유실된 경우, 유실되지는 않았지만 timeout이 발생한 경우 등 여러가지 변칙적인 상황을 모두 커버할 수 있어서 굉장히 완성도 높은 모델이라고 할 수 있다.
특히 패킷을 보내고 ACK이 올때까지 대기하는 양상을 보이는데, 이를 stop-and-wait Operation 이라고 한다. 이러한 대기하는 성질(?) 때문에 한편으로는 효율성이 낮다고 볼 수 있다. 이러한 문제는 pipelining을 통해 극복할 수 있는데, 자세한건 다음에 알아보자.
rdt 3.0의 경우 FSM 그림이 굉장히 복잡해 보인다. 하지만 차근차근 그 뜻을 헤아려보며 분석해보면 원리는 간단하다는 것을 알 수 있다.
배운 내용을 정리해보면,
1. Transport Layer에서 신뢰성 있는 데이터 교환을 위해 RDT 프로토콜을 이용한다.
2. RDT 프로토콜을 이용하기 위해 여러가지 시스템콜을 활용할 수 있다.
3. FSM 은 상태 변화와 그에 따른 event, action을 설명하는 모델이다.
4. 신뢰 가능한 환경에서의 rdt 1.0 모델과, 신뢰 불가능한 환경에서의 rdt 3.0 모델이 있다.
위 내용은 공부하며 작성한 것으로, 오류가 있을 수 있습니다.