Slow is better than NOTHING

Computer Science/3. Network

신뢰적인 데이터 전송 - RDT 1.0/2.0/3.0

Jeff_Kang 2019. 5. 18. 11:10
반응형

 

 

◎ 신뢰적인 데이터 전달 프로토콜의 구축

 

 완전히 신뢰적인 데이터 전송 프로토콜에 도달하기 위해 조금씩 복잡해지는 일련의 프로토콜을 소개한다.

 

1. 완벽하게 신뢰적인 채널 상에서의 신뢰적인 데이터 전송 : rdt 1.0

 먼저, 하위 채널이 완전히 신뢰적인 가장 간단한 경우를 고려한다. 프로토콜 자체는 단순하며, rdt(reliable data transfer) 1.0이라 부르겠다. rdt 1.0은 송신자와 수신자에 대한 유한상태 머신(Finite-State Machine, FSM) 이다.

 

 위의 Figure 3.9(a) 는 송신자의 동작을 정의하고, 3.9(b) 는 수신자의 동작을 정의한다. 송신자에 대해 그리고 수신자에 대해 분리된 FSM이 있다는 것에 유의해야한다. 변화를 일으키는 Event에 대해서는 평행선 위에 나타낸다. (rdt_send, rdt_rcv) Event에 의해 송신자는 패킷을 생성하고(make_pkt), 패킷을 수신자에게 전송한다.(udt_send), 수신자는 패킷을 받으면 데이터를 추출하고(extract) 데이터를 상위 계층으로 전달한다(deliver_data)

이러한 간단한 프로토콜에서는 데이터 단위와 패킷 단위의 차이점이 없다. 또한 모든 패킷의 흐름은 송신자로부터 수신자까지이다. 즉, 완전히 신뢰적인 채널에서는 오류가 생길 수 없으므로 어떠한 FeedBack도 필요치 않다. 

 

 

2. 비트오류가 있는 채널 상에서의 신뢰적 데이터 전송 : rdt 2.0

 

 하위 채널의 더 실질 모델은 패킷 안의 비트들이 하위 채널에서 '손상' 되는 모델이다. 이러한 비트 오류는 패킷이 전송 또는 전파되거나 버퍼링될 때 네트워크의 물리적 구성 요소에서 일반적으로 발생한다. 

rdt 2.0에서는 데이터 채널의 비트 오류를 확인하기 위해 긍정 확인응답(Posivie acknowledgment)부정 확인응답(Negative acknowledgment) 을 사용한다. 이러한 제어 메세지는 정확하게 수신되었는지 또는 잘못 수신되어 반복이 필요한지를 수신자가 송신자에게 알려 줄 수 있게 한다. 컴퓨터 네트워크 설정에서 이러한 재전송을 기반으로 한 신뢰적 데이터 전송 프로토콜을 자동재전송요구(Automatic Repeat reQuest, ARQ protocol) 프로토콜이라고 한다.

 

비트 오류를 처리하기 위해 기본적으로 다음과 같은 세 가지 부가 프로토콜 기능들이 ARQ에 요구된다.

 

 1) 오류 검출 : 비트 오류가 발생했을 때, 수신자가 검출할 수 있는 기능이 필요하다. UDP는 이러한 목적을 위해 CheckSum Field를 사용한다. 이러한 기술은 수신자가 오류를 검출하고 복구할 수 있도록 해준다. 

 

 2) 수신자 피드백 : 일반적으로 네트워크에서 송신자와 수신자는 충분히 먼 거리에서 서로 다른 End-point에서 통신하므로 패킷이 정확하게 수신되었는지 알기 위한 방법은 End-Point로 부터의 확인 응답 즉, FeedBack이 있어야한다. 메시지 응답 시나리오에서 긍정 또는 부정 확인응답은 그러한 FeedBack의 일종이다. 원칙적으로 이러한 패킷은 단지 1bit이면 된다. 예를 들면, 0은 NAK(Negative Acknowlegment), 1은 ACK(Positive Acknowlegment)를 가리킬 수 있다.

 

 3) 재전송 : 수신자에서 오류를 가지고 수신된 패킷은 송신자에 의해서 재전송 된다.

 

 

rdt 1.0과 달리 2.0에서는 송신자 측이 2개의 FSM을 가진다. 왼쪽에 나타난 상태에서 송신 측 프로토콜은 상위 계층으로 부터 데이터가 전달되기를 기다린다. rdt_send() Event가 발생하면 송신자는 패킷 CheckSum과 함께 전송될 데이터를 포함하는 패킷(sndpkt)을 생성하고, 그 패킷을 udt_send(sndpkit) 동작을 통해 전송한다. 그 다음 송신자 프로토콜은 수신자로 부터 ACK 또는 NAK 응답을 기다린다. 만약 ACK 패킷이 수신된다면 (rdt_rcv(rcvpkt) && isACK(rcvpkt)) 송신자는 가장 최근에 전송한 패킷이 정확하게 수신되었다는 것을 알게된다. 만약 NAK가 수신되면 프로토콜은 마지막 패킷을 재전송하고 재전송된 패킷에 대한 ACK 또는 NAK를 다시 기다린다. 단, 이때 ACK 또는 NAK를 기다리는 수신 대기상태에서는 상위 계층으로 부터 더 이상 데이터를 전달 받을 수 없다는 것에 유의해야한다. 즉, rdt_send() Event가 발생하지 않는다. 이러한 행동때문에 rdt2.0과 같은 프로토콜은 전송 후 대기(Stop-and-Wait)프로토콜로 알려져있다.

 

 rdt 2.0 프로토콜은 비트 오류를 잘 검출하고 재전송하여 완벽한 것 같지만 치명적인 결함이 있다.  ACK 또는 NAK가 손상될 수 있다는 점을 고려하지 않은 것이다. 최소한 이런 오류를 검출하기 위해 ACK와 NAK에 대한 CheckSum bit를 추가할 필요가 있다. 좀 더 어려운 문제는 어떻게 프로토콜이 ACK, NAK 오류로부터 복구되는가이다. 또한 송신자는 수신자가 전송된 데이터의 마지막 부분을 올바르게 수신했는지를 알 방법이없어진다.

 

 간단하게 이러한 문제점을 해결하기 위해 현존하는 데이터 전송 프로토콜에서 채택된 방법은 Sequence Number(순서번호) 이다. 데이터 패킷에 새로운 필드를 추가하고 이 필드 안에 순서 번호를 삽입하는 방식으로 데이터 패킷에 송신자가 번호를 붙이는 것이다. 수신자는 수신된 패킷이 재전송인지를 결정할 때는 이 순서번호만 확인하면 된다.

