Reliable data transfer(rdt) 가 뭔가요?
먼저, RDT는 Reliable Data Transfer의 약어로 신뢰성 있는 데이터 전송을 의미합니다.
이는 데이터를 전송하는 과정에서 손실, 중복, 순서 오류 등이 발생할 수 있는 불안정한 네트워크 환경에서도 안정적으로 데이터를 전송하기 위한 기술입니다.
- TCP는 상위 계층에서 사용되는 프로토콜로, 신뢰성 있는 데이터 전송을 보장하기 위해 설계되었습니다.
- 하지만, 하위 계층에서는 데이터 전송에 불안정한 요소가 존재하기 때문에 TCP와 같은 신뢰성 있는 프로토콜이 제공되지 않습니다.
- 따라서, 전송 계층에서는 RDT를 이용하여 하위 계층의 불안정성을 보완하고, 신뢰성 있는 데이터 전송을 보장합니다
위 그림에서 파란부분이 송신측이고 초록색 부분이 수신측입니다.
위쪽 빨간색 선은 위쪽은 상위계층이고,
아래쪽 빨간색 선의 아래쪽은 하위계층 입니다
송신
상위 계층에서 보내려는 데이터는 rdt_send() 함수를 호출해서 RDT 프로토콜에 맞게 처리된 후,
udt_send() 함수를 호출하여 하위 계층으로 전송됩니다.
수신
하위 계층에서 받은 패킷은 RDT 프로토콜에서 처리된 후, 상위 계층으로 전달됩니다.
이 때, RDT 프로토콜에서는 데이터의 순서가 맞지 않거나 손실된 데이터가 있는 경우,
이를 복원하고 상위 계층으로 전달하기 위해 deliver_data() 함수를 호출합니다.
rdt1.0: reliable transfer over a reliable channel
rdt1.0
완벽하게 신뢰할수 있는 경우
Bit errors 나 loss of packets 도 없다
그래서 state가 하나 밖에 존재하지 않는다
송신
상위 계층에서 데이터를 보내면 rdt_send()를 호출한다
make_pkt()함수로 패킷을 만든다
udt_send()로 패킷을 보낸다
수신
하위계층에서 패킷을 보내면 rdt_rcv()함수를 호출한다
extract()함수로 패킷을 추출한다
deliver_data()함수로 상위 계층으로 데이터를 보낸다
rdt2.0: channel with bit errors
rdt2.0
여기서는 bit에러가 발생할 경우
bit error처리를 위해서 아래 두개의 메시지를 도입한다
ACKS(Acknowledgements) : 수신쪽이 송신쪽에 패킷 수신에 문제가 없다고 말하는 신호
NAKS(Negative acknowledgements) : 수신쪽이 송신쪽에 패킷 수신에 문제가 있다고 말하는 신호
송신쪽은 NAK를 받으면 재송신(retransmit)한다
rdt2.0는 아래의 그림과 같이 표현할 수 있다
보기에는 복잡해보이지만 천천히 보면 복잡하지 않다
rdt는 2가지 경우로 나누어 볼 수 있다
에러가 없는 경우와 에러가 있는 경우다
에러가 없는 경우 부터 보면
송신
상위 계층에서 데이터를 받아서 udt_send()함수로 패킷을 보낸다
수신
패킷을 받는다
이상이 없기 때문에 송신측에 ACK 를 보낸다
송신측에서 ACK를 받고 종료
에러가 있는 경우는 복잡해 보일 수 있다
하지만 재송신을 위해서 NAK를 송신측에 보내는 과정만 추가된다
송신
상위 계층에서 데이터를 받아서 udt_send()함수로 패킷을 보낸다
수신
패킷을 받는다
이상이 있기 때문에 NAK을 송신측에 보내고 기다린다
송신측에서 NAK신호를 받으면 패킷을 재전송한다
수신측에서 패킷을 받고 이상이 없으면
송신측에 ACK 를 보낸다
송신측에서 ACK를 받고 종료
rdt2.1: sender, handles garbled ACK/NAKs
rdt2.1에서는 시퀀스 넘버(seq#) 0과 1이 나타난다
수신된 ACK/ NAK 가 손상되었는지 확인한다
간단하게 설명하면
0번 패킷에 오류가 있다면 NAK 0 신호를 보내고 0번 패킷을 기다린다
0번 패킷에 오류가 없다면 ACK 0 신호를 보내고 1번 패킷을 기다린다
1번 패킷에 오류가 있다면 NAK 1 신호를 보내고 1번 패킷을 기다린다
1번 패킷에 오류가 없다면 ACK 1 신호를 보내고 1번 패킷을 기다린다
rdt2.2: a NAK - free protocol
기능적으로 rdt2.1과 같지만 ACKs만 사용한다
중복되는 ACK신호를 받으면 패킷을 재전송 한다
송신측에서 0번 패킷을 전송하고 ACK 0번을 받고
1번패킷을 보내고 수신측에 오류를 확인하면 ACK 1이 아닌 ACK 0을 다시 보낸다
송신측을 ACK0을 받고 오류가 있음을 알고 다시 1번패킷을 보낸다
rdt3.0: Channels with errors and loss
위에 rdt1.0,rdt2.0,rdt2.1,rdt2.2과 같은 rdt들의 가장 큰 결함은 패킷의 유실을 인지하지 못한다는 점이다
패킷을 보내고 신호를 기다리지만 신호가 오지않으면 다음패킷을 보낼 수 없다
그래서 송신측은 ACK를 "합리적인(reasonable)" 시간동안 기다리고
이 시간동안 도착하지 않을 경우 재전송한다
그림 (a)는 손실이 없을 경우다
그림 (b)는 패킷 손실이 있을 경우다
pkt1이 손실이 생겼고, 그로인해 ACK 1을 받지못해
송신측에서 다시 pkt1을 보내는 모습이다
그림 (c) 를 보면 ACK 손실이 발생하고
송신측에서 다시 pkt1을 보낸다
이때 중복이 발생하는데 이경우는 seq#로 패킷 1이 버려지면서 해결이된다
그림 (d) 는 신호전달이 지연되는 경우인데
만약 ACK1이 매우 느리게 전송이 될 경우
이때부터 패킷과 ACK신호가 중복되는 현상이 발생하는데
rdt3.0의 가장 큰 문제점이기도 하다
또한 rdt3.0은 데이터를 하나 보내고 ACK 신호를 기다리기까지 다음 데이터를 보내지 않아서 성능이 떨어진다
참조
https://code-lab1.tistory.com/26
[네트워크] Reliable Data Transfer - rdt 1.0/2.0/2.1/2.2/3.0 | RDT란? | FSM 이란?
RDT(Reliable Data Transfer)란? RDT는 신뢰성 있는 데이터 교환을 의미한다. 즉 송/수신하는 데이터가 오류 없이 온전히 전송되는 것을 뜻한다. Transport Layer(전송계층)에서는 신뢰성 있는 데이터 교환을
code-lab1.tistory.com