Computer Science/네트워크

[네트워크] RDT(신뢰성있는 데이터 전송)

가자미 2021. 4. 6. 16:25

a. 신뢰성있는 데이터 전송의 원칙

패켓에 있는 헤더의 특정 정보를 해석을 통해 정보가 제대로 왔는지 확인한다.

 

먼저 어플리케이션 계층에서 수송계층의 RDT의 rdt_send()를 요청하면

RDT에서는 정보를 패캣으로 나눠 담고

이를 네트워크 계층의 unreliable channel에게 udt_send() 요청을 하게 된다.

네트워크를 거쳐 정보가 수송계층에 도착하게 되면 rdt_rcv()요청이 이뤄지고,

패캣의 헤더 부분을 실행하고 문제가 없으면 데이터만 꺼내서 deliver_data()요청으로 어플리케이션에게 전달한다.

 

b. FSM (Finite State Machines)로 rdt 프로토콜 기술

state : 프로그램이 실행되는 단계

화살표 : 프로그램의 상태 변화

event : 언제 상태변화가 이뤄지는가

action : 상태변화에 따라 프로그램이 수행할 동작

 

c.  rdt 1.0 (오류 없는 상황 가정)

비트오류도 없고, 패캣 손실도 없고, out of order(순서오류)도 없다고 가정.

수송 계층의 부분만 표현.

FSM으로 rdt 1.0 표현

d. rdt 2.0 (비트오류가 발생할 수 있는 경우)

receiver가 재전송을 요구하거나(ARQ), 원본을 추측하여 수정해 사용한다.(FEC)

ARQ방식이 일반적.

 

리시버는 ACKs나 NAKs를 센더에게 반환한다.

acknowledgements(ACKs) : 문제없음.

negative acknowlegements(NAKs) : receiver가 특정 패캣에서 문제 확인=>재전송요구.

FSM으로 표현 

e. rdt 2.1

하지만 데이터가 아닌 컨트롤 메시지(ack, nak)에 문제가 생기면??
센더는 이런 문제를 알아차리지 못함.

이를 막기 위해 센더가 각각의 패캣에 시퀀스 번호를 붙여서 보낸다.(짝수번일땐 0, 홀수번일땐 1)

리시버는 동일한 번호로 오는 패캣을 버리는 방식으로 운용하게 된다.

이를 stop and wait(보내고 응답기다리고 응답오면 보내기이라 한다.

FSM으로 표현된 센더

 

FSM으로 표현된 리시버

f. rdt 2.2 

rdt 2.1에서 NAK를 안쓰고 ACK만 쓰는 것(기능적으로는 동일)

ACK를 보낼때 시퀀스번호를 같이 보내는 방식으로 운용

 

g. rdt 3.0 (패캣 손실이나 오류 발생할 경우)

센더가 패캣을 보내고 타이머를 통해 ACK가 오지 않을 경우 재전송.

센더

 rdt 3.0은 오류 처리에는 탁월하지만, 성능이 문제다. 리시버의 신호를 기다리는 동안 회선을 낭비하는 셈.

따라서 이런 낭비를 막기위해서는 pipelined protocol. 즉 ack를 받지 않고 데이터를 여러번 보내는 프로토콜이 필요하다.

 

h. Pipelined protocol

ACK를 받지 않고도 다음 패캣을 보냄

n개의 패캣을 ACK없이도 보내되, ACK가 안오면 다시 재전송해야되므로,
센더는 ACK가 모두 올 때까지 패캣을 send buffer에 저장하고 있어야한다.

 

h-1. Go-back-N

ACK를 반환할 때 ACK의 시퀀스 끝번호에 해당하는 ACK만 보냄

(3개의 패캣을 받으면 3번 ACK만 보냄)

(그렇다면 3번까지의 패캣은 잘 전송됐음을 의미)

센드버퍼(윈도우 사이즈)에 ack없이도 보낼 수 있는 패캣들이 존재하고,

보냈지만 ack를 아직 받지 않은 패캣 중 가장 오래된 패캣의 순서 번호를 send_base.

아직 보내지 않고 대기 중인 패캣 중 가장 빠른 패캣의 순서 번호를 nextseqnum.

 

센더는 ACK를 받지못한 패캣 중 가장 오래된 패캣(send_base)을 기준으로 타이머를 설정함

타이머가 만료되면(오랫동안 ACK가 안오면,) ACK를 받지못한 패캣 모두를 재전송한다.

GBN sender를 FSM
GBN receiver

리시버는 오류 없이 순차적으로 받은 패캣 중 시퀀스 넘버가 가장 큰 값을 ACK로 보낸다.

expectedseqnum만 변수로 저장.

순서에 맞지 않은 패캣은 그냥 버려버리고 ack를 다시 보내줌(버퍼 없음)

 

h-2. Selective Repeat

GBN의 불필요한 패캣 버림을 줄이고, 필요한 경우만 재전송하는 방식으로 효율성을 높임

GBN과 다른점은 리시버도 윈도우사이즈(버퍼)를 갖는다는 점.

ACK를 반환할 때 개별적으로 반환.

센더는 ACK를 받지 못한 개별적인 패캣으로 타이머를 설정.

 

리시버는 전달받지 못한 패캣 시퀀스를 기억하고 있고 센더는 각 패캣의 타이머에 따라 패캣을 다시 보낸다.

 

h-2-1 Selective repeat dilemma(GBN에서도 발생)

만약 시퀀스 넘버를 0,1,2,3으로 채택해 사용한다고 가정.(2비트일때 표현 가능한 수가 0123)

윈도우 사이즈는 자연스럽게 3

마지막에 센더가 재전송한 pkt0을 리시버가 4번째 패캣으로 받아들일 문제가 생긴다!!!

이것을 해결하려면 윈도우 사이즈를 줄여야한다.

=>시퀀스 넘버에 쓰이는 비트 수 = n일때, 윈도우 사이즈는 2^(n-1)

=>2비트인 경우, 윈도우 사이즈는 2로 해야함

=>GBN의 경우 2^n-1