(0~100까지 수신이 완료되었는데 다음 패킷의 순서번호가 150~250이다? 그렇다면 101~149는 전송되지 않은것이므로 재전송) 

이러한 오류를 극복하고 수정한 방법인 rdt 2.1 , 2.2 는 내용상 생략하겠다. 메인은 rdt 3.0이기 때문이다.

 

 

3. 비트 오류와 손실 있는 채널 상에서의 신뢰적 데이터 전송 : rdt 3.0

 

 단순히 비트 손상 이외에 인터넷을 포함하는 오늘날의 네트워크처럼 하위 채널이 패킷을 통째로 손실하는 경우를 생각해 보자. 그렇다면 부가 내용이 프로토콜에 의해 다루어져야 하는데, 첫 째로 '어떻게 패킷 손실을 검출할 것인가' 그리고  두 번째로 '손실이 발생했을 때 어떤 행동을 할 것인가' 이다.

 

 1) 어떻게 패킷 손실을 검출할 것인가 ?

 

 패킷 손실 검출을 위해서는 새로운 매커니즘을 추가해야한다. 간단히 말해 송신자에게 손실된 패킷의 검출과 회복 책임을 부여할 것이다. 송신자가 패킷을 전송하고 패킷 또는 수신자의 패킷에 대한 ACK를 손실했다고 가정하자. 어느 경우에나 송신자로부터 어떠한 응답도 없다. 만약 송신자가 패킷을 잃어버렸다는 것을 확실할 정도로 충분한 시간을 기다릴 수 있다면 데이터 패킷은 간단히 재전송될 수 있다.

 그러나 얼마나 기다려야할까 라는 것은 생각해보아야할 문제이다. 송신자는 적어도 송신자와 수신자 사이의 왕복시간 지연에 수신 측에서 패킷을 처리하는 데 필요한 시간을 더한 만큼 기다린다. 하지만 많은 네트워크에서 이 최악의 최대 지연 시간은 예측하기 조차도 매우 어려우며, 이상적인 프로토콜은 패킷 손실을 가능한 빠르게 복구해야한다. 최악의 지연을 기다린다는 것은 오류 복구가 시작될 때 까지 오래 기다려야 한다는 뜻이 된다. 현재 사용 중인 방법으로는 손실이 났다는 보장은 없지만 손실이 일어났을만한 시간을 현명하게 선택하는 것이다. 만약 정해진 이 시간 동안 ACK가 수신되지 않으면 패킷을 재전송 하는 것이다. 하지만 이러한 방식은 송신자대 수신자 채널에서 중복 데이터(Duplicate Data) 의 가능성을 포함한다. 다행히도 앞서 말했듯 rdt 2.0의 발전된 내용인 rdt 2.2에서는 Sequence Number를 이용해 중복 데이터를 처리할 수 있는 충분한 능력이 있다.

 

 2) 손실이 발생했을 때 어떤 행동을 할 것인가 ?

 

 송신자 관점에서 재전송은 만병통치약과 같다. 송신자는 데이터 패킷이 손실되었는지, ACK가 손실되었는지, 패킷 또는 ACK가 지나치게 지연되었는지를 알지 못한다. 이러한 모든 경우에서 행동은 "재전송" 으로 같다. 시간 기반의 재전송 매커니즘을 구현하기 위해 주어진 시간이 경과된 후 송신자를 인터럽트 할 수 있는 카운트다운 타이머(Countdown Timer) 가 필요하다. 그러므로 송신자는 다음과 같이 동작한다.

 

 - 모든 패킷(첫 번째 또는 재전송 패킷) 이 송신된 시간에 타이머를 시작한다.

 - 타이머 인터럽트에 반응하고 인터럽트 루틴을 처리한다.

 - 타이머를 멈춘다.

Figure 3.15는 패킷이 손상되거나 손실될 수 있는 비신뢰적 채널에서 데이터를 신뢰적으로 전송하는 프로토콜인 rdt 3.0 에 대한 송신자 FSM이다. 

위 그림은 프로토콜이 패킷 손실 또는 지연 없이 어떻게 동작하는지와 손실된 데이터 패킷을 어떻게 처리하는지 보여준다. 위 그림에서 (b) ~ (d) 의 "]" 표시는 타이머가 설정된 후에 타임 아웃된 시간을 가리킨다. 패킷의 순서번호가 0과 1이 번갈아 나타나므로 rdt 3.0은 Alternating-bit protocol 이라고 부른다.

 

Reliable Data Transfer 을 위한 다양한 주요 구성 요소들을 정리해보았다. CheckSum, Sequence Number, Countdown Timer , Error FeedBack(ACK or NAK) 등은 프로토콜의 동작에서 중요한 필수 임무를 수행한다.

 

  

반응형