Principles of RDT(Reliable Data Transfer)
Reliable Data Transfer
신뢰성 있는 데이터 교환(이하 RDT)은 한마디로 "송/수신하는 데이터가 오류없이 온전히 전송되는 것" 이다.
Transport Layer 에서는 신뢰성 있는 데이터 교환을 하고 싶어하지만, 그 아래의 레이어에서는 신뢰성을 보장할 수 없기 때문에 신뢰성 있는 통신에 문제가 생길 수 있다.
이러한 상황 속에서 Transport Layer에서 적용 가능한 방식이 바로 "RDT 프로토콜"을 이용하는 것이다. 아래 그림을 살펴보자.
- 패킷 송신 (상위 계층 → Transport Layer → 하위 계층)
- 상위 계층 → Transport Layer :
rdt_send()
시스템 콜을 호출하여 RDT 프로토콜로 전송
- Transport Layer → 하위 계층 :
udt_send()
호출하여 패킷 전송
- 상위 계층 → Transport Layer :
- 패킷 수신 (하위 계층 → Transport Layer → 상위 계층)
- 하위 계층 → Transport Layer :
rdt_rcv()
시스템 콜을 호출하여 RDT 프로토콜로 전송
- Transport Layer → 상위 계층 :
deliver_data()
호출하여 데이터 전송
- 하위 계층 → Transport Layer :
RDT 모델 설계
앞서 살펴본 RDT를 FSM(유한 상태 장치)을 이용하여 설계할 수 있다.
RDT 1.0
- 가정
- 네트워크의 모든 채널이 완벽하게 신뢰성 있다고 가정한다. (no bit errors, no loss of packets)
- 기능
- 송신자는 보낼 데이터를 패킷으로 만들어 패킷을 보내고,
수신자는 패킷으로부터 데이터를 추출하여 전달한다.
- 송신자는 보낼 데이터를 패킷으로 만들어 패킷을 보내고,
- 특징
- 데이터 손상이나 손실의 우려가 없는 네트워크에서 사용할 수 있는 모델이다.
RDT 2.0
- 가정
- 패킷 손실은 없다고 가정한다.
- 개선된 기능
- 기본 채널에서는 패킷의 bit errors 가 발생할 수 있으므로, bit errors 를 탐지하기 위해 ACK/NAK와 checksum을 도입한다.
- acknowledgements (ACKs) : 수신자가 송신자에게 패킷이 정상적으로 수신했음을 알린다.
- negative acknowledgements (NAKs) : 수신자가 송신자에게 패킷에 에러가 있다는 것을 알린다.
- 에러를 탐지하여 만약 에러가 있다면, 상대방의 Transport Layer에 다시 패킷을 요청한다.
- 기본 채널에서는 패킷의 bit errors 가 발생할 수 있으므로, bit errors 를 탐지하기 위해 ACK/NAK와 checksum을 도입한다.
- 문제점
- ACK/NAK가 손실될 경우, 송신자는 수신자에게 무슨 일이 일어났는지 모른다.
- 송신자가 수신자에게 Packet을 또 보낼 경우, 수신자는 중복인지 모르고 애플리케이션에게 중복된 데이터를 전달하는 경우가 생길 수 있다.
- ACK/NAK가 손실될 경우, 송신자는 수신자에게 무슨 일이 일어났는지 모른다.
RDT 2.1
- 개선된 기능
- (1) Sequence Number 사용
- handling duplicates : 수신자가 packet의 중복 수신 여부를 확인할 수 있다.
- (2) Stop and Wait
- 송신자가 하나의 packet을 보내고나면, 수신자의 응답을 기다린다.
- (1) Sequence Number 사용
- 문제점
- sequence number를 사용한다면, NAK를 사용할 필요가 없어진다.
RDT 2.2
- 개선된 기능
- NAK 기능 제거
- NAK을 사용하지 않는다.
- 대신, 가장 마지막으로 잘 받은 패킷에 대한 번호의 ACK를 보낸다.
- NAK 기능 제거
- 문제점
- 여전히 패킷 손실의 가능성이 남아있다.
RDT 3.0
- 가정
- 채널에 패킷 에러와 패킷 손실의 발생 가능성이 있다.
- 개선된 기능
- timer 사용
- 송신자가 데이터를 전송하고 일정 시간을 기다린다. 만약 시간 내에 올바른 ACK가 안오면 재전송 한다.
- timer 사용
RDT 3.0 Sender
위 그림에서 검은색 글씨들은 올바르게 패킷들이 교환되었을 경우이다. 이 경우 호출된 함수를 정상적으로 수행하게 된다.
빨간색 글씨들은 패킷 전송 과정에서 무언가 문제가 발생한 것이다. 패킷이 손상되었거나(corrupt), 손실되었을 때(wrong ACK) 그냥 이를 무시한다. 그러면 결국 timeout이 발생해 재전송을 하게 된다.
RDT 3.0 Receiver
위 그림에서 검은색 글씨들은 올바르게 패킷들이 교환되었을 경우이다. 이 경우 호출된 함수를 정상적으로 수행하게 된다.
빨간색 글씨들은 패킷 전송 과정에서 receiver가 보낸 ACK이 sender에게 제대로 가지 않아 문제가 발생한 경우이다. 이 경우 다시 ACK을 만들어 sender에게 재전송 해주어야 한다.
rdt 3.0 모델은 패킷이 유실된 경우, ACK이 유실된 경우, 유실되지는 않았지만 timeout이 발생한 경우 등 여러가지 변칙적인 상황을 모두 커버할 수 있어서 굉장히 완성도 높은 모델이라고 할 수 있다.
특히 패킷을 보내고 ACK이 올때까지 대기하는 양상을 보이는데, 이를 stop-and-wait Operation 이라고 한다. 이러한 특징 때문에 한편으로는 효율성이 낮다고 볼 수 있다.
참고 자료
- Computer Networking: A Top Down Approach 6th edition - Jim Kurose, Keith Ross Addison-Wesley March 2012
- https://ddongwon.tistory.com/m/80
'Computer Science > Computer Network' 카테고리의 다른 글
[네트워크] GBN(Go-back-N), SR(Selective Repeat) - Pipelined Protocols (0) | 2022.10.18 |
---|---|
[네트워크] TCP, UDP - Transport Layer Protocol (0) | 2022.10.18 |
[네트워크] "BitTorrent" - P2P applications (2) (0) | 2022.10.18 |
[네트워크] "Napster", "Gnutella" - P2P applications (1) (0) | 2022.10.18 |
[네트워크] DNS (Domain Name System, 도메인 네임 시스템) (0) | 2022.10.18 |